0
Fork 0
mirror of https://github.com/logto-io/logto.git synced 2025-04-07 23:01:25 -05:00

refactor(console): refactor app details page to support protected apps ()

This commit is contained in:
Charles Zhao 2024-01-20 10:13:19 +08:00 committed by GitHub
parent 982c2c9179
commit cc8b9d88e3
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
24 changed files with 949 additions and 39 deletions
packages
console/src
ds-components/FormField
pages
ApplicationDetails/ApplicationDetailsContent
GetStarted/ProtectedAppCreationForm
phrases/src/locales
de/translation/admin-console
en/translation/admin-console
es/translation/admin-console
fr/translation/admin-console
it/translation/admin-console
ja/translation/admin-console
ko/translation/admin-console
pl-pl/translation/admin-console
pt-br/translation/admin-console
pt-pt/translation/admin-console
ru/translation/admin-console
tr-tr/translation/admin-console
zh-cn/translation/admin-console
zh-hk/translation/admin-console
zh-tw/translation/admin-console

View file

@ -40,4 +40,9 @@
font: var(--font-body-2);
color: var(--color-text-secondary);
margin-top: _.unit(1);
&.top {
margin-top: 0;
margin-bottom: _.unit(1);
}
}

View file

@ -67,7 +67,9 @@ function FormField({
{isRequired && <div className={styles.required}>{t('general.required')}</div>}
</div>
{description && descriptionPosition === 'top' && (
<div className={styles.description}>{descriptionPosition}</div>
<div className={classNames(styles.description, styles.top)}>
{typeof description === 'string' ? <DynamicT forKey={description} /> : description}
</div>
)}
{children}
{description && descriptionPosition === 'bottom' && (

View file

@ -0,0 +1,48 @@
@use '@/scss/underscore' as _;
.launcher {
display: flex;
align-items: center;
justify-content: space-between;
padding: _.unit(3) _.unit(4);
background: var(--color-success-container);
border: 1px solid var(--color-on-success-container);
border-radius: 8px;
font: var(--font-body-2);
gap: _.unit(4);
span {
white-space: pre-wrap;
}
.button {
background: var(--color-on-success-container);
color: var(--color-static-white);
border: none;
flex-shrink: 0;
}
}
.routes {
display: grid;
grid-template-columns: repeat(2, 1fr);
gap: _.unit(3) _.unit(6);
}
.sessionDuration {
width: 135px;
input {
width: 86px;
flex: unset;
}
}
.tip {
white-space: pre-wrap;
ol {
margin: 0;
padding-inline-start: _.unit(5);
}
}

View file

@ -0,0 +1,165 @@
import { type Application } from '@logto/schemas';
import { type ChangeEvent } from 'react';
import { Controller, useFieldArray, useFormContext } from 'react-hook-form';
import { Trans, useTranslation } from 'react-i18next';
import ExternalLinkIcon from '@/assets/icons/external-link.svg';
import FormCard from '@/components/FormCard';
import Button from '@/ds-components/Button';
import CopyToClipboard from '@/ds-components/CopyToClipboard';
import FormField from '@/ds-components/FormField';
import TextInput from '@/ds-components/TextInput';
import NumericInput from '@/ds-components/TextInput/NumericInput';
import useDocumentationUrl from '@/hooks/use-documentation-url';
import { type ApplicationForm } from '../utils';
import * as styles from './index.module.scss';
type Props = {
data: Application;
};
const routes = Object.freeze(['/register', '/sign-in', '/sign-in-callback', '/sign-out']);
const maxSessionDuration = 365; // 1 year
function ProtectedAppSettings({ data }: Props) {
const { t } = useTranslation(undefined, { keyPrefix: 'admin_console' });
const { getDocumentationUrl } = useDocumentationUrl();
const {
control,
register,
formState: { errors },
} = useFormContext<ApplicationForm>();
const { fields } = useFieldArray({
control,
name: 'protectedAppMetadata.pageRules',
});
const host = data.protectedAppMetadata?.host;
return (
<>
<FormCard
title="application_details.integration"
description="application_details.integration_description"
learnMoreLink={{
href: getDocumentationUrl('/docs/references/applications'),
targetBlank: 'noopener',
}}
>
{!!host && (
<div className={styles.launcher}>
<span>{t('protected_app.success_message')}</span>
<Button
className={styles.button}
size="small"
title="application_details.try_it"
trailingIcon={<ExternalLinkIcon />}
onClick={() => {
window.open(`https://${host}`, '_blank');
}}
/>
</div>
)}
<FormField isRequired title="application_details.application_name">
<TextInput
{...register('name', { required: true })}
error={Boolean(errors.name)}
placeholder={t('application_details.application_name_placeholder')}
/>
</FormField>
<FormField
isRequired
title="protected_app.form.url_field_label"
tip={<span className={styles.tip}>{t('application_details.origin_url_tip')}</span>}
>
<TextInput
{...register('protectedAppMetadata.origin', { required: true })}
error={Boolean(errors.protectedAppMetadata?.origin)}
placeholder={t('protected_app.form.url_field_placeholder')}
/>
</FormField>
<FormField
title="application_details.custom_rules"
description="application_details.custom_rules_description"
descriptionPosition="top"
tip={
<span className={styles.tip}>
<Trans components={{ ol: <ol />, li: <li /> }}>
{t('application_details.custom_rules_tip')}
</Trans>
</span>
}
>
{fields.map((field, index) => (
<TextInput
key={field.id}
{...register(`protectedAppMetadata.pageRules.${index}.path`)}
error={Boolean(errors.protectedAppMetadata?.pageRules?.[index]?.path)}
placeholder={t('application_details.custom_rules_placeholder')}
/>
))}
</FormField>
</FormCard>
<FormCard
title="application_details.service_configuration"
description="application_details.service_configuration_description"
>
<FormField
title="application_details.authentication_routes"
description="application_details.authentication_routes_description"
descriptionPosition="top"
>
<div className={styles.routes}>
{routes.map((route) => (
<CopyToClipboard key={route} variant="border" value={route} />
))}
</div>
</FormField>
</FormCard>
<FormCard title="application_details.session">
<FormField title="application_details.session_duration">
<Controller
name="protectedAppMetadata.sessionDuration"
control={control}
rules={{
min: 1,
}}
render={({ field: { onChange, value, name } }) => (
<NumericInput
className={styles.sessionDuration}
name={name}
placeholder="14"
value={String(value)}
min={1}
max={maxSessionDuration}
error={Boolean(errors.protectedAppMetadata?.sessionDuration)}
onChange={({ target: { value } }: ChangeEvent<HTMLInputElement>) => {
onChange(value && Number(value));
}}
onValueUp={() => {
onChange(value + 1);
}}
onValueDown={() => {
onChange(value - 1);
}}
onBlur={() => {
if (value < 1) {
onChange(1);
} else if (value > maxSessionDuration) {
onChange(maxSessionDuration);
}
}}
/>
)}
/>
</FormField>
</FormCard>
</>
);
}
export default ProtectedAppSettings;

View file

@ -17,6 +17,8 @@ import TextInput from '@/ds-components/TextInput';
import TextLink from '@/ds-components/TextLink';
import useDocumentationUrl from '@/hooks/use-documentation-url';
import ProtectedAppSettings from './ProtectedAppSettings';
type Props = {
data: Application;
};
@ -33,6 +35,7 @@ function Settings({ data }: Props) {
const { type: applicationType, isThirdParty } = data;
const isNativeApp = applicationType === ApplicationType.Native;
const isProtectedApp = applicationType === ApplicationType.Protected;
const uriPatternRules: MultiTextInputRule = {
pattern: {
verify: (value) => !value || validateRedirectUrl(value, isNativeApp ? 'mobile' : 'web'),
@ -40,6 +43,10 @@ function Settings({ data }: Props) {
},
};
if (isProtectedApp) {
return <ProtectedAppSettings data={data} />;
}
return (
<FormCard
title="application_details.settings"

View file

@ -73,7 +73,7 @@ function ApplicationDetailsContent({ data, oidcConfig, onApplicationUpdated }: P
await api
.patch(`api/applications/${data.id}`, {
json: applicationFormDataParser.toUpdateApplicationData(formData),
json: applicationFormDataParser.toRequestPayload(formData),
})
.json<Application>();
reset(formData);
@ -185,8 +185,12 @@ function ApplicationDetailsContent({ data, oidcConfig, onApplicationUpdated }: P
onSubmit={onSubmit}
>
<Settings data={data} />
<EndpointsAndCredentials app={data} oidcConfig={oidcConfig} />
{data.type !== ApplicationType.MachineToMachine && <RefreshTokenSettings data={data} />}
{data.type !== ApplicationType.Protected && (
<EndpointsAndCredentials app={data} oidcConfig={oidcConfig} />
)}
{![ApplicationType.MachineToMachine, ApplicationType.Protected].includes(data.type) && (
<RefreshTokenSettings data={data} />
)}
</DetailsForm>
</FormProvider>
</TabWrapper>

View file

@ -1,51 +1,98 @@
import {
customClientMetadataDefault,
type ApplicationResponse,
type Application,
} from '@logto/schemas';
import { customClientMetadataDefault, type ApplicationResponse } from '@logto/schemas';
import { type DeepPartial, cond } from '@silverhand/essentials';
export type ApplicationForm = Pick<
ApplicationResponse,
'name' | 'description' | 'oidcClientMetadata' | 'customClientMetadata' | 'isAdmin'
>;
type ProtectedAppMetadataType = ApplicationResponse['protectedAppMetadata'];
export type ApplicationForm = {
name: ApplicationResponse['name'];
description?: ApplicationResponse['description'];
oidcClientMetadata?: ApplicationResponse['oidcClientMetadata'];
customClientMetadata?: ApplicationResponse['customClientMetadata'];
isAdmin?: ApplicationResponse['isAdmin'];
// eslint-disable-next-line @typescript-eslint/ban-types
protectedAppMetadata?: Omit<Exclude<ProtectedAppMetadataType, null>, 'customDomains'>;
};
const mapToUriFormatArrays = (value?: string[]) =>
value?.filter(Boolean).map((uri) => decodeURIComponent(uri)) ?? [];
value?.filter(Boolean).map((uri) => decodeURIComponent(uri));
const mapToUriOriginFormatArrays = (value?: string[]) =>
value?.filter(Boolean).map((uri) => decodeURIComponent(uri.replace(/\/*$/, ''))) ?? [];
value?.filter(Boolean).map((uri) => decodeURIComponent(uri.replace(/\/*$/, '')));
export const applicationFormDataParser = {
fromResponse: (data: ApplicationResponse): ApplicationForm => {
const { name, description, oidcClientMetadata, customClientMetadata, isAdmin } = data;
return {
const {
name,
description,
oidcClientMetadata,
customClientMetadata: {
...customClientMetadataDefault,
...customClientMetadata,
},
customClientMetadata,
isAdmin,
/** Specific metadata for protected apps */
protectedAppMetadata,
} = data;
return {
name,
...cond(
!protectedAppMetadata && {
description,
oidcClientMetadata,
customClientMetadata: {
...customClientMetadataDefault,
...customClientMetadata,
},
isAdmin,
}
),
...cond(
protectedAppMetadata && {
protectedAppMetadata: {
...protectedAppMetadata,
sessionDuration: protectedAppMetadata.sessionDuration / 3600 / 24,
},
}
),
};
},
toUpdateApplicationData: (formData: ApplicationForm): Partial<Application> => {
toRequestPayload: (data: ApplicationForm): DeepPartial<ApplicationResponse> => {
const {
name,
description,
oidcClientMetadata,
customClientMetadata,
isAdmin,
protectedAppMetadata,
} = data;
return {
...formData,
oidcClientMetadata: {
...formData.oidcClientMetadata,
redirectUris: mapToUriFormatArrays(formData.oidcClientMetadata.redirectUris),
postLogoutRedirectUris: mapToUriFormatArrays(
formData.oidcClientMetadata.postLogoutRedirectUris
),
},
customClientMetadata: {
...formData.customClientMetadata,
corsAllowedOrigins: mapToUriOriginFormatArrays(
formData.customClientMetadata.corsAllowedOrigins
),
},
name,
...cond(
!protectedAppMetadata && {
description,
oidcClientMetadata: {
...oidcClientMetadata,
redirectUris: mapToUriFormatArrays(oidcClientMetadata?.redirectUris),
postLogoutRedirectUris: mapToUriFormatArrays(
oidcClientMetadata?.postLogoutRedirectUris
),
},
customClientMetadata: {
...customClientMetadata,
corsAllowedOrigins: mapToUriOriginFormatArrays(
customClientMetadata?.corsAllowedOrigins
),
},
isAdmin,
}
),
...cond(
protectedAppMetadata && {
protectedAppMetadata: {
...protectedAppMetadata,
sessionDuration: protectedAppMetadata.sessionDuration * 3600 * 24,
},
}
),
};
},
};

View file

@ -25,7 +25,7 @@
display: flex;
align-items: center;
font: var(--font-label-2);
white-space: pre;
white-space: pre-wrap;
}
.list {

View file

@ -57,7 +57,12 @@ function ProtectedAppCreationForm() {
</Link>
<CopyToClipboard value={host} variant="icon" />
<Tooltip content={t('general.open')}>
<IconButton size="small">
<IconButton
size="small"
onClick={() => {
window.open(`https://${host}`, '_blank');
}}
>
<ExternalLinkIcon />
</IconButton>
</Tooltip>

View file

@ -6,6 +6,17 @@ const application_details = {
settings_description:
'Anwendungen werden verwendet, um Ihre Anwendungen in Logto für OIDC, Anmeldeerfahrung, Audit-Logs usw. zu identifizieren.',
/** UNTRANSLATED */
integration: 'Integration',
/** UNTRANSLATED */
integration_description:
"Deploy with Logto secure workers, powered by Cloudflare's edge network for top-tier performance and 0ms cold starts worldwide.",
/** UNTRANSLATED */
service_configuration: 'Service configuration',
/** UNTRANSLATED */
service_configuration_description: 'Complete the necessary configurations in your service.',
/** UNTRANSLATED */
session: 'Session',
/** UNTRANSLATED */
endpoints_and_credentials: 'Endpoints & Credentials',
/** UNTRANSLATED */
endpoints_and_credentials_description:
@ -67,6 +78,38 @@ const application_details = {
enter_your_application_name: 'Gib einen Anwendungsnamen ein',
application_deleted: 'Anwendung {{name}} wurde erfolgreich gelöscht',
redirect_uri_required: 'Gib mindestens eine Umleitungs-URI an',
/** UNTRANSLATED */
app_domain_protected: 'App domain protected',
/** UNTRANSLATED */
app_domain_protected_description:
'Feel free to utilize your domain <domain></domain> which is consistently valid.',
/** UNTRANSLATED */
origin_url_tip:
"Enter primary website address of your application, excluding any '/routes'.\n\nNote: The Origin URL itself won't require authentication; only accesses via the added app domain will be protected.",
/** UNTRANSLATED */
custom_rules: 'Custom authentication rules',
/** UNTRANSLATED */
custom_rules_placeholder: '^/(admin|privacy)/.+$',
/** UNTRANSLATED */
custom_rules_description:
'Set rules with regular expressions for authentication-required routes. Default: full-site protection if blank.',
/** UNTRANSLATED */
authentication_routes: 'Authentication routes',
/** UNTRANSLATED */
custom_rules_tip:
"Here are two case scenarios:<ol><li>To only protect routes '/admin' and '/privacy' with authentication: ^/(admin|privacy)/.*</li><li>To exclude JPG images from authentication: ^(?!.*\\.jpg$).*$</li></ol>",
/** UNTRANSLATED */
authentication_routes_description:
'Redirect your authentication button using the specified routes. Note: These routes are irreplaceable.',
/** UNTRANSLATED */
implement_jwt_verification: 'Implement JWT verification',
/** UNTRANSLATED */
implement_jwt_verification_description:
'Configure JWT in your service for essential security communication. Follow the <a>JWT implementation guide</a>.',
/** UNTRANSLATED */
session_duration: 'Session duration (days)',
/** UNTRANSLATED */
try_it: 'Try it',
branding: {
/** UNTRANSLATED */
name: 'Branding',

View file

@ -5,6 +5,12 @@ const application_details = {
settings: 'Settings',
settings_description:
'Applications are used to identify your applications in Logto for OIDC, sign-in experience, audit logs, etc.',
integration: 'Integration',
integration_description:
"Deploy with Logto secure workers, powered by Cloudflare's edge network for top-tier performance and 0ms cold starts worldwide.",
service_configuration: 'Service configuration',
service_configuration_description: 'Complete the necessary configurations in your service.',
session: 'Session',
endpoints_and_credentials: 'Endpoints & Credentials',
endpoints_and_credentials_description:
'Use the following endpoints and credentials to set up the OIDC connection in your application.',
@ -61,6 +67,25 @@ const application_details = {
enter_your_application_name: 'Enter your application name',
application_deleted: 'Application {{name}} has been successfully deleted',
redirect_uri_required: 'You must enter at least one redirect URI',
app_domain_protected: 'App domain protected',
app_domain_protected_description:
'Feel free to utilize your domain <domain></domain> which is consistently valid.',
origin_url_tip:
"Enter primary website address of your application, excluding any '/routes'.\n\nNote: The Origin URL itself won't require authentication; only accesses via the added app domain will be protected.",
custom_rules: 'Custom authentication rules',
custom_rules_placeholder: '^/(admin|privacy)/.+$',
custom_rules_description:
'Set rules with regular expressions for authentication-required routes. Default: full-site protection if blank.',
authentication_routes: 'Authentication routes',
custom_rules_tip:
"Here are two case scenarios:<ol><li>To only protect routes '/admin' and '/privacy' with authentication: ^/(admin|privacy)/.*</li><li>To exclude JPG images from authentication: ^(?!.*\\.jpg$).*$</li></ol>",
authentication_routes_description:
'Redirect your authentication button using the specified routes. Note: These routes are irreplaceable.',
implement_jwt_verification: 'Implement JWT verification',
implement_jwt_verification_description:
'Configure JWT in your service for essential security communication. Follow the <a>JWT implementation guide</a>.',
session_duration: 'Session duration (days)',
try_it: 'Try it',
branding: {
name: 'Branding',
description: "Customize your application's display name and logo on the consent screen.",

View file

@ -6,6 +6,17 @@ const application_details = {
settings_description:
'Las aplicaciones se utilizan para identificar tus aplicaciones en Logto para OIDC, experiencia de inicio de sesión, registros de auditoría, etc.',
/** UNTRANSLATED */
integration: 'Integration',
/** UNTRANSLATED */
integration_description:
"Deploy with Logto secure workers, powered by Cloudflare's edge network for top-tier performance and 0ms cold starts worldwide.",
/** UNTRANSLATED */
service_configuration: 'Service configuration',
/** UNTRANSLATED */
service_configuration_description: 'Complete the necessary configurations in your service.',
/** UNTRANSLATED */
session: 'Session',
/** UNTRANSLATED */
endpoints_and_credentials: 'Endpoints & Credentials',
/** UNTRANSLATED */
endpoints_and_credentials_description:
@ -67,6 +78,38 @@ const application_details = {
enter_your_application_name: 'Ingresa el nombre de tu aplicación',
application_deleted: 'Se ha eliminado exitosamente la aplicación {{name}}',
redirect_uri_required: 'Debes ingresar al menos un URI de Redireccionamiento',
/** UNTRANSLATED */
app_domain_protected: 'App domain protected',
/** UNTRANSLATED */
app_domain_protected_description:
'Feel free to utilize your domain <domain></domain> which is consistently valid.',
/** UNTRANSLATED */
origin_url_tip:
"Enter primary website address of your application, excluding any '/routes'.\n\nNote: The Origin URL itself won't require authentication; only accesses via the added app domain will be protected.",
/** UNTRANSLATED */
custom_rules: 'Custom authentication rules',
/** UNTRANSLATED */
custom_rules_placeholder: '^/(admin|privacy)/.+$',
/** UNTRANSLATED */
custom_rules_description:
'Set rules with regular expressions for authentication-required routes. Default: full-site protection if blank.',
/** UNTRANSLATED */
authentication_routes: 'Authentication routes',
/** UNTRANSLATED */
custom_rules_tip:
"Here are two case scenarios:<ol><li>To only protect routes '/admin' and '/privacy' with authentication: ^/(admin|privacy)/.*</li><li>To exclude JPG images from authentication: ^(?!.*\\.jpg$).*$</li></ol>",
/** UNTRANSLATED */
authentication_routes_description:
'Redirect your authentication button using the specified routes. Note: These routes are irreplaceable.',
/** UNTRANSLATED */
implement_jwt_verification: 'Implement JWT verification',
/** UNTRANSLATED */
implement_jwt_verification_description:
'Configure JWT in your service for essential security communication. Follow the <a>JWT implementation guide</a>.',
/** UNTRANSLATED */
session_duration: 'Session duration (days)',
/** UNTRANSLATED */
try_it: 'Try it',
branding: {
/** UNTRANSLATED */
name: 'Branding',

View file

@ -6,6 +6,17 @@ const application_details = {
settings_description:
"Les applications sont utilisées pour identifier vos applications dans Logto pour OIDC, l'expérience de connexion, les journaux d'audit, etc.",
/** UNTRANSLATED */
integration: 'Integration',
/** UNTRANSLATED */
integration_description:
"Deploy with Logto secure workers, powered by Cloudflare's edge network for top-tier performance and 0ms cold starts worldwide.",
/** UNTRANSLATED */
service_configuration: 'Service configuration',
/** UNTRANSLATED */
service_configuration_description: 'Complete the necessary configurations in your service.',
/** UNTRANSLATED */
session: 'Session',
/** UNTRANSLATED */
endpoints_and_credentials: 'Endpoints & Credentials',
/** UNTRANSLATED */
endpoints_and_credentials_description:
@ -67,6 +78,38 @@ const application_details = {
enter_your_application_name: 'Entrez le nom de votre application',
application_deleted: "L'application {{name}} a été supprimée avec succès.",
redirect_uri_required: 'Vous devez entrer au moins un URI de redirection.',
/** UNTRANSLATED */
app_domain_protected: 'App domain protected',
/** UNTRANSLATED */
app_domain_protected_description:
'Feel free to utilize your domain <domain></domain> which is consistently valid.',
/** UNTRANSLATED */
origin_url_tip:
"Enter primary website address of your application, excluding any '/routes'.\n\nNote: The Origin URL itself won't require authentication; only accesses via the added app domain will be protected.",
/** UNTRANSLATED */
custom_rules: 'Custom authentication rules',
/** UNTRANSLATED */
custom_rules_placeholder: '^/(admin|privacy)/.+$',
/** UNTRANSLATED */
custom_rules_description:
'Set rules with regular expressions for authentication-required routes. Default: full-site protection if blank.',
/** UNTRANSLATED */
authentication_routes: 'Authentication routes',
/** UNTRANSLATED */
custom_rules_tip:
"Here are two case scenarios:<ol><li>To only protect routes '/admin' and '/privacy' with authentication: ^/(admin|privacy)/.*</li><li>To exclude JPG images from authentication: ^(?!.*\\.jpg$).*$</li></ol>",
/** UNTRANSLATED */
authentication_routes_description:
'Redirect your authentication button using the specified routes. Note: These routes are irreplaceable.',
/** UNTRANSLATED */
implement_jwt_verification: 'Implement JWT verification',
/** UNTRANSLATED */
implement_jwt_verification_description:
'Configure JWT in your service for essential security communication. Follow the <a>JWT implementation guide</a>.',
/** UNTRANSLATED */
session_duration: 'Session duration (days)',
/** UNTRANSLATED */
try_it: 'Try it',
branding: {
/** UNTRANSLATED */
name: 'Branding',

View file

@ -6,6 +6,17 @@ const application_details = {
settings_description:
'Le applicazioni vengono utilizzate per identificare le tue applicazioni in Logto per OIDC, esperienza di accesso, registri di controllo, ecc.',
/** UNTRANSLATED */
integration: 'Integration',
/** UNTRANSLATED */
integration_description:
"Deploy with Logto secure workers, powered by Cloudflare's edge network for top-tier performance and 0ms cold starts worldwide.",
/** UNTRANSLATED */
service_configuration: 'Service configuration',
/** UNTRANSLATED */
service_configuration_description: 'Complete the necessary configurations in your service.',
/** UNTRANSLATED */
session: 'Session',
/** UNTRANSLATED */
endpoints_and_credentials: 'Endpoints & Credentials',
/** UNTRANSLATED */
endpoints_and_credentials_description:
@ -67,6 +78,38 @@ const application_details = {
enter_your_application_name: 'Inserisci il nome della tua applicazione',
application_deleted: "L'applicazione {{name}} è stata eliminata con successo",
redirect_uri_required: 'Devi inserire almeno un URI di reindirizzamento',
/** UNTRANSLATED */
app_domain_protected: 'App domain protected',
/** UNTRANSLATED */
app_domain_protected_description:
'Feel free to utilize your domain <domain></domain> which is consistently valid.',
/** UNTRANSLATED */
origin_url_tip:
"Enter primary website address of your application, excluding any '/routes'.\n\nNote: The Origin URL itself won't require authentication; only accesses via the added app domain will be protected.",
/** UNTRANSLATED */
custom_rules: 'Custom authentication rules',
/** UNTRANSLATED */
custom_rules_placeholder: '^/(admin|privacy)/.+$',
/** UNTRANSLATED */
custom_rules_description:
'Set rules with regular expressions for authentication-required routes. Default: full-site protection if blank.',
/** UNTRANSLATED */
authentication_routes: 'Authentication routes',
/** UNTRANSLATED */
custom_rules_tip:
"Here are two case scenarios:<ol><li>To only protect routes '/admin' and '/privacy' with authentication: ^/(admin|privacy)/.*</li><li>To exclude JPG images from authentication: ^(?!.*\\.jpg$).*$</li></ol>",
/** UNTRANSLATED */
authentication_routes_description:
'Redirect your authentication button using the specified routes. Note: These routes are irreplaceable.',
/** UNTRANSLATED */
implement_jwt_verification: 'Implement JWT verification',
/** UNTRANSLATED */
implement_jwt_verification_description:
'Configure JWT in your service for essential security communication. Follow the <a>JWT implementation guide</a>.',
/** UNTRANSLATED */
session_duration: 'Session duration (days)',
/** UNTRANSLATED */
try_it: 'Try it',
branding: {
/** UNTRANSLATED */
name: 'Branding',

View file

@ -6,6 +6,17 @@ const application_details = {
settings_description:
'アプリケーションは、Logto for OIDC、サインインエクスペリエンス、監査ログなどでアプリケーションを識別するために使用されます。',
/** UNTRANSLATED */
integration: 'Integration',
/** UNTRANSLATED */
integration_description:
"Deploy with Logto secure workers, powered by Cloudflare's edge network for top-tier performance and 0ms cold starts worldwide.",
/** UNTRANSLATED */
service_configuration: 'Service configuration',
/** UNTRANSLATED */
service_configuration_description: 'Complete the necessary configurations in your service.',
/** UNTRANSLATED */
session: 'Session',
/** UNTRANSLATED */
endpoints_and_credentials: 'Endpoints & Credentials',
/** UNTRANSLATED */
endpoints_and_credentials_description:
@ -67,6 +78,38 @@ const application_details = {
enter_your_application_name: 'アプリケーション名を入力してください',
application_deleted: 'アプリケーション{{name}}が正常に削除されました',
redirect_uri_required: 'リダイレクトURIを少なくとも1つ入力する必要があります',
/** UNTRANSLATED */
app_domain_protected: 'App domain protected',
/** UNTRANSLATED */
app_domain_protected_description:
'Feel free to utilize your domain <domain></domain> which is consistently valid.',
/** UNTRANSLATED */
origin_url_tip:
"Enter primary website address of your application, excluding any '/routes'.\n\nNote: The Origin URL itself won't require authentication; only accesses via the added app domain will be protected.",
/** UNTRANSLATED */
custom_rules: 'Custom authentication rules',
/** UNTRANSLATED */
custom_rules_placeholder: '^/(admin|privacy)/.+$',
/** UNTRANSLATED */
custom_rules_description:
'Set rules with regular expressions for authentication-required routes. Default: full-site protection if blank.',
/** UNTRANSLATED */
authentication_routes: 'Authentication routes',
/** UNTRANSLATED */
custom_rules_tip:
"Here are two case scenarios:<ol><li>To only protect routes '/admin' and '/privacy' with authentication: ^/(admin|privacy)/.*</li><li>To exclude JPG images from authentication: ^(?!.*\\.jpg$).*$</li></ol>",
/** UNTRANSLATED */
authentication_routes_description:
'Redirect your authentication button using the specified routes. Note: These routes are irreplaceable.',
/** UNTRANSLATED */
implement_jwt_verification: 'Implement JWT verification',
/** UNTRANSLATED */
implement_jwt_verification_description:
'Configure JWT in your service for essential security communication. Follow the <a>JWT implementation guide</a>.',
/** UNTRANSLATED */
session_duration: 'Session duration (days)',
/** UNTRANSLATED */
try_it: 'Try it',
branding: {
/** UNTRANSLATED */
name: 'Branding',

View file

@ -6,6 +6,17 @@ const application_details = {
settings_description:
'애플리케이션은 Logto for OIDC, 로그인 환경, 감사 로그 등에서 애플리케이션을 식별하는 데 사용돼요.',
/** UNTRANSLATED */
integration: 'Integration',
/** UNTRANSLATED */
integration_description:
"Deploy with Logto secure workers, powered by Cloudflare's edge network for top-tier performance and 0ms cold starts worldwide.",
/** UNTRANSLATED */
service_configuration: 'Service configuration',
/** UNTRANSLATED */
service_configuration_description: 'Complete the necessary configurations in your service.',
/** UNTRANSLATED */
session: 'Session',
/** UNTRANSLATED */
endpoints_and_credentials: 'Endpoints & Credentials',
/** UNTRANSLATED */
endpoints_and_credentials_description:
@ -67,6 +78,38 @@ const application_details = {
enter_your_application_name: '어플리케이션 이름을 입력해 주세요.',
application_deleted: '{{name}} 어플리케이션이 성공적으로 삭제되었어요.',
redirect_uri_required: '반드시 최소 하나의 Redirect URI 를 입력해야 해요.',
/** UNTRANSLATED */
app_domain_protected: 'App domain protected',
/** UNTRANSLATED */
app_domain_protected_description:
'Feel free to utilize your domain <domain></domain> which is consistently valid.',
/** UNTRANSLATED */
origin_url_tip:
"Enter primary website address of your application, excluding any '/routes'.\n\nNote: The Origin URL itself won't require authentication; only accesses via the added app domain will be protected.",
/** UNTRANSLATED */
custom_rules: 'Custom authentication rules',
/** UNTRANSLATED */
custom_rules_placeholder: '^/(admin|privacy)/.+$',
/** UNTRANSLATED */
custom_rules_description:
'Set rules with regular expressions for authentication-required routes. Default: full-site protection if blank.',
/** UNTRANSLATED */
authentication_routes: 'Authentication routes',
/** UNTRANSLATED */
custom_rules_tip:
"Here are two case scenarios:<ol><li>To only protect routes '/admin' and '/privacy' with authentication: ^/(admin|privacy)/.*</li><li>To exclude JPG images from authentication: ^(?!.*\\.jpg$).*$</li></ol>",
/** UNTRANSLATED */
authentication_routes_description:
'Redirect your authentication button using the specified routes. Note: These routes are irreplaceable.',
/** UNTRANSLATED */
implement_jwt_verification: 'Implement JWT verification',
/** UNTRANSLATED */
implement_jwt_verification_description:
'Configure JWT in your service for essential security communication. Follow the <a>JWT implementation guide</a>.',
/** UNTRANSLATED */
session_duration: 'Session duration (days)',
/** UNTRANSLATED */
try_it: 'Try it',
branding: {
/** UNTRANSLATED */
name: 'Branding',

View file

@ -6,6 +6,17 @@ const application_details = {
settings_description:
'Aplikacje są używane do identyfikowania Twoich aplikacji w Logto dla OIDC, doświadczenia logowania, dzienników audytowych itp.',
/** UNTRANSLATED */
integration: 'Integration',
/** UNTRANSLATED */
integration_description:
"Deploy with Logto secure workers, powered by Cloudflare's edge network for top-tier performance and 0ms cold starts worldwide.",
/** UNTRANSLATED */
service_configuration: 'Service configuration',
/** UNTRANSLATED */
service_configuration_description: 'Complete the necessary configurations in your service.',
/** UNTRANSLATED */
session: 'Session',
/** UNTRANSLATED */
endpoints_and_credentials: 'Endpoints & Credentials',
/** UNTRANSLATED */
endpoints_and_credentials_description:
@ -67,6 +78,38 @@ const application_details = {
enter_your_application_name: 'Wpisz nazwę swojej aplikacji',
application_deleted: 'Aplikacja {{name}} została pomyślnie usunięta',
redirect_uri_required: 'Musisz wpisać co najmniej jeden adres URL przekierowania',
/** UNTRANSLATED */
app_domain_protected: 'App domain protected',
/** UNTRANSLATED */
app_domain_protected_description:
'Feel free to utilize your domain <domain></domain> which is consistently valid.',
/** UNTRANSLATED */
origin_url_tip:
"Enter primary website address of your application, excluding any '/routes'.\n\nNote: The Origin URL itself won't require authentication; only accesses via the added app domain will be protected.",
/** UNTRANSLATED */
custom_rules: 'Custom authentication rules',
/** UNTRANSLATED */
custom_rules_placeholder: '^/(admin|privacy)/.+$',
/** UNTRANSLATED */
custom_rules_description:
'Set rules with regular expressions for authentication-required routes. Default: full-site protection if blank.',
/** UNTRANSLATED */
authentication_routes: 'Authentication routes',
/** UNTRANSLATED */
custom_rules_tip:
"Here are two case scenarios:<ol><li>To only protect routes '/admin' and '/privacy' with authentication: ^/(admin|privacy)/.*</li><li>To exclude JPG images from authentication: ^(?!.*\\.jpg$).*$</li></ol>",
/** UNTRANSLATED */
authentication_routes_description:
'Redirect your authentication button using the specified routes. Note: These routes are irreplaceable.',
/** UNTRANSLATED */
implement_jwt_verification: 'Implement JWT verification',
/** UNTRANSLATED */
implement_jwt_verification_description:
'Configure JWT in your service for essential security communication. Follow the <a>JWT implementation guide</a>.',
/** UNTRANSLATED */
session_duration: 'Session duration (days)',
/** UNTRANSLATED */
try_it: 'Try it',
branding: {
/** UNTRANSLATED */
name: 'Branding',

View file

@ -6,6 +6,17 @@ const application_details = {
settings_description:
'Os aplicativos são usados para identificar seus aplicativos no Logto para OIDC, experiência de login, logs de auditoria, etc.',
/** UNTRANSLATED */
integration: 'Integration',
/** UNTRANSLATED */
integration_description:
"Deploy with Logto secure workers, powered by Cloudflare's edge network for top-tier performance and 0ms cold starts worldwide.",
/** UNTRANSLATED */
service_configuration: 'Service configuration',
/** UNTRANSLATED */
service_configuration_description: 'Complete the necessary configurations in your service.',
/** UNTRANSLATED */
session: 'Session',
/** UNTRANSLATED */
endpoints_and_credentials: 'Endpoints & Credentials',
/** UNTRANSLATED */
endpoints_and_credentials_description:
@ -67,6 +78,38 @@ const application_details = {
enter_your_application_name: 'Digite o nome do seu aplicativo',
application_deleted: 'O aplicativo {{name}} foi excluído com sucesso',
redirect_uri_required: 'Você deve inserir pelo menos um URI de redirecionamento',
/** UNTRANSLATED */
app_domain_protected: 'App domain protected',
/** UNTRANSLATED */
app_domain_protected_description:
'Feel free to utilize your domain <domain></domain> which is consistently valid.',
/** UNTRANSLATED */
origin_url_tip:
"Enter primary website address of your application, excluding any '/routes'.\n\nNote: The Origin URL itself won't require authentication; only accesses via the added app domain will be protected.",
/** UNTRANSLATED */
custom_rules: 'Custom authentication rules',
/** UNTRANSLATED */
custom_rules_placeholder: '^/(admin|privacy)/.+$',
/** UNTRANSLATED */
custom_rules_description:
'Set rules with regular expressions for authentication-required routes. Default: full-site protection if blank.',
/** UNTRANSLATED */
authentication_routes: 'Authentication routes',
/** UNTRANSLATED */
custom_rules_tip:
"Here are two case scenarios:<ol><li>To only protect routes '/admin' and '/privacy' with authentication: ^/(admin|privacy)/.*</li><li>To exclude JPG images from authentication: ^(?!.*\\.jpg$).*$</li></ol>",
/** UNTRANSLATED */
authentication_routes_description:
'Redirect your authentication button using the specified routes. Note: These routes are irreplaceable.',
/** UNTRANSLATED */
implement_jwt_verification: 'Implement JWT verification',
/** UNTRANSLATED */
implement_jwt_verification_description:
'Configure JWT in your service for essential security communication. Follow the <a>JWT implementation guide</a>.',
/** UNTRANSLATED */
session_duration: 'Session duration (days)',
/** UNTRANSLATED */
try_it: 'Try it',
branding: {
/** UNTRANSLATED */
name: 'Branding',

View file

@ -6,6 +6,17 @@ const application_details = {
settings_description:
'As aplicações são utilizadas para identificar as suas aplicações no Logto para OIDC, experiência de início de sessão, registos de auditoria, etc.',
/** UNTRANSLATED */
integration: 'Integration',
/** UNTRANSLATED */
integration_description:
"Deploy with Logto secure workers, powered by Cloudflare's edge network for top-tier performance and 0ms cold starts worldwide.",
/** UNTRANSLATED */
service_configuration: 'Service configuration',
/** UNTRANSLATED */
service_configuration_description: 'Complete the necessary configurations in your service.',
/** UNTRANSLATED */
session: 'Session',
/** UNTRANSLATED */
endpoints_and_credentials: 'Endpoints & Credentials',
/** UNTRANSLATED */
endpoints_and_credentials_description:
@ -67,6 +78,38 @@ const application_details = {
enter_your_application_name: 'Insira o nome da aplicação',
application_deleted: 'Aplicação {{name}} eliminada com sucesso',
redirect_uri_required: 'Deve inserir pelo menos um URI de redirecionamento',
/** UNTRANSLATED */
app_domain_protected: 'App domain protected',
/** UNTRANSLATED */
app_domain_protected_description:
'Feel free to utilize your domain <domain></domain> which is consistently valid.',
/** UNTRANSLATED */
origin_url_tip:
"Enter primary website address of your application, excluding any '/routes'.\n\nNote: The Origin URL itself won't require authentication; only accesses via the added app domain will be protected.",
/** UNTRANSLATED */
custom_rules: 'Custom authentication rules',
/** UNTRANSLATED */
custom_rules_placeholder: '^/(admin|privacy)/.+$',
/** UNTRANSLATED */
custom_rules_description:
'Set rules with regular expressions for authentication-required routes. Default: full-site protection if blank.',
/** UNTRANSLATED */
authentication_routes: 'Authentication routes',
/** UNTRANSLATED */
custom_rules_tip:
"Here are two case scenarios:<ol><li>To only protect routes '/admin' and '/privacy' with authentication: ^/(admin|privacy)/.*</li><li>To exclude JPG images from authentication: ^(?!.*\\.jpg$).*$</li></ol>",
/** UNTRANSLATED */
authentication_routes_description:
'Redirect your authentication button using the specified routes. Note: These routes are irreplaceable.',
/** UNTRANSLATED */
implement_jwt_verification: 'Implement JWT verification',
/** UNTRANSLATED */
implement_jwt_verification_description:
'Configure JWT in your service for essential security communication. Follow the <a>JWT implementation guide</a>.',
/** UNTRANSLATED */
session_duration: 'Session duration (days)',
/** UNTRANSLATED */
try_it: 'Try it',
branding: {
/** UNTRANSLATED */
name: 'Branding',

View file

@ -6,6 +6,17 @@ const application_details = {
settings_description:
'Приложения используются для идентификации ваших приложений в Logto для OIDC, опыта входа, аудита и т. Д.',
/** UNTRANSLATED */
integration: 'Integration',
/** UNTRANSLATED */
integration_description:
"Deploy with Logto secure workers, powered by Cloudflare's edge network for top-tier performance and 0ms cold starts worldwide.",
/** UNTRANSLATED */
service_configuration: 'Service configuration',
/** UNTRANSLATED */
service_configuration_description: 'Complete the necessary configurations in your service.',
/** UNTRANSLATED */
session: 'Session',
/** UNTRANSLATED */
endpoints_and_credentials: 'Endpoints & Credentials',
/** UNTRANSLATED */
endpoints_and_credentials_description:
@ -67,6 +78,38 @@ const application_details = {
enter_your_application_name: 'Введите название своего приложения',
application_deleted: 'Приложение {{name}} успешно удалено',
redirect_uri_required: 'Вы должны ввести по крайней мере один URI перенаправления',
/** UNTRANSLATED */
app_domain_protected: 'App domain protected',
/** UNTRANSLATED */
app_domain_protected_description:
'Feel free to utilize your domain <domain></domain> which is consistently valid.',
/** UNTRANSLATED */
origin_url_tip:
"Enter primary website address of your application, excluding any '/routes'.\n\nNote: The Origin URL itself won't require authentication; only accesses via the added app domain will be protected.",
/** UNTRANSLATED */
custom_rules: 'Custom authentication rules',
/** UNTRANSLATED */
custom_rules_placeholder: '^/(admin|privacy)/.+$',
/** UNTRANSLATED */
custom_rules_description:
'Set rules with regular expressions for authentication-required routes. Default: full-site protection if blank.',
/** UNTRANSLATED */
authentication_routes: 'Authentication routes',
/** UNTRANSLATED */
custom_rules_tip:
"Here are two case scenarios:<ol><li>To only protect routes '/admin' and '/privacy' with authentication: ^/(admin|privacy)/.*</li><li>To exclude JPG images from authentication: ^(?!.*\\.jpg$).*$</li></ol>",
/** UNTRANSLATED */
authentication_routes_description:
'Redirect your authentication button using the specified routes. Note: These routes are irreplaceable.',
/** UNTRANSLATED */
implement_jwt_verification: 'Implement JWT verification',
/** UNTRANSLATED */
implement_jwt_verification_description:
'Configure JWT in your service for essential security communication. Follow the <a>JWT implementation guide</a>.',
/** UNTRANSLATED */
session_duration: 'Session duration (days)',
/** UNTRANSLATED */
try_it: 'Try it',
branding: {
/** UNTRANSLATED */
name: 'Branding',

View file

@ -6,6 +6,17 @@ const application_details = {
settings_description:
'Uygulamalar, Logto için OIDC, oturum açma deneyimi, denetim kayıtları vb. alanlarda uygulamalarınızı tanımlamak için kullanılır.',
/** UNTRANSLATED */
integration: 'Integration',
/** UNTRANSLATED */
integration_description:
"Deploy with Logto secure workers, powered by Cloudflare's edge network for top-tier performance and 0ms cold starts worldwide.",
/** UNTRANSLATED */
service_configuration: 'Service configuration',
/** UNTRANSLATED */
service_configuration_description: 'Complete the necessary configurations in your service.',
/** UNTRANSLATED */
session: 'Session',
/** UNTRANSLATED */
endpoints_and_credentials: 'Endpoints & Credentials',
/** UNTRANSLATED */
endpoints_and_credentials_description:
@ -67,6 +78,38 @@ const application_details = {
enter_your_application_name: 'Uygulama adı giriniz',
application_deleted: '{{name}} Uygulaması başarıyla silindi',
redirect_uri_required: 'En az 1 yönlendirme URIı girmelisiniz',
/** UNTRANSLATED */
app_domain_protected: 'App domain protected',
/** UNTRANSLATED */
app_domain_protected_description:
'Feel free to utilize your domain <domain></domain> which is consistently valid.',
/** UNTRANSLATED */
origin_url_tip:
"Enter primary website address of your application, excluding any '/routes'.\n\nNote: The Origin URL itself won't require authentication; only accesses via the added app domain will be protected.",
/** UNTRANSLATED */
custom_rules: 'Custom authentication rules',
/** UNTRANSLATED */
custom_rules_placeholder: '^/(admin|privacy)/.+$',
/** UNTRANSLATED */
custom_rules_description:
'Set rules with regular expressions for authentication-required routes. Default: full-site protection if blank.',
/** UNTRANSLATED */
authentication_routes: 'Authentication routes',
/** UNTRANSLATED */
custom_rules_tip:
"Here are two case scenarios:<ol><li>To only protect routes '/admin' and '/privacy' with authentication: ^/(admin|privacy)/.*</li><li>To exclude JPG images from authentication: ^(?!.*\\.jpg$).*$</li></ol>",
/** UNTRANSLATED */
authentication_routes_description:
'Redirect your authentication button using the specified routes. Note: These routes are irreplaceable.',
/** UNTRANSLATED */
implement_jwt_verification: 'Implement JWT verification',
/** UNTRANSLATED */
implement_jwt_verification_description:
'Configure JWT in your service for essential security communication. Follow the <a>JWT implementation guide</a>.',
/** UNTRANSLATED */
session_duration: 'Session duration (days)',
/** UNTRANSLATED */
try_it: 'Try it',
branding: {
/** UNTRANSLATED */
name: 'Branding',

View file

@ -5,6 +5,17 @@ const application_details = {
settings: '设置',
settings_description: '应用程序用于在 Logto OIDC、登录体验、审计日志等方面识别你的应用程序。',
/** UNTRANSLATED */
integration: 'Integration',
/** UNTRANSLATED */
integration_description:
"Deploy with Logto secure workers, powered by Cloudflare's edge network for top-tier performance and 0ms cold starts worldwide.",
/** UNTRANSLATED */
service_configuration: 'Service configuration',
/** UNTRANSLATED */
service_configuration_description: 'Complete the necessary configurations in your service.',
/** UNTRANSLATED */
session: 'Session',
/** UNTRANSLATED */
endpoints_and_credentials: 'Endpoints & Credentials',
/** UNTRANSLATED */
endpoints_and_credentials_description:
@ -64,6 +75,38 @@ const application_details = {
enter_your_application_name: '输入你的应用名称',
application_deleted: '应用 {{name}} 成功删除。',
redirect_uri_required: '至少需要输入一个重定向 URI。',
/** UNTRANSLATED */
app_domain_protected: 'App domain protected',
/** UNTRANSLATED */
app_domain_protected_description:
'Feel free to utilize your domain <domain></domain> which is consistently valid.',
/** UNTRANSLATED */
origin_url_tip:
"Enter primary website address of your application, excluding any '/routes'.\n\nNote: The Origin URL itself won't require authentication; only accesses via the added app domain will be protected.",
/** UNTRANSLATED */
custom_rules: 'Custom authentication rules',
/** UNTRANSLATED */
custom_rules_placeholder: '^/(admin|privacy)/.+$',
/** UNTRANSLATED */
custom_rules_description:
'Set rules with regular expressions for authentication-required routes. Default: full-site protection if blank.',
/** UNTRANSLATED */
authentication_routes: 'Authentication routes',
/** UNTRANSLATED */
custom_rules_tip:
"Here are two case scenarios:<ol><li>To only protect routes '/admin' and '/privacy' with authentication: ^/(admin|privacy)/.*</li><li>To exclude JPG images from authentication: ^(?!.*\\.jpg$).*$</li></ol>",
/** UNTRANSLATED */
authentication_routes_description:
'Redirect your authentication button using the specified routes. Note: These routes are irreplaceable.',
/** UNTRANSLATED */
implement_jwt_verification: 'Implement JWT verification',
/** UNTRANSLATED */
implement_jwt_verification_description:
'Configure JWT in your service for essential security communication. Follow the <a>JWT implementation guide</a>.',
/** UNTRANSLATED */
session_duration: 'Session duration (days)',
/** UNTRANSLATED */
try_it: 'Try it',
branding: {
/** UNTRANSLATED */
name: 'Branding',

View file

@ -5,6 +5,17 @@ const application_details = {
settings: '設定',
settings_description: '應用程式用於在 Logto OIDC、登入體驗、審計日誌等方面識別你的應用程式。',
/** UNTRANSLATED */
integration: 'Integration',
/** UNTRANSLATED */
integration_description:
"Deploy with Logto secure workers, powered by Cloudflare's edge network for top-tier performance and 0ms cold starts worldwide.",
/** UNTRANSLATED */
service_configuration: 'Service configuration',
/** UNTRANSLATED */
service_configuration_description: 'Complete the necessary configurations in your service.',
/** UNTRANSLATED */
session: 'Session',
/** UNTRANSLATED */
endpoints_and_credentials: 'Endpoints & Credentials',
/** UNTRANSLATED */
endpoints_and_credentials_description:
@ -64,6 +75,38 @@ const application_details = {
enter_your_application_name: '輸入你的應用程式名稱',
application_deleted: '應用 {{name}} 成功刪除。',
redirect_uri_required: '至少需要輸入一個重定向 URL。',
/** UNTRANSLATED */
app_domain_protected: 'App domain protected',
/** UNTRANSLATED */
app_domain_protected_description:
'Feel free to utilize your domain <domain></domain> which is consistently valid.',
/** UNTRANSLATED */
origin_url_tip:
"Enter primary website address of your application, excluding any '/routes'.\n\nNote: The Origin URL itself won't require authentication; only accesses via the added app domain will be protected.",
/** UNTRANSLATED */
custom_rules: 'Custom authentication rules',
/** UNTRANSLATED */
custom_rules_placeholder: '^/(admin|privacy)/.+$',
/** UNTRANSLATED */
custom_rules_description:
'Set rules with regular expressions for authentication-required routes. Default: full-site protection if blank.',
/** UNTRANSLATED */
authentication_routes: 'Authentication routes',
/** UNTRANSLATED */
custom_rules_tip:
"Here are two case scenarios:<ol><li>To only protect routes '/admin' and '/privacy' with authentication: ^/(admin|privacy)/.*</li><li>To exclude JPG images from authentication: ^(?!.*\\.jpg$).*$</li></ol>",
/** UNTRANSLATED */
authentication_routes_description:
'Redirect your authentication button using the specified routes. Note: These routes are irreplaceable.',
/** UNTRANSLATED */
implement_jwt_verification: 'Implement JWT verification',
/** UNTRANSLATED */
implement_jwt_verification_description:
'Configure JWT in your service for essential security communication. Follow the <a>JWT implementation guide</a>.',
/** UNTRANSLATED */
session_duration: 'Session duration (days)',
/** UNTRANSLATED */
try_it: 'Try it',
branding: {
/** UNTRANSLATED */
name: 'Branding',

View file

@ -5,6 +5,17 @@ const application_details = {
settings: '設置',
settings_description: '應用程式用於在 Logto OIDC、登錄體驗、審計日誌等方面識別你的應用程式。',
/** UNTRANSLATED */
integration: 'Integration',
/** UNTRANSLATED */
integration_description:
"Deploy with Logto secure workers, powered by Cloudflare's edge network for top-tier performance and 0ms cold starts worldwide.",
/** UNTRANSLATED */
service_configuration: 'Service configuration',
/** UNTRANSLATED */
service_configuration_description: 'Complete the necessary configurations in your service.',
/** UNTRANSLATED */
session: 'Session',
/** UNTRANSLATED */
endpoints_and_credentials: 'Endpoints & Credentials',
/** UNTRANSLATED */
endpoints_and_credentials_description:
@ -65,6 +76,38 @@ const application_details = {
enter_your_application_name: '輸入你的應用程式姓名',
application_deleted: '應用 {{name}} 成功刪除。',
redirect_uri_required: '至少需要輸入一個重定向 URL。',
/** UNTRANSLATED */
app_domain_protected: 'App domain protected',
/** UNTRANSLATED */
app_domain_protected_description:
'Feel free to utilize your domain <domain></domain> which is consistently valid.',
/** UNTRANSLATED */
origin_url_tip:
"Enter primary website address of your application, excluding any '/routes'.\n\nNote: The Origin URL itself won't require authentication; only accesses via the added app domain will be protected.",
/** UNTRANSLATED */
custom_rules: 'Custom authentication rules',
/** UNTRANSLATED */
custom_rules_placeholder: '^/(admin|privacy)/.+$',
/** UNTRANSLATED */
custom_rules_description:
'Set rules with regular expressions for authentication-required routes. Default: full-site protection if blank.',
/** UNTRANSLATED */
authentication_routes: 'Authentication routes',
/** UNTRANSLATED */
custom_rules_tip:
"Here are two case scenarios:<ol><li>To only protect routes '/admin' and '/privacy' with authentication: ^/(admin|privacy)/.*</li><li>To exclude JPG images from authentication: ^(?!.*\\.jpg$).*$</li></ol>",
/** UNTRANSLATED */
authentication_routes_description:
'Redirect your authentication button using the specified routes. Note: These routes are irreplaceable.',
/** UNTRANSLATED */
implement_jwt_verification: 'Implement JWT verification',
/** UNTRANSLATED */
implement_jwt_verification_description:
'Configure JWT in your service for essential security communication. Follow the <a>JWT implementation guide</a>.',
/** UNTRANSLATED */
session_duration: 'Session duration (days)',
/** UNTRANSLATED */
try_it: 'Try it',
branding: {
/** UNTRANSLATED */
name: 'Branding',