From 2429b757d8755f9d0744cebf512057e1ba44ca18 Mon Sep 17 00:00:00 2001 From: Xiyuan Chen <52963600+GareArc@users.noreply.github.com> Date: Wed, 1 Jul 2026 20:09:02 -0700 Subject: [PATCH] fix(web): add missing i18n for CLI device flow login page (#38282) --- .../device/__tests__/page-terminal.spec.tsx | 36 ++++++------ .../__tests__/authorize-account.spec.tsx | 10 ++-- .../__tests__/authorize-sso.spec.tsx | 18 +++--- .../components/__tests__/chooser.spec.tsx | 12 ++-- .../device/components/authorize-account.tsx | 16 +++--- web/app/device/components/authorize-sso.tsx | 36 ++++++------ web/app/device/components/chooser.tsx | 6 +- web/app/device/components/code-input.tsx | 4 +- web/app/device/page.tsx | 55 +++++++++--------- web/app/device/utils/error-copy.ts | 57 ++++++++++--------- web/i18n-config/resources.ts | 3 + web/i18n/ar-TN/device-flow.json | 45 +++++++++++++++ web/i18n/de-DE/device-flow.json | 45 +++++++++++++++ web/i18n/en-US/device-flow.json | 45 +++++++++++++++ web/i18n/es-ES/device-flow.json | 45 +++++++++++++++ web/i18n/fa-IR/device-flow.json | 45 +++++++++++++++ web/i18n/fr-FR/device-flow.json | 45 +++++++++++++++ web/i18n/hi-IN/device-flow.json | 45 +++++++++++++++ web/i18n/id-ID/device-flow.json | 45 +++++++++++++++ web/i18n/it-IT/device-flow.json | 45 +++++++++++++++ web/i18n/ja-JP/device-flow.json | 45 +++++++++++++++ web/i18n/ko-KR/device-flow.json | 45 +++++++++++++++ web/i18n/nl-NL/device-flow.json | 45 +++++++++++++++ web/i18n/pl-PL/device-flow.json | 45 +++++++++++++++ web/i18n/pt-BR/device-flow.json | 45 +++++++++++++++ web/i18n/ro-RO/device-flow.json | 45 +++++++++++++++ web/i18n/ru-RU/device-flow.json | 45 +++++++++++++++ web/i18n/sl-SI/device-flow.json | 45 +++++++++++++++ web/i18n/th-TH/device-flow.json | 45 +++++++++++++++ web/i18n/tr-TR/device-flow.json | 45 +++++++++++++++ web/i18n/uk-UA/device-flow.json | 45 +++++++++++++++ web/i18n/vi-VN/device-flow.json | 45 +++++++++++++++ web/i18n/zh-Hans/device-flow.json | 45 +++++++++++++++ web/i18n/zh-Hant/device-flow.json | 45 +++++++++++++++ 34 files changed, 1170 insertions(+), 118 deletions(-) create mode 100644 web/i18n/ar-TN/device-flow.json create mode 100644 web/i18n/de-DE/device-flow.json create mode 100644 web/i18n/en-US/device-flow.json create mode 100644 web/i18n/es-ES/device-flow.json create mode 100644 web/i18n/fa-IR/device-flow.json create mode 100644 web/i18n/fr-FR/device-flow.json create mode 100644 web/i18n/hi-IN/device-flow.json create mode 100644 web/i18n/id-ID/device-flow.json create mode 100644 web/i18n/it-IT/device-flow.json create mode 100644 web/i18n/ja-JP/device-flow.json create mode 100644 web/i18n/ko-KR/device-flow.json create mode 100644 web/i18n/nl-NL/device-flow.json create mode 100644 web/i18n/pl-PL/device-flow.json create mode 100644 web/i18n/pt-BR/device-flow.json create mode 100644 web/i18n/ro-RO/device-flow.json create mode 100644 web/i18n/ru-RU/device-flow.json create mode 100644 web/i18n/sl-SI/device-flow.json create mode 100644 web/i18n/th-TH/device-flow.json create mode 100644 web/i18n/tr-TR/device-flow.json create mode 100644 web/i18n/uk-UA/device-flow.json create mode 100644 web/i18n/vi-VN/device-flow.json create mode 100644 web/i18n/zh-Hans/device-flow.json create mode 100644 web/i18n/zh-Hant/device-flow.json diff --git a/web/app/device/__tests__/page-terminal.spec.tsx b/web/app/device/__tests__/page-terminal.spec.tsx index e638bc1dfc1..aba7b7391ac 100644 --- a/web/app/device/__tests__/page-terminal.spec.tsx +++ b/web/app/device/__tests__/page-terminal.spec.tsx @@ -73,56 +73,56 @@ async function reachTerminal(rejectWith: unknown) { render() 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() 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 () => { diff --git a/web/app/device/components/__tests__/authorize-account.spec.tsx b/web/app/device/components/__tests__/authorize-account.spec.tsx index f910461f93d..0b017c6c3ea 100644 --- a/web/app/device/components/__tests__/authorize-account.spec.tsx +++ b/web/app/device/components/__tests__/authorize-account.spec.tsx @@ -54,27 +54,27 @@ describe('AuthorizeAccount', () => { it('calls deviceApproveAccount with userCode on Authorize click', async () => { render() - 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() - 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() - 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() - 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() - 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))) }) }) diff --git a/web/app/device/components/__tests__/authorize-sso.spec.tsx b/web/app/device/components/__tests__/authorize-sso.spec.tsx index 53f26b0f524..048bc403ff9 100644 --- a/web/app/device/components/__tests__/authorize-sso.spec.tsx +++ b/web/app/device/components/__tests__/authorize-sso.spec.tsx @@ -43,37 +43,37 @@ describe('AuthorizeSSO', () => { it('renders single Authorize button with no Cancel', async () => { render() - 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() - 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() - 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() - 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() - 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))) }) }) diff --git a/web/app/device/components/__tests__/chooser.spec.tsx b/web/app/device/components/__tests__/chooser.spec.tsx index e3b152daa24..6b0afd7ad53 100644 --- a/web/app/device/components/__tests__/chooser.spec.tsx +++ b/web/app/device/components/__tests__/chooser.spec.tsx @@ -16,22 +16,22 @@ vi.mock('@/app/signin/utils/post-login-redirect', () => ({ describe('Chooser', () => { it('renders account button', () => { render() - 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() - 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() - 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() - 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() - 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() - 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', ) diff --git a/web/app/device/components/authorize-account.tsx b/web/app/device/components/authorize-account.tsx index 267ef3d9a51..8db9a208af3 100644 --- a/web/app/device/components/authorize-account.tsx +++ b/web/app/device/components/authorize-account.tsx @@ -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 = ({ onDenied, onError, }) => { + const { t } = useTranslation('deviceFlow') const [busy, setBusy] = useState(false) const approve = async () => { @@ -43,7 +45,7 @@ const AuthorizeAccount: FC = ({ onApproved() } catch (e) { - onError(approveErrorCopy(e)) + onError(approveErrorCopy(e, t)) } finally { setBusy(false) @@ -57,7 +59,7 @@ const AuthorizeAccount: FC = ({ onDenied() } catch (e) { - onError(approveErrorCopy(e)) + onError(approveErrorCopy(e, t)) } finally { setBusy(false) @@ -67,9 +69,9 @@ const AuthorizeAccount: FC = ({ return (
-

Authorize Dify CLI

+

{t('authorize.title')}

- difyctl is requesting access. If you didn't start this from your terminal, click Cancel. + {t('authorize.accountSubtitle')}

@@ -89,7 +91,7 @@ const AuthorizeAccount: FC = ({
{defaultWorkspace && (
- Workspace: + {t('authorize.workspace')} {' '} {defaultWorkspace}
@@ -102,7 +104,7 @@ const AuthorizeAccount: FC = ({ onClick={approve} disabled={busy} > - Authorize + {t('authorize.approve')}
diff --git a/web/app/device/components/authorize-sso.tsx b/web/app/device/components/authorize-sso.tsx index 3499465a91b..1237ad716b8 100644 --- a/web/app/device/components/authorize-sso.tsx +++ b/web/app/device/components/authorize-sso.tsx @@ -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 = ({ onApproved, onError }) => { + const { t } = useTranslation('deviceFlow') const [ctx, setCtx] = useState(null) const [busy, setBusy] = useState(false) const [loadErr, setLoadErr] = useState(null) @@ -33,17 +35,19 @@ const AuthorizeSSO: FC = ({ 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 = ({ onApproved, onError }) => { onApproved() } catch (e) { - onError(approveErrorCopy(e)) + onError(approveErrorCopy(e, t)) } finally { setBusy(false) @@ -67,27 +71,27 @@ const AuthorizeSSO: FC = ({ onApproved, onError }) => { if (loadErr) { return (
-

This session is no longer valid

+

{t('authorize.sessionInvalidTitle')}

- Run - {' '} - difyctl auth login - {' '} - again to start a new sign-in. + }} + />

) } if (!ctx) { - return
Loading session…
+ return
{t('authorize.loadingSession')}
} return (
-

Authorize Dify CLI

+

{t('authorize.title')}

- difyctl is requesting access via SSO. If you didn't start this from your terminal, close this tab. + {t('authorize.ssoSubtitle')}

@@ -98,12 +102,12 @@ const AuthorizeSSO: FC = ({ onApproved, onError }) => { />

{ctx.subject_email}

-

via SSO

+

{t('authorize.viaSSO')}

{ctx.subject_issuer && (
- Identity provider: + {t('authorize.identityProvider')} {' '} {ctx.subject_issuer}
@@ -115,7 +119,7 @@ const AuthorizeSSO: FC = ({ onApproved, onError }) => { onClick={approve} disabled={busy} > - Authorize + {t('authorize.approve')}
) diff --git a/web/app/device/components/chooser.tsx b/web/app/device/components/chooser.tsx index 6c68f5b4b3c..e2aa775fd13 100644 --- a/web/app/device/components/chooser.tsx +++ b/web/app/device/components/chooser.tsx @@ -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 = ({ userCode, ssoAvailable }) => { + const { t } = useTranslation('deviceFlow') const router = useRouter() const onAccount = () => { @@ -44,7 +46,7 @@ const Chooser: FC = ({ userCode, ssoAvailable }) => { onClick={onAccount} > - Sign in with Dify account + {t('chooser.signInAccount')} {ssoAvailable && ( )} diff --git a/web/app/device/components/code-input.tsx b/web/app/device/components/code-input.tsx index ae5dc850dd9..8631f90400c 100644 --- a/web/app/device/components/code-input.tsx +++ b/web/app/device/components/code-input.tsx @@ -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 = ({ value, onChange, disabled, autoFocus }) => { + const { t } = useTranslation('deviceFlow') const handle = useCallback((raw: string) => { onChange(normaliseUserCodeInput(raw)) }, [onChange]) @@ -32,7 +34,7 @@ const CodeInput: FC = ({ 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} diff --git a/web/app/device/page.tsx b/web/app/device/page.tsx index 5296165ac25..048d7e44ae5 100644 --- a/web/app/device/page.tsx +++ b/web/app/device/page.tsx @@ -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 && (
-

{ssoErrorCopy(ssoError)}

+

{ssoErrorCopy(ssoError, t)}

)}
-

Authorize Dify CLI

+

{t('codeEntry.title')}

- Enter the code shown in your terminal. + {t('codeEntry.subtitle')}

@@ -144,7 +146,7 @@ export default function DevicePage() { onClick={onContinue} disabled={!isValidUserCode(typed)} > - Continue + {t('codeEntry.continue')} )} @@ -152,13 +154,14 @@ export default function DevicePage() { {view.kind === 'chooser' && (
-

Sign in to authorize

+

{t('chooser.title')}

- Code - {' '} - {view.userCode} - {' '} - is valid. Choose how to sign in. + }} + />

@@ -190,11 +193,11 @@ export default function DevicePage() {
-

You're signed in

-

Return to your terminal to continue.

+

{t('success.title')}

+

{t('success.subtitle')}

)} @@ -204,13 +207,13 @@ export default function DevicePage() {
-

Code no longer valid

+

{t('errorExpired.title')}

- Expired or already used. Run - {' '} - difyctl auth login - {' '} - to get a new code. + }} + />

)} @@ -231,8 +234,8 @@ export default function DevicePage() {
-

Too many attempts

-

Wait a moment and try again.

+

{t('errorRateLimited.title')}

+

{t('errorRateLimited.body')}

)} @@ -252,9 +255,9 @@ export default function DevicePage() {
-

Could not verify the code

+

{t('errorLookupFailed.title')}

- Something went wrong on our side. Try again in a moment. + {t('errorLookupFailed.body')}

)} diff --git a/web/app/device/utils/error-copy.ts b/web/app/device/utils/error-copy.ts index d0184dad7bd..f6ba4f68cf0 100644 --- a/web/app/device/utils/error-copy.ts +++ b/web/app/device/utils/error-copy.ts @@ -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 = { - 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 = { + 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 = { - 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 = { + 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' diff --git a/web/i18n-config/resources.ts b/web/i18n-config/resources.ts index 16c0ad39bee..7a3400f1122 100644 --- a/web/i18n-config/resources.ts +++ b/web/i18n-config/resources.ts @@ -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', diff --git a/web/i18n/ar-TN/device-flow.json b/web/i18n/ar-TN/device-flow.json new file mode 100644 index 00000000000..77f3e15f039 --- /dev/null +++ b/web/i18n/ar-TN/device-flow.json @@ -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": "شغّل difyctl auth login مرة أخرى لبدء تسجيل دخول جديد.", + "authorize.sessionInvalidTitle": "لم تعد هذه الجلسة صالحة", + "authorize.ssoSubtitle": "يطلب difyctl الوصول عبر SSO. إذا لم تبدأ هذا من الطرفية الخاصة بك، فأغلق هذا التبويب.", + "authorize.title": "تفويض difyctl", + "authorize.viaSSO": "عبر SSO", + "authorize.workspace": "مساحة العمل:", + "chooser.signInAccount": "تسجيل الدخول بحساب Dify", + "chooser.signInSSO": "تسجيل الدخول عبر SSO", + "chooser.subtitle": "الرمز {{code}} صالح. اختر طريقة تسجيل الدخول.", + "chooser.title": "سجّل الدخول للتفويض", + "codeEntry.codeAriaLabel": "رمز لمرة واحدة", + "codeEntry.continue": "متابعة", + "codeEntry.subtitle": "أدخل الرمز الظاهر في الطرفية الخاصة بك.", + "codeEntry.title": "تفويض difyctl", + "errorExpired.body": "منتهي الصلاحية أو تم استخدامه بالفعل. شغّل difyctl auth login للحصول على رمز جديد.", + "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": "← حاول مرة أخرى" +} diff --git a/web/i18n/de-DE/device-flow.json b/web/i18n/de-DE/device-flow.json new file mode 100644 index 00000000000..7bbe04b6af5 --- /dev/null +++ b/web/i18n/de-DE/device-flow.json @@ -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 difyctl auth login 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 {{code}} 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 difyctl auth login 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" +} diff --git a/web/i18n/en-US/device-flow.json b/web/i18n/en-US/device-flow.json new file mode 100644 index 00000000000..662a9734b39 --- /dev/null +++ b/web/i18n/en-US/device-flow.json @@ -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 difyctl auth login 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 {{code}} 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 difyctl auth login 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" +} diff --git a/web/i18n/es-ES/device-flow.json b/web/i18n/es-ES/device-flow.json new file mode 100644 index 00000000000..f2a89e9a02d --- /dev/null +++ b/web/i18n/es-ES/device-flow.json @@ -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 difyctl auth login 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 {{code}} 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 difyctl auth login 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" +} diff --git a/web/i18n/fa-IR/device-flow.json b/web/i18n/fa-IR/device-flow.json new file mode 100644 index 00000000000..71600d020fe --- /dev/null +++ b/web/i18n/fa-IR/device-flow.json @@ -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": "برای شروع یک ورود جدید، دوباره difyctl auth login را اجرا کنید.", + "authorize.sessionInvalidTitle": "این نشست دیگر معتبر نیست", + "authorize.ssoSubtitle": "difyctl از طریق SSO درخواست دسترسی دارد. اگر این کار را از ترمینال خود شروع نکرده‌اید، این تب را ببندید.", + "authorize.title": "تأیید difyctl", + "authorize.viaSSO": "از طریق SSO", + "authorize.workspace": "فضای کاری:", + "chooser.signInAccount": "ورود با حساب Dify", + "chooser.signInSSO": "ورود با SSO", + "chooser.subtitle": "کد {{code}} معتبر است. نحوه ورود را انتخاب کنید.", + "chooser.title": "برای تأیید وارد شوید", + "codeEntry.codeAriaLabel": "کد یک‌بار مصرف", + "codeEntry.continue": "ادامه", + "codeEntry.subtitle": "کدی را که در ترمینال شما نمایش داده شده وارد کنید.", + "codeEntry.title": "تأیید difyctl", + "errorExpired.body": "منقضی شده یا قبلاً استفاده شده است. برای دریافت کد جدید، difyctl auth login را اجرا کنید.", + "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": "← دوباره امتحان کنید" +} diff --git a/web/i18n/fr-FR/device-flow.json b/web/i18n/fr-FR/device-flow.json new file mode 100644 index 00000000000..902544d4152 --- /dev/null +++ b/web/i18n/fr-FR/device-flow.json @@ -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 difyctl auth login 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 {{code}} 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 difyctl auth login 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" +} diff --git a/web/i18n/hi-IN/device-flow.json b/web/i18n/hi-IN/device-flow.json new file mode 100644 index 00000000000..c9ae983bf14 --- /dev/null +++ b/web/i18n/hi-IN/device-flow.json @@ -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": "नया साइन-इन शुरू करने के लिए difyctl auth login फिर से चलाएँ।", + "authorize.sessionInvalidTitle": "यह सत्र अब मान्य नहीं है", + "authorize.ssoSubtitle": "difyctl SSO के माध्यम से पहुँच का अनुरोध कर रहा है। यदि आपने इसे अपने टर्मिनल से शुरू नहीं किया है, तो इस टैब को बंद करें।", + "authorize.title": "difyctl को अधिकृत करें", + "authorize.viaSSO": "SSO के माध्यम से", + "authorize.workspace": "कार्यक्षेत्र:", + "chooser.signInAccount": "Dify खाते से साइन इन करें", + "chooser.signInSSO": "SSO से साइन इन करें", + "chooser.subtitle": "कोड {{code}} मान्य है। साइन इन करने का तरीका चुनें।", + "chooser.title": "अधिकृत करने के लिए साइन इन करें", + "codeEntry.codeAriaLabel": "एक बार उपयोग होने वाला कोड", + "codeEntry.continue": "जारी रखें", + "codeEntry.subtitle": "अपने टर्मिनल में दिखाया गया कोड दर्ज करें।", + "codeEntry.title": "difyctl को अधिकृत करें", + "errorExpired.body": "समाप्त हो गया है या पहले ही उपयोग किया जा चुका है। नया कोड पाने के लिए difyctl auth login चलाएँ।", + "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": "← फिर से प्रयास करें" +} diff --git a/web/i18n/id-ID/device-flow.json b/web/i18n/id-ID/device-flow.json new file mode 100644 index 00000000000..4b2696c4a2a --- /dev/null +++ b/web/i18n/id-ID/device-flow.json @@ -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 difyctl auth login 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 {{code}} 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 difyctl auth login 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" +} diff --git a/web/i18n/it-IT/device-flow.json b/web/i18n/it-IT/device-flow.json new file mode 100644 index 00000000000..ca322a0060c --- /dev/null +++ b/web/i18n/it-IT/device-flow.json @@ -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 difyctl auth login 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 {{code}} è 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 difyctl auth login 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" +} diff --git a/web/i18n/ja-JP/device-flow.json b/web/i18n/ja-JP/device-flow.json new file mode 100644 index 00000000000..1ac61cc0492 --- /dev/null +++ b/web/i18n/ja-JP/device-flow.json @@ -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": "新しくサインインするには、もう一度 difyctl auth login を実行してください。", + "authorize.sessionInvalidTitle": "このセッションは無効になりました", + "authorize.ssoSubtitle": "difyctl が SSO 経由でアクセスをリクエストしています。ターミナルからこの操作を開始していない場合は、このタブを閉じてください。", + "authorize.title": "difyctl を認証", + "authorize.viaSSO": "SSO 経由", + "authorize.workspace": "ワークスペース:", + "chooser.signInAccount": "Dify アカウントでサインイン", + "chooser.signInSSO": "SSO でサインイン", + "chooser.subtitle": "コード {{code}} は有効です。サインイン方法を選択してください。", + "chooser.title": "サインインして認証", + "codeEntry.codeAriaLabel": "ワンタイムコード", + "codeEntry.continue": "続ける", + "codeEntry.subtitle": "ターミナルに表示されたコードを入力してください。", + "codeEntry.title": "difyctl を認証", + "errorExpired.body": "有効期限が切れているか、すでに使用されています。新しいコードを取得するには difyctl auth login を実行してください。", + "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": "← もう一度試す" +} diff --git a/web/i18n/ko-KR/device-flow.json b/web/i18n/ko-KR/device-flow.json new file mode 100644 index 00000000000..4d418d3ab08 --- /dev/null +++ b/web/i18n/ko-KR/device-flow.json @@ -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": "새로 로그인하려면 difyctl auth login을 다시 실행하세요.", + "authorize.sessionInvalidTitle": "이 세션은 더 이상 유효하지 않습니다", + "authorize.ssoSubtitle": "difyctl이 SSO를 통해 액세스를 요청하고 있습니다. 터미널에서 시작한 것이 아니라면 이 탭을 닫으세요.", + "authorize.title": "difyctl 승인", + "authorize.viaSSO": "SSO 사용", + "authorize.workspace": "작업 공간:", + "chooser.signInAccount": "Dify 계정으로 로그인", + "chooser.signInSSO": "SSO로 로그인", + "chooser.subtitle": "코드 {{code}}가 유효합니다. 로그인 방법을 선택하세요.", + "chooser.title": "승인하려면 로그인하세요", + "codeEntry.codeAriaLabel": "일회용 코드", + "codeEntry.continue": "계속", + "codeEntry.subtitle": "터미널에 표시된 코드를 입력하세요.", + "codeEntry.title": "difyctl 승인", + "errorExpired.body": "만료되었거나 이미 사용되었습니다. 새 코드를 받으려면 difyctl auth login을 실행하세요.", + "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": "← 다시 시도" +} diff --git a/web/i18n/nl-NL/device-flow.json b/web/i18n/nl-NL/device-flow.json new file mode 100644 index 00000000000..012b936f1ab --- /dev/null +++ b/web/i18n/nl-NL/device-flow.json @@ -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 difyctl auth login 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 {{code}} 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 difyctl auth login 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" +} diff --git a/web/i18n/pl-PL/device-flow.json b/web/i18n/pl-PL/device-flow.json new file mode 100644 index 00000000000..ba76f032bfc --- /dev/null +++ b/web/i18n/pl-PL/device-flow.json @@ -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 difyctl auth login, 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 {{code}} 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 difyctl auth login, 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" +} diff --git a/web/i18n/pt-BR/device-flow.json b/web/i18n/pt-BR/device-flow.json new file mode 100644 index 00000000000..2c466e3779e --- /dev/null +++ b/web/i18n/pt-BR/device-flow.json @@ -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 difyctl auth login 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 {{code}} é 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 difyctl auth login 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" +} diff --git a/web/i18n/ro-RO/device-flow.json b/web/i18n/ro-RO/device-flow.json new file mode 100644 index 00000000000..f35abbeebe4 --- /dev/null +++ b/web/i18n/ro-RO/device-flow.json @@ -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 difyctl auth login 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 {{code}} 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ă difyctl auth login 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" +} diff --git a/web/i18n/ru-RU/device-flow.json b/web/i18n/ru-RU/device-flow.json new file mode 100644 index 00000000000..7687446324f --- /dev/null +++ b/web/i18n/ru-RU/device-flow.json @@ -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": "Запустите difyctl auth login снова, чтобы начать новый вход.", + "authorize.sessionInvalidTitle": "Эта сессия больше не действительна", + "authorize.ssoSubtitle": "difyctl запрашивает доступ через SSO. Если вы не запускали это из терминала, закройте эту вкладку.", + "authorize.title": "Авторизовать difyctl", + "authorize.viaSSO": "через SSO", + "authorize.workspace": "Рабочее пространство:", + "chooser.signInAccount": "Войти с учётной записью Dify", + "chooser.signInSSO": "Войти через SSO", + "chooser.subtitle": "Код {{code}} действителен. Выберите способ входа.", + "chooser.title": "Войдите, чтобы авторизовать", + "codeEntry.codeAriaLabel": "одноразовый код", + "codeEntry.continue": "Продолжить", + "codeEntry.subtitle": "Введите код, показанный в вашем терминале.", + "codeEntry.title": "Авторизовать difyctl", + "errorExpired.body": "Истёк срок действия или уже использован. Запустите difyctl auth login, чтобы получить новый код.", + "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": "← Попробовать снова" +} diff --git a/web/i18n/sl-SI/device-flow.json b/web/i18n/sl-SI/device-flow.json new file mode 100644 index 00000000000..1b6236d94b7 --- /dev/null +++ b/web/i18n/sl-SI/device-flow.json @@ -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 difyctl auth login, 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 {{code}} 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 difyctl auth login.", + "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" +} diff --git a/web/i18n/th-TH/device-flow.json b/web/i18n/th-TH/device-flow.json new file mode 100644 index 00000000000..698db33d3ab --- /dev/null +++ b/web/i18n/th-TH/device-flow.json @@ -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": "เรียกใช้ difyctl auth login อีกครั้งเพื่อเริ่มการลงชื่อเข้าใช้ใหม่", + "authorize.sessionInvalidTitle": "เซสชันนี้ไม่ถูกต้องอีกต่อไป", + "authorize.ssoSubtitle": "difyctl กำลังขอสิทธิ์เข้าถึงผ่าน SSO หากคุณไม่ได้เริ่มการดำเนินการนี้จากเทอร์มินัลของคุณ โปรดปิดแท็บนี้", + "authorize.title": "อนุญาต difyctl", + "authorize.viaSSO": "ผ่าน SSO", + "authorize.workspace": "พื้นที่ทำงาน:", + "chooser.signInAccount": "ลงชื่อเข้าใช้ด้วยบัญชี Dify", + "chooser.signInSSO": "ลงชื่อเข้าใช้ด้วย SSO", + "chooser.subtitle": "รหัส {{code}} ถูกต้อง โปรดเลือกวิธีลงชื่อเข้าใช้", + "chooser.title": "ลงชื่อเข้าใช้เพื่ออนุญาต", + "codeEntry.codeAriaLabel": "รหัสใช้ครั้งเดียว", + "codeEntry.continue": "ดำเนินการต่อ", + "codeEntry.subtitle": "ป้อนรหัสที่แสดงในเทอร์มินัลของคุณ", + "codeEntry.title": "อนุญาต difyctl", + "errorExpired.body": "หมดอายุหรือถูกใช้ไปแล้ว โปรดเรียกใช้ difyctl auth login เพื่อรับรหัสใหม่", + "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": "← ลองอีกครั้ง" +} diff --git a/web/i18n/tr-TR/device-flow.json b/web/i18n/tr-TR/device-flow.json new file mode 100644 index 00000000000..9561d385920 --- /dev/null +++ b/web/i18n/tr-TR/device-flow.json @@ -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 difyctl auth login 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 {{code}} 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 difyctl auth login 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" +} diff --git a/web/i18n/uk-UA/device-flow.json b/web/i18n/uk-UA/device-flow.json new file mode 100644 index 00000000000..a5a2724b50a --- /dev/null +++ b/web/i18n/uk-UA/device-flow.json @@ -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": "Запустіть difyctl auth login знову, щоб почати новий вхід.", + "authorize.sessionInvalidTitle": "Ця сесія більше не дійсна", + "authorize.ssoSubtitle": "difyctl запитує доступ через SSO. Якщо ви не запускали цю дію з терміналу, закрийте цю вкладку.", + "authorize.title": "Авторизувати difyctl", + "authorize.viaSSO": "через SSO", + "authorize.workspace": "Робочий простір:", + "chooser.signInAccount": "Увійти з обліковим записом Dify", + "chooser.signInSSO": "Увійти через SSO", + "chooser.subtitle": "Код {{code}} дійсний. Оберіть спосіб входу.", + "chooser.title": "Увійдіть, щоб авторизувати", + "codeEntry.codeAriaLabel": "одноразовий код", + "codeEntry.continue": "Продовжити", + "codeEntry.subtitle": "Введіть код, показаний у вашому терміналі.", + "codeEntry.title": "Авторизувати difyctl", + "errorExpired.body": "Термін дії минув або код уже використано. Запустіть difyctl auth login, щоб отримати новий код.", + "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": "← Спробувати ще раз" +} diff --git a/web/i18n/vi-VN/device-flow.json b/web/i18n/vi-VN/device-flow.json new file mode 100644 index 00000000000..cf6d4631a6c --- /dev/null +++ b/web/i18n/vi-VN/device-flow.json @@ -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 difyctl auth login để 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ã {{code}} 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 difyctl auth login để 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" +} diff --git a/web/i18n/zh-Hans/device-flow.json b/web/i18n/zh-Hans/device-flow.json new file mode 100644 index 00000000000..b39e531df27 --- /dev/null +++ b/web/i18n/zh-Hans/device-flow.json @@ -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": "请重新运行 difyctl auth login 以开始新的登录。", + "authorize.sessionInvalidTitle": "此会话已失效", + "authorize.ssoSubtitle": "difyctl 正在通过 SSO 请求访问权限。如果您不是从终端发起此操作,请关闭此标签页。", + "authorize.title": "授权 difyctl", + "authorize.viaSSO": "通过 SSO", + "authorize.workspace": "工作空间:", + "chooser.signInAccount": "使用 Dify 账户登录", + "chooser.signInSSO": "使用 SSO 登录", + "chooser.subtitle": "验证码 {{code}} 有效。请选择登录方式。", + "chooser.title": "登录以授权", + "codeEntry.codeAriaLabel": "一次性验证码", + "codeEntry.continue": "继续", + "codeEntry.subtitle": "输入终端中显示的验证码。", + "codeEntry.title": "授权 difyctl", + "errorExpired.body": "验证码已过期或已被使用。请运行 difyctl auth login 获取新验证码。", + "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": "← 重试" +} diff --git a/web/i18n/zh-Hant/device-flow.json b/web/i18n/zh-Hant/device-flow.json new file mode 100644 index 00000000000..c34561af08e --- /dev/null +++ b/web/i18n/zh-Hant/device-flow.json @@ -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": "請重新執行 difyctl auth login 以開始新的登入。", + "authorize.sessionInvalidTitle": "此工作階段已失效", + "authorize.ssoSubtitle": "difyctl 正在透過 SSO 請求存取權限。如果您並非從終端機發起此操作,請關閉此分頁。", + "authorize.title": "授權 difyctl", + "authorize.viaSSO": "透過 SSO", + "authorize.workspace": "工作區:", + "chooser.signInAccount": "使用 Dify 帳戶登入", + "chooser.signInSSO": "使用 SSO 登入", + "chooser.subtitle": "驗證碼 {{code}} 有效,請選擇登入方式。", + "chooser.title": "登入以授權", + "codeEntry.codeAriaLabel": "一次性驗證碼", + "codeEntry.continue": "繼續", + "codeEntry.subtitle": "輸入終端機中顯示的驗證碼。", + "codeEntry.title": "授權 difyctl", + "errorExpired.body": "驗證碼已逾期或已被使用。請執行 difyctl auth login 以取得新的驗證碼。", + "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": "← 重試" +}