From d506f94c18b277e4d6cee1d1ce3866c9bfa0bc6b Mon Sep 17 00:00:00 2001 From: Charles Zhao Date: Mon, 15 Jan 2024 23:06:18 +0800 Subject: [PATCH] feat(console): add protected app creation form (#5228) * feat(console): add protected app creation form * refactor(console): use whitelist to display application types in app creation form --- .../src/assets/icons/protected-app-dark.svg | 41 ++++++++++ .../src/assets/icons/protected-app.svg | 37 +++++++++ packages/console/src/consts/applications.ts | 8 +- .../components/CreateForm/index.tsx | 11 ++- .../components/GuideLibrary/index.tsx | 39 +++++---- .../ProtectedAppCard/index.module.scss | 46 +++++++++++ .../components/ProtectedAppCard/index.tsx | 61 ++++++++++++++ .../ProtectedAppForm/index.module.scss | 29 +++++++ .../components/ProtectedAppForm/index.tsx | 41 ++++++++++ .../components/ProtectedAppForm/types.ts | 4 + .../components/ProtectedAppModal/index.tsx | 82 +++++++++++++++++++ packages/console/src/types/applications.ts | 3 +- .../translation/admin-console/applications.ts | 8 ++ .../de/translation/admin-console/index.ts | 2 + .../admin-console/protected-app.ts | 52 ++++++++++++ .../translation/admin-console/applications.ts | 5 ++ .../en/translation/admin-console/index.ts | 2 + .../admin-console/protected-app.ts | 33 ++++++++ .../translation/admin-console/applications.ts | 8 ++ .../es/translation/admin-console/index.ts | 2 + .../admin-console/protected-app.ts | 52 ++++++++++++ .../translation/admin-console/applications.ts | 8 ++ .../fr/translation/admin-console/index.ts | 2 + .../admin-console/protected-app.ts | 52 ++++++++++++ .../translation/admin-console/applications.ts | 8 ++ .../it/translation/admin-console/index.ts | 2 + .../admin-console/protected-app.ts | 52 ++++++++++++ .../translation/admin-console/applications.ts | 8 ++ .../ja/translation/admin-console/index.ts | 2 + .../admin-console/protected-app.ts | 52 ++++++++++++ .../translation/admin-console/applications.ts | 8 ++ .../ko/translation/admin-console/index.ts | 2 + .../admin-console/protected-app.ts | 52 ++++++++++++ .../translation/admin-console/applications.ts | 8 ++ .../pl-pl/translation/admin-console/index.ts | 2 + .../admin-console/protected-app.ts | 52 ++++++++++++ .../translation/admin-console/applications.ts | 8 ++ .../pt-br/translation/admin-console/index.ts | 2 + .../admin-console/protected-app.ts | 52 ++++++++++++ .../translation/admin-console/applications.ts | 8 ++ .../pt-pt/translation/admin-console/index.ts | 2 + .../admin-console/protected-app.ts | 52 ++++++++++++ .../translation/admin-console/applications.ts | 8 ++ .../ru/translation/admin-console/index.ts | 2 + .../admin-console/protected-app.ts | 52 ++++++++++++ .../translation/admin-console/applications.ts | 8 ++ .../tr-tr/translation/admin-console/index.ts | 2 + .../admin-console/protected-app.ts | 52 ++++++++++++ .../translation/admin-console/applications.ts | 8 ++ .../zh-cn/translation/admin-console/index.ts | 2 + .../admin-console/protected-app.ts | 52 ++++++++++++ .../translation/admin-console/applications.ts | 8 ++ .../zh-hk/translation/admin-console/index.ts | 2 + .../admin-console/protected-app.ts | 52 ++++++++++++ .../translation/admin-console/applications.ts | 8 ++ .../zh-tw/translation/admin-console/index.ts | 2 + .../admin-console/protected-app.ts | 52 ++++++++++++ .../core-kit/scss/_console-themes.scss | 2 + 58 files changed, 1287 insertions(+), 25 deletions(-) create mode 100644 packages/console/src/assets/icons/protected-app-dark.svg create mode 100644 packages/console/src/assets/icons/protected-app.svg create mode 100644 packages/console/src/pages/Applications/components/ProtectedAppCard/index.module.scss create mode 100644 packages/console/src/pages/Applications/components/ProtectedAppCard/index.tsx create mode 100644 packages/console/src/pages/Applications/components/ProtectedAppForm/index.module.scss create mode 100644 packages/console/src/pages/Applications/components/ProtectedAppForm/index.tsx create mode 100644 packages/console/src/pages/Applications/components/ProtectedAppForm/types.ts create mode 100644 packages/console/src/pages/Applications/components/ProtectedAppModal/index.tsx create mode 100644 packages/phrases/src/locales/de/translation/admin-console/protected-app.ts create mode 100644 packages/phrases/src/locales/en/translation/admin-console/protected-app.ts create mode 100644 packages/phrases/src/locales/es/translation/admin-console/protected-app.ts create mode 100644 packages/phrases/src/locales/fr/translation/admin-console/protected-app.ts create mode 100644 packages/phrases/src/locales/it/translation/admin-console/protected-app.ts create mode 100644 packages/phrases/src/locales/ja/translation/admin-console/protected-app.ts create mode 100644 packages/phrases/src/locales/ko/translation/admin-console/protected-app.ts create mode 100644 packages/phrases/src/locales/pl-pl/translation/admin-console/protected-app.ts create mode 100644 packages/phrases/src/locales/pt-br/translation/admin-console/protected-app.ts create mode 100644 packages/phrases/src/locales/pt-pt/translation/admin-console/protected-app.ts create mode 100644 packages/phrases/src/locales/ru/translation/admin-console/protected-app.ts create mode 100644 packages/phrases/src/locales/tr-tr/translation/admin-console/protected-app.ts create mode 100644 packages/phrases/src/locales/zh-cn/translation/admin-console/protected-app.ts create mode 100644 packages/phrases/src/locales/zh-hk/translation/admin-console/protected-app.ts create mode 100644 packages/phrases/src/locales/zh-tw/translation/admin-console/protected-app.ts diff --git a/packages/console/src/assets/icons/protected-app-dark.svg b/packages/console/src/assets/icons/protected-app-dark.svg new file mode 100644 index 000000000..410ed5db4 --- /dev/null +++ b/packages/console/src/assets/icons/protected-app-dark.svg @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/packages/console/src/assets/icons/protected-app.svg b/packages/console/src/assets/icons/protected-app.svg new file mode 100644 index 000000000..cf55ae1a3 --- /dev/null +++ b/packages/console/src/assets/icons/protected-app.svg @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/packages/console/src/consts/applications.ts b/packages/console/src/consts/applications.ts index 63af38914..c2b090769 100644 --- a/packages/console/src/consts/applications.ts +++ b/packages/console/src/consts/applications.ts @@ -4,6 +4,8 @@ import MachineToMachineDark from '@/assets/icons/machine-to-machine-dark.svg'; import MachineToMachine from '@/assets/icons/machine-to-machine.svg'; import NativeAppDark from '@/assets/icons/native-app-dark.svg'; import NativeApp from '@/assets/icons/native-app.svg'; +import ProtectedAppDark from '@/assets/icons/protected-app-dark.svg'; +import ProtectedApp from '@/assets/icons/protected-app.svg'; import SinglePageAppDark from '@/assets/icons/single-page-app-dark.svg'; import SinglePageApp from '@/assets/icons/single-page-app.svg'; import TraditionalWebAppDark from '@/assets/icons/traditional-web-app-dark.svg'; @@ -18,8 +20,7 @@ export const lightModeApplicationIconMap: ApplicationIconMap = Object.freeze({ [ApplicationType.SPA]: SinglePageApp, [ApplicationType.Traditional]: TraditionalWebApp, [ApplicationType.MachineToMachine]: MachineToMachine, - // TODO @sijie: update with new icon - [ApplicationType.Protected]: TraditionalWebApp, + [ApplicationType.Protected]: ProtectedApp, } as const); export const darkModeApplicationIconMap: ApplicationIconMap = Object.freeze({ @@ -27,6 +28,5 @@ export const darkModeApplicationIconMap: ApplicationIconMap = Object.freeze({ [ApplicationType.SPA]: SinglePageAppDark, [ApplicationType.Traditional]: TraditionalWebAppDark, [ApplicationType.MachineToMachine]: MachineToMachineDark, - // TODO @sijie: update with new icon - [ApplicationType.Protected]: TraditionalWebAppDark, + [ApplicationType.Protected]: ProtectedAppDark, } as const); diff --git a/packages/console/src/pages/Applications/components/CreateForm/index.tsx b/packages/console/src/pages/Applications/components/CreateForm/index.tsx index db98efed4..c169d8bb4 100644 --- a/packages/console/src/pages/Applications/components/CreateForm/index.tsx +++ b/packages/console/src/pages/Applications/components/CreateForm/index.tsx @@ -5,7 +5,6 @@ import { toast } from 'react-hot-toast'; import { useTranslation } from 'react-i18next'; import Modal from 'react-modal'; -import { isDevFeaturesEnabled } from '@/consts/env'; import DynamicT from '@/ds-components/DynamicT'; import FormField from '@/ds-components/FormField'; import ModalLayout from '@/ds-components/ModalLayout'; @@ -111,7 +110,15 @@ function CreateForm({ onChange={onChange} > {Object.values(ApplicationType) - .filter((value) => isDevFeaturesEnabled || value !== ApplicationType.Protected) + // Other application types (e.g. "Protected") should not show up in the creation modal + .filter((value) => + [ + ApplicationType.Native, + ApplicationType.SPA, + ApplicationType.Traditional, + ApplicationType.MachineToMachine, + ].includes(value) + ) .map((type) => ( - isDevFeaturesEnabled || - (category !== 'Protected' && category !== thirdPartyAppCategory) + category !== 'Protected' && + (isDevFeaturesEnabled || category !== thirdPartyAppCategory) ) .map((category) => ({ title: `guide.categories.${category}`, @@ -135,21 +136,25 @@ function GuideLibrary({ className, hasCardBorder, hasCardButton, hasFilters }: P ) : ( ))} - {!keyword && - (filterCategories.length > 0 ? filterCategories : allAppGuideCategories).map( - (category) => - structuredMetadata[category].length > 0 && ( - - ) - )} + {!keyword && ( + <> + {isDevFeaturesEnabled && } + {(filterCategories.length > 0 ? filterCategories : allAppGuideCategories).map( + (category) => + structuredMetadata[category].length > 0 && ( + + ) + )} + + )} {selectedGuide?.target !== 'API' && showCreateForm && ( diff --git a/packages/console/src/pages/Applications/components/ProtectedAppCard/index.module.scss b/packages/console/src/pages/Applications/components/ProtectedAppCard/index.module.scss new file mode 100644 index 000000000..6607360fd --- /dev/null +++ b/packages/console/src/pages/Applications/components/ProtectedAppCard/index.module.scss @@ -0,0 +1,46 @@ +@use '@/scss/underscore' as _; + +.container { + display: flex; + flex-direction: column; + width: 100%; + gap: _.unit(4); + margin-bottom: _.unit(4); + + label { + color: var(--color-text-secondary); + font: var(--font-section-head-1); + letter-spacing: 0.1em; + text-transform: uppercase; + } + + .card { + display: flex; + align-items: center; + padding: _.unit(6) _.unit(8); + gap: _.unit(6); + background-color: var(--color-layer-1); + border-radius: 12px; + + .logo { + width: 48px; + height: 48px; + } + + .wrapper { + flex: 1; + display: flex; + flex-direction: column; + + .name { + font: var(--font-label-2); + color: var(--color-text); + } + + .description { + font: var(--font-body-2); + color: var(--color-text-secondary); + } + } + } +} diff --git a/packages/console/src/pages/Applications/components/ProtectedAppCard/index.tsx b/packages/console/src/pages/Applications/components/ProtectedAppCard/index.tsx new file mode 100644 index 000000000..d6125f8f6 --- /dev/null +++ b/packages/console/src/pages/Applications/components/ProtectedAppCard/index.tsx @@ -0,0 +1,61 @@ +import { Theme } from '@logto/schemas'; +import { useState } from 'react'; +import { Trans, useTranslation } from 'react-i18next'; + +import ProtectedAppDarkIcon from '@/assets/icons/protected-app-dark.svg'; +import ProtectedAppIcon from '@/assets/icons/protected-app.svg'; +import Button from '@/ds-components/Button'; +import TextLink from '@/ds-components/TextLink'; +import useDocumentationUrl from '@/hooks/use-documentation-url'; +import useTheme from '@/hooks/use-theme'; + +import ProtectedAppModal from '../ProtectedAppModal'; + +import * as styles from './index.module.scss'; + +function ProtectedAppCard() { + const { t } = useTranslation(undefined, { keyPrefix: 'admin_console.protected_app' }); + const { documentationSiteUrl } = useDocumentationUrl(); + const [showCreateModal, setShowCreateModal] = useState(false); + const theme = useTheme(); + const Icon = theme === Theme.Light ? ProtectedAppIcon : ProtectedAppDarkIcon; + + return ( + <> +
+ +
+ +
+
{t('title')}
+
+ , + }} + > + {t('description')} + +
+
+
+
+ {showCreateModal && ( + { + setShowCreateModal(false); + }} + /> + )} + + ); +} + +export default ProtectedAppCard; diff --git a/packages/console/src/pages/Applications/components/ProtectedAppForm/index.module.scss b/packages/console/src/pages/Applications/components/ProtectedAppForm/index.module.scss new file mode 100644 index 000000000..c7869e169 --- /dev/null +++ b/packages/console/src/pages/Applications/components/ProtectedAppForm/index.module.scss @@ -0,0 +1,29 @@ +@use '@/scss/underscore' as _; + +.fieldWrapper { + display: flex; + align-items: center; + width: 100%; + + .subdomain { + flex: 1; + + > div { + border-top-right-radius: 0; + border-bottom-right-radius: 0; + } + } + + .domain { + display: flex; + align-items: center; + padding: 0 _.unit(4); + border: 1px solid var(--color-border); + height: 36px; + border-radius: 0 6px 6px 0; + border-left: none; + font: var(--font-body-2); + color: var(--color-text); + background-color: var(--color-specific-unselected-disabled); + } +} diff --git a/packages/console/src/pages/Applications/components/ProtectedAppForm/index.tsx b/packages/console/src/pages/Applications/components/ProtectedAppForm/index.tsx new file mode 100644 index 000000000..a3a74062e --- /dev/null +++ b/packages/console/src/pages/Applications/components/ProtectedAppForm/index.tsx @@ -0,0 +1,41 @@ +import { useFormContext } from 'react-hook-form'; +import { useTranslation } from 'react-i18next'; + +import FormField from '@/ds-components/FormField'; +import TextInput from '@/ds-components/TextInput'; + +import * as styles from './index.module.scss'; + +function ProtectedAppForm() { + const { t } = useTranslation(undefined, { keyPrefix: 'admin_console.protected_app' }); + const { + register, + formState: { errors }, + } = useFormContext(); + + return ( + <> + +
+ + {/** TODO: @charles Hard-coded for now, will update to read from API later. */} +
.protected.app
+
+
+ + + + + ); +} + +export default ProtectedAppForm; diff --git a/packages/console/src/pages/Applications/components/ProtectedAppForm/types.ts b/packages/console/src/pages/Applications/components/ProtectedAppForm/types.ts new file mode 100644 index 000000000..7b96f53c7 --- /dev/null +++ b/packages/console/src/pages/Applications/components/ProtectedAppForm/types.ts @@ -0,0 +1,4 @@ +type ProtectedAppForm = { + subDomain: string; + origin: string; +}; diff --git a/packages/console/src/pages/Applications/components/ProtectedAppModal/index.tsx b/packages/console/src/pages/Applications/components/ProtectedAppModal/index.tsx new file mode 100644 index 000000000..2cd26a94d --- /dev/null +++ b/packages/console/src/pages/Applications/components/ProtectedAppModal/index.tsx @@ -0,0 +1,82 @@ +import { ApplicationType, type Application } from '@logto/schemas'; +import { FormProvider, useForm } from 'react-hook-form'; +import { toast } from 'react-hot-toast'; +import { useTranslation } from 'react-i18next'; +import Modal from 'react-modal'; + +import Button from '@/ds-components/Button'; +import ModalLayout from '@/ds-components/ModalLayout'; +import useApi from '@/hooks/use-api'; +import * as modalStyles from '@/scss/modal.module.scss'; +import { trySubmitSafe } from '@/utils/form'; + +import ProtectedAppForm from '../ProtectedAppForm'; + +type Props = { + onClose?: (createdApp?: Application) => void; +}; + +function ProtectedAppModal({ onClose }: Props) { + const methods = useForm(); + const { + handleSubmit, + formState: { isSubmitting }, + } = methods; + + const { t } = useTranslation(undefined, { keyPrefix: 'admin_console' }); + const api = useApi(); + + const onSubmit = handleSubmit( + trySubmitSafe(async (data) => { + if (isSubmitting) { + return; + } + + const createdApp = await api + .post('api/applications', { + json: { + name: data.subDomain, + type: ApplicationType.Protected, + protectedAppMetadata: data, + }, + }) + .json(); + toast.success(t('applications.application_created')); + onClose?.(createdApp); + }) + ); + + return ( + { + onClose?.(); + }} + > + + } + onClose={onClose} + > + + + + + + ); +} + +export default ProtectedAppModal; diff --git a/packages/console/src/types/applications.ts b/packages/console/src/types/applications.ts index 89895a7e9..6bfb1346c 100644 --- a/packages/console/src/types/applications.ts +++ b/packages/console/src/types/applications.ts @@ -9,8 +9,7 @@ export const applicationTypeI18nKey = Object.freeze({ [ApplicationType.SPA]: 'applications.type.spa', [ApplicationType.Traditional]: 'applications.type.traditional', [ApplicationType.MachineToMachine]: 'applications.type.machine_to_machine', - // TODO @sijie: update with new phrase - [ApplicationType.Protected]: 'applications.type.traditional', + [ApplicationType.Protected]: 'applications.type.protected', } as const); /** diff --git a/packages/phrases/src/locales/de/translation/admin-console/applications.ts b/packages/phrases/src/locales/de/translation/admin-console/applications.ts index 9dd9b36d2..d251a53b0 100644 --- a/packages/phrases/src/locales/de/translation/admin-console/applications.ts +++ b/packages/phrases/src/locales/de/translation/admin-console/applications.ts @@ -41,6 +41,14 @@ const applications = { subtitle: 'Eine Anwendung (normalerweise ein Dienst), die direkt mit Ressourcen kommuniziert', description: 'z.B. Backend Dienst', }, + protected: { + /** UNTRANSLATED */ + title: 'Protected App', + /** UNTRANSLATED */ + subtitle: 'An app that is protected by Logto', + /** UNTRANSLATED */ + description: 'N/A', + }, third_party: { /** UNTRANSLATED */ title: 'Third-party app', diff --git a/packages/phrases/src/locales/de/translation/admin-console/index.ts b/packages/phrases/src/locales/de/translation/admin-console/index.ts index c078a1cf2..7966b16f4 100644 --- a/packages/phrases/src/locales/de/translation/admin-console/index.ts +++ b/packages/phrases/src/locales/de/translation/admin-console/index.ts @@ -23,6 +23,7 @@ import organization_details from './organization-details.js'; import organizations from './organizations.js'; import permissions from './permissions.js'; import profile from './profile.js'; +import protected_app from './protected-app.js'; import role_details from './role-details.js'; import roles from './roles.js'; import session_expired from './session-expired.js'; @@ -83,6 +84,7 @@ const admin_console = { mfa, organizations, organization_details, + protected_app, }; export default Object.freeze(admin_console); diff --git a/packages/phrases/src/locales/de/translation/admin-console/protected-app.ts b/packages/phrases/src/locales/de/translation/admin-console/protected-app.ts new file mode 100644 index 000000000..2062dc6dc --- /dev/null +++ b/packages/phrases/src/locales/de/translation/admin-console/protected-app.ts @@ -0,0 +1,52 @@ +const protected_app = { + /** UNTRANSLATED */ + name: 'Protected App', + /** UNTRANSLATED */ + title: 'Create a Protected App with epic speed and simplicity', + /** UNTRANSLATED */ + description: + "Deploy with Logto secure workers, powered by Cloudflare's edge network for top-tier performance and 0ms cold starts worldwide. Learn more", + /** UNTRANSLATED */ + fast_create: 'Fast create', + /** UNTRANSLATED */ + modal_title: 'Create protected app', + /** UNTRANSLATED */ + modal_subtitle: 'No more integrating Logto SDK. Create you web app easily.', + form: { + /** UNTRANSLATED */ + domain_field_label: 'App domain protected', + /** UNTRANSLATED */ + domain_field_placeholder: 'Custom subdomain', + /** UNTRANSLATED */ + domain_field_description: + 'Specify the app domain that will be protected by authentication and redirected to the Origin URL.', + /** UNTRANSLATED */ + domain_field_tooltip: + "You can use a 'protected.app' subdomain powered by Logto for quick testing or online access, which remains consistently valid. After creation, your custom domain name can be added.", + /** UNTRANSLATED */ + url_field_label: 'Origin URL', + /** UNTRANSLATED */ + url_field_placeholder: 'https://', + /** UNTRANSLATED */ + url_field_tooltip: + "Enter primary website address of your application, excluding any '/routes'. After creation, you can customize route authentication rules.\n\nNote: The Origin URL itself won't require authentication; only accesses via the added app domain will be protected.", + /** UNTRANSLATED */ + create_application: 'Create application', + errors: { + /** UNTRANSLATED */ + domain_required: 'Subdomain is required', + /** UNTRANSLATED */ + domain_in_use: 'This subdomain name is already in use.', + /** UNTRANSLATED */ + invalid_domain_format: + "Invalid subdomain format: use only lowercase letters, hyphens '-', and underscores '_'.", + /** UNTRANSLATED */ + url_required: 'Origin URL is required.', + /** UNTRANSLATED */ + invalid_url: + "Invalid Origin URL format: Use http:// or https://. Note: '/routes' is not currently supported.", + }, + }, +}; + +export default Object.freeze(protected_app); diff --git a/packages/phrases/src/locales/en/translation/admin-console/applications.ts b/packages/phrases/src/locales/en/translation/admin-console/applications.ts index 29cb5105a..52ab3abf6 100644 --- a/packages/phrases/src/locales/en/translation/admin-console/applications.ts +++ b/packages/phrases/src/locales/en/translation/admin-console/applications.ts @@ -38,6 +38,11 @@ const applications = { subtitle: 'An app (usually a service) that directly talks to resources', description: 'E.g., Backend service', }, + protected: { + title: 'Protected App', + subtitle: 'An app that is protected by Logto', // Not in use + description: 'N/A', // Not in use + }, third_party: { title: 'Third-party app', subtitle: 'An app that is used as a third-party IdP connector', diff --git a/packages/phrases/src/locales/en/translation/admin-console/index.ts b/packages/phrases/src/locales/en/translation/admin-console/index.ts index 4dc9dbb89..f2b18bef7 100644 --- a/packages/phrases/src/locales/en/translation/admin-console/index.ts +++ b/packages/phrases/src/locales/en/translation/admin-console/index.ts @@ -23,6 +23,7 @@ import organization_details from './organization-details.js'; import organizations from './organizations.js'; import permissions from './permissions.js'; import profile from './profile.js'; +import protected_app from './protected-app.js'; import role_details from './role-details.js'; import roles from './roles.js'; import session_expired from './session-expired.js'; @@ -83,6 +84,7 @@ const admin_console = { mfa, organizations, organization_details, + protected_app, }; export default Object.freeze(admin_console); diff --git a/packages/phrases/src/locales/en/translation/admin-console/protected-app.ts b/packages/phrases/src/locales/en/translation/admin-console/protected-app.ts new file mode 100644 index 000000000..95be3bb9f --- /dev/null +++ b/packages/phrases/src/locales/en/translation/admin-console/protected-app.ts @@ -0,0 +1,33 @@ +const protected_app = { + name: 'Protected App', + title: 'Create a Protected App with epic speed and simplicity', + description: + "Deploy with Logto secure workers, powered by Cloudflare's edge network for top-tier performance and 0ms cold starts worldwide. Learn more", + fast_create: 'Fast create', + modal_title: 'Create protected app', + modal_subtitle: 'No more integrating Logto SDK. Create you web app easily.', + form: { + domain_field_label: 'App domain protected', + domain_field_placeholder: 'Custom subdomain', + domain_field_description: + 'Specify the app domain that will be protected by authentication and redirected to the Origin URL.', + domain_field_tooltip: + "You can use a 'protected.app' subdomain powered by Logto for quick testing or online access, which remains consistently valid. After creation, your custom domain name can be added.", + url_field_label: 'Origin URL', + url_field_placeholder: 'https://', + url_field_tooltip: + "Enter primary website address of your application, excluding any '/routes'. After creation, you can customize route authentication rules.\n\nNote: The Origin URL itself won't require authentication; only accesses via the added app domain will be protected.", + create_application: 'Create application', + errors: { + domain_required: 'Subdomain is required', + domain_in_use: 'This subdomain name is already in use.', + invalid_domain_format: + "Invalid subdomain format: use only lowercase letters, hyphens '-', and underscores '_'.", + url_required: 'Origin URL is required.', + invalid_url: + "Invalid Origin URL format: Use http:// or https://. Note: '/routes' is not currently supported.", + }, + }, +}; + +export default Object.freeze(protected_app); diff --git a/packages/phrases/src/locales/es/translation/admin-console/applications.ts b/packages/phrases/src/locales/es/translation/admin-console/applications.ts index 55236742b..8a0eb957a 100644 --- a/packages/phrases/src/locales/es/translation/admin-console/applications.ts +++ b/packages/phrases/src/locales/es/translation/admin-console/applications.ts @@ -41,6 +41,14 @@ const applications = { subtitle: 'Una aplicación (generalmente un servicio) que habla directamente con recursos', description: 'Por ejemplo, servicio backend', }, + protected: { + /** UNTRANSLATED */ + title: 'Protected App', + /** UNTRANSLATED */ + subtitle: 'An app that is protected by Logto', + /** UNTRANSLATED */ + description: 'N/A', + }, third_party: { /** UNTRANSLATED */ title: 'Third-party app', diff --git a/packages/phrases/src/locales/es/translation/admin-console/index.ts b/packages/phrases/src/locales/es/translation/admin-console/index.ts index 100850330..ad0720c38 100644 --- a/packages/phrases/src/locales/es/translation/admin-console/index.ts +++ b/packages/phrases/src/locales/es/translation/admin-console/index.ts @@ -23,6 +23,7 @@ import organization_details from './organization-details.js'; import organizations from './organizations.js'; import permissions from './permissions.js'; import profile from './profile.js'; +import protected_app from './protected-app.js'; import role_details from './role-details.js'; import roles from './roles.js'; import session_expired from './session-expired.js'; @@ -83,6 +84,7 @@ const admin_console = { mfa, organizations, organization_details, + protected_app, }; export default Object.freeze(admin_console); diff --git a/packages/phrases/src/locales/es/translation/admin-console/protected-app.ts b/packages/phrases/src/locales/es/translation/admin-console/protected-app.ts new file mode 100644 index 000000000..2062dc6dc --- /dev/null +++ b/packages/phrases/src/locales/es/translation/admin-console/protected-app.ts @@ -0,0 +1,52 @@ +const protected_app = { + /** UNTRANSLATED */ + name: 'Protected App', + /** UNTRANSLATED */ + title: 'Create a Protected App with epic speed and simplicity', + /** UNTRANSLATED */ + description: + "Deploy with Logto secure workers, powered by Cloudflare's edge network for top-tier performance and 0ms cold starts worldwide. Learn more", + /** UNTRANSLATED */ + fast_create: 'Fast create', + /** UNTRANSLATED */ + modal_title: 'Create protected app', + /** UNTRANSLATED */ + modal_subtitle: 'No more integrating Logto SDK. Create you web app easily.', + form: { + /** UNTRANSLATED */ + domain_field_label: 'App domain protected', + /** UNTRANSLATED */ + domain_field_placeholder: 'Custom subdomain', + /** UNTRANSLATED */ + domain_field_description: + 'Specify the app domain that will be protected by authentication and redirected to the Origin URL.', + /** UNTRANSLATED */ + domain_field_tooltip: + "You can use a 'protected.app' subdomain powered by Logto for quick testing or online access, which remains consistently valid. After creation, your custom domain name can be added.", + /** UNTRANSLATED */ + url_field_label: 'Origin URL', + /** UNTRANSLATED */ + url_field_placeholder: 'https://', + /** UNTRANSLATED */ + url_field_tooltip: + "Enter primary website address of your application, excluding any '/routes'. After creation, you can customize route authentication rules.\n\nNote: The Origin URL itself won't require authentication; only accesses via the added app domain will be protected.", + /** UNTRANSLATED */ + create_application: 'Create application', + errors: { + /** UNTRANSLATED */ + domain_required: 'Subdomain is required', + /** UNTRANSLATED */ + domain_in_use: 'This subdomain name is already in use.', + /** UNTRANSLATED */ + invalid_domain_format: + "Invalid subdomain format: use only lowercase letters, hyphens '-', and underscores '_'.", + /** UNTRANSLATED */ + url_required: 'Origin URL is required.', + /** UNTRANSLATED */ + invalid_url: + "Invalid Origin URL format: Use http:// or https://. Note: '/routes' is not currently supported.", + }, + }, +}; + +export default Object.freeze(protected_app); diff --git a/packages/phrases/src/locales/fr/translation/admin-console/applications.ts b/packages/phrases/src/locales/fr/translation/admin-console/applications.ts index 6f6a69bb0..fe5f701df 100644 --- a/packages/phrases/src/locales/fr/translation/admin-console/applications.ts +++ b/packages/phrases/src/locales/fr/translation/admin-console/applications.ts @@ -42,6 +42,14 @@ const applications = { 'Une application (généralement un service) qui communique directement avec les ressources', description: 'Par exemple, un service backend', }, + protected: { + /** UNTRANSLATED */ + title: 'Protected App', + /** UNTRANSLATED */ + subtitle: 'An app that is protected by Logto', + /** UNTRANSLATED */ + description: 'N/A', + }, third_party: { /** UNTRANSLATED */ title: 'Third-party app', diff --git a/packages/phrases/src/locales/fr/translation/admin-console/index.ts b/packages/phrases/src/locales/fr/translation/admin-console/index.ts index 4dc9dbb89..f2b18bef7 100644 --- a/packages/phrases/src/locales/fr/translation/admin-console/index.ts +++ b/packages/phrases/src/locales/fr/translation/admin-console/index.ts @@ -23,6 +23,7 @@ import organization_details from './organization-details.js'; import organizations from './organizations.js'; import permissions from './permissions.js'; import profile from './profile.js'; +import protected_app from './protected-app.js'; import role_details from './role-details.js'; import roles from './roles.js'; import session_expired from './session-expired.js'; @@ -83,6 +84,7 @@ const admin_console = { mfa, organizations, organization_details, + protected_app, }; export default Object.freeze(admin_console); diff --git a/packages/phrases/src/locales/fr/translation/admin-console/protected-app.ts b/packages/phrases/src/locales/fr/translation/admin-console/protected-app.ts new file mode 100644 index 000000000..2062dc6dc --- /dev/null +++ b/packages/phrases/src/locales/fr/translation/admin-console/protected-app.ts @@ -0,0 +1,52 @@ +const protected_app = { + /** UNTRANSLATED */ + name: 'Protected App', + /** UNTRANSLATED */ + title: 'Create a Protected App with epic speed and simplicity', + /** UNTRANSLATED */ + description: + "Deploy with Logto secure workers, powered by Cloudflare's edge network for top-tier performance and 0ms cold starts worldwide. Learn more", + /** UNTRANSLATED */ + fast_create: 'Fast create', + /** UNTRANSLATED */ + modal_title: 'Create protected app', + /** UNTRANSLATED */ + modal_subtitle: 'No more integrating Logto SDK. Create you web app easily.', + form: { + /** UNTRANSLATED */ + domain_field_label: 'App domain protected', + /** UNTRANSLATED */ + domain_field_placeholder: 'Custom subdomain', + /** UNTRANSLATED */ + domain_field_description: + 'Specify the app domain that will be protected by authentication and redirected to the Origin URL.', + /** UNTRANSLATED */ + domain_field_tooltip: + "You can use a 'protected.app' subdomain powered by Logto for quick testing or online access, which remains consistently valid. After creation, your custom domain name can be added.", + /** UNTRANSLATED */ + url_field_label: 'Origin URL', + /** UNTRANSLATED */ + url_field_placeholder: 'https://', + /** UNTRANSLATED */ + url_field_tooltip: + "Enter primary website address of your application, excluding any '/routes'. After creation, you can customize route authentication rules.\n\nNote: The Origin URL itself won't require authentication; only accesses via the added app domain will be protected.", + /** UNTRANSLATED */ + create_application: 'Create application', + errors: { + /** UNTRANSLATED */ + domain_required: 'Subdomain is required', + /** UNTRANSLATED */ + domain_in_use: 'This subdomain name is already in use.', + /** UNTRANSLATED */ + invalid_domain_format: + "Invalid subdomain format: use only lowercase letters, hyphens '-', and underscores '_'.", + /** UNTRANSLATED */ + url_required: 'Origin URL is required.', + /** UNTRANSLATED */ + invalid_url: + "Invalid Origin URL format: Use http:// or https://. Note: '/routes' is not currently supported.", + }, + }, +}; + +export default Object.freeze(protected_app); diff --git a/packages/phrases/src/locales/it/translation/admin-console/applications.ts b/packages/phrases/src/locales/it/translation/admin-console/applications.ts index 78d9657cc..a79d7dde6 100644 --- a/packages/phrases/src/locales/it/translation/admin-console/applications.ts +++ b/packages/phrases/src/locales/it/translation/admin-console/applications.ts @@ -41,6 +41,14 @@ const applications = { subtitle: "Un'app (solitamente un servizio) che comunica direttamente con le risorse", description: 'E.g., servizio backend', }, + protected: { + /** UNTRANSLATED */ + title: 'Protected App', + /** UNTRANSLATED */ + subtitle: 'An app that is protected by Logto', + /** UNTRANSLATED */ + description: 'N/A', + }, third_party: { /** UNTRANSLATED */ title: 'Third-party app', diff --git a/packages/phrases/src/locales/it/translation/admin-console/index.ts b/packages/phrases/src/locales/it/translation/admin-console/index.ts index 4dc9dbb89..f2b18bef7 100644 --- a/packages/phrases/src/locales/it/translation/admin-console/index.ts +++ b/packages/phrases/src/locales/it/translation/admin-console/index.ts @@ -23,6 +23,7 @@ import organization_details from './organization-details.js'; import organizations from './organizations.js'; import permissions from './permissions.js'; import profile from './profile.js'; +import protected_app from './protected-app.js'; import role_details from './role-details.js'; import roles from './roles.js'; import session_expired from './session-expired.js'; @@ -83,6 +84,7 @@ const admin_console = { mfa, organizations, organization_details, + protected_app, }; export default Object.freeze(admin_console); diff --git a/packages/phrases/src/locales/it/translation/admin-console/protected-app.ts b/packages/phrases/src/locales/it/translation/admin-console/protected-app.ts new file mode 100644 index 000000000..2062dc6dc --- /dev/null +++ b/packages/phrases/src/locales/it/translation/admin-console/protected-app.ts @@ -0,0 +1,52 @@ +const protected_app = { + /** UNTRANSLATED */ + name: 'Protected App', + /** UNTRANSLATED */ + title: 'Create a Protected App with epic speed and simplicity', + /** UNTRANSLATED */ + description: + "Deploy with Logto secure workers, powered by Cloudflare's edge network for top-tier performance and 0ms cold starts worldwide. Learn more", + /** UNTRANSLATED */ + fast_create: 'Fast create', + /** UNTRANSLATED */ + modal_title: 'Create protected app', + /** UNTRANSLATED */ + modal_subtitle: 'No more integrating Logto SDK. Create you web app easily.', + form: { + /** UNTRANSLATED */ + domain_field_label: 'App domain protected', + /** UNTRANSLATED */ + domain_field_placeholder: 'Custom subdomain', + /** UNTRANSLATED */ + domain_field_description: + 'Specify the app domain that will be protected by authentication and redirected to the Origin URL.', + /** UNTRANSLATED */ + domain_field_tooltip: + "You can use a 'protected.app' subdomain powered by Logto for quick testing or online access, which remains consistently valid. After creation, your custom domain name can be added.", + /** UNTRANSLATED */ + url_field_label: 'Origin URL', + /** UNTRANSLATED */ + url_field_placeholder: 'https://', + /** UNTRANSLATED */ + url_field_tooltip: + "Enter primary website address of your application, excluding any '/routes'. After creation, you can customize route authentication rules.\n\nNote: The Origin URL itself won't require authentication; only accesses via the added app domain will be protected.", + /** UNTRANSLATED */ + create_application: 'Create application', + errors: { + /** UNTRANSLATED */ + domain_required: 'Subdomain is required', + /** UNTRANSLATED */ + domain_in_use: 'This subdomain name is already in use.', + /** UNTRANSLATED */ + invalid_domain_format: + "Invalid subdomain format: use only lowercase letters, hyphens '-', and underscores '_'.", + /** UNTRANSLATED */ + url_required: 'Origin URL is required.', + /** UNTRANSLATED */ + invalid_url: + "Invalid Origin URL format: Use http:// or https://. Note: '/routes' is not currently supported.", + }, + }, +}; + +export default Object.freeze(protected_app); diff --git a/packages/phrases/src/locales/ja/translation/admin-console/applications.ts b/packages/phrases/src/locales/ja/translation/admin-console/applications.ts index c1e2813e3..e6a1c9681 100644 --- a/packages/phrases/src/locales/ja/translation/admin-console/applications.ts +++ b/packages/phrases/src/locales/ja/translation/admin-console/applications.ts @@ -40,6 +40,14 @@ const applications = { subtitle: 'リソースに直接アクセスするアプリケーション(通常はサービス)', description: '例:バックエンドサービス', }, + protected: { + /** UNTRANSLATED */ + title: 'Protected App', + /** UNTRANSLATED */ + subtitle: 'An app that is protected by Logto', + /** UNTRANSLATED */ + description: 'N/A', + }, third_party: { /** UNTRANSLATED */ title: 'Third-party app', diff --git a/packages/phrases/src/locales/ja/translation/admin-console/index.ts b/packages/phrases/src/locales/ja/translation/admin-console/index.ts index 4dc9dbb89..f2b18bef7 100644 --- a/packages/phrases/src/locales/ja/translation/admin-console/index.ts +++ b/packages/phrases/src/locales/ja/translation/admin-console/index.ts @@ -23,6 +23,7 @@ import organization_details from './organization-details.js'; import organizations from './organizations.js'; import permissions from './permissions.js'; import profile from './profile.js'; +import protected_app from './protected-app.js'; import role_details from './role-details.js'; import roles from './roles.js'; import session_expired from './session-expired.js'; @@ -83,6 +84,7 @@ const admin_console = { mfa, organizations, organization_details, + protected_app, }; export default Object.freeze(admin_console); diff --git a/packages/phrases/src/locales/ja/translation/admin-console/protected-app.ts b/packages/phrases/src/locales/ja/translation/admin-console/protected-app.ts new file mode 100644 index 000000000..2062dc6dc --- /dev/null +++ b/packages/phrases/src/locales/ja/translation/admin-console/protected-app.ts @@ -0,0 +1,52 @@ +const protected_app = { + /** UNTRANSLATED */ + name: 'Protected App', + /** UNTRANSLATED */ + title: 'Create a Protected App with epic speed and simplicity', + /** UNTRANSLATED */ + description: + "Deploy with Logto secure workers, powered by Cloudflare's edge network for top-tier performance and 0ms cold starts worldwide. Learn more", + /** UNTRANSLATED */ + fast_create: 'Fast create', + /** UNTRANSLATED */ + modal_title: 'Create protected app', + /** UNTRANSLATED */ + modal_subtitle: 'No more integrating Logto SDK. Create you web app easily.', + form: { + /** UNTRANSLATED */ + domain_field_label: 'App domain protected', + /** UNTRANSLATED */ + domain_field_placeholder: 'Custom subdomain', + /** UNTRANSLATED */ + domain_field_description: + 'Specify the app domain that will be protected by authentication and redirected to the Origin URL.', + /** UNTRANSLATED */ + domain_field_tooltip: + "You can use a 'protected.app' subdomain powered by Logto for quick testing or online access, which remains consistently valid. After creation, your custom domain name can be added.", + /** UNTRANSLATED */ + url_field_label: 'Origin URL', + /** UNTRANSLATED */ + url_field_placeholder: 'https://', + /** UNTRANSLATED */ + url_field_tooltip: + "Enter primary website address of your application, excluding any '/routes'. After creation, you can customize route authentication rules.\n\nNote: The Origin URL itself won't require authentication; only accesses via the added app domain will be protected.", + /** UNTRANSLATED */ + create_application: 'Create application', + errors: { + /** UNTRANSLATED */ + domain_required: 'Subdomain is required', + /** UNTRANSLATED */ + domain_in_use: 'This subdomain name is already in use.', + /** UNTRANSLATED */ + invalid_domain_format: + "Invalid subdomain format: use only lowercase letters, hyphens '-', and underscores '_'.", + /** UNTRANSLATED */ + url_required: 'Origin URL is required.', + /** UNTRANSLATED */ + invalid_url: + "Invalid Origin URL format: Use http:// or https://. Note: '/routes' is not currently supported.", + }, + }, +}; + +export default Object.freeze(protected_app); diff --git a/packages/phrases/src/locales/ko/translation/admin-console/applications.ts b/packages/phrases/src/locales/ko/translation/admin-console/applications.ts index 67836b8cc..c2834dc2a 100644 --- a/packages/phrases/src/locales/ko/translation/admin-console/applications.ts +++ b/packages/phrases/src/locales/ko/translation/admin-console/applications.ts @@ -40,6 +40,14 @@ const applications = { subtitle: '직접 리소스에 접근하는 엡(서비스)', description: '예) 백엔드 서비스', }, + protected: { + /** UNTRANSLATED */ + title: 'Protected App', + /** UNTRANSLATED */ + subtitle: 'An app that is protected by Logto', + /** UNTRANSLATED */ + description: 'N/A', + }, third_party: { /** UNTRANSLATED */ title: 'Third-party app', diff --git a/packages/phrases/src/locales/ko/translation/admin-console/index.ts b/packages/phrases/src/locales/ko/translation/admin-console/index.ts index b5bda8c79..775b3e311 100644 --- a/packages/phrases/src/locales/ko/translation/admin-console/index.ts +++ b/packages/phrases/src/locales/ko/translation/admin-console/index.ts @@ -23,6 +23,7 @@ import organization_details from './organization-details.js'; import organizations from './organizations.js'; import permissions from './permissions.js'; import profile from './profile.js'; +import protected_app from './protected-app.js'; import role_details from './role-details.js'; import roles from './roles.js'; import session_expired from './session-expired.js'; @@ -83,6 +84,7 @@ const admin_console = { mfa, organizations, organization_details, + protected_app, }; export default Object.freeze(admin_console); diff --git a/packages/phrases/src/locales/ko/translation/admin-console/protected-app.ts b/packages/phrases/src/locales/ko/translation/admin-console/protected-app.ts new file mode 100644 index 000000000..2062dc6dc --- /dev/null +++ b/packages/phrases/src/locales/ko/translation/admin-console/protected-app.ts @@ -0,0 +1,52 @@ +const protected_app = { + /** UNTRANSLATED */ + name: 'Protected App', + /** UNTRANSLATED */ + title: 'Create a Protected App with epic speed and simplicity', + /** UNTRANSLATED */ + description: + "Deploy with Logto secure workers, powered by Cloudflare's edge network for top-tier performance and 0ms cold starts worldwide. Learn more", + /** UNTRANSLATED */ + fast_create: 'Fast create', + /** UNTRANSLATED */ + modal_title: 'Create protected app', + /** UNTRANSLATED */ + modal_subtitle: 'No more integrating Logto SDK. Create you web app easily.', + form: { + /** UNTRANSLATED */ + domain_field_label: 'App domain protected', + /** UNTRANSLATED */ + domain_field_placeholder: 'Custom subdomain', + /** UNTRANSLATED */ + domain_field_description: + 'Specify the app domain that will be protected by authentication and redirected to the Origin URL.', + /** UNTRANSLATED */ + domain_field_tooltip: + "You can use a 'protected.app' subdomain powered by Logto for quick testing or online access, which remains consistently valid. After creation, your custom domain name can be added.", + /** UNTRANSLATED */ + url_field_label: 'Origin URL', + /** UNTRANSLATED */ + url_field_placeholder: 'https://', + /** UNTRANSLATED */ + url_field_tooltip: + "Enter primary website address of your application, excluding any '/routes'. After creation, you can customize route authentication rules.\n\nNote: The Origin URL itself won't require authentication; only accesses via the added app domain will be protected.", + /** UNTRANSLATED */ + create_application: 'Create application', + errors: { + /** UNTRANSLATED */ + domain_required: 'Subdomain is required', + /** UNTRANSLATED */ + domain_in_use: 'This subdomain name is already in use.', + /** UNTRANSLATED */ + invalid_domain_format: + "Invalid subdomain format: use only lowercase letters, hyphens '-', and underscores '_'.", + /** UNTRANSLATED */ + url_required: 'Origin URL is required.', + /** UNTRANSLATED */ + invalid_url: + "Invalid Origin URL format: Use http:// or https://. Note: '/routes' is not currently supported.", + }, + }, +}; + +export default Object.freeze(protected_app); diff --git a/packages/phrases/src/locales/pl-pl/translation/admin-console/applications.ts b/packages/phrases/src/locales/pl-pl/translation/admin-console/applications.ts index 623bd1786..bd25883ae 100644 --- a/packages/phrases/src/locales/pl-pl/translation/admin-console/applications.ts +++ b/packages/phrases/src/locales/pl-pl/translation/admin-console/applications.ts @@ -41,6 +41,14 @@ const applications = { subtitle: 'Aplikacja (zazwyczaj usługa), która bezpośrednio komunikuje się z zasobami', description: 'Na przykład usługa backendowa', }, + protected: { + /** UNTRANSLATED */ + title: 'Protected App', + /** UNTRANSLATED */ + subtitle: 'An app that is protected by Logto', + /** UNTRANSLATED */ + description: 'N/A', + }, third_party: { /** UNTRANSLATED */ title: 'Third-party app', diff --git a/packages/phrases/src/locales/pl-pl/translation/admin-console/index.ts b/packages/phrases/src/locales/pl-pl/translation/admin-console/index.ts index b5bda8c79..775b3e311 100644 --- a/packages/phrases/src/locales/pl-pl/translation/admin-console/index.ts +++ b/packages/phrases/src/locales/pl-pl/translation/admin-console/index.ts @@ -23,6 +23,7 @@ import organization_details from './organization-details.js'; import organizations from './organizations.js'; import permissions from './permissions.js'; import profile from './profile.js'; +import protected_app from './protected-app.js'; import role_details from './role-details.js'; import roles from './roles.js'; import session_expired from './session-expired.js'; @@ -83,6 +84,7 @@ const admin_console = { mfa, organizations, organization_details, + protected_app, }; export default Object.freeze(admin_console); diff --git a/packages/phrases/src/locales/pl-pl/translation/admin-console/protected-app.ts b/packages/phrases/src/locales/pl-pl/translation/admin-console/protected-app.ts new file mode 100644 index 000000000..2062dc6dc --- /dev/null +++ b/packages/phrases/src/locales/pl-pl/translation/admin-console/protected-app.ts @@ -0,0 +1,52 @@ +const protected_app = { + /** UNTRANSLATED */ + name: 'Protected App', + /** UNTRANSLATED */ + title: 'Create a Protected App with epic speed and simplicity', + /** UNTRANSLATED */ + description: + "Deploy with Logto secure workers, powered by Cloudflare's edge network for top-tier performance and 0ms cold starts worldwide. Learn more", + /** UNTRANSLATED */ + fast_create: 'Fast create', + /** UNTRANSLATED */ + modal_title: 'Create protected app', + /** UNTRANSLATED */ + modal_subtitle: 'No more integrating Logto SDK. Create you web app easily.', + form: { + /** UNTRANSLATED */ + domain_field_label: 'App domain protected', + /** UNTRANSLATED */ + domain_field_placeholder: 'Custom subdomain', + /** UNTRANSLATED */ + domain_field_description: + 'Specify the app domain that will be protected by authentication and redirected to the Origin URL.', + /** UNTRANSLATED */ + domain_field_tooltip: + "You can use a 'protected.app' subdomain powered by Logto for quick testing or online access, which remains consistently valid. After creation, your custom domain name can be added.", + /** UNTRANSLATED */ + url_field_label: 'Origin URL', + /** UNTRANSLATED */ + url_field_placeholder: 'https://', + /** UNTRANSLATED */ + url_field_tooltip: + "Enter primary website address of your application, excluding any '/routes'. After creation, you can customize route authentication rules.\n\nNote: The Origin URL itself won't require authentication; only accesses via the added app domain will be protected.", + /** UNTRANSLATED */ + create_application: 'Create application', + errors: { + /** UNTRANSLATED */ + domain_required: 'Subdomain is required', + /** UNTRANSLATED */ + domain_in_use: 'This subdomain name is already in use.', + /** UNTRANSLATED */ + invalid_domain_format: + "Invalid subdomain format: use only lowercase letters, hyphens '-', and underscores '_'.", + /** UNTRANSLATED */ + url_required: 'Origin URL is required.', + /** UNTRANSLATED */ + invalid_url: + "Invalid Origin URL format: Use http:// or https://. Note: '/routes' is not currently supported.", + }, + }, +}; + +export default Object.freeze(protected_app); diff --git a/packages/phrases/src/locales/pt-br/translation/admin-console/applications.ts b/packages/phrases/src/locales/pt-br/translation/admin-console/applications.ts index 38fa5dc5e..97e0273d6 100644 --- a/packages/phrases/src/locales/pt-br/translation/admin-console/applications.ts +++ b/packages/phrases/src/locales/pt-br/translation/admin-console/applications.ts @@ -41,6 +41,14 @@ const applications = { subtitle: 'Um aplicativo (geralmente um serviço) que fala diretamente com os recursos', description: 'Ex: serviço de backend', }, + protected: { + /** UNTRANSLATED */ + title: 'Protected App', + /** UNTRANSLATED */ + subtitle: 'An app that is protected by Logto', + /** UNTRANSLATED */ + description: 'N/A', + }, third_party: { /** UNTRANSLATED */ title: 'Third-party app', diff --git a/packages/phrases/src/locales/pt-br/translation/admin-console/index.ts b/packages/phrases/src/locales/pt-br/translation/admin-console/index.ts index 9db1258bb..095fa2a77 100644 --- a/packages/phrases/src/locales/pt-br/translation/admin-console/index.ts +++ b/packages/phrases/src/locales/pt-br/translation/admin-console/index.ts @@ -23,6 +23,7 @@ import organization_details from './organization-details.js'; import organizations from './organizations.js'; import permissions from './permissions.js'; import profile from './profile.js'; +import protected_app from './protected-app.js'; import role_details from './role-details.js'; import roles from './roles.js'; import session_expired from './session-expired.js'; @@ -83,6 +84,7 @@ const admin_console = { mfa, organizations, organization_details, + protected_app, }; export default Object.freeze(admin_console); diff --git a/packages/phrases/src/locales/pt-br/translation/admin-console/protected-app.ts b/packages/phrases/src/locales/pt-br/translation/admin-console/protected-app.ts new file mode 100644 index 000000000..2062dc6dc --- /dev/null +++ b/packages/phrases/src/locales/pt-br/translation/admin-console/protected-app.ts @@ -0,0 +1,52 @@ +const protected_app = { + /** UNTRANSLATED */ + name: 'Protected App', + /** UNTRANSLATED */ + title: 'Create a Protected App with epic speed and simplicity', + /** UNTRANSLATED */ + description: + "Deploy with Logto secure workers, powered by Cloudflare's edge network for top-tier performance and 0ms cold starts worldwide. Learn more", + /** UNTRANSLATED */ + fast_create: 'Fast create', + /** UNTRANSLATED */ + modal_title: 'Create protected app', + /** UNTRANSLATED */ + modal_subtitle: 'No more integrating Logto SDK. Create you web app easily.', + form: { + /** UNTRANSLATED */ + domain_field_label: 'App domain protected', + /** UNTRANSLATED */ + domain_field_placeholder: 'Custom subdomain', + /** UNTRANSLATED */ + domain_field_description: + 'Specify the app domain that will be protected by authentication and redirected to the Origin URL.', + /** UNTRANSLATED */ + domain_field_tooltip: + "You can use a 'protected.app' subdomain powered by Logto for quick testing or online access, which remains consistently valid. After creation, your custom domain name can be added.", + /** UNTRANSLATED */ + url_field_label: 'Origin URL', + /** UNTRANSLATED */ + url_field_placeholder: 'https://', + /** UNTRANSLATED */ + url_field_tooltip: + "Enter primary website address of your application, excluding any '/routes'. After creation, you can customize route authentication rules.\n\nNote: The Origin URL itself won't require authentication; only accesses via the added app domain will be protected.", + /** UNTRANSLATED */ + create_application: 'Create application', + errors: { + /** UNTRANSLATED */ + domain_required: 'Subdomain is required', + /** UNTRANSLATED */ + domain_in_use: 'This subdomain name is already in use.', + /** UNTRANSLATED */ + invalid_domain_format: + "Invalid subdomain format: use only lowercase letters, hyphens '-', and underscores '_'.", + /** UNTRANSLATED */ + url_required: 'Origin URL is required.', + /** UNTRANSLATED */ + invalid_url: + "Invalid Origin URL format: Use http:// or https://. Note: '/routes' is not currently supported.", + }, + }, +}; + +export default Object.freeze(protected_app); diff --git a/packages/phrases/src/locales/pt-pt/translation/admin-console/applications.ts b/packages/phrases/src/locales/pt-pt/translation/admin-console/applications.ts index 2f532f0b6..6ee7145a6 100644 --- a/packages/phrases/src/locales/pt-pt/translation/admin-console/applications.ts +++ b/packages/phrases/src/locales/pt-pt/translation/admin-console/applications.ts @@ -40,6 +40,14 @@ const applications = { subtitle: 'Uma aplicação (normalmente um serviço) que se comunica diretamente com recursos', description: 'Ex., serviço back-end', }, + protected: { + /** UNTRANSLATED */ + title: 'Protected App', + /** UNTRANSLATED */ + subtitle: 'An app that is protected by Logto', + /** UNTRANSLATED */ + description: 'N/A', + }, third_party: { /** UNTRANSLATED */ title: 'Third-party app', diff --git a/packages/phrases/src/locales/pt-pt/translation/admin-console/index.ts b/packages/phrases/src/locales/pt-pt/translation/admin-console/index.ts index 4b0137e06..774ab6c00 100644 --- a/packages/phrases/src/locales/pt-pt/translation/admin-console/index.ts +++ b/packages/phrases/src/locales/pt-pt/translation/admin-console/index.ts @@ -23,6 +23,7 @@ import organization_details from './organization-details.js'; import organizations from './organizations.js'; import permissions from './permissions.js'; import profile from './profile.js'; +import protected_app from './protected-app.js'; import role_details from './role-details.js'; import roles from './roles.js'; import session_expired from './session-expired.js'; @@ -83,6 +84,7 @@ const admin_console = { mfa, organizations, organization_details, + protected_app, }; export default Object.freeze(admin_console); diff --git a/packages/phrases/src/locales/pt-pt/translation/admin-console/protected-app.ts b/packages/phrases/src/locales/pt-pt/translation/admin-console/protected-app.ts new file mode 100644 index 000000000..2062dc6dc --- /dev/null +++ b/packages/phrases/src/locales/pt-pt/translation/admin-console/protected-app.ts @@ -0,0 +1,52 @@ +const protected_app = { + /** UNTRANSLATED */ + name: 'Protected App', + /** UNTRANSLATED */ + title: 'Create a Protected App with epic speed and simplicity', + /** UNTRANSLATED */ + description: + "Deploy with Logto secure workers, powered by Cloudflare's edge network for top-tier performance and 0ms cold starts worldwide. Learn more", + /** UNTRANSLATED */ + fast_create: 'Fast create', + /** UNTRANSLATED */ + modal_title: 'Create protected app', + /** UNTRANSLATED */ + modal_subtitle: 'No more integrating Logto SDK. Create you web app easily.', + form: { + /** UNTRANSLATED */ + domain_field_label: 'App domain protected', + /** UNTRANSLATED */ + domain_field_placeholder: 'Custom subdomain', + /** UNTRANSLATED */ + domain_field_description: + 'Specify the app domain that will be protected by authentication and redirected to the Origin URL.', + /** UNTRANSLATED */ + domain_field_tooltip: + "You can use a 'protected.app' subdomain powered by Logto for quick testing or online access, which remains consistently valid. After creation, your custom domain name can be added.", + /** UNTRANSLATED */ + url_field_label: 'Origin URL', + /** UNTRANSLATED */ + url_field_placeholder: 'https://', + /** UNTRANSLATED */ + url_field_tooltip: + "Enter primary website address of your application, excluding any '/routes'. After creation, you can customize route authentication rules.\n\nNote: The Origin URL itself won't require authentication; only accesses via the added app domain will be protected.", + /** UNTRANSLATED */ + create_application: 'Create application', + errors: { + /** UNTRANSLATED */ + domain_required: 'Subdomain is required', + /** UNTRANSLATED */ + domain_in_use: 'This subdomain name is already in use.', + /** UNTRANSLATED */ + invalid_domain_format: + "Invalid subdomain format: use only lowercase letters, hyphens '-', and underscores '_'.", + /** UNTRANSLATED */ + url_required: 'Origin URL is required.', + /** UNTRANSLATED */ + invalid_url: + "Invalid Origin URL format: Use http:// or https://. Note: '/routes' is not currently supported.", + }, + }, +}; + +export default Object.freeze(protected_app); diff --git a/packages/phrases/src/locales/ru/translation/admin-console/applications.ts b/packages/phrases/src/locales/ru/translation/admin-console/applications.ts index 6fda4d72d..ecd301112 100644 --- a/packages/phrases/src/locales/ru/translation/admin-console/applications.ts +++ b/packages/phrases/src/locales/ru/translation/admin-console/applications.ts @@ -40,6 +40,14 @@ const applications = { subtitle: 'Приложение (обычно сервис), которое напрямую общается с ресурсами', description: 'Например, backend-сервис', }, + protected: { + /** UNTRANSLATED */ + title: 'Protected App', + /** UNTRANSLATED */ + subtitle: 'An app that is protected by Logto', + /** UNTRANSLATED */ + description: 'N/A', + }, third_party: { /** UNTRANSLATED */ title: 'Third-party app', diff --git a/packages/phrases/src/locales/ru/translation/admin-console/index.ts b/packages/phrases/src/locales/ru/translation/admin-console/index.ts index fbba2d209..2e290287b 100644 --- a/packages/phrases/src/locales/ru/translation/admin-console/index.ts +++ b/packages/phrases/src/locales/ru/translation/admin-console/index.ts @@ -23,6 +23,7 @@ import organization_details from './organization-details.js'; import organizations from './organizations.js'; import permissions from './permissions.js'; import profile from './profile.js'; +import protected_app from './protected-app.js'; import role_details from './role-details.js'; import roles from './roles.js'; import session_expired from './session-expired.js'; @@ -83,6 +84,7 @@ const admin_console = { mfa, organizations, organization_details, + protected_app, }; export default Object.freeze(admin_console); diff --git a/packages/phrases/src/locales/ru/translation/admin-console/protected-app.ts b/packages/phrases/src/locales/ru/translation/admin-console/protected-app.ts new file mode 100644 index 000000000..2062dc6dc --- /dev/null +++ b/packages/phrases/src/locales/ru/translation/admin-console/protected-app.ts @@ -0,0 +1,52 @@ +const protected_app = { + /** UNTRANSLATED */ + name: 'Protected App', + /** UNTRANSLATED */ + title: 'Create a Protected App with epic speed and simplicity', + /** UNTRANSLATED */ + description: + "Deploy with Logto secure workers, powered by Cloudflare's edge network for top-tier performance and 0ms cold starts worldwide. Learn more", + /** UNTRANSLATED */ + fast_create: 'Fast create', + /** UNTRANSLATED */ + modal_title: 'Create protected app', + /** UNTRANSLATED */ + modal_subtitle: 'No more integrating Logto SDK. Create you web app easily.', + form: { + /** UNTRANSLATED */ + domain_field_label: 'App domain protected', + /** UNTRANSLATED */ + domain_field_placeholder: 'Custom subdomain', + /** UNTRANSLATED */ + domain_field_description: + 'Specify the app domain that will be protected by authentication and redirected to the Origin URL.', + /** UNTRANSLATED */ + domain_field_tooltip: + "You can use a 'protected.app' subdomain powered by Logto for quick testing or online access, which remains consistently valid. After creation, your custom domain name can be added.", + /** UNTRANSLATED */ + url_field_label: 'Origin URL', + /** UNTRANSLATED */ + url_field_placeholder: 'https://', + /** UNTRANSLATED */ + url_field_tooltip: + "Enter primary website address of your application, excluding any '/routes'. After creation, you can customize route authentication rules.\n\nNote: The Origin URL itself won't require authentication; only accesses via the added app domain will be protected.", + /** UNTRANSLATED */ + create_application: 'Create application', + errors: { + /** UNTRANSLATED */ + domain_required: 'Subdomain is required', + /** UNTRANSLATED */ + domain_in_use: 'This subdomain name is already in use.', + /** UNTRANSLATED */ + invalid_domain_format: + "Invalid subdomain format: use only lowercase letters, hyphens '-', and underscores '_'.", + /** UNTRANSLATED */ + url_required: 'Origin URL is required.', + /** UNTRANSLATED */ + invalid_url: + "Invalid Origin URL format: Use http:// or https://. Note: '/routes' is not currently supported.", + }, + }, +}; + +export default Object.freeze(protected_app); diff --git a/packages/phrases/src/locales/tr-tr/translation/admin-console/applications.ts b/packages/phrases/src/locales/tr-tr/translation/admin-console/applications.ts index 433eb6667..6f3391bd2 100644 --- a/packages/phrases/src/locales/tr-tr/translation/admin-console/applications.ts +++ b/packages/phrases/src/locales/tr-tr/translation/admin-console/applications.ts @@ -41,6 +41,14 @@ const applications = { subtitle: 'Kaynaklarla doğrudan iletişim kuran bir uygulama (genellikle bir servis)', description: 'Örneğin, Backend servisi', }, + protected: { + /** UNTRANSLATED */ + title: 'Protected App', + /** UNTRANSLATED */ + subtitle: 'An app that is protected by Logto', + /** UNTRANSLATED */ + description: 'N/A', + }, third_party: { /** UNTRANSLATED */ title: 'Third-party app', diff --git a/packages/phrases/src/locales/tr-tr/translation/admin-console/index.ts b/packages/phrases/src/locales/tr-tr/translation/admin-console/index.ts index 275809b1a..b1aabc9eb 100644 --- a/packages/phrases/src/locales/tr-tr/translation/admin-console/index.ts +++ b/packages/phrases/src/locales/tr-tr/translation/admin-console/index.ts @@ -23,6 +23,7 @@ import organization_details from './organization-details.js'; import organizations from './organizations.js'; import permissions from './permissions.js'; import profile from './profile.js'; +import protected_app from './protected-app.js'; import role_details from './role-details.js'; import roles from './roles.js'; import session_expired from './session-expired.js'; @@ -83,6 +84,7 @@ const admin_console = { mfa, organizations, organization_details, + protected_app, }; export default Object.freeze(admin_console); diff --git a/packages/phrases/src/locales/tr-tr/translation/admin-console/protected-app.ts b/packages/phrases/src/locales/tr-tr/translation/admin-console/protected-app.ts new file mode 100644 index 000000000..2062dc6dc --- /dev/null +++ b/packages/phrases/src/locales/tr-tr/translation/admin-console/protected-app.ts @@ -0,0 +1,52 @@ +const protected_app = { + /** UNTRANSLATED */ + name: 'Protected App', + /** UNTRANSLATED */ + title: 'Create a Protected App with epic speed and simplicity', + /** UNTRANSLATED */ + description: + "Deploy with Logto secure workers, powered by Cloudflare's edge network for top-tier performance and 0ms cold starts worldwide. Learn more", + /** UNTRANSLATED */ + fast_create: 'Fast create', + /** UNTRANSLATED */ + modal_title: 'Create protected app', + /** UNTRANSLATED */ + modal_subtitle: 'No more integrating Logto SDK. Create you web app easily.', + form: { + /** UNTRANSLATED */ + domain_field_label: 'App domain protected', + /** UNTRANSLATED */ + domain_field_placeholder: 'Custom subdomain', + /** UNTRANSLATED */ + domain_field_description: + 'Specify the app domain that will be protected by authentication and redirected to the Origin URL.', + /** UNTRANSLATED */ + domain_field_tooltip: + "You can use a 'protected.app' subdomain powered by Logto for quick testing or online access, which remains consistently valid. After creation, your custom domain name can be added.", + /** UNTRANSLATED */ + url_field_label: 'Origin URL', + /** UNTRANSLATED */ + url_field_placeholder: 'https://', + /** UNTRANSLATED */ + url_field_tooltip: + "Enter primary website address of your application, excluding any '/routes'. After creation, you can customize route authentication rules.\n\nNote: The Origin URL itself won't require authentication; only accesses via the added app domain will be protected.", + /** UNTRANSLATED */ + create_application: 'Create application', + errors: { + /** UNTRANSLATED */ + domain_required: 'Subdomain is required', + /** UNTRANSLATED */ + domain_in_use: 'This subdomain name is already in use.', + /** UNTRANSLATED */ + invalid_domain_format: + "Invalid subdomain format: use only lowercase letters, hyphens '-', and underscores '_'.", + /** UNTRANSLATED */ + url_required: 'Origin URL is required.', + /** UNTRANSLATED */ + invalid_url: + "Invalid Origin URL format: Use http:// or https://. Note: '/routes' is not currently supported.", + }, + }, +}; + +export default Object.freeze(protected_app); diff --git a/packages/phrases/src/locales/zh-cn/translation/admin-console/applications.ts b/packages/phrases/src/locales/zh-cn/translation/admin-console/applications.ts index edc91c703..cf0ff4cae 100644 --- a/packages/phrases/src/locales/zh-cn/translation/admin-console/applications.ts +++ b/packages/phrases/src/locales/zh-cn/translation/admin-console/applications.ts @@ -39,6 +39,14 @@ const applications = { subtitle: '直接与资源对话的应用程序(通常是服务)', description: '例如,后端服务', }, + protected: { + /** UNTRANSLATED */ + title: 'Protected App', + /** UNTRANSLATED */ + subtitle: 'An app that is protected by Logto', + /** UNTRANSLATED */ + description: 'N/A', + }, third_party: { /** UNTRANSLATED */ title: 'Third-party app', diff --git a/packages/phrases/src/locales/zh-cn/translation/admin-console/index.ts b/packages/phrases/src/locales/zh-cn/translation/admin-console/index.ts index 5e9d1dd49..dad97ee43 100644 --- a/packages/phrases/src/locales/zh-cn/translation/admin-console/index.ts +++ b/packages/phrases/src/locales/zh-cn/translation/admin-console/index.ts @@ -23,6 +23,7 @@ import organization_details from './organization-details.js'; import organizations from './organizations.js'; import permissions from './permissions.js'; import profile from './profile.js'; +import protected_app from './protected-app.js'; import role_details from './role-details.js'; import roles from './roles.js'; import session_expired from './session-expired.js'; @@ -83,6 +84,7 @@ const admin_console = { mfa, organizations, organization_details, + protected_app, }; export default Object.freeze(admin_console); diff --git a/packages/phrases/src/locales/zh-cn/translation/admin-console/protected-app.ts b/packages/phrases/src/locales/zh-cn/translation/admin-console/protected-app.ts new file mode 100644 index 000000000..2062dc6dc --- /dev/null +++ b/packages/phrases/src/locales/zh-cn/translation/admin-console/protected-app.ts @@ -0,0 +1,52 @@ +const protected_app = { + /** UNTRANSLATED */ + name: 'Protected App', + /** UNTRANSLATED */ + title: 'Create a Protected App with epic speed and simplicity', + /** UNTRANSLATED */ + description: + "Deploy with Logto secure workers, powered by Cloudflare's edge network for top-tier performance and 0ms cold starts worldwide. Learn more", + /** UNTRANSLATED */ + fast_create: 'Fast create', + /** UNTRANSLATED */ + modal_title: 'Create protected app', + /** UNTRANSLATED */ + modal_subtitle: 'No more integrating Logto SDK. Create you web app easily.', + form: { + /** UNTRANSLATED */ + domain_field_label: 'App domain protected', + /** UNTRANSLATED */ + domain_field_placeholder: 'Custom subdomain', + /** UNTRANSLATED */ + domain_field_description: + 'Specify the app domain that will be protected by authentication and redirected to the Origin URL.', + /** UNTRANSLATED */ + domain_field_tooltip: + "You can use a 'protected.app' subdomain powered by Logto for quick testing or online access, which remains consistently valid. After creation, your custom domain name can be added.", + /** UNTRANSLATED */ + url_field_label: 'Origin URL', + /** UNTRANSLATED */ + url_field_placeholder: 'https://', + /** UNTRANSLATED */ + url_field_tooltip: + "Enter primary website address of your application, excluding any '/routes'. After creation, you can customize route authentication rules.\n\nNote: The Origin URL itself won't require authentication; only accesses via the added app domain will be protected.", + /** UNTRANSLATED */ + create_application: 'Create application', + errors: { + /** UNTRANSLATED */ + domain_required: 'Subdomain is required', + /** UNTRANSLATED */ + domain_in_use: 'This subdomain name is already in use.', + /** UNTRANSLATED */ + invalid_domain_format: + "Invalid subdomain format: use only lowercase letters, hyphens '-', and underscores '_'.", + /** UNTRANSLATED */ + url_required: 'Origin URL is required.', + /** UNTRANSLATED */ + invalid_url: + "Invalid Origin URL format: Use http:// or https://. Note: '/routes' is not currently supported.", + }, + }, +}; + +export default Object.freeze(protected_app); diff --git a/packages/phrases/src/locales/zh-hk/translation/admin-console/applications.ts b/packages/phrases/src/locales/zh-hk/translation/admin-console/applications.ts index f1f05508c..6a3ef1018 100644 --- a/packages/phrases/src/locales/zh-hk/translation/admin-console/applications.ts +++ b/packages/phrases/src/locales/zh-hk/translation/admin-console/applications.ts @@ -39,6 +39,14 @@ const applications = { subtitle: '直接與資源對話的應用程序(通常是服務)', description: '例如,後端服務', }, + protected: { + /** UNTRANSLATED */ + title: 'Protected App', + /** UNTRANSLATED */ + subtitle: 'An app that is protected by Logto', + /** UNTRANSLATED */ + description: 'N/A', + }, third_party: { /** UNTRANSLATED */ title: 'Third-party app', diff --git a/packages/phrases/src/locales/zh-hk/translation/admin-console/index.ts b/packages/phrases/src/locales/zh-hk/translation/admin-console/index.ts index c368b3dc8..b742a19f9 100644 --- a/packages/phrases/src/locales/zh-hk/translation/admin-console/index.ts +++ b/packages/phrases/src/locales/zh-hk/translation/admin-console/index.ts @@ -23,6 +23,7 @@ import organization_details from './organization-details.js'; import organizations from './organizations.js'; import permissions from './permissions.js'; import profile from './profile.js'; +import protected_app from './protected-app.js'; import role_details from './role-details.js'; import roles from './roles.js'; import session_expired from './session-expired.js'; @@ -83,6 +84,7 @@ const admin_console = { mfa, organizations, organization_details, + protected_app, }; export default Object.freeze(admin_console); diff --git a/packages/phrases/src/locales/zh-hk/translation/admin-console/protected-app.ts b/packages/phrases/src/locales/zh-hk/translation/admin-console/protected-app.ts new file mode 100644 index 000000000..2062dc6dc --- /dev/null +++ b/packages/phrases/src/locales/zh-hk/translation/admin-console/protected-app.ts @@ -0,0 +1,52 @@ +const protected_app = { + /** UNTRANSLATED */ + name: 'Protected App', + /** UNTRANSLATED */ + title: 'Create a Protected App with epic speed and simplicity', + /** UNTRANSLATED */ + description: + "Deploy with Logto secure workers, powered by Cloudflare's edge network for top-tier performance and 0ms cold starts worldwide. Learn more", + /** UNTRANSLATED */ + fast_create: 'Fast create', + /** UNTRANSLATED */ + modal_title: 'Create protected app', + /** UNTRANSLATED */ + modal_subtitle: 'No more integrating Logto SDK. Create you web app easily.', + form: { + /** UNTRANSLATED */ + domain_field_label: 'App domain protected', + /** UNTRANSLATED */ + domain_field_placeholder: 'Custom subdomain', + /** UNTRANSLATED */ + domain_field_description: + 'Specify the app domain that will be protected by authentication and redirected to the Origin URL.', + /** UNTRANSLATED */ + domain_field_tooltip: + "You can use a 'protected.app' subdomain powered by Logto for quick testing or online access, which remains consistently valid. After creation, your custom domain name can be added.", + /** UNTRANSLATED */ + url_field_label: 'Origin URL', + /** UNTRANSLATED */ + url_field_placeholder: 'https://', + /** UNTRANSLATED */ + url_field_tooltip: + "Enter primary website address of your application, excluding any '/routes'. After creation, you can customize route authentication rules.\n\nNote: The Origin URL itself won't require authentication; only accesses via the added app domain will be protected.", + /** UNTRANSLATED */ + create_application: 'Create application', + errors: { + /** UNTRANSLATED */ + domain_required: 'Subdomain is required', + /** UNTRANSLATED */ + domain_in_use: 'This subdomain name is already in use.', + /** UNTRANSLATED */ + invalid_domain_format: + "Invalid subdomain format: use only lowercase letters, hyphens '-', and underscores '_'.", + /** UNTRANSLATED */ + url_required: 'Origin URL is required.', + /** UNTRANSLATED */ + invalid_url: + "Invalid Origin URL format: Use http:// or https://. Note: '/routes' is not currently supported.", + }, + }, +}; + +export default Object.freeze(protected_app); diff --git a/packages/phrases/src/locales/zh-tw/translation/admin-console/applications.ts b/packages/phrases/src/locales/zh-tw/translation/admin-console/applications.ts index 82bfe46ec..61660e146 100644 --- a/packages/phrases/src/locales/zh-tw/translation/admin-console/applications.ts +++ b/packages/phrases/src/locales/zh-tw/translation/admin-console/applications.ts @@ -39,6 +39,14 @@ const applications = { subtitle: '直接與資源對話的應用程序(通常是服務)', description: '例如,後端服務', }, + protected: { + /** UNTRANSLATED */ + title: 'Protected App', + /** UNTRANSLATED */ + subtitle: 'An app that is protected by Logto', + /** UNTRANSLATED */ + description: 'N/A', + }, third_party: { /** UNTRANSLATED */ title: 'Third-party app', diff --git a/packages/phrases/src/locales/zh-tw/translation/admin-console/index.ts b/packages/phrases/src/locales/zh-tw/translation/admin-console/index.ts index c368b3dc8..b742a19f9 100644 --- a/packages/phrases/src/locales/zh-tw/translation/admin-console/index.ts +++ b/packages/phrases/src/locales/zh-tw/translation/admin-console/index.ts @@ -23,6 +23,7 @@ import organization_details from './organization-details.js'; import organizations from './organizations.js'; import permissions from './permissions.js'; import profile from './profile.js'; +import protected_app from './protected-app.js'; import role_details from './role-details.js'; import roles from './roles.js'; import session_expired from './session-expired.js'; @@ -83,6 +84,7 @@ const admin_console = { mfa, organizations, organization_details, + protected_app, }; export default Object.freeze(admin_console); diff --git a/packages/phrases/src/locales/zh-tw/translation/admin-console/protected-app.ts b/packages/phrases/src/locales/zh-tw/translation/admin-console/protected-app.ts new file mode 100644 index 000000000..2062dc6dc --- /dev/null +++ b/packages/phrases/src/locales/zh-tw/translation/admin-console/protected-app.ts @@ -0,0 +1,52 @@ +const protected_app = { + /** UNTRANSLATED */ + name: 'Protected App', + /** UNTRANSLATED */ + title: 'Create a Protected App with epic speed and simplicity', + /** UNTRANSLATED */ + description: + "Deploy with Logto secure workers, powered by Cloudflare's edge network for top-tier performance and 0ms cold starts worldwide. Learn more", + /** UNTRANSLATED */ + fast_create: 'Fast create', + /** UNTRANSLATED */ + modal_title: 'Create protected app', + /** UNTRANSLATED */ + modal_subtitle: 'No more integrating Logto SDK. Create you web app easily.', + form: { + /** UNTRANSLATED */ + domain_field_label: 'App domain protected', + /** UNTRANSLATED */ + domain_field_placeholder: 'Custom subdomain', + /** UNTRANSLATED */ + domain_field_description: + 'Specify the app domain that will be protected by authentication and redirected to the Origin URL.', + /** UNTRANSLATED */ + domain_field_tooltip: + "You can use a 'protected.app' subdomain powered by Logto for quick testing or online access, which remains consistently valid. After creation, your custom domain name can be added.", + /** UNTRANSLATED */ + url_field_label: 'Origin URL', + /** UNTRANSLATED */ + url_field_placeholder: 'https://', + /** UNTRANSLATED */ + url_field_tooltip: + "Enter primary website address of your application, excluding any '/routes'. After creation, you can customize route authentication rules.\n\nNote: The Origin URL itself won't require authentication; only accesses via the added app domain will be protected.", + /** UNTRANSLATED */ + create_application: 'Create application', + errors: { + /** UNTRANSLATED */ + domain_required: 'Subdomain is required', + /** UNTRANSLATED */ + domain_in_use: 'This subdomain name is already in use.', + /** UNTRANSLATED */ + invalid_domain_format: + "Invalid subdomain format: use only lowercase letters, hyphens '-', and underscores '_'.", + /** UNTRANSLATED */ + url_required: 'Origin URL is required.', + /** UNTRANSLATED */ + invalid_url: + "Invalid Origin URL format: Use http:// or https://. Note: '/routes' is not currently supported.", + }, + }, +}; + +export default Object.freeze(protected_app); diff --git a/packages/toolkit/core-kit/scss/_console-themes.scss b/packages/toolkit/core-kit/scss/_console-themes.scss index 41b3148c3..7b6c62f39 100644 --- a/packages/toolkit/core-kit/scss/_console-themes.scss +++ b/packages/toolkit/core-kit/scss/_console-themes.scss @@ -160,6 +160,7 @@ --color-env-tag-production: rgba(131, 218, 133, 35%); --color-specific-icon-bg: #f3effa; --color-specific-toggle-off-enable: var(--color-neutral-90); + --color-specific-unselected-disabled: var(--color-hover); // 8% Neutral-10 // Shadows --shadow-1: 0 4px 8px rgba(0, 0, 0, 8%); @@ -362,6 +363,7 @@ --color-env-tag-production: rgba(104, 190, 108, 36%); --color-specific-icon-bg: rgba(247, 248, 248, 12%); --color-specific-toggle-off-enable: var(--color-neutral-90); + --color-specific-unselected-disabled: var(--color-hover); // 8% Neutral-10 // Shadows --shadow-1: 0 4px 8px rgba(0, 0, 0, 8%);