web/i18n: Locale Context Merge Branch (#18426)

* web: Update fonts to Patternfly 5 variants.

* Fix order of heading override.

* web: Flesh out locale context.

* Fix Han pattern.

* Remove comment.

* Add additional regional codes.

* Clarify comment.

* Fix typos.

* web/i18n: Add locale-specific font overrides.

* Fix stale session in locale lifecycle.

* core, web: Fix Han language codes.

* Fix warnings about invalid BCP language code.

* Build translations.

* Add locale relative labels.

* Add locale translations for Finnish and Portuguese.

* Fix XLIFF errors.

* Clean up labels.

* Tidy regions.

* Match region comment.

* Update extracted values.

* Fix locale switch not triggering on source language.

* Split labels.

* Clean up labels.
This commit is contained in:
Teffen Ellis
2025-12-03 07:30:07 +01:00
committed by GitHub
parent 96eb8dda0f
commit fe7a8894d3
73 changed files with 4311 additions and 2298 deletions

View File

@@ -11,6 +11,9 @@
"[jsonc]": {
"editor.minimap.markSectionHeaderRegex": "#\\bregion\\s*(?<separator>-?)\\s*(?<label>.*)$"
},
"[xml]": {
"editor.minimap.markSectionHeaderRegex": "<!--\\s*#\\bregion\\s*(?<separator>-?)\\s*(?<label>.*)\\s*-->"
},
"todo-tree.tree.showCountsInTree": true,
"todo-tree.tree.showBadges": true,
"yaml.customTags": [

View File

@@ -1,9 +1,11 @@
{% load static %}
{% load i18n %}
{% load authentik_core %}
{% get_current_language as LANGUAGE_CODE %}
<!DOCTYPE html>
<html
lang="{{ LANGUAGE_CODE }}"
data-theme="{% if ui_theme == "dark" %}dark{% else %}light{% endif %}"
data-theme-choice="{% if ui_theme == "dark" %}dark{% elif ui_theme == "light" %}light{% else %}auto{% endif %}"
>
@@ -15,6 +17,7 @@
<title>{% block title %}{% trans title|default:brand.branding_title %}{% endblock %}</title>
<link rel="icon" href="{{ brand.branding_favicon_url }}">
<link rel="shortcut icon" href="{{ brand.branding_favicon_url }}">
{% block head_before %}
{% endblock %}

View File

@@ -36,39 +36,37 @@
<ak-skip-to-content></ak-skip-to-content>
<ak-message-container></ak-message-container>
<ak-locale-context>
<div class="pf-c-page__drawer">
<div class="pf-c-drawer pf-m-collapsed" id="flow-drawer">
<div class="pf-c-drawer__main">
<div class="pf-c-drawer__content">
<div class="pf-c-drawer__body">
<ak-flow-executor
slug="{{ flow.slug }}"
class="pf-c-login"
data-layout="{{ flow.layout|default:'stacked' }}"
>
{% include "base/placeholder.html" %}
<div class="pf-c-page__drawer">
<div class="pf-c-drawer pf-m-collapsed" id="flow-drawer">
<div class="pf-c-drawer__main">
<div class="pf-c-drawer__content">
<div class="pf-c-drawer__body">
<ak-flow-executor
slug="{{ flow.slug }}"
class="pf-c-login"
data-layout="{{ flow.layout|default:'stacked' }}"
>
{% include "base/placeholder.html" %}
<ak-brand-links
slot="footer"
exportparts="list:brand-links-list, list-item:brand-links-list-item"
role="contentinfo"
aria-label="{% trans 'Site footer' %}"
class="pf-c-login__footer {% if flow.layout == 'stacked' %}pf-m-dark{% endif %}"
></ak-brand-links>
</ak-flow-executor>
</div>
<ak-brand-links
slot="footer"
exportparts="list:brand-links-list, list-item:brand-links-list-item"
role="contentinfo"
aria-label="{% trans 'Site footer' %}"
class="pf-c-login__footer {% if flow.layout == 'stacked' %}pf-m-dark{% endif %}"
></ak-brand-links>
</ak-flow-executor>
</div>
<ak-flow-inspector
id="flow-inspector"
data-registration="lazy"
class="pf-c-drawer__panel pf-m-width-33"
slug="{{ flow.slug }}"
></ak-flow-inspector>
</div>
<ak-flow-inspector
id="flow-inspector"
data-registration="lazy"
class="pf-c-drawer__panel pf-m-width-33"
slug="{{ flow.slug }}"
></ak-flow-inspector>
</div>
</div>
</div>
</ak-locale-context>
</div>
{% endblock %}

View File

@@ -19,8 +19,8 @@ msgstr ""
"PO-Revision-Date: 2022-09-26 16:47+0000\n"
"Last-Translator: Jens L. <jens@goauthentik.io>, 2025\n"
"Language-Team: Chinese (China) (https://app.transifex.com/authentik/teams/"
"119923/zh_CN/)\n"
"Language: zh_Hans\n"
"119923/zh-Hans/)\n"
"Language: zh-Hans\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"

View File

@@ -17,11 +17,11 @@ msgstr ""
"POT-Creation-Date: 2025-12-01 15:07+0000\n"
"PO-Revision-Date: 2022-09-26 16:47+0000\n"
"Last-Translator: 刘松, 2025\n"
"Language-Team: Chinese (Taiwan) (https://app.transifex.com/authentik/teams/119923/zh_TW/)\n"
"Language-Team: Chinese (Taiwan) (https://app.transifex.com/authentik/teams/119923/zh-Hant/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: zh_Hant\n"
"Language: zh-Hant\n"
"Plural-Forms: nplurals=1; plural=0;\n"
#: authentik/admin/models.py

93
web/fonts/RedHat/OFL.txt Normal file
View File

@@ -0,0 +1,93 @@
Copyright 2021 The Red Hat Project Authors (https://github.com/RedHatOfficial/RedHatFont)
This Font Software is licensed under the SIL Open Font License, Version 1.1.
This license is copied below, and is also available with a FAQ at:
https://scripts.sil.org/OFL
-----------------------------------------------------------
SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
-----------------------------------------------------------
PREAMBLE
The goals of the Open Font License (OFL) are to stimulate worldwide
development of collaborative font projects, to support the font creation
efforts of academic and linguistic communities, and to provide a free and
open framework in which fonts may be shared and improved in partnership
with others.
The OFL allows the licensed fonts to be used, studied, modified and
redistributed freely as long as they are not sold by themselves. The
fonts, including any derivative works, can be bundled, embedded,
redistributed and/or sold with any software provided that any reserved
names are not used by derivative works. The fonts and derivatives,
however, cannot be released under any other type of license. The
requirement for fonts to remain under this license does not apply
to any document created using the fonts or their derivatives.
DEFINITIONS
"Font Software" refers to the set of files released by the Copyright
Holder(s) under this license and clearly marked as such. This may
include source files, build scripts and documentation.
"Reserved Font Name" refers to any names specified as such after the
copyright statement(s).
"Original Version" refers to the collection of Font Software components as
distributed by the Copyright Holder(s).
"Modified Version" refers to any derivative made by adding to, deleting,
or substituting -- in part or in whole -- any of the components of the
Original Version, by changing formats or by porting the Font Software to a
new environment.
"Author" refers to any designer, engineer, programmer, technical
writer or other person who contributed to the Font Software.
PERMISSION & CONDITIONS
Permission is hereby granted, free of charge, to any person obtaining
a copy of the Font Software, to use, study, copy, merge, embed, modify,
redistribute, and sell modified and unmodified copies of the Font
Software, subject to the following conditions:
1) Neither the Font Software nor any of its individual components,
in Original or Modified Versions, may be sold by itself.
2) Original or Modified Versions of the Font Software may be bundled,
redistributed and/or sold with any software, provided that each copy
contains the above copyright notice and this license. These can be
included either as stand-alone text files, human-readable headers or
in the appropriate machine-readable metadata fields within text or
binary files as long as those fields can be easily viewed by the user.
3) No Modified Version of the Font Software may use the Reserved Font
Name(s) unless explicit written permission is granted by the corresponding
Copyright Holder. This restriction only applies to the primary font name as
presented to the users.
4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
Software shall not be used to promote, endorse or advertise any
Modified Version, except to acknowledge the contribution(s) of the
Copyright Holder(s) and the Author(s) or with their explicit written
permission.
5) The Font Software, modified or unmodified, in part or in whole,
must be distributed entirely under this license, and must not be
distributed under any other license. The requirement for fonts to
remain under this license does not apply to any document created
using the Font Software.
TERMINATION
This license becomes null and void if any of the above conditions are
not met.
DISCLAIMER
THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
OTHER DEALINGS IN THE FONT SOFTWARE.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -0,0 +1,47 @@
@font-face {
font-family: "RedHatDisplay";
src: url("./RedHatDisplayVFModified.woff2") format("woff2-variations");
font-weight: 300 900;
font-style: normal;
font-display: fallback;
}
@font-face {
font-family: "RedHatDisplay";
src: url("./RedHatDisplayVF-ItalicModified.woff2") format("woff2-variations");
font-weight: 300 900;
font-style: italic;
font-display: fallback;
}
@font-face {
font-family: "RedHatText";
src: url("./RedHatTextVFModified.woff2") format("woff2-variations");
font-weight: 400 500;
font-style: normal;
font-display: fallback;
}
@font-face {
font-family: "RedHatText";
src: url("./RedHatTextVF-ItalicModified.woff2") format("woff2-variations");
font-weight: 400 500;
font-style: italic;
font-display: fallback;
}
@font-face {
font-family: "RedHatMono";
src: url("./RedHatMonoVF.woff2") format("woff2-variations");
font-weight: 300 700;
font-style: normal;
font-display: fallback;
}
@font-face {
font-family: "RedHatMono";
src: url("./RedHatMonoVF-Italic.woff2") format("woff2-variations");
font-weight: 300 700;
font-style: italic;
font-display: fallback;
}

View File

@@ -2,21 +2,23 @@
"$schema": "https://raw.githubusercontent.com/lit/lit/main/packages/localize-tools/config.schema.json",
"sourceLocale": "en",
"targetLocales": [
"cs_CZ",
"de_DE",
"cs-CZ",
"de-DE",
"en",
"es_ES",
"fr_FR",
"it_IT",
"ja_JP",
"ko_KR",
"nl_NL",
"pl_PL",
"ru_RU",
"tr_TR",
"zh_Hans",
"zh_Hant",
"pseudo_LOCALE"
"es-ES",
"fi-FI",
"fr-FR",
"it-IT",
"ja-JP",
"ko-KR",
"nl-NL",
"pl-PL",
"pt-BR",
"ru-RU",
"tr-TR",
"zh-Hans",
"zh-Hant",
"pseudo-LOCALE"
],
"tsConfig": "./tsconfig.json",
"output": {

View File

@@ -53,6 +53,7 @@
}
},
"imports": {
"#fonts/*.css": "./fonts/*.css",
"#styles/*.css": "./src/styles/*.css",
"#styles/*": "./src/styles/*.js",
"#common/*": "./src/common/*.js",

View File

@@ -12,7 +12,6 @@
* summary of how many strings are missing with respect to the source locale.
*
* @import { Stats } from "node:fs";
* @import { RuntimeOutputConfig } from "@lit/localize-tools/lib/types/modes.js"
*/
import * as fs from "node:fs/promises";
@@ -53,7 +52,7 @@ const EmittedLocalesDirectory = resolve(
);
const targetLocales = localizeRules.targetLocales.filter((localeCode) => {
return localeCode !== "pseudo_LOCALE";
return localeCode !== "pseudo-LOCALE";
});
//#endregion
@@ -215,7 +214,7 @@ export async function generateLocaleModules() {
.map(([locale, count]) => `${locale}: ${count.toLocaleString()}`)
.join("\n");
logger.info(`Missing translations:\n${missingTranslationsReport}`);
logger.info(`Missing translations:\n${missingTranslationsReport || "None"}`);
const outdatedTranslationsReport = Array.from(outdatedTranslationWarnings)
.filter(([, count]) => count)
@@ -225,7 +224,7 @@ export async function generateLocaleModules() {
.map(([locale, count]) => `${locale}: ${count.toLocaleString()}`)
.join("\n");
logger.info(`Outdated translations:\n${outdatedTranslationsReport}`);
logger.info(`Outdated translations:\n${outdatedTranslationsReport || "None"}`);
localizer.assertTranslationsAreValid();

View File

@@ -23,7 +23,7 @@ import { makeFormatter } from "@lit/localize-tools/lib/formatters/index.js";
import { sortProgramMessages } from "@lit/localize-tools/lib/messages.js";
import { TransformLitLocalizer } from "@lit/localize-tools/lib/modes/transform.js";
const pseudoLocale = /** @type {Locale} */ ("pseudo_LOCALE");
const pseudoLocale = /** @type {Locale} */ ("pseudo-LOCALE");
const targetLocales = [pseudoLocale];
const __dirname = fileURLToPath(new URL(".", import.meta.url));

View File

@@ -1,5 +1,4 @@
import "#admin/AdminInterface/AboutModal";
import "#elements/ak-locale-context/ak-locale-context";
import "#elements/banner/EnterpriseStatusBanner";
import "#elements/banner/VersionBanner";
import "#elements/messages/MessageContainer";
@@ -162,54 +161,52 @@ export class AdminInterface extends WithCapabilitiesConfig(WithSession(Authentic
"pf-m-collapsed": !drawerOpen,
};
return html` <ak-locale-context>
<div class="pf-c-page">
<ak-page-navbar ?open=${this.sidebarOpen}>
<ak-version-banner></ak-version-banner>
<ak-enterprise-status interface="admin"></ak-enterprise-status>
</ak-page-navbar>
return html`<div class="pf-c-page">
<ak-page-navbar ?open=${this.sidebarOpen}>
<ak-version-banner></ak-version-banner>
<ak-enterprise-status interface="admin"></ak-enterprise-status>
</ak-page-navbar>
<ak-sidebar ?hidden=${!this.sidebarOpen} class="${classMap(sidebarClasses)}"
>${renderSidebarItems(createAdminSidebarEntries())}
${this.can(CapabilitiesEnum.IsEnterprise)
? renderSidebarItems(createAdminSidebarEnterpriseEntries())
: nothing}
</ak-sidebar>
<ak-sidebar ?hidden=${!this.sidebarOpen} class="${classMap(sidebarClasses)}"
>${renderSidebarItems(createAdminSidebarEntries())}
${this.can(CapabilitiesEnum.IsEnterprise)
? renderSidebarItems(createAdminSidebarEnterpriseEntries())
: nothing}
</ak-sidebar>
<div class="pf-c-page__drawer">
<div class="pf-c-drawer ${classMap(drawerClasses)}">
<div class="pf-c-drawer__main">
<div class="pf-c-drawer__content">
<div class="pf-c-drawer__body">
<ak-router-outlet
role="presentation"
class="pf-c-page__main"
tabindex="-1"
id="main-content"
defaultUrl="/administration/overview"
.routes=${ROUTES}
>
</ak-router-outlet>
</div>
<div class="pf-c-page__drawer">
<div class="pf-c-drawer ${classMap(drawerClasses)}">
<div class="pf-c-drawer__main">
<div class="pf-c-drawer__content">
<div class="pf-c-drawer__body">
<ak-router-outlet
role="presentation"
class="pf-c-page__main"
tabindex="-1"
id="main-content"
defaultUrl="/administration/overview"
.routes=${ROUTES}
>
</ak-router-outlet>
</div>
<ak-notification-drawer
class="pf-c-drawer__panel pf-m-width-33 ${this
.notificationDrawerOpen
? ""
: "display-none"}"
?hidden=${!this.notificationDrawerOpen}
></ak-notification-drawer>
<ak-api-drawer
class="pf-c-drawer__panel pf-m-width-33 ${this.apiDrawerOpen
? ""
: "display-none"}"
?hidden=${!this.apiDrawerOpen}
></ak-api-drawer>
<ak-about-modal></ak-about-modal>
</div>
<ak-notification-drawer
class="pf-c-drawer__panel pf-m-width-33 ${this.notificationDrawerOpen
? ""
: "display-none"}"
?hidden=${!this.notificationDrawerOpen}
></ak-notification-drawer>
<ak-api-drawer
class="pf-c-drawer__panel pf-m-width-33 ${this.apiDrawerOpen
? ""
: "display-none"}"
?hidden=${!this.apiDrawerOpen}
></ak-api-drawer>
<ak-about-modal></ak-about-modal>
</div>
</div></div
></ak-locale-context>`;
</div>
</div>
</div>`;
}
}

View File

@@ -26,7 +26,6 @@ import "./UserDevicesTable.js";
import "#elements/ak-mdx/ak-mdx";
import { DEFAULT_CONFIG } from "#common/api/config";
import { EVENT_REFRESH } from "#common/constants";
import { PFSize } from "#common/enums";
import { userTypeToLabel } from "#common/labels";
@@ -113,14 +112,6 @@ export class UserViewPage extends WithCapabilitiesConfig(WithSession(AKElement))
`,
];
constructor() {
super();
this.addEventListener(EVENT_REFRESH, () => {
if (!this.user?.pk) return;
this.userId = this.user?.pk;
});
}
renderUserCard() {
if (!this.user) {
return nothing;

View File

@@ -4,11 +4,10 @@ import {
LocaleMiddleware,
LoggingMiddleware,
} from "#common/api/middleware";
import { EVENT_LOCALE_REQUEST } from "#common/constants";
import { globalAK } from "#common/global";
import { SentryMiddleware } from "#common/sentry/middleware";
import { Config, Configuration, CoreApi, CurrentBrand, RootApi } from "@goauthentik/api";
import { Config, Configuration, CurrentBrand, RootApi } from "@goauthentik/api";
let globalConfigPromise: Promise<Config> | undefined = Promise.resolve(globalAK().config);
export function config(): Promise<Config> {
@@ -35,34 +34,6 @@ export function brandSetFavicon(brand: CurrentBrand) {
});
}
export function brandSetLocale(brand: CurrentBrand) {
if (brand.defaultLocale === "") {
return;
}
console.debug("authentik/locale: setting locale from brand default");
window.dispatchEvent(
new CustomEvent(EVENT_LOCALE_REQUEST, {
composed: true,
bubbles: true,
detail: { locale: brand.defaultLocale },
}),
);
}
let globalBrandPromise: Promise<CurrentBrand> | undefined = Promise.resolve(globalAK().brand);
export function brand(): Promise<CurrentBrand> {
if (!globalBrandPromise) {
globalBrandPromise = new CoreApi(DEFAULT_CONFIG)
.coreBrandsCurrentRetrieve()
.then((brand) => {
brandSetFavicon(brand);
brandSetLocale(brand);
return brand;
});
}
return globalBrandPromise;
}
export const DEFAULT_CONFIG = new Configuration({
basePath: `${globalAK().api.base}api/v3`,
middleware: [

View File

@@ -35,7 +35,6 @@ export const EVENT_API_DRAWER_TOGGLE = "ak-api-drawer-toggle";
export const EVENT_FLOW_INSPECTOR_TOGGLE = "ak-flow-inspector-toggle";
export const EVENT_WS_MESSAGE = "ak-ws-message";
export const EVENT_FLOW_ADVANCE = "ak-flow-advance";
export const EVENT_LOCALE_CHANGE = "ak-locale-change";
export const EVENT_LOCALE_REQUEST = "ak-locale-request";
export const EVENT_REQUEST_POST = "ak-request-post";
export const EVENT_MESSAGE = "ak-message";

View File

@@ -0,0 +1,200 @@
import { type allLocales, sourceLocale } from "../../../locale-codes.js";
import type { LocaleModule } from "@lit/localize";
import { msg, str } from "@lit/localize";
export type TargetLocale = (typeof allLocales)[number];
/**
* The pseudo locale code.
*/
export const PseudoLocale = "pseudo-LOCALE" satisfies TargetLocale;
/**
* A dummy locale module representing the source locale (English).
*
* @remarks
* This is used to satisfy the return type of {@linkcode LocaleLoaderRecord}
* for the source locale, which does not need to be loaded.
*/
const sourceTargetModule: LocaleModule = {
templates: {},
};
/**
* A record mapping locale codes to their respective human-readable labels.
*
* @remarks
* These are thunked functions to allow for localization via `msg()`.
*/
export const LocaleLabelRecord: Record<TargetLocale, () => string> = {
[sourceLocale]: () => msg("English", { id: "en" }),
[PseudoLocale]: () => msg("Pseudolocale", { id: "pseudo-LOCALE" }),
"cs-CZ": () => msg("Czech", { id: "cs-CZ" }),
"de-DE": () => msg("German", { id: "de-DE" }),
"es-ES": () => msg("Spanish", { id: "es-ES" }),
"fi-FI": () => msg("Finnish", { id: "fi-FI" }),
"fr-FR": () => msg("French", { id: "fr-FR" }),
"it-IT": () => msg("Italian", { id: "it-IT" }),
"ja-JP": () => msg("Japanese", { id: "ja-JP" }),
"ko-KR": () => msg("Korean", { id: "ko-KR" }),
"nl-NL": () => msg("Dutch", { id: "nl-NL" }),
"pl-PL": () => msg("Polish", { id: "pl-PL" }),
"pt-BR": () => msg("Portuguese", { id: "pt-BR" }),
"ru-RU": () => msg("Russian", { id: "ru-RU" }),
"tr-TR": () => msg("Turkish", { id: "tr-TR" }),
"zh-Hans": () => msg("Chinese Simplified", { id: "zh-Hans" }),
"zh-Hant": () => msg("Chinese Traditional", { id: "zh-Hant" }),
};
/**
* A record mapping locale codes to their respective human-readable labels in their own language.
*
* @remarks
* These are not thunked, as they are already localized.
*/
export const TranslatedLabelRecord: Record<TargetLocale, string> = {
[sourceLocale]: "English",
[PseudoLocale]: "Pseudolocale",
"cs-CZ": "Čeština",
"de-DE": "Deutsch",
"es-ES": "Español",
"fi-FI": "Suomi",
"fr-FR": "Français",
"it-IT": "Italiano",
"ja-JP": "日本語",
"ko-KR": "한국어",
"nl-NL": "Nederlands",
"pl-PL": "Polski",
"pt-BR": "Português",
"ru-RU": "Русский",
"tr-TR": "Türkçe",
"zh-Hans": "简体中文",
"zh-Hant": "繁體中文",
};
/**
* A tuple representing a locale label and its corresponding code.
*/
export type LocaleOption = [label: string, code: TargetLocale];
/**
* Format the locale options for use in a user-facing element.
*
* @param locales locales argument for locale-sensitive sorting.
* @param collatorOptions Optional collator options for locale-sensitive sorting.
* @returns An array of locale options sorted by their labels.
*/
export function formatLocaleOptions(
locales?: Intl.LocalesArgument,
collatorOptions?: Intl.CollatorOptions,
): LocaleOption[] {
const options = Object.entries(LocaleLabelRecord)
.map(([_code, label]) => {
const code = _code as TargetLocale;
const translatedLabel = TranslatedLabelRecord[code];
const localeLabel = label();
let localizedMessage: string;
if (localeLabel === translatedLabel) {
localizedMessage = localeLabel;
} else {
localizedMessage = msg(str`${localeLabel} (${translatedLabel})`, {
id: "locale-option-localized-label",
desc: "Locale option label showing the localized language name along with the native language name in parentheses. The first placeholder is the localized language name, the second is the native language name.",
});
}
return [localizedMessage, code];
})
.sort(([aLabel], [bLabel]) => aLabel.localeCompare(bLabel, locales, collatorOptions));
return options as LocaleOption[];
}
/**
* A record mapping locale codes to their respective module loaders.
*
* @remarks
* The `import` statements **must** reference a locale module path,
* as this is how ESBuild identifies which files to include in the build.
*/
export const LocaleLoaderRecord: Record<TargetLocale, () => Promise<LocaleModule>> = {
[sourceLocale]: () => Promise.resolve(sourceTargetModule),
[PseudoLocale]: () => import("#locales/pseudo-LOCALE"),
"cs-CZ": () => import("#locales/cs-CZ"),
"de-DE": () => import("#locales/de-DE"),
"es-ES": () => import("#locales/es-ES"),
"fi-FI": () => import("#locales/fi-FI"),
"fr-FR": () => import("#locales/fr-FR"),
"it-IT": () => import("#locales/it-IT"),
"ja-JP": () => import("#locales/ja-JP"),
"ko-KR": () => import("#locales/ko-KR"),
"nl-NL": () => import("#locales/nl-NL"),
"pl-PL": () => import("#locales/pl-PL"),
"pt-BR": () => import("#locales/pt-BR"),
"ru-RU": () => import("#locales/ru-RU"),
"tr-TR": () => import("#locales/tr-TR"),
"zh-Hans": () => import("#locales/zh-Hans"),
"zh-Hant": () => import("#locales/zh-Hant"),
};
/**
* A record mapping locale codes to their respective regex patterns.
*
* @remarks
* While this isn't too useful on its own, we use it to build the {@linkcode LocalePatternCodeMap}
* while ensuring that TypeScript can verify that all locale codes are covered.
*
* The matchers try to conform loosely to [RFC 5646](https://www.rfc-editor.org/rfc/rfc5646.txt),
* "Tags for the Identification of Languages."
* In practice, language tags have been seen using both hyphens and underscores.
*
* Chinese language (`zh` or _Zhongwen_) can have a subtag indicating script:
*
* - `Hans`: Simplified
* - `Hant`: Traditional
*
* Alternatively, the subtag can indicate a region with a predominant script.
* The fallback is simplified Chinese.
*/
export const LocalePatternRecord: Record<TargetLocale, RegExp> = {
[sourceLocale]: /^en([_-]|$)/i,
[PseudoLocale]: /^pseudo/i,
"cs-CZ": /^cs([_-]|$)/i,
"de-DE": /^de([_-]|$)/i,
"es-ES": /^es([_-]|$)/i,
"fi-FI": /^fi([_-]|$)/i,
"fr-FR": /^fr([_-]|$)/i,
"it-IT": /^it([_-]|$)/i,
"ja-JP": /^ja([_-]|$)/i,
"ko-KR": /^ko([_-]|$)/i,
"nl-NL": /^nl([_-]|$)/i,
"pl-PL": /^pl([_-]|$)/i,
"pt-BR": /^pt([_-]|$)/i,
"ru-RU": /^ru([_-]|$)/i,
"tr-TR": /^tr([_-]|$)/i,
/**
* Traditional Chinese.
*
* The region subtag is required.
*/
"zh-Hant": /^zh[_-](TW|HK|MO|Hant)/i,
/**
* Simplified Chinese.
*
* The region subtag is optional.
*/
"zh-Hans": /^zh([_-](CN|SG|MY|Hans)|$)/i,
};
/**
* A mapping of regex patterns to locale codes for matching user-supplied locale strings.
*
* @see {@linkcode LocalePatternRecord} for the source of this map.
*/
export const LocalePatternCodeMap = new Map<RegExp, TargetLocale>(
Object.entries(LocalePatternRecord).map(([code, pattern]) => [pattern, code as TargetLocale]),
);

View File

@@ -1,10 +0,0 @@
import type { LocaleModule } from "@lit/localize";
export type LocaleRow = [string, RegExp, () => string, () => Promise<LocaleModule>];
export type AkLocale = {
code: string;
match: RegExp;
label: () => string;
locale: () => Promise<LocaleModule>;
};

View File

@@ -0,0 +1,74 @@
import { sourceLocale } from "../../../locale-codes.js";
import { LocalePatternCodeMap, TargetLocale } from "#common/ui/locale/definitions";
export function getBestMatchLocale(locale: string): TargetLocale | null {
const [, localeCode] =
Iterator.from(LocalePatternCodeMap).find(([pattern]) => pattern.test(locale)) || [];
return localeCode ?? null;
}
/**
* Find the first supported locale from a list of candidates.
*
* @param candidates An array of locale strings to check.
* @returns The first supported locale code, or null if none found.
*
* @remarks
* This looks weird, but it's sensible: we have several candidates, and we want to find the first
* one that has a supported locale. Then, from *that*, we have to extract that first supported
* locale.
*/
export function findSupportedLocale(candidates: string[]): TargetLocale | null {
const candidate = candidates.find((candidate) => getBestMatchLocale(candidate));
return candidate ? getBestMatchLocale(candidate) : null;
}
/**
* Auto-detect the best locale to use from several sources.
*
* @param localeHint An optional locale code hint.
* @param fallbackLocaleCode An optional fallback locale code.
* @returns The best-matching supported locale code.
*
* @remarks
* The order of precedence is:
*
* 1. A `locale` URL parameter
* 2. A provided locale hint
* 3. The browser's navigator language
* 4. A provided fallback locale code
* 5. The source locale (English)
*/
export function autoDetectLanguage(localeHint?: string, fallbackLocaleCode?: string): TargetLocale {
let localeParam: string | null = null;
if (self.location) {
const searchParam = new URLSearchParams(self.location.search);
localeParam = searchParam.get("locale");
}
const candidates = [
localeParam,
localeHint,
self.navigator?.language,
fallbackLocaleCode,
].filter((item): item is string => !!item);
const firstSupportedLocale = findSupportedLocale(candidates);
if (!firstSupportedLocale) {
console.debug(`authentik/locale: Falling back to source locale`, {
sourceLocale,
localeHint,
fallbackLocaleCode,
candidates,
});
return sourceLocale;
}
return firstSupportedLocale;
}

View File

@@ -1,5 +1,4 @@
import { DEFAULT_CONFIG } from "#common/api/config";
import { EVENT_LOCALE_REQUEST } from "#common/constants";
import { isResponseErrorLike } from "#common/errors/network";
import { UIConfig, UserDisplay } from "#common/ui/config";
@@ -59,18 +58,6 @@ function createGuestSession(): SessionUser {
return guest;
}
let memoizedSession: SessionUser | null = null;
/**
* Refresh the current user session.
*
* @deprecated This should be moved to the WithSession mixin.
*/
export function refreshMe(): Promise<SessionUser> {
memoizedSession = null;
return me();
}
/**
* Retrieve the current user session.
*
@@ -81,27 +68,8 @@ export function refreshMe(): Promise<SessionUser> {
* @category Session
*/
export async function me(requestInit?: RequestInit): Promise<SessionUser> {
if (memoizedSession) return memoizedSession;
return new CoreApi(DEFAULT_CONFIG)
.coreUsersMeRetrieve(requestInit)
.then((nextSession) => {
const locale: string | undefined = nextSession.user.settings.locale;
if (locale) {
console.debug(`authentik/locale: Activating user's configured locale '${locale}'`);
window.dispatchEvent(
new CustomEvent(EVENT_LOCALE_REQUEST, {
composed: true,
bubbles: true,
detail: { locale },
}),
);
}
return nextSession;
})
.catch(async (error: unknown) => {
if (isResponseErrorLike(error)) {
const { response } = error;
@@ -114,10 +82,6 @@ export async function me(requestInit?: RequestInit): Promise<SessionUser> {
console.debug("authentik/users: Failed to retrieve user session", error);
return createGuestSession();
})
.then((nextSession) => {
memoizedSession = nextSession;
return nextSession;
});
}

View File

@@ -4,6 +4,7 @@ import { applyDocumentTheme, createUIThemeEffect } from "#common/theme";
import { AKElement } from "#elements/Base";
import { BrandingContextController } from "#elements/controllers/BrandContextController";
import { ConfigContextController } from "#elements/controllers/ConfigContextController";
import { LocaleContextController } from "#elements/controllers/LocaleContextController";
import { ModalOrchestrationController } from "#elements/controllers/ModalOrchestrationController";
/**
@@ -13,10 +14,11 @@ export abstract class Interface extends AKElement {
constructor() {
super();
const { config, brand } = globalAK();
const { config, brand, locale } = globalAK();
createUIThemeEffect(applyDocumentTheme);
this.addController(new LocaleContextController(this, locale));
this.addController(new ConfigContextController(this, config));
this.addController(new BrandingContextController(this, brand));
this.addController(new ModalOrchestrationController());

View File

@@ -1,52 +0,0 @@
import "./ak-locale-context.js";
import { EVENT_LOCALE_REQUEST } from "#common/constants";
import { customEvent } from "#elements/utils/customEvents";
import { localized, msg } from "@lit/localize";
import { html, LitElement } from "lit";
import { customElement } from "lit/decorators.js";
export default {
title: "Elements / Shell / Locale Context",
};
@localized()
@customElement("ak-locale-demo-component")
export class AKLocaleDemoComponent extends LitElement {
render() {
return html`<span>${msg("Everything is ok.")}</span>`;
}
}
@localized()
@customElement("ak-locale-sensitive-demo-component")
export class AKLocaleSensitiveDemoComponent extends LitElement {
render() {
return html`<p>${msg("Everything is ok.")}</p>`;
}
}
export const InFrench = () =>
html`<div style="padding: 4em">
<ak-locale-context locale="fr"
><ak-locale-demo-component
>Everything is not ok.</ak-locale-demo-component
></ak-locale-context
>
</div>`;
export const SwitchingBackAndForth = () => {
let lang = "en";
window.setInterval(() => {
lang = lang === "en" ? "fr" : "en";
window.dispatchEvent(customEvent(EVENT_LOCALE_REQUEST, { locale: lang }));
}, 1000);
return html`<div style="padding: 4em">
<ak-locale-context locale="fr">
<ak-locale-sensitive-demo-component></ak-locale-sensitive-demo-component
></ak-locale-context>
</div>`;
};

View File

@@ -1,104 +0,0 @@
import type { LocaleGetter, LocaleSetter } from "./configureLocale.js";
import { initializeLocalization } from "./configureLocale.js";
import { autoDetectLanguage, DEFAULT_LOCALE, getBestMatchLocale } from "./helpers.js";
import { EVENT_LOCALE_CHANGE, EVENT_LOCALE_REQUEST } from "#common/constants";
import { globalAK } from "#common/global";
import { AKElement } from "#elements/Base";
import { customEvent } from "#elements/utils/customEvents";
import { customElement, property } from "lit/decorators.js";
/**
* A component to manage your locale settings.
*
* ## Details
*
* This component exists to take a locale setting from several different places, find the
* appropriate locale file in our catalog of locales, and set the lit-localization context
* appropriately. If that works, it sends off an event saying so.
*
* @element ak-locale-context
* @slot - The content which consumes this context
* @fires ak-locale-change - When a valid locale has been swapped in
*/
@customElement("ak-locale-context")
export class LocaleContext extends AKElement {
protected createRenderRoot(): HTMLElement | DocumentFragment {
return this;
}
/// @attribute The text representation of the current locale */
@property({ attribute: true, type: String, useDefault: true })
public locale = globalAK().locale || DEFAULT_LOCALE;
/// @attribute The URL parameter to look for (if any)
@property({ attribute: true, type: String, useDefault: true })
public param = "locale";
getLocale: LocaleGetter;
setLocale: LocaleSetter;
constructor(code = DEFAULT_LOCALE) {
super();
this.notifyApplication = this.notifyApplication.bind(this);
this.updateLocaleHandler = this.updateLocaleHandler.bind(this);
try {
const [getLocale, setLocale] = initializeLocalization();
this.getLocale = getLocale;
this.setLocale = setLocale;
this.setLocale(code).then(() => {
window.setTimeout(this.notifyApplication, 0);
});
} catch (e) {
throw new Error(`Developer error: Must have only one locale context per session: ${e}`);
}
}
connectedCallback() {
super.connectedCallback();
this.updateLocale();
window.addEventListener(EVENT_LOCALE_REQUEST, this.updateLocaleHandler as EventListener);
}
disconnectedCallback() {
window.removeEventListener(EVENT_LOCALE_REQUEST, this.updateLocaleHandler as EventListener);
super.disconnectedCallback();
}
updateLocaleHandler(ev: CustomEvent<{ locale: string }>) {
console.debug("authentik/locale: Locale update request received.");
this.updateLocale(ev.detail.locale);
}
updateLocale(requestedLocale: string | undefined = undefined) {
const localeRequest = autoDetectLanguage(requestedLocale, this.locale);
const locale = getBestMatchLocale(localeRequest);
if (!locale) {
console.warn(`authentik/locale: failed to find locale for code ${localeRequest}`);
return;
}
locale.locale().then(() => {
console.debug(`authentik/locale: Setting Locale to ${locale.label()} (${locale.code})`);
this.setLocale(locale.code).then(() => {
window.setTimeout(this.notifyApplication, 0);
});
});
}
notifyApplication() {
// You will almost never have cause to catch this event. Lit's own `@localized()` decorator
// works just fine for almost every use case.
this.dispatchEvent(customEvent(EVENT_LOCALE_CHANGE));
}
}
export default LocaleContext;
declare global {
interface HTMLElementTagNameMap {
"ak-locale-context": LocaleContext;
}
}

View File

@@ -1,39 +0,0 @@
import { sourceLocale, targetLocales } from "../../locale-codes.js";
import { getBestMatchLocale } from "./helpers.js";
import { configureLocalization } from "@lit/localize";
type LocaleGetter = ReturnType<typeof configureLocalization>["getLocale"];
type LocaleSetter = ReturnType<typeof configureLocalization>["setLocale"];
// Internal use only.
//
// This is where the lit-localization module is initialized with our loader, which associates our
// collection of locales with its getter and setter functions.
let getLocale: LocaleGetter | undefined = undefined;
let setLocale: LocaleSetter | undefined = undefined;
export function initializeLocalization(): [LocaleGetter, LocaleSetter] {
if (getLocale && setLocale) {
return [getLocale, setLocale];
}
({ getLocale, setLocale } = configureLocalization({
sourceLocale,
targetLocales,
loadLocale: async (locale: string) => {
const localeDef = getBestMatchLocale(locale);
if (!localeDef) {
console.warn(`Unrecognized locale: ${localeDef}`);
return Promise.reject("");
}
return localeDef.locale();
},
}));
return [getLocale, setLocale];
}
export default initializeLocalization;
export type { LocaleGetter, LocaleSetter };

View File

@@ -1,4 +0,0 @@
import { createContext } from "@lit/context";
export const localeContext = createContext<string>("locale");
export default localeContext;

View File

@@ -1,66 +0,0 @@
import { AkLocale, LocaleRow } from "./types.js";
import type { LocaleModule } from "@lit/localize";
import { msg } from "@lit/localize";
export const DEFAULT_FALLBACK = "en";
export const enLocale: LocaleModule = {
templates: {},
};
// NOTE: This table cannot be made any shorter, despite all the repetition of syntax. Bundlers look
// for the `import` #a *string target* for doing alias substitution, so putting
// the import in some sort of abstracting function doesn't work. The same is true for the `msg()`
// function, which `localize` uses to find strings for extraction and translation. Likewise,
// because this is a file-level table, the `msg()` must be thunked so that they're re-run when
// the user changes the locale.
// NOTE: The matchers try to conform loosely to [RFC
// 5646](https://www.rfc-editor.org/rfc/rfc5646.txt), "Tags for the Identification of Languages." In
// practice, language tags have been seen using both hyphens and underscores, and the Chinese
// language uses both "regional" and "script" suffixes. The regexes use the language and any region
// or script.
//
// Chinese locales usually (but not always) use the script rather than region suffix. The default
// (optional) fallback for Chinese (zh) is "Chinese (simplified)", which is why it has that odd
// regex syntax at the end which means "match zh as long as it's not followed by a [:word:] token";
// Traditional script and the Taiwanese are attempted first, and if neither matches, anything
// beginning with that generic "zh" is mapped to "Chinese (simplified)."
// - Code for Lit/Locale
// - Regex for matching user-supplied locale.
// - Text Label
// - Locale loader.
// prettier-ignore
const debug: LocaleRow = [
"pseudo_LOCALE", /^pseudo/i, () => msg("Pseudolocale (for testing)"), () => import("#locales/pseudo_LOCALE"),
];
// prettier-ignore
const LOCALE_TABLE: LocaleRow[] = [
["de_DE", /^de([_-]|$)/i, () => msg("German"), () => import("#locales/de_DE")],
["en", /^en([_-]|$)/i, () => msg("English"), () => Promise.resolve(enLocale)],
["es_ES", /^es([_-]|$)/i, () => msg("Spanish"), () => import("#locales/es_ES")],
["fr_FR", /^fr([_-]|$)/i, () => msg("French"), () => import("#locales/fr_FR")],
["it_IT", /^it([_-]|$)/i, () => msg("Italian"), () => import("#locales/it_IT")],
["ja_JP", /^ja([_-]|$)/i, () => msg("Japanese"), () => import("#locales/ja_JP")],
["ko_KR", /^ko([_-]|$)/i, () => msg("Korean"), () => import("#locales/ko_KR")],
["nl_NL", /^nl([_-]|$)/i, () => msg("Dutch"), () => import("#locales/nl_NL")],
["pl_PL", /^pl([_-]|$)/i, () => msg("Polish"), () => import("#locales/pl_PL")],
["ru_RU", /^ru([_-]|$)/i, () => msg("Russian"), () => import("#locales/ru_RU")],
["tr_TR", /^tr([_-]|$)/i, () => msg("Turkish"), () => import("#locales/tr_TR")],
["zh_Hans", /^zh(\b|_)/i, () => msg("Chinese (simplified)"), () => import("#locales/zh_Hans")],
["zh_Hant", /^zh[_-](HK|Hant)/i, () => msg("Chinese (traditional)"), () => import("#locales/zh_Hant")],
debug
];
export const LOCALES: AkLocale[] = LOCALE_TABLE.map(([code, match, label, locale]) => ({
code,
match,
label,
locale,
}));
export default LOCALES;

View File

@@ -1,70 +0,0 @@
import { enLocale, LOCALES as RAW_LOCALES } from "./definitions.js";
import { AkLocale } from "./types.js";
import { globalAK } from "#common/global";
export const DEFAULT_LOCALE = "en";
export const EVENT_REQUEST_LOCALE = "ak-request-locale";
const TOMBSTONE = "⛼⛼tombstone⛼⛼";
// NOTE: This is the definition of the LOCALES table that most of the code uses. The 'definitions'
// file is relatively pure, but here we establish that we want the English locale to loaded when an
// application is first instantiated.
export const LOCALES = RAW_LOCALES.map((locale) =>
locale.code === "en" ? { ...locale, locale: async () => enLocale } : locale,
);
export function getBestMatchLocale(locale: string): AkLocale | null {
return LOCALES.find((l) => l.match.test(locale)) || null;
}
// This looks weird, but it's sensible: we have several candidates, and we want to find the first
// one that has a supported locale. Then, from *that*, we have to extract that first supported
// locale.
export function findSupportedLocale(candidates: string[]): AkLocale | null {
const candidate = candidates.find((candidate: string) => getBestMatchLocale(candidate));
return candidate ? getBestMatchLocale(candidate) : null;
}
export function localeCodeFromUrl(param = "locale") {
const url = new URL(window.location.href);
return url.searchParams.get(param) || "";
}
// Get all locales we can, in order
// - Global authentik settings (contains user settings)
// - URL parameter
// - A requested code passed in, if any
// - Navigator
// - Fallback (en)
const isLocaleCandidate = (v: unknown): v is string =>
typeof v === "string" && v !== "" && v !== TOMBSTONE;
export function autoDetectLanguage(userReq = TOMBSTONE, brandReq = TOMBSTONE): string {
const localeCandidates: string[] = [
localeCodeFromUrl("locale"),
userReq,
window.navigator?.language ?? TOMBSTONE,
brandReq,
globalAK()?.locale ?? TOMBSTONE,
DEFAULT_LOCALE,
].filter(isLocaleCandidate);
const firstSupportedLocale = findSupportedLocale(localeCandidates);
if (!firstSupportedLocale) {
console.debug(
`authentik/locale: No locale found for '[${localeCandidates}.join(',')]', falling back to ${DEFAULT_LOCALE}`,
);
return DEFAULT_LOCALE;
}
return firstSupportedLocale.code;
}
export default autoDetectLanguage;

View File

@@ -1,4 +0,0 @@
import LocaleContext from "./ak-locale-context.js";
export { LocaleContext };
export default LocaleContext;

View File

@@ -1,15 +0,0 @@
import type { LocaleModule } from "@lit/localize";
export type LocaleRow = [
code: string,
pattern: RegExp,
label: () => string,
loader: () => Promise<LocaleModule>,
];
export type AkLocale = {
code: string;
match: RegExp;
label: () => string;
locale: () => Promise<LocaleModule>;
};

View File

@@ -0,0 +1,181 @@
import { sourceLocale, targetLocales } from "../../locale-codes.js";
import { LocaleLabelRecord, LocaleLoaderRecord, TargetLocale } from "#common/ui/locale/definitions";
import { autoDetectLanguage } from "#common/ui/locale/utils";
import { kAKLocale, LocaleContext, LocaleMixin } from "#elements/mixins/locale";
import type { ReactiveElementHost } from "#elements/types";
import { ContextProvider } from "@lit/context";
import { configureLocalization, LOCALE_STATUS_EVENT, LocaleStatusEventDetail } from "@lit/localize";
import type { ReactiveController } from "lit";
/**
* A controller that provides the application configuration to the element.
*/
export class LocaleContextController implements ReactiveController {
protected static DocumentObserverInit: MutationObserverInit = {
attributes: true,
attributeFilter: ["lang"],
attributeOldValue: true,
};
#log = console.debug.bind(console, `authentik/controller/locale`);
/**
* Attempts to apply the given locale code.
* @param nextLocale A user or agent preferred locale code.
*/
#applyLocale(nextLocale: TargetLocale) {
const currentLocale = this.#context.value.getLocale();
const label = LocaleLabelRecord[nextLocale]();
if (currentLocale === nextLocale) {
this.#log("Skipping locale update, already set to:", label);
return;
}
this.#context.value.setLocale(nextLocale);
this.#host.locale = nextLocale;
this.#log("Applied locale:", label);
}
// #region Attribute Observation
/**
* Synchronizes changes to the document's `lang` attribute to the locale context.
*
* @remarks
* While we don't expect the document's `lang` attribute to change outside of
* this controller, we observe it to respect a possible external change,
* such as from the user agent's language settings, or a browser extension which
* modifies the attribute.
*/
#attributeListener = (mutations: MutationRecord[]) => {
for (const mutation of mutations) {
if (mutation.type !== "attributes" || mutation.attributeName !== "lang") {
continue;
}
const attribute = {
previous: mutation.oldValue,
current: document.documentElement.lang,
};
this.#log("Detected document `lang` attribute change", attribute);
if (attribute.previous === attribute.current) {
this.#log("Skipping locale update, `lang` unchanged", attribute);
continue;
}
const nextLocale = autoDetectLanguage(attribute.current);
this.#applyLocale(nextLocale);
return;
}
};
#documentObserver = new MutationObserver(this.#attributeListener);
#connectDocumentObserver() {
this.#documentObserver.observe(
document.documentElement,
LocaleContextController.DocumentObserverInit,
);
}
#disconnectDocumentObserver() {
this.#documentObserver.disconnect();
}
//#endregion
//#region Lifecycle
/**
* Loads the locale module for the given locale code.
*
* @param _locale The locale code to load.
*
* @remarks
* This is used by `@lit/localize` to dynamically load locale modules,
* as well synchronizing the document's `lang` attribute.
*/
#loadLocale = (_locale: string) => {
// TypeScript cannot infer the type here, but Lit Localize will only call this
// function with one of the `targetLocales`.
const locale = _locale as TargetLocale;
const label = LocaleLabelRecord[locale]();
this.#log(`Loading "${label}" module...`);
const loader = LocaleLoaderRecord[locale];
return loader();
};
#host: ReactiveElementHost<LocaleMixin>;
#context: ContextProvider<LocaleContext>;
/**
* @param host The host element.
* @param localeHint The initial locale code to set.
*/
constructor(host: ReactiveElementHost<LocaleMixin>, localeHint?: string) {
this.#host = host;
const contextValue = configureLocalization({
sourceLocale,
targetLocales,
loadLocale: this.#loadLocale,
});
this.#context = new ContextProvider(this.#host, {
context: LocaleContext,
initialValue: contextValue,
});
this.#host[kAKLocale] = contextValue;
const nextLocale = autoDetectLanguage(localeHint);
if (nextLocale !== sourceLocale) {
this.#applyLocale(nextLocale);
}
}
#localeStatusListener = (event: CustomEvent<LocaleStatusEventDetail>) => {
if (event.detail.status === "error") {
this.#log("Error loading locale:", event.detail);
return;
}
if (event.detail.status === "loading") {
return;
}
const { readyLocale } = event.detail;
this.#log(`Updating \`lang\` attribute to: \`${readyLocale}\``);
// Prevent observation while we update the `lang` attribute...
this.#disconnectDocumentObserver();
document.documentElement.lang = readyLocale;
this.#connectDocumentObserver();
};
public hostConnected() {
window.addEventListener(LOCALE_STATUS_EVENT, this.#localeStatusListener);
}
public hostDisconnected() {
this.#documentObserver.disconnect();
window.removeEventListener(LOCALE_STATUS_EVENT, this.#localeStatusListener);
}
//#endregion
}

View File

@@ -1,16 +1,13 @@
import type { APIResult } from "#common/api/responses";
import { EVENT_WS_MESSAGE } from "#common/constants";
import { isCausedByAbortError, parseAPIResponseError } from "#common/errors/network";
import { me } from "#common/users";
import { AKConfigMixin, kAKConfig } from "#elements/mixins/config";
import { AKConfigMixin } from "#elements/mixins/config";
import { type LocaleMixin } from "#elements/mixins/locale";
import { SessionContext, SessionMixin } from "#elements/mixins/session";
import type { ReactiveElementHost } from "#elements/types";
import { SessionUser } from "@goauthentik/api";
import { setUser } from "@sentry/browser";
import { ContextProvider } from "@lit/context";
import type { ReactiveController } from "lit";
@@ -23,7 +20,7 @@ export class SessionContextController implements ReactiveController {
#log = console.debug.bind(console, `authentik/controller/session`);
#abortController: null | AbortController = null;
#host: ReactiveElementHost<SessionMixin & AKConfigMixin>;
#host: ReactiveElementHost<LocaleMixin & SessionMixin & AKConfigMixin>;
#context: ContextProvider<SessionContext>;
constructor(
@@ -39,32 +36,26 @@ export class SessionContextController implements ReactiveController {
}
#fetch = () => {
this.#log("Fetching session...");
if (!this.#host.refreshSession) {
this.#log("No refreshSession method available, skipping session fetch");
return Promise.resolve();
}
this.#abortController?.abort();
this.#abortController = new AbortController();
return me({
signal: this.#abortController.signal,
})
return this.#host
.refreshSession({
signal: this.#abortController.signal,
})
.then((session) => {
const config = this.#host[kAKConfig];
if (config?.errorReporting.sendPii) {
console.debug("authentik/config: Sentry with PII enabled.");
setUser({ email: session.user.email });
}
console.debug("authentik/controller/session: Fetched session", session);
this.#context.setValue(session);
this.#host.session = session;
this.#host.requestUpdate?.();
})
.catch(async (error: unknown) => {
if (isCausedByAbortError(error)) {
this.#log("Aborted fetching session");
return;
}
const parsedError = parseAPIResponseError(error);
@@ -75,15 +66,51 @@ export class SessionContextController implements ReactiveController {
.finally(() => {
this.#abortController = null;
});
// return me()
// .then((session) => {
// const localeHint: string | undefined = session.user.settings.locale;
// if (localeHint) {
// const locale = autoDetectLanguage(localeHint);
// this.#log(`Activating user's configured locale '${locale}'`);
// this.#host[kAKLocale]?.setLocale(locale);
// }
// const config = this.#host[kAKConfig];
// if (config?.errorReporting.sendPii) {
// console.debug("authentik/config: Sentry with PII enabled.");
// setUser({ email: session.user.email });
// }
// console.debug("authentik/controller/session: Fetched session", session);
// this.#context.setValue(session);
// this.#host.session = session;
// })
// .catch(async (error: unknown) => {
// if (isCausedByAbortError(error)) {
// this.#log("Aborted fetching session");
// return;
// }
// const parsedError = parseAPIResponseError(error);
// console.error("authentik/controller/session: Failed to fetch session", parsedError);
// throw error;
// })
// .finally(() => {
// this.#abortController = null;
// });
};
public hostConnected() {
window.addEventListener(EVENT_WS_MESSAGE, this.#fetch);
this.#fetch();
}
public hostDisconnected() {
window.removeEventListener(EVENT_WS_MESSAGE, this.#fetch);
this.#context.clearCallbacks();
this.#abortController?.abort();
}
}

View File

@@ -0,0 +1,74 @@
import { TargetLocale } from "#common/ui/locale/definitions";
import { createMixin } from "#elements/types";
import { consume, createContext } from "@lit/context";
import type { configureLocalization } from "@lit/localize";
export type LocaleContextValue = ReturnType<typeof configureLocalization>;
export const kAKLocale = Symbol("kAKLocale");
/**
* The Lit context for the application configuration.
*
* @category Context
* @see {@linkcode LocaleMixin}
* @see {@linkcode WithLocale}
*/
export const LocaleContext = createContext<LocaleContextValue>(
Symbol.for("authentik-locale-context"),
);
export type LocaleContext = typeof LocaleContext;
/**
* A consumer that provides session information to the element.
*
* @category Mixin
* @see {@linkcode WithLocale}
*/
export interface LocaleMixin {
/**
* The locale context value.
*
* @internal
*/
readonly [kAKLocale]: Readonly<LocaleContextValue>;
/**
* The current locale code.
*/
locale: TargetLocale;
}
/**
* A mixin that provides locale information to the element.
*
* @category Mixin
*/
export const WithLocale = createMixin<LocaleMixin>(
({
// ---
SuperClass,
subscribe = true,
}) => {
abstract class LocaleProvider extends SuperClass implements LocaleMixin {
@consume({
context: LocaleContext,
subscribe,
})
public [kAKLocale]!: LocaleContextValue;
public get locale(): TargetLocale {
return this[kAKLocale].getLocale() as TargetLocale;
}
public set locale(value: TargetLocale) {
this[kAKLocale].setLocale(value);
}
}
return LocaleProvider;
},
);

View File

@@ -1,12 +1,17 @@
import { APIResult, isAPIResultReady } from "#common/api/responses";
import { createUIConfig, DefaultUIConfig, UIConfig } from "#common/ui/config";
import { autoDetectLanguage } from "#common/ui/locale/utils";
import { me } from "#common/users";
import { AuthentikConfigContext, kAKConfig } from "#elements/mixins/config";
import { kAKLocale, LocaleContext, LocaleContextValue } from "#elements/mixins/locale";
import { createMixin } from "#elements/types";
import type { SessionUser, UserSelf } from "@goauthentik/api";
import type { Config, SessionUser, UserSelf } from "@goauthentik/api";
import { setUser } from "@sentry/browser";
import { consume, createContext } from "@lit/context";
import { property } from "lit/decorators.js";
/**
* The Lit context for the application configuration.
@@ -58,6 +63,13 @@ export interface SessionMixin {
* Whether the current session is impersonating another user.
*/
readonly impersonating: boolean;
/**
* Refresh the current session information.
*
* @param requestInit Optional parameters to pass to the fetch call.
*/
refreshSession(requestInit?: RequestInit): Promise<SessionUser>;
}
/**
@@ -86,6 +98,20 @@ export const WithSession = createMixin<SessionMixin>(
subscribe = true,
}) => {
abstract class SessionProvider extends SuperClass implements SessionMixin {
#log = console.debug.bind(console, `authentik/session`);
@consume({
context: AuthentikConfigContext,
subscribe,
})
public readonly [kAKConfig]!: Readonly<Config>;
@consume({
context: LocaleContext,
subscribe,
})
public [kAKLocale]!: LocaleContextValue;
#data: APIResult<Readonly<SessionUser>> = {
loading: true,
error: null,
@@ -97,7 +123,6 @@ export const WithSession = createMixin<SessionMixin>(
context: SessionContext,
subscribe,
})
@property({ attribute: false })
public set session(nextResult: APIResult<SessionUser>) {
this.#data = nextResult;
if (isAPIResultReady(nextResult)) {
@@ -126,6 +151,33 @@ export const WithSession = createMixin<SessionMixin>(
public get impersonating(): boolean {
return !!this.originalUser;
}
public refreshSession(requestInit?: RequestInit): Promise<SessionUser> {
this.#log("Fetching session...");
return me(requestInit).then((session) => {
const localeHint: string | undefined = session.user.settings.locale;
if (localeHint) {
const locale = autoDetectLanguage(localeHint);
this.#log(`Activating user's configured locale '${locale}'`);
this[kAKLocale]?.setLocale(locale);
}
const config = this[kAKConfig];
if (config?.errorReporting.sendPii) {
this.#log("Sentry with PII enabled.");
setUser({ email: session.user.email });
}
this.#log("Fetched session", session);
this.session = session;
return session;
});
}
}
return SessionProvider;

View File

@@ -1,5 +1,4 @@
import "#elements/LoadingOverlay";
import "#elements/ak-locale-context/ak-locale-context";
import "#flow/components/ak-brand-footer";
import "#flow/components/ak-flow-card";
import "#flow/sources/apple/AppleLoginInit";

View File

@@ -2,6 +2,7 @@ import { pluckErrorDetail } from "#common/errors/network";
import { AKElement } from "#elements/Base";
import { intersectionObserver } from "#elements/decorators/intersection-observer";
import { WithLocale } from "#elements/mixins/locale";
import { FocusTarget } from "#elements/utils/focus";
import { ContextualFlowInfo, CurrentBrand, ErrorDetail } from "@goauthentik/api";
@@ -56,7 +57,7 @@ export interface ResponseErrorsChallenge {
export abstract class BaseStage<
Tin extends FlowInfoChallenge & PendingUserChallenge & ResponseErrorsChallenge,
Tout,
> extends AKElement {
> extends WithLocale(AKElement) {
static shadowRootOptions: ShadowRootInit = {
...LitElement.shadowRootOptions,
delegatesFocus: true,

View File

@@ -3,7 +3,6 @@ import "#flow/components/ak-flow-card";
import { pluckErrorDetail } from "#common/errors/network";
import autoDetectLanguage from "#elements/ak-locale-context/helpers";
import { akEmptyState } from "#elements/EmptyState";
import { ifPresent } from "#elements/utils/attributes";
import { ListenerController } from "#elements/utils/listenerController";
@@ -134,8 +133,6 @@ export class CaptchaStage extends BaseStage<CaptchaChallenge, CaptchaChallengeRe
#captchaDocumentContainer?: HTMLDivElement;
#listenController = new ListenerController();
#locale: string | null = null;
//#endregion
//#region Getters/Setters
@@ -195,7 +192,7 @@ export class CaptchaStage extends BaseStage<CaptchaChallenge, CaptchaChallengeRe
sitekey: this.challenge.siteKey,
callback: this.onTokenChange,
size: "invisible",
hl: this.#locale ?? undefined,
hl: this.locale,
}),
);
});
@@ -230,7 +227,7 @@ export class CaptchaStage extends BaseStage<CaptchaChallenge, CaptchaChallengeRe
sitekey: this.challenge.siteKey,
callback: this.onTokenChange,
size: "invisible",
hl: this.#locale ?? undefined,
hl: this.locale,
}),
);
}
@@ -256,7 +253,7 @@ export class CaptchaStage extends BaseStage<CaptchaChallenge, CaptchaChallengeRe
data-theme="${this.activeTheme}"
data-callback="callback"
data-size="flexible"
data-language=${ifPresent(this.#locale)}
data-language=${ifPresent(this.locale)}
></div>`;
};
@@ -375,8 +372,6 @@ export class CaptchaStage extends BaseStage<CaptchaChallenge, CaptchaChallengeRe
window.addEventListener("message", this.#messageListener, {
signal: this.#listenController.signal,
});
this.#locale = autoDetectLanguage();
}
public disconnectedCallback(): void {

View File

@@ -1,7 +1,9 @@
import "#elements/Divider";
import "#flow/components/ak-flow-card";
import { LOCALES } from "#elements/ak-locale-context/definitions";
import { formatLocaleOptions, PseudoLocale } from "#common/ui/locale/definitions";
import { getBestMatchLocale } from "#common/ui/locale/utils";
import { CapabilitiesEnum, WithCapabilitiesConfig } from "#elements/mixins/capabilities";
import { AKFormErrors } from "#components/ak-field-errors";
@@ -31,6 +33,9 @@ import PFLogin from "@patternfly/patternfly/components/Login/login.css";
import PFTitle from "@patternfly/patternfly/components/Title/title.css";
import PFBase from "@patternfly/patternfly/patternfly-base.css";
// Fixes horizontal rule <hr> warning in select dropdowns.
/* eslint-disable lit/no-invalid-html */
@customElement("ak-stage-prompt")
export class PromptStage extends WithCapabilitiesConfig(
BaseStage<PromptChallenge, PromptChallengeResponseRequest>,
@@ -214,27 +219,38 @@ ${prompt.initialValue}</textarea
</div> `;
})}`;
case PromptTypeEnum.AkLocale: {
const locales = this.can(CapabilitiesEnum.CanDebug)
? LOCALES
: LOCALES.filter((locale) => locale.code !== "debug");
const options = locales.map(
(locale) =>
html`<option
value=${locale.code}
?selected=${locale.code === prompt.initialValue}
>
${locale.code.toUpperCase()} - ${locale.label()}
</option> `,
let localeOptions = formatLocaleOptions();
const selected = prompt.initialValue
? getBestMatchLocale(prompt.initialValue)
: null;
if (!this.can(CapabilitiesEnum.CanDebug)) {
localeOptions = localeOptions.filter(([, code]) => code !== PseudoLocale);
}
const options = localeOptions.map(
([label, code]) =>
html`<option value=${code} ?selected=${code === selected}>
${label}
</option>`,
);
return html`<select
class="pf-c-form-control"
id=${fieldId}
name="${prompt.fieldKey}"
aria-label=${msg("Select language", {
id: "language-selector-label",
desc: "Label for the language selection dropdown",
})}
>
<option value="" ?selected=${prompt.initialValue === ""}>
${msg("Auto-detect (based on your browser)")}
<option value="" ?selected=${!selected}>
${msg("Auto-detect", {
id: "locale-auto-detect-option",
desc: "Label for the auto-detect locale option in language selection dropdown",
})}
</option>
<hr />
${options}
</select>`;
}

View File

@@ -11,39 +11,43 @@ export const sourceLocale = `en`;
* lexicographically.
*/
export const targetLocales = [
`cs_CZ`,
`de_DE`,
`es_ES`,
`fr_FR`,
`it_IT`,
`ja_JP`,
`ko_KR`,
`nl_NL`,
`pl_PL`,
`pseudo_LOCALE`,
`ru_RU`,
`tr_TR`,
`zh_Hans`,
`zh_Hant`,
`cs-CZ`,
`de-DE`,
`es-ES`,
`fi-FI`,
`fr-FR`,
`it-IT`,
`ja-JP`,
`ko-KR`,
`nl-NL`,
`pl-PL`,
`pseudo-LOCALE`,
`pt-BR`,
`ru-RU`,
`tr-TR`,
`zh-Hans`,
`zh-Hant`,
] as const;
/**
* All valid project locale codes. Sorted lexicographically.
*/
export const allLocales = [
`cs_CZ`,
`de_DE`,
`cs-CZ`,
`de-DE`,
`en`,
`es_ES`,
`fr_FR`,
`it_IT`,
`ja_JP`,
`ko_KR`,
`nl_NL`,
`pl_PL`,
`pseudo_LOCALE`,
`ru_RU`,
`tr_TR`,
`zh_Hans`,
`zh_Hant`,
`es-ES`,
`fi-FI`,
`fr-FR`,
`it-IT`,
`ja-JP`,
`ko-KR`,
`nl-NL`,
`pl-PL`,
`pseudo-LOCALE`,
`pt-BR`,
`ru-RU`,
`tr-TR`,
`zh-Hans`,
`zh-Hant`,
] as const;

View File

@@ -1,6 +1,5 @@
// sort-imports-ignore
import "rapidoc";
import "#elements/ak-locale-context/index";
import styles from "./index.entrypoint.css";
@@ -61,47 +60,42 @@ export class APIBrowser extends WithBrandConfig(Interface) {
render(): TemplateResult {
return html`
<ak-locale-context>
<rapi-doc
part="rapi-doc"
spec-url=${ifDefined(this.schemaPath)}
heading-text=""
theme="light"
render-style="read"
default-schema-tab="schema"
primary-color="#fd4b2d"
nav-bg-color="#212427"
bg-color=${this.bgColor}
text-color=${this.textColor}
nav-text-color="#ffffff"
nav-hover-bg-color="#3c3f42"
nav-accent-color="#4f5255"
nav-hover-text-color="#ffffff"
use-path-in-nav-bar="true"
nav-item-spacing="relaxed"
allow-server-selection="false"
show-header="false"
allow-spec-url-load="false"
allow-spec-file-load="false"
show-method-in-nav-bar="as-colored-text"
@before-try=${(
e: CustomEvent<{
request: {
headers: Headers;
};
}>,
) => {
e.detail.request.headers.append(
CSRFHeaderName,
getCookie("authentik_csrf"),
);
}}
>
<div slot="nav-logo">
${renderImage(this.brandingLogo, msg("authentik Logo"), "logo")}
</div>
</rapi-doc>
</ak-locale-context>
<rapi-doc
part="rapi-doc"
spec-url=${ifDefined(this.schemaPath)}
heading-text=""
theme="light"
render-style="read"
default-schema-tab="schema"
primary-color="#fd4b2d"
nav-bg-color="#212427"
bg-color=${this.bgColor}
text-color=${this.textColor}
nav-text-color="#ffffff"
nav-hover-bg-color="#3c3f42"
nav-accent-color="#4f5255"
nav-hover-text-color="#ffffff"
use-path-in-nav-bar="true"
nav-item-spacing="relaxed"
allow-server-selection="false"
show-header="false"
allow-spec-url-load="false"
allow-spec-file-load="false"
show-method-in-nav-bar="as-colored-text"
@before-try=${(
e: CustomEvent<{
request: {
headers: Headers;
};
}>,
) => {
e.detail.request.headers.append(CSRFHeaderName, getCookie("authentik_csrf"));
}}
>
<div slot="nav-logo">
${renderImage(this.brandingLogo, msg("authentik Logo"), "logo")}
</div>
</rapi-doc>
`;
}
}

View File

@@ -1,3 +1,43 @@
/* #region Generic Families */
:root {
--ak-generic-serif: serif;
--ak-generic-sans-serif: "RedHatText", sans-serif;
--ak-generic-monospace: "RedHatMono", "Fira Code", "Courier New", monospace;
--ak-generic-symbols: "Noto Sans Symbols", "Segoe UI Symbol", "Apple Symbols", sans-serif;
--ak-generic-emoji:
"Noto Color Emoji", "Apple Color Emoji", "Segoe UI Emoji", emoji, sans-serif;
--ak-generic-body: var(--ak-generic-sans-serif);
--ak-generic-heading: var(--ak-generic-body);
--ak-generic-display: "RedHatDisplay", var(--ak-generic-heading);
}
/* #endregion */
/* #region Font Families */
:root {
--ak-font-family-sans-serif: var(--ak-generic-sans-serif);
--ak-font-family-heading: var(--ak-generic-heading);
--ak-font-family-monospace: var(--ak-generic-monospace);
}
/* #endregion */
/* #region PF Mapping */
:root {
--pf-global--FontFamily--sans-serif: var(--ak-font-family-sans-serif);
--pf-global--FontFamily--heading--sans-serif: var(--ak-generic-display);
--pf-global--FontFamily--monospace: var(--ak-font-family-monospace);
--pf-global--FontFamily--redhat-updated--sans-serif: var(--ak-font-family-sans-serif);
--pf-global--FontFamily--redhat-updated--heading--sans-serif: var(--ak-generic-display);
}
/* #endregion */
/* #region Font Sizes and Weights */
:root {
--pf-global--FontSize--4xl: 2.25rem;
--pf-global--FontSize--3xl: 1.75rem;
@@ -17,32 +57,4 @@
--pf-global--LineHeight--md: 1.5;
}
:root {
--pf-global--FontFamily--sans-serif:
"RedHatText", "Overpass", overpass, helvetica, arial, sans-serif;
--pf-global--FontFamily--heading--sans-serif:
"RedHatDisplay", "Overpass", overpass, helvetica, arial, sans-serif;
--pf-global--FontFamily--monospace:
"Liberation Mono", consolas, "SFMono-Regular", menlo, monaco, "Courier New", monospace;
--pf-global--FontFamily--redhat-updated--sans-serif:
"RedHatTextUpdated", "Overpass", overpass, helvetica, arial, sans-serif;
--pf-global--FontFamily--redhat-updated--heading--sans-serif:
"RedHatDisplayUpdated", "Overpass", overpass, helvetica, arial, sans-serif;
--pf-global--FontFamily--redhat--monospace:
"RedHatMono", "Liberation Mono", consolas, "SFMono-Regular", menlo, monaco, "Courier New",
monospace;
--pf-global--FontFamily--redhatVF--sans-serif:
"RedHatTextVF", "RedHatText", "Overpass", overpass, helvetica, arial, sans-serif;
--pf-global--FontFamily--redhatVF--heading--sans-serif:
"RedHatDisplayVF", "RedHatDisplay", "Overpass", overpass, helvetica, arial, sans-serif;
--pf-global--FontFamily--redhatVF--monospace:
"RedHatMonoVF", "RedHatMono", "Liberation Mono", consolas, "SFMono-Regular", menlo, monaco,
"Courier New", monospace;
--pf-global--FontFamily--overpass--sans-serif:
"overpass", overpass, "open sans", -apple-system, blinkmacsystemfont, "Segoe UI", roboto,
"Helvetica Neue", arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji",
"Segoe UI Symbol";
--pf-global--FontFamily--overpass--monospace:
"overpass-mono", overpass-mono, "SFMono-Regular", menlo, monaco, consolas,
"Liberation Mono", "Courier New", monospace;
}
/* #endregion */

View File

@@ -23,6 +23,7 @@
/* #region authentik extensions */
/* #region Root */
:root {
--ak-accent: #fd4b2d;

View File

@@ -1,12 +1,16 @@
@import "@patternfly/patternfly/base/patternfly-fonts.css";
@import "@patternfly/patternfly/base/patternfly-common.css";
@import "@patternfly/patternfly/base/patternfly-globals.css";
@import "@patternfly/patternfly/base/patternfly-themes.css";
@import "@patternfly/patternfly/base/patternfly-fa-icons.css";
@import "@patternfly/patternfly/base/patternfly-pf-icons.css";
@import "@patternfly/patternfly/components/Spinner/spinner.css";
@import "#fonts/RedHat/faces.css";
@import "./base/fonts.css";
@import "./base/variables.css";
@import "./base/scrollbars.css";
@import "./base/globals.css";
@import "./base/common.css";
@import "./base/placeholder.css";
@import "#styles/locales/ja/globals.css";
@import "#styles/locales/ko/globals.css";
@import "#styles/locales/zh/globals.css";

View File

@@ -0,0 +1,14 @@
/**
* @file Japanese locale global style overrides.
*/
html[lang="ja"] {
--ak-font-family-sans-serif:
"M PLUS 2", "Noto Sans JP", "Hiragino Kaku Gothic Pro", "ヒラギノ角ゴ Pro W3", ,
Meiryo, " Pゴシック", var(--ak-generic-sans-serif);
--ak-font-family-serif: "Noto Serif JP", var(--ak-generic-serif);
--ak-font-family-heading: var(--ak-font-family-sans-serif);
--pf-c-content--h1--FontWeight: 500;
}

View File

@@ -0,0 +1,12 @@
/**
* @file Korean locale global style overrides.
*/
html[lang="ko"] {
--ak-font-family-sans-serif:
"Noto Sans KR", "Apple SD Gothic Neo", "Malgun Gothic", "맑은 고딕", sans-serif,
var(--ak-generic-sans-serif);
--ak-font-family-serif: "Noto Serif KR", var(--ak-generic-serif);
--ak-font-family-heading:
"Noto Sans KR", "Apple SD Gothic Neo", "Malgun Gothic", "맑은 고딕", sans-serif;
}

View File

@@ -0,0 +1,22 @@
/**
* @file Chinese locale global style overrides.
*/
html[lang^="zh"] {
--ak-font-family-sans-serif:
"Noto Sans SC", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "WenQuanYi Micro Hei",
sans-serif, var(--ak-generic-sans-serif);
--ak-font-family-serif: "Noto Serif SC", var(--ak-generic-serif);
--ak-font-family-heading:
"Noto Sans SC", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "WenQuanYi Micro Hei",
sans-serif;
--pf-c-content--h1--FontWeight: 500;
body {
font-size: 18px;
line-height: 1.7777777778;
letter-spacing: 0.048em;
}
}

View File

@@ -67,11 +67,6 @@
--ak-user-interface--slant-m-dark: var(--pf-global--BackgroundColor--100);
}
ak-locale-context {
display: flex;
flex-direction: column;
}
.pf-c-drawer__main {
min-height: calc(100vh - 76px);
max-height: calc(100vh - 76px);

View File

@@ -1,5 +1,4 @@
import "#components/ak-nav-buttons";
import "#elements/ak-locale-context/ak-locale-context";
import "#elements/banner/EnterpriseStatusBanner";
import "#elements/buttons/ActionButton/ak-action-button";
import "#elements/messages/MessageContainer";
@@ -124,8 +123,7 @@ class UserInterfacePresentation extends WithBrandConfig(WithSession(AKElement))
const backgroundStyles = this.uiConfig.theme.background;
return html`<ak-locale-context>
<ak-enterprise-status interface="user"></ak-enterprise-status>
return html`<ak-enterprise-status interface="user"></ak-enterprise-status>
<div class="pf-c-page">
<div class="background-wrapper" style=${ifPresent(backgroundStyles)}>
${!backgroundStyles
@@ -175,8 +173,7 @@ class UserInterfacePresentation extends WithBrandConfig(WithSession(AKElement))
</div>
</div>
</div>
</div>
</ak-locale-context>`;
</div>`;
}
}

View File

@@ -1,15 +1,14 @@
import "#user/user-settings/details/stages/prompt/PromptStage";
import { DEFAULT_CONFIG } from "#common/api/config";
import { EVENT_REFRESH } from "#common/constants";
import { APIError, parseAPIResponseError, pluckErrorDetail } from "#common/errors/network";
import { globalAK } from "#common/global";
import { MessageLevel } from "#common/messages";
import { refreshMe } from "#common/users";
import { AKElement } from "#elements/Base";
import { showMessage } from "#elements/messages/MessageContainer";
import { WithBrandConfig } from "#elements/mixins/branding";
import { WithSession } from "#elements/mixins/session";
import { SlottedTemplateResult } from "#elements/types";
import { StageHost } from "#flow/stages/base";
@@ -35,7 +34,7 @@ import PFPage from "@patternfly/patternfly/components/Page/page.css";
@customElement("ak-user-settings-flow-executor")
export class UserSettingsFlowExecutor
extends WithBrandConfig(AKElement, true)
extends WithBrandConfig(WithSession(AKElement), true)
implements StageHost
{
@property()
@@ -103,19 +102,23 @@ export class UserSettingsFlowExecutor
async nextChallenge(): Promise<void> {
this.loading = true;
try {
const challenge = await new FlowsApi(DEFAULT_CONFIG).flowsExecutorGet({
return new FlowsApi(DEFAULT_CONFIG)
.flowsExecutorGet({
flowSlug: this.flowSlug || "",
query: window.location.search.substring(1),
})
.then((challenge) => {
delete challenge.flowInfo;
this.challenge = challenge;
})
.catch(async (error: unknown) => {
const parsedError = await parseAPIResponseError(error);
this.errorMessage(parsedError);
})
.finally(() => {
this.loading = false;
});
delete challenge.flowInfo;
this.challenge = challenge;
} catch (e: unknown) {
// Catch JSON or Update errors
this.errorMessage(e as Error | Response);
} finally {
this.loading = false;
}
}
async errorMessage(error: APIError): Promise<void> {
@@ -128,23 +131,18 @@ export class UserSettingsFlowExecutor
this.challenge = challenge as ChallengeTypes;
}
globalRefresh(): void {
refreshMe().then(() => {
this.dispatchEvent(
new CustomEvent(EVENT_REFRESH, {
bubbles: true,
composed: true,
}),
);
try {
document.querySelectorAll("ak-interface-user").forEach((int) => {
(int as AKElement).requestUpdate();
});
} catch {
console.debug("authentik/user/flows: failed to find interface to refresh");
}
#performSessionChallenge = () => {
console.debug("authentik/user/flows: redirect to '/', restarting flow.");
return this.nextChallenge().then(() => {
showMessage({
level: MessageLevel.success,
message: msg("Successfully updated details"),
});
this.refreshSession();
});
}
};
renderChallenge(): SlottedTemplateResult {
if (!this.challenge) {
@@ -166,15 +164,9 @@ export class UserSettingsFlowExecutor
>${"Edit settings"}</a
>`;
}
// Flow has finished, so let's load while in the background we can restart the flow
this.loading = true;
console.debug("authentik/user/flows: redirect to '/', restarting flow.");
this.nextChallenge();
this.globalRefresh();
showMessage({
level: MessageLevel.success,
message: msg("Successfully updated details"),
});
this.#performSessionChallenge();
return html`<ak-empty-state default-label></ak-empty-state>`;
default:
console.debug(

View File

@@ -10,7 +10,6 @@ import "@patternfly/elements/pf-tooltip/pf-tooltip.js";
import { DEFAULT_CONFIG } from "#common/api/config";
import { intentToLabel } from "#common/labels";
import { formatElapsedTime } from "#common/temporal";
import { me } from "#common/users";
import { PaginatedResponse, Table, TableColumn } from "#elements/table/Table";
import { SlottedTemplateResult } from "#elements/types";
@@ -35,12 +34,18 @@ export class UserTokenList extends Table<Token> {
order = "expires";
async apiEndpoint(): Promise<PaginatedResponse<Token>> {
let { currentUser } = this;
if (!currentUser) {
currentUser = (await this.refreshSession()).user;
}
return new CoreApi(DEFAULT_CONFIG).coreTokensList({
...(await this.defaultEndpointConfig()),
managed: "",
// The user might have access to other tokens that aren't for their user
// but only show tokens for their user here
userUsername: (await me()).user.username,
userUsername: currentUser.username,
});
}

View File

@@ -3,13 +3,13 @@
* not yet been generated, or are missing.
*
* ```sh
* npm run build:locales
* npm run build-locales
* ```
*/
declare module "#locales/*" {
/**
* If you see this, try running `npm run build:locales` to generate locale files.
* If you see this, try running `npm run build-locales` to generate locale files.
*/
type MissingLocale = symbol & { readonly __brand?: never };

View File

@@ -1,6 +1,94 @@
<?xml version="1.0"?><xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" version="1.2">
<file target-language="cs_CZ" source-language="en" original="lit-localize-inputs" datatype="plaintext">
<file target-language="cs-CZ" source-language="en" original="lit-localize-inputs" datatype="plaintext">
<body>
<!-- #region Locales -->
<trans-unit id="en">
<source>English</source>
<target>Angličtina</target>
</trans-unit>
<trans-unit id="pseudo-LOCALE">
<source>Pseudolocale</source>
<target>Pseudolokalizace</target>
</trans-unit>
<trans-unit id="cs-CZ">
<source>Czech</source>
<target>Čeština</target>
</trans-unit>
<trans-unit id="de-DE">
<source>German</source>
<target>Němčina</target>
</trans-unit>
<trans-unit id="es-ES">
<source>Spanish</source>
<target>Španělština</target>
</trans-unit>
<trans-unit id="fi-FI">
<source>Finnish</source>
<target>Finština</target>
</trans-unit>
<trans-unit id="fr-FR">
<source>French</source>
<target>Francouzština</target>
</trans-unit>
<trans-unit id="it-IT">
<source>Italian</source>
<target>Italština</target>
</trans-unit>
<trans-unit id="ja-JP">
<source>Japanese</source>
<target>Japonština</target>
</trans-unit>
<trans-unit id="ko-KR">
<source>Korean</source>
<target>Korejština</target>
</trans-unit>
<trans-unit id="nl-NL">
<source>Dutch</source>
<target>Nizozemština</target>
</trans-unit>
<trans-unit id="pl-PL">
<source>Polish</source>
<target>Polština</target>
</trans-unit>
<trans-unit id="pt-BR">
<source>Portuguese</source>
<target>Portugalština</target>
</trans-unit>
<trans-unit id="ru-RU">
<source>Russian</source>
<target>Ruština</target>
</trans-unit>
<trans-unit id="tr-TR">
<source>Turkish</source>
<target>Turečtina</target>
</trans-unit>
<trans-unit id="zh-Hans">
<source>Chinese Simplified</source>
<target>Čínština</target>
</trans-unit>
<trans-unit id="zh-Hant">
<source>Chinese Traditional</source>
<target>Čínština</target>
</trans-unit>
<!-- #endregion -->
<!-- #region Locale selector -->
<trans-unit id="locale-auto-detect-option">
<source>Auto-detect</source>
<target>Automatická detekce</target>
<note from="lit-localize">Label for the auto-detect locale option in language selection dropdown</note>
</trans-unit>
<trans-unit id="language-selector-label">
<source>Select language</source>
<target>Vybrat jazyk</target>
<note from="lit-localize">Label for the language selection dropdown</note>
</trans-unit>
<trans-unit id="locale-option-localized-label">
<source><x id="0" equiv-text="${localeLabel}"/> (<x id="1" equiv-text="${translatedLabel}"/>)</source>
<note from="lit-localize">Locale option label showing the localized language name along with the native language name in parentheses. The first placeholder is the localized language name, the second is the native language name.</note>
</trans-unit>
<!-- #endregion -->
<trans-unit id="s12d6dde9b30c3093">
<source>Dismiss</source>
<target>Skrýt</target>
@@ -3073,18 +3161,6 @@
<source>Icon</source>
<target>Ikona</target>
</trans-unit>
<trans-unit id="s67e20cd8018d7e3c">
<source>Currently set to:</source>
<target>Aktuálně nastaveno na:</target>
</trans-unit>
<trans-unit id="s80e6d6fe5ad458d3">
<source>Clear icon</source>
<target>Vymazat ikonu</target>
</trans-unit>
<trans-unit id="s485c05d34eb00415">
<source>Delete currently set icon.</source>
<target>Smazat aktuálně nastavenou ikonu.</target>
</trans-unit>
<trans-unit id="s6d3b4d0561ba1cff">
<source>Publisher</source>
<target>Vydavatel</target>
@@ -4277,12 +4353,6 @@ neprojde, když jedna nebo obě z vybraných možností jsou rovny nebo nad prah
<source>Click to change value</source>
<target>Klikněte pro změnu hodnoty</target>
</trans-unit>
<trans-unit id="se17f29e830ebf9be">
<source>Successfully updated connector.</source>
</trans-unit>
<trans-unit id="s6da88527f3e5e513">
<source>Successfully created connector.</source>
</trans-unit>
<trans-unit id="s6a087e34edeadc1f">
<source>Connector name...</source>
</trans-unit>
@@ -4332,9 +4402,6 @@ neprojde, když jedna nebo obě z vybraných možností jsou rovny nebo nad prah
<trans-unit id="s80b0feb2a6b98ef9">
<source>Connectors</source>
</trans-unit>
<trans-unit id="s7e840add1b48d751">
<source>Configure how devices communicate with authentik and external sources device data is fetched from.</source>
</trans-unit>
<trans-unit id="s58d0ed0cc064ec4f">
<source>Update Connector</source>
</trans-unit>
@@ -6258,69 +6325,10 @@ neprojde, když jedna nebo obě z vybraných možností jsou rovny nebo nad prah
<source>Warning: No invitation stage is bound to any flow. Invitations will not work as expected.</source>
<target>Upozornění: K žádnému toku není přiřazen krok typu "Pozvánka". Pozvánky nebudou fungovat, jak mají.</target>
</trans-unit>
<trans-unit id="s2da4aa7a9abeb653">
<source>Pseudolocale (for testing)</source>
<target>Pseudojazyk (pro testování)</target>
</trans-unit>
<trans-unit id="s63e71d20d1eaca93">
<source>German</source>
<target>Němčina</target>
</trans-unit>
<trans-unit id="s4caed5b7a7e5d89b">
<source>English</source>
<target>Angličtina</target>
</trans-unit>
<trans-unit id="sf1868dc19e3917bb">
<source>Spanish</source>
<target>Španělština</target>
</trans-unit>
<trans-unit id="s75a27f43413e02c5">
<source>French</source>
<target>Francouzština</target>
</trans-unit>
<trans-unit id="sd48cc52117f4d68b">
<source>Italian</source>
<target>Italština</target>
</trans-unit>
<trans-unit id="sdd35b688281b6dea">
<source>Japanese</source>
</trans-unit>
<trans-unit id="s94d61907ee22a8c1">
<source>Korean</source>
<target>Korejština</target>
</trans-unit>
<trans-unit id="s95d56e58f816d211">
<source>Dutch</source>
<target>Holandština</target>
</trans-unit>
<trans-unit id="s03f49e598ffb11cc">
<source>Polish</source>
<target>Polština</target>
</trans-unit>
<trans-unit id="sa30c12014e955946">
<source>Russian</source>
<target>Ruština</target>
</trans-unit>
<trans-unit id="s9d2d00982edafabb">
<source>Turkish</source>
<target>Turečtina</target>
</trans-unit>
<trans-unit id="s354e0a9f146d2869">
<source>Chinese (simplified)</source>
<target>Čínština (zjednodušená)</target>
</trans-unit>
<trans-unit id="se3e6af2ce24d80e8">
<source>Chinese (traditional)</source>
<target>Čínština (tradiční)</target>
</trans-unit>
<trans-unit id="s8939f574b096054a">
<source>Not you?</source>
<target>Nejste to vy?</target>
</trans-unit>
<trans-unit id="s2f995efbb1e46b18">
<source>Auto-detect (based on your browser)</source>
<target>Automatická detekce (dle prohlížeče)</target>
</trans-unit>
<trans-unit id="s296fbffaaa7c910a">
<source>Required.</source>
<target>Vyžadováno.</target>
@@ -7762,14 +7770,6 @@ neprojde, když jedna nebo obě z vybraných možností jsou rovny nebo nad prah
<source>Background shown during execution.</source>
<target>Pozadí, které se zobrazí při spuštění toku.</target>
</trans-unit>
<trans-unit id="s3ebf4c166058afce">
<source>Clear background</source>
<target>Vymazat pozadí</target>
</trans-unit>
<trans-unit id="sb24755ea94bef31d">
<source>Delete currently set background image.</source>
<target>Smazat aktuálně nastavený obrázek na pozadí.</target>
</trans-unit>
<trans-unit id="sb904f23f17b60c3a">
<source>Successfully imported flow.</source>
<target>Tok byl úspěšně importován.</target>
@@ -8870,9 +8870,6 @@ Vazby na skupiny/uživatele jsou kontrolovány vůči uživateli události.</tar
<trans-unit id="s0393ac07cf8a3097">
<source>Endpoint Devices</source>
</trans-unit>
<trans-unit id="s02d57c823e493fe9">
<source>Device groups</source>
</trans-unit>
<trans-unit id="s4f1ad6b48a5df506">
<source>Logs</source>
<target>Protokoly</target>
@@ -9654,6 +9651,111 @@ Vazby na skupiny/uživatele jsou kontrolovány vůči uživateli události.</tar
<source>...</source>
<note from="lit-localize">Truncation ellipsis</note>
</trans-unit>
<trans-unit id="s6cd96061d397f7b5">
<source>Via <x id="0" equiv-text="${event.context.device.name}"/></source>
</trans-unit>
<trans-unit id="sb7ff80582ccd9348">
<source>reference will be left dangling</source>
</trans-unit>
<trans-unit id="s0b7ddc0168e79ea2">
<source>Failed to fetch files</source>
</trans-unit>
<trans-unit id="sdc4f1cfd587212b4">
<source>You can also enter a URL (https://...), Font Awesome icon (fa://fa-icon-name), or upload a new file.</source>
</trans-unit>
<trans-unit id="s8015ac3b47172dc8">
<source>Select from uploaded files, or type a Font Awesome icon (fa://fa-icon-name) or URL.</source>
</trans-unit>
<trans-unit id="s87616130c08b117c">
<source>This type is deprecated.</source>
</trans-unit>
<trans-unit id="s40f4c2223ce87751">
<source>No connectors configured. Navigate to Connectors in the sidebar and first create a connector.</source>
</trans-unit>
<trans-unit id="s70c2cd89201ecca9">
<source>Home directory</source>
</trans-unit>
<trans-unit id="sb171d638b8af660d">
<source>Successfully updated agent connector.</source>
</trans-unit>
<trans-unit id="s81c9554908463f94">
<source>Successfully created agent connector.</source>
</trans-unit>
<trans-unit id="s306dd51d3be07bc7">
<source>Device compliance settings</source>
</trans-unit>
<trans-unit id="sc2966702517b7af5">
<source>Challenge certificate</source>
</trans-unit>
<trans-unit id="s051588c63fedab5f">
<source>Challenge idle timeout</source>
</trans-unit>
<trans-unit id="s4c70d7629e29ac2d">
<source>Duration the flow executor will wait before continuing without a response.</source>
</trans-unit>
<trans-unit id="se3c7fb54006d9e98">
<source>Trigger check-in on device</source>
</trans-unit>
<trans-unit id="se0a747f4db08e87f">
<source>Configure how devices connect with authentik and ingest external device data.</source>
</trans-unit>
<trans-unit id="s114f2b310ef163ff">
<source>Stage which associates the currently used device with the current session.</source>
</trans-unit>
<trans-unit id="s8290d08ab5a49ed0">
<source>Connector</source>
</trans-unit>
<trans-unit id="s5e8eefcbbeffd4d5">
<source>Device optional</source>
</trans-unit>
<trans-unit id="s51b09bba5dcc19b0">
<source>If no device was provided, this stage will succeed and continue to the next stage.</source>
</trans-unit>
<trans-unit id="s5f58e358343a5514">
<source>Device required</source>
</trans-unit>
<trans-unit id="s6df8326edea3b23d">
<source>If no device was provided, this stage will stop flow execution.</source>
</trans-unit>
<trans-unit id="s506c7d2e87f6770e">
<source>Filename can only contain letters, numbers, dots, hyphens, and underscores</source>
</trans-unit>
<trans-unit id="s3a3d5b2575cd32ea">
<source>File uploaded successfully</source>
</trans-unit>
<trans-unit id="sd3775ef947e0de32">
<source>File Name</source>
</trans-unit>
<trans-unit id="s1afc99a84a890514">
<source>Type an optional custom file name...</source>
</trans-unit>
<trans-unit id="sb40e2763045466ea">
<source>Optionally rename the file (without extension). Leave empty to keep the original filename.</source>
</trans-unit>
<trans-unit id="s803ce7e1a2294d50">
<source>Files</source>
</trans-unit>
<trans-unit id="s42d82601762f5321">
<source>Manage uploaded files.</source>
</trans-unit>
<trans-unit id="saad01178f02a6a23">
<source>file</source>
</trans-unit>
<trans-unit id="s69f800801812a5f0">
<source>files</source>
</trans-unit>
<trans-unit id="s96668830629e0dfc">
<source>Upload</source>
</trans-unit>
<trans-unit id="sa32e9d0a108ee802">
<source>Upload File</source>
</trans-unit>
<trans-unit id="s95094b57684716a5">
<source>Failed to validate device.</source>
</trans-unit>
<trans-unit id="se99d25eb70c767ef">
<source>Verifying your device...</source>
</trans-unit>
</body>
</file>
</xliff>

View File

@@ -1,6 +1,95 @@
<?xml version="1.0"?><xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" version="1.2">
<file target-language="de_DE" source-language="en" original="lit-localize-inputs" datatype="plaintext">
<file target-language="de-DE" source-language="en" original="lit-localize-inputs" datatype="plaintext">
<body>
<!-- #region Locales -->
<trans-unit id="en">
<source>English</source>
<target>Englisch</target>
</trans-unit>
<trans-unit id="pseudo-LOCALE">
<source>Pseudolocale</source>
<target>Pseudosprache</target>
</trans-unit>
<trans-unit id="cs-CZ">
<source>Czech</source>
<target>Tschechisch</target>
</trans-unit>
<trans-unit id="de-DE">
<source>German</source>
<target>Deutsch</target>
</trans-unit>
<trans-unit id="es-ES">
<source>Spanish</source>
<target>Spanisch</target>
</trans-unit>
<trans-unit id="fi-FI">
<source>Finnish</source>
<target>Finnisch</target>
</trans-unit>
<trans-unit id="fr-FR">
<source>French</source>
<target>Französisch</target>
</trans-unit>
<trans-unit id="it-IT">
<source>Italian</source>
<target>Italienisch</target>
</trans-unit>
<trans-unit id="ja-JP">
<source>Japanese</source>
<target>Japanisch</target>
</trans-unit>
<trans-unit id="ko-KR">
<source>Korean</source>
<target>Koreanisch</target>
</trans-unit>
<trans-unit id="nl-NL">
<source>Dutch</source>
<target>Niederländisch</target>
</trans-unit>
<trans-unit id="pl-PL">
<source>Polish</source>
<target>Polnisch</target>
</trans-unit>
<trans-unit id="pt-BR">
<source>Portuguese</source>
<target>Portugiesisch</target>
</trans-unit>
<trans-unit id="ru-RU">
<source>Russian</source>
<target>Russisch</target>
</trans-unit>
<trans-unit id="tr-TR">
<source>Turkish</source>
<target>Türkisch</target>
</trans-unit>
<trans-unit id="zh-Hans">
<source>Chinese Simplified</source>
<target>Chinesisch</target>
</trans-unit>
<trans-unit id="zh-Hant">
<source>Chinese Traditional</source>
<target>Chinesisch</target>
</trans-unit>
<!-- #endregion -->
<!-- #region Locale selector -->
<trans-unit id="locale-auto-detect-option">
<source>Auto-detect</source>
<target>Automatische Erkennung</target>
<note from="lit-localize">Label for the auto-detect locale option in language selection dropdown</note>
</trans-unit>
<trans-unit id="language-selector-label">
<source>Select language</source>
<target>Sprache auswählen</target>
<note from="lit-localize">Label for the language selection dropdown</note>
</trans-unit>
<trans-unit id="locale-option-localized-label">
<source><x id="0" equiv-text="${localeLabel}"/> (<x id="1" equiv-text="${translatedLabel}"/>)</source>
<note from="lit-localize">Locale option label showing the localized language name along with the native language name in parentheses. The first placeholder is the localized language name, the second is the native language name.</note>
</trans-unit>
<!-- #endregion -->
<trans-unit id="s12d6dde9b30c3093">
<source>Dismiss</source>
<target>Verwerfen</target>
@@ -3103,18 +3192,6 @@
<source>Icon</source>
<target>Symbol</target>
</trans-unit>
<trans-unit id="s67e20cd8018d7e3c">
<source>Currently set to:</source>
<target>Aktuell eingestellt auf:</target>
</trans-unit>
<trans-unit id="s80e6d6fe5ad458d3">
<source>Clear icon</source>
<target>Symbol zurücksetzen</target>
</trans-unit>
<trans-unit id="s485c05d34eb00415">
<source>Delete currently set icon.</source>
<target>Lösche das aktuell festgelegte Symbol.</target>
</trans-unit>
<trans-unit id="s6d3b4d0561ba1cff">
<source>Publisher</source>
<target>Herausgeber</target>
@@ -4308,12 +4385,6 @@ doesn't pass when either or both of the selected options are equal or above the
<source>Click to change value</source>
<target>Klicken Sie, um den Wert zu ändern</target>
</trans-unit>
<trans-unit id="se17f29e830ebf9be">
<source>Successfully updated connector.</source>
</trans-unit>
<trans-unit id="s6da88527f3e5e513">
<source>Successfully created connector.</source>
</trans-unit>
<trans-unit id="s6a087e34edeadc1f">
<source>Connector name...</source>
</trans-unit>
@@ -4363,9 +4434,6 @@ doesn't pass when either or both of the selected options are equal or above the
<trans-unit id="s80b0feb2a6b98ef9">
<source>Connectors</source>
</trans-unit>
<trans-unit id="s7e840add1b48d751">
<source>Configure how devices communicate with authentik and external sources device data is fetched from.</source>
</trans-unit>
<trans-unit id="s58d0ed0cc064ec4f">
<source>Update Connector</source>
</trans-unit>
@@ -6291,69 +6359,10 @@ Hier können nur Policies verwendet werden, da der Zugriff geprüft wird, bevor
<source>Warning: No invitation stage is bound to any flow. Invitations will not work as expected.</source>
<target>Warnung: Es ist keine Einladungs-Stage an einen Flow gebunden. Einladungen funktionieren daher nicht wie erwartet.</target>
</trans-unit>
<trans-unit id="s2da4aa7a9abeb653">
<source>Pseudolocale (for testing)</source>
<target>Pseudolocale (zum Testen)</target>
</trans-unit>
<trans-unit id="s63e71d20d1eaca93">
<source>German</source>
<target>Deutsch</target>
</trans-unit>
<trans-unit id="s4caed5b7a7e5d89b">
<source>English</source>
<target>Englisch</target>
</trans-unit>
<trans-unit id="sf1868dc19e3917bb">
<source>Spanish</source>
<target>Spanisch</target>
</trans-unit>
<trans-unit id="s75a27f43413e02c5">
<source>French</source>
<target>Französisch</target>
</trans-unit>
<trans-unit id="sd48cc52117f4d68b">
<source>Italian</source>
<target>Italienisch</target>
</trans-unit>
<trans-unit id="sdd35b688281b6dea">
<source>Japanese</source>
</trans-unit>
<trans-unit id="s94d61907ee22a8c1">
<source>Korean</source>
<target>Koreanisch</target>
</trans-unit>
<trans-unit id="s95d56e58f816d211">
<source>Dutch</source>
<target>Niederländisch</target>
</trans-unit>
<trans-unit id="s03f49e598ffb11cc">
<source>Polish</source>
<target>Polnisch</target>
</trans-unit>
<trans-unit id="sa30c12014e955946">
<source>Russian</source>
<target>Russisch</target>
</trans-unit>
<trans-unit id="s9d2d00982edafabb">
<source>Turkish</source>
<target>Türkisch</target>
</trans-unit>
<trans-unit id="s354e0a9f146d2869">
<source>Chinese (simplified)</source>
<target>Chinesisch (vereinfacht)</target>
</trans-unit>
<trans-unit id="se3e6af2ce24d80e8">
<source>Chinese (traditional)</source>
<target>Chinesisch (traditionell)</target>
</trans-unit>
<trans-unit id="s8939f574b096054a">
<source>Not you?</source>
<target>Nicht Sie?</target>
</trans-unit>
<trans-unit id="s2f995efbb1e46b18">
<source>Auto-detect (based on your browser)</source>
<target>Automatische Erkennung (basierend auf Ihrem Browser)</target>
</trans-unit>
<trans-unit id="s296fbffaaa7c910a">
<source>Required.</source>
<target>Erforderlich</target>
@@ -7794,14 +7803,6 @@ Beim Erstellen eines festen Auswahlfelds aktiviere „Als Ausdruck interpretiere
<source>Background shown during execution.</source>
<target>Hintergrund während der Ausführung.</target>
</trans-unit>
<trans-unit id="s3ebf4c166058afce">
<source>Clear background</source>
<target>Hintergrund löschen</target>
</trans-unit>
<trans-unit id="sb24755ea94bef31d">
<source>Delete currently set background image.</source>
<target>Aktuelles Hintergrundbild löschen</target>
</trans-unit>
<trans-unit id="sb904f23f17b60c3a">
<source>Successfully imported flow.</source>
<target>Flow erfolgreich importiert.</target>
@@ -8909,9 +8910,6 @@ Bindings zu Gruppen/Benutzern werden mit dem Benutzer des Ereignisses abgegliche
<trans-unit id="s0393ac07cf8a3097">
<source>Endpoint Devices</source>
</trans-unit>
<trans-unit id="s02d57c823e493fe9">
<source>Device groups</source>
</trans-unit>
<trans-unit id="s4f1ad6b48a5df506">
<source>Logs</source>
<target>Logs</target>
@@ -9694,6 +9692,111 @@ Bindings zu Gruppen/Benutzern werden mit dem Benutzer des Ereignisses abgegliche
<source>...</source>
<note from="lit-localize">Truncation ellipsis</note>
</trans-unit>
<trans-unit id="s6cd96061d397f7b5">
<source>Via <x id="0" equiv-text="${event.context.device.name}"/></source>
</trans-unit>
<trans-unit id="sb7ff80582ccd9348">
<source>reference will be left dangling</source>
</trans-unit>
<trans-unit id="s0b7ddc0168e79ea2">
<source>Failed to fetch files</source>
</trans-unit>
<trans-unit id="sdc4f1cfd587212b4">
<source>You can also enter a URL (https://...), Font Awesome icon (fa://fa-icon-name), or upload a new file.</source>
</trans-unit>
<trans-unit id="s8015ac3b47172dc8">
<source>Select from uploaded files, or type a Font Awesome icon (fa://fa-icon-name) or URL.</source>
</trans-unit>
<trans-unit id="s87616130c08b117c">
<source>This type is deprecated.</source>
</trans-unit>
<trans-unit id="s40f4c2223ce87751">
<source>No connectors configured. Navigate to Connectors in the sidebar and first create a connector.</source>
</trans-unit>
<trans-unit id="s70c2cd89201ecca9">
<source>Home directory</source>
</trans-unit>
<trans-unit id="sb171d638b8af660d">
<source>Successfully updated agent connector.</source>
</trans-unit>
<trans-unit id="s81c9554908463f94">
<source>Successfully created agent connector.</source>
</trans-unit>
<trans-unit id="s306dd51d3be07bc7">
<source>Device compliance settings</source>
</trans-unit>
<trans-unit id="sc2966702517b7af5">
<source>Challenge certificate</source>
</trans-unit>
<trans-unit id="s051588c63fedab5f">
<source>Challenge idle timeout</source>
</trans-unit>
<trans-unit id="s4c70d7629e29ac2d">
<source>Duration the flow executor will wait before continuing without a response.</source>
</trans-unit>
<trans-unit id="se3c7fb54006d9e98">
<source>Trigger check-in on device</source>
</trans-unit>
<trans-unit id="se0a747f4db08e87f">
<source>Configure how devices connect with authentik and ingest external device data.</source>
</trans-unit>
<trans-unit id="s114f2b310ef163ff">
<source>Stage which associates the currently used device with the current session.</source>
</trans-unit>
<trans-unit id="s8290d08ab5a49ed0">
<source>Connector</source>
</trans-unit>
<trans-unit id="s5e8eefcbbeffd4d5">
<source>Device optional</source>
</trans-unit>
<trans-unit id="s51b09bba5dcc19b0">
<source>If no device was provided, this stage will succeed and continue to the next stage.</source>
</trans-unit>
<trans-unit id="s5f58e358343a5514">
<source>Device required</source>
</trans-unit>
<trans-unit id="s6df8326edea3b23d">
<source>If no device was provided, this stage will stop flow execution.</source>
</trans-unit>
<trans-unit id="s506c7d2e87f6770e">
<source>Filename can only contain letters, numbers, dots, hyphens, and underscores</source>
</trans-unit>
<trans-unit id="s3a3d5b2575cd32ea">
<source>File uploaded successfully</source>
</trans-unit>
<trans-unit id="sd3775ef947e0de32">
<source>File Name</source>
</trans-unit>
<trans-unit id="s1afc99a84a890514">
<source>Type an optional custom file name...</source>
</trans-unit>
<trans-unit id="sb40e2763045466ea">
<source>Optionally rename the file (without extension). Leave empty to keep the original filename.</source>
</trans-unit>
<trans-unit id="s803ce7e1a2294d50">
<source>Files</source>
</trans-unit>
<trans-unit id="s42d82601762f5321">
<source>Manage uploaded files.</source>
</trans-unit>
<trans-unit id="saad01178f02a6a23">
<source>file</source>
</trans-unit>
<trans-unit id="s69f800801812a5f0">
<source>files</source>
</trans-unit>
<trans-unit id="s96668830629e0dfc">
<source>Upload</source>
</trans-unit>
<trans-unit id="sa32e9d0a108ee802">
<source>Upload File</source>
</trans-unit>
<trans-unit id="s95094b57684716a5">
<source>Failed to validate device.</source>
</trans-unit>
<trans-unit id="se99d25eb70c767ef">
<source>Verifying your device...</source>
</trans-unit>
</body>
</file>
</xliff>

View File

@@ -2,6 +2,75 @@
<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">
<file target-language="en" source-language="en" original="lit-localize-inputs" datatype="plaintext">
<body>
<!-- #region Locales -->
<trans-unit id="en">
<source>English</source>
</trans-unit>
<trans-unit id="pseudo-LOCALE">
<source>Pseudolocale</source>
</trans-unit>
<trans-unit id="cs-CZ">
<source>Czech</source>
</trans-unit>
<trans-unit id="de-DE">
<source>German</source>
</trans-unit>
<trans-unit id="es-ES">
<source>Spanish</source>
</trans-unit>
<trans-unit id="fi-FI">
<source>Finnish</source>
</trans-unit>
<trans-unit id="fr-FR">
<source>French</source>
</trans-unit>
<trans-unit id="it-IT">
<source>Italian</source>
</trans-unit>
<trans-unit id="ja-JP">
<source>Japanese</source>
</trans-unit>
<trans-unit id="ko-KR">
<source>Korean</source>
</trans-unit>
<trans-unit id="nl-NL">
<source>Dutch</source>
</trans-unit>
<trans-unit id="pl-PL">
<source>Polish</source>
</trans-unit>
<trans-unit id="pt-BR">
<source>Portuguese</source>
</trans-unit>
<trans-unit id="ru-RU">
<source>Russian</source>
</trans-unit>
<trans-unit id="tr-TR">
<source>Turkish</source>
</trans-unit>
<trans-unit id="zh-Hans">
<source>Chinese Simplified</source>
</trans-unit>
<trans-unit id="zh-Hant">
<source>Chinese Traditional</source>
</trans-unit>
<!-- #endregion -->
<!-- #region Locale selector -->
<trans-unit id="locale-auto-detect-option">
<source>Auto-detect</source>
<note from="lit-localize">Label for the auto-detect locale option in language selection dropdown</note>
</trans-unit>
<trans-unit id="language-selector-label">
<source>Select language</source>
<note from="lit-localize">Label for the language selection dropdown</note>
</trans-unit>
<trans-unit id="locale-option-localized-label">
<source><x id="0" equiv-text="${localeLabel}"/> (<x id="1" equiv-text="${translatedLabel}"/>)</source>
<note from="lit-localize">Locale option label showing the localized language name along with the native language name in parentheses. The first placeholder is the localized language name, the second is the native language name.</note>
</trans-unit>
<!-- #endregion -->
<trans-unit id="s12d6dde9b30c3093">
<source>Dismiss</source>
</trans-unit>
@@ -2357,15 +2426,6 @@
<trans-unit id="s068d4dd16d9106d0">
<source>Icon</source>
</trans-unit>
<trans-unit id="s67e20cd8018d7e3c">
<source>Currently set to:</source>
</trans-unit>
<trans-unit id="s80e6d6fe5ad458d3">
<source>Clear icon</source>
</trans-unit>
<trans-unit id="s485c05d34eb00415">
<source>Delete currently set icon.</source>
</trans-unit>
<trans-unit id="s6d3b4d0561ba1cff">
<source>Publisher</source>
</trans-unit>
@@ -3316,12 +3376,6 @@ doesn't pass when either or both of the selected options are equal or above the
<trans-unit id="s09810653c832e935">
<source>Click to change value</source>
</trans-unit>
<trans-unit id="se17f29e830ebf9be">
<source>Successfully updated connector.</source>
</trans-unit>
<trans-unit id="s6da88527f3e5e513">
<source>Successfully created connector.</source>
</trans-unit>
<trans-unit id="s6a087e34edeadc1f">
<source>Connector name...</source>
</trans-unit>
@@ -3370,9 +3424,6 @@ doesn't pass when either or both of the selected options are equal or above the
<trans-unit id="s80b0feb2a6b98ef9">
<source>Connectors</source>
</trans-unit>
<trans-unit id="s7e840add1b48d751">
<source>Configure how devices communicate with authentik and external sources device data is fetched from.</source>
</trans-unit>
<trans-unit id="s58d0ed0cc064ec4f">
<source>Update Connector</source>
</trans-unit>
@@ -4859,54 +4910,9 @@ doesn't pass when either or both of the selected options are equal or above the
<trans-unit id="s802826db4e2c852e">
<source>Warning: No invitation stage is bound to any flow. Invitations will not work as expected.</source>
</trans-unit>
<trans-unit id="s2da4aa7a9abeb653">
<source>Pseudolocale (for testing)</source>
</trans-unit>
<trans-unit id="s63e71d20d1eaca93">
<source>German</source>
</trans-unit>
<trans-unit id="s4caed5b7a7e5d89b">
<source>English</source>
</trans-unit>
<trans-unit id="sf1868dc19e3917bb">
<source>Spanish</source>
</trans-unit>
<trans-unit id="s75a27f43413e02c5">
<source>French</source>
</trans-unit>
<trans-unit id="sd48cc52117f4d68b">
<source>Italian</source>
</trans-unit>
<trans-unit id="sdd35b688281b6dea">
<source>Japanese</source>
</trans-unit>
<trans-unit id="s94d61907ee22a8c1">
<source>Korean</source>
</trans-unit>
<trans-unit id="s95d56e58f816d211">
<source>Dutch</source>
</trans-unit>
<trans-unit id="s03f49e598ffb11cc">
<source>Polish</source>
</trans-unit>
<trans-unit id="sa30c12014e955946">
<source>Russian</source>
</trans-unit>
<trans-unit id="s9d2d00982edafabb">
<source>Turkish</source>
</trans-unit>
<trans-unit id="s354e0a9f146d2869">
<source>Chinese (simplified)</source>
</trans-unit>
<trans-unit id="se3e6af2ce24d80e8">
<source>Chinese (traditional)</source>
</trans-unit>
<trans-unit id="s8939f574b096054a">
<source>Not you?</source>
</trans-unit>
<trans-unit id="s2f995efbb1e46b18">
<source>Auto-detect (based on your browser)</source>
</trans-unit>
<trans-unit id="s296fbffaaa7c910a">
<source>Required.</source>
</trans-unit>
@@ -5985,12 +5991,6 @@ doesn't pass when either or both of the selected options are equal or above the
<trans-unit id="s374abf1a54d87b67">
<source>Background shown during execution.</source>
</trans-unit>
<trans-unit id="s3ebf4c166058afce">
<source>Clear background</source>
</trans-unit>
<trans-unit id="sb24755ea94bef31d">
<source>Delete currently set background image.</source>
</trans-unit>
<trans-unit id="sb904f23f17b60c3a">
<source>Successfully imported flow.</source>
</trans-unit>
@@ -6821,9 +6821,6 @@ Bindings to groups/users are checked against the user of the event.</source>
<trans-unit id="s0393ac07cf8a3097">
<source>Endpoint Devices</source>
</trans-unit>
<trans-unit id="s02d57c823e493fe9">
<source>Device groups</source>
</trans-unit>
<trans-unit id="s4f1ad6b48a5df506">
<source>Logs</source>
</trans-unit>
@@ -7449,6 +7446,111 @@ Bindings to groups/users are checked against the user of the event.</source>
<source>...</source>
<note from="lit-localize">Truncation ellipsis</note>
</trans-unit>
<trans-unit id="s6cd96061d397f7b5">
<source>Via <x id="0" equiv-text="${event.context.device.name}"/></source>
</trans-unit>
<trans-unit id="sb7ff80582ccd9348">
<source>reference will be left dangling</source>
</trans-unit>
<trans-unit id="s0b7ddc0168e79ea2">
<source>Failed to fetch files</source>
</trans-unit>
<trans-unit id="sdc4f1cfd587212b4">
<source>You can also enter a URL (https://...), Font Awesome icon (fa://fa-icon-name), or upload a new file.</source>
</trans-unit>
<trans-unit id="s8015ac3b47172dc8">
<source>Select from uploaded files, or type a Font Awesome icon (fa://fa-icon-name) or URL.</source>
</trans-unit>
<trans-unit id="s87616130c08b117c">
<source>This type is deprecated.</source>
</trans-unit>
<trans-unit id="s40f4c2223ce87751">
<source>No connectors configured. Navigate to Connectors in the sidebar and first create a connector.</source>
</trans-unit>
<trans-unit id="s70c2cd89201ecca9">
<source>Home directory</source>
</trans-unit>
<trans-unit id="sb171d638b8af660d">
<source>Successfully updated agent connector.</source>
</trans-unit>
<trans-unit id="s81c9554908463f94">
<source>Successfully created agent connector.</source>
</trans-unit>
<trans-unit id="s306dd51d3be07bc7">
<source>Device compliance settings</source>
</trans-unit>
<trans-unit id="sc2966702517b7af5">
<source>Challenge certificate</source>
</trans-unit>
<trans-unit id="s051588c63fedab5f">
<source>Challenge idle timeout</source>
</trans-unit>
<trans-unit id="s4c70d7629e29ac2d">
<source>Duration the flow executor will wait before continuing without a response.</source>
</trans-unit>
<trans-unit id="se3c7fb54006d9e98">
<source>Trigger check-in on device</source>
</trans-unit>
<trans-unit id="se0a747f4db08e87f">
<source>Configure how devices connect with authentik and ingest external device data.</source>
</trans-unit>
<trans-unit id="s114f2b310ef163ff">
<source>Stage which associates the currently used device with the current session.</source>
</trans-unit>
<trans-unit id="s8290d08ab5a49ed0">
<source>Connector</source>
</trans-unit>
<trans-unit id="s5e8eefcbbeffd4d5">
<source>Device optional</source>
</trans-unit>
<trans-unit id="s51b09bba5dcc19b0">
<source>If no device was provided, this stage will succeed and continue to the next stage.</source>
</trans-unit>
<trans-unit id="s5f58e358343a5514">
<source>Device required</source>
</trans-unit>
<trans-unit id="s6df8326edea3b23d">
<source>If no device was provided, this stage will stop flow execution.</source>
</trans-unit>
<trans-unit id="s506c7d2e87f6770e">
<source>Filename can only contain letters, numbers, dots, hyphens, and underscores</source>
</trans-unit>
<trans-unit id="s3a3d5b2575cd32ea">
<source>File uploaded successfully</source>
</trans-unit>
<trans-unit id="sd3775ef947e0de32">
<source>File Name</source>
</trans-unit>
<trans-unit id="s1afc99a84a890514">
<source>Type an optional custom file name...</source>
</trans-unit>
<trans-unit id="sb40e2763045466ea">
<source>Optionally rename the file (without extension). Leave empty to keep the original filename.</source>
</trans-unit>
<trans-unit id="s803ce7e1a2294d50">
<source>Files</source>
</trans-unit>
<trans-unit id="s42d82601762f5321">
<source>Manage uploaded files.</source>
</trans-unit>
<trans-unit id="saad01178f02a6a23">
<source>file</source>
</trans-unit>
<trans-unit id="s69f800801812a5f0">
<source>files</source>
</trans-unit>
<trans-unit id="s96668830629e0dfc">
<source>Upload</source>
</trans-unit>
<trans-unit id="sa32e9d0a108ee802">
<source>Upload File</source>
</trans-unit>
<trans-unit id="s95094b57684716a5">
<source>Failed to validate device.</source>
</trans-unit>
<trans-unit id="se99d25eb70c767ef">
<source>Verifying your device...</source>
</trans-unit>
</body>
</file>
</xliff>

View File

@@ -1,6 +1,95 @@
<?xml version="1.0"?><xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" version="1.2">
<file target-language="es_ES" source-language="en" original="lit-localize-inputs" datatype="plaintext">
<file target-language="es-ES" source-language="en" original="lit-localize-inputs" datatype="plaintext">
<body>
<!-- #region Locales -->
<trans-unit id="en">
<source>English</source>
<target>Inglés</target>
</trans-unit>
<trans-unit id="pseudo-LOCALE">
<source>Pseudolocale</source>
<target>Pseudoidioma</target>
</trans-unit>
<trans-unit id="cs-CZ">
<source>Czech</source>
<target>Checo</target>
</trans-unit>
<trans-unit id="de-DE">
<source>German</source>
<target>Alemán</target>
</trans-unit>
<trans-unit id="es-ES">
<source>Spanish</source>
<target>Español</target>
</trans-unit>
<trans-unit id="fi-FI">
<source>Finnish</source>
<target>Finés</target>
</trans-unit>
<trans-unit id="fr-FR">
<source>French</source>
<target>Francés</target>
</trans-unit>
<trans-unit id="it-IT">
<source>Italian</source>
<target>Italiano</target>
</trans-unit>
<trans-unit id="ja-JP">
<source>Japanese</source>
<target>Japonés</target>
</trans-unit>
<trans-unit id="ko-KR">
<source>Korean</source>
<target>Coreano</target>
</trans-unit>
<trans-unit id="nl-NL">
<source>Dutch</source>
<target>Neerlandés</target>
</trans-unit>
<trans-unit id="pl-PL">
<source>Polish</source>
<target>Polaco</target>
</trans-unit>
<trans-unit id="pt-BR">
<source>Portuguese</source>
<target>Portugués</target>
</trans-unit>
<trans-unit id="ru-RU">
<source>Russian</source>
<target>Ruso</target>
</trans-unit>
<trans-unit id="tr-TR">
<source>Turkish</source>
<target>Turco</target>
</trans-unit>
<trans-unit id="zh-Hans">
<source>Chinese Simplified</source>
<target>Chino</target>
</trans-unit>
<trans-unit id="zh-Hant">
<source>Chinese Traditional</source>
<target>Chino</target>
</trans-unit>
<!-- #endregion -->
<!-- #region Locale selector -->
<trans-unit id="locale-auto-detect-option">
<source>Auto-detect</source>
<target>Detección automática</target>
<note from="lit-localize">Label for the auto-detect locale option in language selection dropdown</note>
</trans-unit>
<trans-unit id="language-selector-label">
<source>Select language</source>
<target>Seleccionar idioma</target>
<note from="lit-localize">Label for the language selection dropdown</note>
</trans-unit>
<trans-unit id="locale-option-localized-label">
<source><x id="0" equiv-text="${localeLabel}"/> (<x id="1" equiv-text="${translatedLabel}"/>)</source>
<note from="lit-localize">Locale option label showing the localized language name along with the native language name in parentheses. The first placeholder is the localized language name, the second is the native language name.</note>
</trans-unit>
<!-- #endregion -->
<trans-unit id="s12d6dde9b30c3093">
<source>Dismiss</source>
<target>Desestimar</target>
@@ -3043,18 +3132,6 @@ Si se deja vacío, AuthnContextClassRef se establecerá según los métodos de a
<source>Icon</source>
<target>Icono</target>
</trans-unit>
<trans-unit id="s67e20cd8018d7e3c">
<source>Currently set to:</source>
<target>Configurado actualmente en:</target>
</trans-unit>
<trans-unit id="s80e6d6fe5ad458d3">
<source>Clear icon</source>
<target>Borrar icono</target>
</trans-unit>
<trans-unit id="s485c05d34eb00415">
<source>Delete currently set icon.</source>
<target>Eliminar el icono configurado actualmente.</target>
</trans-unit>
<trans-unit id="s6d3b4d0561ba1cff">
<source>Publisher</source>
<target>Editorial</target>
@@ -4244,12 +4321,6 @@ no se aprueba cuando una o ambas de las opciones seleccionadas son iguales o sup
<source>Click to change value</source>
<target>Haga clic para cambiar el valor</target>
</trans-unit>
<trans-unit id="se17f29e830ebf9be">
<source>Successfully updated connector.</source>
</trans-unit>
<trans-unit id="s6da88527f3e5e513">
<source>Successfully created connector.</source>
</trans-unit>
<trans-unit id="s6a087e34edeadc1f">
<source>Connector name...</source>
</trans-unit>
@@ -4299,9 +4370,6 @@ no se aprueba cuando una o ambas de las opciones seleccionadas son iguales o sup
<trans-unit id="s80b0feb2a6b98ef9">
<source>Connectors</source>
</trans-unit>
<trans-unit id="s7e840add1b48d751">
<source>Configure how devices communicate with authentik and external sources device data is fetched from.</source>
</trans-unit>
<trans-unit id="s58d0ed0cc064ec4f">
<source>Update Connector</source>
</trans-unit>
@@ -6224,69 +6292,10 @@ El valor de este campo se compara con el atributo de pertenencia del usuario.</t
<source>Warning: No invitation stage is bound to any flow. Invitations will not work as expected.</source>
<target>Advertencia: ninguna etapa de invitación está vinculada a ningún flujo. Las invitaciones no funcionarán como se espera.</target>
</trans-unit>
<trans-unit id="s2da4aa7a9abeb653">
<source>Pseudolocale (for testing)</source>
<target>Pseudolocalización (para pruebas)</target>
</trans-unit>
<trans-unit id="s63e71d20d1eaca93">
<source>German</source>
<target>Alemán</target>
</trans-unit>
<trans-unit id="s4caed5b7a7e5d89b">
<source>English</source>
<target>Inglés</target>
</trans-unit>
<trans-unit id="sf1868dc19e3917bb">
<source>Spanish</source>
<target>Español</target>
</trans-unit>
<trans-unit id="s75a27f43413e02c5">
<source>French</source>
<target>Francés</target>
</trans-unit>
<trans-unit id="sd48cc52117f4d68b">
<source>Italian</source>
<target>Italiano</target>
</trans-unit>
<trans-unit id="sdd35b688281b6dea">
<source>Japanese</source>
</trans-unit>
<trans-unit id="s94d61907ee22a8c1">
<source>Korean</source>
<target>Koreano</target>
</trans-unit>
<trans-unit id="s95d56e58f816d211">
<source>Dutch</source>
<target>Holandés</target>
</trans-unit>
<trans-unit id="s03f49e598ffb11cc">
<source>Polish</source>
<target>Polaco</target>
</trans-unit>
<trans-unit id="sa30c12014e955946">
<source>Russian</source>
<target>Ruso</target>
</trans-unit>
<trans-unit id="s9d2d00982edafabb">
<source>Turkish</source>
<target>Turco</target>
</trans-unit>
<trans-unit id="s354e0a9f146d2869">
<source>Chinese (simplified)</source>
<target>Chino (simplificado)</target>
</trans-unit>
<trans-unit id="se3e6af2ce24d80e8">
<source>Chinese (traditional)</source>
<target>Chino (tradicional)</target>
</trans-unit>
<trans-unit id="s8939f574b096054a">
<source>Not you?</source>
<target>¿No eres tú?</target>
</trans-unit>
<trans-unit id="s2f995efbb1e46b18">
<source>Auto-detect (based on your browser)</source>
<target>Detección automática (según su navegador)</target>
</trans-unit>
<trans-unit id="s296fbffaaa7c910a">
<source>Required.</source>
<target>Necesario.</target>
@@ -7725,14 +7734,6 @@ El valor de este campo se compara con el atributo de pertenencia del usuario.</t
<source>Background shown during execution.</source>
<target>Se muestra el fondo durante la ejecución.</target>
</trans-unit>
<trans-unit id="s3ebf4c166058afce">
<source>Clear background</source>
<target>Borrar fondo</target>
</trans-unit>
<trans-unit id="sb24755ea94bef31d">
<source>Delete currently set background image.</source>
<target>Elimina la imagen de fondo configurada actualmente.</target>
</trans-unit>
<trans-unit id="sb904f23f17b60c3a">
<source>Successfully imported flow.</source>
<target>El flujo se importó correctamente.</target>
@@ -8828,9 +8829,6 @@ Las vinculaciones a grupos/usuarios se verifican en función del usuario del eve
<trans-unit id="s0393ac07cf8a3097">
<source>Endpoint Devices</source>
</trans-unit>
<trans-unit id="s02d57c823e493fe9">
<source>Device groups</source>
</trans-unit>
<trans-unit id="s4f1ad6b48a5df506">
<source>Logs</source>
<target>Registros</target>
@@ -9612,6 +9610,111 @@ Las vinculaciones a grupos/usuarios se verifican en función del usuario del eve
<source>...</source>
<note from="lit-localize">Truncation ellipsis</note>
</trans-unit>
<trans-unit id="s6cd96061d397f7b5">
<source>Via <x id="0" equiv-text="${event.context.device.name}"/></source>
</trans-unit>
<trans-unit id="sb7ff80582ccd9348">
<source>reference will be left dangling</source>
</trans-unit>
<trans-unit id="s0b7ddc0168e79ea2">
<source>Failed to fetch files</source>
</trans-unit>
<trans-unit id="sdc4f1cfd587212b4">
<source>You can also enter a URL (https://...), Font Awesome icon (fa://fa-icon-name), or upload a new file.</source>
</trans-unit>
<trans-unit id="s8015ac3b47172dc8">
<source>Select from uploaded files, or type a Font Awesome icon (fa://fa-icon-name) or URL.</source>
</trans-unit>
<trans-unit id="s87616130c08b117c">
<source>This type is deprecated.</source>
</trans-unit>
<trans-unit id="s40f4c2223ce87751">
<source>No connectors configured. Navigate to Connectors in the sidebar and first create a connector.</source>
</trans-unit>
<trans-unit id="s70c2cd89201ecca9">
<source>Home directory</source>
</trans-unit>
<trans-unit id="sb171d638b8af660d">
<source>Successfully updated agent connector.</source>
</trans-unit>
<trans-unit id="s81c9554908463f94">
<source>Successfully created agent connector.</source>
</trans-unit>
<trans-unit id="s306dd51d3be07bc7">
<source>Device compliance settings</source>
</trans-unit>
<trans-unit id="sc2966702517b7af5">
<source>Challenge certificate</source>
</trans-unit>
<trans-unit id="s051588c63fedab5f">
<source>Challenge idle timeout</source>
</trans-unit>
<trans-unit id="s4c70d7629e29ac2d">
<source>Duration the flow executor will wait before continuing without a response.</source>
</trans-unit>
<trans-unit id="se3c7fb54006d9e98">
<source>Trigger check-in on device</source>
</trans-unit>
<trans-unit id="se0a747f4db08e87f">
<source>Configure how devices connect with authentik and ingest external device data.</source>
</trans-unit>
<trans-unit id="s114f2b310ef163ff">
<source>Stage which associates the currently used device with the current session.</source>
</trans-unit>
<trans-unit id="s8290d08ab5a49ed0">
<source>Connector</source>
</trans-unit>
<trans-unit id="s5e8eefcbbeffd4d5">
<source>Device optional</source>
</trans-unit>
<trans-unit id="s51b09bba5dcc19b0">
<source>If no device was provided, this stage will succeed and continue to the next stage.</source>
</trans-unit>
<trans-unit id="s5f58e358343a5514">
<source>Device required</source>
</trans-unit>
<trans-unit id="s6df8326edea3b23d">
<source>If no device was provided, this stage will stop flow execution.</source>
</trans-unit>
<trans-unit id="s506c7d2e87f6770e">
<source>Filename can only contain letters, numbers, dots, hyphens, and underscores</source>
</trans-unit>
<trans-unit id="s3a3d5b2575cd32ea">
<source>File uploaded successfully</source>
</trans-unit>
<trans-unit id="sd3775ef947e0de32">
<source>File Name</source>
</trans-unit>
<trans-unit id="s1afc99a84a890514">
<source>Type an optional custom file name...</source>
</trans-unit>
<trans-unit id="sb40e2763045466ea">
<source>Optionally rename the file (without extension). Leave empty to keep the original filename.</source>
</trans-unit>
<trans-unit id="s803ce7e1a2294d50">
<source>Files</source>
</trans-unit>
<trans-unit id="s42d82601762f5321">
<source>Manage uploaded files.</source>
</trans-unit>
<trans-unit id="saad01178f02a6a23">
<source>file</source>
</trans-unit>
<trans-unit id="s69f800801812a5f0">
<source>files</source>
</trans-unit>
<trans-unit id="s96668830629e0dfc">
<source>Upload</source>
</trans-unit>
<trans-unit id="sa32e9d0a108ee802">
<source>Upload File</source>
</trans-unit>
<trans-unit id="s95094b57684716a5">
<source>Failed to validate device.</source>
</trans-unit>
<trans-unit id="se99d25eb70c767ef">
<source>Verifying your device...</source>
</trans-unit>
</body>
</file>
</xliff>

View File

@@ -1,6 +1,94 @@
<?xml version="1.0" ?><xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" version="1.2">
<file target-language="fi_FI" source-language="en" original="lit-localize-inputs" datatype="plaintext">
<?xml version="1.0"?><xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" version="1.2">
<file target-language="fi-FI" source-language="en" original="lit-localize-inputs" datatype="plaintext">
<body>
<!-- #region Locales -->
<trans-unit id="en">
<source>English</source>
<target>Englanti</target>
</trans-unit>
<trans-unit id="pseudo-LOCALE">
<source>Pseudolocale</source>
<target>Valekieli</target>
</trans-unit>
<trans-unit id="cs-CZ">
<source>Czech</source>
<target>Tšekki</target>
</trans-unit>
<trans-unit id="de-DE">
<source>German</source>
<target>Saksa</target>
</trans-unit>
<trans-unit id="es-ES">
<source>Spanish</source>
<target>Espanja</target>
</trans-unit>
<trans-unit id="fi-FI">
<source>Finnish</source>
<target>Suomi</target>
</trans-unit>
<trans-unit id="fr-FR">
<source>French</source>
<target>Ranska</target>
</trans-unit>
<trans-unit id="it-IT">
<source>Italian</source>
<target>Italia</target>
</trans-unit>
<trans-unit id="ja-JP">
<source>Japanese</source>
<target>Japani</target>
</trans-unit>
<trans-unit id="ko-KR">
<source>Korean</source>
<target>Korea</target>
</trans-unit>
<trans-unit id="nl-NL">
<source>Dutch</source>
<target>Hollanti</target>
</trans-unit>
<trans-unit id="pl-PL">
<source>Polish</source>
<target>Puola</target>
</trans-unit>
<trans-unit id="pt-BR">
<source>Portuguese</source>
<target>Portugali</target>
</trans-unit>
<trans-unit id="ru-RU">
<source>Russian</source>
<target>Venäjä</target>
</trans-unit>
<trans-unit id="tr-TR">
<source>Turkish</source>
<target>Turkki</target>
</trans-unit>
<trans-unit id="zh-Hans">
<source>Chinese Simplified</source>
<target>Kiina</target>
</trans-unit>
<trans-unit id="zh-Hant">
<source>Chinese Traditional</source>
<target>Kiina</target>
</trans-unit>
<!-- #endregion -->
<!-- #region Locale selector -->
<trans-unit id="locale-auto-detect-option">
<source>Auto-detect</source>
<target>Tunnista automaattisesti</target>
<note from="lit-localize">Label for the auto-detect locale option in language selection dropdown</note>
</trans-unit>
<trans-unit id="language-selector-label">
<source>Select language</source>
<target>Valitse kieli</target>
<note from="lit-localize">Label for the language selection dropdown</note>
</trans-unit>
<trans-unit id="locale-option-localized-label">
<source><x id="0" equiv-text="${localeLabel}"/> (<x id="1" equiv-text="${translatedLabel}"/>)</source>
<note from="lit-localize">Locale option label showing the localized language name along with the native language name in parentheses. The first placeholder is the localized language name, the second is the native language name.</note>
</trans-unit>
<!-- #endregion -->
<trans-unit id="s12d6dde9b30c3093">
<source>Dismiss</source>
<target>Sulje</target>
@@ -532,7 +620,7 @@
<target>Tyhjennä haku</target>
</trans-unit>
<trans-unit id="sd9b15395dd103f80">
<source>Sort by &quot;<x id="0" equiv-text="${label}"/>&quot;</source>
<source>Sort by "<x id="0" equiv-text="${label}"/>"</source>
<target>Järjestä kentän &amp;quot;<x id="0" equiv-text="${label}"/>&amp;quot; mukaan</target>
</trans-unit>
<trans-unit id="s7bc8c327f1f7c82c">
@@ -544,7 +632,7 @@
<target>Objektien haku ei onnistunut.</target>
</trans-unit>
<trans-unit id="s7dd64bb0c1fa8e87">
<source>Select &quot;<x id="0" equiv-text="${rowLabel}"/>&quot; row</source>
<source>Select "<x id="0" equiv-text="${rowLabel}"/>" row</source>
<target>Valitse rivi &amp;quot;<x id="0" equiv-text="${rowLabel}"/>&amp;quot;</target>
</trans-unit>
<trans-unit id="sd26f670ca5d5b0c6">
@@ -778,9 +866,9 @@
<target>Ei löytynyt</target>
</trans-unit>
<trans-unit id="saa0e2675da69651b">
<source>The URL &quot;<x id="0" equiv-text="${this.url}"/>&quot; was not found.</source>
<target>Osoitetta &quot;
<x id="0" equiv-text="${this.url}"/>&quot; ei löytynyt.</target>
<source>The URL "<x id="0" equiv-text="${this.url}"/>" was not found.</source>
<target>Osoitetta "
<x id="0" equiv-text="${this.url}"/>" ei löytynyt.</target>
</trans-unit>
<trans-unit id="s58cd9c2fe836d9c6">
<source>Return home</source>
@@ -1132,11 +1220,11 @@
<target>Sulje</target>
</trans-unit>
<trans-unit id="sc08c153234510246">
<source>Update &quot;<x id="0" equiv-text="${this.label || &quot;object&quot;}"/>&quot; Permissions</source>
<source>Update "<x id="0" equiv-text="${this.label || &quot;object&quot;}"/>" Permissions</source>
<target>Päivitä &amp;quot;<x id="0" equiv-text="${this.label || &quot;object&quot;}"/>&amp;quot;-käyttöoikeudet</target>
</trans-unit>
<trans-unit id="s6d25eef21a9e76ba">
<source>Open &quot;<x id="0" equiv-text="${this.label || &quot;object&quot;}"/>&quot; permissions modal</source>
<source>Open "<x id="0" equiv-text="${this.label || &quot;object&quot;}"/>" permissions modal</source>
<target>Avaa &amp;quot;<x id="0" equiv-text="${this.label || &quot;object&quot;}"/>&amp;quot;-käyttöoikeuksien ikkuna</target>
</trans-unit>
<trans-unit id="se8dca0132c66ae03">
@@ -1900,8 +1988,8 @@
<target>Jos URI-osoitteita ei ole erikseen määritelty, tallennetaan ensimmäinen onnistuneesti käytetty uudelleenohjaus-URI.</target>
</trans-unit>
<trans-unit id="s4c49d27de60a532b">
<source>To allow any redirect URI, set the mode to Regex and the value to &quot;.*&quot;. Be aware of the possible security implications this can have.</source>
<target>Salliaksesi minkä tahansa uudelleenohjaus-URI-osoitteen, aseta tila Regexiksi ja syötä arvoksi &quot;.*&quot;. Huomioi tämän aiheuttamat tietoturvavaikutukset.</target>
<source>To allow any redirect URI, set the mode to Regex and the value to ".*". Be aware of the possible security implications this can have.</source>
<target>Salliaksesi minkä tahansa uudelleenohjaus-URI-osoitteen, aseta tila Regexiksi ja syötä arvoksi ".*". Huomioi tämän aiheuttamat tietoturvavaikutukset.</target>
</trans-unit>
<trans-unit id="s62f7c59b0606a8d6">
<source>Authorization flow</source>
@@ -3016,7 +3104,7 @@
<x id="0" equiv-text="${item.verboseName}"/></target>
</trans-unit>
<trans-unit id="sfbb87c9ced1fde54">
<source>Edit &quot;<x id="0" equiv-text="${item.name}"/>&quot; provider</source>
<source>Edit "<x id="0" equiv-text="${item.name}"/>" provider</source>
<target>Muokkaa &amp;quot;<x id="0" equiv-text="${item.name}"/>&amp;quot;-palveluntarjoajaa</target>
</trans-unit>
<trans-unit id="s3b579c4bb6b447ae">
@@ -3112,8 +3200,8 @@
<target>Valitse palveluntarjoajat, jotka liitetään sovellukseen</target>
</trans-unit>
<trans-unit id="sa90b7809586c35ce">
<source>Either input a full URL, a relative path, or use 'fa://fa-test' to use the Font Awesome icon &quot;fa-test&quot;.</source>
<target>Syötä joko kokonainen URL-osoite, suhteellinen polku tai 'fa://fa-test' käyttääksesi Font Awesome -kuvaketta &quot;fa-test&quot;.</target>
<source>Either input a full URL, a relative path, or use 'fa://fa-test' to use the Font Awesome icon "fa-test".</source>
<target>Syötä joko kokonainen URL-osoite, suhteellinen polku tai 'fa://fa-test' käyttääksesi Font Awesome -kuvaketta "fa-test".</target>
</trans-unit>
<trans-unit id="s0410779cb47de312">
<source>Path template for users created. Use placeholders like `%(slug)s` to insert the source slug.</source>
@@ -3155,18 +3243,6 @@
<source>Icon</source>
<target>Kuvake</target>
</trans-unit>
<trans-unit id="s67e20cd8018d7e3c">
<source>Currently set to:</source>
<target>Tällä hetkellä asetettu:</target>
</trans-unit>
<trans-unit id="s80e6d6fe5ad458d3">
<source>Clear icon</source>
<target>Tyhjennä kuvake</target>
</trans-unit>
<trans-unit id="s485c05d34eb00415">
<source>Delete currently set icon.</source>
<target>Poista nykyinen kuvake.</target>
</trans-unit>
<trans-unit id="s6d3b4d0561ba1cff">
<source>Publisher</source>
<target>Julkaisija</target>
@@ -3244,7 +3320,7 @@
<target>Varoitus: Palveluntarjoaja ei ole minkään sovelluksen käytössä.</target>
</trans-unit>
<trans-unit id="scbf29ce484222325">
<source/>
<source></source>
</trans-unit>
<trans-unit id="sdbc08adee233f180">
<source>Update OAuth2 Provider</source>
@@ -4103,7 +4179,7 @@ läpäisy estyy kun jompi kumpi tai molemmat vaihtoehdot ylittävät raja-arvon.
<target>Sovellukset</target>
</trans-unit>
<trans-unit id="sf07bfbe5316e7cc7">
<source>Application icon for &quot;<x id="0" equiv-text="${item.name}"/>&quot;</source>
<source>Application icon for "<x id="0" equiv-text="${item.name}"/>"</source>
<target>Kuvake sovellukselle &amp;quot;<x id="0" equiv-text="${item.name}"/>&amp;quot;</target>
</trans-unit>
<trans-unit id="sa347e31efbb60be2">
@@ -4111,11 +4187,11 @@ läpäisy estyy kun jompi kumpi tai molemmat vaihtoehdot ylittävät raja-arvon.
<target>Päivitä sovellus</target>
</trans-unit>
<trans-unit id="s037f22187581bf8f">
<source>Edit &quot;<x id="0" equiv-text="${item.name}"/>&quot;</source>
<source>Edit "<x id="0" equiv-text="${item.name}"/>"</source>
<target>Muokkaa &amp;quot;<x id="0" equiv-text="${item.name}"/>&amp;quot;</target>
</trans-unit>
<trans-unit id="sdb3b903354fbfb17">
<source>Open &quot;<x id="0" equiv-text="${item.name}"/>&quot;</source>
<source>Open "<x id="0" equiv-text="${item.name}"/>"</source>
<target>Avaa &amp;quot;<x id="0" equiv-text="${item.name}"/>&amp;quot;</target>
</trans-unit>
<trans-unit id="s1f7698c061c208c9">
@@ -4187,7 +4263,7 @@ läpäisy estyy kun jompi kumpi tai molemmat vaihtoehdot ylittävät raja-arvon.
<target>Luo oikeus</target>
</trans-unit>
<trans-unit id="sb6fcdabf769208a1">
<source>Failed to fetch application &quot;<x id="0" equiv-text="${this.applicationSlug}"/>&quot;.</source>
<source>Failed to fetch application "<x id="0" equiv-text="${this.applicationSlug}"/>".</source>
<target>Sovelluksen &amp;quot;<x id="0" equiv-text="${this.applicationSlug}"/>&amp;quot; haku epäonnistui.</target>
</trans-unit>
<trans-unit id="application.outpost.missing.warning">
@@ -4389,12 +4465,6 @@ läpäisy estyy kun jompi kumpi tai molemmat vaihtoehdot ylittävät raja-arvon.
<source>Click to change value</source>
<target>Klikkaa muuttaaksesi arvoa</target>
</trans-unit>
<trans-unit id="se17f29e830ebf9be">
<source>Successfully updated connector.</source>
</trans-unit>
<trans-unit id="s6da88527f3e5e513">
<source>Successfully created connector.</source>
</trans-unit>
<trans-unit id="s6a087e34edeadc1f">
<source>Connector name...</source>
</trans-unit>
@@ -4444,9 +4514,6 @@ läpäisy estyy kun jompi kumpi tai molemmat vaihtoehdot ylittävät raja-arvon.
<trans-unit id="s80b0feb2a6b98ef9">
<source>Connectors</source>
</trans-unit>
<trans-unit id="s7e840add1b48d751">
<source>Configure how devices communicate with authentik and external sources device data is fetched from.</source>
</trans-unit>
<trans-unit id="s58d0ed0cc064ec4f">
<source>Update Connector</source>
</trans-unit>
@@ -5716,7 +5783,7 @@ läpäisy estyy kun jompi kumpi tai molemmat vaihtoehdot ylittävät raja-arvon.
<target>Ryhmät</target>
</trans-unit>
<trans-unit id="s79683026e49e4866">
<source>View details of group &quot;<x id="0" equiv-text="${item.name}"/>&quot;</source>
<source>View details of group "<x id="0" equiv-text="${item.name}"/>"</source>
<target>Katso ryhmän &amp;quot;<x id="0" equiv-text="${item.name}"/>&amp;quot; tiedot</target>
</trans-unit>
<trans-unit id="s416a540b16275f2e">
@@ -5945,7 +6012,7 @@ läpäisy estyy kun jompi kumpi tai molemmat vaihtoehdot ylittävät raja-arvon.
<target>Uusi käyttäjä</target>
</trans-unit>
<trans-unit id="s824e0943a7104668">
<source>This user will be added to the group &quot;<x id="0" equiv-text="${this.targetGroup.name}"/>&quot;.</source>
<source>This user will be added to the group "<x id="0" equiv-text="${this.targetGroup.name}"/>".</source>
<target>Tämä käyttäjä lisätään ryhmään &amp;quot;<x id="0" equiv-text="${this.targetGroup.name}"/>&amp;quot;.</target>
</trans-unit>
<trans-unit id="s0051b0d8e6decea6">
@@ -5985,19 +6052,19 @@ läpäisy estyy kun jompi kumpi tai molemmat vaihtoehdot ylittävät raja-arvon.
<target>Nimetön</target>
</trans-unit>
<trans-unit id="s326ee20bba2564a0">
<source>Collapse &quot;<x id="0" equiv-text="${itemLabel}"/>&quot;</source>
<source>Collapse "<x id="0" equiv-text="${itemLabel}"/>"</source>
<target>Sulje &amp;quot;<x id="0" equiv-text="${itemLabel}"/>&amp;quot;</target>
</trans-unit>
<trans-unit id="s27df1f36ba8e269f">
<source>Expand &quot;<x id="0" equiv-text="${itemLabel}"/>&quot;</source>
<source>Expand "<x id="0" equiv-text="${itemLabel}"/>"</source>
<target>Avaa &amp;quot;<x id="0" equiv-text="${itemLabel}"/>&amp;quot;</target>
</trans-unit>
<trans-unit id="sf2b5d3236e6f1ab3">
<source>Select &quot;<x id="0" equiv-text="${itemLabel}"/>&quot;</source>
<source>Select "<x id="0" equiv-text="${itemLabel}"/>"</source>
<target>Valitse &amp;quot;<x id="0" equiv-text="${itemLabel}"/>&amp;quot;</target>
</trans-unit>
<trans-unit id="sb7c2715df863a6ce">
<source>Items of &quot;<x id="0" equiv-text="${itemLabel}"/>&quot;</source>
<source>Items of "<x id="0" equiv-text="${itemLabel}"/>"</source>
<target>&amp;quot;<x id="0" equiv-text="${itemLabel}"/>&amp;quot;:n kohteet</target>
</trans-unit>
<trans-unit id="sca7cfe2bef51b2a5">
@@ -6153,7 +6220,7 @@ läpäisy estyy kun jompi kumpi tai molemmat vaihtoehdot ylittävät raja-arvon.
<x id="0" equiv-text="${source.component}"/></target>
</trans-unit>
<trans-unit id="source-settings-list-item-label">
<source>&quot;<x id="0" equiv-text="${source.title}"/>&quot; source</source>
<source>"<x id="0" equiv-text="${source.title}"/>" source</source>
</trans-unit>
<trans-unit id="s7968dbed9b106c29">
<source>No services available.</source>
@@ -6418,73 +6485,10 @@ läpäisy estyy kun jompi kumpi tai molemmat vaihtoehdot ylittävät raja-arvon.
<source>Warning: No invitation stage is bound to any flow. Invitations will not work as expected.</source>
<target>Varoitus: Mitään kutsuvaihetta ei ole kytketty mihinkään prosessiin. Kutsut eivät toimi odotetulla tavalla.</target>
</trans-unit>
<trans-unit id="s2da4aa7a9abeb653">
<source>Pseudolocale (for testing)</source>
<target>Pseudokielialue (testausta varten)</target>
</trans-unit>
<trans-unit id="s63e71d20d1eaca93">
<source>German</source>
<target>saksa</target>
</trans-unit>
<trans-unit id="s4caed5b7a7e5d89b">
<source>English</source>
<target>englanti</target>
</trans-unit>
<trans-unit id="sf1868dc19e3917bb">
<source>Spanish</source>
<target>espanja</target>
</trans-unit>
<trans-unit id="s75a27f43413e02c5">
<source>French</source>
<target>ranska</target>
</trans-unit>
<trans-unit id="sd48cc52117f4d68b">
<source>Italian</source>
<target>italia</target>
</trans-unit>
<trans-unit id="sdd35b688281b6dea">
<source>Japanese</source>
</trans-unit>
<trans-unit id="s94d61907ee22a8c1">
<source>Korean</source>
<target>Korea</target>
</trans-unit>
<trans-unit id="s95d56e58f816d211">
<source>Dutch</source>
<target>hollanti</target>
</trans-unit>
<trans-unit id="s03f49e598ffb11cc">
<source>Polish</source>
<target>puola</target>
</trans-unit>
<trans-unit id="sa30c12014e955946">
<source>Russian</source>
<target>venäjä</target>
</trans-unit>
<trans-unit id="s9d2d00982edafabb">
<source>Turkish</source>
<target>turkki</target>
</trans-unit>
<trans-unit id="s4660da32fb311ac0">
<source>Taiwanese Mandarin</source>
<target>taiwanin mandariini</target>
</trans-unit>
<trans-unit id="s354e0a9f146d2869">
<source>Chinese (simplified)</source>
<target>kiina (yksinkertaistettu)</target>
</trans-unit>
<trans-unit id="se3e6af2ce24d80e8">
<source>Chinese (traditional)</source>
<target>kiina (perinteinen)</target>
</trans-unit>
<trans-unit id="s8939f574b096054a">
<source>Not you?</source>
<target>Et sinä?</target>
</trans-unit>
<trans-unit id="s2f995efbb1e46b18">
<source>Auto-detect (based on your browser)</source>
<target>Tunnista automaattisesti (selaimen perusteella)</target>
</trans-unit>
<trans-unit id="s296fbffaaa7c910a">
<source>Required.</source>
<target>Pakollinen.</target>
@@ -7098,8 +7102,8 @@ läpäisy estyy kun jompi kumpi tai molemmat vaihtoehdot ylittävät raja-arvon.
<target>Sisäänrakennettu todentaja, joten TouchID tai Windows Hello.</target>
</trans-unit>
<trans-unit id="sdf1d8edef27236f0">
<source>A &quot;roaming&quot; authenticator, like a YubiKey</source>
<target>&quot;Roaming&quot;-tyyppinen todentaja, kuten YubiKey.</target>
<source>A "roaming" authenticator, like a YubiKey</source>
<target>"Roaming"-tyyppinen todentaja, kuten YubiKey.</target>
</trans-unit>
<trans-unit id="sbd65aeeb8a3b9bbc">
<source>Maximum registration attempts</source>
@@ -7207,7 +7211,7 @@ läpäisy estyy kun jompi kumpi tai molemmat vaihtoehdot ylittävät raja-arvon.
</trans-unit>
<trans-unit id="s7f68101a50f526ee">
<source>Statically deny the flow. To use this stage effectively, disable *Evaluate when flow is planned* on the respective binding.</source>
<target>Hylkää prosessi staattisesti. Käyttääksesi tätä vaihetta tehokkaasti kytke pois käytöstä &quot;Suorita kun prosessi suunnitellaan&quot; tähän liittyvästä liitoksesta.</target>
<target>Hylkää prosessi staattisesti. Käyttääksesi tätä vaihetta tehokkaasti kytke pois käytöstä "Suorita kun prosessi suunnitellaan" tähän liittyvästä liitoksesta.</target>
</trans-unit>
<trans-unit id="s1cc306d8e28c4464">
<source>Deny message</source>
@@ -7322,8 +7326,8 @@ läpäisy estyy kun jompi kumpi tai molemmat vaihtoehdot ylittävät raja-arvon.
<target>Kun validi käyttäjätunnus tai sähköpostiosoite on syötetty ja tämä valinta on käytössä, käyttäjän käyttäjätunnus ja avatar näytetään. Muussa tapauksessa näytetään käyttäjän kirjoittama teksti.</target>
</trans-unit>
<trans-unit id="s844baf19a6c4a9b4">
<source>Enable &quot;Remember me on this device&quot;</source>
<target>Ota käyttöön &quot;Muista minut tällä laitteella&quot;</target>
<source>Enable "Remember me on this device"</source>
<target>Ota käyttöön "Muista minut tällä laitteella"</target>
</trans-unit>
<trans-unit id="sfa72bca733f40692">
<source>When enabled, the user can save their username in a cookie, allowing them to skip directly to entering their password.</source>
@@ -7469,7 +7473,7 @@ läpäisy estyy kun jompi kumpi tai molemmat vaihtoehdot ylittävät raja-arvon.
<target>Näytä käyttäjille 'näytä salasana' -painike.</target>
</trans-unit>
<trans-unit id="s2d5f69929bb7221d">
<source><x id="0" equiv-text="${p.name}"/> (&quot;<x id="1" equiv-text="${p.fieldKey}"/>&quot;, of type <x id="2" equiv-text="${p.type}"/>)</source>
<source><x id="0" equiv-text="${p.name}"/> ("<x id="1" equiv-text="${p.fieldKey}"/>", of type <x id="2" equiv-text="${p.type}"/>)</source>
<target><x id="0" equiv-text="${p.name}"/> (&amp;quot;<x id="1" equiv-text="${p.fieldKey}"/>&amp;quot;, tyyppiä <x id="2" equiv-text="${p.type}"/>)</target>
</trans-unit>
<trans-unit id="s5170f9ef331949c0">
@@ -7573,8 +7577,8 @@ läpäisy estyy kun jompi kumpi tai molemmat vaihtoehdot ylittävät raja-arvon.
<target>Kirjautuneena pysymisen viive</target>
</trans-unit>
<trans-unit id="s1608b2f94fa0dbd4">
<source>If set to a duration above 0, the user will have the option to choose to &quot;stay signed in&quot;, which will extend their session by the time specified here.</source>
<target>Jos tähän määritellään nollaa suurempi arvo, käyttäjällä on mahdollisuus valita &quot;pysy sisäänkirjautuneena&quot;, joka jatkaa istunnon kestoa tähän määritellyn ajan verran.</target>
<source>If set to a duration above 0, the user will have the option to choose to "stay signed in", which will extend their session by the time specified here.</source>
<target>Jos tähän määritellään nollaa suurempi arvo, käyttäjällä on mahdollisuus valita "pysy sisäänkirjautuneena", joka jatkaa istunnon kestoa tähän määritellyn ajan verran.</target>
</trans-unit>
<trans-unit id="sa3ff409b84679db8">
<source>Remember device</source>
@@ -7927,14 +7931,6 @@ läpäisy estyy kun jompi kumpi tai molemmat vaihtoehdot ylittävät raja-arvon.
<source>Background shown during execution.</source>
<target>Suorittamisen aikana näytettävä tausta.</target>
</trans-unit>
<trans-unit id="s3ebf4c166058afce">
<source>Clear background</source>
<target>Tyhjennä tausta</target>
</trans-unit>
<trans-unit id="sb24755ea94bef31d">
<source>Delete currently set background image.</source>
<target>Poista nykyinen taustakuva.</target>
</trans-unit>
<trans-unit id="sb904f23f17b60c3a">
<source>Successfully imported flow.</source>
<target>Prosessin tuonti onnistui.</target>
@@ -7964,7 +7960,7 @@ läpäisy estyy kun jompi kumpi tai molemmat vaihtoehdot ylittävät raja-arvon.
<target>Päivitä prosessi</target>
</trans-unit>
<trans-unit id="s5d90aeadfcb34286">
<source>Execute &quot;<x id="0" equiv-text="${item.name}"/>&quot;</source>
<source>Execute "<x id="0" equiv-text="${item.name}"/>"</source>
<target>Suorita &amp;quot;<x id="0" equiv-text="${item.name}"/>&amp;quot;</target>
</trans-unit>
<trans-unit id="sc4fdeccf14be5378">
@@ -7972,7 +7968,7 @@ läpäisy estyy kun jompi kumpi tai molemmat vaihtoehdot ylittävät raja-arvon.
<target>Suorita</target>
</trans-unit>
<trans-unit id="saa25eac2952d918d">
<source>Export &quot;<x id="0" equiv-text="${item.name}"/>&quot;</source>
<source>Export "<x id="0" equiv-text="${item.name}"/>"</source>
<target>Vie &amp;quot;<x id="0" equiv-text="${item.name}"/>&amp;quot;</target>
</trans-unit>
<trans-unit id="s293aa6a6446fb153">
@@ -8062,7 +8058,7 @@ läpäisy estyy kun jompi kumpi tai molemmat vaihtoehdot ylittävät raja-arvon.
<target>Suorita prosessi</target>
</trans-unit>
<trans-unit id="s61e5043203e94d0a">
<source>Execute &quot;<x id="0" equiv-text="${this.flow.name}"/>&quot; normally</source>
<source>Execute "<x id="0" equiv-text="${this.flow.name}"/>" normally</source>
<target>Suorita &amp;quot;<x id="0" equiv-text="${this.flow.name}"/>&amp;quot; normaalisti</target>
</trans-unit>
<trans-unit id="s9ff3121d30f88d52">
@@ -8070,7 +8066,7 @@ läpäisy estyy kun jompi kumpi tai molemmat vaihtoehdot ylittävät raja-arvon.
<target>Normaali</target>
</trans-unit>
<trans-unit id="s02eb960c270a837e">
<source>Execute &quot;<x id="0" equiv-text="${this.flow.name}"/>&quot; as current user</source>
<source>Execute "<x id="0" equiv-text="${this.flow.name}"/>" as current user</source>
<target>Suorita &amp;quot;<x id="0" equiv-text="${this.flow.name}"/>&amp;quot; nykyisenä käyttäjänä</target>
</trans-unit>
<trans-unit id="saf579a36a54c92e1">
@@ -8078,7 +8074,7 @@ läpäisy estyy kun jompi kumpi tai molemmat vaihtoehdot ylittävät raja-arvon.
<target>Nykyinen käyttäjä</target>
</trans-unit>
<trans-unit id="sd149e44e50455923">
<source>Execute &quot;<x id="0" equiv-text="${this.flow.name}"/>&quot; with inspector</source>
<source>Execute "<x id="0" equiv-text="${this.flow.name}"/>" with inspector</source>
<target>Suorita &amp;quot;<x id="0" equiv-text="${this.flow.name}"/>&amp;quot; tarkastajalla</target>
</trans-unit>
<trans-unit id="s45c530a48bcf74ad">
@@ -8423,9 +8419,9 @@ Liitokset käyttäjiin/ryhmiin tarkistetaan tapahtuman käyttäjästä.</target>
<source>Can be in the format of <x id="0" equiv-text="&lt;code&gt;"/>unix://<x id="1" equiv-text="&lt;/code&gt;"/> when connecting to a local
docker daemon, using <x id="2" equiv-text="&lt;code&gt;"/>ssh://<x id="3" equiv-text="&lt;/code&gt;"/> to connect via SSH, or
<x id="4" equiv-text="&lt;code&gt;"/>https://:2376<x id="5" equiv-text="&lt;/code&gt;"/> when connecting to a remote system.</source>
<target>Voi olla muodossa <x id="0" equiv-text="&lt;code&gt;"/>unix://<x id="1" equiv-text="&lt;/code&gt;"/> yhdistettäessä paikalliseen
docker-daemoniin, ssh://<x id="3" equiv-text="&lt;/code&gt;"/> yhdistettäessä SSH:lla tai
<x id="4" equiv-text="&lt;code&gt;"/>https://:2376<x id="5" equiv-text="&lt;/code&gt;"/> yhdistettäessä etäjärjestelmään.</target>
<target>Voi olla muodossa <x id="0" equiv-text="&lt;code&gt;"/>unix://<x id="1" equiv-text="&lt;/code&gt;"/>, kun yhdistetään paikalliseen
docker-daemoniin, käyttämällä <x id="2" equiv-text="&lt;code&gt;"/>ssh://<x id="3" equiv-text="&lt;/code&gt;"/>, tai
<x id="4" equiv-text="&lt;code&gt;"/>https://:2376<x id="5" equiv-text="&lt;/code&gt;"/>, kun yhdistetään etäjärjestelmään.</target>
</trans-unit>
<trans-unit id="saf1d289e3137c2ea">
<source>CA which the endpoint's Certificate is verified against. Can be left empty for no validation.</source>
@@ -8849,11 +8845,11 @@ Liitokset käyttäjiin/ryhmiin tarkistetaan tapahtuman käyttäjästä.</target>
<target>Päivitä suunnitelma</target>
</trans-unit>
<trans-unit id="s08d24327ec788e78">
<source>Edit &quot;<x id="0" equiv-text="${item.name}"/>&quot; blueprint</source>
<source>Edit "<x id="0" equiv-text="${item.name}"/>" blueprint</source>
<target>Muokkaa &amp;quot;<x id="0" equiv-text="${item.name}"/>&amp;quot;-suunnitelmaa</target>
</trans-unit>
<trans-unit id="s6f8d15b5494ac41a">
<source>Apply &quot;<x id="0" equiv-text="${item.name}"/>&quot; blueprint</source>
<source>Apply "<x id="0" equiv-text="${item.name}"/>" blueprint</source>
<target>Käytä &amp;quot;<x id="0" equiv-text="${item.name}"/>&amp;quot;-suunnitelmaa</target>
</trans-unit>
<trans-unit id="sb8f855b49234b81b">
@@ -9051,9 +9047,6 @@ Liitokset käyttäjiin/ryhmiin tarkistetaan tapahtuman käyttäjästä.</target>
<trans-unit id="s0393ac07cf8a3097">
<source>Endpoint Devices</source>
</trans-unit>
<trans-unit id="s02d57c823e493fe9">
<source>Device groups</source>
</trans-unit>
<trans-unit id="s4f1ad6b48a5df506">
<source>Logs</source>
<target>Logit</target>
@@ -9751,7 +9744,7 @@ Liitokset käyttäjiin/ryhmiin tarkistetaan tapahtuman käyttäjästä.</target>
<target>sovellus</target>
</trans-unit>
<trans-unit id="s33b2f30214a2e99d">
<source>Actions for &quot;<x id="0" equiv-text="${applicationName}"/>&quot;</source>
<source>Actions for "<x id="0" equiv-text="${applicationName}"/>"</source>
<target>&amp;quot;<x id="0" equiv-text="${applicationName}"/>&amp;quot;:n toiminnot</target>
</trans-unit>
<trans-unit id="sfa660d9e563c346f">
@@ -9787,11 +9780,11 @@ Liitokset käyttäjiin/ryhmiin tarkistetaan tapahtuman käyttäjästä.</target>
<target>Haku ei palauttanut tuloksia.</target>
</trans-unit>
<trans-unit id="sa4fb160e26323b02">
<source><x id="0" equiv-text="${count}"/> application found for &quot;<x id="1" equiv-text="${query}"/>&quot;</source>
<source><x id="0" equiv-text="${count}"/> application found for "<x id="1" equiv-text="${query}"/>"</source>
<target><x id="0" equiv-text="${count}"/> sovellus löytyi kohteelle &amp;quot;<x id="1" equiv-text="${query}"/>&amp;quot;</target>
</trans-unit>
<trans-unit id="s8a9abf934b0dc89d">
<source><x id="0" equiv-text="${count}"/> applications found for &quot;<x id="1" equiv-text="${query}"/>&quot;</source>
<source><x id="0" equiv-text="${count}"/> applications found for "<x id="1" equiv-text="${query}"/>"</source>
<target><x id="0" equiv-text="${count}"/> sovellusta löytyi kohteelle &amp;quot;<x id="1" equiv-text="${query}"/>&amp;quot;</target>
</trans-unit>
<trans-unit id="sb1d445efd39638d4">
@@ -9886,6 +9879,111 @@ Liitokset käyttäjiin/ryhmiin tarkistetaan tapahtuman käyttäjästä.</target>
<target>...</target>
<note from="lit-localize">Truncation ellipsis</note>
</trans-unit>
<trans-unit id="s6cd96061d397f7b5">
<source>Via <x id="0" equiv-text="${event.context.device.name}"/></source>
</trans-unit>
<trans-unit id="sb7ff80582ccd9348">
<source>reference will be left dangling</source>
</trans-unit>
<trans-unit id="s0b7ddc0168e79ea2">
<source>Failed to fetch files</source>
</trans-unit>
<trans-unit id="sdc4f1cfd587212b4">
<source>You can also enter a URL (https://...), Font Awesome icon (fa://fa-icon-name), or upload a new file.</source>
</trans-unit>
<trans-unit id="s8015ac3b47172dc8">
<source>Select from uploaded files, or type a Font Awesome icon (fa://fa-icon-name) or URL.</source>
</trans-unit>
<trans-unit id="s87616130c08b117c">
<source>This type is deprecated.</source>
</trans-unit>
<trans-unit id="s40f4c2223ce87751">
<source>No connectors configured. Navigate to Connectors in the sidebar and first create a connector.</source>
</trans-unit>
<trans-unit id="s70c2cd89201ecca9">
<source>Home directory</source>
</trans-unit>
<trans-unit id="sb171d638b8af660d">
<source>Successfully updated agent connector.</source>
</trans-unit>
<trans-unit id="s81c9554908463f94">
<source>Successfully created agent connector.</source>
</trans-unit>
<trans-unit id="s306dd51d3be07bc7">
<source>Device compliance settings</source>
</trans-unit>
<trans-unit id="sc2966702517b7af5">
<source>Challenge certificate</source>
</trans-unit>
<trans-unit id="s051588c63fedab5f">
<source>Challenge idle timeout</source>
</trans-unit>
<trans-unit id="s4c70d7629e29ac2d">
<source>Duration the flow executor will wait before continuing without a response.</source>
</trans-unit>
<trans-unit id="se3c7fb54006d9e98">
<source>Trigger check-in on device</source>
</trans-unit>
<trans-unit id="se0a747f4db08e87f">
<source>Configure how devices connect with authentik and ingest external device data.</source>
</trans-unit>
<trans-unit id="s114f2b310ef163ff">
<source>Stage which associates the currently used device with the current session.</source>
</trans-unit>
<trans-unit id="s8290d08ab5a49ed0">
<source>Connector</source>
</trans-unit>
<trans-unit id="s5e8eefcbbeffd4d5">
<source>Device optional</source>
</trans-unit>
<trans-unit id="s51b09bba5dcc19b0">
<source>If no device was provided, this stage will succeed and continue to the next stage.</source>
</trans-unit>
<trans-unit id="s5f58e358343a5514">
<source>Device required</source>
</trans-unit>
<trans-unit id="s6df8326edea3b23d">
<source>If no device was provided, this stage will stop flow execution.</source>
</trans-unit>
<trans-unit id="s506c7d2e87f6770e">
<source>Filename can only contain letters, numbers, dots, hyphens, and underscores</source>
</trans-unit>
<trans-unit id="s3a3d5b2575cd32ea">
<source>File uploaded successfully</source>
</trans-unit>
<trans-unit id="sd3775ef947e0de32">
<source>File Name</source>
</trans-unit>
<trans-unit id="s1afc99a84a890514">
<source>Type an optional custom file name...</source>
</trans-unit>
<trans-unit id="sb40e2763045466ea">
<source>Optionally rename the file (without extension). Leave empty to keep the original filename.</source>
</trans-unit>
<trans-unit id="s803ce7e1a2294d50">
<source>Files</source>
</trans-unit>
<trans-unit id="s42d82601762f5321">
<source>Manage uploaded files.</source>
</trans-unit>
<trans-unit id="saad01178f02a6a23">
<source>file</source>
</trans-unit>
<trans-unit id="s69f800801812a5f0">
<source>files</source>
</trans-unit>
<trans-unit id="s96668830629e0dfc">
<source>Upload</source>
</trans-unit>
<trans-unit id="sa32e9d0a108ee802">
<source>Upload File</source>
</trans-unit>
<trans-unit id="s95094b57684716a5">
<source>Failed to validate device.</source>
</trans-unit>
<trans-unit id="se99d25eb70c767ef">
<source>Verifying your device...</source>
</trans-unit>
</body>
</file>
</xliff>

View File

@@ -1,6 +1,95 @@
<?xml version="1.0"?><xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" version="1.2">
<file target-language="fr_FR" source-language="en" original="lit-localize-inputs" datatype="plaintext">
<file target-language="fr-FR" source-language="en" original="lit-localize-inputs" datatype="plaintext">
<body>
<!-- #region Locales -->
<trans-unit id="en">
<source>English</source>
<target>Anglais</target>
</trans-unit>
<trans-unit id="pseudo-LOCALE">
<source>Pseudolocale</source>
<target>Pseudo-langue</target>
</trans-unit>
<trans-unit id="cs-CZ">
<source>Czech</source>
<target>Tchèque</target>
</trans-unit>
<trans-unit id="de-DE">
<source>German</source>
<target>Allemand</target>
</trans-unit>
<trans-unit id="es-ES">
<source>Spanish</source>
<target>Espagnol</target>
</trans-unit>
<trans-unit id="fi-FI">
<source>Finnish</source>
<target>Finnois</target>
</trans-unit>
<trans-unit id="fr-FR">
<source>French</source>
<target>Français</target>
</trans-unit>
<trans-unit id="it-IT">
<source>Italian</source>
<target>Italien</target>
</trans-unit>
<trans-unit id="ja-JP">
<source>Japanese</source>
<target>Japonais</target>
</trans-unit>
<trans-unit id="ko-KR">
<source>Korean</source>
<target>Coréen</target>
</trans-unit>
<trans-unit id="nl-NL">
<source>Dutch</source>
<target>Néerlandais</target>
</trans-unit>
<trans-unit id="pl-PL">
<source>Polish</source>
<target>Polonais</target>
</trans-unit>
<trans-unit id="pt-BR">
<source>Portuguese</source>
<target>Portugais</target>
</trans-unit>
<trans-unit id="ru-RU">
<source>Russian</source>
<target>Russe</target>
</trans-unit>
<trans-unit id="tr-TR">
<source>Turkish</source>
<target>Turc</target>
</trans-unit>
<trans-unit id="zh-Hans">
<source>Chinese Simplified</source>
<target>Chinois</target>
</trans-unit>
<trans-unit id="zh-Hant">
<source>Chinese Traditional</source>
<target>Chinois</target>
</trans-unit>
<!-- #endregion -->
<!-- #region Locale selector -->
<trans-unit id="locale-auto-detect-option">
<source>Auto-detect</source>
<target>Détection automatique</target>
<note from="lit-localize">Label for the auto-detect locale option in language selection dropdown</note>
</trans-unit>
<trans-unit id="language-selector-label">
<source>Select language</source>
<target>Sélectionner la langue</target>
<note from="lit-localize">Label for the language selection dropdown</note>
</trans-unit>
<trans-unit id="locale-option-localized-label">
<source><x id="0" equiv-text="${localeLabel}"/> (<x id="1" equiv-text="${translatedLabel}"/>)</source>
<note from="lit-localize">Locale option label showing the localized language name along with the native language name in parentheses. The first placeholder is the localized language name, the second is the native language name.</note>
</trans-unit>
<!-- #endregion -->
<trans-unit id="s12d6dde9b30c3093">
<source>Dismiss</source>
<target>Fermer</target>
@@ -3145,18 +3234,6 @@
<source>Icon</source>
<target>Icône</target>
</trans-unit>
<trans-unit id="s67e20cd8018d7e3c">
<source>Currently set to:</source>
<target>Actuellement fixé à :</target>
</trans-unit>
<trans-unit id="s80e6d6fe5ad458d3">
<source>Clear icon</source>
<target>Supprimer l'icône</target>
</trans-unit>
<trans-unit id="s485c05d34eb00415">
<source>Delete currently set icon.</source>
<target>Supprimer l'icône actuellement définie</target>
</trans-unit>
<trans-unit id="s6d3b4d0561ba1cff">
<source>Publisher</source>
<target>Éditeur</target>
@@ -4377,12 +4454,6 @@ doesn't pass when either or both of the selected options are equal or above the
<source>Click to change value</source>
<target>Cliquer pour changer la valeur</target>
</trans-unit>
<trans-unit id="se17f29e830ebf9be">
<source>Successfully updated connector.</source>
</trans-unit>
<trans-unit id="s6da88527f3e5e513">
<source>Successfully created connector.</source>
</trans-unit>
<trans-unit id="s6a087e34edeadc1f">
<source>Connector name...</source>
</trans-unit>
@@ -4432,9 +4503,6 @@ doesn't pass when either or both of the selected options are equal or above the
<trans-unit id="s80b0feb2a6b98ef9">
<source>Connectors</source>
</trans-unit>
<trans-unit id="s7e840add1b48d751">
<source>Configure how devices communicate with authentik and external sources device data is fetched from.</source>
</trans-unit>
<trans-unit id="s58d0ed0cc064ec4f">
<source>Update Connector</source>
</trans-unit>
@@ -6407,69 +6475,10 @@ doesn't pass when either or both of the selected options are equal or above the
<source>Warning: No invitation stage is bound to any flow. Invitations will not work as expected.</source>
<target>Attention : aucune étape dinvitation na été ajoutée à aucun flux. Les invitations ne fonctionneront pas comme attendu.</target>
</trans-unit>
<trans-unit id="s2da4aa7a9abeb653">
<source>Pseudolocale (for testing)</source>
<target>Pseudolocale (pour tests)</target>
</trans-unit>
<trans-unit id="s63e71d20d1eaca93">
<source>German</source>
<target>Allemand</target>
</trans-unit>
<trans-unit id="s4caed5b7a7e5d89b">
<source>English</source>
<target>Anglais</target>
</trans-unit>
<trans-unit id="sf1868dc19e3917bb">
<source>Spanish</source>
<target>Espagnol</target>
</trans-unit>
<trans-unit id="s75a27f43413e02c5">
<source>French</source>
<target>Français</target>
</trans-unit>
<trans-unit id="sd48cc52117f4d68b">
<source>Italian</source>
<target>Italien</target>
</trans-unit>
<trans-unit id="sdd35b688281b6dea">
<source>Japanese</source>
</trans-unit>
<trans-unit id="s94d61907ee22a8c1">
<source>Korean</source>
<target>Coréen</target>
</trans-unit>
<trans-unit id="s95d56e58f816d211">
<source>Dutch</source>
<target>Néerlandais</target>
</trans-unit>
<trans-unit id="s03f49e598ffb11cc">
<source>Polish</source>
<target>Polonais</target>
</trans-unit>
<trans-unit id="sa30c12014e955946">
<source>Russian</source>
<target>Russe</target>
</trans-unit>
<trans-unit id="s9d2d00982edafabb">
<source>Turkish</source>
<target>Turque</target>
</trans-unit>
<trans-unit id="s354e0a9f146d2869">
<source>Chinese (simplified)</source>
<target>Chinois (simplifié)</target>
</trans-unit>
<trans-unit id="se3e6af2ce24d80e8">
<source>Chinese (traditional)</source>
<target>Chinois (traditionnel)</target>
</trans-unit>
<trans-unit id="s8939f574b096054a">
<source>Not you?</source>
<target>Pas vous ?</target>
</trans-unit>
<trans-unit id="s2f995efbb1e46b18">
<source>Auto-detect (based on your browser)</source>
<target>Détection automatique (basée sur votre navigateur)</target>
</trans-unit>
<trans-unit id="s296fbffaaa7c910a">
<source>Required.</source>
<target>Obligatoire.</target>
@@ -7912,14 +7921,6 @@ doesn't pass when either or both of the selected options are equal or above the
<source>Background shown during execution.</source>
<target>Arrière-plan utilisé durant l'exécution.</target>
</trans-unit>
<trans-unit id="s3ebf4c166058afce">
<source>Clear background</source>
<target>Fond vide</target>
</trans-unit>
<trans-unit id="sb24755ea94bef31d">
<source>Delete currently set background image.</source>
<target>Supprimer l'arrière plan actuellement défini</target>
</trans-unit>
<trans-unit id="sb904f23f17b60c3a">
<source>Successfully imported flow.</source>
<target>Flux importé avec succès</target>
@@ -9038,9 +9039,6 @@ Les liaisons avec les groupes/utilisateurs sont vérifiées par rapport à l'uti
<trans-unit id="s0393ac07cf8a3097">
<source>Endpoint Devices</source>
</trans-unit>
<trans-unit id="s02d57c823e493fe9">
<source>Device groups</source>
</trans-unit>
<trans-unit id="s4f1ad6b48a5df506">
<source>Logs</source>
<target>Logs</target>
@@ -9866,6 +9864,111 @@ Les liaisons avec les groupes/utilisateurs sont vérifiées par rapport à l'uti
<target>...</target>
<note from="lit-localize">Truncation ellipsis</note>
</trans-unit>
<trans-unit id="s6cd96061d397f7b5">
<source>Via <x id="0" equiv-text="${event.context.device.name}"/></source>
</trans-unit>
<trans-unit id="sb7ff80582ccd9348">
<source>reference will be left dangling</source>
</trans-unit>
<trans-unit id="s0b7ddc0168e79ea2">
<source>Failed to fetch files</source>
</trans-unit>
<trans-unit id="sdc4f1cfd587212b4">
<source>You can also enter a URL (https://...), Font Awesome icon (fa://fa-icon-name), or upload a new file.</source>
</trans-unit>
<trans-unit id="s8015ac3b47172dc8">
<source>Select from uploaded files, or type a Font Awesome icon (fa://fa-icon-name) or URL.</source>
</trans-unit>
<trans-unit id="s87616130c08b117c">
<source>This type is deprecated.</source>
</trans-unit>
<trans-unit id="s40f4c2223ce87751">
<source>No connectors configured. Navigate to Connectors in the sidebar and first create a connector.</source>
</trans-unit>
<trans-unit id="s70c2cd89201ecca9">
<source>Home directory</source>
</trans-unit>
<trans-unit id="sb171d638b8af660d">
<source>Successfully updated agent connector.</source>
</trans-unit>
<trans-unit id="s81c9554908463f94">
<source>Successfully created agent connector.</source>
</trans-unit>
<trans-unit id="s306dd51d3be07bc7">
<source>Device compliance settings</source>
</trans-unit>
<trans-unit id="sc2966702517b7af5">
<source>Challenge certificate</source>
</trans-unit>
<trans-unit id="s051588c63fedab5f">
<source>Challenge idle timeout</source>
</trans-unit>
<trans-unit id="s4c70d7629e29ac2d">
<source>Duration the flow executor will wait before continuing without a response.</source>
</trans-unit>
<trans-unit id="se3c7fb54006d9e98">
<source>Trigger check-in on device</source>
</trans-unit>
<trans-unit id="se0a747f4db08e87f">
<source>Configure how devices connect with authentik and ingest external device data.</source>
</trans-unit>
<trans-unit id="s114f2b310ef163ff">
<source>Stage which associates the currently used device with the current session.</source>
</trans-unit>
<trans-unit id="s8290d08ab5a49ed0">
<source>Connector</source>
</trans-unit>
<trans-unit id="s5e8eefcbbeffd4d5">
<source>Device optional</source>
</trans-unit>
<trans-unit id="s51b09bba5dcc19b0">
<source>If no device was provided, this stage will succeed and continue to the next stage.</source>
</trans-unit>
<trans-unit id="s5f58e358343a5514">
<source>Device required</source>
</trans-unit>
<trans-unit id="s6df8326edea3b23d">
<source>If no device was provided, this stage will stop flow execution.</source>
</trans-unit>
<trans-unit id="s506c7d2e87f6770e">
<source>Filename can only contain letters, numbers, dots, hyphens, and underscores</source>
</trans-unit>
<trans-unit id="s3a3d5b2575cd32ea">
<source>File uploaded successfully</source>
</trans-unit>
<trans-unit id="sd3775ef947e0de32">
<source>File Name</source>
</trans-unit>
<trans-unit id="s1afc99a84a890514">
<source>Type an optional custom file name...</source>
</trans-unit>
<trans-unit id="sb40e2763045466ea">
<source>Optionally rename the file (without extension). Leave empty to keep the original filename.</source>
</trans-unit>
<trans-unit id="s803ce7e1a2294d50">
<source>Files</source>
</trans-unit>
<trans-unit id="s42d82601762f5321">
<source>Manage uploaded files.</source>
</trans-unit>
<trans-unit id="saad01178f02a6a23">
<source>file</source>
</trans-unit>
<trans-unit id="s69f800801812a5f0">
<source>files</source>
</trans-unit>
<trans-unit id="s96668830629e0dfc">
<source>Upload</source>
</trans-unit>
<trans-unit id="sa32e9d0a108ee802">
<source>Upload File</source>
</trans-unit>
<trans-unit id="s95094b57684716a5">
<source>Failed to validate device.</source>
</trans-unit>
<trans-unit id="se99d25eb70c767ef">
<source>Verifying your device...</source>
</trans-unit>
</body>
</file>
</xliff>

View File

@@ -1,6 +1,94 @@
<?xml version="1.0"?><xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" version="1.2">
<file target-language="it_IT" source-language="en" original="lit-localize-inputs" datatype="plaintext">
<file target-language="it-IT" source-language="en" original="lit-localize-inputs" datatype="plaintext">
<body>
<!-- #region Locales -->
<trans-unit id="en">
<source>English</source>
<target>Inglese</target>
</trans-unit>
<trans-unit id="pseudo-LOCALE">
<source>Pseudolocale</source>
<target>Pseudolingua</target>
</trans-unit>
<trans-unit id="cs-CZ">
<source>Czech</source>
<target>Ceco</target>
</trans-unit>
<trans-unit id="de-DE">
<source>German</source>
<target>Tedesco</target>
</trans-unit>
<trans-unit id="es-ES">
<source>Spanish</source>
<target>Spagnolo</target>
</trans-unit>
<trans-unit id="fi-FI">
<source>Finnish</source>
<target>Finlandese</target>
</trans-unit>
<trans-unit id="fr-FR">
<source>French</source>
<target>Francese</target>
</trans-unit>
<trans-unit id="it-IT">
<source>Italian</source>
<target>Italiano</target>
</trans-unit>
<trans-unit id="ja-JP">
<source>Japanese</source>
<target>Giapponese</target>
</trans-unit>
<trans-unit id="ko-KR">
<source>Korean</source>
<target>Coreano</target>
</trans-unit>
<trans-unit id="nl-NL">
<source>Dutch</source>
<target>Olandese</target>
</trans-unit>
<trans-unit id="pl-PL">
<source>Polish</source>
<target>Polacco</target>
</trans-unit>
<trans-unit id="pt-BR">
<source>Portuguese</source>
<target>Portoghese</target>
</trans-unit>
<trans-unit id="ru-RU">
<source>Russian</source>
<target>Russo</target>
</trans-unit>
<trans-unit id="tr-TR">
<source>Turkish</source>
<target>Turco</target>
</trans-unit>
<trans-unit id="zh-Hans">
<source>Chinese Simplified</source>
<target>Cinese</target>
</trans-unit>
<trans-unit id="zh-Hant">
<source>Chinese Traditional</source>
<target>Cinese</target>
</trans-unit>
<!-- #endregion -->
<!-- #region Locale selector -->
<trans-unit id="locale-auto-detect-option">
<source>Auto-detect</source>
<target>Rilevamento automatico</target>
<note from="lit-localize">Label for the auto-detect locale option in language selection dropdown</note>
</trans-unit>
<trans-unit id="language-selector-label">
<source>Select language</source>
<target>Seleziona lingua</target>
<note from="lit-localize">Label for the language selection dropdown</note>
</trans-unit>
<trans-unit id="locale-option-localized-label">
<source><x id="0" equiv-text="${localeLabel}"/> (<x id="1" equiv-text="${translatedLabel}"/>)</source>
<note from="lit-localize">Locale option label showing the localized language name along with the native language name in parentheses. The first placeholder is the localized language name, the second is the native language name.</note>
</trans-unit>
<!-- #endregion -->
<trans-unit id="s12d6dde9b30c3093">
<source>Dismiss</source>
</trans-unit>
@@ -3004,18 +3092,6 @@
<source>Icon</source>
<target>Icona</target>
</trans-unit>
<trans-unit id="s67e20cd8018d7e3c">
<source>Currently set to:</source>
<target>Attualmente impostato su:</target>
</trans-unit>
<trans-unit id="s80e6d6fe5ad458d3">
<source>Clear icon</source>
<target>Cancella icona</target>
</trans-unit>
<trans-unit id="s485c05d34eb00415">
<source>Delete currently set icon.</source>
<target>Elimina l'icona attualmente impostata.</target>
</trans-unit>
<trans-unit id="s6d3b4d0561ba1cff">
<source>Publisher</source>
<target>Publisher</target>
@@ -4204,12 +4280,6 @@ doesn't pass when either or both of the selected options are equal or above the
<source>Click to change value</source>
<target>Clicca per cambiare valore</target>
</trans-unit>
<trans-unit id="se17f29e830ebf9be">
<source>Successfully updated connector.</source>
</trans-unit>
<trans-unit id="s6da88527f3e5e513">
<source>Successfully created connector.</source>
</trans-unit>
<trans-unit id="s6a087e34edeadc1f">
<source>Connector name...</source>
</trans-unit>
@@ -4259,9 +4329,6 @@ doesn't pass when either or both of the selected options are equal or above the
<trans-unit id="s80b0feb2a6b98ef9">
<source>Connectors</source>
</trans-unit>
<trans-unit id="s7e840add1b48d751">
<source>Configure how devices communicate with authentik and external sources device data is fetched from.</source>
</trans-unit>
<trans-unit id="s58d0ed0cc064ec4f">
<source>Update Connector</source>
</trans-unit>
@@ -6183,69 +6250,10 @@ doesn't pass when either or both of the selected options are equal or above the
<source>Warning: No invitation stage is bound to any flow. Invitations will not work as expected.</source>
<target>Attenzione: nessuna fase di invito è vincolata ad alcun flusso. Gli inviti non funzioneranno come previsto.</target>
</trans-unit>
<trans-unit id="s2da4aa7a9abeb653">
<source>Pseudolocale (for testing)</source>
<target>Pseudolocale (per testare)</target>
</trans-unit>
<trans-unit id="s63e71d20d1eaca93">
<source>German</source>
<target>Tedesco</target>
</trans-unit>
<trans-unit id="s4caed5b7a7e5d89b">
<source>English</source>
<target>Inglese</target>
</trans-unit>
<trans-unit id="sf1868dc19e3917bb">
<source>Spanish</source>
<target>Spagnolo</target>
</trans-unit>
<trans-unit id="s75a27f43413e02c5">
<source>French</source>
<target>Francese</target>
</trans-unit>
<trans-unit id="sd48cc52117f4d68b">
<source>Italian</source>
<target>Italiano</target>
</trans-unit>
<trans-unit id="sdd35b688281b6dea">
<source>Japanese</source>
</trans-unit>
<trans-unit id="s94d61907ee22a8c1">
<source>Korean</source>
<target>Coreano</target>
</trans-unit>
<trans-unit id="s95d56e58f816d211">
<source>Dutch</source>
<target>Olandese</target>
</trans-unit>
<trans-unit id="s03f49e598ffb11cc">
<source>Polish</source>
<target>Polacco</target>
</trans-unit>
<trans-unit id="sa30c12014e955946">
<source>Russian</source>
<target>Russo</target>
</trans-unit>
<trans-unit id="s9d2d00982edafabb">
<source>Turkish</source>
<target>Turco</target>
</trans-unit>
<trans-unit id="s354e0a9f146d2869">
<source>Chinese (simplified)</source>
<target>Cinese (semplificato)</target>
</trans-unit>
<trans-unit id="se3e6af2ce24d80e8">
<source>Chinese (traditional)</source>
<target>Cinese (tradizionale)</target>
</trans-unit>
<trans-unit id="s8939f574b096054a">
<source>Not you?</source>
<target>Non sei tu?</target>
</trans-unit>
<trans-unit id="s2f995efbb1e46b18">
<source>Auto-detect (based on your browser)</source>
<target>Rilevamento automatico (in base al browser)</target>
</trans-unit>
<trans-unit id="s296fbffaaa7c910a">
<source>Required.</source>
<target>Richiesto.</target>
@@ -7681,14 +7689,6 @@ doesn't pass when either or both of the selected options are equal or above the
<source>Background shown during execution.</source>
<target>Sfondo mostrato durante l'esecuzione.</target>
</trans-unit>
<trans-unit id="s3ebf4c166058afce">
<source>Clear background</source>
<target>Pulisci sfondo</target>
</trans-unit>
<trans-unit id="sb24755ea94bef31d">
<source>Delete currently set background image.</source>
<target>Elimina l'immagine di sfondo attualmente impostata.</target>
</trans-unit>
<trans-unit id="sb904f23f17b60c3a">
<source>Successfully imported flow.</source>
<target>Importazione del flusso riuscita.</target>
@@ -8781,9 +8781,6 @@ Bindings to groups/users are checked against the user of the event.</source>
<trans-unit id="s0393ac07cf8a3097">
<source>Endpoint Devices</source>
</trans-unit>
<trans-unit id="s02d57c823e493fe9">
<source>Device groups</source>
</trans-unit>
<trans-unit id="s4f1ad6b48a5df506">
<source>Logs</source>
<target>Logs</target>
@@ -9561,6 +9558,111 @@ Bindings to groups/users are checked against the user of the event.</source>
<source>...</source>
<note from="lit-localize">Truncation ellipsis</note>
</trans-unit>
<trans-unit id="s6cd96061d397f7b5">
<source>Via <x id="0" equiv-text="${event.context.device.name}"/></source>
</trans-unit>
<trans-unit id="sb7ff80582ccd9348">
<source>reference will be left dangling</source>
</trans-unit>
<trans-unit id="s0b7ddc0168e79ea2">
<source>Failed to fetch files</source>
</trans-unit>
<trans-unit id="sdc4f1cfd587212b4">
<source>You can also enter a URL (https://...), Font Awesome icon (fa://fa-icon-name), or upload a new file.</source>
</trans-unit>
<trans-unit id="s8015ac3b47172dc8">
<source>Select from uploaded files, or type a Font Awesome icon (fa://fa-icon-name) or URL.</source>
</trans-unit>
<trans-unit id="s87616130c08b117c">
<source>This type is deprecated.</source>
</trans-unit>
<trans-unit id="s40f4c2223ce87751">
<source>No connectors configured. Navigate to Connectors in the sidebar and first create a connector.</source>
</trans-unit>
<trans-unit id="s70c2cd89201ecca9">
<source>Home directory</source>
</trans-unit>
<trans-unit id="sb171d638b8af660d">
<source>Successfully updated agent connector.</source>
</trans-unit>
<trans-unit id="s81c9554908463f94">
<source>Successfully created agent connector.</source>
</trans-unit>
<trans-unit id="s306dd51d3be07bc7">
<source>Device compliance settings</source>
</trans-unit>
<trans-unit id="sc2966702517b7af5">
<source>Challenge certificate</source>
</trans-unit>
<trans-unit id="s051588c63fedab5f">
<source>Challenge idle timeout</source>
</trans-unit>
<trans-unit id="s4c70d7629e29ac2d">
<source>Duration the flow executor will wait before continuing without a response.</source>
</trans-unit>
<trans-unit id="se3c7fb54006d9e98">
<source>Trigger check-in on device</source>
</trans-unit>
<trans-unit id="se0a747f4db08e87f">
<source>Configure how devices connect with authentik and ingest external device data.</source>
</trans-unit>
<trans-unit id="s114f2b310ef163ff">
<source>Stage which associates the currently used device with the current session.</source>
</trans-unit>
<trans-unit id="s8290d08ab5a49ed0">
<source>Connector</source>
</trans-unit>
<trans-unit id="s5e8eefcbbeffd4d5">
<source>Device optional</source>
</trans-unit>
<trans-unit id="s51b09bba5dcc19b0">
<source>If no device was provided, this stage will succeed and continue to the next stage.</source>
</trans-unit>
<trans-unit id="s5f58e358343a5514">
<source>Device required</source>
</trans-unit>
<trans-unit id="s6df8326edea3b23d">
<source>If no device was provided, this stage will stop flow execution.</source>
</trans-unit>
<trans-unit id="s506c7d2e87f6770e">
<source>Filename can only contain letters, numbers, dots, hyphens, and underscores</source>
</trans-unit>
<trans-unit id="s3a3d5b2575cd32ea">
<source>File uploaded successfully</source>
</trans-unit>
<trans-unit id="sd3775ef947e0de32">
<source>File Name</source>
</trans-unit>
<trans-unit id="s1afc99a84a890514">
<source>Type an optional custom file name...</source>
</trans-unit>
<trans-unit id="sb40e2763045466ea">
<source>Optionally rename the file (without extension). Leave empty to keep the original filename.</source>
</trans-unit>
<trans-unit id="s803ce7e1a2294d50">
<source>Files</source>
</trans-unit>
<trans-unit id="s42d82601762f5321">
<source>Manage uploaded files.</source>
</trans-unit>
<trans-unit id="saad01178f02a6a23">
<source>file</source>
</trans-unit>
<trans-unit id="s69f800801812a5f0">
<source>files</source>
</trans-unit>
<trans-unit id="s96668830629e0dfc">
<source>Upload</source>
</trans-unit>
<trans-unit id="sa32e9d0a108ee802">
<source>Upload File</source>
</trans-unit>
<trans-unit id="s95094b57684716a5">
<source>Failed to validate device.</source>
</trans-unit>
<trans-unit id="se99d25eb70c767ef">
<source>Verifying your device...</source>
</trans-unit>
</body>
</file>
</xliff>

View File

@@ -1,6 +1,93 @@
<?xml version="1.0"?><xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" version="1.2">
<file target-language="ja_JP" source-language="en" original="lit-localize-inputs" datatype="plaintext">
<file target-language="ja-JP" source-language="en" original="lit-localize-inputs" datatype="plaintext">
<body>
<!-- #region Locales -->
<trans-unit id="en">
<source>English</source>
<target>英語</target>
</trans-unit>
<trans-unit id="pseudo-LOCALE">
<source>Pseudolocale</source>
<target>疑似言語</target>
</trans-unit>
<trans-unit id="cs-CZ">
<source>Czech</source>
<target>チェコ語</target>
</trans-unit>
<trans-unit id="de-DE">
<source>German</source>
<target>ドイツ語</target>
</trans-unit>
<trans-unit id="es-ES">
<source>Spanish</source>
<target>スペイン語</target>
</trans-unit>
<trans-unit id="fi-FI">
<source>Finnish</source>
<target>フィンランド語</target>
</trans-unit>
<trans-unit id="fr-FR">
<source>French</source>
<target>フランス語</target>
</trans-unit>
<trans-unit id="it-IT">
<source>Italian</source>
<target>イタリア語</target>
</trans-unit>
<trans-unit id="ja-JP">
<source>Japanese</source>
<target>日本語</target>
</trans-unit>
<trans-unit id="ko-KR">
<source>Korean</source>
<target>韓国語</target>
</trans-unit>
<trans-unit id="nl-NL">
<source>Dutch</source>
<target>オランダ語</target>
</trans-unit>
<trans-unit id="pl-PL">
<source>Polish</source>
<target>ポーランド語</target>
</trans-unit>
<trans-unit id="pt-BR">
<source>Portuguese</source>
<target>ポルトガル語</target>
</trans-unit>
<trans-unit id="ru-RU">
<source>Russian</source>
<target>ロシア語</target>
</trans-unit>
<trans-unit id="tr-TR">
<source>Turkish</source>
<target>トルコ語</target>
</trans-unit>
<trans-unit id="zh-Hans">
<source>Chinese Simplified</source>
<target>中国語簡体字</target>
</trans-unit>
<trans-unit id="zh-Hant">
<source>Chinese Traditional</source>
<target>中国語繁体字</target>
</trans-unit>
<!-- #endregion -->
<!-- #region Locale selector -->
<trans-unit id="locale-auto-detect-option">
<source>Auto-detect</source>
<target>自動検出</target>
<note from="lit-localize">Label for the auto-detect locale option in language selection dropdown</note>
</trans-unit>
<trans-unit id="language-selector-label">
<source>Select language</source>
<note from="lit-localize">Label for the language selection dropdown</note>
</trans-unit>
<trans-unit id="locale-option-localized-label">
<source><x id="0" equiv-text="${localeLabel}"/> (<x id="1" equiv-text="${translatedLabel}"/>)</source>
<note from="lit-localize">Locale option label showing the localized language name along with the native language name in parentheses. The first placeholder is the localized language name, the second is the native language name.</note>
</trans-unit>
<!-- #endregion -->
<trans-unit id="s12d6dde9b30c3093">
<source>Dismiss</source>
<target>閉じる</target>
@@ -3147,18 +3234,6 @@
<source>Icon</source>
<target>アイコン</target>
</trans-unit>
<trans-unit id="s67e20cd8018d7e3c">
<source>Currently set to:</source>
<target>現在の設定:</target>
</trans-unit>
<trans-unit id="s80e6d6fe5ad458d3">
<source>Clear icon</source>
<target>アイコンをクリア</target>
</trans-unit>
<trans-unit id="s485c05d34eb00415">
<source>Delete currently set icon.</source>
<target>設定されているアイコンを削除します。</target>
</trans-unit>
<trans-unit id="s6d3b4d0561ba1cff">
<source>Publisher</source>
<target>公開者</target>
@@ -4381,12 +4456,6 @@ doesn't pass when either or both of the selected options are equal or above the
<source>Click to change value</source>
<target>クリックして値を変更</target>
</trans-unit>
<trans-unit id="se17f29e830ebf9be">
<source>Successfully updated connector.</source>
</trans-unit>
<trans-unit id="s6da88527f3e5e513">
<source>Successfully created connector.</source>
</trans-unit>
<trans-unit id="s6a087e34edeadc1f">
<source>Connector name...</source>
</trans-unit>
@@ -4436,9 +4505,6 @@ doesn't pass when either or both of the selected options are equal or above the
<trans-unit id="s80b0feb2a6b98ef9">
<source>Connectors</source>
</trans-unit>
<trans-unit id="s7e840add1b48d751">
<source>Configure how devices communicate with authentik and external sources device data is fetched from.</source>
</trans-unit>
<trans-unit id="s58d0ed0cc064ec4f">
<source>Update Connector</source>
</trans-unit>
@@ -6405,69 +6471,10 @@ doesn't pass when either or both of the selected options are equal or above the
<source>Warning: No invitation stage is bound to any flow. Invitations will not work as expected.</source>
<target>警告: 招待段階がどのフローにもバインドされていません。招待は期待どおりに機能しません。</target>
</trans-unit>
<trans-unit id="s2da4aa7a9abeb653">
<source>Pseudolocale (for testing)</source>
<target>疑似ロケール(テスト用)</target>
</trans-unit>
<trans-unit id="s63e71d20d1eaca93">
<source>German</source>
<target>ドイツ語</target>
</trans-unit>
<trans-unit id="s4caed5b7a7e5d89b">
<source>English</source>
<target>英語</target>
</trans-unit>
<trans-unit id="sf1868dc19e3917bb">
<source>Spanish</source>
<target>スペイン語</target>
</trans-unit>
<trans-unit id="s75a27f43413e02c5">
<source>French</source>
<target>フランス語</target>
</trans-unit>
<trans-unit id="sd48cc52117f4d68b">
<source>Italian</source>
<target>イタリア語</target>
</trans-unit>
<trans-unit id="sdd35b688281b6dea">
<source>Japanese</source>
</trans-unit>
<trans-unit id="s94d61907ee22a8c1">
<source>Korean</source>
<target>韓国語</target>
</trans-unit>
<trans-unit id="s95d56e58f816d211">
<source>Dutch</source>
<target>オランダ語</target>
</trans-unit>
<trans-unit id="s03f49e598ffb11cc">
<source>Polish</source>
<target>ポーランド語</target>
</trans-unit>
<trans-unit id="sa30c12014e955946">
<source>Russian</source>
<target>ロシア語</target>
</trans-unit>
<trans-unit id="s9d2d00982edafabb">
<source>Turkish</source>
<target>トルコ語</target>
</trans-unit>
<trans-unit id="s354e0a9f146d2869">
<source>Chinese (simplified)</source>
<target>中国語(簡体字)</target>
</trans-unit>
<trans-unit id="se3e6af2ce24d80e8">
<source>Chinese (traditional)</source>
<target>中国語(繁体字)</target>
</trans-unit>
<trans-unit id="s8939f574b096054a">
<source>Not you?</source>
<target>あなたではありませんか?</target>
</trans-unit>
<trans-unit id="s2f995efbb1e46b18">
<source>Auto-detect (based on your browser)</source>
<target>自動検出(ブラウザに基づく)</target>
</trans-unit>
<trans-unit id="s296fbffaaa7c910a">
<source>Required.</source>
<target>必須。</target>
@@ -7915,14 +7922,6 @@ doesn't pass when either or both of the selected options are equal or above the
<source>Background shown during execution.</source>
<target>実行中に表示される背景。</target>
</trans-unit>
<trans-unit id="s3ebf4c166058afce">
<source>Clear background</source>
<target>背景をクリア</target>
</trans-unit>
<trans-unit id="sb24755ea94bef31d">
<source>Delete currently set background image.</source>
<target>現在設定されている背景画像を削除します。</target>
</trans-unit>
<trans-unit id="sb904f23f17b60c3a">
<source>Successfully imported flow.</source>
<target>フローをインポートしました。</target>
@@ -9031,9 +9030,6 @@ Bindings to groups/users are checked against the user of the event.</source>
<trans-unit id="s0393ac07cf8a3097">
<source>Endpoint Devices</source>
</trans-unit>
<trans-unit id="s02d57c823e493fe9">
<source>Device groups</source>
</trans-unit>
<trans-unit id="s4f1ad6b48a5df506">
<source>Logs</source>
<target>ログ</target>
@@ -9864,6 +9860,111 @@ Bindings to groups/users are checked against the user of the event.</source>
<target>...</target>
<note from="lit-localize">Truncation ellipsis</note>
</trans-unit>
<trans-unit id="s6cd96061d397f7b5">
<source>Via <x id="0" equiv-text="${event.context.device.name}"/></source>
</trans-unit>
<trans-unit id="sb7ff80582ccd9348">
<source>reference will be left dangling</source>
</trans-unit>
<trans-unit id="s0b7ddc0168e79ea2">
<source>Failed to fetch files</source>
</trans-unit>
<trans-unit id="sdc4f1cfd587212b4">
<source>You can also enter a URL (https://...), Font Awesome icon (fa://fa-icon-name), or upload a new file.</source>
</trans-unit>
<trans-unit id="s8015ac3b47172dc8">
<source>Select from uploaded files, or type a Font Awesome icon (fa://fa-icon-name) or URL.</source>
</trans-unit>
<trans-unit id="s87616130c08b117c">
<source>This type is deprecated.</source>
</trans-unit>
<trans-unit id="s40f4c2223ce87751">
<source>No connectors configured. Navigate to Connectors in the sidebar and first create a connector.</source>
</trans-unit>
<trans-unit id="s70c2cd89201ecca9">
<source>Home directory</source>
</trans-unit>
<trans-unit id="sb171d638b8af660d">
<source>Successfully updated agent connector.</source>
</trans-unit>
<trans-unit id="s81c9554908463f94">
<source>Successfully created agent connector.</source>
</trans-unit>
<trans-unit id="s306dd51d3be07bc7">
<source>Device compliance settings</source>
</trans-unit>
<trans-unit id="sc2966702517b7af5">
<source>Challenge certificate</source>
</trans-unit>
<trans-unit id="s051588c63fedab5f">
<source>Challenge idle timeout</source>
</trans-unit>
<trans-unit id="s4c70d7629e29ac2d">
<source>Duration the flow executor will wait before continuing without a response.</source>
</trans-unit>
<trans-unit id="se3c7fb54006d9e98">
<source>Trigger check-in on device</source>
</trans-unit>
<trans-unit id="se0a747f4db08e87f">
<source>Configure how devices connect with authentik and ingest external device data.</source>
</trans-unit>
<trans-unit id="s114f2b310ef163ff">
<source>Stage which associates the currently used device with the current session.</source>
</trans-unit>
<trans-unit id="s8290d08ab5a49ed0">
<source>Connector</source>
</trans-unit>
<trans-unit id="s5e8eefcbbeffd4d5">
<source>Device optional</source>
</trans-unit>
<trans-unit id="s51b09bba5dcc19b0">
<source>If no device was provided, this stage will succeed and continue to the next stage.</source>
</trans-unit>
<trans-unit id="s5f58e358343a5514">
<source>Device required</source>
</trans-unit>
<trans-unit id="s6df8326edea3b23d">
<source>If no device was provided, this stage will stop flow execution.</source>
</trans-unit>
<trans-unit id="s506c7d2e87f6770e">
<source>Filename can only contain letters, numbers, dots, hyphens, and underscores</source>
</trans-unit>
<trans-unit id="s3a3d5b2575cd32ea">
<source>File uploaded successfully</source>
</trans-unit>
<trans-unit id="sd3775ef947e0de32">
<source>File Name</source>
</trans-unit>
<trans-unit id="s1afc99a84a890514">
<source>Type an optional custom file name...</source>
</trans-unit>
<trans-unit id="sb40e2763045466ea">
<source>Optionally rename the file (without extension). Leave empty to keep the original filename.</source>
</trans-unit>
<trans-unit id="s803ce7e1a2294d50">
<source>Files</source>
</trans-unit>
<trans-unit id="s42d82601762f5321">
<source>Manage uploaded files.</source>
</trans-unit>
<trans-unit id="saad01178f02a6a23">
<source>file</source>
</trans-unit>
<trans-unit id="s69f800801812a5f0">
<source>files</source>
</trans-unit>
<trans-unit id="s96668830629e0dfc">
<source>Upload</source>
</trans-unit>
<trans-unit id="sa32e9d0a108ee802">
<source>Upload File</source>
</trans-unit>
<trans-unit id="s95094b57684716a5">
<source>Failed to validate device.</source>
</trans-unit>
<trans-unit id="se99d25eb70c767ef">
<source>Verifying your device...</source>
</trans-unit>
</body>
</file>
</xliff>

View File

@@ -1,6 +1,94 @@
<?xml version="1.0"?><xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" version="1.2">
<file target-language="ko_KR" source-language="en" original="lit-localize-inputs" datatype="plaintext">
<file target-language="ko-KR" source-language="en" original="lit-localize-inputs" datatype="plaintext">
<body>
<!-- #region Locales -->
<trans-unit id="en">
<source>English</source>
<target>영어</target>
</trans-unit>
<trans-unit id="pseudo-LOCALE">
<source>Pseudolocale</source>
<target>의사언어</target>
</trans-unit>
<trans-unit id="cs-CZ">
<source>Czech</source>
<target>체코어</target>
</trans-unit>
<trans-unit id="de-DE">
<source>German</source>
<target>독일어</target>
</trans-unit>
<trans-unit id="es-ES">
<source>Spanish</source>
<target>스페인어</target>
</trans-unit>
<trans-unit id="fi-FI">
<source>Finnish</source>
<target>핀란드어</target>
</trans-unit>
<trans-unit id="fr-FR">
<source>French</source>
<target>프랑스어</target>
</trans-unit>
<trans-unit id="it-IT">
<source>Italian</source>
<target>이탈리아어</target>
</trans-unit>
<trans-unit id="ja-JP">
<source>Japanese</source>
<target>일본어</target>
</trans-unit>
<trans-unit id="ko-KR">
<source>Korean</source>
<target>한국어</target>
</trans-unit>
<trans-unit id="nl-NL">
<source>Dutch</source>
<target>네덜란드어</target>
</trans-unit>
<trans-unit id="pl-PL">
<source>Polish</source>
<target>폴란드어</target>
</trans-unit>
<trans-unit id="pt-BR">
<source>Portuguese</source>
<target>포르투갈어</target>
</trans-unit>
<trans-unit id="ru-RU">
<source>Russian</source>
<target>러시아어</target>
</trans-unit>
<trans-unit id="tr-TR">
<source>Turkish</source>
<target>터키어</target>
</trans-unit>
<trans-unit id="zh-Hans">
<source>Chinese Simplified</source>
<target>중국어</target>
</trans-unit>
<trans-unit id="zh-Hant">
<source>Chinese Traditional</source>
<target>중국어</target>
</trans-unit>
<!-- #endregion -->
<!-- #region Locale selector -->
<trans-unit id="locale-auto-detect-option">
<source>Auto-detect</source>
<target>자동 감지</target>
<note from="lit-localize">Label for the auto-detect locale option in language selection dropdown</note>
</trans-unit>
<trans-unit id="language-selector-label">
<source>Select language</source>
<target>언어 선택</target>
<note from="lit-localize">Label for the language selection dropdown</note>
</trans-unit>
<trans-unit id="locale-option-localized-label">
<source><x id="0" equiv-text="${localeLabel}"/> (<x id="1" equiv-text="${translatedLabel}"/>)</source>
<note from="lit-localize">Locale option label showing the localized language name along with the native language name in parentheses. The first placeholder is the localized language name, the second is the native language name.</note>
</trans-unit>
<!-- #endregion -->
<trans-unit id="s12d6dde9b30c3093">
<source>Dismiss</source>
<target>무시</target>
@@ -2897,18 +2985,6 @@
<source>Icon</source>
<target>아이콘</target>
</trans-unit>
<trans-unit id="s67e20cd8018d7e3c">
<source>Currently set to:</source>
<target>현재 다음으로 설정됨:</target>
</trans-unit>
<trans-unit id="s80e6d6fe5ad458d3">
<source>Clear icon</source>
<target>아이콘 삭제</target>
</trans-unit>
<trans-unit id="s485c05d34eb00415">
<source>Delete currently set icon.</source>
<target>현재 설정한 아이콘을 삭제합니다.</target>
</trans-unit>
<trans-unit id="s6d3b4d0561ba1cff">
<source>Publisher</source>
<target>발행인</target>
@@ -4042,12 +4118,6 @@ doesn't pass when either or both of the selected options are equal or above the
<source>Click to change value</source>
<target>클릭하여 값 변경</target>
</trans-unit>
<trans-unit id="se17f29e830ebf9be">
<source>Successfully updated connector.</source>
</trans-unit>
<trans-unit id="s6da88527f3e5e513">
<source>Successfully created connector.</source>
</trans-unit>
<trans-unit id="s6a087e34edeadc1f">
<source>Connector name...</source>
</trans-unit>
@@ -4097,9 +4167,6 @@ doesn't pass when either or both of the selected options are equal or above the
<trans-unit id="s80b0feb2a6b98ef9">
<source>Connectors</source>
</trans-unit>
<trans-unit id="s7e840add1b48d751">
<source>Configure how devices communicate with authentik and external sources device data is fetched from.</source>
</trans-unit>
<trans-unit id="s58d0ed0cc064ec4f">
<source>Update Connector</source>
</trans-unit>
@@ -5938,67 +6005,10 @@ doesn't pass when either or both of the selected options are equal or above the
<source>Warning: No invitation stage is bound to any flow. Invitations will not work as expected.</source>
<target>경고: 초대 스테이지는 어떤 플로우에도 바인딩 되어있지 않습니다. 초대가 예상대로 작동하지 않을 수 있습니다.</target>
</trans-unit>
<trans-unit id="s2da4aa7a9abeb653">
<source>Pseudolocale (for testing)</source>
<target>가짜-로캘 (테스트용)</target>
</trans-unit>
<trans-unit id="s63e71d20d1eaca93">
<source>German</source>
<target>독일어</target>
</trans-unit>
<trans-unit id="s4caed5b7a7e5d89b">
<source>English</source>
<target>영어</target>
</trans-unit>
<trans-unit id="sf1868dc19e3917bb">
<source>Spanish</source>
<target>스페인어</target>
</trans-unit>
<trans-unit id="s75a27f43413e02c5">
<source>French</source>
<target>프랑스어</target>
</trans-unit>
<trans-unit id="sd48cc52117f4d68b">
<source>Italian</source>
</trans-unit>
<trans-unit id="sdd35b688281b6dea">
<source>Japanese</source>
</trans-unit>
<trans-unit id="s94d61907ee22a8c1">
<source>Korean</source>
<target>한국어</target>
</trans-unit>
<trans-unit id="s95d56e58f816d211">
<source>Dutch</source>
</trans-unit>
<trans-unit id="s03f49e598ffb11cc">
<source>Polish</source>
<target>폴란드어</target>
</trans-unit>
<trans-unit id="sa30c12014e955946">
<source>Russian</source>
<target>러시아어</target>
</trans-unit>
<trans-unit id="s9d2d00982edafabb">
<source>Turkish</source>
<target>터키어</target>
</trans-unit>
<trans-unit id="s354e0a9f146d2869">
<source>Chinese (simplified)</source>
<target>중국어 (간체)</target>
</trans-unit>
<trans-unit id="se3e6af2ce24d80e8">
<source>Chinese (traditional)</source>
<target>중국어 (번체)</target>
</trans-unit>
<trans-unit id="s8939f574b096054a">
<source>Not you?</source>
<target>본인이 아닌가요?</target>
</trans-unit>
<trans-unit id="s2f995efbb1e46b18">
<source>Auto-detect (based on your browser)</source>
<target>자동-감지 (브라우저 기반)</target>
</trans-unit>
<trans-unit id="s296fbffaaa7c910a">
<source>Required.</source>
<target>필수.</target>
@@ -7372,14 +7382,6 @@ doesn't pass when either or both of the selected options are equal or above the
<source>Background shown during execution.</source>
<target>실행 중 배경이 표시됩니다.</target>
</trans-unit>
<trans-unit id="s3ebf4c166058afce">
<source>Clear background</source>
<target>배경 지우기</target>
</trans-unit>
<trans-unit id="sb24755ea94bef31d">
<source>Delete currently set background image.</source>
<target>현재 설정된 배경 이미지를 삭제합니다.</target>
</trans-unit>
<trans-unit id="sb904f23f17b60c3a">
<source>Successfully imported flow.</source>
<target>플로우를 성공적으로 가져왔습니다.</target>
@@ -8415,9 +8417,6 @@ Bindings to groups/users are checked against the user of the event.</source>
<trans-unit id="s0393ac07cf8a3097">
<source>Endpoint Devices</source>
</trans-unit>
<trans-unit id="s02d57c823e493fe9">
<source>Device groups</source>
</trans-unit>
<trans-unit id="s4f1ad6b48a5df506">
<source>Logs</source>
<target>로그</target>
@@ -9170,6 +9169,111 @@ Bindings to groups/users are checked against the user of the event.</source>
<source>...</source>
<note from="lit-localize">Truncation ellipsis</note>
</trans-unit>
<trans-unit id="s6cd96061d397f7b5">
<source>Via <x id="0" equiv-text="${event.context.device.name}"/></source>
</trans-unit>
<trans-unit id="sb7ff80582ccd9348">
<source>reference will be left dangling</source>
</trans-unit>
<trans-unit id="s0b7ddc0168e79ea2">
<source>Failed to fetch files</source>
</trans-unit>
<trans-unit id="sdc4f1cfd587212b4">
<source>You can also enter a URL (https://...), Font Awesome icon (fa://fa-icon-name), or upload a new file.</source>
</trans-unit>
<trans-unit id="s8015ac3b47172dc8">
<source>Select from uploaded files, or type a Font Awesome icon (fa://fa-icon-name) or URL.</source>
</trans-unit>
<trans-unit id="s87616130c08b117c">
<source>This type is deprecated.</source>
</trans-unit>
<trans-unit id="s40f4c2223ce87751">
<source>No connectors configured. Navigate to Connectors in the sidebar and first create a connector.</source>
</trans-unit>
<trans-unit id="s70c2cd89201ecca9">
<source>Home directory</source>
</trans-unit>
<trans-unit id="sb171d638b8af660d">
<source>Successfully updated agent connector.</source>
</trans-unit>
<trans-unit id="s81c9554908463f94">
<source>Successfully created agent connector.</source>
</trans-unit>
<trans-unit id="s306dd51d3be07bc7">
<source>Device compliance settings</source>
</trans-unit>
<trans-unit id="sc2966702517b7af5">
<source>Challenge certificate</source>
</trans-unit>
<trans-unit id="s051588c63fedab5f">
<source>Challenge idle timeout</source>
</trans-unit>
<trans-unit id="s4c70d7629e29ac2d">
<source>Duration the flow executor will wait before continuing without a response.</source>
</trans-unit>
<trans-unit id="se3c7fb54006d9e98">
<source>Trigger check-in on device</source>
</trans-unit>
<trans-unit id="se0a747f4db08e87f">
<source>Configure how devices connect with authentik and ingest external device data.</source>
</trans-unit>
<trans-unit id="s114f2b310ef163ff">
<source>Stage which associates the currently used device with the current session.</source>
</trans-unit>
<trans-unit id="s8290d08ab5a49ed0">
<source>Connector</source>
</trans-unit>
<trans-unit id="s5e8eefcbbeffd4d5">
<source>Device optional</source>
</trans-unit>
<trans-unit id="s51b09bba5dcc19b0">
<source>If no device was provided, this stage will succeed and continue to the next stage.</source>
</trans-unit>
<trans-unit id="s5f58e358343a5514">
<source>Device required</source>
</trans-unit>
<trans-unit id="s6df8326edea3b23d">
<source>If no device was provided, this stage will stop flow execution.</source>
</trans-unit>
<trans-unit id="s506c7d2e87f6770e">
<source>Filename can only contain letters, numbers, dots, hyphens, and underscores</source>
</trans-unit>
<trans-unit id="s3a3d5b2575cd32ea">
<source>File uploaded successfully</source>
</trans-unit>
<trans-unit id="sd3775ef947e0de32">
<source>File Name</source>
</trans-unit>
<trans-unit id="s1afc99a84a890514">
<source>Type an optional custom file name...</source>
</trans-unit>
<trans-unit id="sb40e2763045466ea">
<source>Optionally rename the file (without extension). Leave empty to keep the original filename.</source>
</trans-unit>
<trans-unit id="s803ce7e1a2294d50">
<source>Files</source>
</trans-unit>
<trans-unit id="s42d82601762f5321">
<source>Manage uploaded files.</source>
</trans-unit>
<trans-unit id="saad01178f02a6a23">
<source>file</source>
</trans-unit>
<trans-unit id="s69f800801812a5f0">
<source>files</source>
</trans-unit>
<trans-unit id="s96668830629e0dfc">
<source>Upload</source>
</trans-unit>
<trans-unit id="sa32e9d0a108ee802">
<source>Upload File</source>
</trans-unit>
<trans-unit id="s95094b57684716a5">
<source>Failed to validate device.</source>
</trans-unit>
<trans-unit id="se99d25eb70c767ef">
<source>Verifying your device...</source>
</trans-unit>
</body>
</file>
</xliff>

View File

@@ -1,6 +1,94 @@
<?xml version="1.0"?><xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" version="1.2">
<file target-language="nl_NL" source-language="en" original="lit-localize-inputs" datatype="plaintext">
<file target-language="nl-NL" source-language="en" original="lit-localize-inputs" datatype="plaintext">
<body>
<!-- #region Locales -->
<trans-unit id="en">
<source>English</source>
<target>Engels</target>
</trans-unit>
<trans-unit id="pseudo-LOCALE">
<source>Pseudolocale</source>
<target>Pseudotaal</target>
</trans-unit>
<trans-unit id="cs-CZ">
<source>Czech</source>
<target>Tsjechisch</target>
</trans-unit>
<trans-unit id="de-DE">
<source>German</source>
<target>Duits</target>
</trans-unit>
<trans-unit id="es-ES">
<source>Spanish</source>
<target>Spaans</target>
</trans-unit>
<trans-unit id="fi-FI">
<source>Finnish</source>
<target>Fins</target>
</trans-unit>
<trans-unit id="fr-FR">
<source>French</source>
<target>Frans</target>
</trans-unit>
<trans-unit id="it-IT">
<source>Italian</source>
<target>Italiaans</target>
</trans-unit>
<trans-unit id="ja-JP">
<source>Japanese</source>
<target>Japans</target>
</trans-unit>
<trans-unit id="ko-KR">
<source>Korean</source>
<target>Koreaans</target>
</trans-unit>
<trans-unit id="nl-NL">
<source>Dutch</source>
<target>Nederlands</target>
</trans-unit>
<trans-unit id="pl-PL">
<source>Polish</source>
<target>Pools</target>
</trans-unit>
<trans-unit id="pt-BR">
<source>Portuguese</source>
<target>Portugees</target>
</trans-unit>
<trans-unit id="ru-RU">
<source>Russian</source>
<target>Russisch</target>
</trans-unit>
<trans-unit id="tr-TR">
<source>Turkish</source>
<target>Turks</target>
</trans-unit>
<trans-unit id="zh-Hans">
<source>Chinese Simplified</source>
<target>Chinees</target>
</trans-unit>
<trans-unit id="zh-Hant">
<source>Chinese Traditional</source>
<target>Chinees</target>
</trans-unit>
<!-- #endregion -->
<!-- #region Locale selector -->
<trans-unit id="locale-auto-detect-option">
<source>Auto-detect</source>
<target>Automatische detectie</target>
<note from="lit-localize">Label for the auto-detect locale option in language selection dropdown</note>
</trans-unit>
<trans-unit id="language-selector-label">
<source>Select language</source>
<target>Taal selecteren</target>
<note from="lit-localize">Label for the language selection dropdown</note>
</trans-unit>
<trans-unit id="locale-option-localized-label">
<source><x id="0" equiv-text="${localeLabel}"/> (<x id="1" equiv-text="${translatedLabel}"/>)</source>
<note from="lit-localize">Locale option label showing the localized language name along with the native language name in parentheses. The first placeholder is the localized language name, the second is the native language name.</note>
</trans-unit>
<!-- #endregion -->
<trans-unit id="s12d6dde9b30c3093">
<source>Dismiss</source>
</trans-unit>
@@ -2759,18 +2847,6 @@
<source>Icon</source>
<target>Pictogram</target>
</trans-unit>
<trans-unit id="s67e20cd8018d7e3c">
<source>Currently set to:</source>
<target>Momenteel ingesteld op:</target>
</trans-unit>
<trans-unit id="s80e6d6fe5ad458d3">
<source>Clear icon</source>
<target>Pictogram wissen</target>
</trans-unit>
<trans-unit id="s485c05d34eb00415">
<source>Delete currently set icon.</source>
<target>Huidig ingesteld pictogram verwijderen.</target>
</trans-unit>
<trans-unit id="s6d3b4d0561ba1cff">
<source>Publisher</source>
<target>Uitgever</target>
@@ -3873,12 +3949,6 @@ slaagt niet wanneer een of beide geselecteerde opties gelijk zijn aan of boven d
<source>Click to change value</source>
<target>Klik om de waarde te wijzigen</target>
</trans-unit>
<trans-unit id="se17f29e830ebf9be">
<source>Successfully updated connector.</source>
</trans-unit>
<trans-unit id="s6da88527f3e5e513">
<source>Successfully created connector.</source>
</trans-unit>
<trans-unit id="s6a087e34edeadc1f">
<source>Connector name...</source>
</trans-unit>
@@ -3928,9 +3998,6 @@ slaagt niet wanneer een of beide geselecteerde opties gelijk zijn aan of boven d
<trans-unit id="s80b0feb2a6b98ef9">
<source>Connectors</source>
</trans-unit>
<trans-unit id="s7e840add1b48d751">
<source>Configure how devices communicate with authentik and external sources device data is fetched from.</source>
</trans-unit>
<trans-unit id="s58d0ed0cc064ec4f">
<source>Update Connector</source>
</trans-unit>
@@ -5692,64 +5759,10 @@ slaagt niet wanneer een of beide geselecteerde opties gelijk zijn aan of boven d
<source>Warning: No invitation stage is bound to any flow. Invitations will not work as expected.</source>
<target>Waarschuwing: Geen uitnodigingsfase is gekoppeld aan een flow. Uitnodigingen werken niet zoals verwacht.</target>
</trans-unit>
<trans-unit id="s2da4aa7a9abeb653">
<source>Pseudolocale (for testing)</source>
</trans-unit>
<trans-unit id="s63e71d20d1eaca93">
<source>German</source>
<target>Duits</target>
</trans-unit>
<trans-unit id="s4caed5b7a7e5d89b">
<source>English</source>
<target>Engels</target>
</trans-unit>
<trans-unit id="sf1868dc19e3917bb">
<source>Spanish</source>
<target>Spaans</target>
</trans-unit>
<trans-unit id="s75a27f43413e02c5">
<source>French</source>
<target>Frans</target>
</trans-unit>
<trans-unit id="sd48cc52117f4d68b">
<source>Italian</source>
</trans-unit>
<trans-unit id="sdd35b688281b6dea">
<source>Japanese</source>
</trans-unit>
<trans-unit id="s94d61907ee22a8c1">
<source>Korean</source>
</trans-unit>
<trans-unit id="s95d56e58f816d211">
<source>Dutch</source>
</trans-unit>
<trans-unit id="s03f49e598ffb11cc">
<source>Polish</source>
<target>Pools</target>
</trans-unit>
<trans-unit id="sa30c12014e955946">
<source>Russian</source>
</trans-unit>
<trans-unit id="s9d2d00982edafabb">
<source>Turkish</source>
<target>Turks</target>
</trans-unit>
<trans-unit id="s354e0a9f146d2869">
<source>Chinese (simplified)</source>
<target>Chinees (vereenvoudigd)</target>
</trans-unit>
<trans-unit id="se3e6af2ce24d80e8">
<source>Chinese (traditional)</source>
<target>Chinees (traditioneel)</target>
</trans-unit>
<trans-unit id="s8939f574b096054a">
<source>Not you?</source>
<target>Niet uzelf?</target>
</trans-unit>
<trans-unit id="s2f995efbb1e46b18">
<source>Auto-detect (based on your browser)</source>
<target>Automatische detectie (op basis van je browser)</target>
</trans-unit>
<trans-unit id="s296fbffaaa7c910a">
<source>Required.</source>
<target>Vereist.</target>
@@ -7081,14 +7094,6 @@ slaagt niet wanneer een of beide geselecteerde opties gelijk zijn aan of boven d
<source>Background shown during execution.</source>
<target>Achtergrond weergegeven tijdens uitvoering.</target>
</trans-unit>
<trans-unit id="s3ebf4c166058afce">
<source>Clear background</source>
<target>Wis achtergrond</target>
</trans-unit>
<trans-unit id="sb24755ea94bef31d">
<source>Delete currently set background image.</source>
<target>Verwijder momenteel ingestelde achtergrondafbeelding.</target>
</trans-unit>
<trans-unit id="sb904f23f17b60c3a">
<source>Successfully imported flow.</source>
<target>Flow succesvol geïmporteerd.</target>
@@ -8081,9 +8086,6 @@ Bindingen naar groepen/gebruikers worden gecontroleerd tegen de gebruiker van de
<trans-unit id="s0393ac07cf8a3097">
<source>Endpoint Devices</source>
</trans-unit>
<trans-unit id="s02d57c823e493fe9">
<source>Device groups</source>
</trans-unit>
<trans-unit id="s4f1ad6b48a5df506">
<source>Logs</source>
<target>Logboeken</target>
@@ -8806,6 +8808,111 @@ Bindingen naar groepen/gebruikers worden gecontroleerd tegen de gebruiker van de
<source>...</source>
<note from="lit-localize">Truncation ellipsis</note>
</trans-unit>
<trans-unit id="s6cd96061d397f7b5">
<source>Via <x id="0" equiv-text="${event.context.device.name}"/></source>
</trans-unit>
<trans-unit id="sb7ff80582ccd9348">
<source>reference will be left dangling</source>
</trans-unit>
<trans-unit id="s0b7ddc0168e79ea2">
<source>Failed to fetch files</source>
</trans-unit>
<trans-unit id="sdc4f1cfd587212b4">
<source>You can also enter a URL (https://...), Font Awesome icon (fa://fa-icon-name), or upload a new file.</source>
</trans-unit>
<trans-unit id="s8015ac3b47172dc8">
<source>Select from uploaded files, or type a Font Awesome icon (fa://fa-icon-name) or URL.</source>
</trans-unit>
<trans-unit id="s87616130c08b117c">
<source>This type is deprecated.</source>
</trans-unit>
<trans-unit id="s40f4c2223ce87751">
<source>No connectors configured. Navigate to Connectors in the sidebar and first create a connector.</source>
</trans-unit>
<trans-unit id="s70c2cd89201ecca9">
<source>Home directory</source>
</trans-unit>
<trans-unit id="sb171d638b8af660d">
<source>Successfully updated agent connector.</source>
</trans-unit>
<trans-unit id="s81c9554908463f94">
<source>Successfully created agent connector.</source>
</trans-unit>
<trans-unit id="s306dd51d3be07bc7">
<source>Device compliance settings</source>
</trans-unit>
<trans-unit id="sc2966702517b7af5">
<source>Challenge certificate</source>
</trans-unit>
<trans-unit id="s051588c63fedab5f">
<source>Challenge idle timeout</source>
</trans-unit>
<trans-unit id="s4c70d7629e29ac2d">
<source>Duration the flow executor will wait before continuing without a response.</source>
</trans-unit>
<trans-unit id="se3c7fb54006d9e98">
<source>Trigger check-in on device</source>
</trans-unit>
<trans-unit id="se0a747f4db08e87f">
<source>Configure how devices connect with authentik and ingest external device data.</source>
</trans-unit>
<trans-unit id="s114f2b310ef163ff">
<source>Stage which associates the currently used device with the current session.</source>
</trans-unit>
<trans-unit id="s8290d08ab5a49ed0">
<source>Connector</source>
</trans-unit>
<trans-unit id="s5e8eefcbbeffd4d5">
<source>Device optional</source>
</trans-unit>
<trans-unit id="s51b09bba5dcc19b0">
<source>If no device was provided, this stage will succeed and continue to the next stage.</source>
</trans-unit>
<trans-unit id="s5f58e358343a5514">
<source>Device required</source>
</trans-unit>
<trans-unit id="s6df8326edea3b23d">
<source>If no device was provided, this stage will stop flow execution.</source>
</trans-unit>
<trans-unit id="s506c7d2e87f6770e">
<source>Filename can only contain letters, numbers, dots, hyphens, and underscores</source>
</trans-unit>
<trans-unit id="s3a3d5b2575cd32ea">
<source>File uploaded successfully</source>
</trans-unit>
<trans-unit id="sd3775ef947e0de32">
<source>File Name</source>
</trans-unit>
<trans-unit id="s1afc99a84a890514">
<source>Type an optional custom file name...</source>
</trans-unit>
<trans-unit id="sb40e2763045466ea">
<source>Optionally rename the file (without extension). Leave empty to keep the original filename.</source>
</trans-unit>
<trans-unit id="s803ce7e1a2294d50">
<source>Files</source>
</trans-unit>
<trans-unit id="s42d82601762f5321">
<source>Manage uploaded files.</source>
</trans-unit>
<trans-unit id="saad01178f02a6a23">
<source>file</source>
</trans-unit>
<trans-unit id="s69f800801812a5f0">
<source>files</source>
</trans-unit>
<trans-unit id="s96668830629e0dfc">
<source>Upload</source>
</trans-unit>
<trans-unit id="sa32e9d0a108ee802">
<source>Upload File</source>
</trans-unit>
<trans-unit id="s95094b57684716a5">
<source>Failed to validate device.</source>
</trans-unit>
<trans-unit id="se99d25eb70c767ef">
<source>Verifying your device...</source>
</trans-unit>
</body>
</file>
</xliff>

View File

@@ -1,6 +1,94 @@
<?xml version="1.0"?><xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" version="1.2">
<file target-language="pl_PL" source-language="en" original="lit-localize-inputs" datatype="plaintext">
<file target-language="pl-PL" source-language="en" original="lit-localize-inputs" datatype="plaintext">
<body>
<!-- #region Locales -->
<trans-unit id="en">
<source>English</source>
<target>Angielski</target>
</trans-unit>
<trans-unit id="pseudo-LOCALE">
<source>Pseudolocale</source>
<target>Pseudojęzyk</target>
</trans-unit>
<trans-unit id="cs-CZ">
<source>Czech</source>
<target>Czeski</target>
</trans-unit>
<trans-unit id="de-DE">
<source>German</source>
<target>Niemiecki</target>
</trans-unit>
<trans-unit id="es-ES">
<source>Spanish</source>
<target>Hiszpański</target>
</trans-unit>
<trans-unit id="fi-FI">
<source>Finnish</source>
<target>Fiński</target>
</trans-unit>
<trans-unit id="fr-FR">
<source>French</source>
<target>Francuski</target>
</trans-unit>
<trans-unit id="it-IT">
<source>Italian</source>
<target>Włoski</target>
</trans-unit>
<trans-unit id="ja-JP">
<source>Japanese</source>
<target>Japoński</target>
</trans-unit>
<trans-unit id="ko-KR">
<source>Korean</source>
<target>Koreański</target>
</trans-unit>
<trans-unit id="nl-NL">
<source>Dutch</source>
<target>Niderlandzki</target>
</trans-unit>
<trans-unit id="pl-PL">
<source>Polish</source>
<target>Polski</target>
</trans-unit>
<trans-unit id="pt-BR">
<source>Portuguese</source>
<target>Portugalski</target>
</trans-unit>
<trans-unit id="ru-RU">
<source>Russian</source>
<target>Rosyjski</target>
</trans-unit>
<trans-unit id="tr-TR">
<source>Turkish</source>
<target>Turecki</target>
</trans-unit>
<trans-unit id="zh-Hans">
<source>Chinese Simplified</source>
<target>Chiński</target>
</trans-unit>
<trans-unit id="zh-Hant">
<source>Chinese Traditional</source>
<target>Chiński</target>
</trans-unit>
<!-- #endregion -->
<!-- #region Locale selector -->
<trans-unit id="locale-auto-detect-option">
<source>Auto-detect</source>
<target>Automatyczne wykrywanie</target>
<note from="lit-localize">Label for the auto-detect locale option in language selection dropdown</note>
</trans-unit>
<trans-unit id="language-selector-label">
<source>Select language</source>
<target>Wybierz język</target>
<note from="lit-localize">Label for the language selection dropdown</note>
</trans-unit>
<trans-unit id="locale-option-localized-label">
<source><x id="0" equiv-text="${localeLabel}"/> (<x id="1" equiv-text="${translatedLabel}"/>)</source>
<note from="lit-localize">Locale option label showing the localized language name along with the native language name in parentheses. The first placeholder is the localized language name, the second is the native language name.</note>
</trans-unit>
<!-- #endregion -->
<trans-unit id="s12d6dde9b30c3093">
<source>Dismiss</source>
</trans-unit>
@@ -2906,18 +2994,6 @@
<source>Icon</source>
<target>Ikona</target>
</trans-unit>
<trans-unit id="s67e20cd8018d7e3c">
<source>Currently set to:</source>
<target>Obecnie ustawiony na:</target>
</trans-unit>
<trans-unit id="s80e6d6fe5ad458d3">
<source>Clear icon</source>
<target>Wyczyść ikonę</target>
</trans-unit>
<trans-unit id="s485c05d34eb00415">
<source>Delete currently set icon.</source>
<target>Usuń aktualnie ustawioną ikonę.</target>
</trans-unit>
<trans-unit id="s6d3b4d0561ba1cff">
<source>Publisher</source>
<target>Wydawca</target>
@@ -4060,12 +4136,6 @@ nie przechodzi, gdy jedna lub obie wybrane opcje są równe lub wyższe od progu
<source>Click to change value</source>
<target>Kliknij, aby zmienić wartość</target>
</trans-unit>
<trans-unit id="se17f29e830ebf9be">
<source>Successfully updated connector.</source>
</trans-unit>
<trans-unit id="s6da88527f3e5e513">
<source>Successfully created connector.</source>
</trans-unit>
<trans-unit id="s6a087e34edeadc1f">
<source>Connector name...</source>
</trans-unit>
@@ -4115,9 +4185,6 @@ nie przechodzi, gdy jedna lub obie wybrane opcje są równe lub wyższe od progu
<trans-unit id="s80b0feb2a6b98ef9">
<source>Connectors</source>
</trans-unit>
<trans-unit id="s7e840add1b48d751">
<source>Configure how devices communicate with authentik and external sources device data is fetched from.</source>
</trans-unit>
<trans-unit id="s58d0ed0cc064ec4f">
<source>Update Connector</source>
</trans-unit>
@@ -5961,68 +6028,10 @@ Można tu używać tylko zasad, ponieważ dostęp jest sprawdzany przed uwierzyt
<source>Warning: No invitation stage is bound to any flow. Invitations will not work as expected.</source>
<target>Ostrzeżenie: żaden etap zaproszenia nie jest powiązany z żadnym przepływem. Zaproszenia nie będą działać zgodnie z oczekiwaniami.</target>
</trans-unit>
<trans-unit id="s2da4aa7a9abeb653">
<source>Pseudolocale (for testing)</source>
<target>Pseudo ustawienia regionalne (do testowania)</target>
</trans-unit>
<trans-unit id="s63e71d20d1eaca93">
<source>German</source>
<target>Niemiecki</target>
</trans-unit>
<trans-unit id="s4caed5b7a7e5d89b">
<source>English</source>
<target>Angielski</target>
</trans-unit>
<trans-unit id="sf1868dc19e3917bb">
<source>Spanish</source>
<target>Hiszpański</target>
</trans-unit>
<trans-unit id="s75a27f43413e02c5">
<source>French</source>
<target>Francuski</target>
</trans-unit>
<trans-unit id="sd48cc52117f4d68b">
<source>Italian</source>
</trans-unit>
<trans-unit id="sdd35b688281b6dea">
<source>Japanese</source>
</trans-unit>
<trans-unit id="s94d61907ee22a8c1">
<source>Korean</source>
<target>Koreański</target>
</trans-unit>
<trans-unit id="s95d56e58f816d211">
<source>Dutch</source>
<target>Holenderski</target>
</trans-unit>
<trans-unit id="s03f49e598ffb11cc">
<source>Polish</source>
<target>Polski</target>
</trans-unit>
<trans-unit id="sa30c12014e955946">
<source>Russian</source>
<target>Rosyjski</target>
</trans-unit>
<trans-unit id="s9d2d00982edafabb">
<source>Turkish</source>
<target>Turecki</target>
</trans-unit>
<trans-unit id="s354e0a9f146d2869">
<source>Chinese (simplified)</source>
<target>Chiński (uproszczony)</target>
</trans-unit>
<trans-unit id="se3e6af2ce24d80e8">
<source>Chinese (traditional)</source>
<target>Chiński (tradycyjny)</target>
</trans-unit>
<trans-unit id="s8939f574b096054a">
<source>Not you?</source>
<target>Nie ty?</target>
</trans-unit>
<trans-unit id="s2f995efbb1e46b18">
<source>Auto-detect (based on your browser)</source>
<target>Automatycznie wykryj (na podstawie Twojej przeglądarki)</target>
</trans-unit>
<trans-unit id="s296fbffaaa7c910a">
<source>Required.</source>
<target>Wymagany.</target>
@@ -7402,14 +7411,6 @@ w toku, tworzony jest nowy użytkownik i zapisywane są do niego dane.</target>
<source>Background shown during execution.</source>
<target>Tło pokazywane podczas wykonywania.</target>
</trans-unit>
<trans-unit id="s3ebf4c166058afce">
<source>Clear background</source>
<target>Wyczyść tło</target>
</trans-unit>
<trans-unit id="sb24755ea94bef31d">
<source>Delete currently set background image.</source>
<target>Usuń aktualnie ustawiony obraz tła.</target>
</trans-unit>
<trans-unit id="sb904f23f17b60c3a">
<source>Successfully imported flow.</source>
<target>Pomyślnie zaimportowano przepływ.</target>
@@ -8458,9 +8459,6 @@ Powiązania z grupami/użytkownikami są sprawdzane względem użytkownika zdarz
<trans-unit id="s0393ac07cf8a3097">
<source>Endpoint Devices</source>
</trans-unit>
<trans-unit id="s02d57c823e493fe9">
<source>Device groups</source>
</trans-unit>
<trans-unit id="s4f1ad6b48a5df506">
<source>Logs</source>
<target>Logi</target>
@@ -9211,6 +9209,111 @@ Powiązania z grupami/użytkownikami są sprawdzane względem użytkownika zdarz
<source>...</source>
<note from="lit-localize">Truncation ellipsis</note>
</trans-unit>
<trans-unit id="s6cd96061d397f7b5">
<source>Via <x id="0" equiv-text="${event.context.device.name}"/></source>
</trans-unit>
<trans-unit id="sb7ff80582ccd9348">
<source>reference will be left dangling</source>
</trans-unit>
<trans-unit id="s0b7ddc0168e79ea2">
<source>Failed to fetch files</source>
</trans-unit>
<trans-unit id="sdc4f1cfd587212b4">
<source>You can also enter a URL (https://...), Font Awesome icon (fa://fa-icon-name), or upload a new file.</source>
</trans-unit>
<trans-unit id="s8015ac3b47172dc8">
<source>Select from uploaded files, or type a Font Awesome icon (fa://fa-icon-name) or URL.</source>
</trans-unit>
<trans-unit id="s87616130c08b117c">
<source>This type is deprecated.</source>
</trans-unit>
<trans-unit id="s40f4c2223ce87751">
<source>No connectors configured. Navigate to Connectors in the sidebar and first create a connector.</source>
</trans-unit>
<trans-unit id="s70c2cd89201ecca9">
<source>Home directory</source>
</trans-unit>
<trans-unit id="sb171d638b8af660d">
<source>Successfully updated agent connector.</source>
</trans-unit>
<trans-unit id="s81c9554908463f94">
<source>Successfully created agent connector.</source>
</trans-unit>
<trans-unit id="s306dd51d3be07bc7">
<source>Device compliance settings</source>
</trans-unit>
<trans-unit id="sc2966702517b7af5">
<source>Challenge certificate</source>
</trans-unit>
<trans-unit id="s051588c63fedab5f">
<source>Challenge idle timeout</source>
</trans-unit>
<trans-unit id="s4c70d7629e29ac2d">
<source>Duration the flow executor will wait before continuing without a response.</source>
</trans-unit>
<trans-unit id="se3c7fb54006d9e98">
<source>Trigger check-in on device</source>
</trans-unit>
<trans-unit id="se0a747f4db08e87f">
<source>Configure how devices connect with authentik and ingest external device data.</source>
</trans-unit>
<trans-unit id="s114f2b310ef163ff">
<source>Stage which associates the currently used device with the current session.</source>
</trans-unit>
<trans-unit id="s8290d08ab5a49ed0">
<source>Connector</source>
</trans-unit>
<trans-unit id="s5e8eefcbbeffd4d5">
<source>Device optional</source>
</trans-unit>
<trans-unit id="s51b09bba5dcc19b0">
<source>If no device was provided, this stage will succeed and continue to the next stage.</source>
</trans-unit>
<trans-unit id="s5f58e358343a5514">
<source>Device required</source>
</trans-unit>
<trans-unit id="s6df8326edea3b23d">
<source>If no device was provided, this stage will stop flow execution.</source>
</trans-unit>
<trans-unit id="s506c7d2e87f6770e">
<source>Filename can only contain letters, numbers, dots, hyphens, and underscores</source>
</trans-unit>
<trans-unit id="s3a3d5b2575cd32ea">
<source>File uploaded successfully</source>
</trans-unit>
<trans-unit id="sd3775ef947e0de32">
<source>File Name</source>
</trans-unit>
<trans-unit id="s1afc99a84a890514">
<source>Type an optional custom file name...</source>
</trans-unit>
<trans-unit id="sb40e2763045466ea">
<source>Optionally rename the file (without extension). Leave empty to keep the original filename.</source>
</trans-unit>
<trans-unit id="s803ce7e1a2294d50">
<source>Files</source>
</trans-unit>
<trans-unit id="s42d82601762f5321">
<source>Manage uploaded files.</source>
</trans-unit>
<trans-unit id="saad01178f02a6a23">
<source>file</source>
</trans-unit>
<trans-unit id="s69f800801812a5f0">
<source>files</source>
</trans-unit>
<trans-unit id="s96668830629e0dfc">
<source>Upload</source>
</trans-unit>
<trans-unit id="sa32e9d0a108ee802">
<source>Upload File</source>
</trans-unit>
<trans-unit id="s95094b57684716a5">
<source>Failed to validate device.</source>
</trans-unit>
<trans-unit id="se99d25eb70c767ef">
<source>Verifying your device...</source>
</trans-unit>
</body>
</file>
</xliff>

View File

@@ -1,6 +1,94 @@
<?xml version="1.0" ?><xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" version="1.2">
<file target-language="pt_BR" source-language="en" original="lit-localize-inputs" datatype="plaintext">
<?xml version="1.0"?><xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" version="1.2">
<file target-language="pt-BR" source-language="en" original="lit-localize-inputs" datatype="plaintext">
<body>
<!-- #region Locales -->
<trans-unit id="en">
<source>English</source>
<target>Inglês</target>
</trans-unit>
<trans-unit id="pseudo-LOCALE">
<source>Pseudolocale</source>
<target>Pseudoidioma</target>
</trans-unit>
<trans-unit id="cs-CZ">
<source>Czech</source>
<target>Tcheco</target>
</trans-unit>
<trans-unit id="de-DE">
<source>German</source>
<target>Alemão</target>
</trans-unit>
<trans-unit id="es-ES">
<source>Spanish</source>
<target>Espanhol</target>
</trans-unit>
<trans-unit id="fi-FI">
<source>Finnish</source>
<target>Finlandês</target>
</trans-unit>
<trans-unit id="fr-FR">
<source>French</source>
<target>Francês</target>
</trans-unit>
<trans-unit id="it-IT">
<source>Italian</source>
<target>Italiano</target>
</trans-unit>
<trans-unit id="ja-JP">
<source>Japanese</source>
<target>Japonês</target>
</trans-unit>
<trans-unit id="ko-KR">
<source>Korean</source>
<target>Coreano</target>
</trans-unit>
<trans-unit id="nl-NL">
<source>Dutch</source>
<target>Holandês</target>
</trans-unit>
<trans-unit id="pl-PL">
<source>Polish</source>
<target>Polonês</target>
</trans-unit>
<trans-unit id="pt-BR">
<source>Portuguese</source>
<target>Português</target>
</trans-unit>
<trans-unit id="ru-RU">
<source>Russian</source>
<target>Russo</target>
</trans-unit>
<trans-unit id="tr-TR">
<source>Turkish</source>
<target>Turco</target>
</trans-unit>
<trans-unit id="zh-Hans">
<source>Chinese Simplified</source>
<target>Chinês</target>
</trans-unit>
<trans-unit id="zh-Hant">
<source>Chinese Traditional</source>
<target>Chinês</target>
</trans-unit>
<!-- #endregion -->
<!-- #region Locale selector -->
<trans-unit id="locale-auto-detect-option">
<source>Auto-detect</source>
<target>Detecção automática</target>
<note from="lit-localize">Label for the auto-detect locale option in language selection dropdown</note>
</trans-unit>
<trans-unit id="language-selector-label">
<source>Select language</source>
<target>Selecionar idioma</target>
<note from="lit-localize">Label for the language selection dropdown</note>
</trans-unit>
<trans-unit id="locale-option-localized-label">
<source><x id="0" equiv-text="${localeLabel}"/> (<x id="1" equiv-text="${translatedLabel}"/>)</source>
<note from="lit-localize">Locale option label showing the localized language name along with the native language name in parentheses. The first placeholder is the localized language name, the second is the native language name.</note>
</trans-unit>
<!-- #endregion -->
<trans-unit id="s12d6dde9b30c3093">
<source>Dismiss</source>
<target>Dispensar</target>
@@ -532,8 +620,8 @@
<target>Limpar pesquisa</target>
</trans-unit>
<trans-unit id="sd9b15395dd103f80">
<source>Sort by &quot;<x id="0" equiv-text="${label}"/>&quot;</source>
<target>Classificar por &quot;<x id="0" equiv-text="${label}"/>&quot;</target>
<source>Sort by "<x id="0" equiv-text="${label}"/>"</source>
<target>Classificar por "<x id="0" equiv-text="${label}"/>"</target>
</trans-unit>
<trans-unit id="s7bc8c327f1f7c82c">
<source>No objects found.</source>
@@ -544,8 +632,8 @@
<target>Falha ao buscar objetos.</target>
</trans-unit>
<trans-unit id="s7dd64bb0c1fa8e87">
<source>Select &quot;<x id="0" equiv-text="${rowLabel}"/>&quot; row</source>
<target>Selecionar linha &quot;<x id="0" equiv-text="${rowLabel}"/>&quot;</target>
<source>Select "<x id="0" equiv-text="${rowLabel}"/>" row</source>
<target>Selecionar linha "<x id="0" equiv-text="${rowLabel}"/>"</target>
</trans-unit>
<trans-unit id="sd26f670ca5d5b0c6">
<source>Collapse row</source>
@@ -781,9 +869,9 @@
<target>Não encontrado</target>
</trans-unit>
<trans-unit id="saa0e2675da69651b">
<source>The URL &quot;<x id="0" equiv-text="${this.url}"/>&quot; was not found.</source>
<target>O URL &quot;
<x id="0" equiv-text="${this.url}"/>&quot; não foi encontrado.</target>
<source>The URL "<x id="0" equiv-text="${this.url}"/>" was not found.</source>
<target>O URL "
<x id="0" equiv-text="${this.url}"/>" não foi encontrado.</target>
</trans-unit>
<trans-unit id="s58cd9c2fe836d9c6">
<source>Return home</source>
@@ -1130,12 +1218,12 @@
<target>Fechar</target>
</trans-unit>
<trans-unit id="sc08c153234510246">
<source>Update &quot;<x id="0" equiv-text="${this.label || &quot;object&quot;}"/>&quot; Permissions</source>
<target>Atualizar Permissões de &quot;<x id="0" equiv-text="${this.label || &quot;object&quot;}"/>&quot;</target>
<source>Update "<x id="0" equiv-text="${this.label || &quot;object&quot;}"/>" Permissions</source>
<target>Atualizar Permissões de "<x id="0" equiv-text="${this.label || &quot;object&quot;}"/>"</target>
</trans-unit>
<trans-unit id="s6d25eef21a9e76ba">
<source>Open &quot;<x id="0" equiv-text="${this.label || &quot;object&quot;}"/>&quot; permissions modal</source>
<target>Abrir modal de permissões de &quot;<x id="0" equiv-text="${this.label || &quot;object&quot;}"/>&quot;</target>
<source>Open "<x id="0" equiv-text="${this.label || &quot;object&quot;}"/>" permissions modal</source>
<target>Abrir modal de permissões de "<x id="0" equiv-text="${this.label || &quot;object&quot;}"/>"</target>
</trans-unit>
<trans-unit id="se8dca0132c66ae03">
<source>Permissions</source>
@@ -1419,18 +1507,15 @@
</trans-unit>
<trans-unit id="s030ac0829bb50a49">
<source>Policy <x id="0" equiv-text="${v.policyObj?.name}"/></source>
<target>Política
</target>
<target>Política <x id="0" equiv-text="${v.policyObj?.name}"/></target>
</trans-unit>
<trans-unit id="s2a64d2dca3da9b0e">
<source>Group <x id="0" equiv-text="${v.groupObj?.name}"/></source>
<target>Grupo
</target>
<target>Grupo <x id="0" equiv-text="${v.groupObj?.name}"/></target>
</trans-unit>
<trans-unit id="se5dc026819a32ff8">
<source>User <x id="0" equiv-text="${v.userObj?.name}"/></source>
<target>Usuário
</target>
<target>Usuário <x id="0" equiv-text="${v.userObj?.name}"/></target>
</trans-unit>
<trans-unit id="sc387b20e6d629087">
<source>Configure Policy/User/Group Bindings</source>
@@ -1878,7 +1963,7 @@
</trans-unit>
<trans-unit id="sde949d0ef44572eb">
<source>Requires the user to have a 'upn' attribute set, and falls back to hashed user ID. Use this mode only if you have different UPN and Mail domains.</source>
<target>É necessário que l usuário tenha o atributo &quot;upn&quot; definido, e tem como fallback o ID hash do usuário. Use este modo somente se você tem domínios de UPN e Mail diferentes.</target>
<target>É necessário que l usuário tenha o atributo "upn" definido, e tem como fallback o ID hash do usuário. Use este modo somente se você tem domínios de UPN e Mail diferentes.</target>
</trans-unit>
<trans-unit id="sde56783222b527d6">
<source>Each provider has a different issuer, based on the application slug</source>
@@ -1897,8 +1982,8 @@
<target>Se nenhum URI de redirecionamento explícito for especificado, o primeiro URI utilizado com sucesso será salvo.</target>
</trans-unit>
<trans-unit id="s4c49d27de60a532b">
<source>To allow any redirect URI, set the mode to Regex and the value to &quot;.*&quot;. Be aware of the possible security implications this can have.</source>
<target>Para permitir qualquer URI de redirecionamento, defina o modo como Regex e o valor como &quot;.*&quot;. Esteja ciente das possíveis implicações de segurança que isso pode ter.</target>
<source>To allow any redirect URI, set the mode to Regex and the value to ".*". Be aware of the possible security implications this can have.</source>
<target>Para permitir qualquer URI de redirecionamento, defina o modo como Regex e o valor como ".*". Esteja ciente das possíveis implicações de segurança que isso pode ter.</target>
</trans-unit>
<trans-unit id="s62f7c59b0606a8d6">
<source>Authorization flow</source>
@@ -2073,7 +2158,7 @@
</trans-unit>
<trans-unit id="s37d9155b9f4cc7bd">
<source>Configure how the issuer field of the ID Token should be filled.</source>
<target>Configurar como o campo &quot;issuer&quot; do ID Token deve ser preenchido.</target>
<target>Configurar como o campo "issuer" do ID Token deve ser preenchido.</target>
</trans-unit>
<trans-unit id="se2adaf0371ffcd65">
<source>Machine-to-Machine authentication settings</source>
@@ -2232,7 +2317,7 @@
</trans-unit>
<trans-unit id="s211b75e868072162">
<source>Set this to the domain you wish the authentication to be valid for. Must be a parent domain of the URL above. If you're running applications as app1.domain.tld, app2.domain.tld, set this to 'domain.tld'.</source>
<target>Defina para o domínio que você deseja paea o qual a autenticação seja válida. Deve ser pai do domínio do URL acima. Se suas aplicações estão em app1.domain.tld, app2.domain.tld, defina este campo para &quot;domain.tld&quot;.</target>
<target>Defina para o domínio que você deseja paea o qual a autenticação seja válida. Deve ser pai do domínio do URL acima. Se suas aplicações estão em app1.domain.tld, app2.domain.tld, defina este campo para "domain.tld".</target>
</trans-unit>
<trans-unit id="s7c10976de6411844">
<source>Token validity</source>
@@ -3011,8 +3096,8 @@
<x id="0" equiv-text="${item.verboseName}"/></target>
</trans-unit>
<trans-unit id="sfbb87c9ced1fde54">
<source>Edit &quot;<x id="0" equiv-text="${item.name}"/>&quot; provider</source>
<target>Editar provedor &quot;<x id="0" equiv-text="${item.name}"/>&quot;</target>
<source>Edit "<x id="0" equiv-text="${item.name}"/>" provider</source>
<target>Editar provedor "<x id="0" equiv-text="${item.name}"/>"</target>
</trans-unit>
<trans-unit id="s3b579c4bb6b447ae">
<source>Successfully triggered sync.</source>
@@ -3107,8 +3192,8 @@
<target>Selecione os provedores para adicionar ao aplicativo</target>
</trans-unit>
<trans-unit id="sa90b7809586c35ce">
<source>Either input a full URL, a relative path, or use 'fa://fa-test' to use the Font Awesome icon &quot;fa-test&quot;.</source>
<target>Insira um URL completo, um caminho relativo ou use 'fa://fa-test' para usar o ícone &quot;fa-test&quot;
<source>Either input a full URL, a relative path, or use 'fa://fa-test' to use the Font Awesome icon "fa-test".</source>
<target>Insira um URL completo, um caminho relativo ou use 'fa://fa-test' para usar o ícone "fa-test"
do Font Awesome.</target>
</trans-unit>
<trans-unit id="s0410779cb47de312">
@@ -3151,18 +3236,6 @@
<source>Icon</source>
<target>Ícone</target>
</trans-unit>
<trans-unit id="s67e20cd8018d7e3c">
<source>Currently set to:</source>
<target>Atualmente definido para:</target>
</trans-unit>
<trans-unit id="s80e6d6fe5ad458d3">
<source>Clear icon</source>
<target>Limpar ícone</target>
</trans-unit>
<trans-unit id="s485c05d34eb00415">
<source>Delete currently set icon.</source>
<target>Excluir ícone definido atualmente.</target>
</trans-unit>
<trans-unit id="s6d3b4d0561ba1cff">
<source>Publisher</source>
<target>Editora</target>
@@ -3240,7 +3313,7 @@
<target>Aviso: o provedor não é usado por nenhuma aplicação.</target>
</trans-unit>
<trans-unit id="scbf29ce484222325">
<source/>
<source></source>
</trans-unit>
<trans-unit id="sdbc08adee233f180">
<source>Update OAuth2 Provider</source>
@@ -4100,19 +4173,19 @@ doesn't pass when either or both of the selected options are equal or above the
<target>Aplicação(ões)</target>
</trans-unit>
<trans-unit id="sf07bfbe5316e7cc7">
<source>Application icon for &quot;<x id="0" equiv-text="${item.name}"/>&quot;</source>
<target>Ícone da aplicação para &quot;<x id="0" equiv-text="${item.name}"/>&quot;</target>
<source>Application icon for "<x id="0" equiv-text="${item.name}"/>"</source>
<target>Ícone da aplicação para "<x id="0" equiv-text="${item.name}"/>"</target>
</trans-unit>
<trans-unit id="sa347e31efbb60be2">
<source>Update Application</source>
<target>Atualizar Aplicativo</target>
</trans-unit>
<trans-unit id="s037f22187581bf8f">
<source>Edit &quot;<x id="0" equiv-text="${item.name}"/>&quot;</source>
<target>Editar &quot;<x id="0" equiv-text="${item.name}"/>&quot;</target>
<source>Edit "<x id="0" equiv-text="${item.name}"/>"</source>
<target>Editar "<x id="0" equiv-text="${item.name}"/>"</target>
</trans-unit>
<trans-unit id="sdb3b903354fbfb17">
<source>Open &quot;<x id="0" equiv-text="${item.name}"/>&quot;</source>
<source>Open "<x id="0" equiv-text="${item.name}"/>"</source>
<target>Abrir &amp;quot;<x id="0" equiv-text="${item.name}"/>&amp;quot;</target>
</trans-unit>
<trans-unit id="s1f7698c061c208c9">
@@ -4184,8 +4257,8 @@ doesn't pass when either or both of the selected options are equal or above the
<target>Criar direito</target>
</trans-unit>
<trans-unit id="sb6fcdabf769208a1">
<source>Failed to fetch application &quot;<x id="0" equiv-text="${this.applicationSlug}"/>&quot;.</source>
<target>Falha ao buscar o aplicativo &quot;<x id="0" equiv-text="${this.applicationSlug}"/>&quot;.</target>
<source>Failed to fetch application "<x id="0" equiv-text="${this.applicationSlug}"/>".</source>
<target>Falha ao buscar o aplicativo "<x id="0" equiv-text="${this.applicationSlug}"/>".</target>
</trans-unit>
<trans-unit id="application.outpost.missing.warning">
<source>Warning: Application is not used by any Outpost.</source>
@@ -4386,12 +4459,6 @@ doesn't pass when either or both of the selected options are equal or above the
<source>Click to change value</source>
<target>Clique para alterar o valor</target>
</trans-unit>
<trans-unit id="se17f29e830ebf9be">
<source>Successfully updated connector.</source>
</trans-unit>
<trans-unit id="s6da88527f3e5e513">
<source>Successfully created connector.</source>
</trans-unit>
<trans-unit id="s6a087e34edeadc1f">
<source>Connector name...</source>
</trans-unit>
@@ -4441,9 +4508,6 @@ doesn't pass when either or both of the selected options are equal or above the
<trans-unit id="s80b0feb2a6b98ef9">
<source>Connectors</source>
</trans-unit>
<trans-unit id="s7e840add1b48d751">
<source>Configure how devices communicate with authentik and external sources device data is fetched from.</source>
</trans-unit>
<trans-unit id="s58d0ed0cc064ec4f">
<source>Update Connector</source>
</trans-unit>
@@ -5712,7 +5776,7 @@ Você só pode usar políticas aqui, pois o acesso é verificado antes de o usu
<target>Grupo(s)</target>
</trans-unit>
<trans-unit id="s79683026e49e4866">
<source>View details of group &quot;<x id="0" equiv-text="${item.name}"/>&quot;</source>
<source>View details of group "<x id="0" equiv-text="${item.name}"/>"</source>
<target>Ver detslhes do grupo &amp;quot;<x id="0" equiv-text="${item.name}"/>&amp;quot;</target>
</trans-unit>
<trans-unit id="s416a540b16275f2e">
@@ -5937,8 +6001,8 @@ Você só pode usar políticas aqui, pois o acesso é verificado antes de o usu
<target>Novo Usuário</target>
</trans-unit>
<trans-unit id="s824e0943a7104668">
<source>This user will be added to the group &quot;<x id="0" equiv-text="${this.targetGroup.name}"/>&quot;.</source>
<target>Este usuário será adicionado ao grupo &quot;<x id="0" equiv-text="${this.targetGroup.name}"/>&quot;.</target>
<source>This user will be added to the group "<x id="0" equiv-text="${this.targetGroup.name}"/>".</source>
<target>Este usuário será adicionado ao grupo "<x id="0" equiv-text="${this.targetGroup.name}"/>".</target>
</trans-unit>
<trans-unit id="s0051b0d8e6decea6">
<source>New user...</source>
@@ -5977,19 +6041,19 @@ Você só pode usar políticas aqui, pois o acesso é verificado antes de o usu
<target>Não nomeado</target>
</trans-unit>
<trans-unit id="s326ee20bba2564a0">
<source>Collapse &quot;<x id="0" equiv-text="${itemLabel}"/>&quot;</source>
<source>Collapse "<x id="0" equiv-text="${itemLabel}"/>"</source>
<target>Retrair &amp;quot;<x id="0" equiv-text="${itemLabel}"/>&amp;quot;</target>
</trans-unit>
<trans-unit id="s27df1f36ba8e269f">
<source>Expand &quot;<x id="0" equiv-text="${itemLabel}"/>&quot;</source>
<source>Expand "<x id="0" equiv-text="${itemLabel}"/>"</source>
<target>Expandir &amp;quot;<x id="0" equiv-text="${itemLabel}"/>&amp;quot;</target>
</trans-unit>
<trans-unit id="sf2b5d3236e6f1ab3">
<source>Select &quot;<x id="0" equiv-text="${itemLabel}"/>&quot;</source>
<source>Select "<x id="0" equiv-text="${itemLabel}"/>"</source>
<target>Selecionar &amp;quot;<x id="0" equiv-text="${itemLabel}"/>&amp;quot;</target>
</trans-unit>
<trans-unit id="sb7c2715df863a6ce">
<source>Items of &quot;<x id="0" equiv-text="${itemLabel}"/>&quot;</source>
<source>Items of "<x id="0" equiv-text="${itemLabel}"/>"</source>
<target>Itens de &amp;quot;<x id="0" equiv-text="${itemLabel}"/>&amp;quot;</target>
</trans-unit>
<trans-unit id="sca7cfe2bef51b2a5">
@@ -6143,7 +6207,7 @@ Você só pode usar políticas aqui, pois o acesso é verificado antes de o usu
<target>Erro: configurações de fonte não suportadas: <x id="0" equiv-text="${source.component}"/></target>
</trans-unit>
<trans-unit id="source-settings-list-item-label">
<source>&quot;<x id="0" equiv-text="${source.title}"/>&quot; source</source>
<source>"<x id="0" equiv-text="${source.title}"/>" source</source>
</trans-unit>
<trans-unit id="s7968dbed9b106c29">
<source>No services available.</source>
@@ -6408,73 +6472,10 @@ Você só pode usar políticas aqui, pois o acesso é verificado antes de o usu
<source>Warning: No invitation stage is bound to any flow. Invitations will not work as expected.</source>
<target>Atenção: nenhuma etapa de convite está vinculada a qualquer fluxo. Os convites não funcionarão conforme esperado.</target>
</trans-unit>
<trans-unit id="s2da4aa7a9abeb653">
<source>Pseudolocale (for testing)</source>
<target>Pseudolocalização (para teste)</target>
</trans-unit>
<trans-unit id="s63e71d20d1eaca93">
<source>German</source>
<target>Alemão</target>
</trans-unit>
<trans-unit id="s4caed5b7a7e5d89b">
<source>English</source>
<target>Inglês</target>
</trans-unit>
<trans-unit id="sf1868dc19e3917bb">
<source>Spanish</source>
<target>Espanhol</target>
</trans-unit>
<trans-unit id="s75a27f43413e02c5">
<source>French</source>
<target>Francês</target>
</trans-unit>
<trans-unit id="sd48cc52117f4d68b">
<source>Italian</source>
<target>Italiano</target>
</trans-unit>
<trans-unit id="sdd35b688281b6dea">
<source>Japanese</source>
</trans-unit>
<trans-unit id="s94d61907ee22a8c1">
<source>Korean</source>
<target>Coreano</target>
</trans-unit>
<trans-unit id="s95d56e58f816d211">
<source>Dutch</source>
<target>Holandês</target>
</trans-unit>
<trans-unit id="s03f49e598ffb11cc">
<source>Polish</source>
<target>Polonês</target>
</trans-unit>
<trans-unit id="sa30c12014e955946">
<source>Russian</source>
<target>Russo</target>
</trans-unit>
<trans-unit id="s9d2d00982edafabb">
<source>Turkish</source>
<target>Turco</target>
</trans-unit>
<trans-unit id="s4660da32fb311ac0">
<source>Taiwanese Mandarin</source>
<target>Mandarim Taiwanês</target>
</trans-unit>
<trans-unit id="s354e0a9f146d2869">
<source>Chinese (simplified)</source>
<target>Chinês (simplificado)</target>
</trans-unit>
<trans-unit id="se3e6af2ce24d80e8">
<source>Chinese (traditional)</source>
<target>Chinês (tradicional)</target>
</trans-unit>
<trans-unit id="s8939f574b096054a">
<source>Not you?</source>
<target>Não é você?</target>
</trans-unit>
<trans-unit id="s2f995efbb1e46b18">
<source>Auto-detect (based on your browser)</source>
<target>Detecção automática (com base no seu navegador)</target>
</trans-unit>
<trans-unit id="s296fbffaaa7c910a">
<source>Required.</source>
<target>Necessário.</target>
@@ -7088,8 +7089,8 @@ retorne uma lista para fornecer várias opções padrão.</target>
<target>Um autenticador não removível, como TouchID ou Windows Hello</target>
</trans-unit>
<trans-unit id="sdf1d8edef27236f0">
<source>A &quot;roaming&quot; authenticator, like a YubiKey</source>
<target>Um autenticador &quot;itinerante&quot;, como um YubiKey</target>
<source>A "roaming" authenticator, like a YubiKey</source>
<target>Um autenticador "itinerante", como um YubiKey</target>
</trans-unit>
<trans-unit id="sbd65aeeb8a3b9bbc">
<source>Maximum registration attempts</source>
@@ -7312,8 +7313,8 @@ retorne uma lista para fornecer várias opções padrão.</target>
<target>Quando um nome de usuário/email válido foi inserido e esta opção está ativada, o nome de usuário e o avatar do usuário serão exibidos. Caso contrário, o texto que o usuário inseriu será exibido.</target>
</trans-unit>
<trans-unit id="s844baf19a6c4a9b4">
<source>Enable &quot;Remember me on this device&quot;</source>
<target>Ativar &quot;Lembrar de mim neste dispositivo&quot;</target>
<source>Enable "Remember me on this device"</source>
<target>Ativar "Lembrar de mim neste dispositivo"</target>
</trans-unit>
<trans-unit id="sfa72bca733f40692">
<source>When enabled, the user can save their username in a cookie, allowing them to skip directly to entering their password.</source>
@@ -7459,8 +7460,8 @@ retorne uma lista para fornecer várias opções padrão.</target>
<target>Fornecer aos usuários um botão 'mostrar senha'.</target>
</trans-unit>
<trans-unit id="s2d5f69929bb7221d">
<source><x id="0" equiv-text="${p.name}"/> (&quot;<x id="1" equiv-text="${p.fieldKey}"/>&quot;, of type <x id="2" equiv-text="${p.type}"/>)</source>
<target><x id="0" equiv-text="${p.name}"/> (&quot;<x id="1" equiv-text="${p.fieldKey}"/>&quot;, do tipo <x id="2" equiv-text="${p.type}"/>)</target>
<source><x id="0" equiv-text="${p.name}"/> ("<x id="1" equiv-text="${p.fieldKey}"/>", of type <x id="2" equiv-text="${p.type}"/>)</source>
<target><x id="0" equiv-text="${p.name}"/> ("<x id="1" equiv-text="${p.fieldKey}"/>", do tipo <x id="2" equiv-text="${p.type}"/>)</target>
</trans-unit>
<trans-unit id="s5170f9ef331949c0">
<source>Show arbitrary input fields to the user, for example during enrollment. Data is saved in the flow context under the 'prompt_data' variable.</source>
@@ -7563,8 +7564,8 @@ retorne uma lista para fornecer várias opções padrão.</target>
<target>Deslocamento de permanência conectado</target>
</trans-unit>
<trans-unit id="s1608b2f94fa0dbd4">
<source>If set to a duration above 0, the user will have the option to choose to &quot;stay signed in&quot;, which will extend their session by the time specified here.</source>
<target>Se definido para uma duração acima de 0, o usuário terá a opção de escolher &quot;permanecer conectado&quot;, o que estenderá sua sessão pelo tempo especificado aqui.</target>
<source>If set to a duration above 0, the user will have the option to choose to "stay signed in", which will extend their session by the time specified here.</source>
<target>Se definido para uma duração acima de 0, o usuário terá a opção de escolher "permanecer conectado", o que estenderá sua sessão pelo tempo especificado aqui.</target>
</trans-unit>
<trans-unit id="sa3ff409b84679db8">
<source>Remember device</source>
@@ -7769,7 +7770,7 @@ retorne uma lista para fornecer várias opções padrão.</target>
</trans-unit>
<trans-unit id="s77299a9d3dd932cd">
<source>Successfully imported <x id="0" equiv-text="${res.count}"/> devices.</source>
<target>Dispositivos importados com sucesso.</target>
<target>Dispositivos importados com sucesso <x id="0" equiv-text="${res.count}"/>.</target>
</trans-unit>
<trans-unit id="s6a615f6165ef01c9">
<source>Start automatic import</source>
@@ -7915,21 +7916,13 @@ retorne uma lista para fornecer várias opções padrão.</target>
<source>Background shown during execution.</source>
<target>Fundo mostrado durante a execução.</target>
</trans-unit>
<trans-unit id="s3ebf4c166058afce">
<source>Clear background</source>
<target>Limpar fundo</target>
</trans-unit>
<trans-unit id="sb24755ea94bef31d">
<source>Delete currently set background image.</source>
<target>Excluir imagem de fundo atualmente definida.</target>
</trans-unit>
<trans-unit id="sb904f23f17b60c3a">
<source>Successfully imported flow.</source>
<target>Fluxo importado com sucesso.</target>
</trans-unit>
<trans-unit id="s8b0e21adf383c8ba">
<source>.yaml files, which can be found in the Example Flows documentation</source>
<target>Arquivos .yaml, que podem ser encontrados na documentação &quot;Example Flows&quot;</target>
<target>Arquivos .yaml, que podem ser encontrados na documentação "Example Flows"</target>
</trans-unit>
<trans-unit id="s3abecf1e778c9625">
<source>See more here:</source>
@@ -7952,16 +7945,16 @@ retorne uma lista para fornecer várias opções padrão.</target>
<target>Atualizar Fluxo</target>
</trans-unit>
<trans-unit id="s5d90aeadfcb34286">
<source>Execute &quot;<x id="0" equiv-text="${item.name}"/>&quot;</source>
<target>Executar &quot;<x id="0" equiv-text="${item.name}"/>&quot;</target>
<source>Execute "<x id="0" equiv-text="${item.name}"/>"</source>
<target>Executar "<x id="0" equiv-text="${item.name}"/>"</target>
</trans-unit>
<trans-unit id="sc4fdeccf14be5378">
<source>Execute</source>
<target>Executar</target>
</trans-unit>
<trans-unit id="saa25eac2952d918d">
<source>Export &quot;<x id="0" equiv-text="${item.name}"/>&quot;</source>
<target>Exportar &quot;<x id="0" equiv-text="${item.name}"/>&quot;</target>
<source>Export "<x id="0" equiv-text="${item.name}"/>"</source>
<target>Exportar "<x id="0" equiv-text="${item.name}"/>"</target>
</trans-unit>
<trans-unit id="s293aa6a6446fb153">
<source>Export</source>
@@ -8050,7 +8043,7 @@ retorne uma lista para fornecer várias opções padrão.</target>
<target>Executar fluxo</target>
</trans-unit>
<trans-unit id="s61e5043203e94d0a">
<source>Execute &quot;<x id="0" equiv-text="${this.flow.name}"/>&quot; normally</source>
<source>Execute "<x id="0" equiv-text="${this.flow.name}"/>" normally</source>
<target>Executar &amp;quot;<x id="0" equiv-text="${this.flow.name}"/>&amp;quot; normalmente</target>
</trans-unit>
<trans-unit id="s9ff3121d30f88d52">
@@ -8058,7 +8051,7 @@ retorne uma lista para fornecer várias opções padrão.</target>
<target>Normal</target>
</trans-unit>
<trans-unit id="s02eb960c270a837e">
<source>Execute &quot;<x id="0" equiv-text="${this.flow.name}"/>&quot; as current user</source>
<source>Execute "<x id="0" equiv-text="${this.flow.name}"/>" as current user</source>
<target>Executar &amp;quot;<x id="0" equiv-text="${this.flow.name}"/>&amp;quot; como o usuário atual</target>
</trans-unit>
<trans-unit id="saf579a36a54c92e1">
@@ -8066,7 +8059,7 @@ retorne uma lista para fornecer várias opções padrão.</target>
<target>Usuário atual</target>
</trans-unit>
<trans-unit id="sd149e44e50455923">
<source>Execute &quot;<x id="0" equiv-text="${this.flow.name}"/>&quot; with inspector</source>
<source>Execute "<x id="0" equiv-text="${this.flow.name}"/>" with inspector</source>
<target>Executar &amp;quot;<x id="0" equiv-text="${this.flow.name}"/>&amp;quot; com inspecionador</target>
</trans-unit>
<trans-unit id="s45c530a48bcf74ad">
@@ -8831,12 +8824,12 @@ por exemplo: <x id="0" equiv-text="&lt;code&gt;"/>oci://registry.domain.tld/path
<target>Atualizar Blueprint</target>
</trans-unit>
<trans-unit id="s08d24327ec788e78">
<source>Edit &quot;<x id="0" equiv-text="${item.name}"/>&quot; blueprint</source>
<target>Editar &quot;<x id="0" equiv-text="${item.name}"/>&quot; blueprint</target>
<source>Edit "<x id="0" equiv-text="${item.name}"/>" blueprint</source>
<target>Editar "<x id="0" equiv-text="${item.name}"/>" blueprint</target>
</trans-unit>
<trans-unit id="s6f8d15b5494ac41a">
<source>Apply &quot;<x id="0" equiv-text="${item.name}"/>&quot; blueprint</source>
<target>Aplicar &quot;<x id="0" equiv-text="${item.name}"/>&quot; blueprint</target>
<source>Apply "<x id="0" equiv-text="${item.name}"/>" blueprint</source>
<target>Aplicar "<x id="0" equiv-text="${item.name}"/>" blueprint</target>
</trans-unit>
<trans-unit id="sb8f855b49234b81b">
<source>Apply</source>
@@ -9033,9 +9026,6 @@ por exemplo: <x id="0" equiv-text="&lt;code&gt;"/>oci://registry.domain.tld/path
<trans-unit id="s0393ac07cf8a3097">
<source>Endpoint Devices</source>
</trans-unit>
<trans-unit id="s02d57c823e493fe9">
<source>Device groups</source>
</trans-unit>
<trans-unit id="s4f1ad6b48a5df506">
<source>Logs</source>
<target>Logs</target>
@@ -9728,7 +9718,7 @@ por exemplo: <x id="0" equiv-text="&lt;code&gt;"/>oci://registry.domain.tld/path
<source>application</source>
</trans-unit>
<trans-unit id="s33b2f30214a2e99d">
<source>Actions for &quot;<x id="0" equiv-text="${applicationName}"/>&quot;</source>
<source>Actions for "<x id="0" equiv-text="${applicationName}"/>"</source>
</trans-unit>
<trans-unit id="sfa660d9e563c346f">
<source>Edit application...</source>
@@ -9762,10 +9752,10 @@ por exemplo: <x id="0" equiv-text="&lt;code&gt;"/>oci://registry.domain.tld/path
<target>A pesquisa não retornou resultados.</target>
</trans-unit>
<trans-unit id="sa4fb160e26323b02">
<source><x id="0" equiv-text="${count}"/> application found for &quot;<x id="1" equiv-text="${query}"/>&quot;</source>
<source><x id="0" equiv-text="${count}"/> application found for "<x id="1" equiv-text="${query}"/>"</source>
</trans-unit>
<trans-unit id="s8a9abf934b0dc89d">
<source><x id="0" equiv-text="${count}"/> applications found for &quot;<x id="1" equiv-text="${query}"/>&quot;</source>
<source><x id="0" equiv-text="${count}"/> applications found for "<x id="1" equiv-text="${query}"/>"</source>
</trans-unit>
<trans-unit id="sb1d445efd39638d4">
<source><x id="0" equiv-text="${count}"/> application available</source>
@@ -9856,6 +9846,111 @@ por exemplo: <x id="0" equiv-text="&lt;code&gt;"/>oci://registry.domain.tld/path
<target>...</target>
<note from="lit-localize">Truncation ellipsis</note>
</trans-unit>
<trans-unit id="s6cd96061d397f7b5">
<source>Via <x id="0" equiv-text="${event.context.device.name}"/></source>
</trans-unit>
<trans-unit id="sb7ff80582ccd9348">
<source>reference will be left dangling</source>
</trans-unit>
<trans-unit id="s0b7ddc0168e79ea2">
<source>Failed to fetch files</source>
</trans-unit>
<trans-unit id="sdc4f1cfd587212b4">
<source>You can also enter a URL (https://...), Font Awesome icon (fa://fa-icon-name), or upload a new file.</source>
</trans-unit>
<trans-unit id="s8015ac3b47172dc8">
<source>Select from uploaded files, or type a Font Awesome icon (fa://fa-icon-name) or URL.</source>
</trans-unit>
<trans-unit id="s87616130c08b117c">
<source>This type is deprecated.</source>
</trans-unit>
<trans-unit id="s40f4c2223ce87751">
<source>No connectors configured. Navigate to Connectors in the sidebar and first create a connector.</source>
</trans-unit>
<trans-unit id="s70c2cd89201ecca9">
<source>Home directory</source>
</trans-unit>
<trans-unit id="sb171d638b8af660d">
<source>Successfully updated agent connector.</source>
</trans-unit>
<trans-unit id="s81c9554908463f94">
<source>Successfully created agent connector.</source>
</trans-unit>
<trans-unit id="s306dd51d3be07bc7">
<source>Device compliance settings</source>
</trans-unit>
<trans-unit id="sc2966702517b7af5">
<source>Challenge certificate</source>
</trans-unit>
<trans-unit id="s051588c63fedab5f">
<source>Challenge idle timeout</source>
</trans-unit>
<trans-unit id="s4c70d7629e29ac2d">
<source>Duration the flow executor will wait before continuing without a response.</source>
</trans-unit>
<trans-unit id="se3c7fb54006d9e98">
<source>Trigger check-in on device</source>
</trans-unit>
<trans-unit id="se0a747f4db08e87f">
<source>Configure how devices connect with authentik and ingest external device data.</source>
</trans-unit>
<trans-unit id="s114f2b310ef163ff">
<source>Stage which associates the currently used device with the current session.</source>
</trans-unit>
<trans-unit id="s8290d08ab5a49ed0">
<source>Connector</source>
</trans-unit>
<trans-unit id="s5e8eefcbbeffd4d5">
<source>Device optional</source>
</trans-unit>
<trans-unit id="s51b09bba5dcc19b0">
<source>If no device was provided, this stage will succeed and continue to the next stage.</source>
</trans-unit>
<trans-unit id="s5f58e358343a5514">
<source>Device required</source>
</trans-unit>
<trans-unit id="s6df8326edea3b23d">
<source>If no device was provided, this stage will stop flow execution.</source>
</trans-unit>
<trans-unit id="s506c7d2e87f6770e">
<source>Filename can only contain letters, numbers, dots, hyphens, and underscores</source>
</trans-unit>
<trans-unit id="s3a3d5b2575cd32ea">
<source>File uploaded successfully</source>
</trans-unit>
<trans-unit id="sd3775ef947e0de32">
<source>File Name</source>
</trans-unit>
<trans-unit id="s1afc99a84a890514">
<source>Type an optional custom file name...</source>
</trans-unit>
<trans-unit id="sb40e2763045466ea">
<source>Optionally rename the file (without extension). Leave empty to keep the original filename.</source>
</trans-unit>
<trans-unit id="s803ce7e1a2294d50">
<source>Files</source>
</trans-unit>
<trans-unit id="s42d82601762f5321">
<source>Manage uploaded files.</source>
</trans-unit>
<trans-unit id="saad01178f02a6a23">
<source>file</source>
</trans-unit>
<trans-unit id="s69f800801812a5f0">
<source>files</source>
</trans-unit>
<trans-unit id="s96668830629e0dfc">
<source>Upload</source>
</trans-unit>
<trans-unit id="sa32e9d0a108ee802">
<source>Upload File</source>
</trans-unit>
<trans-unit id="s95094b57684716a5">
<source>Failed to validate device.</source>
</trans-unit>
<trans-unit id="se99d25eb70c767ef">
<source>Verifying your device...</source>
</trans-unit>
</body>
</file>
</xliff>

View File

@@ -1,6 +1,94 @@
<?xml version="1.0"?><xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" version="1.2">
<file target-language="ru_RU" source-language="en" original="lit-localize-inputs" datatype="plaintext">
<file target-language="ru-RU" source-language="en" original="lit-localize-inputs" datatype="plaintext">
<body>
<!-- #region Locales -->
<trans-unit id="en">
<source>English</source>
<target>Английский</target>
</trans-unit>
<trans-unit id="pseudo-LOCALE">
<source>Pseudolocale</source>
<target>Псевдоязык</target>
</trans-unit>
<trans-unit id="cs-CZ">
<source>Czech</source>
<target>Чешский</target>
</trans-unit>
<trans-unit id="de-DE">
<source>German</source>
<target>Немецкий</target>
</trans-unit>
<trans-unit id="es-ES">
<source>Spanish</source>
<target>Испанский</target>
</trans-unit>
<trans-unit id="fi-FI">
<source>Finnish</source>
<target>Финский</target>
</trans-unit>
<trans-unit id="fr-FR">
<source>French</source>
<target>Французский</target>
</trans-unit>
<trans-unit id="it-IT">
<source>Italian</source>
<target>Итальянский</target>
</trans-unit>
<trans-unit id="ja-JP">
<source>Japanese</source>
<target>Японский</target>
</trans-unit>
<trans-unit id="ko-KR">
<source>Korean</source>
<target>Корейский</target>
</trans-unit>
<trans-unit id="nl-NL">
<source>Dutch</source>
<target>Нидерландский</target>
</trans-unit>
<trans-unit id="pl-PL">
<source>Polish</source>
<target>Польский</target>
</trans-unit>
<trans-unit id="pt-BR">
<source>Portuguese</source>
<target>Португальский</target>
</trans-unit>
<trans-unit id="ru-RU">
<source>Russian</source>
<target>Русский</target>
</trans-unit>
<trans-unit id="tr-TR">
<source>Turkish</source>
<target>Турецкий</target>
</trans-unit>
<trans-unit id="zh-Hans">
<source>Chinese Simplified</source>
<target>Китайский</target>
</trans-unit>
<trans-unit id="zh-Hant">
<source>Chinese Traditional</source>
<target>Китайский</target>
</trans-unit>
<!-- #endregion -->
<!-- #region Locale selector -->
<trans-unit id="locale-auto-detect-option">
<source>Auto-detect</source>
<target>Автоматическое определение</target>
<note from="lit-localize">Label for the auto-detect locale option in language selection dropdown</note>
</trans-unit>
<trans-unit id="language-selector-label">
<source>Select language</source>
<target>Выберите язык</target>
<note from="lit-localize">Label for the language selection dropdown</note>
</trans-unit>
<trans-unit id="locale-option-localized-label">
<source><x id="0" equiv-text="${localeLabel}"/> (<x id="1" equiv-text="${translatedLabel}"/>)</source>
<note from="lit-localize">Locale option label showing the localized language name along with the native language name in parentheses. The first placeholder is the localized language name, the second is the native language name.</note>
</trans-unit>
<!-- #endregion -->
<trans-unit id="s12d6dde9b30c3093">
<source>Dismiss</source>
</trans-unit>
@@ -2939,18 +3027,6 @@
<source>Icon</source>
<target>Иконка</target>
</trans-unit>
<trans-unit id="s67e20cd8018d7e3c">
<source>Currently set to:</source>
<target>В настоящее время установлено:</target>
</trans-unit>
<trans-unit id="s80e6d6fe5ad458d3">
<source>Clear icon</source>
<target>Очистить иконку</target>
</trans-unit>
<trans-unit id="s485c05d34eb00415">
<source>Delete currently set icon.</source>
<target>Удаление текущей установленной иконки.</target>
</trans-unit>
<trans-unit id="s6d3b4d0561ba1cff">
<source>Publisher</source>
<target>Издатель</target>
@@ -4098,12 +4174,6 @@ doesn't pass when either or both of the selected options are equal or above the
<source>Click to change value</source>
<target>Нажмите, чтобы изменить значение</target>
</trans-unit>
<trans-unit id="se17f29e830ebf9be">
<source>Successfully updated connector.</source>
</trans-unit>
<trans-unit id="s6da88527f3e5e513">
<source>Successfully created connector.</source>
</trans-unit>
<trans-unit id="s6a087e34edeadc1f">
<source>Connector name...</source>
</trans-unit>
@@ -4153,9 +4223,6 @@ doesn't pass when either or both of the selected options are equal or above the
<trans-unit id="s80b0feb2a6b98ef9">
<source>Connectors</source>
</trans-unit>
<trans-unit id="s7e840add1b48d751">
<source>Configure how devices communicate with authentik and external sources device data is fetched from.</source>
</trans-unit>
<trans-unit id="s58d0ed0cc064ec4f">
<source>Update Connector</source>
</trans-unit>
@@ -6013,69 +6080,10 @@ doesn't pass when either or both of the selected options are equal or above the
<source>Warning: No invitation stage is bound to any flow. Invitations will not work as expected.</source>
<target>Внимание: Ни один этап приглашения не привязан к какому-либо потоку. Приглашения не будут работать так, как ожидается.</target>
</trans-unit>
<trans-unit id="s2da4aa7a9abeb653">
<source>Pseudolocale (for testing)</source>
<target>Псевдолокаль (для тестирования)</target>
</trans-unit>
<trans-unit id="s63e71d20d1eaca93">
<source>German</source>
<target>Немецкий</target>
</trans-unit>
<trans-unit id="s4caed5b7a7e5d89b">
<source>English</source>
<target>Английский</target>
</trans-unit>
<trans-unit id="sf1868dc19e3917bb">
<source>Spanish</source>
<target>Испанский</target>
</trans-unit>
<trans-unit id="s75a27f43413e02c5">
<source>French</source>
<target>Французский</target>
</trans-unit>
<trans-unit id="sd48cc52117f4d68b">
<source>Italian</source>
<target>Итальянский </target>
</trans-unit>
<trans-unit id="sdd35b688281b6dea">
<source>Japanese</source>
</trans-unit>
<trans-unit id="s94d61907ee22a8c1">
<source>Korean</source>
<target>Корейский</target>
</trans-unit>
<trans-unit id="s95d56e58f816d211">
<source>Dutch</source>
<target>Голландский</target>
</trans-unit>
<trans-unit id="s03f49e598ffb11cc">
<source>Polish</source>
<target>Польский</target>
</trans-unit>
<trans-unit id="sa30c12014e955946">
<source>Russian</source>
<target>Русский</target>
</trans-unit>
<trans-unit id="s9d2d00982edafabb">
<source>Turkish</source>
<target>Турецкий</target>
</trans-unit>
<trans-unit id="s354e0a9f146d2869">
<source>Chinese (simplified)</source>
<target>Китайский (упрощенный)</target>
</trans-unit>
<trans-unit id="se3e6af2ce24d80e8">
<source>Chinese (traditional)</source>
<target>Китайский (традиционный)</target>
</trans-unit>
<trans-unit id="s8939f574b096054a">
<source>Not you?</source>
<target>Не вы?</target>
</trans-unit>
<trans-unit id="s2f995efbb1e46b18">
<source>Auto-detect (based on your browser)</source>
<target>Автоматическое определение (на основе вашего браузера)</target>
</trans-unit>
<trans-unit id="s296fbffaaa7c910a">
<source>Required.</source>
<target>Обязательно.</target>
@@ -7461,14 +7469,6 @@ doesn't pass when either or both of the selected options are equal or above the
<source>Background shown during execution.</source>
<target>Фон, отображаемый во время выполнения.</target>
</trans-unit>
<trans-unit id="s3ebf4c166058afce">
<source>Clear background</source>
<target>Убрать фон</target>
</trans-unit>
<trans-unit id="sb24755ea94bef31d">
<source>Delete currently set background image.</source>
<target>Удаление установленного в данный момент фонового изображения.</target>
</trans-unit>
<trans-unit id="sb904f23f17b60c3a">
<source>Successfully imported flow.</source>
<target>Поток успешно импортирован.</target>
@@ -8529,9 +8529,6 @@ Bindings to groups/users are checked against the user of the event.</source>
<trans-unit id="s0393ac07cf8a3097">
<source>Endpoint Devices</source>
</trans-unit>
<trans-unit id="s02d57c823e493fe9">
<source>Device groups</source>
</trans-unit>
<trans-unit id="s4f1ad6b48a5df506">
<source>Logs</source>
<target>Логи</target>
@@ -9300,6 +9297,111 @@ Bindings to groups/users are checked against the user of the event.</source>
<source>...</source>
<note from="lit-localize">Truncation ellipsis</note>
</trans-unit>
<trans-unit id="s6cd96061d397f7b5">
<source>Via <x id="0" equiv-text="${event.context.device.name}"/></source>
</trans-unit>
<trans-unit id="sb7ff80582ccd9348">
<source>reference will be left dangling</source>
</trans-unit>
<trans-unit id="s0b7ddc0168e79ea2">
<source>Failed to fetch files</source>
</trans-unit>
<trans-unit id="sdc4f1cfd587212b4">
<source>You can also enter a URL (https://...), Font Awesome icon (fa://fa-icon-name), or upload a new file.</source>
</trans-unit>
<trans-unit id="s8015ac3b47172dc8">
<source>Select from uploaded files, or type a Font Awesome icon (fa://fa-icon-name) or URL.</source>
</trans-unit>
<trans-unit id="s87616130c08b117c">
<source>This type is deprecated.</source>
</trans-unit>
<trans-unit id="s40f4c2223ce87751">
<source>No connectors configured. Navigate to Connectors in the sidebar and first create a connector.</source>
</trans-unit>
<trans-unit id="s70c2cd89201ecca9">
<source>Home directory</source>
</trans-unit>
<trans-unit id="sb171d638b8af660d">
<source>Successfully updated agent connector.</source>
</trans-unit>
<trans-unit id="s81c9554908463f94">
<source>Successfully created agent connector.</source>
</trans-unit>
<trans-unit id="s306dd51d3be07bc7">
<source>Device compliance settings</source>
</trans-unit>
<trans-unit id="sc2966702517b7af5">
<source>Challenge certificate</source>
</trans-unit>
<trans-unit id="s051588c63fedab5f">
<source>Challenge idle timeout</source>
</trans-unit>
<trans-unit id="s4c70d7629e29ac2d">
<source>Duration the flow executor will wait before continuing without a response.</source>
</trans-unit>
<trans-unit id="se3c7fb54006d9e98">
<source>Trigger check-in on device</source>
</trans-unit>
<trans-unit id="se0a747f4db08e87f">
<source>Configure how devices connect with authentik and ingest external device data.</source>
</trans-unit>
<trans-unit id="s114f2b310ef163ff">
<source>Stage which associates the currently used device with the current session.</source>
</trans-unit>
<trans-unit id="s8290d08ab5a49ed0">
<source>Connector</source>
</trans-unit>
<trans-unit id="s5e8eefcbbeffd4d5">
<source>Device optional</source>
</trans-unit>
<trans-unit id="s51b09bba5dcc19b0">
<source>If no device was provided, this stage will succeed and continue to the next stage.</source>
</trans-unit>
<trans-unit id="s5f58e358343a5514">
<source>Device required</source>
</trans-unit>
<trans-unit id="s6df8326edea3b23d">
<source>If no device was provided, this stage will stop flow execution.</source>
</trans-unit>
<trans-unit id="s506c7d2e87f6770e">
<source>Filename can only contain letters, numbers, dots, hyphens, and underscores</source>
</trans-unit>
<trans-unit id="s3a3d5b2575cd32ea">
<source>File uploaded successfully</source>
</trans-unit>
<trans-unit id="sd3775ef947e0de32">
<source>File Name</source>
</trans-unit>
<trans-unit id="s1afc99a84a890514">
<source>Type an optional custom file name...</source>
</trans-unit>
<trans-unit id="sb40e2763045466ea">
<source>Optionally rename the file (without extension). Leave empty to keep the original filename.</source>
</trans-unit>
<trans-unit id="s803ce7e1a2294d50">
<source>Files</source>
</trans-unit>
<trans-unit id="s42d82601762f5321">
<source>Manage uploaded files.</source>
</trans-unit>
<trans-unit id="saad01178f02a6a23">
<source>file</source>
</trans-unit>
<trans-unit id="s69f800801812a5f0">
<source>files</source>
</trans-unit>
<trans-unit id="s96668830629e0dfc">
<source>Upload</source>
</trans-unit>
<trans-unit id="sa32e9d0a108ee802">
<source>Upload File</source>
</trans-unit>
<trans-unit id="s95094b57684716a5">
<source>Failed to validate device.</source>
</trans-unit>
<trans-unit id="se99d25eb70c767ef">
<source>Verifying your device...</source>
</trans-unit>
</body>
</file>
</xliff>

View File

@@ -1,6 +1,94 @@
<?xml version="1.0"?><xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" version="1.2">
<file target-language="tr_TR" source-language="en" original="lit-localize-inputs" datatype="plaintext">
<file target-language="tr-TR" source-language="en" original="lit-localize-inputs" datatype="plaintext">
<body>
<!-- #region Locales -->
<trans-unit id="en">
<source>English</source>
<target>İngilizce</target>
</trans-unit>
<trans-unit id="pseudo-LOCALE">
<source>Pseudolocale</source>
<target>Sahte dil</target>
</trans-unit>
<trans-unit id="cs-CZ">
<source>Czech</source>
<target>Çekçe</target>
</trans-unit>
<trans-unit id="de-DE">
<source>German</source>
<target>Almanca</target>
</trans-unit>
<trans-unit id="es-ES">
<source>Spanish</source>
<target>İspanyolca</target>
</trans-unit>
<trans-unit id="fi-FI">
<source>Finnish</source>
<target>Fince</target>
</trans-unit>
<trans-unit id="fr-FR">
<source>French</source>
<target>Fransızca</target>
</trans-unit>
<trans-unit id="it-IT">
<source>Italian</source>
<target>İtalyanca</target>
</trans-unit>
<trans-unit id="ja-JP">
<source>Japanese</source>
<target>Japonca</target>
</trans-unit>
<trans-unit id="ko-KR">
<source>Korean</source>
<target>Korece</target>
</trans-unit>
<trans-unit id="nl-NL">
<source>Dutch</source>
<target>Hollandaca</target>
</trans-unit>
<trans-unit id="pl-PL">
<source>Polish</source>
<target>Lehçe</target>
</trans-unit>
<trans-unit id="pt-BR">
<source>Portuguese</source>
<target>Portekizce</target>
</trans-unit>
<trans-unit id="ru-RU">
<source>Russian</source>
<target>Rusça</target>
</trans-unit>
<trans-unit id="tr-TR">
<source>Turkish</source>
<target>Türkçe</target>
</trans-unit>
<trans-unit id="zh-Hans">
<source>Chinese Simplified</source>
<target>Çince</target>
</trans-unit>
<trans-unit id="zh-Hant">
<source>Chinese Traditional</source>
<target>Çince</target>
</trans-unit>
<!-- #endregion -->
<!-- #region Locale selector -->
<trans-unit id="locale-auto-detect-option">
<source>Auto-detect</source>
<target>Otomatik algılama</target>
<note from="lit-localize">Label for the auto-detect locale option in language selection dropdown</note>
</trans-unit>
<trans-unit id="language-selector-label">
<source>Select language</source>
<target>Dili seçin</target>
<note from="lit-localize">Label for the language selection dropdown</note>
</trans-unit>
<trans-unit id="locale-option-localized-label">
<source><x id="0" equiv-text="${localeLabel}"/> (<x id="1" equiv-text="${translatedLabel}"/>)</source>
<note from="lit-localize">Locale option label showing the localized language name along with the native language name in parentheses. The first placeholder is the localized language name, the second is the native language name.</note>
</trans-unit>
<!-- #endregion -->
<trans-unit id="s12d6dde9b30c3093">
<source>Dismiss</source>
</trans-unit>
@@ -2916,18 +3004,6 @@
<source>Icon</source>
<target>Simge</target>
</trans-unit>
<trans-unit id="s67e20cd8018d7e3c">
<source>Currently set to:</source>
<target>Şu anda şu şekilde ayarlanmış:</target>
</trans-unit>
<trans-unit id="s80e6d6fe5ad458d3">
<source>Clear icon</source>
<target>Simgeyi temizle</target>
</trans-unit>
<trans-unit id="s485c05d34eb00415">
<source>Delete currently set icon.</source>
<target>Şu anda ayarlanan simgeyi sil.</target>
</trans-unit>
<trans-unit id="s6d3b4d0561ba1cff">
<source>Publisher</source>
<target>Yayıncı</target>
@@ -4077,12 +4153,6 @@ Belirlenen seçeneklerden biri veya her ikisi de eşiğe eşit veya eşiğin üz
<source>Click to change value</source>
<target>Değeri değiştirmek için tıklayın</target>
</trans-unit>
<trans-unit id="se17f29e830ebf9be">
<source>Successfully updated connector.</source>
</trans-unit>
<trans-unit id="s6da88527f3e5e513">
<source>Successfully created connector.</source>
</trans-unit>
<trans-unit id="s6a087e34edeadc1f">
<source>Connector name...</source>
</trans-unit>
@@ -4132,9 +4202,6 @@ Belirlenen seçeneklerden biri veya her ikisi de eşiğe eşit veya eşiğin üz
<trans-unit id="s80b0feb2a6b98ef9">
<source>Connectors</source>
</trans-unit>
<trans-unit id="s7e840add1b48d751">
<source>Configure how devices communicate with authentik and external sources device data is fetched from.</source>
</trans-unit>
<trans-unit id="s58d0ed0cc064ec4f">
<source>Update Connector</source>
</trans-unit>
@@ -6000,68 +6067,10 @@ Belirlenen seçeneklerden biri veya her ikisi de eşiğe eşit veya eşiğin üz
<source>Warning: No invitation stage is bound to any flow. Invitations will not work as expected.</source>
<target>Uyarı: Hiçbir davetiye aşaması herhangi bir akışa bağlı değildir. Davetiyeler beklendiği gibi çalışmaz.</target>
</trans-unit>
<trans-unit id="s2da4aa7a9abeb653">
<source>Pseudolocale (for testing)</source>
<target>Pseudolocale (test için)</target>
</trans-unit>
<trans-unit id="s63e71d20d1eaca93">
<source>German</source>
<target>Almanca</target>
</trans-unit>
<trans-unit id="s4caed5b7a7e5d89b">
<source>English</source>
<target>İngilizce</target>
</trans-unit>
<trans-unit id="sf1868dc19e3917bb">
<source>Spanish</source>
<target>İspanyolca</target>
</trans-unit>
<trans-unit id="s75a27f43413e02c5">
<source>French</source>
<target>Fransızca</target>
</trans-unit>
<trans-unit id="sd48cc52117f4d68b">
<source>Italian</source>
</trans-unit>
<trans-unit id="sdd35b688281b6dea">
<source>Japanese</source>
</trans-unit>
<trans-unit id="s94d61907ee22a8c1">
<source>Korean</source>
<target>Kore dili</target>
</trans-unit>
<trans-unit id="s95d56e58f816d211">
<source>Dutch</source>
<target>Hollanda dili</target>
</trans-unit>
<trans-unit id="s03f49e598ffb11cc">
<source>Polish</source>
<target>Lehçe</target>
</trans-unit>
<trans-unit id="sa30c12014e955946">
<source>Russian</source>
<target>Rusça</target>
</trans-unit>
<trans-unit id="s9d2d00982edafabb">
<source>Turkish</source>
<target>Türkçe</target>
</trans-unit>
<trans-unit id="s354e0a9f146d2869">
<source>Chinese (simplified)</source>
<target>Çince (basitleştirilmiş)</target>
</trans-unit>
<trans-unit id="se3e6af2ce24d80e8">
<source>Chinese (traditional)</source>
<target>Çince (geleneksel)</target>
</trans-unit>
<trans-unit id="s8939f574b096054a">
<source>Not you?</source>
<target>Sen değil mi?</target>
</trans-unit>
<trans-unit id="s2f995efbb1e46b18">
<source>Auto-detect (based on your browser)</source>
<target>Otomatik algıla (tarayıcınıza göre)</target>
</trans-unit>
<trans-unit id="s296fbffaaa7c910a">
<source>Required.</source>
<target>Zorunlu.</target>
@@ -7450,14 +7459,6 @@ Belirlenen seçeneklerden biri veya her ikisi de eşiğe eşit veya eşiğin üz
<source>Background shown during execution.</source>
<target>Yürütme sırasında arka plan gösterilir.</target>
</trans-unit>
<trans-unit id="s3ebf4c166058afce">
<source>Clear background</source>
<target>Arka planı temizle</target>
</trans-unit>
<trans-unit id="sb24755ea94bef31d">
<source>Delete currently set background image.</source>
<target>Şu anda ayarlanmış arka plan görüntüsünü sil.</target>
</trans-unit>
<trans-unit id="sb904f23f17b60c3a">
<source>Successfully imported flow.</source>
<target>Akış başarıyla aktarıldı.</target>
@@ -8516,9 +8517,6 @@ Gruplara/kullanıcılara yapılan bağlamalar, etkinliğin kullanıcısına kar
<trans-unit id="s0393ac07cf8a3097">
<source>Endpoint Devices</source>
</trans-unit>
<trans-unit id="s02d57c823e493fe9">
<source>Device groups</source>
</trans-unit>
<trans-unit id="s4f1ad6b48a5df506">
<source>Logs</source>
<target>Günlükler</target>
@@ -9276,6 +9274,111 @@ Gruplara/kullanıcılara yapılan bağlamalar, etkinliğin kullanıcısına kar
<source>...</source>
<note from="lit-localize">Truncation ellipsis</note>
</trans-unit>
<trans-unit id="s6cd96061d397f7b5">
<source>Via <x id="0" equiv-text="${event.context.device.name}"/></source>
</trans-unit>
<trans-unit id="sb7ff80582ccd9348">
<source>reference will be left dangling</source>
</trans-unit>
<trans-unit id="s0b7ddc0168e79ea2">
<source>Failed to fetch files</source>
</trans-unit>
<trans-unit id="sdc4f1cfd587212b4">
<source>You can also enter a URL (https://...), Font Awesome icon (fa://fa-icon-name), or upload a new file.</source>
</trans-unit>
<trans-unit id="s8015ac3b47172dc8">
<source>Select from uploaded files, or type a Font Awesome icon (fa://fa-icon-name) or URL.</source>
</trans-unit>
<trans-unit id="s87616130c08b117c">
<source>This type is deprecated.</source>
</trans-unit>
<trans-unit id="s40f4c2223ce87751">
<source>No connectors configured. Navigate to Connectors in the sidebar and first create a connector.</source>
</trans-unit>
<trans-unit id="s70c2cd89201ecca9">
<source>Home directory</source>
</trans-unit>
<trans-unit id="sb171d638b8af660d">
<source>Successfully updated agent connector.</source>
</trans-unit>
<trans-unit id="s81c9554908463f94">
<source>Successfully created agent connector.</source>
</trans-unit>
<trans-unit id="s306dd51d3be07bc7">
<source>Device compliance settings</source>
</trans-unit>
<trans-unit id="sc2966702517b7af5">
<source>Challenge certificate</source>
</trans-unit>
<trans-unit id="s051588c63fedab5f">
<source>Challenge idle timeout</source>
</trans-unit>
<trans-unit id="s4c70d7629e29ac2d">
<source>Duration the flow executor will wait before continuing without a response.</source>
</trans-unit>
<trans-unit id="se3c7fb54006d9e98">
<source>Trigger check-in on device</source>
</trans-unit>
<trans-unit id="se0a747f4db08e87f">
<source>Configure how devices connect with authentik and ingest external device data.</source>
</trans-unit>
<trans-unit id="s114f2b310ef163ff">
<source>Stage which associates the currently used device with the current session.</source>
</trans-unit>
<trans-unit id="s8290d08ab5a49ed0">
<source>Connector</source>
</trans-unit>
<trans-unit id="s5e8eefcbbeffd4d5">
<source>Device optional</source>
</trans-unit>
<trans-unit id="s51b09bba5dcc19b0">
<source>If no device was provided, this stage will succeed and continue to the next stage.</source>
</trans-unit>
<trans-unit id="s5f58e358343a5514">
<source>Device required</source>
</trans-unit>
<trans-unit id="s6df8326edea3b23d">
<source>If no device was provided, this stage will stop flow execution.</source>
</trans-unit>
<trans-unit id="s506c7d2e87f6770e">
<source>Filename can only contain letters, numbers, dots, hyphens, and underscores</source>
</trans-unit>
<trans-unit id="s3a3d5b2575cd32ea">
<source>File uploaded successfully</source>
</trans-unit>
<trans-unit id="sd3775ef947e0de32">
<source>File Name</source>
</trans-unit>
<trans-unit id="s1afc99a84a890514">
<source>Type an optional custom file name...</source>
</trans-unit>
<trans-unit id="sb40e2763045466ea">
<source>Optionally rename the file (without extension). Leave empty to keep the original filename.</source>
</trans-unit>
<trans-unit id="s803ce7e1a2294d50">
<source>Files</source>
</trans-unit>
<trans-unit id="s42d82601762f5321">
<source>Manage uploaded files.</source>
</trans-unit>
<trans-unit id="saad01178f02a6a23">
<source>file</source>
</trans-unit>
<trans-unit id="s69f800801812a5f0">
<source>files</source>
</trans-unit>
<trans-unit id="s96668830629e0dfc">
<source>Upload</source>
</trans-unit>
<trans-unit id="sa32e9d0a108ee802">
<source>Upload File</source>
</trans-unit>
<trans-unit id="s95094b57684716a5">
<source>Failed to validate device.</source>
</trans-unit>
<trans-unit id="se99d25eb70c767ef">
<source>Verifying your device...</source>
</trans-unit>
</body>
</file>
</xliff>

View File

@@ -1,6 +1,94 @@
<?xml version="1.0"?><xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" version="1.2">
<file target-language="zh_Hans" source-language="en" original="lit-localize-inputs" datatype="plaintext">
<file target-language="zh-Hans" source-language="en" original="lit-localize-inputs" datatype="plaintext">
<body>
<!-- #region Locales -->
<trans-unit id="en">
<source>English</source>
<target>英语</target>
</trans-unit>
<trans-unit id="pseudo-LOCALE">
<source>Pseudolocale</source>
<target>伪语言</target>
</trans-unit>
<trans-unit id="cs-CZ">
<source>Czech</source>
<target>捷克语</target>
</trans-unit>
<trans-unit id="de-DE">
<source>German</source>
<target>德语</target>
</trans-unit>
<trans-unit id="es-ES">
<source>Spanish</source>
<target>西班牙语</target>
</trans-unit>
<trans-unit id="fi-FI">
<source>Finnish</source>
<target>芬兰语</target>
</trans-unit>
<trans-unit id="fr-FR">
<source>French</source>
<target>法语</target>
</trans-unit>
<trans-unit id="it-IT">
<source>Italian</source>
<target>意大利语</target>
</trans-unit>
<trans-unit id="ja-JP">
<source>Japanese</source>
<target>日语</target>
</trans-unit>
<trans-unit id="ko-KR">
<source>Korean</source>
<target>韩语</target>
</trans-unit>
<trans-unit id="nl-NL">
<source>Dutch</source>
<target>荷兰语</target>
</trans-unit>
<trans-unit id="pl-PL">
<source>Polish</source>
<target>波兰语</target>
</trans-unit>
<trans-unit id="pt-BR">
<source>Portuguese</source>
<target>葡萄牙语</target>
</trans-unit>
<trans-unit id="ru-RU">
<source>Russian</source>
<target>俄语</target>
</trans-unit>
<trans-unit id="tr-TR">
<source>Turkish</source>
<target>土耳其语</target>
</trans-unit>
<trans-unit id="zh-Hans">
<source>Chinese Simplified</source>
<target>简体中文</target>
</trans-unit>
<trans-unit id="zh-Hant">
<source>Chinese Traditional</source>
<target>繁体中文</target>
</trans-unit>
<!-- #endregion -->
<!-- #region Locale selector -->
<trans-unit id="locale-auto-detect-option">
<source>Auto-detect</source>
<target>自动检测</target>
<note from="lit-localize">Label for the auto-detect locale option in language selection dropdown</note>
</trans-unit>
<trans-unit id="language-selector-label">
<source>Select language</source>
<target>选择语言</target>
<note from="lit-localize">Label for the language selection dropdown</note>
</trans-unit>
<trans-unit id="locale-option-localized-label">
<source><x id="0" equiv-text="${localeLabel}"/> (<x id="1" equiv-text="${translatedLabel}"/>)</source>
<note from="lit-localize">Locale option label showing the localized language name along with the native language name in parentheses. The first placeholder is the localized language name, the second is the native language name.</note>
</trans-unit>
<!-- #endregion -->
<trans-unit id="s12d6dde9b30c3093">
<source>Dismiss</source>
<target>取消</target>
@@ -3133,18 +3221,6 @@
<source>Icon</source>
<target>图标</target>
</trans-unit>
<trans-unit id="s67e20cd8018d7e3c">
<source>Currently set to:</source>
<target>当前设置为:</target>
</trans-unit>
<trans-unit id="s80e6d6fe5ad458d3">
<source>Clear icon</source>
<target>清除图标</target>
</trans-unit>
<trans-unit id="s485c05d34eb00415">
<source>Delete currently set icon.</source>
<target>删除当前设置的图标。</target>
</trans-unit>
<trans-unit id="s6d3b4d0561ba1cff">
<source>Publisher</source>
<target>发布者</target>
@@ -4365,12 +4441,6 @@ doesn't pass when either or both of the selected options are equal or above the
<source>Click to change value</source>
<target>点击以更改值</target>
</trans-unit>
<trans-unit id="se17f29e830ebf9be">
<source>Successfully updated connector.</source>
</trans-unit>
<trans-unit id="s6da88527f3e5e513">
<source>Successfully created connector.</source>
</trans-unit>
<trans-unit id="s6a087e34edeadc1f">
<source>Connector name...</source>
</trans-unit>
@@ -4420,9 +4490,6 @@ doesn't pass when either or both of the selected options are equal or above the
<trans-unit id="s80b0feb2a6b98ef9">
<source>Connectors</source>
</trans-unit>
<trans-unit id="s7e840add1b48d751">
<source>Configure how devices communicate with authentik and external sources device data is fetched from.</source>
</trans-unit>
<trans-unit id="s58d0ed0cc064ec4f">
<source>Update Connector</source>
</trans-unit>
@@ -6390,69 +6457,10 @@ doesn't pass when either or both of the selected options are equal or above the
<source>Warning: No invitation stage is bound to any flow. Invitations will not work as expected.</source>
<target>警告:没有邀请阶段绑定到任何流程。邀请将无法按预期工作。</target>
</trans-unit>
<trans-unit id="s2da4aa7a9abeb653">
<source>Pseudolocale (for testing)</source>
<target>伪区域(测试用)</target>
</trans-unit>
<trans-unit id="s63e71d20d1eaca93">
<source>German</source>
<target>德语</target>
</trans-unit>
<trans-unit id="s4caed5b7a7e5d89b">
<source>English</source>
<target>英语</target>
</trans-unit>
<trans-unit id="sf1868dc19e3917bb">
<source>Spanish</source>
<target>西班牙语</target>
</trans-unit>
<trans-unit id="s75a27f43413e02c5">
<source>French</source>
<target>法语</target>
</trans-unit>
<trans-unit id="sd48cc52117f4d68b">
<source>Italian</source>
<target>意大利语</target>
</trans-unit>
<trans-unit id="sdd35b688281b6dea">
<source>Japanese</source>
</trans-unit>
<trans-unit id="s94d61907ee22a8c1">
<source>Korean</source>
<target>韩语</target>
</trans-unit>
<trans-unit id="s95d56e58f816d211">
<source>Dutch</source>
<target>荷兰语</target>
</trans-unit>
<trans-unit id="s03f49e598ffb11cc">
<source>Polish</source>
<target>波兰语</target>
</trans-unit>
<trans-unit id="sa30c12014e955946">
<source>Russian</source>
<target>俄语</target>
</trans-unit>
<trans-unit id="s9d2d00982edafabb">
<source>Turkish</source>
<target>土耳其语</target>
</trans-unit>
<trans-unit id="s354e0a9f146d2869">
<source>Chinese (simplified)</source>
<target>简体中文</target>
</trans-unit>
<trans-unit id="se3e6af2ce24d80e8">
<source>Chinese (traditional)</source>
<target>繁体中文</target>
</trans-unit>
<trans-unit id="s8939f574b096054a">
<source>Not you?</source>
<target>不是您?</target>
</trans-unit>
<trans-unit id="s2f995efbb1e46b18">
<source>Auto-detect (based on your browser)</source>
<target>自动检测(基于您的浏览器)</target>
</trans-unit>
<trans-unit id="s296fbffaaa7c910a">
<source>Required.</source>
<target>必需。</target>
@@ -7895,14 +7903,6 @@ doesn't pass when either or both of the selected options are equal or above the
<source>Background shown during execution.</source>
<target>执行过程中显示的背景。</target>
</trans-unit>
<trans-unit id="s3ebf4c166058afce">
<source>Clear background</source>
<target>清除背景</target>
</trans-unit>
<trans-unit id="sb24755ea94bef31d">
<source>Delete currently set background image.</source>
<target>删除当前设置的背景图片。</target>
</trans-unit>
<trans-unit id="sb904f23f17b60c3a">
<source>Successfully imported flow.</source>
<target>已成功导入流程。</target>
@@ -9018,9 +9018,6 @@ Bindings to groups/users are checked against the user of the event.</source>
<trans-unit id="s0393ac07cf8a3097">
<source>Endpoint Devices</source>
</trans-unit>
<trans-unit id="s02d57c823e493fe9">
<source>Device groups</source>
</trans-unit>
<trans-unit id="s4f1ad6b48a5df506">
<source>Logs</source>
<target>日志</target>
@@ -9839,6 +9836,111 @@ Bindings to groups/users are checked against the user of the event.</source>
<source>...</source>
<note from="lit-localize">Truncation ellipsis</note>
</trans-unit>
<trans-unit id="s6cd96061d397f7b5">
<source>Via <x id="0" equiv-text="${event.context.device.name}"/></source>
</trans-unit>
<trans-unit id="sb7ff80582ccd9348">
<source>reference will be left dangling</source>
</trans-unit>
<trans-unit id="s0b7ddc0168e79ea2">
<source>Failed to fetch files</source>
</trans-unit>
<trans-unit id="sdc4f1cfd587212b4">
<source>You can also enter a URL (https://...), Font Awesome icon (fa://fa-icon-name), or upload a new file.</source>
</trans-unit>
<trans-unit id="s8015ac3b47172dc8">
<source>Select from uploaded files, or type a Font Awesome icon (fa://fa-icon-name) or URL.</source>
</trans-unit>
<trans-unit id="s87616130c08b117c">
<source>This type is deprecated.</source>
</trans-unit>
<trans-unit id="s40f4c2223ce87751">
<source>No connectors configured. Navigate to Connectors in the sidebar and first create a connector.</source>
</trans-unit>
<trans-unit id="s70c2cd89201ecca9">
<source>Home directory</source>
</trans-unit>
<trans-unit id="sb171d638b8af660d">
<source>Successfully updated agent connector.</source>
</trans-unit>
<trans-unit id="s81c9554908463f94">
<source>Successfully created agent connector.</source>
</trans-unit>
<trans-unit id="s306dd51d3be07bc7">
<source>Device compliance settings</source>
</trans-unit>
<trans-unit id="sc2966702517b7af5">
<source>Challenge certificate</source>
</trans-unit>
<trans-unit id="s051588c63fedab5f">
<source>Challenge idle timeout</source>
</trans-unit>
<trans-unit id="s4c70d7629e29ac2d">
<source>Duration the flow executor will wait before continuing without a response.</source>
</trans-unit>
<trans-unit id="se3c7fb54006d9e98">
<source>Trigger check-in on device</source>
</trans-unit>
<trans-unit id="se0a747f4db08e87f">
<source>Configure how devices connect with authentik and ingest external device data.</source>
</trans-unit>
<trans-unit id="s114f2b310ef163ff">
<source>Stage which associates the currently used device with the current session.</source>
</trans-unit>
<trans-unit id="s8290d08ab5a49ed0">
<source>Connector</source>
</trans-unit>
<trans-unit id="s5e8eefcbbeffd4d5">
<source>Device optional</source>
</trans-unit>
<trans-unit id="s51b09bba5dcc19b0">
<source>If no device was provided, this stage will succeed and continue to the next stage.</source>
</trans-unit>
<trans-unit id="s5f58e358343a5514">
<source>Device required</source>
</trans-unit>
<trans-unit id="s6df8326edea3b23d">
<source>If no device was provided, this stage will stop flow execution.</source>
</trans-unit>
<trans-unit id="s506c7d2e87f6770e">
<source>Filename can only contain letters, numbers, dots, hyphens, and underscores</source>
</trans-unit>
<trans-unit id="s3a3d5b2575cd32ea">
<source>File uploaded successfully</source>
</trans-unit>
<trans-unit id="sd3775ef947e0de32">
<source>File Name</source>
</trans-unit>
<trans-unit id="s1afc99a84a890514">
<source>Type an optional custom file name...</source>
</trans-unit>
<trans-unit id="sb40e2763045466ea">
<source>Optionally rename the file (without extension). Leave empty to keep the original filename.</source>
</trans-unit>
<trans-unit id="s803ce7e1a2294d50">
<source>Files</source>
</trans-unit>
<trans-unit id="s42d82601762f5321">
<source>Manage uploaded files.</source>
</trans-unit>
<trans-unit id="saad01178f02a6a23">
<source>file</source>
</trans-unit>
<trans-unit id="s69f800801812a5f0">
<source>files</source>
</trans-unit>
<trans-unit id="s96668830629e0dfc">
<source>Upload</source>
</trans-unit>
<trans-unit id="sa32e9d0a108ee802">
<source>Upload File</source>
</trans-unit>
<trans-unit id="s95094b57684716a5">
<source>Failed to validate device.</source>
</trans-unit>
<trans-unit id="se99d25eb70c767ef">
<source>Verifying your device...</source>
</trans-unit>
</body>
</file>
</xliff>

View File

@@ -1,6 +1,94 @@
<?xml version="1.0"?><xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" version="1.2">
<file target-language="zh_Hant" source-language="en" original="lit-localize-inputs" datatype="plaintext">
<file target-language="zh-Hant" source-language="en" original="lit-localize-inputs" datatype="plaintext">
<body>
<!-- #region Locales -->
<trans-unit id="en">
<source>English</source>
<target>英語</target>
</trans-unit>
<trans-unit id="pseudo-LOCALE">
<source>Pseudolocale</source>
<target>偽語言</target>
</trans-unit>
<trans-unit id="cs-CZ">
<source>Czech</source>
<target>捷克語</target>
</trans-unit>
<trans-unit id="de-DE">
<source>German</source>
<target>德語</target>
</trans-unit>
<trans-unit id="es-ES">
<source>Spanish</source>
<target>西班牙語</target>
</trans-unit>
<trans-unit id="fi-FI">
<source>Finnish</source>
<target>芬蘭語</target>
</trans-unit>
<trans-unit id="fr-FR">
<source>French</source>
<target>法語</target>
</trans-unit>
<trans-unit id="it-IT">
<source>Italian</source>
<target>義大利語</target>
</trans-unit>
<trans-unit id="ja-JP">
<source>Japanese</source>
<target>日語</target>
</trans-unit>
<trans-unit id="ko-KR">
<source>Korean</source>
<target>韓語</target>
</trans-unit>
<trans-unit id="nl-NL">
<source>Dutch</source>
<target>荷蘭語</target>
</trans-unit>
<trans-unit id="pl-PL">
<source>Polish</source>
<target>波蘭語</target>
</trans-unit>
<trans-unit id="pt-BR">
<source>Portuguese</source>
<target>葡萄牙語</target>
</trans-unit>
<trans-unit id="ru-RU">
<source>Russian</source>
<target>俄語</target>
</trans-unit>
<trans-unit id="tr-TR">
<source>Turkish</source>
<target>土耳其語</target>
</trans-unit>
<trans-unit id="zh-Hans">
<source>Chinese Simplified</source>
<target>簡體中文</target>
</trans-unit>
<trans-unit id="zh-Hant">
<source>Chinese Traditional</source>
<target>繁體中文</target>
</trans-unit>
<!-- #endregion -->
<!-- #region Locale selector -->
<trans-unit id="locale-auto-detect-option">
<source>Auto-detect</source>
<target>自動偵測</target>
<note from="lit-localize">Label for the auto-detect locale option in language selection dropdown</note>
</trans-unit>
<trans-unit id="language-selector-label">
<source>Select language</source>
<target>選擇語言</target>
<note from="lit-localize">Label for the language selection dropdown</note>
</trans-unit>
<trans-unit id="locale-option-localized-label">
<source><x id="0" equiv-text="${localeLabel}"/> (<x id="1" equiv-text="${translatedLabel}"/>)</source>
<note from="lit-localize">Locale option label showing the localized language name along with the native language name in parentheses. The first placeholder is the localized language name, the second is the native language name.</note>
</trans-unit>
<!-- #endregion -->
<trans-unit id="s12d6dde9b30c3093">
<source>Dismiss</source>
</trans-unit>
@@ -2790,18 +2878,6 @@
<source>Icon</source>
<target>圖示</target>
</trans-unit>
<trans-unit id="s67e20cd8018d7e3c">
<source>Currently set to:</source>
<target>目前設定為:</target>
</trans-unit>
<trans-unit id="s80e6d6fe5ad458d3">
<source>Clear icon</source>
<target>清除圖示</target>
</trans-unit>
<trans-unit id="s485c05d34eb00415">
<source>Delete currently set icon.</source>
<target>刪除目前的圖示。</target>
</trans-unit>
<trans-unit id="s6d3b4d0561ba1cff">
<source>Publisher</source>
<target>發行人</target>
@@ -3912,12 +3988,6 @@ doesn't pass when either or both of the selected options are equal or above the
<source>Click to change value</source>
<target>點擊以更改數值</target>
</trans-unit>
<trans-unit id="se17f29e830ebf9be">
<source>Successfully updated connector.</source>
</trans-unit>
<trans-unit id="s6da88527f3e5e513">
<source>Successfully created connector.</source>
</trans-unit>
<trans-unit id="s6a087e34edeadc1f">
<source>Connector name...</source>
</trans-unit>
@@ -3967,9 +4037,6 @@ doesn't pass when either or both of the selected options are equal or above the
<trans-unit id="s80b0feb2a6b98ef9">
<source>Connectors</source>
</trans-unit>
<trans-unit id="s7e840add1b48d751">
<source>Configure how devices communicate with authentik and external sources device data is fetched from.</source>
</trans-unit>
<trans-unit id="s58d0ed0cc064ec4f">
<source>Update Connector</source>
</trans-unit>
@@ -5755,65 +5822,10 @@ doesn't pass when either or both of the selected options are equal or above the
<source>Warning: No invitation stage is bound to any flow. Invitations will not work as expected.</source>
<target>警告:邀請流程沒有附加到任何流程。邀請將無法依照預期工作。</target>
</trans-unit>
<trans-unit id="s2da4aa7a9abeb653">
<source>Pseudolocale (for testing)</source>
<target>虛擬翻譯語言(用於測試)</target>
</trans-unit>
<trans-unit id="s63e71d20d1eaca93">
<source>German</source>
<target>德語</target>
</trans-unit>
<trans-unit id="s4caed5b7a7e5d89b">
<source>English</source>
<target>英語</target>
</trans-unit>
<trans-unit id="sf1868dc19e3917bb">
<source>Spanish</source>
<target>西班牙語</target>
</trans-unit>
<trans-unit id="s75a27f43413e02c5">
<source>French</source>
<target>法語</target>
</trans-unit>
<trans-unit id="sd48cc52117f4d68b">
<source>Italian</source>
</trans-unit>
<trans-unit id="sdd35b688281b6dea">
<source>Japanese</source>
</trans-unit>
<trans-unit id="s94d61907ee22a8c1">
<source>Korean</source>
</trans-unit>
<trans-unit id="s95d56e58f816d211">
<source>Dutch</source>
</trans-unit>
<trans-unit id="s03f49e598ffb11cc">
<source>Polish</source>
<target>波蘭語</target>
</trans-unit>
<trans-unit id="sa30c12014e955946">
<source>Russian</source>
</trans-unit>
<trans-unit id="s9d2d00982edafabb">
<source>Turkish</source>
<target>土耳其語</target>
</trans-unit>
<trans-unit id="s354e0a9f146d2869">
<source>Chinese (simplified)</source>
<target>簡體中文</target>
</trans-unit>
<trans-unit id="se3e6af2ce24d80e8">
<source>Chinese (traditional)</source>
<target>繁體中文</target>
</trans-unit>
<trans-unit id="s8939f574b096054a">
<source>Not you?</source>
<target>不是您?</target>
</trans-unit>
<trans-unit id="s2f995efbb1e46b18">
<source>Auto-detect (based on your browser)</source>
<target>自動偵測(基於您的瀏覽器)</target>
</trans-unit>
<trans-unit id="s296fbffaaa7c910a">
<source>Required.</source>
<target>必需。</target>
@@ -7155,14 +7167,6 @@ doesn't pass when either or both of the selected options are equal or above the
<source>Background shown during execution.</source>
<target>執行過程中顯示的背景。</target>
</trans-unit>
<trans-unit id="s3ebf4c166058afce">
<source>Clear background</source>
<target>清除背景</target>
</trans-unit>
<trans-unit id="sb24755ea94bef31d">
<source>Delete currently set background image.</source>
<target>刪除目前設定的背景圖片。</target>
</trans-unit>
<trans-unit id="sb904f23f17b60c3a">
<source>Successfully imported flow.</source>
<target>成功匯入流程。</target>
@@ -8152,9 +8156,6 @@ Bindings to groups/users are checked against the user of the event.</source>
<trans-unit id="s0393ac07cf8a3097">
<source>Endpoint Devices</source>
</trans-unit>
<trans-unit id="s02d57c823e493fe9">
<source>Device groups</source>
</trans-unit>
<trans-unit id="s4f1ad6b48a5df506">
<source>Logs</source>
<target>日誌</target>
@@ -8877,6 +8878,111 @@ Bindings to groups/users are checked against the user of the event.</source>
<source>...</source>
<note from="lit-localize">Truncation ellipsis</note>
</trans-unit>
<trans-unit id="s6cd96061d397f7b5">
<source>Via <x id="0" equiv-text="${event.context.device.name}"/></source>
</trans-unit>
<trans-unit id="sb7ff80582ccd9348">
<source>reference will be left dangling</source>
</trans-unit>
<trans-unit id="s0b7ddc0168e79ea2">
<source>Failed to fetch files</source>
</trans-unit>
<trans-unit id="sdc4f1cfd587212b4">
<source>You can also enter a URL (https://...), Font Awesome icon (fa://fa-icon-name), or upload a new file.</source>
</trans-unit>
<trans-unit id="s8015ac3b47172dc8">
<source>Select from uploaded files, or type a Font Awesome icon (fa://fa-icon-name) or URL.</source>
</trans-unit>
<trans-unit id="s87616130c08b117c">
<source>This type is deprecated.</source>
</trans-unit>
<trans-unit id="s40f4c2223ce87751">
<source>No connectors configured. Navigate to Connectors in the sidebar and first create a connector.</source>
</trans-unit>
<trans-unit id="s70c2cd89201ecca9">
<source>Home directory</source>
</trans-unit>
<trans-unit id="sb171d638b8af660d">
<source>Successfully updated agent connector.</source>
</trans-unit>
<trans-unit id="s81c9554908463f94">
<source>Successfully created agent connector.</source>
</trans-unit>
<trans-unit id="s306dd51d3be07bc7">
<source>Device compliance settings</source>
</trans-unit>
<trans-unit id="sc2966702517b7af5">
<source>Challenge certificate</source>
</trans-unit>
<trans-unit id="s051588c63fedab5f">
<source>Challenge idle timeout</source>
</trans-unit>
<trans-unit id="s4c70d7629e29ac2d">
<source>Duration the flow executor will wait before continuing without a response.</source>
</trans-unit>
<trans-unit id="se3c7fb54006d9e98">
<source>Trigger check-in on device</source>
</trans-unit>
<trans-unit id="se0a747f4db08e87f">
<source>Configure how devices connect with authentik and ingest external device data.</source>
</trans-unit>
<trans-unit id="s114f2b310ef163ff">
<source>Stage which associates the currently used device with the current session.</source>
</trans-unit>
<trans-unit id="s8290d08ab5a49ed0">
<source>Connector</source>
</trans-unit>
<trans-unit id="s5e8eefcbbeffd4d5">
<source>Device optional</source>
</trans-unit>
<trans-unit id="s51b09bba5dcc19b0">
<source>If no device was provided, this stage will succeed and continue to the next stage.</source>
</trans-unit>
<trans-unit id="s5f58e358343a5514">
<source>Device required</source>
</trans-unit>
<trans-unit id="s6df8326edea3b23d">
<source>If no device was provided, this stage will stop flow execution.</source>
</trans-unit>
<trans-unit id="s506c7d2e87f6770e">
<source>Filename can only contain letters, numbers, dots, hyphens, and underscores</source>
</trans-unit>
<trans-unit id="s3a3d5b2575cd32ea">
<source>File uploaded successfully</source>
</trans-unit>
<trans-unit id="sd3775ef947e0de32">
<source>File Name</source>
</trans-unit>
<trans-unit id="s1afc99a84a890514">
<source>Type an optional custom file name...</source>
</trans-unit>
<trans-unit id="sb40e2763045466ea">
<source>Optionally rename the file (without extension). Leave empty to keep the original filename.</source>
</trans-unit>
<trans-unit id="s803ce7e1a2294d50">
<source>Files</source>
</trans-unit>
<trans-unit id="s42d82601762f5321">
<source>Manage uploaded files.</source>
</trans-unit>
<trans-unit id="saad01178f02a6a23">
<source>file</source>
</trans-unit>
<trans-unit id="s69f800801812a5f0">
<source>files</source>
</trans-unit>
<trans-unit id="s96668830629e0dfc">
<source>Upload</source>
</trans-unit>
<trans-unit id="sa32e9d0a108ee802">
<source>Upload File</source>
</trans-unit>
<trans-unit id="s95094b57684716a5">
<source>Failed to validate device.</source>
</trans-unit>
<trans-unit id="se99d25eb70c767ef">
<source>Verifying your device...</source>
</trans-unit>
</body>
</file>
</xliff>