mirror of
https://github.com/langgenius/dify.git
synced 2026-07-21 10:38:32 +08:00
fix(web): add missing i18n for CLI device flow login page (#38282)
This commit is contained in:
parent
51156fef07
commit
2429b757d8
@ -73,56 +73,56 @@ async function reachTerminal(rejectWith: unknown) {
|
||||
render(<DevicePage />)
|
||||
const input = screen.getByRole('textbox')
|
||||
fireEvent.change(input, { target: { value: VALID_CODE } })
|
||||
fireEvent.click(screen.getByRole('button', { name: /Continue/i }))
|
||||
fireEvent.click(screen.getByRole('button', { name: /deviceFlow.codeEntry.continue/i }))
|
||||
}
|
||||
|
||||
describe('error_expired terminal state', () => {
|
||||
it('shows "Code no longer valid" heading', async () => {
|
||||
it('shows "errorExpired.title" heading', async () => {
|
||||
await reachTerminal(new Error('expired'))
|
||||
await screen.findByText('Code no longer valid')
|
||||
await screen.findByText('deviceFlow.errorExpired.title')
|
||||
})
|
||||
|
||||
it('ghost button resets to code_entry', async () => {
|
||||
await reachTerminal(new Error('expired'))
|
||||
await screen.findByText('Code no longer valid')
|
||||
fireEvent.click(screen.getByRole('button', { name: /Try a different code/i }))
|
||||
await screen.findByText('deviceFlow.errorExpired.title')
|
||||
fireEvent.click(screen.getByRole('button', { name: /deviceFlow.errorExpired.tryDifferentCode/i }))
|
||||
expect(screen.getByRole('textbox')).toBeInTheDocument()
|
||||
expect(screen.queryByText('Code no longer valid')).not.toBeInTheDocument()
|
||||
expect(screen.queryByText('deviceFlow.errorExpired.title')).not.toBeInTheDocument()
|
||||
})
|
||||
})
|
||||
|
||||
describe('error_rate_limited terminal state', () => {
|
||||
it('shows "Too many attempts" heading', async () => {
|
||||
it('shows "errorRateLimited.title" heading', async () => {
|
||||
await reachTerminal(new MockDeviceFlowError('rate_limited', 429))
|
||||
await screen.findByText('Too many attempts')
|
||||
await screen.findByText('deviceFlow.errorRateLimited.title')
|
||||
})
|
||||
|
||||
it('ghost button resets to code_entry', async () => {
|
||||
await reachTerminal(new MockDeviceFlowError('rate_limited', 429))
|
||||
await screen.findByText('Too many attempts')
|
||||
fireEvent.click(screen.getByRole('button', { name: /Try again/i }))
|
||||
await screen.findByText('deviceFlow.errorRateLimited.title')
|
||||
fireEvent.click(screen.getByRole('button', { name: /deviceFlow.tryAgain/i }))
|
||||
expect(screen.getByRole('textbox')).toBeInTheDocument()
|
||||
expect(screen.queryByText('Too many attempts')).not.toBeInTheDocument()
|
||||
expect(screen.queryByText('deviceFlow.errorRateLimited.title')).not.toBeInTheDocument()
|
||||
})
|
||||
})
|
||||
|
||||
describe('error_lookup_failed terminal state', () => {
|
||||
it('shows "Could not verify the code" heading', async () => {
|
||||
it('shows "errorLookupFailed.title" heading', async () => {
|
||||
await reachTerminal(new MockDeviceFlowError('server_error', 500))
|
||||
await screen.findByText('Could not verify the code')
|
||||
await screen.findByText('deviceFlow.errorLookupFailed.title')
|
||||
})
|
||||
|
||||
it('ghost button resets to code_entry', async () => {
|
||||
await reachTerminal(new MockDeviceFlowError('server_error', 500))
|
||||
await screen.findByText('Could not verify the code')
|
||||
fireEvent.click(screen.getByRole('button', { name: /Try again/i }))
|
||||
await screen.findByText('deviceFlow.errorLookupFailed.title')
|
||||
fireEvent.click(screen.getByRole('button', { name: /deviceFlow.tryAgain/i }))
|
||||
expect(screen.getByRole('textbox')).toBeInTheDocument()
|
||||
expect(screen.queryByText('Could not verify the code')).not.toBeInTheDocument()
|
||||
expect(screen.queryByText('deviceFlow.errorLookupFailed.title')).not.toBeInTheDocument()
|
||||
})
|
||||
})
|
||||
|
||||
describe('sso_error inline banner on the code-entry page', () => {
|
||||
const SSO_BANNER_COPY = /identity is linked to a Dify account/i
|
||||
const SSO_BANNER_COPY = 'deviceFlow.ssoError.emailBelongsToDifyAccount'
|
||||
|
||||
it('shows the error banner with friendly copy when sso_error is present', async () => {
|
||||
mockSearchParams = { sso_error: 'email_belongs_to_dify_account' }
|
||||
@ -135,7 +135,7 @@ describe('sso_error inline banner on the code-entry page', () => {
|
||||
render(<DevicePage />)
|
||||
await screen.findByText(SSO_BANNER_COPY)
|
||||
expect(screen.getByRole('textbox')).toBeInTheDocument()
|
||||
expect(screen.getByRole('button', { name: /Continue/i })).toBeInTheDocument()
|
||||
expect(screen.getByRole('button', { name: /deviceFlow.codeEntry.continue/i })).toBeInTheDocument()
|
||||
})
|
||||
|
||||
it('does not surface the raw backend error code', async () => {
|
||||
|
||||
@ -54,27 +54,27 @@ describe('AuthorizeAccount', () => {
|
||||
|
||||
it('calls deviceApproveAccount with userCode on Authorize click', async () => {
|
||||
render(<AuthorizeAccount {...makeProps()} />)
|
||||
fireEvent.click(screen.getByRole('button', { name: /Authorize/i }))
|
||||
fireEvent.click(screen.getByRole('button', { name: /deviceFlow.authorize.approve/i }))
|
||||
await waitFor(() => expect(mockApproveAccount).toHaveBeenCalledWith('ABCD-3456'))
|
||||
})
|
||||
|
||||
it('calls onApproved after successful approve', async () => {
|
||||
const props = makeProps()
|
||||
render(<AuthorizeAccount {...props} />)
|
||||
fireEvent.click(screen.getByRole('button', { name: /Authorize/i }))
|
||||
fireEvent.click(screen.getByRole('button', { name: /deviceFlow.authorize.approve/i }))
|
||||
await waitFor(() => expect(props.onApproved).toHaveBeenCalled())
|
||||
})
|
||||
|
||||
it('calls deviceDenyAccount with userCode on Cancel click', async () => {
|
||||
render(<AuthorizeAccount {...makeProps()} />)
|
||||
fireEvent.click(screen.getByRole('button', { name: /Cancel/i }))
|
||||
fireEvent.click(screen.getByRole('button', { name: /common.operation.cancel/i }))
|
||||
await waitFor(() => expect(mockDenyAccount).toHaveBeenCalledWith('ABCD-3456'))
|
||||
})
|
||||
|
||||
it('calls onDenied after successful deny', async () => {
|
||||
const props = makeProps()
|
||||
render(<AuthorizeAccount {...props} />)
|
||||
fireEvent.click(screen.getByRole('button', { name: /Cancel/i }))
|
||||
fireEvent.click(screen.getByRole('button', { name: /common.operation.cancel/i }))
|
||||
await waitFor(() => expect(props.onDenied).toHaveBeenCalled())
|
||||
})
|
||||
|
||||
@ -82,7 +82,7 @@ describe('AuthorizeAccount', () => {
|
||||
mockApproveAccount.mockRejectedValue(new Error('unexpected'))
|
||||
const props = makeProps()
|
||||
render(<AuthorizeAccount {...props} />)
|
||||
fireEvent.click(screen.getByRole('button', { name: /Authorize/i }))
|
||||
fireEvent.click(screen.getByRole('button', { name: /deviceFlow.authorize.approve/i }))
|
||||
await waitFor(() => expect(props.onError).toHaveBeenCalledWith(expect.any(String)))
|
||||
})
|
||||
})
|
||||
|
||||
@ -43,37 +43,37 @@ describe('AuthorizeSSO', () => {
|
||||
|
||||
it('renders single Authorize button with no Cancel', async () => {
|
||||
render(<AuthorizeSSO onApproved={vi.fn()} onError={vi.fn()} />)
|
||||
await screen.findByRole('button', { name: /Authorize/i })
|
||||
expect(screen.queryByRole('button', { name: /Cancel/i })).not.toBeInTheDocument()
|
||||
await screen.findByRole('button', { name: /deviceFlow.authorize.approve/i })
|
||||
expect(screen.queryByRole('button', { name: /common.operation.cancel/i })).not.toBeInTheDocument()
|
||||
})
|
||||
|
||||
it('calls approveExternal with ctx and user_code on Authorize click', async () => {
|
||||
render(<AuthorizeSSO onApproved={vi.fn()} onError={vi.fn()} />)
|
||||
await screen.findByRole('button', { name: /Authorize/i })
|
||||
await userEvent.click(screen.getByRole('button', { name: /Authorize/i }))
|
||||
await screen.findByRole('button', { name: /deviceFlow.authorize.approve/i })
|
||||
await userEvent.click(screen.getByRole('button', { name: /deviceFlow.authorize.approve/i }))
|
||||
await waitFor(() => expect(mockApproveExternal).toHaveBeenCalledWith(mockCtx, mockCtx.user_code))
|
||||
})
|
||||
|
||||
it('calls onApproved after successful approve', async () => {
|
||||
const onApproved = vi.fn()
|
||||
render(<AuthorizeSSO onApproved={onApproved} onError={vi.fn()} />)
|
||||
await screen.findByRole('button', { name: /Authorize/i })
|
||||
await userEvent.click(screen.getByRole('button', { name: /Authorize/i }))
|
||||
await screen.findByRole('button', { name: /deviceFlow.authorize.approve/i })
|
||||
await userEvent.click(screen.getByRole('button', { name: /deviceFlow.authorize.approve/i }))
|
||||
await waitFor(() => expect(onApproved).toHaveBeenCalled())
|
||||
})
|
||||
|
||||
it('shows loadErr fallback when fetchApprovalContext rejects', async () => {
|
||||
mockFetchApprovalContext.mockRejectedValue(new Error('network'))
|
||||
render(<AuthorizeSSO onApproved={vi.fn()} onError={vi.fn()} />)
|
||||
await screen.findByText('This session is no longer valid')
|
||||
await screen.findByText('deviceFlow.authorize.sessionInvalidTitle')
|
||||
})
|
||||
|
||||
it('calls onError when approveExternal throws', async () => {
|
||||
mockApproveExternal.mockRejectedValue(new Error('unexpected'))
|
||||
const onError = vi.fn()
|
||||
render(<AuthorizeSSO onApproved={vi.fn()} onError={onError} />)
|
||||
await screen.findByRole('button', { name: /Authorize/i })
|
||||
await userEvent.click(screen.getByRole('button', { name: /Authorize/i }))
|
||||
await screen.findByRole('button', { name: /deviceFlow.authorize.approve/i })
|
||||
await userEvent.click(screen.getByRole('button', { name: /deviceFlow.authorize.approve/i }))
|
||||
await waitFor(() => expect(onError).toHaveBeenCalledWith(expect.any(String)))
|
||||
})
|
||||
})
|
||||
|
||||
@ -16,22 +16,22 @@ vi.mock('@/app/signin/utils/post-login-redirect', () => ({
|
||||
describe('Chooser', () => {
|
||||
it('renders account button', () => {
|
||||
render(<Chooser userCode="ABCD-3456" ssoAvailable={false} />)
|
||||
expect(screen.getByRole('button', { name: /Sign in with Dify account/i })).toBeInTheDocument()
|
||||
expect(screen.getByRole('button', { name: /deviceFlow.chooser.signInAccount/i })).toBeInTheDocument()
|
||||
})
|
||||
|
||||
it('hides SSO button when ssoAvailable is false', () => {
|
||||
render(<Chooser userCode="ABCD-3456" ssoAvailable={false} />)
|
||||
expect(screen.queryByRole('button', { name: /Sign in with SSO/i })).not.toBeInTheDocument()
|
||||
expect(screen.queryByRole('button', { name: /deviceFlow.chooser.signInSSO/i })).not.toBeInTheDocument()
|
||||
})
|
||||
|
||||
it('shows SSO button when ssoAvailable is true', () => {
|
||||
render(<Chooser userCode="ABCD-3456" ssoAvailable={true} />)
|
||||
expect(screen.getByRole('button', { name: /Sign in with SSO/i })).toBeInTheDocument()
|
||||
expect(screen.getByRole('button', { name: /deviceFlow.chooser.signInSSO/i })).toBeInTheDocument()
|
||||
})
|
||||
|
||||
it('sets post-login redirect and navigates to /signin on account button click', () => {
|
||||
render(<Chooser userCode="ABCD-3456" ssoAvailable={false} />)
|
||||
fireEvent.click(screen.getByRole('button', { name: /Sign in with Dify account/i }))
|
||||
fireEvent.click(screen.getByRole('button', { name: /deviceFlow.chooser.signInAccount/i }))
|
||||
expect(vi.mocked(setPostLoginRedirect)).toHaveBeenCalledWith('/device?user_code=ABCD-3456')
|
||||
expect(mockPush).toHaveBeenCalledWith('/signin')
|
||||
})
|
||||
@ -39,7 +39,7 @@ describe('Chooser', () => {
|
||||
it('encodes userCode in post-login redirect', () => {
|
||||
// Uses a code with a space to exercise encodeURIComponent
|
||||
render(<Chooser userCode="AB CD" ssoAvailable={false} />)
|
||||
fireEvent.click(screen.getByRole('button', { name: /Sign in with Dify account/i }))
|
||||
fireEvent.click(screen.getByRole('button', { name: /deviceFlow.chooser.signInAccount/i }))
|
||||
expect(vi.mocked(setPostLoginRedirect)).toHaveBeenCalledWith('/device?user_code=AB%20CD')
|
||||
})
|
||||
|
||||
@ -49,7 +49,7 @@ describe('Chooser', () => {
|
||||
value: { href: '' },
|
||||
})
|
||||
render(<Chooser userCode="ABCD-3456" ssoAvailable={true} />)
|
||||
fireEvent.click(screen.getByRole('button', { name: /Sign in with SSO/i }))
|
||||
fireEvent.click(screen.getByRole('button', { name: /deviceFlow.chooser.signInSSO/i }))
|
||||
expect(window.location.href).toBe(
|
||||
'/openapi/v1/oauth/device/sso-initiate?user_code=ABCD-3456',
|
||||
)
|
||||
|
||||
@ -4,6 +4,7 @@ import type { FC } from 'react'
|
||||
import { Avatar } from '@langgenius/dify-ui/avatar'
|
||||
import { Button } from '@langgenius/dify-ui/button'
|
||||
import { useState } from 'react'
|
||||
import { useTranslation } from 'react-i18next'
|
||||
import { deviceApproveAccount, deviceDenyAccount } from '@/service/device-flow'
|
||||
import { approveErrorCopy } from '../utils/error-copy'
|
||||
|
||||
@ -34,6 +35,7 @@ const AuthorizeAccount: FC<Props> = ({
|
||||
onDenied,
|
||||
onError,
|
||||
}) => {
|
||||
const { t } = useTranslation('deviceFlow')
|
||||
const [busy, setBusy] = useState(false)
|
||||
|
||||
const approve = async () => {
|
||||
@ -43,7 +45,7 @@ const AuthorizeAccount: FC<Props> = ({
|
||||
onApproved()
|
||||
}
|
||||
catch (e) {
|
||||
onError(approveErrorCopy(e))
|
||||
onError(approveErrorCopy(e, t))
|
||||
}
|
||||
finally {
|
||||
setBusy(false)
|
||||
@ -57,7 +59,7 @@ const AuthorizeAccount: FC<Props> = ({
|
||||
onDenied()
|
||||
}
|
||||
catch (e) {
|
||||
onError(approveErrorCopy(e))
|
||||
onError(approveErrorCopy(e, t))
|
||||
}
|
||||
finally {
|
||||
setBusy(false)
|
||||
@ -67,9 +69,9 @@ const AuthorizeAccount: FC<Props> = ({
|
||||
return (
|
||||
<div className="flex flex-col gap-5">
|
||||
<div>
|
||||
<h2 className="text-2xl font-semibold text-text-primary">Authorize Dify CLI</h2>
|
||||
<h2 className="text-2xl font-semibold text-text-primary">{t('authorize.title')}</h2>
|
||||
<p className="mt-2 text-sm text-text-secondary">
|
||||
difyctl is requesting access. If you didn't start this from your terminal, click Cancel.
|
||||
{t('authorize.accountSubtitle')}
|
||||
</p>
|
||||
</div>
|
||||
<div className="flex items-center gap-2.5 rounded-lg bg-background-section-burn px-3 py-2.5">
|
||||
@ -89,7 +91,7 @@ const AuthorizeAccount: FC<Props> = ({
|
||||
</div>
|
||||
{defaultWorkspace && (
|
||||
<div className="rounded-lg bg-background-section-burn px-3 py-2 text-sm text-text-secondary">
|
||||
Workspace:
|
||||
{t('authorize.workspace')}
|
||||
{' '}
|
||||
<span className="font-semibold text-text-primary">{defaultWorkspace}</span>
|
||||
</div>
|
||||
@ -102,7 +104,7 @@ const AuthorizeAccount: FC<Props> = ({
|
||||
onClick={approve}
|
||||
disabled={busy}
|
||||
>
|
||||
Authorize
|
||||
{t('authorize.approve')}
|
||||
</Button>
|
||||
<Button
|
||||
variant="secondary"
|
||||
@ -111,7 +113,7 @@ const AuthorizeAccount: FC<Props> = ({
|
||||
onClick={deny}
|
||||
disabled={busy}
|
||||
>
|
||||
Cancel
|
||||
{t('operation.cancel', { ns: 'common' })}
|
||||
</Button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@ -5,6 +5,7 @@ import type { ApprovalContext } from '@/service/device-flow'
|
||||
import { Avatar } from '@langgenius/dify-ui/avatar'
|
||||
import { Button } from '@langgenius/dify-ui/button'
|
||||
import { useEffect, useState } from 'react'
|
||||
import { Trans, useTranslation } from 'react-i18next'
|
||||
import { approveExternal, fetchApprovalContext } from '@/service/device-flow'
|
||||
import { approveErrorCopy } from '../utils/error-copy'
|
||||
|
||||
@ -25,6 +26,7 @@ type Props = {
|
||||
* pre-SSO ?user_code=... query param.
|
||||
*/
|
||||
const AuthorizeSSO: FC<Props> = ({ onApproved, onError }) => {
|
||||
const { t } = useTranslation('deviceFlow')
|
||||
const [ctx, setCtx] = useState<ApprovalContext | null>(null)
|
||||
const [busy, setBusy] = useState(false)
|
||||
const [loadErr, setLoadErr] = useState<string | null>(null)
|
||||
@ -33,17 +35,19 @@ const AuthorizeSSO: FC<Props> = ({ onApproved, onError }) => {
|
||||
let cancelled = false
|
||||
fetchApprovalContext()
|
||||
.then((c) => {
|
||||
if (!cancelled)
|
||||
if (!cancelled) {
|
||||
setCtx(c)
|
||||
setLoadErr(null)
|
||||
}
|
||||
})
|
||||
.catch((e) => {
|
||||
if (!cancelled)
|
||||
setLoadErr(approveErrorCopy(e))
|
||||
setLoadErr(approveErrorCopy(e, t))
|
||||
})
|
||||
return () => {
|
||||
cancelled = true
|
||||
}
|
||||
}, [])
|
||||
}, [t])
|
||||
|
||||
const approve = async () => {
|
||||
if (!ctx)
|
||||
@ -54,7 +58,7 @@ const AuthorizeSSO: FC<Props> = ({ onApproved, onError }) => {
|
||||
onApproved()
|
||||
}
|
||||
catch (e) {
|
||||
onError(approveErrorCopy(e))
|
||||
onError(approveErrorCopy(e, t))
|
||||
}
|
||||
finally {
|
||||
setBusy(false)
|
||||
@ -67,27 +71,27 @@ const AuthorizeSSO: FC<Props> = ({ onApproved, onError }) => {
|
||||
if (loadErr) {
|
||||
return (
|
||||
<div>
|
||||
<h2 className="text-2xl font-semibold text-text-primary">This session is no longer valid</h2>
|
||||
<h2 className="text-2xl font-semibold text-text-primary">{t('authorize.sessionInvalidTitle')}</h2>
|
||||
<p className="mt-2 text-sm text-text-secondary">
|
||||
Run
|
||||
{' '}
|
||||
<code className="rounded bg-components-input-bg-normal px-1 font-mono">difyctl auth login</code>
|
||||
{' '}
|
||||
again to start a new sign-in.
|
||||
<Trans
|
||||
i18nKey="authorize.sessionInvalidBody"
|
||||
ns="deviceFlow"
|
||||
components={{ codeTag: <code className="rounded bg-components-input-bg-normal px-1 font-mono" /> }}
|
||||
/>
|
||||
</p>
|
||||
</div>
|
||||
)
|
||||
}
|
||||
if (!ctx) {
|
||||
return <div className="text-sm text-text-secondary">Loading session…</div>
|
||||
return <div className="text-sm text-text-secondary">{t('authorize.loadingSession')}</div>
|
||||
}
|
||||
|
||||
return (
|
||||
<div className="flex flex-col gap-5">
|
||||
<div>
|
||||
<h2 className="text-2xl font-semibold text-text-primary">Authorize Dify CLI</h2>
|
||||
<h2 className="text-2xl font-semibold text-text-primary">{t('authorize.title')}</h2>
|
||||
<p className="mt-2 text-sm text-text-secondary">
|
||||
difyctl is requesting access via SSO. If you didn't start this from your terminal, close this tab.
|
||||
{t('authorize.ssoSubtitle')}
|
||||
</p>
|
||||
</div>
|
||||
<div className="flex items-center gap-2.5 rounded-lg bg-background-section-burn px-3 py-2.5">
|
||||
@ -98,12 +102,12 @@ const AuthorizeSSO: FC<Props> = ({ onApproved, onError }) => {
|
||||
/>
|
||||
<div>
|
||||
<p className="text-sm font-semibold text-text-primary">{ctx.subject_email}</p>
|
||||
<p className="text-xs text-text-secondary">via SSO</p>
|
||||
<p className="text-xs text-text-secondary">{t('authorize.viaSSO')}</p>
|
||||
</div>
|
||||
</div>
|
||||
{ctx.subject_issuer && (
|
||||
<div className="rounded-lg bg-background-section-burn px-3 py-2 text-sm text-text-secondary">
|
||||
Identity provider:
|
||||
{t('authorize.identityProvider')}
|
||||
{' '}
|
||||
<span className="font-semibold text-text-primary">{ctx.subject_issuer}</span>
|
||||
</div>
|
||||
@ -115,7 +119,7 @@ const AuthorizeSSO: FC<Props> = ({ onApproved, onError }) => {
|
||||
onClick={approve}
|
||||
disabled={busy}
|
||||
>
|
||||
Authorize
|
||||
{t('authorize.approve')}
|
||||
</Button>
|
||||
</div>
|
||||
)
|
||||
|
||||
@ -2,6 +2,7 @@
|
||||
|
||||
import type { FC } from 'react'
|
||||
import { Button } from '@langgenius/dify-ui/button'
|
||||
import { useTranslation } from 'react-i18next'
|
||||
import { setPostLoginRedirect } from '@/app/signin/utils/post-login-redirect'
|
||||
import { useRouter } from '@/next/navigation'
|
||||
|
||||
@ -24,6 +25,7 @@ type Props = {
|
||||
* generalises post-signin redirect to all methods.
|
||||
*/
|
||||
const Chooser: FC<Props> = ({ userCode, ssoAvailable }) => {
|
||||
const { t } = useTranslation('deviceFlow')
|
||||
const router = useRouter()
|
||||
|
||||
const onAccount = () => {
|
||||
@ -44,7 +46,7 @@ const Chooser: FC<Props> = ({ userCode, ssoAvailable }) => {
|
||||
onClick={onAccount}
|
||||
>
|
||||
<span className="i-ri-user-3-line h-4 w-4" />
|
||||
Sign in with Dify account
|
||||
{t('chooser.signInAccount')}
|
||||
</Button>
|
||||
{ssoAvailable && (
|
||||
<Button
|
||||
@ -54,7 +56,7 @@ const Chooser: FC<Props> = ({ userCode, ssoAvailable }) => {
|
||||
onClick={onSSO}
|
||||
>
|
||||
<span className="i-ri-shield-line h-4 w-4" />
|
||||
Sign in with SSO
|
||||
{t('chooser.signInSSO')}
|
||||
</Button>
|
||||
)}
|
||||
</div>
|
||||
|
||||
@ -2,6 +2,7 @@
|
||||
|
||||
import type { FC } from 'react'
|
||||
import { useCallback } from 'react'
|
||||
import { useTranslation } from 'react-i18next'
|
||||
import { normaliseUserCodeInput } from '../utils/user-code'
|
||||
|
||||
type Props = {
|
||||
@ -19,6 +20,7 @@ type Props = {
|
||||
* not need to run validation itself.
|
||||
*/
|
||||
const CodeInput: FC<Props> = ({ value, onChange, disabled, autoFocus }) => {
|
||||
const { t } = useTranslation('deviceFlow')
|
||||
const handle = useCallback((raw: string) => {
|
||||
onChange(normaliseUserCodeInput(raw))
|
||||
}, [onChange])
|
||||
@ -32,7 +34,7 @@ const CodeInput: FC<Props> = ({ value, onChange, disabled, autoFocus }) => {
|
||||
spellCheck={false}
|
||||
placeholder="ABCD-1234"
|
||||
maxLength={9}
|
||||
aria-label="one-time code"
|
||||
aria-label={t('codeEntry.codeAriaLabel')}
|
||||
className="border-components-input-border-normal w-full rounded-lg border bg-components-input-bg-normal px-4 py-3 text-center font-mono text-2xl tracking-wider text-text-primary focus:border-components-input-border-active focus:outline-none"
|
||||
value={value}
|
||||
disabled={disabled}
|
||||
|
||||
@ -3,6 +3,7 @@
|
||||
import { Button } from '@langgenius/dify-ui/button'
|
||||
import { useQuery } from '@tanstack/react-query'
|
||||
import { useEffect, useState } from 'react'
|
||||
import { Trans, useTranslation } from 'react-i18next'
|
||||
import Divider from '@/app/components/base/divider'
|
||||
import { userProfileQueryOptions } from '@/features/account-profile/client'
|
||||
import { systemFeaturesQueryOptions } from '@/features/system-features/client'
|
||||
@ -27,6 +28,7 @@ type View
|
||||
| { kind: 'error_lookup_failed' }
|
||||
|
||||
export default function DevicePage() {
|
||||
const { t } = useTranslation('deviceFlow')
|
||||
const searchParams = useSearchParams()
|
||||
const router = useRouter()
|
||||
const pathname = usePathname()
|
||||
@ -127,13 +129,13 @@ export default function DevicePage() {
|
||||
{ssoError && (
|
||||
<div className="flex items-start gap-2 rounded-lg bg-state-destructive-hover p-3">
|
||||
<span className="mt-0.5 i-ri-close-circle-line h-4 w-4 shrink-0 text-util-colors-red-red-600" />
|
||||
<p className="text-sm text-text-destructive">{ssoErrorCopy(ssoError)}</p>
|
||||
<p className="text-sm text-text-destructive">{ssoErrorCopy(ssoError, t)}</p>
|
||||
</div>
|
||||
)}
|
||||
<div>
|
||||
<h1 className="text-2xl font-semibold text-text-primary">Authorize Dify CLI</h1>
|
||||
<h1 className="text-2xl font-semibold text-text-primary">{t('codeEntry.title')}</h1>
|
||||
<p className="mt-2 text-sm text-text-secondary">
|
||||
Enter the code shown in your terminal.
|
||||
{t('codeEntry.subtitle')}
|
||||
</p>
|
||||
</div>
|
||||
<CodeInput value={typed} onChange={setTyped} autoFocus />
|
||||
@ -144,7 +146,7 @@ export default function DevicePage() {
|
||||
onClick={onContinue}
|
||||
disabled={!isValidUserCode(typed)}
|
||||
>
|
||||
Continue
|
||||
{t('codeEntry.continue')}
|
||||
</Button>
|
||||
</div>
|
||||
)}
|
||||
@ -152,13 +154,14 @@ export default function DevicePage() {
|
||||
{view.kind === 'chooser' && (
|
||||
<div className="flex flex-col gap-5">
|
||||
<div>
|
||||
<h1 className="text-2xl font-semibold text-text-primary">Sign in to authorize</h1>
|
||||
<h1 className="text-2xl font-semibold text-text-primary">{t('chooser.title')}</h1>
|
||||
<p className="mt-2 text-sm text-text-secondary">
|
||||
Code
|
||||
{' '}
|
||||
<code className="rounded bg-components-input-bg-normal px-1 font-mono">{view.userCode}</code>
|
||||
{' '}
|
||||
is valid. Choose how to sign in.
|
||||
<Trans
|
||||
i18nKey="chooser.subtitle"
|
||||
ns="deviceFlow"
|
||||
values={{ code: view.userCode }}
|
||||
components={{ codeTag: <code className="rounded bg-components-input-bg-normal px-1 font-mono" /> }}
|
||||
/>
|
||||
</p>
|
||||
</div>
|
||||
<Chooser userCode={view.userCode} ssoAvailable={ssoAvailable} />
|
||||
@ -190,11 +193,11 @@ export default function DevicePage() {
|
||||
<div className="mb-2.5 flex h-[38px] w-[38px] items-center justify-center rounded-full bg-state-success-hover">
|
||||
<span className="i-ri-checkbox-circle-line h-[18px] w-[18px] text-util-colors-green-green-600" />
|
||||
</div>
|
||||
<h1 className="text-xl font-semibold text-text-primary">You're signed in</h1>
|
||||
<p className="text-sm text-text-secondary">Return to your terminal to continue.</p>
|
||||
<h1 className="text-xl font-semibold text-text-primary">{t('success.title')}</h1>
|
||||
<p className="text-sm text-text-secondary">{t('success.subtitle')}</p>
|
||||
<Divider className="my-3" />
|
||||
<Button variant="ghost" className="w-full" onClick={() => router.push('/')}>
|
||||
Go to Dify console →
|
||||
{t('success.goToConsole')}
|
||||
</Button>
|
||||
</div>
|
||||
)}
|
||||
@ -204,13 +207,13 @@ export default function DevicePage() {
|
||||
<div className="mb-2.5 flex h-[38px] w-[38px] items-center justify-center rounded-full bg-state-warning-hover">
|
||||
<span className="i-ri-error-warning-line h-[18px] w-[18px] text-util-colors-yellow-yellow-600" />
|
||||
</div>
|
||||
<h1 className="text-xl font-semibold text-text-primary">Code no longer valid</h1>
|
||||
<h1 className="text-xl font-semibold text-text-primary">{t('errorExpired.title')}</h1>
|
||||
<p className="text-sm text-text-secondary">
|
||||
Expired or already used. Run
|
||||
{' '}
|
||||
<code className="rounded bg-components-input-bg-normal px-1 font-mono">difyctl auth login</code>
|
||||
{' '}
|
||||
to get a new code.
|
||||
<Trans
|
||||
i18nKey="errorExpired.body"
|
||||
ns="deviceFlow"
|
||||
components={{ codeTag: <code className="rounded bg-components-input-bg-normal px-1 font-mono" /> }}
|
||||
/>
|
||||
</p>
|
||||
<Divider className="my-3" />
|
||||
<Button
|
||||
@ -221,7 +224,7 @@ export default function DevicePage() {
|
||||
setErrMsg(null)
|
||||
}}
|
||||
>
|
||||
← Try a different code
|
||||
{t('errorExpired.tryDifferentCode')}
|
||||
</Button>
|
||||
</div>
|
||||
)}
|
||||
@ -231,8 +234,8 @@ export default function DevicePage() {
|
||||
<div className="mb-2.5 flex h-[38px] w-[38px] items-center justify-center rounded-full bg-state-warning-hover">
|
||||
<span className="i-ri-error-warning-line h-[18px] w-[18px] text-util-colors-yellow-yellow-600" />
|
||||
</div>
|
||||
<h1 className="text-xl font-semibold text-text-primary">Too many attempts</h1>
|
||||
<p className="text-sm text-text-secondary">Wait a moment and try again.</p>
|
||||
<h1 className="text-xl font-semibold text-text-primary">{t('errorRateLimited.title')}</h1>
|
||||
<p className="text-sm text-text-secondary">{t('errorRateLimited.body')}</p>
|
||||
<Divider className="my-3" />
|
||||
<Button
|
||||
variant="ghost"
|
||||
@ -242,7 +245,7 @@ export default function DevicePage() {
|
||||
setErrMsg(null)
|
||||
}}
|
||||
>
|
||||
← Try again
|
||||
{t('tryAgain')}
|
||||
</Button>
|
||||
</div>
|
||||
)}
|
||||
@ -252,9 +255,9 @@ export default function DevicePage() {
|
||||
<div className="mb-2.5 flex h-[38px] w-[38px] items-center justify-center rounded-full bg-state-destructive-hover">
|
||||
<span className="i-ri-close-circle-line h-[18px] w-[18px] text-util-colors-red-red-600" />
|
||||
</div>
|
||||
<h1 className="text-xl font-semibold text-text-primary">Could not verify the code</h1>
|
||||
<h1 className="text-xl font-semibold text-text-primary">{t('errorLookupFailed.title')}</h1>
|
||||
<p className="text-sm text-text-secondary">
|
||||
Something went wrong on our side. Try again in a moment.
|
||||
{t('errorLookupFailed.body')}
|
||||
</p>
|
||||
<Divider className="my-3" />
|
||||
<Button
|
||||
@ -265,7 +268,7 @@ export default function DevicePage() {
|
||||
setErrMsg(null)
|
||||
}}
|
||||
>
|
||||
← Try again
|
||||
{t('tryAgain')}
|
||||
</Button>
|
||||
</div>
|
||||
)}
|
||||
|
||||
@ -1,45 +1,46 @@
|
||||
// Translate a DeviceFlowError (or any thrown value) into user-facing copy.
|
||||
// Centralised so account/SSO branches surface the same words for the same
|
||||
// failure mode and so a new server error code can be wired up here once.
|
||||
// failure mode and so a new server error code can be wired up here once —
|
||||
// this maps a server code to an i18n key, then the key to translated copy.
|
||||
|
||||
import type { TFunction } from 'i18next'
|
||||
import type deviceFlowResources from '@/i18n/en-US/device-flow.json'
|
||||
import { DeviceFlowError } from '@/service/device-flow'
|
||||
|
||||
const APPROVE_COPY: Record<string, string> = {
|
||||
rate_limited: 'Too many attempts. Wait a moment and try again.',
|
||||
no_session: 'Your session has expired. Run difyctl auth login again to start over.',
|
||||
invalid_session: 'Your session has expired. Run difyctl auth login again to start over.',
|
||||
session_already_consumed: 'This session was already used. Run difyctl auth login again.',
|
||||
csrf_mismatch: 'Could not verify the request. Refresh the page and try again.',
|
||||
forbidden: 'Could not verify the request. Refresh the page and try again.',
|
||||
expired_or_unknown: 'This code is no longer valid.',
|
||||
not_found: 'This code is no longer valid.',
|
||||
user_code_mismatch: 'This code does not match the active session. Run difyctl auth login again.',
|
||||
user_code_not_pending: 'This code was already approved or denied.',
|
||||
already_resolved: 'This code was already approved or denied.',
|
||||
state_lost: 'The flow expired before approval completed. Run difyctl auth login again.',
|
||||
approve_in_progress: 'An approval is already in progress for this code.',
|
||||
conflict: 'This code is no longer in a state we can approve.',
|
||||
server_error: 'Something went wrong on our side. Try again in a moment.',
|
||||
type DeviceFlowKey = keyof typeof deviceFlowResources
|
||||
|
||||
const APPROVE_KEY: Record<string, DeviceFlowKey> = {
|
||||
rate_limited: 'approveError.rateLimited',
|
||||
no_session: 'approveError.sessionExpired',
|
||||
invalid_session: 'approveError.sessionExpired',
|
||||
session_already_consumed: 'approveError.sessionConsumed',
|
||||
csrf_mismatch: 'approveError.verifyFailed',
|
||||
forbidden: 'approveError.verifyFailed',
|
||||
expired_or_unknown: 'approveError.codeInvalid',
|
||||
not_found: 'approveError.codeInvalid',
|
||||
user_code_mismatch: 'approveError.codeMismatch',
|
||||
user_code_not_pending: 'approveError.codeResolved',
|
||||
already_resolved: 'approveError.codeResolved',
|
||||
state_lost: 'approveError.flowExpired',
|
||||
approve_in_progress: 'approveError.inProgress',
|
||||
conflict: 'approveError.conflict',
|
||||
server_error: 'approveError.serverError',
|
||||
}
|
||||
|
||||
const DEFAULT_MESSAGE = 'Could not complete the request. Please try again.'
|
||||
|
||||
export function approveErrorCopy(err: unknown): string {
|
||||
export function approveErrorCopy(err: unknown, t: TFunction<'deviceFlow'>): string {
|
||||
if (err instanceof DeviceFlowError)
|
||||
return APPROVE_COPY[err.code] ?? DEFAULT_MESSAGE
|
||||
return DEFAULT_MESSAGE
|
||||
return t(APPROVE_KEY[err.code] ?? 'approveError.default')
|
||||
return t('approveError.default')
|
||||
}
|
||||
|
||||
// SSO-branch failures arrive as a `sso_error` query param set by the backend
|
||||
// (oauth_device_sso sso-complete) when it redirects back to /device.
|
||||
const SSO_ERROR_COPY: Record<string, string> = {
|
||||
email_belongs_to_dify_account: 'This identity is linked to a Dify account. Use “Sign in with Dify account” instead.',
|
||||
const SSO_ERROR_KEY: Record<string, DeviceFlowKey> = {
|
||||
email_belongs_to_dify_account: 'ssoError.emailBelongsToDifyAccount',
|
||||
}
|
||||
|
||||
const DEFAULT_SSO_ERROR_MESSAGE = 'Single sign-on could not be completed. Try again.'
|
||||
|
||||
export function ssoErrorCopy(code: string): string {
|
||||
return SSO_ERROR_COPY[code] ?? DEFAULT_SSO_ERROR_MESSAGE
|
||||
export function ssoErrorCopy(code: string, t: TFunction<'deviceFlow'>): string {
|
||||
return t(SSO_ERROR_KEY[code] ?? 'ssoError.default')
|
||||
}
|
||||
|
||||
export type LookupOutcome = 'expired' | 'rate_limited' | 'failed'
|
||||
|
||||
@ -15,6 +15,7 @@ import type datasetPipeline from '../i18n/en-US/dataset-pipeline.json'
|
||||
import type datasetSettings from '../i18n/en-US/dataset-settings.json'
|
||||
import type dataset from '../i18n/en-US/dataset.json'
|
||||
import type deployments from '../i18n/en-US/deployments.json'
|
||||
import type deviceFlow from '../i18n/en-US/device-flow.json'
|
||||
import type education from '../i18n/en-US/education.json'
|
||||
import type explore from '../i18n/en-US/explore.json'
|
||||
import type layout from '../i18n/en-US/layout.json'
|
||||
@ -53,6 +54,7 @@ export type Resources = {
|
||||
datasetPipeline: typeof datasetPipeline
|
||||
datasetSettings: typeof datasetSettings
|
||||
deployments: typeof deployments
|
||||
deviceFlow: typeof deviceFlow
|
||||
education: typeof education
|
||||
explore: typeof explore
|
||||
layout: typeof layout
|
||||
@ -91,6 +93,7 @@ export const namespaces = [
|
||||
'datasetPipeline',
|
||||
'datasetSettings',
|
||||
'deployments',
|
||||
'deviceFlow',
|
||||
'education',
|
||||
'explore',
|
||||
'layout',
|
||||
|
||||
45
web/i18n/ar-TN/device-flow.json
Normal file
45
web/i18n/ar-TN/device-flow.json
Normal file
@ -0,0 +1,45 @@
|
||||
{
|
||||
"approveError.codeInvalid": "لم يعد هذا الرمز صالحًا.",
|
||||
"approveError.codeMismatch": "هذا الرمز لا يتطابق مع الجلسة النشطة. شغّل difyctl auth login مرة أخرى.",
|
||||
"approveError.codeResolved": "تمت الموافقة على هذا الرمز أو رفضه بالفعل.",
|
||||
"approveError.conflict": "لم يعد هذا الرمز في حالة يمكننا الموافقة عليها.",
|
||||
"approveError.default": "تعذّر إتمام الطلب. يرجى المحاولة مرة أخرى.",
|
||||
"approveError.flowExpired": "انتهت صلاحية العملية قبل اكتمال الموافقة. شغّل difyctl auth login مرة أخرى.",
|
||||
"approveError.inProgress": "هناك موافقة قيد التنفيذ بالفعل لهذا الرمز.",
|
||||
"approveError.rateLimited": "عدد كبير جدًا من المحاولات. انتظر لحظة وحاول مرة أخرى.",
|
||||
"approveError.serverError": "حدث خطأ ما من جانبنا. حاول مرة أخرى بعد لحظة.",
|
||||
"approveError.sessionConsumed": "تم استخدام هذه الجلسة بالفعل. شغّل difyctl auth login مرة أخرى.",
|
||||
"approveError.sessionExpired": "انتهت صلاحية جلستك. شغّل difyctl auth login مرة أخرى للبدء من جديد.",
|
||||
"approveError.verifyFailed": "تعذّر التحقق من الطلب. أعد تحميل الصفحة وحاول مرة أخرى.",
|
||||
"authorize.accountSubtitle": "يطلب difyctl الوصول. إذا لم تبدأ هذا من الطرفية الخاصة بك، فانقر على إلغاء.",
|
||||
"authorize.approve": "تفويض",
|
||||
"authorize.identityProvider": "مزوّد الهوية:",
|
||||
"authorize.loadingSession": "جارٍ تحميل الجلسة…",
|
||||
"authorize.sessionInvalidBody": "شغّل <codeTag>difyctl auth login</codeTag> مرة أخرى لبدء تسجيل دخول جديد.",
|
||||
"authorize.sessionInvalidTitle": "لم تعد هذه الجلسة صالحة",
|
||||
"authorize.ssoSubtitle": "يطلب difyctl الوصول عبر SSO. إذا لم تبدأ هذا من الطرفية الخاصة بك، فأغلق هذا التبويب.",
|
||||
"authorize.title": "تفويض difyctl",
|
||||
"authorize.viaSSO": "عبر SSO",
|
||||
"authorize.workspace": "مساحة العمل:",
|
||||
"chooser.signInAccount": "تسجيل الدخول بحساب Dify",
|
||||
"chooser.signInSSO": "تسجيل الدخول عبر SSO",
|
||||
"chooser.subtitle": "الرمز <codeTag>{{code}}</codeTag> صالح. اختر طريقة تسجيل الدخول.",
|
||||
"chooser.title": "سجّل الدخول للتفويض",
|
||||
"codeEntry.codeAriaLabel": "رمز لمرة واحدة",
|
||||
"codeEntry.continue": "متابعة",
|
||||
"codeEntry.subtitle": "أدخل الرمز الظاهر في الطرفية الخاصة بك.",
|
||||
"codeEntry.title": "تفويض difyctl",
|
||||
"errorExpired.body": "منتهي الصلاحية أو تم استخدامه بالفعل. شغّل <codeTag>difyctl auth login</codeTag> للحصول على رمز جديد.",
|
||||
"errorExpired.title": "الرمز لم يعد صالحًا",
|
||||
"errorExpired.tryDifferentCode": "← جرّب رمزًا مختلفًا",
|
||||
"errorLookupFailed.body": "حدث خطأ ما من جانبنا. حاول مرة أخرى بعد لحظة.",
|
||||
"errorLookupFailed.title": "تعذّر التحقق من الرمز",
|
||||
"errorRateLimited.body": "انتظر لحظة وحاول مرة أخرى.",
|
||||
"errorRateLimited.title": "عدد كبير جدًا من المحاولات",
|
||||
"ssoError.default": "تعذّر إكمال تسجيل الدخول الموحّد (SSO). حاول مرة أخرى.",
|
||||
"ssoError.emailBelongsToDifyAccount": "هذه الهوية مرتبطة بحساب Dify. استخدم “تسجيل الدخول بحساب Dify” بدلاً من ذلك.",
|
||||
"success.goToConsole": "الانتقال إلى وحدة تحكم Dify →",
|
||||
"success.subtitle": "عد إلى الطرفية الخاصة بك للمتابعة.",
|
||||
"success.title": "تم تسجيل دخولك",
|
||||
"tryAgain": "← حاول مرة أخرى"
|
||||
}
|
||||
45
web/i18n/de-DE/device-flow.json
Normal file
45
web/i18n/de-DE/device-flow.json
Normal file
@ -0,0 +1,45 @@
|
||||
{
|
||||
"approveError.codeInvalid": "Dieser Code ist nicht mehr gültig.",
|
||||
"approveError.codeMismatch": "Dieser Code stimmt nicht mit der aktiven Sitzung überein. Führen Sie difyctl auth login erneut aus.",
|
||||
"approveError.codeResolved": "Dieser Code wurde bereits genehmigt oder abgelehnt.",
|
||||
"approveError.conflict": "Dieser Code befindet sich nicht mehr in einem Zustand, den wir genehmigen können.",
|
||||
"approveError.default": "Die Anfrage konnte nicht abgeschlossen werden. Bitte versuchen Sie es erneut.",
|
||||
"approveError.flowExpired": "Der Vorgang ist abgelaufen, bevor die Genehmigung abgeschlossen wurde. Führen Sie difyctl auth login erneut aus.",
|
||||
"approveError.inProgress": "Für diesen Code läuft bereits eine Genehmigung.",
|
||||
"approveError.rateLimited": "Zu viele Versuche. Warten Sie einen Moment und versuchen Sie es erneut.",
|
||||
"approveError.serverError": "Auf unserer Seite ist etwas schiefgelaufen. Versuchen Sie es in einem Moment erneut.",
|
||||
"approveError.sessionConsumed": "Diese Sitzung wurde bereits verwendet. Führen Sie difyctl auth login erneut aus.",
|
||||
"approveError.sessionExpired": "Ihre Sitzung ist abgelaufen. Führen Sie difyctl auth login erneut aus, um von vorne zu beginnen.",
|
||||
"approveError.verifyFailed": "Die Anfrage konnte nicht überprüft werden. Aktualisieren Sie die Seite und versuchen Sie es erneut.",
|
||||
"authorize.accountSubtitle": "difyctl fordert Zugriff an. Wenn Sie dies nicht von Ihrem Terminal aus gestartet haben, klicken Sie auf Abbrechen.",
|
||||
"authorize.approve": "Autorisieren",
|
||||
"authorize.identityProvider": "Identitätsanbieter:",
|
||||
"authorize.loadingSession": "Sitzung wird geladen…",
|
||||
"authorize.sessionInvalidBody": "Führen Sie <codeTag>difyctl auth login</codeTag> erneut aus, um eine neue Anmeldung zu starten.",
|
||||
"authorize.sessionInvalidTitle": "Diese Sitzung ist nicht mehr gültig",
|
||||
"authorize.ssoSubtitle": "difyctl fordert Zugriff über SSO an. Wenn Sie dies nicht von Ihrem Terminal aus gestartet haben, schließen Sie diesen Tab.",
|
||||
"authorize.title": "difyctl autorisieren",
|
||||
"authorize.viaSSO": "über SSO",
|
||||
"authorize.workspace": "Arbeitsbereich:",
|
||||
"chooser.signInAccount": "Mit Dify-Konto anmelden",
|
||||
"chooser.signInSSO": "Mit SSO anmelden",
|
||||
"chooser.subtitle": "Der Code <codeTag>{{code}}</codeTag> ist gültig. Wählen Sie eine Anmeldeoption.",
|
||||
"chooser.title": "Zur Autorisierung anmelden",
|
||||
"codeEntry.codeAriaLabel": "Einmalcode",
|
||||
"codeEntry.continue": "Weiter",
|
||||
"codeEntry.subtitle": "Geben Sie den in Ihrem Terminal angezeigten Code ein.",
|
||||
"codeEntry.title": "difyctl autorisieren",
|
||||
"errorExpired.body": "Abgelaufen oder bereits verwendet. Führen Sie <codeTag>difyctl auth login</codeTag> aus, um einen neuen Code zu erhalten.",
|
||||
"errorExpired.title": "Code nicht mehr gültig",
|
||||
"errorExpired.tryDifferentCode": "← Anderen Code versuchen",
|
||||
"errorLookupFailed.body": "Auf unserer Seite ist etwas schiefgelaufen. Versuchen Sie es in einem Moment erneut.",
|
||||
"errorLookupFailed.title": "Code konnte nicht überprüft werden",
|
||||
"errorRateLimited.body": "Warten Sie einen Moment und versuchen Sie es erneut.",
|
||||
"errorRateLimited.title": "Zu viele Versuche",
|
||||
"ssoError.default": "Single Sign-on konnte nicht abgeschlossen werden. Versuchen Sie es erneut.",
|
||||
"ssoError.emailBelongsToDifyAccount": "Diese Identität ist mit einem Dify-Konto verknüpft. Verwenden Sie stattdessen „Mit Dify-Konto anmelden“.",
|
||||
"success.goToConsole": "Zur Dify-Konsole →",
|
||||
"success.subtitle": "Kehren Sie zu Ihrem Terminal zurück, um fortzufahren.",
|
||||
"success.title": "Sie sind angemeldet",
|
||||
"tryAgain": "← Erneut versuchen"
|
||||
}
|
||||
45
web/i18n/en-US/device-flow.json
Normal file
45
web/i18n/en-US/device-flow.json
Normal file
@ -0,0 +1,45 @@
|
||||
{
|
||||
"approveError.codeInvalid": "This code is no longer valid.",
|
||||
"approveError.codeMismatch": "This code does not match the active session. Run difyctl auth login again.",
|
||||
"approveError.codeResolved": "This code was already approved or denied.",
|
||||
"approveError.conflict": "This code is no longer in a state we can approve.",
|
||||
"approveError.default": "Could not complete the request. Please try again.",
|
||||
"approveError.flowExpired": "The flow expired before approval completed. Run difyctl auth login again.",
|
||||
"approveError.inProgress": "An approval is already in progress for this code.",
|
||||
"approveError.rateLimited": "Too many attempts. Wait a moment and try again.",
|
||||
"approveError.serverError": "Something went wrong on our side. Try again in a moment.",
|
||||
"approveError.sessionConsumed": "This session was already used. Run difyctl auth login again.",
|
||||
"approveError.sessionExpired": "Your session has expired. Run difyctl auth login again to start over.",
|
||||
"approveError.verifyFailed": "Could not verify the request. Refresh the page and try again.",
|
||||
"authorize.accountSubtitle": "difyctl is requesting access. If you didn't start this from your terminal, click Cancel.",
|
||||
"authorize.approve": "Authorize",
|
||||
"authorize.identityProvider": "Identity provider:",
|
||||
"authorize.loadingSession": "Loading session…",
|
||||
"authorize.sessionInvalidBody": "Run <codeTag>difyctl auth login</codeTag> again to start a new sign-in.",
|
||||
"authorize.sessionInvalidTitle": "This session is no longer valid",
|
||||
"authorize.ssoSubtitle": "difyctl is requesting access via SSO. If you didn't start this from your terminal, close this tab.",
|
||||
"authorize.title": "Authorize difyctl",
|
||||
"authorize.viaSSO": "via SSO",
|
||||
"authorize.workspace": "Workspace:",
|
||||
"chooser.signInAccount": "Sign in with Dify account",
|
||||
"chooser.signInSSO": "Sign in with SSO",
|
||||
"chooser.subtitle": "Code <codeTag>{{code}}</codeTag> is valid. Choose how to sign in.",
|
||||
"chooser.title": "Sign in to authorize",
|
||||
"codeEntry.codeAriaLabel": "one-time code",
|
||||
"codeEntry.continue": "Continue",
|
||||
"codeEntry.subtitle": "Enter the code shown in your terminal.",
|
||||
"codeEntry.title": "Authorize difyctl",
|
||||
"errorExpired.body": "Expired or already used. Run <codeTag>difyctl auth login</codeTag> to get a new code.",
|
||||
"errorExpired.title": "Code no longer valid",
|
||||
"errorExpired.tryDifferentCode": "← Try a different code",
|
||||
"errorLookupFailed.body": "Something went wrong on our side. Try again in a moment.",
|
||||
"errorLookupFailed.title": "Could not verify the code",
|
||||
"errorRateLimited.body": "Wait a moment and try again.",
|
||||
"errorRateLimited.title": "Too many attempts",
|
||||
"ssoError.default": "Single sign-on could not be completed. Try again.",
|
||||
"ssoError.emailBelongsToDifyAccount": "This identity is linked to a Dify account. Use “Sign in with Dify account” instead.",
|
||||
"success.goToConsole": "Go to Dify console →",
|
||||
"success.subtitle": "Return to your terminal to continue.",
|
||||
"success.title": "You're signed in",
|
||||
"tryAgain": "← Try again"
|
||||
}
|
||||
45
web/i18n/es-ES/device-flow.json
Normal file
45
web/i18n/es-ES/device-flow.json
Normal file
@ -0,0 +1,45 @@
|
||||
{
|
||||
"approveError.codeInvalid": "Este código ya no es válido.",
|
||||
"approveError.codeMismatch": "Este código no coincide con la sesión activa. Ejecuta difyctl auth login de nuevo.",
|
||||
"approveError.codeResolved": "Este código ya fue aprobado o rechazado.",
|
||||
"approveError.conflict": "Este código ya no está en un estado que podamos aprobar.",
|
||||
"approveError.default": "No se pudo completar la solicitud. Inténtalo de nuevo.",
|
||||
"approveError.flowExpired": "El proceso expiró antes de completar la aprobación. Ejecuta difyctl auth login de nuevo.",
|
||||
"approveError.inProgress": "Ya hay una aprobación en curso para este código.",
|
||||
"approveError.rateLimited": "Demasiados intentos. Espera un momento e inténtalo de nuevo.",
|
||||
"approveError.serverError": "Algo salió mal de nuestro lado. Inténtalo de nuevo en un momento.",
|
||||
"approveError.sessionConsumed": "Esta sesión ya fue utilizada. Ejecuta difyctl auth login de nuevo.",
|
||||
"approveError.sessionExpired": "Tu sesión ha expirado. Ejecuta difyctl auth login de nuevo para empezar otra vez.",
|
||||
"approveError.verifyFailed": "No se pudo verificar la solicitud. Actualiza la página e inténtalo de nuevo.",
|
||||
"authorize.accountSubtitle": "difyctl está solicitando acceso. Si no iniciaste esto desde tu terminal, haz clic en Cancelar.",
|
||||
"authorize.approve": "Autorizar",
|
||||
"authorize.identityProvider": "Proveedor de identidad:",
|
||||
"authorize.loadingSession": "Cargando sesión…",
|
||||
"authorize.sessionInvalidBody": "Ejecuta <codeTag>difyctl auth login</codeTag> de nuevo para iniciar un nuevo inicio de sesión.",
|
||||
"authorize.sessionInvalidTitle": "Esta sesión ya no es válida",
|
||||
"authorize.ssoSubtitle": "difyctl está solicitando acceso mediante SSO. Si no iniciaste esto desde tu terminal, cierra esta pestaña.",
|
||||
"authorize.title": "Autorizar difyctl",
|
||||
"authorize.viaSSO": "mediante SSO",
|
||||
"authorize.workspace": "Espacio de trabajo:",
|
||||
"chooser.signInAccount": "Iniciar sesión con cuenta de Dify",
|
||||
"chooser.signInSSO": "Iniciar sesión con SSO",
|
||||
"chooser.subtitle": "El código <codeTag>{{code}}</codeTag> es válido. Elige cómo iniciar sesión.",
|
||||
"chooser.title": "Inicia sesión para autorizar",
|
||||
"codeEntry.codeAriaLabel": "código de un solo uso",
|
||||
"codeEntry.continue": "Continuar",
|
||||
"codeEntry.subtitle": "Introduce el código que se muestra en tu terminal.",
|
||||
"codeEntry.title": "Autorizar difyctl",
|
||||
"errorExpired.body": "Ha expirado o ya se utilizó. Ejecuta <codeTag>difyctl auth login</codeTag> para obtener un código nuevo.",
|
||||
"errorExpired.title": "El código ya no es válido",
|
||||
"errorExpired.tryDifferentCode": "← Probar con otro código",
|
||||
"errorLookupFailed.body": "Algo salió mal de nuestro lado. Inténtalo de nuevo en un momento.",
|
||||
"errorLookupFailed.title": "No se pudo verificar el código",
|
||||
"errorRateLimited.body": "Espera un momento e inténtalo de nuevo.",
|
||||
"errorRateLimited.title": "Demasiados intentos",
|
||||
"ssoError.default": "No se pudo completar el inicio de sesión único. Inténtalo de nuevo.",
|
||||
"ssoError.emailBelongsToDifyAccount": "Esta identidad está vinculada a una cuenta de Dify. Usa “Iniciar sesión con cuenta de Dify” en su lugar.",
|
||||
"success.goToConsole": "Ir a la consola de Dify →",
|
||||
"success.subtitle": "Vuelve a tu terminal para continuar.",
|
||||
"success.title": "Has iniciado sesión",
|
||||
"tryAgain": "← Intentar de nuevo"
|
||||
}
|
||||
45
web/i18n/fa-IR/device-flow.json
Normal file
45
web/i18n/fa-IR/device-flow.json
Normal file
@ -0,0 +1,45 @@
|
||||
{
|
||||
"approveError.codeInvalid": "این کد دیگر معتبر نیست.",
|
||||
"approveError.codeMismatch": "این کد با نشست فعال مطابقت ندارد. دوباره difyctl auth login را اجرا کنید.",
|
||||
"approveError.codeResolved": "این کد قبلاً تأیید یا رد شده است.",
|
||||
"approveError.conflict": "این کد دیگر در وضعیتی نیست که بتوانیم آن را تأیید کنیم.",
|
||||
"approveError.default": "درخواست کامل نشد. لطفاً دوباره امتحان کنید.",
|
||||
"approveError.flowExpired": "قبل از تکمیل تأیید، فرآیند منقضی شد. دوباره difyctl auth login را اجرا کنید.",
|
||||
"approveError.inProgress": "یک تأیید برای این کد در حال انجام است.",
|
||||
"approveError.rateLimited": "تعداد تلاشها بیش از حد است. کمی صبر کنید و دوباره امتحان کنید.",
|
||||
"approveError.serverError": "مشکلی از سمت ما پیش آمد. کمی بعد دوباره امتحان کنید.",
|
||||
"approveError.sessionConsumed": "این نشست قبلاً استفاده شده است. دوباره difyctl auth login را اجرا کنید.",
|
||||
"approveError.sessionExpired": "نشست شما منقضی شده است. برای شروع دوباره، difyctl auth login را دوباره اجرا کنید.",
|
||||
"approveError.verifyFailed": "تأیید درخواست ممکن نشد. صفحه را تازهسازی کنید و دوباره امتحان کنید.",
|
||||
"authorize.accountSubtitle": "difyctl درخواست دسترسی دارد. اگر این کار را از ترمینال خود شروع نکردهاید، روی لغو کلیک کنید.",
|
||||
"authorize.approve": "تأیید",
|
||||
"authorize.identityProvider": "ارائهدهنده هویت:",
|
||||
"authorize.loadingSession": "در حال بارگذاری نشست…",
|
||||
"authorize.sessionInvalidBody": "برای شروع یک ورود جدید، دوباره <codeTag>difyctl auth login</codeTag> را اجرا کنید.",
|
||||
"authorize.sessionInvalidTitle": "این نشست دیگر معتبر نیست",
|
||||
"authorize.ssoSubtitle": "difyctl از طریق SSO درخواست دسترسی دارد. اگر این کار را از ترمینال خود شروع نکردهاید، این تب را ببندید.",
|
||||
"authorize.title": "تأیید difyctl",
|
||||
"authorize.viaSSO": "از طریق SSO",
|
||||
"authorize.workspace": "فضای کاری:",
|
||||
"chooser.signInAccount": "ورود با حساب Dify",
|
||||
"chooser.signInSSO": "ورود با SSO",
|
||||
"chooser.subtitle": "کد <codeTag>{{code}}</codeTag> معتبر است. نحوه ورود را انتخاب کنید.",
|
||||
"chooser.title": "برای تأیید وارد شوید",
|
||||
"codeEntry.codeAriaLabel": "کد یکبار مصرف",
|
||||
"codeEntry.continue": "ادامه",
|
||||
"codeEntry.subtitle": "کدی را که در ترمینال شما نمایش داده شده وارد کنید.",
|
||||
"codeEntry.title": "تأیید difyctl",
|
||||
"errorExpired.body": "منقضی شده یا قبلاً استفاده شده است. برای دریافت کد جدید، <codeTag>difyctl auth login</codeTag> را اجرا کنید.",
|
||||
"errorExpired.title": "کد دیگر معتبر نیست",
|
||||
"errorExpired.tryDifferentCode": "← کد دیگری را امتحان کنید",
|
||||
"errorLookupFailed.body": "مشکلی از سمت ما پیش آمد. کمی بعد دوباره امتحان کنید.",
|
||||
"errorLookupFailed.title": "تأیید کد ممکن نشد",
|
||||
"errorRateLimited.body": "کمی صبر کنید و دوباره امتحان کنید.",
|
||||
"errorRateLimited.title": "تعداد تلاشها بیش از حد است",
|
||||
"ssoError.default": "ورود یکپارچه (SSO) تکمیل نشد. دوباره امتحان کنید.",
|
||||
"ssoError.emailBelongsToDifyAccount": "این هویت به یک حساب Dify متصل است. در عوض از «ورود با حساب Dify» استفاده کنید.",
|
||||
"success.goToConsole": "رفتن به کنسول Dify →",
|
||||
"success.subtitle": "برای ادامه به ترمینال خود بازگردید.",
|
||||
"success.title": "وارد شدید",
|
||||
"tryAgain": "← دوباره امتحان کنید"
|
||||
}
|
||||
45
web/i18n/fr-FR/device-flow.json
Normal file
45
web/i18n/fr-FR/device-flow.json
Normal file
@ -0,0 +1,45 @@
|
||||
{
|
||||
"approveError.codeInvalid": "Ce code n'est plus valide.",
|
||||
"approveError.codeMismatch": "Ce code ne correspond pas à la session active. Exécutez à nouveau difyctl auth login.",
|
||||
"approveError.codeResolved": "Ce code a déjà été approuvé ou refusé.",
|
||||
"approveError.conflict": "Ce code n'est plus dans un état que nous pouvons approuver.",
|
||||
"approveError.default": "Impossible de terminer la demande. Veuillez réessayer.",
|
||||
"approveError.flowExpired": "Le processus a expiré avant la fin de l'approbation. Exécutez à nouveau difyctl auth login.",
|
||||
"approveError.inProgress": "Une approbation est déjà en cours pour ce code.",
|
||||
"approveError.rateLimited": "Trop de tentatives. Attendez un instant puis réessayez.",
|
||||
"approveError.serverError": "Une erreur s'est produite de notre côté. Réessayez dans un instant.",
|
||||
"approveError.sessionConsumed": "Cette session a déjà été utilisée. Exécutez à nouveau difyctl auth login.",
|
||||
"approveError.sessionExpired": "Votre session a expiré. Exécutez à nouveau difyctl auth login pour recommencer.",
|
||||
"approveError.verifyFailed": "Impossible de vérifier la demande. Actualisez la page puis réessayez.",
|
||||
"authorize.accountSubtitle": "difyctl demande l'accès. Si vous n'avez pas lancé cette action depuis votre terminal, cliquez sur Annuler.",
|
||||
"authorize.approve": "Autoriser",
|
||||
"authorize.identityProvider": "Fournisseur d'identité :",
|
||||
"authorize.loadingSession": "Chargement de la session…",
|
||||
"authorize.sessionInvalidBody": "Exécutez à nouveau <codeTag>difyctl auth login</codeTag> pour démarrer une nouvelle connexion.",
|
||||
"authorize.sessionInvalidTitle": "Cette session n'est plus valide",
|
||||
"authorize.ssoSubtitle": "difyctl demande l'accès via SSO. Si vous n'avez pas lancé cette action depuis votre terminal, fermez cet onglet.",
|
||||
"authorize.title": "Autoriser difyctl",
|
||||
"authorize.viaSSO": "via SSO",
|
||||
"authorize.workspace": "Espace de travail :",
|
||||
"chooser.signInAccount": "Se connecter avec un compte Dify",
|
||||
"chooser.signInSSO": "Se connecter avec SSO",
|
||||
"chooser.subtitle": "Le code <codeTag>{{code}}</codeTag> est valide. Choisissez votre mode de connexion.",
|
||||
"chooser.title": "Connectez-vous pour autoriser",
|
||||
"codeEntry.codeAriaLabel": "code à usage unique",
|
||||
"codeEntry.continue": "Continuer",
|
||||
"codeEntry.subtitle": "Saisissez le code affiché dans votre terminal.",
|
||||
"codeEntry.title": "Autoriser difyctl",
|
||||
"errorExpired.body": "Expiré ou déjà utilisé. Exécutez <codeTag>difyctl auth login</codeTag> pour obtenir un nouveau code.",
|
||||
"errorExpired.title": "Le code n'est plus valide",
|
||||
"errorExpired.tryDifferentCode": "← Essayer un autre code",
|
||||
"errorLookupFailed.body": "Une erreur s'est produite de notre côté. Réessayez dans un instant.",
|
||||
"errorLookupFailed.title": "Impossible de vérifier le code",
|
||||
"errorRateLimited.body": "Attendez un instant puis réessayez.",
|
||||
"errorRateLimited.title": "Trop de tentatives",
|
||||
"ssoError.default": "L'authentification unique n'a pas pu être terminée. Réessayez.",
|
||||
"ssoError.emailBelongsToDifyAccount": "Cette identité est liée à un compte Dify. Utilisez plutôt « Se connecter avec un compte Dify ».",
|
||||
"success.goToConsole": "Aller à la console Dify →",
|
||||
"success.subtitle": "Retournez à votre terminal pour continuer.",
|
||||
"success.title": "Vous êtes connecté",
|
||||
"tryAgain": "← Réessayer"
|
||||
}
|
||||
45
web/i18n/hi-IN/device-flow.json
Normal file
45
web/i18n/hi-IN/device-flow.json
Normal file
@ -0,0 +1,45 @@
|
||||
{
|
||||
"approveError.codeInvalid": "यह कोड अब मान्य नहीं है।",
|
||||
"approveError.codeMismatch": "यह कोड सक्रिय सत्र से मेल नहीं खाता। difyctl auth login फिर से चलाएँ।",
|
||||
"approveError.codeResolved": "इस कोड को पहले ही स्वीकृत या अस्वीकृत किया जा चुका है।",
|
||||
"approveError.conflict": "यह कोड अब ऐसी स्थिति में नहीं है जिसे हम स्वीकृत कर सकें।",
|
||||
"approveError.default": "अनुरोध पूरा नहीं हो सका। कृपया फिर से प्रयास करें।",
|
||||
"approveError.flowExpired": "स्वीकृति पूरी होने से पहले ही प्रक्रिया समाप्त हो गई। difyctl auth login फिर से चलाएँ।",
|
||||
"approveError.inProgress": "इस कोड के लिए पहले से ही एक स्वीकृति प्रक्रिया चल रही है।",
|
||||
"approveError.rateLimited": "बहुत अधिक प्रयास। कृपया कुछ समय रुकें और फिर से प्रयास करें।",
|
||||
"approveError.serverError": "हमारी ओर से कुछ गड़बड़ हो गई। कृपया थोड़ी देर बाद फिर से प्रयास करें।",
|
||||
"approveError.sessionConsumed": "इस सत्र का पहले ही उपयोग किया जा चुका है। difyctl auth login फिर से चलाएँ।",
|
||||
"approveError.sessionExpired": "आपका सत्र समाप्त हो गया है। फिर से शुरू करने के लिए difyctl auth login फिर से चलाएँ।",
|
||||
"approveError.verifyFailed": "अनुरोध सत्यापित नहीं हो सका। पृष्ठ को रीफ़्रेश करें और फिर से प्रयास करें।",
|
||||
"authorize.accountSubtitle": "difyctl पहुँच का अनुरोध कर रहा है। यदि आपने इसे अपने टर्मिनल से शुरू नहीं किया है, तो रद्द करें पर क्लिक करें।",
|
||||
"authorize.approve": "अधिकृत करें",
|
||||
"authorize.identityProvider": "पहचान प्रदाता:",
|
||||
"authorize.loadingSession": "सत्र लोड हो रहा है…",
|
||||
"authorize.sessionInvalidBody": "नया साइन-इन शुरू करने के लिए <codeTag>difyctl auth login</codeTag> फिर से चलाएँ।",
|
||||
"authorize.sessionInvalidTitle": "यह सत्र अब मान्य नहीं है",
|
||||
"authorize.ssoSubtitle": "difyctl SSO के माध्यम से पहुँच का अनुरोध कर रहा है। यदि आपने इसे अपने टर्मिनल से शुरू नहीं किया है, तो इस टैब को बंद करें।",
|
||||
"authorize.title": "difyctl को अधिकृत करें",
|
||||
"authorize.viaSSO": "SSO के माध्यम से",
|
||||
"authorize.workspace": "कार्यक्षेत्र:",
|
||||
"chooser.signInAccount": "Dify खाते से साइन इन करें",
|
||||
"chooser.signInSSO": "SSO से साइन इन करें",
|
||||
"chooser.subtitle": "कोड <codeTag>{{code}}</codeTag> मान्य है। साइन इन करने का तरीका चुनें।",
|
||||
"chooser.title": "अधिकृत करने के लिए साइन इन करें",
|
||||
"codeEntry.codeAriaLabel": "एक बार उपयोग होने वाला कोड",
|
||||
"codeEntry.continue": "जारी रखें",
|
||||
"codeEntry.subtitle": "अपने टर्मिनल में दिखाया गया कोड दर्ज करें।",
|
||||
"codeEntry.title": "difyctl को अधिकृत करें",
|
||||
"errorExpired.body": "समाप्त हो गया है या पहले ही उपयोग किया जा चुका है। नया कोड पाने के लिए <codeTag>difyctl auth login</codeTag> चलाएँ।",
|
||||
"errorExpired.title": "कोड अब मान्य नहीं है",
|
||||
"errorExpired.tryDifferentCode": "← कोई दूसरा कोड आज़माएँ",
|
||||
"errorLookupFailed.body": "हमारी ओर से कुछ गड़बड़ हो गई। कृपया थोड़ी देर बाद फिर से प्रयास करें।",
|
||||
"errorLookupFailed.title": "कोड सत्यापित नहीं हो सका",
|
||||
"errorRateLimited.body": "कृपया कुछ समय रुकें और फिर से प्रयास करें।",
|
||||
"errorRateLimited.title": "बहुत अधिक प्रयास",
|
||||
"ssoError.default": "सिंगल साइन-ऑन पूरा नहीं हो सका। फिर से प्रयास करें।",
|
||||
"ssoError.emailBelongsToDifyAccount": "यह पहचान एक Dify खाते से जुड़ी है। इसके बजाय “Dify खाते से साइन इन करें” का उपयोग करें।",
|
||||
"success.goToConsole": "Dify कंसोल पर जाएँ →",
|
||||
"success.subtitle": "जारी रखने के लिए अपने टर्मिनल पर वापस जाएँ।",
|
||||
"success.title": "आपने साइन इन कर लिया है",
|
||||
"tryAgain": "← फिर से प्रयास करें"
|
||||
}
|
||||
45
web/i18n/id-ID/device-flow.json
Normal file
45
web/i18n/id-ID/device-flow.json
Normal file
@ -0,0 +1,45 @@
|
||||
{
|
||||
"approveError.codeInvalid": "Kode ini sudah tidak valid lagi.",
|
||||
"approveError.codeMismatch": "Kode ini tidak cocok dengan sesi yang aktif. Jalankan difyctl auth login lagi.",
|
||||
"approveError.codeResolved": "Kode ini sudah disetujui atau ditolak sebelumnya.",
|
||||
"approveError.conflict": "Kode ini sudah tidak dalam status yang dapat kami setujui.",
|
||||
"approveError.default": "Tidak dapat menyelesaikan permintaan. Silakan coba lagi.",
|
||||
"approveError.flowExpired": "Proses kedaluwarsa sebelum persetujuan selesai. Jalankan difyctl auth login lagi.",
|
||||
"approveError.inProgress": "Persetujuan untuk kode ini sedang berlangsung.",
|
||||
"approveError.rateLimited": "Terlalu banyak percobaan. Tunggu sebentar lalu coba lagi.",
|
||||
"approveError.serverError": "Terjadi kesalahan pada sistem kami. Coba lagi sebentar lagi.",
|
||||
"approveError.sessionConsumed": "Sesi ini sudah digunakan sebelumnya. Jalankan difyctl auth login lagi.",
|
||||
"approveError.sessionExpired": "Sesi Anda telah berakhir. Jalankan difyctl auth login lagi untuk memulai dari awal.",
|
||||
"approveError.verifyFailed": "Tidak dapat memverifikasi permintaan. Muat ulang halaman dan coba lagi.",
|
||||
"authorize.accountSubtitle": "difyctl meminta akses. Jika Anda tidak memulai ini dari terminal Anda, klik Batal.",
|
||||
"authorize.approve": "Otorisasi",
|
||||
"authorize.identityProvider": "Penyedia identitas:",
|
||||
"authorize.loadingSession": "Memuat sesi…",
|
||||
"authorize.sessionInvalidBody": "Jalankan <codeTag>difyctl auth login</codeTag> lagi untuk memulai proses masuk baru.",
|
||||
"authorize.sessionInvalidTitle": "Sesi ini sudah tidak valid lagi",
|
||||
"authorize.ssoSubtitle": "difyctl meminta akses melalui SSO. Jika Anda tidak memulai ini dari terminal Anda, tutup tab ini.",
|
||||
"authorize.title": "Otorisasi difyctl",
|
||||
"authorize.viaSSO": "melalui SSO",
|
||||
"authorize.workspace": "Ruang kerja:",
|
||||
"chooser.signInAccount": "Masuk dengan akun Dify",
|
||||
"chooser.signInSSO": "Masuk dengan SSO",
|
||||
"chooser.subtitle": "Kode <codeTag>{{code}}</codeTag> valid. Pilih cara Anda ingin masuk.",
|
||||
"chooser.title": "Masuk untuk memberikan otorisasi",
|
||||
"codeEntry.codeAriaLabel": "kode sekali pakai",
|
||||
"codeEntry.continue": "Lanjutkan",
|
||||
"codeEntry.subtitle": "Masukkan kode yang ditampilkan di terminal Anda.",
|
||||
"codeEntry.title": "Otorisasi difyctl",
|
||||
"errorExpired.body": "Sudah kedaluwarsa atau sudah digunakan. Jalankan <codeTag>difyctl auth login</codeTag> untuk mendapatkan kode baru.",
|
||||
"errorExpired.title": "Kode sudah tidak valid lagi",
|
||||
"errorExpired.tryDifferentCode": "← Coba kode lain",
|
||||
"errorLookupFailed.body": "Terjadi kesalahan pada sistem kami. Coba lagi sebentar lagi.",
|
||||
"errorLookupFailed.title": "Tidak dapat memverifikasi kode",
|
||||
"errorRateLimited.body": "Tunggu sebentar lalu coba lagi.",
|
||||
"errorRateLimited.title": "Terlalu banyak percobaan",
|
||||
"ssoError.default": "Single sign-on tidak dapat diselesaikan. Coba lagi.",
|
||||
"ssoError.emailBelongsToDifyAccount": "Identitas ini terhubung dengan akun Dify. Gunakan “Masuk dengan akun Dify” sebagai gantinya.",
|
||||
"success.goToConsole": "Buka konsol Dify →",
|
||||
"success.subtitle": "Kembali ke terminal Anda untuk melanjutkan.",
|
||||
"success.title": "Anda telah masuk",
|
||||
"tryAgain": "← Coba lagi"
|
||||
}
|
||||
45
web/i18n/it-IT/device-flow.json
Normal file
45
web/i18n/it-IT/device-flow.json
Normal file
@ -0,0 +1,45 @@
|
||||
{
|
||||
"approveError.codeInvalid": "Questo codice non è più valido.",
|
||||
"approveError.codeMismatch": "Questo codice non corrisponde alla sessione attiva. Esegui di nuovo difyctl auth login.",
|
||||
"approveError.codeResolved": "Questo codice è già stato approvato o rifiutato.",
|
||||
"approveError.conflict": "Questo codice non è più in uno stato che possiamo approvare.",
|
||||
"approveError.default": "Impossibile completare la richiesta. Riprova.",
|
||||
"approveError.flowExpired": "Il processo è scaduto prima del completamento dell'approvazione. Esegui di nuovo difyctl auth login.",
|
||||
"approveError.inProgress": "È già in corso un'approvazione per questo codice.",
|
||||
"approveError.rateLimited": "Troppi tentativi. Attendi un momento e riprova.",
|
||||
"approveError.serverError": "Si è verificato un errore da parte nostra. Riprova tra un momento.",
|
||||
"approveError.sessionConsumed": "Questa sessione è già stata utilizzata. Esegui di nuovo difyctl auth login.",
|
||||
"approveError.sessionExpired": "La tua sessione è scaduta. Esegui di nuovo difyctl auth login per ricominciare.",
|
||||
"approveError.verifyFailed": "Impossibile verificare la richiesta. Aggiorna la pagina e riprova.",
|
||||
"authorize.accountSubtitle": "difyctl sta richiedendo l'accesso. Se non hai avviato questa operazione dal tuo terminale, fai clic su Annulla.",
|
||||
"authorize.approve": "Autorizza",
|
||||
"authorize.identityProvider": "Provider di identità:",
|
||||
"authorize.loadingSession": "Caricamento sessione…",
|
||||
"authorize.sessionInvalidBody": "Esegui di nuovo <codeTag>difyctl auth login</codeTag> per avviare un nuovo accesso.",
|
||||
"authorize.sessionInvalidTitle": "Questa sessione non è più valida",
|
||||
"authorize.ssoSubtitle": "difyctl sta richiedendo l'accesso tramite SSO. Se non hai avviato questa operazione dal tuo terminale, chiudi questa scheda.",
|
||||
"authorize.title": "Autorizza difyctl",
|
||||
"authorize.viaSSO": "tramite SSO",
|
||||
"authorize.workspace": "Area di lavoro:",
|
||||
"chooser.signInAccount": "Accedi con un account Dify",
|
||||
"chooser.signInSSO": "Accedi con SSO",
|
||||
"chooser.subtitle": "Il codice <codeTag>{{code}}</codeTag> è valido. Scegli come accedere.",
|
||||
"chooser.title": "Accedi per autorizzare",
|
||||
"codeEntry.codeAriaLabel": "codice monouso",
|
||||
"codeEntry.continue": "Continua",
|
||||
"codeEntry.subtitle": "Inserisci il codice mostrato nel tuo terminale.",
|
||||
"codeEntry.title": "Autorizza difyctl",
|
||||
"errorExpired.body": "Scaduto o già utilizzato. Esegui <codeTag>difyctl auth login</codeTag> per ottenere un nuovo codice.",
|
||||
"errorExpired.title": "Il codice non è più valido",
|
||||
"errorExpired.tryDifferentCode": "← Prova un altro codice",
|
||||
"errorLookupFailed.body": "Si è verificato un errore da parte nostra. Riprova tra un momento.",
|
||||
"errorLookupFailed.title": "Impossibile verificare il codice",
|
||||
"errorRateLimited.body": "Attendi un momento e riprova.",
|
||||
"errorRateLimited.title": "Troppi tentativi",
|
||||
"ssoError.default": "Impossibile completare l'accesso Single Sign-On. Riprova.",
|
||||
"ssoError.emailBelongsToDifyAccount": "Questa identità è collegata a un account Dify. Usa invece “Accedi con un account Dify”.",
|
||||
"success.goToConsole": "Vai alla console Dify →",
|
||||
"success.subtitle": "Torna al tuo terminale per continuare.",
|
||||
"success.title": "Hai eseguito l'accesso",
|
||||
"tryAgain": "← Riprova"
|
||||
}
|
||||
45
web/i18n/ja-JP/device-flow.json
Normal file
45
web/i18n/ja-JP/device-flow.json
Normal file
@ -0,0 +1,45 @@
|
||||
{
|
||||
"approveError.codeInvalid": "このコードは無効になりました。",
|
||||
"approveError.codeMismatch": "このコードはアクティブなセッションと一致しません。もう一度 difyctl auth login を実行してください。",
|
||||
"approveError.codeResolved": "このコードはすでに承認または拒否されています。",
|
||||
"approveError.conflict": "このコードは承認できる状態ではなくなりました。",
|
||||
"approveError.default": "リクエストを完了できませんでした。もう一度お試しください。",
|
||||
"approveError.flowExpired": "承認が完了する前にフローの有効期限が切れました。もう一度 difyctl auth login を実行してください。",
|
||||
"approveError.inProgress": "このコードの承認はすでに進行中です。",
|
||||
"approveError.rateLimited": "試行回数が多すぎます。少し待ってからもう一度お試しください。",
|
||||
"approveError.serverError": "こちら側で問題が発生しました。しばらくしてからもう一度お試しください。",
|
||||
"approveError.sessionConsumed": "このセッションはすでに使用されています。もう一度 difyctl auth login を実行してください。",
|
||||
"approveError.sessionExpired": "セッションの有効期限が切れました。最初からやり直すには、もう一度 difyctl auth login を実行してください。",
|
||||
"approveError.verifyFailed": "リクエストを確認できませんでした。ページを更新してもう一度お試しください。",
|
||||
"authorize.accountSubtitle": "difyctl がアクセスをリクエストしています。ターミナルからこの操作を開始していない場合は、キャンセルをクリックしてください。",
|
||||
"authorize.approve": "認証する",
|
||||
"authorize.identityProvider": "アイデンティティプロバイダー:",
|
||||
"authorize.loadingSession": "セッションを読み込んでいます…",
|
||||
"authorize.sessionInvalidBody": "新しくサインインするには、もう一度 <codeTag>difyctl auth login</codeTag> を実行してください。",
|
||||
"authorize.sessionInvalidTitle": "このセッションは無効になりました",
|
||||
"authorize.ssoSubtitle": "difyctl が SSO 経由でアクセスをリクエストしています。ターミナルからこの操作を開始していない場合は、このタブを閉じてください。",
|
||||
"authorize.title": "difyctl を認証",
|
||||
"authorize.viaSSO": "SSO 経由",
|
||||
"authorize.workspace": "ワークスペース:",
|
||||
"chooser.signInAccount": "Dify アカウントでサインイン",
|
||||
"chooser.signInSSO": "SSO でサインイン",
|
||||
"chooser.subtitle": "コード <codeTag>{{code}}</codeTag> は有効です。サインイン方法を選択してください。",
|
||||
"chooser.title": "サインインして認証",
|
||||
"codeEntry.codeAriaLabel": "ワンタイムコード",
|
||||
"codeEntry.continue": "続ける",
|
||||
"codeEntry.subtitle": "ターミナルに表示されたコードを入力してください。",
|
||||
"codeEntry.title": "difyctl を認証",
|
||||
"errorExpired.body": "有効期限が切れているか、すでに使用されています。新しいコードを取得するには <codeTag>difyctl auth login</codeTag> を実行してください。",
|
||||
"errorExpired.title": "コードは無効になりました",
|
||||
"errorExpired.tryDifferentCode": "← 別のコードを試す",
|
||||
"errorLookupFailed.body": "こちら側で問題が発生しました。しばらくしてからもう一度お試しください。",
|
||||
"errorLookupFailed.title": "コードを確認できませんでした",
|
||||
"errorRateLimited.body": "少し待ってからもう一度お試しください。",
|
||||
"errorRateLimited.title": "試行回数が多すぎます",
|
||||
"ssoError.default": "シングルサインオンを完了できませんでした。もう一度お試しください。",
|
||||
"ssoError.emailBelongsToDifyAccount": "このIDはDifyアカウントに紐づいています。代わりに「Dify アカウントでサインイン」をご利用ください。",
|
||||
"success.goToConsole": "Dify コンソールへ移動 →",
|
||||
"success.subtitle": "続行するにはターミナルに戻ってください。",
|
||||
"success.title": "サインインしました",
|
||||
"tryAgain": "← もう一度試す"
|
||||
}
|
||||
45
web/i18n/ko-KR/device-flow.json
Normal file
45
web/i18n/ko-KR/device-flow.json
Normal file
@ -0,0 +1,45 @@
|
||||
{
|
||||
"approveError.codeInvalid": "이 코드는 더 이상 유효하지 않습니다.",
|
||||
"approveError.codeMismatch": "이 코드가 활성 세션과 일치하지 않습니다. difyctl auth login을 다시 실행하세요.",
|
||||
"approveError.codeResolved": "이 코드는 이미 승인되었거나 거부되었습니다.",
|
||||
"approveError.conflict": "이 코드는 더 이상 승인할 수 있는 상태가 아닙니다.",
|
||||
"approveError.default": "요청을 완료할 수 없습니다. 다시 시도해 주세요.",
|
||||
"approveError.flowExpired": "승인이 완료되기 전에 프로세스가 만료되었습니다. difyctl auth login을 다시 실행하세요.",
|
||||
"approveError.inProgress": "이 코드에 대한 승인이 이미 진행 중입니다.",
|
||||
"approveError.rateLimited": "시도 횟수가 너무 많습니다. 잠시 기다린 후 다시 시도하세요.",
|
||||
"approveError.serverError": "저희 쪽에서 문제가 발생했습니다. 잠시 후 다시 시도하세요.",
|
||||
"approveError.sessionConsumed": "이 세션은 이미 사용되었습니다. difyctl auth login을 다시 실행하세요.",
|
||||
"approveError.sessionExpired": "세션이 만료되었습니다. 처음부터 다시 시작하려면 difyctl auth login을 다시 실행하세요.",
|
||||
"approveError.verifyFailed": "요청을 확인할 수 없습니다. 페이지를 새로고침한 후 다시 시도하세요.",
|
||||
"authorize.accountSubtitle": "difyctl이 액세스를 요청하고 있습니다. 터미널에서 시작한 것이 아니라면 취소를 클릭하세요.",
|
||||
"authorize.approve": "승인",
|
||||
"authorize.identityProvider": "ID 공급자:",
|
||||
"authorize.loadingSession": "세션을 불러오는 중…",
|
||||
"authorize.sessionInvalidBody": "새로 로그인하려면 <codeTag>difyctl auth login</codeTag>을 다시 실행하세요.",
|
||||
"authorize.sessionInvalidTitle": "이 세션은 더 이상 유효하지 않습니다",
|
||||
"authorize.ssoSubtitle": "difyctl이 SSO를 통해 액세스를 요청하고 있습니다. 터미널에서 시작한 것이 아니라면 이 탭을 닫으세요.",
|
||||
"authorize.title": "difyctl 승인",
|
||||
"authorize.viaSSO": "SSO 사용",
|
||||
"authorize.workspace": "작업 공간:",
|
||||
"chooser.signInAccount": "Dify 계정으로 로그인",
|
||||
"chooser.signInSSO": "SSO로 로그인",
|
||||
"chooser.subtitle": "코드 <codeTag>{{code}}</codeTag>가 유효합니다. 로그인 방법을 선택하세요.",
|
||||
"chooser.title": "승인하려면 로그인하세요",
|
||||
"codeEntry.codeAriaLabel": "일회용 코드",
|
||||
"codeEntry.continue": "계속",
|
||||
"codeEntry.subtitle": "터미널에 표시된 코드를 입력하세요.",
|
||||
"codeEntry.title": "difyctl 승인",
|
||||
"errorExpired.body": "만료되었거나 이미 사용되었습니다. 새 코드를 받으려면 <codeTag>difyctl auth login</codeTag>을 실행하세요.",
|
||||
"errorExpired.title": "코드가 더 이상 유효하지 않습니다",
|
||||
"errorExpired.tryDifferentCode": "← 다른 코드 시도하기",
|
||||
"errorLookupFailed.body": "저희 쪽에서 문제가 발생했습니다. 잠시 후 다시 시도하세요.",
|
||||
"errorLookupFailed.title": "코드를 확인할 수 없습니다",
|
||||
"errorRateLimited.body": "잠시 기다린 후 다시 시도하세요.",
|
||||
"errorRateLimited.title": "시도 횟수가 너무 많습니다",
|
||||
"ssoError.default": "싱글 사인온을 완료할 수 없습니다. 다시 시도하세요.",
|
||||
"ssoError.emailBelongsToDifyAccount": "이 계정은 Dify 계정에 연결되어 있습니다. 대신 「Dify 계정으로 로그인」을 사용하세요.",
|
||||
"success.goToConsole": "Dify 콘솔로 이동 →",
|
||||
"success.subtitle": "계속하려면 터미널로 돌아가세요.",
|
||||
"success.title": "로그인되었습니다",
|
||||
"tryAgain": "← 다시 시도"
|
||||
}
|
||||
45
web/i18n/nl-NL/device-flow.json
Normal file
45
web/i18n/nl-NL/device-flow.json
Normal file
@ -0,0 +1,45 @@
|
||||
{
|
||||
"approveError.codeInvalid": "Deze code is niet meer geldig.",
|
||||
"approveError.codeMismatch": "Deze code komt niet overeen met de actieve sessie. Voer difyctl auth login opnieuw uit.",
|
||||
"approveError.codeResolved": "Deze code is al goedgekeurd of geweigerd.",
|
||||
"approveError.conflict": "Deze code bevindt zich niet meer in een status die we kunnen goedkeuren.",
|
||||
"approveError.default": "Kon het verzoek niet voltooien. Probeer het opnieuw.",
|
||||
"approveError.flowExpired": "Het proces is verlopen voordat de goedkeuring was voltooid. Voer difyctl auth login opnieuw uit.",
|
||||
"approveError.inProgress": "Er loopt al een goedkeuring voor deze code.",
|
||||
"approveError.rateLimited": "Te veel pogingen. Wacht even en probeer het opnieuw.",
|
||||
"approveError.serverError": "Er is iets misgegaan aan onze kant. Probeer het over een moment opnieuw.",
|
||||
"approveError.sessionConsumed": "Deze sessie is al gebruikt. Voer difyctl auth login opnieuw uit.",
|
||||
"approveError.sessionExpired": "Je sessie is verlopen. Voer difyctl auth login opnieuw uit om opnieuw te beginnen.",
|
||||
"approveError.verifyFailed": "Kon het verzoek niet verifiëren. Vernieuw de pagina en probeer het opnieuw.",
|
||||
"authorize.accountSubtitle": "difyctl vraagt om toegang. Als je dit niet vanuit je terminal bent gestart, klik dan op Annuleren.",
|
||||
"authorize.approve": "Autoriseren",
|
||||
"authorize.identityProvider": "Identiteitsprovider:",
|
||||
"authorize.loadingSession": "Sessie wordt geladen…",
|
||||
"authorize.sessionInvalidBody": "Voer <codeTag>difyctl auth login</codeTag> opnieuw uit om een nieuwe aanmelding te starten.",
|
||||
"authorize.sessionInvalidTitle": "Deze sessie is niet meer geldig",
|
||||
"authorize.ssoSubtitle": "difyctl vraagt om toegang via SSO. Als je dit niet vanuit je terminal bent gestart, sluit dan dit tabblad.",
|
||||
"authorize.title": "difyctl autoriseren",
|
||||
"authorize.viaSSO": "via SSO",
|
||||
"authorize.workspace": "Werkruimte:",
|
||||
"chooser.signInAccount": "Aanmelden met Dify-account",
|
||||
"chooser.signInSSO": "Aanmelden met SSO",
|
||||
"chooser.subtitle": "Code <codeTag>{{code}}</codeTag> is geldig. Kies hoe je wilt aanmelden.",
|
||||
"chooser.title": "Meld je aan om te autoriseren",
|
||||
"codeEntry.codeAriaLabel": "eenmalige code",
|
||||
"codeEntry.continue": "Doorgaan",
|
||||
"codeEntry.subtitle": "Voer de code in die in je terminal wordt weergegeven.",
|
||||
"codeEntry.title": "difyctl autoriseren",
|
||||
"errorExpired.body": "Verlopen of al gebruikt. Voer <codeTag>difyctl auth login</codeTag> uit om een nieuwe code te krijgen.",
|
||||
"errorExpired.title": "Code is niet meer geldig",
|
||||
"errorExpired.tryDifferentCode": "← Probeer een andere code",
|
||||
"errorLookupFailed.body": "Er is iets misgegaan aan onze kant. Probeer het over een moment opnieuw.",
|
||||
"errorLookupFailed.title": "Kon de code niet verifiëren",
|
||||
"errorRateLimited.body": "Wacht even en probeer het opnieuw.",
|
||||
"errorRateLimited.title": "Te veel pogingen",
|
||||
"ssoError.default": "Single sign-on kon niet worden voltooid. Probeer het opnieuw.",
|
||||
"ssoError.emailBelongsToDifyAccount": "Deze identiteit is gekoppeld aan een Dify-account. Gebruik in plaats daarvan „Aanmelden met Dify-account”.",
|
||||
"success.goToConsole": "Naar Dify-console →",
|
||||
"success.subtitle": "Ga terug naar je terminal om verder te gaan.",
|
||||
"success.title": "Je bent aangemeld",
|
||||
"tryAgain": "← Opnieuw proberen"
|
||||
}
|
||||
45
web/i18n/pl-PL/device-flow.json
Normal file
45
web/i18n/pl-PL/device-flow.json
Normal file
@ -0,0 +1,45 @@
|
||||
{
|
||||
"approveError.codeInvalid": "Ten kod nie jest już ważny.",
|
||||
"approveError.codeMismatch": "Ten kod nie pasuje do aktywnej sesji. Uruchom ponownie difyctl auth login.",
|
||||
"approveError.codeResolved": "Ten kod został już zatwierdzony lub odrzucony.",
|
||||
"approveError.conflict": "Ten kod nie jest już w stanie, który możemy zatwierdzić.",
|
||||
"approveError.default": "Nie udało się zrealizować żądania. Spróbuj ponownie.",
|
||||
"approveError.flowExpired": "Proces wygasł, zanim zatwierdzenie zostało zakończone. Uruchom ponownie difyctl auth login.",
|
||||
"approveError.inProgress": "Zatwierdzanie tego kodu jest już w toku.",
|
||||
"approveError.rateLimited": "Zbyt wiele prób. Poczekaj chwilę i spróbuj ponownie.",
|
||||
"approveError.serverError": "Coś poszło nie tak po naszej stronie. Spróbuj ponownie za chwilę.",
|
||||
"approveError.sessionConsumed": "Ta sesja została już wykorzystana. Uruchom ponownie difyctl auth login.",
|
||||
"approveError.sessionExpired": "Twoja sesja wygasła. Uruchom ponownie difyctl auth login, aby zacząć od nowa.",
|
||||
"approveError.verifyFailed": "Nie udało się zweryfikować żądania. Odśwież stronę i spróbuj ponownie.",
|
||||
"authorize.accountSubtitle": "difyctl prosi o dostęp. Jeśli nie rozpocząłeś tego z poziomu terminala, kliknij Anuluj.",
|
||||
"authorize.approve": "Autoryzuj",
|
||||
"authorize.identityProvider": "Dostawca tożsamości:",
|
||||
"authorize.loadingSession": "Wczytywanie sesji…",
|
||||
"authorize.sessionInvalidBody": "Uruchom ponownie <codeTag>difyctl auth login</codeTag>, aby rozpocząć nowe logowanie.",
|
||||
"authorize.sessionInvalidTitle": "Ta sesja nie jest już ważna",
|
||||
"authorize.ssoSubtitle": "difyctl prosi o dostęp za pomocą SSO. Jeśli nie rozpocząłeś tego z poziomu terminala, zamknij tę kartę.",
|
||||
"authorize.title": "Autoryzuj difyctl",
|
||||
"authorize.viaSSO": "przez SSO",
|
||||
"authorize.workspace": "Obszar roboczy:",
|
||||
"chooser.signInAccount": "Zaloguj się przez konto Dify",
|
||||
"chooser.signInSSO": "Zaloguj się przez SSO",
|
||||
"chooser.subtitle": "Kod <codeTag>{{code}}</codeTag> jest ważny. Wybierz sposób logowania.",
|
||||
"chooser.title": "Zaloguj się, aby autoryzować",
|
||||
"codeEntry.codeAriaLabel": "kod jednorazowy",
|
||||
"codeEntry.continue": "Kontynuuj",
|
||||
"codeEntry.subtitle": "Wprowadź kod wyświetlony w terminalu.",
|
||||
"codeEntry.title": "Autoryzuj difyctl",
|
||||
"errorExpired.body": "Kod wygasł lub został już użyty. Uruchom <codeTag>difyctl auth login</codeTag>, aby otrzymać nowy kod.",
|
||||
"errorExpired.title": "Kod nie jest już ważny",
|
||||
"errorExpired.tryDifferentCode": "← Wypróbuj inny kod",
|
||||
"errorLookupFailed.body": "Coś poszło nie tak po naszej stronie. Spróbuj ponownie za chwilę.",
|
||||
"errorLookupFailed.title": "Nie udało się zweryfikować kodu",
|
||||
"errorRateLimited.body": "Poczekaj chwilę i spróbuj ponownie.",
|
||||
"errorRateLimited.title": "Zbyt wiele prób",
|
||||
"ssoError.default": "Nie udało się ukończyć logowania jednokrotnego. Spróbuj ponownie.",
|
||||
"ssoError.emailBelongsToDifyAccount": "Ta tożsamość jest powiązana z kontem Dify. Zamiast tego użyj opcji „Zaloguj się przez konto Dify”.",
|
||||
"success.goToConsole": "Przejdź do konsoli Dify →",
|
||||
"success.subtitle": "Wróć do terminala, aby kontynuować.",
|
||||
"success.title": "Jesteś zalogowany",
|
||||
"tryAgain": "← Spróbuj ponownie"
|
||||
}
|
||||
45
web/i18n/pt-BR/device-flow.json
Normal file
45
web/i18n/pt-BR/device-flow.json
Normal file
@ -0,0 +1,45 @@
|
||||
{
|
||||
"approveError.codeInvalid": "Este código não é mais válido.",
|
||||
"approveError.codeMismatch": "Este código não corresponde à sessão ativa. Execute difyctl auth login novamente.",
|
||||
"approveError.codeResolved": "Este código já foi aprovado ou negado.",
|
||||
"approveError.conflict": "Este código não está mais em um estado que podemos aprovar.",
|
||||
"approveError.default": "Não foi possível concluir a solicitação. Tente novamente.",
|
||||
"approveError.flowExpired": "O fluxo expirou antes que a aprovação fosse concluída. Execute difyctl auth login novamente.",
|
||||
"approveError.inProgress": "Já existe uma aprovação em andamento para este código.",
|
||||
"approveError.rateLimited": "Muitas tentativas. Aguarde um momento e tente novamente.",
|
||||
"approveError.serverError": "Algo deu errado do nosso lado. Tente novamente em instantes.",
|
||||
"approveError.sessionConsumed": "Esta sessão já foi utilizada. Execute difyctl auth login novamente.",
|
||||
"approveError.sessionExpired": "Sua sessão expirou. Execute difyctl auth login novamente para recomeçar.",
|
||||
"approveError.verifyFailed": "Não foi possível verificar a solicitação. Atualize a página e tente novamente.",
|
||||
"authorize.accountSubtitle": "O difyctl está solicitando acesso. Se você não iniciou isso pelo seu terminal, clique em Cancelar.",
|
||||
"authorize.approve": "Autorizar",
|
||||
"authorize.identityProvider": "Provedor de identidade:",
|
||||
"authorize.loadingSession": "Carregando sessão…",
|
||||
"authorize.sessionInvalidBody": "Execute <codeTag>difyctl auth login</codeTag> novamente para iniciar um novo login.",
|
||||
"authorize.sessionInvalidTitle": "Esta sessão não é mais válida",
|
||||
"authorize.ssoSubtitle": "O difyctl está solicitando acesso via SSO. Se você não iniciou isso pelo seu terminal, feche esta aba.",
|
||||
"authorize.title": "Autorizar o difyctl",
|
||||
"authorize.viaSSO": "via SSO",
|
||||
"authorize.workspace": "Espaço de trabalho:",
|
||||
"chooser.signInAccount": "Entrar com uma conta Dify",
|
||||
"chooser.signInSSO": "Entrar com SSO",
|
||||
"chooser.subtitle": "O código <codeTag>{{code}}</codeTag> é válido. Escolha como entrar.",
|
||||
"chooser.title": "Entre para autorizar",
|
||||
"codeEntry.codeAriaLabel": "código de uso único",
|
||||
"codeEntry.continue": "Continuar",
|
||||
"codeEntry.subtitle": "Digite o código exibido no seu terminal.",
|
||||
"codeEntry.title": "Autorizar o difyctl",
|
||||
"errorExpired.body": "Expirado ou já utilizado. Execute <codeTag>difyctl auth login</codeTag> para obter um novo código.",
|
||||
"errorExpired.title": "Código não é mais válido",
|
||||
"errorExpired.tryDifferentCode": "← Tentar outro código",
|
||||
"errorLookupFailed.body": "Algo deu errado do nosso lado. Tente novamente em instantes.",
|
||||
"errorLookupFailed.title": "Não foi possível verificar o código",
|
||||
"errorRateLimited.body": "Aguarde um momento e tente novamente.",
|
||||
"errorRateLimited.title": "Muitas tentativas",
|
||||
"ssoError.default": "Não foi possível concluir o login único. Tente novamente.",
|
||||
"ssoError.emailBelongsToDifyAccount": "Esta identidade está vinculada a uma conta Dify. Use “Entrar com uma conta Dify” em vez disso.",
|
||||
"success.goToConsole": "Ir para o console Dify →",
|
||||
"success.subtitle": "Volte ao seu terminal para continuar.",
|
||||
"success.title": "Você entrou",
|
||||
"tryAgain": "← Tentar novamente"
|
||||
}
|
||||
45
web/i18n/ro-RO/device-flow.json
Normal file
45
web/i18n/ro-RO/device-flow.json
Normal file
@ -0,0 +1,45 @@
|
||||
{
|
||||
"approveError.codeInvalid": "Acest cod nu mai este valid.",
|
||||
"approveError.codeMismatch": "Acest cod nu se potrivește cu sesiunea activă. Rulează din nou difyctl auth login.",
|
||||
"approveError.codeResolved": "Acest cod a fost deja aprobat sau refuzat.",
|
||||
"approveError.conflict": "Acest cod nu mai este într-o stare pe care o putem aproba.",
|
||||
"approveError.default": "Cererea nu a putut fi finalizată. Te rugăm să încerci din nou.",
|
||||
"approveError.flowExpired": "Procesul a expirat înainte de finalizarea aprobării. Rulează din nou difyctl auth login.",
|
||||
"approveError.inProgress": "Există deja o aprobare în curs pentru acest cod.",
|
||||
"approveError.rateLimited": "Prea multe încercări. Așteaptă un moment și încearcă din nou.",
|
||||
"approveError.serverError": "Ceva nu a funcționat corect de partea noastră. Încearcă din nou peste puțin timp.",
|
||||
"approveError.sessionConsumed": "Această sesiune a fost deja utilizată. Rulează din nou difyctl auth login.",
|
||||
"approveError.sessionExpired": "Sesiunea ta a expirat. Rulează din nou difyctl auth login pentru a începe de la capăt.",
|
||||
"approveError.verifyFailed": "Cererea nu a putut fi verificată. Reîmprospătează pagina și încearcă din nou.",
|
||||
"authorize.accountSubtitle": "difyctl solicită acces. Dacă nu ai inițiat această acțiune din terminalul tău, apasă pe Anulează.",
|
||||
"authorize.approve": "Autorizează",
|
||||
"authorize.identityProvider": "Furnizor de identitate:",
|
||||
"authorize.loadingSession": "Se încarcă sesiunea…",
|
||||
"authorize.sessionInvalidBody": "Rulează din nou <codeTag>difyctl auth login</codeTag> pentru a începe o nouă autentificare.",
|
||||
"authorize.sessionInvalidTitle": "Această sesiune nu mai este validă",
|
||||
"authorize.ssoSubtitle": "difyctl solicită acces prin SSO. Dacă nu ai inițiat această acțiune din terminalul tău, închide această filă.",
|
||||
"authorize.title": "Autorizează difyctl",
|
||||
"authorize.viaSSO": "prin SSO",
|
||||
"authorize.workspace": "Spațiu de lucru:",
|
||||
"chooser.signInAccount": "Autentifică-te cu un cont Dify",
|
||||
"chooser.signInSSO": "Autentifică-te cu SSO",
|
||||
"chooser.subtitle": "Codul <codeTag>{{code}}</codeTag> este valid. Alege cum vrei să te autentifici.",
|
||||
"chooser.title": "Autentifică-te pentru a autoriza",
|
||||
"codeEntry.codeAriaLabel": "cod de unică folosință",
|
||||
"codeEntry.continue": "Continuă",
|
||||
"codeEntry.subtitle": "Introdu codul afișat în terminalul tău.",
|
||||
"codeEntry.title": "Autorizează difyctl",
|
||||
"errorExpired.body": "A expirat sau a fost deja utilizat. Rulează <codeTag>difyctl auth login</codeTag> pentru a obține un cod nou.",
|
||||
"errorExpired.title": "Codul nu mai este valid",
|
||||
"errorExpired.tryDifferentCode": "← Încearcă un alt cod",
|
||||
"errorLookupFailed.body": "Ceva nu a funcționat corect de partea noastră. Încearcă din nou peste puțin timp.",
|
||||
"errorLookupFailed.title": "Codul nu a putut fi verificat",
|
||||
"errorRateLimited.body": "Așteaptă un moment și încearcă din nou.",
|
||||
"errorRateLimited.title": "Prea multe încercări",
|
||||
"ssoError.default": "Autentificarea unică (SSO) nu a putut fi finalizată. Încearcă din nou.",
|
||||
"ssoError.emailBelongsToDifyAccount": "Această identitate este asociată cu un cont Dify. Folosește în schimb „Autentifică-te cu un cont Dify”.",
|
||||
"success.goToConsole": "Mergi la consola Dify →",
|
||||
"success.subtitle": "Revino la terminalul tău pentru a continua.",
|
||||
"success.title": "Te-ai autentificat",
|
||||
"tryAgain": "← Încearcă din nou"
|
||||
}
|
||||
45
web/i18n/ru-RU/device-flow.json
Normal file
45
web/i18n/ru-RU/device-flow.json
Normal file
@ -0,0 +1,45 @@
|
||||
{
|
||||
"approveError.codeInvalid": "Этот код больше не действителен.",
|
||||
"approveError.codeMismatch": "Этот код не соответствует активной сессии. Запустите difyctl auth login снова.",
|
||||
"approveError.codeResolved": "Этот код уже был подтверждён или отклонён.",
|
||||
"approveError.conflict": "Этот код больше не находится в состоянии, которое мы можем подтвердить.",
|
||||
"approveError.default": "Не удалось выполнить запрос. Попробуйте ещё раз.",
|
||||
"approveError.flowExpired": "Срок действия процесса истёк до завершения подтверждения. Запустите difyctl auth login снова.",
|
||||
"approveError.inProgress": "Подтверждение для этого кода уже выполняется.",
|
||||
"approveError.rateLimited": "Слишком много попыток. Подождите немного и попробуйте снова.",
|
||||
"approveError.serverError": "На нашей стороне произошла ошибка. Повторите попытку через некоторое время.",
|
||||
"approveError.sessionConsumed": "Эта сессия уже была использована. Запустите difyctl auth login снова.",
|
||||
"approveError.sessionExpired": "Срок действия вашей сессии истёк. Запустите difyctl auth login снова, чтобы начать заново.",
|
||||
"approveError.verifyFailed": "Не удалось проверить запрос. Обновите страницу и попробуйте снова.",
|
||||
"authorize.accountSubtitle": "difyctl запрашивает доступ. Если вы не запускали это из терминала, нажмите Отмена.",
|
||||
"authorize.approve": "Авторизовать",
|
||||
"authorize.identityProvider": "Поставщик учётных данных:",
|
||||
"authorize.loadingSession": "Загрузка сессии…",
|
||||
"authorize.sessionInvalidBody": "Запустите <codeTag>difyctl auth login</codeTag> снова, чтобы начать новый вход.",
|
||||
"authorize.sessionInvalidTitle": "Эта сессия больше не действительна",
|
||||
"authorize.ssoSubtitle": "difyctl запрашивает доступ через SSO. Если вы не запускали это из терминала, закройте эту вкладку.",
|
||||
"authorize.title": "Авторизовать difyctl",
|
||||
"authorize.viaSSO": "через SSO",
|
||||
"authorize.workspace": "Рабочее пространство:",
|
||||
"chooser.signInAccount": "Войти с учётной записью Dify",
|
||||
"chooser.signInSSO": "Войти через SSO",
|
||||
"chooser.subtitle": "Код <codeTag>{{code}}</codeTag> действителен. Выберите способ входа.",
|
||||
"chooser.title": "Войдите, чтобы авторизовать",
|
||||
"codeEntry.codeAriaLabel": "одноразовый код",
|
||||
"codeEntry.continue": "Продолжить",
|
||||
"codeEntry.subtitle": "Введите код, показанный в вашем терминале.",
|
||||
"codeEntry.title": "Авторизовать difyctl",
|
||||
"errorExpired.body": "Истёк срок действия или уже использован. Запустите <codeTag>difyctl auth login</codeTag>, чтобы получить новый код.",
|
||||
"errorExpired.title": "Код больше не действителен",
|
||||
"errorExpired.tryDifferentCode": "← Попробовать другой код",
|
||||
"errorLookupFailed.body": "На нашей стороне произошла ошибка. Повторите попытку через некоторое время.",
|
||||
"errorLookupFailed.title": "Не удалось проверить код",
|
||||
"errorRateLimited.body": "Подождите немного и попробуйте снова.",
|
||||
"errorRateLimited.title": "Слишком много попыток",
|
||||
"ssoError.default": "Единый вход (SSO) не удалось завершить. Попробуйте снова.",
|
||||
"ssoError.emailBelongsToDifyAccount": "Эта учётная запись связана с аккаунтом Dify. Используйте вместо этого «Войти с учётной записью Dify».",
|
||||
"success.goToConsole": "Перейти в консоль Dify →",
|
||||
"success.subtitle": "Вернитесь в терминал, чтобы продолжить.",
|
||||
"success.title": "Вы вошли в систему",
|
||||
"tryAgain": "← Попробовать снова"
|
||||
}
|
||||
45
web/i18n/sl-SI/device-flow.json
Normal file
45
web/i18n/sl-SI/device-flow.json
Normal file
@ -0,0 +1,45 @@
|
||||
{
|
||||
"approveError.codeInvalid": "Ta koda ni več veljavna.",
|
||||
"approveError.codeMismatch": "Ta koda se ne ujema z aktivno sejo. Znova zaženite difyctl auth login.",
|
||||
"approveError.codeResolved": "Ta koda je bila že odobrena ali zavrnjena.",
|
||||
"approveError.conflict": "Ta koda ni več v stanju, ki bi ga lahko odobrili.",
|
||||
"approveError.default": "Zahteve ni bilo mogoče dokončati. Poskusite znova.",
|
||||
"approveError.flowExpired": "Postopek je potekel, preden je bila odobritev zaključena. Znova zaženite difyctl auth login.",
|
||||
"approveError.inProgress": "Odobritev za to kodo je že v teku.",
|
||||
"approveError.rateLimited": "Preveč poskusov. Počakajte trenutek in poskusite znova.",
|
||||
"approveError.serverError": "Na naši strani je prišlo do napake. Poskusite znova čez trenutek.",
|
||||
"approveError.sessionConsumed": "Ta seja je bila že uporabljena. Znova zaženite difyctl auth login.",
|
||||
"approveError.sessionExpired": "Vaša seja je potekla. Znova zaženite difyctl auth login, da začnete znova.",
|
||||
"approveError.verifyFailed": "Zahteve ni bilo mogoče preveriti. Osvežite stran in poskusite znova.",
|
||||
"authorize.accountSubtitle": "difyctl zahteva dostop. Če tega niste sprožili iz svojega terminala, kliknite Prekliči.",
|
||||
"authorize.approve": "Avtoriziraj",
|
||||
"authorize.identityProvider": "Ponudnik identitete:",
|
||||
"authorize.loadingSession": "Nalaganje seje…",
|
||||
"authorize.sessionInvalidBody": "Znova zaženite <codeTag>difyctl auth login</codeTag>, da začnete novo prijavo.",
|
||||
"authorize.sessionInvalidTitle": "Ta seja ni več veljavna",
|
||||
"authorize.ssoSubtitle": "difyctl zahteva dostop prek SSO. Če tega niste sprožili iz svojega terminala, zaprite ta zavihek.",
|
||||
"authorize.title": "Avtoriziraj difyctl",
|
||||
"authorize.viaSSO": "prek SSO",
|
||||
"authorize.workspace": "Delovni prostor:",
|
||||
"chooser.signInAccount": "Prijava z računom Dify",
|
||||
"chooser.signInSSO": "Prijava s SSO",
|
||||
"chooser.subtitle": "Koda <codeTag>{{code}}</codeTag> je veljavna. Izberite način prijave.",
|
||||
"chooser.title": "Prijavite se za avtorizacijo",
|
||||
"codeEntry.codeAriaLabel": "enkratna koda",
|
||||
"codeEntry.continue": "Naprej",
|
||||
"codeEntry.subtitle": "Vnesite kodo, prikazano v vašem terminalu.",
|
||||
"codeEntry.title": "Avtoriziraj difyctl",
|
||||
"errorExpired.body": "Koda je potekla ali je bila že uporabljena. Za novo kodo zaženite <codeTag>difyctl auth login</codeTag>.",
|
||||
"errorExpired.title": "Koda ni več veljavna",
|
||||
"errorExpired.tryDifferentCode": "← Poskusite z drugo kodo",
|
||||
"errorLookupFailed.body": "Na naši strani je prišlo do napake. Poskusite znova čez trenutek.",
|
||||
"errorLookupFailed.title": "Kode ni bilo mogoče preveriti",
|
||||
"errorRateLimited.body": "Počakajte trenutek in poskusite znova.",
|
||||
"errorRateLimited.title": "Preveč poskusov",
|
||||
"ssoError.default": "Enotne prijave (SSO) ni bilo mogoče dokončati. Poskusite znova.",
|
||||
"ssoError.emailBelongsToDifyAccount": "Ta identiteta je povezana z računom Dify. Namesto tega uporabite »Prijava z računom Dify«.",
|
||||
"success.goToConsole": "Pojdi v konzolo Dify →",
|
||||
"success.subtitle": "Za nadaljevanje se vrnite v terminal.",
|
||||
"success.title": "Prijavljeni ste",
|
||||
"tryAgain": "← Poskusi znova"
|
||||
}
|
||||
45
web/i18n/th-TH/device-flow.json
Normal file
45
web/i18n/th-TH/device-flow.json
Normal file
@ -0,0 +1,45 @@
|
||||
{
|
||||
"approveError.codeInvalid": "รหัสนี้ไม่ถูกต้องอีกต่อไป",
|
||||
"approveError.codeMismatch": "รหัสนี้ไม่ตรงกับเซสชันที่ใช้งานอยู่ โปรดเรียกใช้ difyctl auth login อีกครั้ง",
|
||||
"approveError.codeResolved": "รหัสนี้ได้รับการอนุมัติหรือปฏิเสธไปแล้ว",
|
||||
"approveError.conflict": "รหัสนี้ไม่อยู่ในสถานะที่เราจะอนุมัติได้อีกต่อไป",
|
||||
"approveError.default": "ไม่สามารถดำเนินการตามคำขอได้ โปรดลองอีกครั้ง",
|
||||
"approveError.flowExpired": "กระบวนการหมดอายุก่อนที่การอนุมัติจะเสร็จสมบูรณ์ โปรดเรียกใช้ difyctl auth login อีกครั้ง",
|
||||
"approveError.inProgress": "มีการอนุมัติสำหรับรหัสนี้กำลังดำเนินการอยู่แล้ว",
|
||||
"approveError.rateLimited": "พยายามมากเกินไป โปรดรอสักครู่แล้วลองอีกครั้ง",
|
||||
"approveError.serverError": "เกิดข้อผิดพลาดจากฝั่งเรา โปรดลองอีกครั้งในอีกสักครู่",
|
||||
"approveError.sessionConsumed": "เซสชันนี้ถูกใช้ไปแล้ว โปรดเรียกใช้ difyctl auth login อีกครั้ง",
|
||||
"approveError.sessionExpired": "เซสชันของคุณหมดอายุแล้ว โปรดเรียกใช้ difyctl auth login อีกครั้งเพื่อเริ่มต้นใหม่",
|
||||
"approveError.verifyFailed": "ไม่สามารถตรวจสอบคำขอได้ โปรดรีเฟรชหน้าเว็บแล้วลองอีกครั้ง",
|
||||
"authorize.accountSubtitle": "difyctl กำลังขอสิทธิ์เข้าถึง หากคุณไม่ได้เริ่มการดำเนินการนี้จากเทอร์มินัลของคุณ โปรดคลิกยกเลิก",
|
||||
"authorize.approve": "อนุญาต",
|
||||
"authorize.identityProvider": "ผู้ให้บริการยืนยันตัวตน:",
|
||||
"authorize.loadingSession": "กำลังโหลดเซสชัน…",
|
||||
"authorize.sessionInvalidBody": "เรียกใช้ <codeTag>difyctl auth login</codeTag> อีกครั้งเพื่อเริ่มการลงชื่อเข้าใช้ใหม่",
|
||||
"authorize.sessionInvalidTitle": "เซสชันนี้ไม่ถูกต้องอีกต่อไป",
|
||||
"authorize.ssoSubtitle": "difyctl กำลังขอสิทธิ์เข้าถึงผ่าน SSO หากคุณไม่ได้เริ่มการดำเนินการนี้จากเทอร์มินัลของคุณ โปรดปิดแท็บนี้",
|
||||
"authorize.title": "อนุญาต difyctl",
|
||||
"authorize.viaSSO": "ผ่าน SSO",
|
||||
"authorize.workspace": "พื้นที่ทำงาน:",
|
||||
"chooser.signInAccount": "ลงชื่อเข้าใช้ด้วยบัญชี Dify",
|
||||
"chooser.signInSSO": "ลงชื่อเข้าใช้ด้วย SSO",
|
||||
"chooser.subtitle": "รหัส <codeTag>{{code}}</codeTag> ถูกต้อง โปรดเลือกวิธีลงชื่อเข้าใช้",
|
||||
"chooser.title": "ลงชื่อเข้าใช้เพื่ออนุญาต",
|
||||
"codeEntry.codeAriaLabel": "รหัสใช้ครั้งเดียว",
|
||||
"codeEntry.continue": "ดำเนินการต่อ",
|
||||
"codeEntry.subtitle": "ป้อนรหัสที่แสดงในเทอร์มินัลของคุณ",
|
||||
"codeEntry.title": "อนุญาต difyctl",
|
||||
"errorExpired.body": "หมดอายุหรือถูกใช้ไปแล้ว โปรดเรียกใช้ <codeTag>difyctl auth login</codeTag> เพื่อรับรหัสใหม่",
|
||||
"errorExpired.title": "รหัสไม่ถูกต้องอีกต่อไป",
|
||||
"errorExpired.tryDifferentCode": "← ลองใช้รหัสอื่น",
|
||||
"errorLookupFailed.body": "เกิดข้อผิดพลาดจากฝั่งเรา โปรดลองอีกครั้งในอีกสักครู่",
|
||||
"errorLookupFailed.title": "ไม่สามารถตรวจสอบรหัสได้",
|
||||
"errorRateLimited.body": "โปรดรอสักครู่แล้วลองอีกครั้ง",
|
||||
"errorRateLimited.title": "พยายามมากเกินไป",
|
||||
"ssoError.default": "ไม่สามารถทำการลงชื่อเข้าใช้แบบรวมศูนย์ (SSO) ให้เสร็จสมบูรณ์ได้ โปรดลองอีกครั้ง",
|
||||
"ssoError.emailBelongsToDifyAccount": "ข้อมูลประจำตัวนี้เชื่อมโยงกับบัญชี Dify โปรดใช้ “ลงชื่อเข้าใช้ด้วยบัญชี Dify” แทน",
|
||||
"success.goToConsole": "ไปที่คอนโซล Dify →",
|
||||
"success.subtitle": "กลับไปที่เทอร์มินัลของคุณเพื่อดำเนินการต่อ",
|
||||
"success.title": "คุณลงชื่อเข้าใช้แล้ว",
|
||||
"tryAgain": "← ลองอีกครั้ง"
|
||||
}
|
||||
45
web/i18n/tr-TR/device-flow.json
Normal file
45
web/i18n/tr-TR/device-flow.json
Normal file
@ -0,0 +1,45 @@
|
||||
{
|
||||
"approveError.codeInvalid": "Bu kod artık geçerli değil.",
|
||||
"approveError.codeMismatch": "Bu kod etkin oturumla eşleşmiyor. difyctl auth login komutunu yeniden çalıştırın.",
|
||||
"approveError.codeResolved": "Bu kod zaten onaylandı veya reddedildi.",
|
||||
"approveError.conflict": "Bu kod artık onaylayabileceğimiz bir durumda değil.",
|
||||
"approveError.default": "İstek tamamlanamadı. Lütfen tekrar deneyin.",
|
||||
"approveError.flowExpired": "Onay tamamlanmadan işlem süresi doldu. difyctl auth login komutunu yeniden çalıştırın.",
|
||||
"approveError.inProgress": "Bu kod için zaten devam eden bir onay var.",
|
||||
"approveError.rateLimited": "Çok fazla deneme yapıldı. Bir süre bekleyip tekrar deneyin.",
|
||||
"approveError.serverError": "Bizim tarafımızda bir sorun oluştu. Bir süre sonra tekrar deneyin.",
|
||||
"approveError.sessionConsumed": "Bu oturum zaten kullanıldı. difyctl auth login komutunu yeniden çalıştırın.",
|
||||
"approveError.sessionExpired": "Oturumunuzun süresi doldu. Baştan başlamak için difyctl auth login komutunu yeniden çalıştırın.",
|
||||
"approveError.verifyFailed": "İstek doğrulanamadı. Sayfayı yenileyip tekrar deneyin.",
|
||||
"authorize.accountSubtitle": "difyctl erişim talep ediyor. Bunu terminalinizden başlatmadıysanız İptal'e tıklayın.",
|
||||
"authorize.approve": "Yetkilendir",
|
||||
"authorize.identityProvider": "Kimlik sağlayıcı:",
|
||||
"authorize.loadingSession": "Oturum yükleniyor…",
|
||||
"authorize.sessionInvalidBody": "Yeni bir oturum açma işlemi başlatmak için <codeTag>difyctl auth login</codeTag> komutunu yeniden çalıştırın.",
|
||||
"authorize.sessionInvalidTitle": "Bu oturum artık geçerli değil",
|
||||
"authorize.ssoSubtitle": "difyctl, SSO üzerinden erişim talep ediyor. Bunu terminalinizden başlatmadıysanız bu sekmeyi kapatın.",
|
||||
"authorize.title": "difyctl'i Yetkilendir",
|
||||
"authorize.viaSSO": "SSO ile",
|
||||
"authorize.workspace": "Çalışma alanı:",
|
||||
"chooser.signInAccount": "Dify hesabıyla oturum aç",
|
||||
"chooser.signInSSO": "SSO ile oturum aç",
|
||||
"chooser.subtitle": "Kod <codeTag>{{code}}</codeTag> geçerli. Oturum açma yönteminizi seçin.",
|
||||
"chooser.title": "Yetkilendirmek için oturum açın",
|
||||
"codeEntry.codeAriaLabel": "tek kullanımlık kod",
|
||||
"codeEntry.continue": "Devam et",
|
||||
"codeEntry.subtitle": "Terminalinizde görünen kodu girin.",
|
||||
"codeEntry.title": "difyctl'i Yetkilendir",
|
||||
"errorExpired.body": "Süresi doldu veya zaten kullanıldı. Yeni bir kod almak için <codeTag>difyctl auth login</codeTag> komutunu çalıştırın.",
|
||||
"errorExpired.title": "Kod artık geçerli değil",
|
||||
"errorExpired.tryDifferentCode": "← Farklı bir kod deneyin",
|
||||
"errorLookupFailed.body": "Bizim tarafımızda bir sorun oluştu. Bir süre sonra tekrar deneyin.",
|
||||
"errorLookupFailed.title": "Kod doğrulanamadı",
|
||||
"errorRateLimited.body": "Bir süre bekleyip tekrar deneyin.",
|
||||
"errorRateLimited.title": "Çok fazla deneme yapıldı",
|
||||
"ssoError.default": "Tek oturum açma (SSO) tamamlanamadı. Tekrar deneyin.",
|
||||
"ssoError.emailBelongsToDifyAccount": "Bu kimlik bir Dify hesabına bağlı. Bunun yerine “Dify hesabıyla oturum aç” seçeneğini kullanın.",
|
||||
"success.goToConsole": "Dify konsoluna git →",
|
||||
"success.subtitle": "Devam etmek için terminalinize dönün.",
|
||||
"success.title": "Oturum açtınız",
|
||||
"tryAgain": "← Tekrar dene"
|
||||
}
|
||||
45
web/i18n/uk-UA/device-flow.json
Normal file
45
web/i18n/uk-UA/device-flow.json
Normal file
@ -0,0 +1,45 @@
|
||||
{
|
||||
"approveError.codeInvalid": "Цей код більше не дійсний.",
|
||||
"approveError.codeMismatch": "Цей код не відповідає активній сесії. Запустіть difyctl auth login знову.",
|
||||
"approveError.codeResolved": "Цей код уже було підтверджено або відхилено.",
|
||||
"approveError.conflict": "Цей код більше не перебуває у стані, який ми можемо підтвердити.",
|
||||
"approveError.default": "Не вдалося виконати запит. Спробуйте ще раз.",
|
||||
"approveError.flowExpired": "Термін дії процесу минув до завершення підтвердження. Запустіть difyctl auth login знову.",
|
||||
"approveError.inProgress": "Підтвердження для цього коду вже виконується.",
|
||||
"approveError.rateLimited": "Забагато спроб. Зачекайте трохи й спробуйте ще раз.",
|
||||
"approveError.serverError": "На нашому боці сталася помилка. Спробуйте ще раз за мить.",
|
||||
"approveError.sessionConsumed": "Цю сесію вже було використано. Запустіть difyctl auth login знову.",
|
||||
"approveError.sessionExpired": "Термін дії вашої сесії минув. Запустіть difyctl auth login знову, щоб почати спочатку.",
|
||||
"approveError.verifyFailed": "Не вдалося перевірити запит. Оновіть сторінку та спробуйте ще раз.",
|
||||
"authorize.accountSubtitle": "difyctl запитує доступ. Якщо ви не запускали цю дію з терміналу, натисніть Скасувати.",
|
||||
"authorize.approve": "Авторизувати",
|
||||
"authorize.identityProvider": "Постачальник ідентифікації:",
|
||||
"authorize.loadingSession": "Завантаження сесії…",
|
||||
"authorize.sessionInvalidBody": "Запустіть <codeTag>difyctl auth login</codeTag> знову, щоб почати новий вхід.",
|
||||
"authorize.sessionInvalidTitle": "Ця сесія більше не дійсна",
|
||||
"authorize.ssoSubtitle": "difyctl запитує доступ через SSO. Якщо ви не запускали цю дію з терміналу, закрийте цю вкладку.",
|
||||
"authorize.title": "Авторизувати difyctl",
|
||||
"authorize.viaSSO": "через SSO",
|
||||
"authorize.workspace": "Робочий простір:",
|
||||
"chooser.signInAccount": "Увійти з обліковим записом Dify",
|
||||
"chooser.signInSSO": "Увійти через SSO",
|
||||
"chooser.subtitle": "Код <codeTag>{{code}}</codeTag> дійсний. Оберіть спосіб входу.",
|
||||
"chooser.title": "Увійдіть, щоб авторизувати",
|
||||
"codeEntry.codeAriaLabel": "одноразовий код",
|
||||
"codeEntry.continue": "Продовжити",
|
||||
"codeEntry.subtitle": "Введіть код, показаний у вашому терміналі.",
|
||||
"codeEntry.title": "Авторизувати difyctl",
|
||||
"errorExpired.body": "Термін дії минув або код уже використано. Запустіть <codeTag>difyctl auth login</codeTag>, щоб отримати новий код.",
|
||||
"errorExpired.title": "Код більше не дійсний",
|
||||
"errorExpired.tryDifferentCode": "← Спробувати інший код",
|
||||
"errorLookupFailed.body": "На нашому боці сталася помилка. Спробуйте ще раз за мить.",
|
||||
"errorLookupFailed.title": "Не вдалося перевірити код",
|
||||
"errorRateLimited.body": "Зачекайте трохи й спробуйте ще раз.",
|
||||
"errorRateLimited.title": "Забагато спроб",
|
||||
"ssoError.default": "Не вдалося завершити єдиний вхід (SSO). Спробуйте ще раз.",
|
||||
"ssoError.emailBelongsToDifyAccount": "Цю особу пов'язано з обліковим записом Dify. Натомість скористайтеся «Увійти з обліковим записом Dify».",
|
||||
"success.goToConsole": "Перейти до консолі Dify →",
|
||||
"success.subtitle": "Поверніться до терміналу, щоб продовжити.",
|
||||
"success.title": "Ви увійшли",
|
||||
"tryAgain": "← Спробувати ще раз"
|
||||
}
|
||||
45
web/i18n/vi-VN/device-flow.json
Normal file
45
web/i18n/vi-VN/device-flow.json
Normal file
@ -0,0 +1,45 @@
|
||||
{
|
||||
"approveError.codeInvalid": "Mã này không còn hiệu lực.",
|
||||
"approveError.codeMismatch": "Mã này không khớp với phiên đang hoạt động. Hãy chạy lại difyctl auth login.",
|
||||
"approveError.codeResolved": "Mã này đã được phê duyệt hoặc từ chối trước đó.",
|
||||
"approveError.conflict": "Mã này không còn ở trạng thái mà chúng tôi có thể phê duyệt.",
|
||||
"approveError.default": "Không thể hoàn tất yêu cầu. Vui lòng thử lại.",
|
||||
"approveError.flowExpired": "Quy trình đã hết hạn trước khi hoàn tất phê duyệt. Hãy chạy lại difyctl auth login.",
|
||||
"approveError.inProgress": "Đã có một phê duyệt đang được xử lý cho mã này.",
|
||||
"approveError.rateLimited": "Quá nhiều lần thử. Vui lòng đợi một chút rồi thử lại.",
|
||||
"approveError.serverError": "Đã xảy ra sự cố ở phía chúng tôi. Vui lòng thử lại sau ít phút.",
|
||||
"approveError.sessionConsumed": "Phiên này đã được sử dụng trước đó. Hãy chạy lại difyctl auth login.",
|
||||
"approveError.sessionExpired": "Phiên của bạn đã hết hạn. Hãy chạy lại difyctl auth login để bắt đầu lại.",
|
||||
"approveError.verifyFailed": "Không thể xác minh yêu cầu. Vui lòng tải lại trang và thử lại.",
|
||||
"authorize.accountSubtitle": "difyctl đang yêu cầu quyền truy cập. Nếu bạn không bắt đầu thao tác này từ terminal của mình, hãy nhấp vào Hủy.",
|
||||
"authorize.approve": "Ủy quyền",
|
||||
"authorize.identityProvider": "Nhà cung cấp danh tính:",
|
||||
"authorize.loadingSession": "Đang tải phiên…",
|
||||
"authorize.sessionInvalidBody": "Chạy lại <codeTag>difyctl auth login</codeTag> để bắt đầu đăng nhập mới.",
|
||||
"authorize.sessionInvalidTitle": "Phiên này không còn hiệu lực",
|
||||
"authorize.ssoSubtitle": "difyctl đang yêu cầu quyền truy cập qua SSO. Nếu bạn không bắt đầu thao tác này từ terminal của mình, hãy đóng tab này.",
|
||||
"authorize.title": "Ủy quyền difyctl",
|
||||
"authorize.viaSSO": "qua SSO",
|
||||
"authorize.workspace": "Không gian làm việc:",
|
||||
"chooser.signInAccount": "Đăng nhập bằng tài khoản Dify",
|
||||
"chooser.signInSSO": "Đăng nhập bằng SSO",
|
||||
"chooser.subtitle": "Mã <codeTag>{{code}}</codeTag> hợp lệ. Hãy chọn cách bạn muốn đăng nhập.",
|
||||
"chooser.title": "Đăng nhập để ủy quyền",
|
||||
"codeEntry.codeAriaLabel": "mã dùng một lần",
|
||||
"codeEntry.continue": "Tiếp tục",
|
||||
"codeEntry.subtitle": "Nhập mã được hiển thị trong terminal của bạn.",
|
||||
"codeEntry.title": "Ủy quyền difyctl",
|
||||
"errorExpired.body": "Đã hết hạn hoặc đã được sử dụng. Hãy chạy <codeTag>difyctl auth login</codeTag> để nhận mã mới.",
|
||||
"errorExpired.title": "Mã không còn hiệu lực",
|
||||
"errorExpired.tryDifferentCode": "← Thử mã khác",
|
||||
"errorLookupFailed.body": "Đã xảy ra sự cố ở phía chúng tôi. Vui lòng thử lại sau ít phút.",
|
||||
"errorLookupFailed.title": "Không thể xác minh mã",
|
||||
"errorRateLimited.body": "Vui lòng đợi một chút rồi thử lại.",
|
||||
"errorRateLimited.title": "Quá nhiều lần thử",
|
||||
"ssoError.default": "Không thể hoàn tất đăng nhập một lần (SSO). Vui lòng thử lại.",
|
||||
"ssoError.emailBelongsToDifyAccount": "Danh tính này đã được liên kết với một tài khoản Dify. Hãy dùng “Đăng nhập bằng tài khoản Dify” thay thế.",
|
||||
"success.goToConsole": "Đến bảng điều khiển Dify →",
|
||||
"success.subtitle": "Quay lại terminal của bạn để tiếp tục.",
|
||||
"success.title": "Bạn đã đăng nhập",
|
||||
"tryAgain": "← Thử lại"
|
||||
}
|
||||
45
web/i18n/zh-Hans/device-flow.json
Normal file
45
web/i18n/zh-Hans/device-flow.json
Normal file
@ -0,0 +1,45 @@
|
||||
{
|
||||
"approveError.codeInvalid": "此验证码已失效。",
|
||||
"approveError.codeMismatch": "此验证码与当前活跃会话不匹配。请重新运行 difyctl auth login。",
|
||||
"approveError.codeResolved": "此验证码已被批准或拒绝。",
|
||||
"approveError.conflict": "此验证码的状态已不可批准。",
|
||||
"approveError.default": "无法完成请求,请重试。",
|
||||
"approveError.flowExpired": "在批准完成前流程已过期。请重新运行 difyctl auth login。",
|
||||
"approveError.inProgress": "此验证码已有一个批准正在进行中。",
|
||||
"approveError.rateLimited": "尝试次数过多,请稍等片刻后重试。",
|
||||
"approveError.serverError": "我们这边出现了问题,请稍后重试。",
|
||||
"approveError.sessionConsumed": "此会话已被使用。请重新运行 difyctl auth login。",
|
||||
"approveError.sessionExpired": "您的会话已过期。请重新运行 difyctl auth login 重新开始。",
|
||||
"approveError.verifyFailed": "无法验证该请求,请刷新页面后重试。",
|
||||
"authorize.accountSubtitle": "difyctl 正在请求访问权限。如果您不是从终端发起此操作,请点击取消。",
|
||||
"authorize.approve": "授权",
|
||||
"authorize.identityProvider": "身份提供商:",
|
||||
"authorize.loadingSession": "正在加载会话…",
|
||||
"authorize.sessionInvalidBody": "请重新运行 <codeTag>difyctl auth login</codeTag> 以开始新的登录。",
|
||||
"authorize.sessionInvalidTitle": "此会话已失效",
|
||||
"authorize.ssoSubtitle": "difyctl 正在通过 SSO 请求访问权限。如果您不是从终端发起此操作,请关闭此标签页。",
|
||||
"authorize.title": "授权 difyctl",
|
||||
"authorize.viaSSO": "通过 SSO",
|
||||
"authorize.workspace": "工作空间:",
|
||||
"chooser.signInAccount": "使用 Dify 账户登录",
|
||||
"chooser.signInSSO": "使用 SSO 登录",
|
||||
"chooser.subtitle": "验证码 <codeTag>{{code}}</codeTag> 有效。请选择登录方式。",
|
||||
"chooser.title": "登录以授权",
|
||||
"codeEntry.codeAriaLabel": "一次性验证码",
|
||||
"codeEntry.continue": "继续",
|
||||
"codeEntry.subtitle": "输入终端中显示的验证码。",
|
||||
"codeEntry.title": "授权 difyctl",
|
||||
"errorExpired.body": "验证码已过期或已被使用。请运行 <codeTag>difyctl auth login</codeTag> 获取新验证码。",
|
||||
"errorExpired.title": "验证码已失效",
|
||||
"errorExpired.tryDifferentCode": "← 换一个验证码",
|
||||
"errorLookupFailed.body": "我们这边出现了问题,请稍后重试。",
|
||||
"errorLookupFailed.title": "无法验证该验证码",
|
||||
"errorRateLimited.body": "请稍等片刻后重试。",
|
||||
"errorRateLimited.title": "尝试次数过多",
|
||||
"ssoError.default": "单点登录未能完成,请重试。",
|
||||
"ssoError.emailBelongsToDifyAccount": "此身份已关联 Dify 账户,请改用“使用 Dify 账户登录”。",
|
||||
"success.goToConsole": "前往 Dify 控制台 →",
|
||||
"success.subtitle": "请返回终端以继续。",
|
||||
"success.title": "您已登录",
|
||||
"tryAgain": "← 重试"
|
||||
}
|
||||
45
web/i18n/zh-Hant/device-flow.json
Normal file
45
web/i18n/zh-Hant/device-flow.json
Normal file
@ -0,0 +1,45 @@
|
||||
{
|
||||
"approveError.codeInvalid": "此驗證碼已失效。",
|
||||
"approveError.codeMismatch": "此驗證碼與目前的活躍工作階段不符。請重新執行 difyctl auth login。",
|
||||
"approveError.codeResolved": "此驗證碼已被核准或拒絕。",
|
||||
"approveError.conflict": "此驗證碼已不處於可核准的狀態。",
|
||||
"approveError.default": "無法完成請求,請再試一次。",
|
||||
"approveError.flowExpired": "在核准完成前流程已逾期。請重新執行 difyctl auth login。",
|
||||
"approveError.inProgress": "此驗證碼已有一項核准正在進行中。",
|
||||
"approveError.rateLimited": "嘗試次數過多,請稍候片刻後再試。",
|
||||
"approveError.serverError": "我們這端發生了問題,請稍後再試。",
|
||||
"approveError.sessionConsumed": "此工作階段已被使用。請重新執行 difyctl auth login。",
|
||||
"approveError.sessionExpired": "您的工作階段已逾期。請重新執行 difyctl auth login 以重新開始。",
|
||||
"approveError.verifyFailed": "無法驗證此請求,請重新整理頁面後再試。",
|
||||
"authorize.accountSubtitle": "difyctl 正在請求存取權限。如果您並非從終端機發起此操作,請點擊取消。",
|
||||
"authorize.approve": "授權",
|
||||
"authorize.identityProvider": "身分提供者:",
|
||||
"authorize.loadingSession": "正在載入工作階段…",
|
||||
"authorize.sessionInvalidBody": "請重新執行 <codeTag>difyctl auth login</codeTag> 以開始新的登入。",
|
||||
"authorize.sessionInvalidTitle": "此工作階段已失效",
|
||||
"authorize.ssoSubtitle": "difyctl 正在透過 SSO 請求存取權限。如果您並非從終端機發起此操作,請關閉此分頁。",
|
||||
"authorize.title": "授權 difyctl",
|
||||
"authorize.viaSSO": "透過 SSO",
|
||||
"authorize.workspace": "工作區:",
|
||||
"chooser.signInAccount": "使用 Dify 帳戶登入",
|
||||
"chooser.signInSSO": "使用 SSO 登入",
|
||||
"chooser.subtitle": "驗證碼 <codeTag>{{code}}</codeTag> 有效,請選擇登入方式。",
|
||||
"chooser.title": "登入以授權",
|
||||
"codeEntry.codeAriaLabel": "一次性驗證碼",
|
||||
"codeEntry.continue": "繼續",
|
||||
"codeEntry.subtitle": "輸入終端機中顯示的驗證碼。",
|
||||
"codeEntry.title": "授權 difyctl",
|
||||
"errorExpired.body": "驗證碼已逾期或已被使用。請執行 <codeTag>difyctl auth login</codeTag> 以取得新的驗證碼。",
|
||||
"errorExpired.title": "驗證碼已失效",
|
||||
"errorExpired.tryDifferentCode": "← 換一個驗證碼",
|
||||
"errorLookupFailed.body": "我們這端發生了問題,請稍後再試。",
|
||||
"errorLookupFailed.title": "無法驗證此驗證碼",
|
||||
"errorRateLimited.body": "請稍候片刻後再試。",
|
||||
"errorRateLimited.title": "嘗試次數過多",
|
||||
"ssoError.default": "單一登入未能完成,請再試一次。",
|
||||
"ssoError.emailBelongsToDifyAccount": "此身分已連結至 Dify 帳戶,請改用「使用 Dify 帳戶登入」。",
|
||||
"success.goToConsole": "前往 Dify 主控台 →",
|
||||
"success.subtitle": "請返回終端機以繼續。",
|
||||
"success.title": "您已登入",
|
||||
"tryAgain": "← 重試"
|
||||
}
|
||||
Loading…
Reference in New Issue
Block a user