0
Fork 0
mirror of https://github.com/logto-io/logto.git synced 2025-03-31 22:51:25 -05:00

refactor(console): new get started page (#4398)

* refactor: get started

* refactor(console): support react router link in LinkButton component

* refactor(console): new get-started page

* chore(console): translate i18n phrases
This commit is contained in:
Charles Zhao 2023-08-30 10:51:54 +08:00 committed by GitHub
parent 9d865909d0
commit 8108a4831a
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
25 changed files with 713 additions and 797 deletions

View file

@ -12,6 +12,7 @@ import {
} from '@/consts';
import { isCloud } from '@/consts/env';
import OverlayScrollbar from '@/ds-components/OverlayScrollbar';
import useUserPreferences from '@/hooks/use-user-preferences';
import ApiResourceDetails from '@/pages/ApiResourceDetails';
import ApiResourcePermissions from '@/pages/ApiResourceDetails/ApiResourcePermissions';
import ApiResourceSettings from '@/pages/ApiResourceDetails/ApiResourceSettings';
@ -58,6 +59,9 @@ import * as styles from './index.module.scss';
function ConsoleContent() {
const { scrollableContent } = useOutletContext<AppContentOutletContext>();
const {
data: { getStartedHidden },
} = useUserPreferences();
return (
<div className={styles.content}>
@ -66,7 +70,7 @@ function ConsoleContent() {
<div ref={scrollableContent} className={styles.main}>
<Routes>
<Route path="*" element={<NotFound />} />
<Route path="get-started" element={<GetStarted />} />
{!getStartedHidden && <Route path="get-started" element={<GetStarted />} />}
<Route path="dashboard" element={<Dashboard />} />
<Route path="applications">
<Route index element={<Applications />} />

View file

@ -1,9 +1,12 @@
import type { AdminConsoleKey } from '@logto/phrases';
import classNames from 'classnames';
import type { HTMLProps, ReactElement, ReactNode } from 'react';
import { useEffect, useRef, useState } from 'react';
import { useEffect, useMemo, useRef, useState } from 'react';
import { Link } from 'react-router-dom';
import { Ring as Spinner } from '@/ds-components/Spinner';
import useTenantPathname from '@/hooks/use-tenant-pathname';
import { isAbsoluteUrl } from '@/utils/url';
import type DangerousRaw from '../DangerousRaw';
import DynamicT from '../DynamicT';
@ -103,7 +106,7 @@ function Button({
export default Button;
type LinkProps = Omit<HTMLProps<HTMLAnchorElement>, 'type' | 'size' | 'title'> & {
type LinkProps = Omit<HTMLProps<HTMLAnchorElement>, 'type' | 'size' | 'title' | 'ref'> & {
/**
* If the link will be opened in a new tab. This prop will override the `target`
* and `rel` attributes.
@ -122,25 +125,42 @@ export function LinkButton({
type = 'default',
size = 'medium',
className,
href,
targetBlank,
...rest
}: LinkProps) {
return (
<a
className={classNames(styles.button, styles[type], styles[size], className)}
{...rest}
{...(Boolean(targetBlank) && {
const { getTo } = useTenantPathname();
const props = useMemo(
() => ({
...rest,
className: classNames(styles.button, styles[type], styles[size], className),
...(Boolean(targetBlank) && {
rel: typeof targetBlank === 'string' ? targetBlank : 'noopener noreferrer',
target: '_blank',
})}
>
{typeof title === 'string' ? (
}),
}),
[className, rest, size, targetBlank, type]
);
const innerElement = useMemo(
() =>
typeof title === 'string' ? (
<span>
<DynamicT forKey={title} />
</span>
) : (
title
)}
),
[title]
);
return !href || isAbsoluteUrl(href) ? (
<a {...props} href={href}>
{innerElement}
</a>
) : (
<Link {...props} to={getTo(href)}>
{innerElement}
</Link>
);
}

View file

@ -53,6 +53,7 @@
.description {
font: var(--font-body-3);
color: var(--color-text-secondary);
@include _.multi-line-ellipsis(3);
}
}

View file

@ -72,7 +72,9 @@ function GuideCard({ data, onClick, hasBorder, isCompact }: Props) {
<div className={styles.name}>{name}</div>
{isSubscriptionRequired && <ProTag />}
</div>
<div className={styles.description}>{description}</div>
<div className={styles.description} title={description}>
{description}
</div>
</div>
</div>
{!isCompact && (

View file

@ -1,44 +0,0 @@
@use '@/scss/underscore' as _;
.card {
display: flex;
padding: _.unit(6) _.unit(8);
background-color: var(--color-layer-1);
border-radius: 16px;
.icon {
@include _.shimmering-animation;
width: 48px;
height: 48px;
margin-right: _.unit(6);
}
.wrapper {
flex: 1;
display: flex;
flex-direction: column;
.title {
@include _.shimmering-animation;
width: 113px;
height: 20px;
}
.subtitle {
@include _.shimmering-animation;
width: 453px;
height: 20px;
margin-top: _.unit(1);
}
}
.button {
@include _.shimmering-animation;
width: 129px;
height: 44px;
}
}
.card + .card {
margin-top: _.unit(4);
}

View file

@ -1,19 +0,0 @@
import * as styles from './index.module.scss';
function Skeleton() {
return (
<>
{[...Array.from({ length: 5 }).keys()].map((key) => (
<div key={key} className={styles.card}>
<div className={styles.icon} />
<div className={styles.wrapper}>
<div className={styles.title} />
<div className={styles.subtitle} />
</div>
</div>
))}
</>
);
}
export default Skeleton;

View file

@ -1,194 +0,0 @@
import type { AdminConsoleKey } from '@logto/phrases';
import { Theme } from '@logto/schemas';
import { useContext, useMemo } from 'react';
import CheckPreviewDark from '@/assets/icons/check-demo-dark.svg';
import CheckPreview from '@/assets/icons/check-demo.svg';
import CreateAppDark from '@/assets/icons/create-app-dark.svg';
import CreateApp from '@/assets/icons/create-app.svg';
import CreateRoleDark from '@/assets/icons/create-role-dark.svg';
import CreateRole from '@/assets/icons/create-role.svg';
import CustomizeDark from '@/assets/icons/customize-dark.svg';
import Customize from '@/assets/icons/customize.svg';
import DiscordDark from '@/assets/icons/discord-dark.svg';
import Discord from '@/assets/icons/discord.svg';
import FurtherReadingsDark from '@/assets/icons/further-readings-dark.svg';
import FurtherReadings from '@/assets/icons/further-readings.svg';
import MachineToMachineDark from '@/assets/icons/machine-to-machine-dark.svg';
import MachineToMachine from '@/assets/icons/machine-to-machine.svg';
import PasswordlessDark from '@/assets/icons/passwordless-dark.svg';
import Passwordless from '@/assets/icons/passwordless.svg';
import { discordLink } from '@/consts';
import { ConnectorsTabs } from '@/consts/page-tabs';
import { AppDataContext } from '@/contexts/AppDataProvider';
import useConfigs from '@/hooks/use-configs';
import useDocumentationUrl from '@/hooks/use-documentation-url';
import useTenantPathname from '@/hooks/use-tenant-pathname';
import useTheme from '@/hooks/use-theme';
import useUserOnboardingData from '@/onboarding/hooks/use-user-onboarding-data';
type GetStartedMetadata = {
id: string;
title: AdminConsoleKey;
subtitle: AdminConsoleKey;
icon: SvgComponent;
buttonText: AdminConsoleKey;
isComplete?: boolean;
isHidden?: boolean;
onClick: () => void;
};
const useGetStartedMetadata = () => {
const { configs, updateConfigs } = useConfigs();
const { tenantEndpoint } = useContext(AppDataContext);
const theme = useTheme();
const isLightMode = theme === Theme.Light;
const { navigate } = useTenantPathname();
const { isBusinessPlan } = useUserOnboardingData();
const { getDocumentationUrl } = useDocumentationUrl();
const basicMetadata: GetStartedMetadata[] = useMemo(
() => [
{
id: 'checkLivePreview',
title: 'get_started.check_preview_title',
subtitle: 'get_started.check_preview_subtitle',
icon: isLightMode ? CheckPreview : CheckPreviewDark,
buttonText: 'general.try_now',
isComplete: configs?.livePreviewChecked,
onClick: async () => {
void updateConfigs({ livePreviewChecked: true });
window.open(new URL('/demo-app', tenantEndpoint), '_blank');
},
},
{
id: 'createApplication',
title: 'get_started.integration_title',
subtitle: 'get_started.integration_subtitle',
icon: isLightMode ? CreateApp : CreateAppDark,
buttonText: 'general.create',
isComplete: configs?.applicationCreated,
onClick: () => {
navigate('/applications/create');
},
},
{
id: 'customizeSignInExperience',
title: 'get_started.custom_sie_title',
subtitle: 'get_started.custom_sie_subtitle',
icon: isLightMode ? Customize : CustomizeDark,
buttonText: 'general.customize',
isComplete: configs?.signInExperienceCustomized,
onClick: () => {
navigate('/sign-in-experience');
},
},
{
id: 'configurePasswordless',
title: 'get_started.passwordless_title',
subtitle: 'get_started.passwordless_subtitle',
icon: isLightMode ? Passwordless : PasswordlessDark,
buttonText: 'general.enable',
isComplete: configs?.passwordlessConfigured,
onClick: () => {
navigate(`/connectors/${ConnectorsTabs.Passwordless}`);
},
},
],
[
configs?.applicationCreated,
configs?.livePreviewChecked,
configs?.passwordlessConfigured,
configs?.signInExperienceCustomized,
isLightMode,
navigate,
updateConfigs,
tenantEndpoint,
]
);
const personalPlanMetadata: GetStartedMetadata[] = useMemo(
() => [
{
id: 'joinCommunity',
title: 'get_started.community_title',
subtitle: 'get_started.community_subtitle',
icon: isLightMode ? Discord : DiscordDark,
buttonText: 'general.join',
isComplete: configs?.communityChecked,
onClick: () => {
void updateConfigs({ communityChecked: true });
window.open(discordLink, '_blank');
},
},
{
id: 'checkOutFurtherReadings',
title: 'get_started.further_readings_title',
subtitle: 'get_started.further_readings_subtitle',
icon: isLightMode ? FurtherReadings : FurtherReadingsDark,
buttonText: 'general.check_out',
isComplete: configs?.furtherReadingsChecked,
onClick: () => {
void updateConfigs({ furtherReadingsChecked: true });
window.open(
getDocumentationUrl('/docs/tutorials/get-started/further-readings'),
'_blank'
);
},
},
],
[
configs?.communityChecked,
configs?.furtherReadingsChecked,
getDocumentationUrl,
isLightMode,
updateConfigs,
]
);
const businessPlanMetadata: GetStartedMetadata[] = useMemo(
() => [
{
id: 'interactWithManagementAPI',
title: 'get_started.management_api_title',
subtitle: 'get_started.management_api_subtitle',
icon: isLightMode ? MachineToMachine : MachineToMachineDark,
buttonText: 'general.check_out',
isComplete: configs?.m2mApplicationCreated,
onClick: () => {
navigate('/api-resources');
},
},
{
id: 'addRbac',
title: 'get_started.add_rbac_title',
subtitle: 'get_started.add_rbac_subtitle',
icon: isLightMode ? CreateRole : CreateRoleDark,
buttonText: 'general.check_out',
isComplete: configs?.roleCreated,
onClick: () => {
navigate('/roles');
},
},
],
[configs?.m2mApplicationCreated, configs?.roleCreated, isLightMode, navigate]
);
const data = useMemo(() => {
const metadataItems: GetStartedMetadata[] = [
...basicMetadata,
...(isBusinessPlan ? businessPlanMetadata : personalPlanMetadata),
];
return metadataItems.filter(({ isHidden }) => !isHidden);
}, [basicMetadata, isBusinessPlan, businessPlanMetadata, personalPlanMetadata]);
return {
data,
completedCount: data.filter(({ isComplete }) => isComplete).length,
totalCount: data.length,
isLoading: false,
};
};
export default useGetStartedMetadata;

View file

@ -4,63 +4,85 @@
display: flex;
flex-direction: column;
overflow-y: auto;
gap: _.unit(6);
padding-bottom: _.unit(6);
}
.title {
font: var(--font-title-1);
color: var(--color-text);
}
.subtitle {
font: var(--font-body-2);
color: var(--color-text-secondary);
}
.header {
margin-bottom: _.unit(6);
.title {
font: var(--font-title-1);
color: var(--color-text);
}
.subtitle {
display: flex;
align-items: center;
margin-top: _.unit(1);
padding-right: _.unit(6);
font: var(--font-body-2);
color: var(--color-text-secondary);
.hideButton {
display: inline-block;
}
}
display: flex;
flex-direction: column;
gap: _.unit(1);
}
.card {
display: flex;
padding: _.unit(6) _.unit(8);
position: relative;
flex-direction: column;
padding: _.unit(6);
gap: _.unit(6);
container-type: inline-size;
.icon {
width: 48px;
height: 48px;
margin-right: _.unit(6);
}
.wrapper {
flex: 1;
.borderBox {
display: flex;
flex-direction: column;
align-items: center;
padding: _.unit(6) _.unit(8);
border: 1px solid var(--color-divider);
border-radius: 16px;
gap: _.unit(6);
.icon {
width: 48px;
height: 48px;
}
.title {
font: var(--font-title-2);
color: var(--color-text);
}
.subtitle {
font: var(--font-body-2);
color: var(--color-text-secondary);
}
}
.button {
min-width: 120px;
.rowWrapper {
display: flex;
align-items: center;
gap: _.unit(6);
}
.columnWrapper {
display: flex;
flex-direction: column;
}
.grid {
width: 100%;
display: grid;
gap: _.unit(4) _.unit(3);
}
@container (max-width: 960px) {
.grid {
grid-template-columns: repeat(2, 1fr);
}
}
@container (min-width: 961px) {
.grid {
grid-template-columns: repeat(4, 1fr);
}
}
@container (max-width: 720px) {
.buttons {
flex-direction: column;
align-items: flex-end;
gap: _.unit(4);
}
}
}
.card + .card {
margin-top: _.unit(4);
}

View file

@ -1,110 +1,153 @@
import { withAppInsights } from '@logto/app-insights/react';
import { useState } from 'react';
import { Theme, type Application } from '@logto/schemas';
import classNames from 'classnames';
import { useCallback, useContext, useMemo, useState } from 'react';
import { useTranslation } from 'react-i18next';
import CompleteIndicator from '@/assets/icons/task-complete.svg';
import CheckPreviewDark from '@/assets/icons/check-demo-dark.svg';
import CheckPreview from '@/assets/icons/check-demo.svg';
import CreateRoleDark from '@/assets/icons/create-role-dark.svg';
import CreateRole from '@/assets/icons/create-role.svg';
import SocialDark from '@/assets/icons/social-dark.svg';
import Social from '@/assets/icons/social.svg';
import PageMeta from '@/components/PageMeta';
import Button from '@/ds-components/Button';
import { ConnectorsTabs } from '@/consts';
import { AppDataContext } from '@/contexts/AppDataProvider';
import { LinkButton } from '@/ds-components/Button';
import Card from '@/ds-components/Card';
import ConfirmModal from '@/ds-components/ConfirmModal';
import DynamicT from '@/ds-components/DynamicT';
import Spacer from '@/ds-components/Spacer';
import TextLink from '@/ds-components/TextLink';
import useTenantPathname from '@/hooks/use-tenant-pathname';
import useUserPreferences from '@/hooks/use-user-preferences';
import useTheme from '@/hooks/use-theme';
import CreateForm from '../Applications/components/CreateForm';
import GuideCard, { type SelectedGuide } from '../Applications/components/GuideCard';
import useAppGuideMetadata from '../Applications/components/GuideLibrary/hook';
import FreePlanNotification from './FreePlanNotification';
import Skeleton from './components/Skeleton';
import useGetStartedMetadata from './hook';
import * as styles from './index.module.scss';
const icons = {
[Theme.Light]: { PreviewIcon: CheckPreview, SocialIcon: Social, RbacIcon: CreateRole },
[Theme.Dark]: { PreviewIcon: CheckPreviewDark, SocialIcon: SocialDark, RbacIcon: CreateRoleDark },
};
function GetStarted() {
const { t } = useTranslation(undefined, { keyPrefix: 'admin_console' });
const { navigate } = useTenantPathname();
const { data, isLoading } = useGetStartedMetadata();
const { update } = useUserPreferences();
const [showConfirmModal, setShowConfirmModal] = useState(false);
const [isUpdating, setIsUpdating] = useState(false);
const { tenantEndpoint } = useContext(AppDataContext);
const [selectedGuide, setSelectedGuide] = useState<SelectedGuide>();
const [_, getStructuredMetadata] = useAppGuideMetadata();
const [showCreateForm, setShowCreateForm] = useState<boolean>(false);
const theme = useTheme();
const { PreviewIcon, SocialIcon, RbacIcon } = icons[theme];
const hideGetStarted = async () => {
if (isUpdating) {
return;
}
setIsUpdating(true);
/**
* Only need 4 featured guides at most, since by design in get-started page we need to show
* a few most popular SDK guides, and 4 makes it easy to have a 4 x 1 or 2 x 2 card layout.
*/
const featuredAppGuides = useMemo(
() => getStructuredMetadata().featured.slice(0, 4),
[getStructuredMetadata]
);
try {
await update({ getStartedHidden: true });
// Navigate to next menu item
navigate('/dashboard');
} finally {
setIsUpdating(false);
}
};
const onClickGuide = useCallback((data: SelectedGuide) => {
setShowCreateForm(true);
setSelectedGuide(data);
}, []);
const showConfirmModalHandler = () => {
setShowConfirmModal(true);
};
const hideConfirmModalHandler = () => {
setShowConfirmModal(false);
};
const onCloseCreateForm = useCallback(
(newApp?: Application) => {
if (newApp && selectedGuide) {
navigate(`/applications/${newApp.id}/guide/${selectedGuide.id}`, { replace: true });
return;
}
setShowCreateForm(false);
setSelectedGuide(undefined);
},
[navigate, selectedGuide]
);
return (
<div className={styles.container}>
<PageMeta titleKey="get_started.page_title" />
<div className={styles.header}>
<div className={styles.title}>{t('get_started.title')}</div>
<div className={styles.subtitle}>
<span>{t('get_started.subtitle_part1')}</span>
<Spacer />
<span>
{t('get_started.subtitle_part2')}
<Button
title="get_started.hide_this"
type="text"
size="small"
className={styles.hideButton}
onClick={showConfirmModalHandler}
/>
</span>
</div>
<div className={styles.subtitle}>{t('get_started.subtitle')}</div>
</div>
{isLoading && <Skeleton />}
{!isLoading && (
<>
<FreePlanNotification />
{data.map(({ id, title, subtitle, icon: CardIcon, isComplete, buttonText, onClick }) => (
<Card key={id} className={styles.card}>
{!isComplete && <CardIcon className={styles.icon} />}
{isComplete && <CompleteIndicator className={styles.icon} />}
<div className={styles.wrapper}>
<div className={styles.title}>
<DynamicT forKey={title} />
</div>
<div className={styles.subtitle}>
<DynamicT forKey={subtitle} />
</div>
</div>
<Button
className={styles.button}
type="outline"
size="large"
title={buttonText}
onClick={onClick}
/>
</Card>
<FreePlanNotification />
<Card className={styles.card}>
<div className={styles.title}>{t('get_started.develop.title')}</div>
<div className={styles.grid}>
{featuredAppGuides.map((guide) => (
<GuideCard key={guide.id} hasBorder data={guide} onClick={onClickGuide} />
))}
</>
)}
<ConfirmModal
isOpen={showConfirmModal}
confirmButtonType="primary"
confirmButtonText="get_started.hide_this"
isLoading={isUpdating}
onConfirm={hideGetStarted}
onCancel={hideConfirmModalHandler}
>
{t('get_started.confirm_message')}
</ConfirmModal>
{selectedGuide?.target !== 'API' && showCreateForm && (
<CreateForm
defaultCreateType={selectedGuide?.target}
defaultCreateFrameworkName={selectedGuide?.name}
onClose={onCloseCreateForm}
/>
)}
</div>
<TextLink to="/applications/create">{t('get_started.view_all')}</TextLink>
</Card>
<Card className={styles.card}>
<div className={styles.borderBox}>
<div className={styles.rowWrapper}>
<div className={styles.icon}>
<PreviewIcon />
</div>
<div className={styles.columnWrapper}>
<div className={styles.title}>{t('get_started.customize.preview.title')}</div>
<div className={styles.subtitle}>{t('get_started.customize.preview.subtitle')}</div>
</div>
</div>
<Spacer />
<div className={classNames(styles.rowWrapper, styles.buttons)}>
<LinkButton
title="get_started.customize.continue_customizing"
href="/sign-in-experience"
/>
<LinkButton
title="get_started.customize.try_now"
href={new URL('/demo-app', tenantEndpoint).href}
target="_blank"
/>
</div>
</div>
<div className={styles.borderBox}>
<div className={styles.rowWrapper}>
<div className={styles.icon}>
<SocialIcon />
</div>
<div className={styles.columnWrapper}>
<div className={styles.title}>{t('get_started.customize.connector.title')}</div>
<div className={styles.subtitle}>{t('get_started.customize.connector.subtitle')}</div>
</div>
</div>
<Spacer />
<LinkButton
title="get_started.customize.add_more"
href={`/connectors/${ConnectorsTabs.Social}`}
/>
</div>
</Card>
<Card className={styles.card}>
<div className={styles.borderBox}>
<div className={styles.rowWrapper}>
<div className={styles.icon}>
<RbacIcon />
</div>
<div className={styles.columnWrapper}>
<div className={styles.title}>{t('get_started.manage.rbac.title')}</div>
<div className={styles.subtitle}>{t('get_started.manage.rbac.subtitle')}</div>
</div>
</div>
<Spacer />
<LinkButton title="get_started.manage.create_roles" href="/roles" />
</div>
</Card>
</div>
);
}

View file

@ -1,3 +1,5 @@
import { trySafe } from '@silverhand/essentials';
export const buildUrl = (path: string, searchParameters: Record<string, string>) =>
`${path}?${new URLSearchParams(searchParameters).toString()}`;
@ -6,3 +8,5 @@ export const formatSearchKeyword = (keyword: string) => `%${keyword}%`;
/** If the current pathname is `/callback` or ends with `-callback`, we consider it as a callback page. */
export const isInCallback = () =>
['/callback', '-callback'].some((path) => window.location.pathname.endsWith(path));
export const isAbsoluteUrl = (url?: string) => Boolean(trySafe(() => url && new URL(url)));

View file

@ -1,36 +1,39 @@
const get_started = {
page_title: 'Loslegen',
progress: 'Erste Schritte: {{completed}}/{{total}}',
progress_dropdown_title: 'Was du machen kannst...',
title: 'Etwas zum Erkunden, um dir zu helfen, erfolgreich zu sein',
subtitle_part1: 'Ein paar Dinge, die du tun kannst, um schnell von Logto zu profitieren',
subtitle_part2: 'Ich bin fertig mit der Einrichtung.',
hide_this: 'Ausblenden',
confirm_message:
'Bist du sicher, dass du diese Seite ausblenden willst? Diese Aktion kann nicht rückgängig gemacht werden.',
check_preview_title: 'Live-Vorschau prüfen',
check_preview_subtitle:
'Probiere die Logto-Anmeldung jetzt aus, um zu sehen, wie sie funktioniert',
integration_title: 'Erstelle und integriere deine Anwendung',
integration_subtitle:
'Richte die Logto-Authentifizierung für deine native, Single-Page-, Maschine-zu-Maschine- oder traditionelle Anwendung ein',
custom_sie_title: 'Anmeldeerfahrung anpassen',
custom_sie_subtitle:
'Schalte mit erweiterten Einstellungen ein breites Spektrum von Szenarios frei',
passwordless_title: 'Skaliere die passwortlose Anmeldung, indem du eigene Connectoren hinzufügst',
passwordless_subtitle:
'Probiere die passwortlose Anmeldung aus und ermögliche eine sichere und reibungslose Erfahrung für deine Kunden',
community_title: 'Tritt unserer Discord-Community bei',
community_subtitle: 'Trete unserem öffentlichen Kanal bei, um mit anderen Entwicklern zu chatten',
management_api_title: 'Interagiere mit der Management-API',
management_api_subtitle:
'Verbinde dein Authentifizierungssystem direkt mit unserer Management-API',
further_readings_title: 'Weitere Lektüre',
further_readings_subtitle:
'Schau dir unsere schrittweisen, szenariobasierten Dokumente ohne langweilige Konzepte an',
add_rbac_title: 'Füge rollenbasierte Zugriffssteuerung hinzu, um deine Ressourcen zu schützen',
add_rbac_subtitle:
'Steuere deine Ressourcen durch skalierbare Rollenberechtigung für verschiedene Anwendungsfälle.',
subtitle: 'Einige Dinge, die Sie tun können, um schnell den Wert von Logto zu erhalten',
develop: {
title: 'Entwicklung: Nehmen Sie sich 5 Minuten Zeit, um Ihre App zu integrieren',
},
customize: {
title: 'Anpassen: Liefern Sie ein großartiges Anmeldeerlebnis',
preview: {
title: 'Überprüfen Sie die Live-Vorschau des gerade angepassten Anmeldeerlebnisses',
subtitle: 'Testen Sie jetzt das Logto-Anmeldeerlebnis, um zu sehen, wie es funktioniert',
},
connector: {
title:
'Fügen Sie weitere Connectors hinzu, um weitere soziale Anmeldeverfahren zu unterstützen',
subtitle:
'Probieren Sie die passwortlose Anmeldung aus und ermöglichen Sie Ihren Kunden ein sicheres und reibungsloses Erlebnis',
},
continue_customizing: 'Mit der Anpassung fortfahren',
try_now: 'Jetzt ausprobieren',
add_more: 'Mehr hinzufügen',
},
secure: {
title: 'Sichern: Schützen Sie Ihre Ressourcen',
},
manage: {
title: 'Verwalten: Definieren Sie Zugriffssteuerung für Ihr Produkt und Ihre Benutzer',
rbac: {
title: 'Fügen Sie rollenbasierte Zugriffssteuerung hinzu, um Ihre Ressourcen zu schützen',
subtitle:
'Steuern Sie Ihre Ressource durch skalierbare Rollenautorisierung für verschiedene Anwendungsfälle.',
},
create_roles: 'Rollen erstellen',
},
view_all: 'Alle anzeigen →',
};
export default Object.freeze(get_started);

View file

@ -1,32 +1,37 @@
const get_started = {
page_title: 'Get Started',
progress: 'Get started guide: {{completed}}/{{total}}',
progress_dropdown_title: 'A few things you can do...',
title: 'Something to explore to help you succeed',
subtitle_part1: 'A few things you can do to quickly get value of Logto',
subtitle_part2: 'Im a pro and have completed all steps. ',
hide_this: 'Hide this',
confirm_message: 'Are you sure you want to hide this page? This action cannot be undone.',
check_preview_title: 'Check the live preview',
check_preview_subtitle: 'Try Logto sign-in experience now to see how it works',
integration_title: 'Create and integrate your application',
integration_subtitle:
'Set up Logto authentication for your native, single page, machine to machine, or traditional application',
custom_sie_title: 'Customize sign-in experience',
custom_sie_subtitle: 'Unlock a vast range of scenarios with advanced settings',
passwordless_title: 'Scale passwordless sign in by adding your own connectors',
passwordless_subtitle:
'Try passwordless sign in and enable a secure and frictionless experience for your customer',
community_title: 'Join our discord community',
community_subtitle: 'Join our public channel to chat with other developers',
management_api_title: 'Interact with Management API',
management_api_subtitle: 'Directly connect your authentication system to our management API',
further_readings_title: 'Further readings',
further_readings_subtitle:
'Check out our step-by-step, scenario-based docs without tedious concepts',
add_rbac_title: 'Add role-based access control to protect your resources',
add_rbac_subtitle:
'Control your resource through scalable role authorization for diverse use cases.',
title: 'Something to help you succeed',
subtitle: 'A few things you can do to quickly get value of Logto',
develop: {
title: 'Develop: Take 5 minutes to integrate your app',
},
customize: {
title: 'Customize: Deliver a great sign-in experience',
preview: {
title: 'Check the live preview of the sign-in experience you just customized',
subtitle: 'Try Logto sign-in experience now to see how it works',
},
connector: {
title: 'Add more connectors to support more social sign-in methods',
subtitle:
'Try passwordless sign in and enable a secure and frictionless experience for your customers',
},
continue_customizing: 'Continue customizing',
try_now: 'Try now',
add_more: 'Add more',
},
secure: {
title: 'Secure: Protect your resources',
},
manage: {
title: 'Manage: Define access control for your product and users',
rbac: {
title: 'Add role-based access control to protect your resources',
subtitle: 'Control your resource through scalable role authorization for diverse use cases.',
},
create_roles: 'Create roles',
},
view_all: 'View all →',
};
export default Object.freeze(get_started);

View file

@ -1,36 +1,39 @@
const get_started = {
page_title: 'Comenzar',
progress: 'Guía de inicio: {{completado}}/{{total}}',
progress_dropdown_title: 'Algunas cosas que puedes hacer...',
title: 'Algo para explorar que te ayudará a tener éxito',
subtitle_part1: 'Algunas cosas que puedes hacer para obtener rápidamente el valor de Logto',
subtitle_part2: 'Soy un profesional y he completado todos los pasos.',
hide_this: 'Ocultar esto',
confirm_message:
'¿Estás seguro de que quieres ocultar esta página? Esta acción no se puede deshacer.',
check_preview_title: 'Comprueba la vista previa en vivo',
check_preview_subtitle:
'Prueba la experiencia de inicio de sesión de Logto ahora para ver cómo funciona',
integration_title: 'Crea e integra tu aplicación',
integration_subtitle:
'Configura la autenticación de Logto para tu aplicación nativa, de una sola página, de máquina a máquina o tradicional',
custom_sie_title: 'Personaliza la experiencia de inicio de sesión',
custom_sie_subtitle: 'Desbloquea una amplia gama de escenarios con opciones avanzadas',
passwordless_title:
'Escalabilidad del inicio de sesión sin contraseña agregando tus propios conectores',
passwordless_subtitle:
'Prueba el inicio de sesión sin contraseña y habilita una experiencia segura y sin fricciones para tus clientes',
community_title: 'Únete a nuestra comunidad de Discordia',
community_subtitle: 'Únete a nuestro canal público para chatear con otros desarrolladores',
management_api_title: 'Interactúa con la API de administración',
management_api_subtitle:
'Conecta directamente tu sistema de autenticación a nuestra API de administración',
further_readings_title: 'Lecturas adicionales',
further_readings_subtitle:
'Consulta nuestra documentación paso a paso y basada en escenarios sin conceptos tediosos',
add_rbac_title: 'Agrega control de acceso basado en roles para proteger tus recursos',
add_rbac_subtitle:
'Controla tus recursos a través de una autorización basada en roles escalable para diversos casos de uso.',
subtitle: 'Algunas cosas que puedes hacer para obtener rápidamente el valor de Logto',
develop: {
title: 'Develop: Dedica 5 minutos para integrar tu aplicación',
},
customize: {
title: 'Customize: Ofrece una excelente experiencia de inicio de sesión',
preview: {
title:
'Ver la vista previa en directo de la experiencia de inicio de sesión que acabas de personalizar',
subtitle: 'Prueba la experiencia de inicio de sesión de Logto ahora y ve cómo funciona',
},
connector: {
title: 'Agregar más conectores para admitir más métodos de inicio de sesión sociales',
subtitle:
'Prueba el inicio de sesión sin contraseña y habilita una experiencia segura y sin fricciones para tus clientes',
},
continue_customizing: 'Continúa personalizando',
try_now: 'Pruébalo ahora',
add_more: 'Agregar más',
},
secure: {
title: 'Secure: Protege tus recursos',
},
manage: {
title: 'Manage: Define control de acceso para tu producto y usuarios',
rbac: {
title: 'Agregar control de acceso basado en roles para proteger tus recursos',
subtitle:
'Controla tus recursos mediante una autorización de roles escalable para diversos casos de uso',
},
create_roles: 'Crear roles',
},
view_all: 'Ver todo →',
};
export default Object.freeze(get_started);

View file

@ -1,37 +1,41 @@
const get_started = {
page_title: 'Commencer',
progress: 'Guide de démarrage : {{completed}}/{{total}}',
progress_dropdown_title: 'Il y a quelques choses que vous pouvez faire...',
title: 'Quelque chose à explorer pour vous aider à réussir',
subtitle_part1:
'Voici quelques mesures que vous pouvez prendre pour tirer rapidement profit de Logto',
subtitle_part2: "J'en ai fini avec cette installation. ",
hide_this: 'Cacher cela',
confirm_message:
'Êtes-vous sûr de vouloir masquer cette page ? Cette action ne peut être annulée.',
check_preview_title: "Vérifiez l'aperçu en direct",
check_preview_subtitle:
"Essayez maintenant l'expérience de connexion Logto pour voir comment elle fonctionne.",
integration_title: 'Créez et intégrez votre application',
integration_subtitle:
"Configurez l'authentification Logto pour votre application native, à page unique, machine à machine ou traditionnelle",
custom_sie_title: "Personnalisez l'expérience de connexion",
custom_sie_subtitle: 'Déverrouillez une grande variété de scénarios avec des paramètres avancés',
passwordless_title:
'Évolutivité de la connexion sans mot de passe en ajoutant vos propres connecteurs',
passwordless_subtitle:
'Essayez la connexion sans mot de passe et offrez à vos clients une expérience sécurisée et sans friction',
community_title: 'Rejoignez notre communauté discord',
community_subtitle: "Rejoignez notre chaîne publique pour discuter avec d'autres développeurs",
management_api_title: 'Interagissez avec Management API',
management_api_subtitle:
"Connectez directement votre système d'authentification à notre Management API",
further_readings_title: 'Lectures complémentaires',
further_readings_subtitle:
'Consultez nos documents étape par étape et basés sur des scénarios, sans concepts fastidieux',
add_rbac_title: "Ajoutez un contrôle d'accès basé sur les rôles pour protéger vos ressources",
add_rbac_subtitle:
"Contrôlez vos ressources par l autorisation de rôle évolutive pour divers cas d'utilisation.",
subtitle: 'Quelques choses que vous pouvez faire pour obtenir rapidement de la valeur de Logto',
develop: {
title: 'Développer: Prenez 5 minutes pour intégrer votre application',
},
customize: {
title: 'Personnaliser: Offrez une excellente expérience de connexion',
preview: {
title:
"Vérifiez l'aperçu en direct de l'expérience de connexion que vous venez de personnaliser",
subtitle:
"Essayez dès maintenant l'expérience de connexion de Logto pour voir comment cela fonctionne",
},
connector: {
title:
'Ajoutez plus de connecteurs pour prendre en charge plus de méthodes de connexion social',
subtitle:
'Essayez la connexion sans mot de passe et activez une expérience sécurisée et sans friction pour vos clients',
},
continue_customizing: 'Continuer la personnalisation',
try_now: 'Essayez maintenant',
add_more: 'Ajouter plus',
},
secure: {
title: 'Sécurité: Protégez vos ressources',
},
manage: {
title: "Gérer: Définir le contrôle d'accès pour votre produit et vos utilisateurs",
rbac: {
title: "Ajoutez un contrôle d'accès basé sur les rôles pour protéger vos ressources",
subtitle:
"Contrôlez vos ressources grâce à une autorisation de rôle évolutive pour des cas d'utilisation divers",
},
create_roles: 'Créer des rôles',
},
view_all: 'Tout afficher →',
};
export default Object.freeze(get_started);

View file

@ -1,35 +1,39 @@
const get_started = {
page_title: 'Inizia',
progress: 'Guida per iniziare: {{completed}}/{{total}}',
progress_dropdown_title: 'Alcune cose che puoi fare...',
title: 'Esplora per avere successo',
subtitle_part1: 'Alcune cose che puoi fare per ottenere rapidamente il valore di Logto',
subtitle_part2: 'Sono un professionista e ho completato tutti i passaggi.',
hide_this: 'Nascondi questo',
confirm_message:
'Sei sicuro di voler nascondere questa pagina? Questa azione non può essere annullata.',
check_preview_title: "Controlla l'anteprima dal vivo",
check_preview_subtitle: 'Prova subito Logto sign-in per vedere come funziona',
integration_title: 'Crea ed integra la tua applicazione',
integration_subtitle:
"Configura l'autenticazione di Logto per la tua applicazione nativa, single page, machine to machine o tradizionale",
custom_sie_title: "Personalizza l'esperienza di accesso",
custom_sie_subtitle: 'Sblocca una vasta gamma di scenari con le impostazioni avanzate',
passwordless_title: "Scala l'accesso senza password aggiungendo i tuoi connettori",
passwordless_subtitle:
"Prova l'accesso senza password e abilita un'esperienza sicura e priva di attriti per i tuoi clienti",
community_title: 'Unisciti alla nostra community su Discord',
community_subtitle: 'Entra nel nostro canale pubblico per parlare con altri sviluppatori',
management_api_title: 'Interagisci con la Management API',
management_api_subtitle:
'Collega direttamente il tuo sistema di autenticazione alla nostra Management API',
further_readings_title: 'Ulteriori letture',
further_readings_subtitle:
'Consulta la nostra documentazione passo-passo basata su scenari senza concetti noiosi',
add_rbac_title:
'Aggiungi il controllo degli accessi basati sui ruoli per proteggere le tue risorse',
add_rbac_subtitle:
"Controlla le tue risorse attraverso l'autorizzazione basata su ruoli scalabile per utilizzi diversi.",
subtitle: 'Alcune cose che puoi fare per ottenere rapidamente il valore di Logto',
develop: {
title: 'Sviluppa: Dedica 5 minuti per integrare la tua app',
},
customize: {
title: "Personalizza: Offri un'ottima esperienza di accesso",
preview: {
title:
"Controlla l'anteprima in tempo reale dell'esperienza di accesso appena personalizzata",
subtitle: "Prova subito l'esperienza di accesso a Logto per vedere come funziona",
},
connector: {
title: 'Aggiungi più connettori per supportare più metodi di accesso sociali',
subtitle:
"Prova l'accesso senza password e abilita un'esperienza sicura e senza attriti per i tuoi clienti",
},
continue_customizing: 'Continua la personalizzazione',
try_now: 'Prova ora',
add_more: 'Aggiungi altro',
},
secure: {
title: 'Sicurezza: Proteggi le tue risorse',
},
manage: {
title: 'Gestisci: Definisci il controllo di accesso per il tuo prodotto e gli utenti',
rbac: {
title: 'Aggiungi il controllo degli accessi basato sui ruoli per proteggere le tue risorse',
subtitle:
"Controlla le tue risorse attraverso l'autorizzazione basata sui ruoli scalabile per casi d'uso diversi.",
},
create_roles: 'Crea ruoli',
},
view_all: 'Visualizza tutto →',
};
export default Object.freeze(get_started);

View file

@ -1,33 +1,36 @@
const get_started = {
page_title: 'はじめに',
progress: 'はじめにガイド:{{completed}}/{{total}}',
progress_dropdown_title: 'できることは何かあるかな?',
title: 'あなたの成功を手助けする探索',
subtitle_part1: 'すばやくLogtoの価値を得るには、いくつかのことができます',
subtitle_part2: '私はプロであり、すべてのステップを完了しました。 ',
hide_this: 'これを隠す',
confirm_message: 'このページを隠すことを確認しますか?この操作は取り消せません。',
check_preview_title: 'ライブプレビューを確認してください',
check_preview_subtitle:
'Logtoのサインインエクスペリエンスを今すぐ試して、どのように機能するかを確認してください',
integration_title: 'アプリケーションの作成と統合',
integration_subtitle:
'ネイティブ、シングルページ、機械間、または従来のアプリケーションにLogto認証を設定してください',
custom_sie_title: 'サインインエクスペリエンスをカスタマイズする',
custom_sie_subtitle: '高度な設定で、さまざまなシナリオを解除する',
passwordless_title: 'コネクタを追加して、パスワードなしのサインインをスケーリングする',
passwordless_subtitle:
'パスワードなしでサインインを試し、お客様に安全で摩擦の少ないエクスペリエンスを提供してください。',
community_title: 'ディスコードコミュニティに参加する',
community_subtitle: '他の開発者とチャットするためのパブリックチャンネルに参加してください。',
management_api_title: 'Management APIとのやり取り',
management_api_subtitle: '認証システムを直接管理APIに接続してください。',
further_readings_title: 'さらなる読書',
further_readings_subtitle:
'面倒な概念なしで、ステップバイステップ、シナリオベースのドキュメントをチェックしてください。',
add_rbac_title: 'ロールベースのアクセス制御を追加して、リソースを保護する',
add_rbac_subtitle:
'多様なユースケースに対応するスケーラブルなロール承認により、リソースを制御します。',
subtitle: 'Logtoの価値を迅速に把握するための数つの方法',
develop: {
title: 'Develop: 5分の時間を使ってアプリを統合してみましょう',
},
customize: {
title: 'Customize: 素晴らしいサインイン体験を提供する',
preview: {
title: 'あなたがカスタマイズしたサインイン体験のライブプレビューをチェックしましょう',
subtitle: 'Logtoのサインイン体験を試して、その使い方を確認してください',
},
connector: {
title: 'さらなるコネクタを追加して、さまざまなソーシャルサインイン方式をサポートしましょう',
subtitle: 'パスワードレスサインインを試して、顧客に安全かつ摩擦のない体験を提供しましょう',
},
continue_customizing: 'カスタマイズを続ける',
try_now: '今すぐ試す',
add_more: 'もっと追加する',
},
secure: {
title: 'Secure: リソースを保護する',
},
manage: {
title: 'Manage: 製品とユーザーのアクセス制御を定義する',
rbac: {
title: 'ロールベースのアクセス制御を追加して、リソースを保護する',
subtitle: '多様なユースケースに対してスケーラブルなロールの認可によりリソースを制御します',
},
create_roles: 'ロールを作成する',
},
view_all: 'すべての内容を表示 →',
};
export default Object.freeze(get_started);

View file

@ -1,30 +1,36 @@
const get_started = {
page_title: '시작하기',
progress: '시작 가이드: {{completed}}/{{total}}',
progress_dropdown_title: '해야 할 것들...',
title: '성공하는 데 도움이 될 탐색 항목',
subtitle_part1: 'Logto의 가치를 얻기 위해 해야 할 것들이 있어요.',
subtitle_part2: '설정을 마칠게요 ',
hide_this: '가리기',
confirm_message: '정말로 이 페이지를 가릴까요? 이 행동은 취소할 수 없어요.',
check_preview_title: '라이브 프리뷰 확인하기',
check_preview_subtitle: 'Logto 로그인 경험을 체험해 보세요.',
integration_title: '애플리케이션 생성하고 통합하기',
integration_subtitle:
'당신의 네이티브, 싱글 페이지, 기계 대 기계 또는 정적 애플리케이션에 Logto 인증을 설정하세요',
custom_sie_title: '로그인 경험 사용자화',
custom_sie_subtitle: '고급 설정으로 다양한 시나리오를 잠금 해제하세요',
passwordless_title: '자체 연동을 추가하여 비밀번호 없는 로그인 구축하기',
passwordless_subtitle:
'비밀번호 없는 로그인을 사용하여 고객에게 안전하고 원활한 환경을 제공하세요',
community_title: 'Discord 커뮤니티 참여하기',
community_subtitle: '우리의 공식 채널에 참여하여 다른 개발자들과 채팅하세요',
management_api_title: '관리 API와 상호작용',
management_api_subtitle: '당신의 인증 시스템을 관리 API에 직접 연결하세요',
further_readings_title: '더 읽어보기',
further_readings_subtitle: '지루한 개념이 없는 단계별 시나리오 기반 문서를 확인하세요.',
add_rbac_title: '역할 기반 액세스 제어를 추가하여 리소스 보호',
add_rbac_subtitle: '다양한 사용 사례에 맞게 확장 가능한 역할 부여를 통해 리소스를 제어하세요.',
subtitle: 'Logto의 가치를 빠르게 얻을 수 있는 몇 가지 방법',
develop: {
title: '개발: 앱을 통합하는 데 5분이면 충분합니다',
},
customize: {
title: '사용자 정의: 훌륭한 로그인 경험 전달하기',
preview: {
title: '방금 사용자 정의한 로그인 경험의 실시간 미리보기 확인하기',
subtitle: '작동 방식을 확인하려면 지금 Logto 로그인 경험을 시도해보세요',
},
connector: {
title: '더 많은 커넥터 추가하여 더 많은 소셜 로그인 방식 지원하기',
subtitle: '비밀번호 없는 로그인을 시도하고 고객에게 안전하고 원활한 경험을 제공하세요',
},
continue_customizing: '사용자 정의 계속하기',
try_now: '지금 시도해보세요',
add_more: '더 추가하기',
},
secure: {
title: '보안: 리소스 보호',
},
manage: {
title: '관리: 제품 및 사용자에 대한 액세스 제어 정의',
rbac: {
title: '롤 기반 액세스 제어 추가하여 리소스 보호',
subtitle: '다양한 사용 사례에 대해 확장 가능한 역할 권한부여를 통해 리소스 제어',
},
create_roles: '역할 생성',
},
view_all: '모두 보기 →',
};
export default Object.freeze(get_started);

View file

@ -1,34 +1,38 @@
const get_started = {
page_title: 'Rozpocznij',
progress: 'Przewodnik rozpoczęcia: {{completed}}/{{total}}',
progress_dropdown_title: 'Kilka rzeczy, które możesz zrobić...',
title: 'Coś do odkrycia, aby pomóc ci odnieść sukces',
subtitle_part1: 'Kilka rzeczy, które możesz zrobić, aby szybko osiągnąć wartość Logto',
subtitle_part2: 'Jestem ekspertem i ukończyłem wszystkie etapy.',
hide_this: 'Ukryj to',
confirm_message: 'Jesteś pewny, że chcesz ukryć tę stronę? Tej czynności nie można cofnąć.',
check_preview_title: 'Sprawdź podgląd na żywo',
check_preview_subtitle:
'Wypróbuj teraz doświadczenie Logto przy logowaniu, aby zobaczyć, jak działa',
integration_title: 'Utwórz i zintegruj swoją aplikację',
integration_subtitle:
'Skonfiguruj uwierzytelnianie Logto dla swojej aplikacji natywnej, jednostronicowej, maszynowej lub tradycyjnej',
custom_sie_title: 'Dostosuj doświadczenie logowania',
custom_sie_subtitle: 'Odblokuj szeroki zakres scenariuszy za pomocą zaawansowanych ustawień',
passwordless_title: 'Skaluj logowanie bez hasła, dodając własne łączniki',
passwordless_subtitle:
'Spróbuj logowania bez hasła i zapewnij swoim klientom bezpieczne i bezproblemowe doświadczenie',
community_title: 'Dołącz do naszej społeczności Discord',
community_subtitle: 'Dołącz do naszego publicznego kanału, aby porozmawiać z innymi deweloperami',
management_api_title: 'Interakcja z API zarządzania',
management_api_subtitle:
'Bezpośrednio połącz swój system uwierzytelniający z naszym API zarządzania',
further_readings_title: 'Dalsza lektura',
further_readings_subtitle:
'Sprawdź nasze krok po kroku, oparte na scenariuszach dokumenty bez nużących pojęć',
add_rbac_title: 'Dodaj kontrolę dostępu opartą na rolach, aby chronić swoje zasoby',
add_rbac_subtitle:
'Kontroluj swoje zasoby poprzez skalowalną autoryzację ról dla różnorodnych przypadków użycia.',
subtitle: 'Kilka rzeczy, które możesz zrobić, aby szybko uzyskać wartość Logto',
develop: {
title: 'Develop: Zajmie to 5 minut, aby zintegrować swoją aplikację',
},
customize: {
title: 'Customize: Dostarcz świetne doświadczenie logowania',
preview: {
title: 'Sprawdź podgląd na żywo doświadczenia logowania, które właśnie spersonalizowałeś',
subtitle: 'Wypróbuj teraz Logto, aby zobaczyć, jak działa',
},
connector: {
title: 'Dodaj więcej konektorów, aby obsługiwać różne metody logowania społecznego',
subtitle:
'Wypróbuj logowanie bez hasła i włącz bezpieczne i bezproblemowe doświadczenie dla swoich klientów',
},
continue_customizing: 'Kontynuuj dostosowywanie',
try_now: 'Wypróbuj teraz',
add_more: 'Dodaj więcej',
},
secure: {
title: 'Zabezpiecz: Chron swoje zasoby',
},
manage: {
title: 'Zarządzaj: Określ kontrolę dostępu do swojego produktu i użytkowników',
rbac: {
title: 'Dodaj oparte na rolach zarządzanie dostępem, aby chronić swoje zasoby',
subtitle:
'Kontroluj swoje zasoby za pomocą skalowalnej autoryzacji opartej na rolach dla różnych przypadków użycia',
},
create_roles: 'Twórz role',
},
view_all: 'Zobacz wszystkie →',
};
export default Object.freeze(get_started);

View file

@ -1,33 +1,39 @@
const get_started = {
page_title: 'Começar',
progress: 'Rrimeiros passos: {{completed}}/{{total}}',
progress_dropdown_title: 'Algumas coisas que você pode fazer...',
title: 'Algo para explorar para ajudá-lo a ter sucesso',
subtitle_part1: 'Algumas coisas que você pode fazer para utilizar rapidamente o Logto',
subtitle_part2: 'Já finalizei os passos. ',
hide_this: 'Esconder isso',
confirm_message:
'Tem certeza de que deseja ocultar esta página? Essa ação não pode ser desfeita.',
check_preview_title: 'Verificar o preview ao vivo',
check_preview_subtitle: 'Experimente a experiência do Logto agora para ver como funciona',
integration_title: 'Criar e integrar a sua aplicação',
integration_subtitle:
'Configure a autenticação do Logto para sua aplicação nativa, de página única, máquina a máquina ou tradicional',
custom_sie_title: 'Personalizar a experiência de login',
custom_sie_subtitle: 'Desbloqueie uma ampla gama de cenários com configurações avançadas',
passwordless_title: 'Aumente a escala do login sem senha adicionando seus próprios conectores',
passwordless_subtitle:
'Experimente o login sem senha e habilite uma experiência segura e sem atritos para o seu cliente',
community_title: 'Junte-se à nossa comunidade no Discord',
community_subtitle: 'Junte-se ao nosso canal público para conversar com outros desenvolvedores',
management_api_title: 'Interagir com Management API',
management_api_subtitle: 'Conecte diretamente seu sistema de autenticação à nossa Management API',
further_readings_title: 'Leituras adicionais',
further_readings_subtitle:
'Confira nossos documentos passo a passo baseados em cenários sem conceitos tediosos',
add_rbac_title: 'Adicionar controle de acesso baseado em função para proteger seus recursos',
add_rbac_subtitle:
'Controle seu recurso por meio de autorização de função escalável para diversos casos de uso.',
subtitle: 'Algumas coisas que você pode fazer para obter rapidamente valor do Logto',
develop: {
title: 'Desenvolva: Dedique 5 minutos para integrar o seu aplicativo',
},
customize: {
title: 'Personalize: Ofereça uma ótima experiência de login',
preview: {
title:
'Verifique a visualização ao vivo da experiência de login que você acabou de personalizar',
subtitle: 'Experimente agora a experiência de login do Logto para ver como ela funciona',
},
connector: {
title: 'Adicione mais conectores para oferecer mais métodos de login social',
subtitle:
'Experimente o login sem senha e habilite uma experiência segura e sem atritos para seus clientes',
},
continue_customizing: 'Continuar personalizando',
try_now: 'Experimente agora',
add_more: 'Adicionar mais',
},
secure: {
title: 'Segurança: Proteja seus recursos',
},
manage: {
title: 'Gerencie: Defina o controle de acesso para seu produto e usuários',
rbac: {
title: 'Adicione controle de acesso baseado em funções para proteger seus recursos',
subtitle:
'Controle seus recursos por meio de autorização baseada em função escalável para diversos casos de uso.',
},
create_roles: 'Criar funções',
},
view_all: 'Ver todos →',
};
export default Object.freeze(get_started);

View file

@ -1,34 +1,39 @@
const get_started = {
page_title: 'Começar',
progress: 'Guia de primeiros passos: {{completed}}/{{total}}',
progress_dropdown_title: 'Algumas coisas que pode fazer...',
title: 'Algo para explorar para o ajudar a ter sucesso',
subtitle_part1: 'Algumas coisas que pode fazer para obter rapidamente o valor do Logto',
subtitle_part2: 'Acabei com esta configuração. ',
hide_this: 'Ocultar isto',
confirm_message: 'Tem a certeza que deseja ocultar esta página? Esta ação não pode ser desfeita.',
check_preview_title: 'Ver a pré-visualização ao vivo',
check_preview_subtitle:
'Experimente a experiência de login do Logto agora para ver como funciona',
integration_title: 'Crie e integre a sua aplicação',
integration_subtitle:
'Configure a autenticação do Logto para a sua aplicação nativa, single page, machine to machine ou tradicional',
custom_sie_title: 'Personalize a experiência de login',
custom_sie_subtitle: 'Desbloqueie uma vasta gama de cenários com definições avançadas',
passwordless_title:
'Aumente a escalabilidade do login sem senha adicionando os seus próprios conectores',
passwordless_subtitle:
'Experimente o login sem senha e ative uma experiência segura e sem fricção para os seus clientes',
community_title: 'Junte-se à nossa comunidade no Discord',
community_subtitle: 'Junte-se ao nosso canal público para conversar com outros programadores',
management_api_title: 'Interaja com a Management API',
management_api_subtitle: 'Ligue diretamente o seu sistema de autenticação à nossa Management API',
further_readings_title: 'Leituras adicionais',
further_readings_subtitle:
'Confira os nossos documentos passo a passo e baseados em cenários, sem conceitos tediosos',
add_rbac_title: 'Adicione controlo de acesso baseado em funções para proteger seus recursos',
add_rbac_subtitle:
'Controle seus recursos através de uma autorização de funções escalável para diversos casos de uso.',
subtitle: 'Algumas coisas que você pode fazer para obter rapidamente valor do Logto',
develop: {
title: 'Develop: Dedique 5 minutos para integrar o seu aplicativo',
},
customize: {
title: 'Customize: Ofereça uma ótima experiência de login',
preview: {
title:
'Verifique a pré-visualização ao vivo da experiência de login que você acabou de personalizar',
subtitle: 'Experimente agora a experiência de login do Logto para ver como funciona',
},
connector: {
title: 'Adicione mais conectores para suportar mais métodos de login social',
subtitle:
'Experimente o login sem senha e ofereça uma experiência segura e sem atritos para seus clientes',
},
continue_customizing: 'Continue personalizando',
try_now: 'Experimente agora',
add_more: 'Adicione mais',
},
secure: {
title: 'Secure: Proteja seus recursos',
},
manage: {
title: 'Manage: Defina o controle de acesso para seu produto e usuários',
rbac: {
title: 'Adicione controle de acesso baseado em função para proteger seus recursos',
subtitle:
'Controle seu recurso por meio de autorização de função escalável para diversos casos de uso.',
},
create_roles: 'Criar funções',
},
view_all: 'Ver tudo →',
};
export default Object.freeze(get_started);

View file

@ -1,36 +1,39 @@
const get_started = {
page_title: 'Начало работы',
progress: 'Руководство: {{completed}}/{{total}}',
progress_dropdown_title: 'Несколько вещей, которые вы можете сделать...',
title: 'Что-то, что поможет вам добиться успеха',
subtitle_part1:
'Несколько вещей, которые вы можете сделать, чтобы быстро получить ценность от Logto',
subtitle_part2: 'Я профессионал и прошел все шаги.',
hide_this: 'Скрыть это',
confirm_message: 'Вы уверены, что хотите скрыть эту страницу? Это действие нельзя отменить.',
check_preview_title: 'Проверьте живой просмотр',
check_preview_subtitle:
'Попробуйте опыт входа в систему Logto сейчас, чтобы увидеть, как это работает',
integration_title: 'Создание и интеграция приложения',
integration_subtitle:
'Настройте аутентификацию Logto для вашего нативного, одностраничного, машинного или традиционного приложения',
custom_sie_title: 'Настройка входа в систему',
custom_sie_subtitle: 'Разблокируйте огромный диапазон сценариев с помощью расширенных настроек',
passwordless_title: 'Масштабирование входа без пароля, добавляя свои коннекторы',
passwordless_subtitle:
'Попробуйте войти без пароля и включите безопасный и безтрудный опыт для своих клиентов',
community_title: 'Присоединяйтесь к нашему сообществу в Discord',
community_subtitle:
'Присоединяйтесь к нашему общедоступному каналу, чтобы общаться с другими разработчиками',
management_api_title: 'Взаимодействие с API управления',
management_api_subtitle:
'Прямое подключение вашей системы аутентификации к нашему API управления',
further_readings_title: 'Дополнительные чтения',
further_readings_subtitle:
'Ознакомьтесь со справочными материалами пошагово и сценарийным способом без утомительных концепций',
add_rbac_title: 'Добавить контроль доступа на основе ролей, чтобы защитить свои ресурсы',
add_rbac_subtitle:
'Управляйте своими ресурсами через масштабируемую авторизацию ролей для разнообразных случаев использования.',
subtitle: 'Несколько вещей, которые вы можете сделать, чтобы быстро получить ценность от Logto',
develop: {
title: 'Develop: Вам понадобится 5 минут, чтобы интегрировать ваше приложение',
},
customize: {
title: 'Customize: Создайте отличный вариант входа в систему',
preview: {
title: 'Проверьте прямую трансляцию присоединения к системе, которое вы только что настроили',
subtitle: 'Попробуйте пробный вариант входа в систему Logto, чтобы узнать, как это работает',
},
connector: {
title:
'Добавьте больше коннекторов, чтобы поддерживать больше способов входа через социальные сети',
subtitle:
'Попробуйте вход без пароля и включите защищенный и плавный опыт для ваших клиентов',
},
continue_customizing: 'Продолжайте настройку',
try_now: 'Попробуйте сейчас',
add_more: 'Добавьте еще',
},
secure: {
title: 'Secure: Защитите свои ресурсы',
},
manage: {
title: 'Manage: Определите контроль доступа для вашего продукта и пользователей',
rbac: {
title: 'Добавьте контроль доступа на основе ролей, чтобы защитить ваши ресурсы',
subtitle:
'Управляйте вашим ресурсом через масштабируемую авторизацию ролей для различных случаев использования',
},
create_roles: 'Создать роли',
},
view_all: 'Посмотреть все →',
};
export default Object.freeze(get_started);

View file

@ -1,32 +1,39 @@
const get_started = {
page_title: 'Başlangıca Başlayın',
progress: 'Başlangıç Kılavuzu: {{completed}}/{{total}}',
progress_dropdown_title: 'Yapabileceğiniz Bazı Şeyler...',
title: 'Başarınızı Desteklemek İçin Keşfedilecek Bir Şey',
subtitle_part1: 'Logto Değerini Hızlı Bir Şekilde Elde Etmek İçin Yapabileceğiniz Birkaç Şey',
subtitle_part2: 'Bu Kurulumla İşim Bitti.',
hide_this: 'Bunu Gizle',
confirm_message: 'Bu Sayfayı Gizlemek İstediğinizden Emin Misiniz? Bu İşlem Geri Alınamaz.',
check_preview_title: 'Canlı Önizlemeyi Kontrol Edin',
check_preview_subtitle: 'Logto Oturum Açma Deneyimini Denemek İçin Şimdi Deneyin',
integration_title: 'Uygulamanızı Oluşturun ve Entegre Edin',
integration_subtitle:
'Doğal, tek sayfa, makineye makineye veya geleneksel bir uygulama için Logto kimlik doğrulamasını ayarlayın',
custom_sie_title: 'Oturum Açma Deneyimini Özelleştirin',
custom_sie_subtitle: 'Gelişmiş ayarlarla geniş bir senaryo yelpazesini açın',
passwordless_title: 'Kendi Bağlayıcılarınızı Ekleyerek Şifresiz Oturum Açmayı Ölçeklendirin',
passwordless_subtitle:
'Deneyin ve Müşteriniz İçin Güvenli ve Sürtünmesiz Bir Deneyim Sağlayarak Şifresiz Oturum Açmayı Etkinleştirin',
community_title: 'Discord Topluluğumuza Katılın',
community_subtitle: 'Diğer Geliştiricilerle Sohbet Etmek İçin Kamu Kanalımıza Katılın',
management_api_title: 'Yönetim API İle Etkileşim Sağlayın',
management_api_subtitle: "Kimlik doğrulama sisteminizi doğrudan yönetim API'mize bağlayın",
further_readings_title: 'Daha Fazla Okuma',
further_readings_subtitle:
'Kavramlarla Uğraştırmayan Adım Adım Senaryo Temelli Belgelerimize Göz Atın',
add_rbac_title: 'Kaynaklarınızı Korumak İçin Rol Tabanlı Erişim Kontrolü Ekleyin',
add_rbac_subtitle:
'Farklı kullanım durumları için ölçeklenebilir rol yetkilendirmesi ile kaynaklarınızı kontrol edin.',
subtitle: "Logto'nun değerini hızla elde etmek için yapabileceğiniz birkaç şey",
develop: {
title: 'Geliştir: Uygulamanızı entegre etmek için 5 dakika ayırın',
},
customize: {
title: 'Özelleştir: Harika bir oturum açma deneyimi sunun',
preview: {
title: 'Yeni özelleştirdiğiniz oturum açma deneyiminin canlı önizlemesini kontrol edin',
subtitle: 'Nasıl çalıştığını görmek için şimdi Logto oturum açma deneyimini deneyin',
},
connector: {
title:
'Daha fazla bağdaştırıcı ekleyerek daha fazla sosyal oturum açma yöntemini destekleyin',
subtitle:
'Şifresiz oturum açmayı deneyin ve müşterileriniz için güvenli ve sürtünmesiz bir deneyim sağlayın',
},
continue_customizing: 'Özelleştirmeye devam et',
try_now: 'Şimdi deneyin',
add_more: 'Daha fazla ekle',
},
secure: {
title: 'Güvenli: Kaynaklarınızı koruyun',
},
manage: {
title: 'Yönet: Ürününüz ve kullanıcılarınız için erişim denetimi tanımlayın',
rbac: {
title:
'Diverse kullanım durumları için ölçeklenebilir rol yetkilendirmesi ile kaynaklarınızı koruyun',
subtitle: 'Kaynağınızı kontrol edin',
},
create_roles: 'Roller oluştur',
},
view_all: 'Hepsini görüntüle →',
};
export default Object.freeze(get_started);

View file

@ -1,28 +1,36 @@
const get_started = {
page_title: '开始上手',
progress: '开始上手: {{completed}}/{{total}}',
progress_dropdown_title: '一些快速上手的操作',
title: '成功开发身份方案,我们先来探索一番',
subtitle_part1: '下列是一些可以快速上手的操作,通过这些,你可以更好地感受 Logto 的价值',
subtitle_part2: '我已经完成了这些设置。',
hide_this: '隐藏引导',
confirm_message: '你确认要隐藏该页面吗? 本操作将无法恢复。',
check_preview_title: '查看实时预览',
check_preview_subtitle: '来体验 Logto 登录吧',
integration_title: '创建和集成你的应用程序',
integration_subtitle: '为你的本地、单页、机器对机器或传统应用程序设置 Logto 身份验证',
custom_sie_title: '自定义登录体验',
custom_sie_subtitle: '使用高级设置解锁各种场景',
passwordless_title: '通过添加自己的连接器来扩展无密码登录',
passwordless_subtitle: '尝试无密码登录,并为你的客户提供安全和无摩擦的体验',
community_title: '加入我们的 Discord 社区',
community_subtitle: '加入我们的公共频道与其他开发人员交流',
management_api_title: '与管理 API 交互',
management_api_subtitle: '直接将你的身份验证系统连接到我们的管理 API',
further_readings_title: '进一步阅读',
further_readings_subtitle: '查看我们的逐步、基于场景的文档,避免繁琐的概念',
add_rbac_title: '添加基于角色的访问控制以保护你的资源',
add_rbac_subtitle: '通过可扩展的角色授权控制你的资源,以适应各种用例。',
subtitle: '一些你可以做的事情,以快速获取 Logto 的价值',
develop: {
title: '开发:花 5 分钟集成你的应用',
},
customize: {
title: '自定义:提供出色的登录体验',
preview: {
title: '实时预览定制的登录体验',
subtitle: '立刻尝试 Logto 登录体验,看看它是如何工作的',
},
connector: {
title: '添加更多连接器来支持更多社交登录方式',
subtitle: '尝试免密码登录,为您的客户提供安全、无摩擦的体验',
},
continue_customizing: '继续定制',
try_now: '立即尝试',
add_more: '添加更多',
},
secure: {
title: '安全:保护你的资源',
},
manage: {
title: '管理:为你的产品和用户定义访问控制',
rbac: {
title: '为你的资源添加基于角色的访问控制',
subtitle: '通过可扩展的角色授权控制你的资源,应对不同的使用场景。',
},
create_roles: '创建角色',
},
view_all: '查看全部 →',
};
export default Object.freeze(get_started);

View file

@ -1,28 +1,36 @@
const get_started = {
page_title: '開始上手',
progress: '開始上手: {{completed}}/{{total}}',
progress_dropdown_title: '一些快速上手的操作',
title: '成功開發身份方案,我們先來探索一番',
subtitle_part1: '下列是一些可以快速上手的操作,通過這些,你可以更好地感受 Logto 的價值',
subtitle_part2: '我已經完成了這些設置。',
hide_this: '隱藏引導',
confirm_message: '你確認要隱藏該頁面嗎? 本操作將無法恢復。',
check_preview_title: '查看實時預覽',
check_preview_subtitle: '來體驗 Logto 登錄吧',
integration_title: '創建和集成你的應用程序',
integration_subtitle: '為你的本地、單頁、機器對機器或傳統應用程序設置 Logto 身份驗證',
custom_sie_title: '自定義登錄體驗',
custom_sie_subtitle: '使用高級設置解鎖各種場景',
passwordless_title: '通過添加自己的連接器來擴展無密碼登錄',
passwordless_subtitle: '嘗試無密碼登錄,並為你的客戶提供安全和無摩擦的體驗',
community_title: '加入我們的 Discord 社區',
community_subtitle: '加入我們的公共頻道與其他開發人員交流',
management_api_title: '與管理 API 交互',
management_api_subtitle: '直接將你的身份驗證系統連接到我們的管理 API',
further_readings_title: '進一步閱讀',
further_readings_subtitle: '查看我們的逐步、基於場景的文檔,避免繁瑣的概念',
add_rbac_title: '添加基於角色的訪問控制以保護你的資源',
add_rbac_subtitle: '通過可擴展的角色授權控制你的資源,以適應各種用例。',
subtitle: '一些你可以做的事情,以快速獲取 Logto 的價值',
develop: {
title: '開發:花 5 分鐘將你的應用集成進來',
},
customize: {
title: '定制:提供出色的登錄體驗',
preview: {
title: '查看剛剛定制的登錄體驗的實時預覽',
subtitle: '現在嘗試 Logto 登錄體驗,看看它如何運作',
},
connector: {
title: '添加更多連接器以支持更多社交登錄方式',
subtitle: '試一試無密碼登錄,為你的客戶提供安全、無摩擦的體驗',
},
continue_customizing: '繼續定制',
try_now: '立即試用',
add_more: '添加更多',
},
secure: {
title: '安全:保護你的資源',
},
manage: {
title: '管理:為你的產品和用戶定義存取控制',
rbac: {
title: '為你的資源添加基於角色的存取控制',
subtitle: '通過可擴展的角色授權,控制你的資源,滿足不同的使用場景',
},
create_roles: '創建角色',
},
view_all: '查看全部 →',
};
export default Object.freeze(get_started);

View file

@ -1,28 +1,36 @@
const get_started = {
page_title: '開始上手',
progress: '開始上手: {{completed}}/{{total}}',
progress_dropdown_title: '一些快速上手的操作',
title: '成功開發身份方案,我們先來探索一番',
subtitle_part1: '下列是一些可以快速上手的操作,通過這些,你可以更好地感受 Logto 的價值',
subtitle_part2: '我已經完成了這些設置。',
hide_this: '隱藏引導',
confirm_message: '你確認要隱藏該頁面嗎? 本操作將無法恢復。',
check_preview_title: '查看實時預覽',
check_preview_subtitle: '來體驗Logto登錄吧',
integration_title: '創建和集成你的應用程序',
integration_subtitle: '為你的本地、單頁、機器對機器或傳統應用程序設置Logto身份驗證',
custom_sie_title: '自定義登錄體驗',
custom_sie_subtitle: '使用高級設置解鎖各種場景',
passwordless_title: '通過添加自己的連接器來擴展無密碼登錄',
passwordless_subtitle: '嘗試無密碼登錄,並為你的客戶提供安全和無摩擦的體驗',
community_title: '加入我們的Discord社區',
community_subtitle: '加入我們的公共頻道與其他開發人員交流',
management_api_title: '與管理API交互',
management_api_subtitle: '直接將你的身份驗證系統連接到我們的管理API',
further_readings_title: '進一步閱讀',
further_readings_subtitle: '查看我們的逐步、基於場景的文檔,避免繁瑣的概念',
add_rbac_title: '添加基於角色的訪問控制以保護你的資源',
add_rbac_subtitle: '通過可擴展的角色授權控制你的資源,以適應各種用例。',
subtitle: '一些快速獲取 Logto 價值的事情',
develop: {
title: '開發:花 5 分鐘集成您的應用程式',
},
customize: {
title: '自訂:提供出色的登錄體驗',
preview: {
title: '查看您剛自訂的登錄體驗的實時預覽',
subtitle: '立即嘗試 Logto 登錄體驗,了解其工作原理',
},
connector: {
title: '添加更多連接器以支持更多社交登錄方式',
subtitle: '嘗試無密碼登錄,為您的客戶啟用安全、無摩擦的體驗',
},
continue_customizing: '繼續自訂',
try_now: '立即嘗試',
add_more: '添加更多',
},
secure: {
title: '安全:保護您的資源',
},
manage: {
title: '管理:為您的產品和用戶定義訪問控制',
rbac: {
title: '添加基於角色的訪問控制以保護您的資源',
subtitle: '通過可擴展的角色授權,來控制不同用例的資源',
},
create_roles: '創建角色',
},
view_all: '查看全部 →',
};
export default Object.freeze(get_started);