From bf8ef1f862610ae8ddac44d74780eb70df6245e3 Mon Sep 17 00:00:00 2001 From: Arvin Xu Date: Sun, 5 May 2024 23:15:40 +0800 Subject: [PATCH] =?UTF-8?q?=E2=9C=A8=20feat:=20support=20clerk=20as=20auth?= =?UTF-8?q?=20provider=20(#2374)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * ✨ feat: support clerk as auth provider * ♻️ refactor: refactor the auth env config to `s3-oss/env` * ✅ test: add test for the theme mode and action * 💄 style: fix style * 🌐 chore: update locale * ✅ test: add more test * 🎨 chore: clean code * 📝 docs: update docs --- .npmrc | 2 + docs/self-hosting/advanced/authentication.mdx | 43 +- .../advanced/authentication.zh-CN.mdx | 43 +- docs/self-hosting/advanced/model-list.mdx | 4 +- .../advanced/model-list.zh-CN.mdx | 4 +- .../environment-variables/auth.mdx | 87 +- .../environment-variables/auth.zh-CN.mdx | 92 ++- locales/ar/auth.json | 6 + locales/ar/clerk.json | 769 +++++++++++++++++ locales/ar/common.json | 1 + locales/ar/error.json | 8 + locales/bg-BG/auth.json | 6 + locales/bg-BG/clerk.json | 769 +++++++++++++++++ locales/bg-BG/common.json | 1 + locales/bg-BG/error.json | 8 + locales/de-DE/auth.json | 6 + locales/de-DE/clerk.json | 769 +++++++++++++++++ locales/de-DE/common.json | 1 + locales/de-DE/error.json | 8 + locales/en-US/auth.json | 6 + locales/en-US/clerk.json | 769 +++++++++++++++++ locales/en-US/common.json | 1 + locales/en-US/error.json | 8 + locales/es-ES/auth.json | 6 + locales/es-ES/clerk.json | 769 +++++++++++++++++ locales/es-ES/common.json | 1 + locales/es-ES/error.json | 8 + locales/fr-FR/auth.json | 6 + locales/fr-FR/clerk.json | 769 +++++++++++++++++ locales/fr-FR/common.json | 1 + locales/fr-FR/error.json | 8 + locales/it-IT/auth.json | 6 + locales/it-IT/clerk.json | 769 +++++++++++++++++ locales/it-IT/common.json | 1 + locales/it-IT/error.json | 8 + locales/ja-JP/auth.json | 6 + locales/ja-JP/clerk.json | 769 +++++++++++++++++ locales/ja-JP/common.json | 1 + locales/ja-JP/error.json | 8 + locales/ko-KR/auth.json | 6 + locales/ko-KR/clerk.json | 769 +++++++++++++++++ locales/ko-KR/common.json | 1 + locales/ko-KR/error.json | 8 + locales/nl-NL/auth.json | 6 + locales/nl-NL/clerk.json | 769 +++++++++++++++++ locales/nl-NL/common.json | 1 + locales/nl-NL/error.json | 8 + locales/pl-PL/auth.json | 6 + locales/pl-PL/clerk.json | 769 +++++++++++++++++ locales/pl-PL/common.json | 1 + locales/pl-PL/error.json | 8 + locales/pt-BR/auth.json | 6 + locales/pt-BR/clerk.json | 769 +++++++++++++++++ locales/pt-BR/common.json | 1 + locales/pt-BR/error.json | 8 + locales/ru-RU/auth.json | 6 + locales/ru-RU/clerk.json | 769 +++++++++++++++++ locales/ru-RU/common.json | 1 + locales/ru-RU/error.json | 8 + locales/tr-TR/auth.json | 6 + locales/tr-TR/clerk.json | 769 +++++++++++++++++ locales/tr-TR/common.json | 1 + locales/tr-TR/error.json | 8 + locales/vi-VN/auth.json | 6 + locales/vi-VN/clerk.json | 769 +++++++++++++++++ locales/vi-VN/common.json | 1 + locales/vi-VN/error.json | 8 + locales/zh-CN/auth.json | 6 + locales/zh-CN/clerk.json | 769 +++++++++++++++++ locales/zh-CN/common.json | 1 + locales/zh-CN/error.json | 8 + locales/zh-TW/auth.json | 6 + locales/zh-TW/clerk.json | 769 +++++++++++++++++ locales/zh-TW/common.json | 1 + locales/zh-TW/error.json | 8 + package.json | 4 + src/app/(auth)/layout.tsx | 19 + .../(auth)/login/[[...login]]/PageTitle.tsx | 13 + src/app/(auth)/login/[[...login]]/page.tsx | 14 + .../(auth)/profile/[[...slugs]]/PageTitle.tsx | 13 + src/app/(auth)/profile/[[...slugs]]/page.tsx | 14 + .../(auth)/signup/[[...signup]]/PageTitle.tsx | 13 + src/app/(auth)/signup/[[...signup]]/page.tsx | 14 + .../settings/common/features/Common.tsx | 2 +- .../settings/common/features/Theme/index.tsx | 2 + src/app/(main)/settings/common/index.tsx | 10 +- src/app/api/chat/[provider]/route.test.ts | 79 +- src/app/api/chat/auth/index.test.ts | 77 ++ src/app/api/chat/auth/index.ts | 22 +- src/app/api/chat/auth/utils.ts | 40 +- src/app/api/plugin/gateway/route.ts | 6 +- src/config/auth.ts | 146 ++++ src/config/server/auth.ts | 71 -- src/config/server/index.ts | 4 +- src/const/auth.ts | 7 + .../Conversation/Error/ClerkLogin/index.tsx | 47 ++ src/features/Conversation/Error/index.tsx | 5 + .../components/InboxWelcome/index.tsx | 21 +- src/features/User/UserAvatar.tsx | 16 +- src/features/User/UserInfo.tsx | 15 +- src/features/User/UserLoginOrSignup.tsx | 23 + src/features/User/UserPanel/PanelContent.tsx | 74 ++ src/features/User/UserPanel/Popover.tsx | 35 - src/features/User/UserPanel/UpgradeBadge.tsx | 19 + src/features/User/UserPanel/index.tsx | 35 +- src/features/User/UserPanel/useMenu.tsx | 70 +- .../User/__tests__/PanelContent.test.tsx | 151 ++++ .../User/__tests__/UserAvatar.test.tsx | 78 ++ src/hooks/useGreeting/greetingTime.ts | 14 + src/hooks/useGreeting/index.ts | 16 + src/layout/AuthProvider/Clerk/UserUpdater.tsx | 41 + src/layout/AuthProvider/Clerk/index.tsx | 26 + .../AuthProvider/Clerk/useAppearance.ts | 118 +++ src/layout/AuthProvider/index.tsx | 12 +- src/libs/next-auth/index.ts | 10 +- src/libs/next-auth/sso-providers/auth0.ts | 10 +- src/libs/next-auth/sso-providers/authentik.ts | 10 +- src/libs/next-auth/sso-providers/azure-ad.ts | 10 +- src/libs/next-auth/sso-providers/github.ts | 8 +- src/libs/next-auth/sso-providers/zitadel.ts | 10 +- src/locales/default/auth.ts | 6 + src/locales/default/clerk.ts | 782 ++++++++++++++++++ src/locales/default/common.ts | 2 + src/locales/default/error.ts | 8 + src/locales/default/index.ts | 4 + src/middleware.ts | 25 +- src/server/globalConfig/index.ts | 4 +- src/store/user/selectors.ts | 2 +- src/store/user/slices/auth/action.test.ts | 105 +++ src/store/user/slices/auth/action.ts | 45 +- src/store/user/slices/auth/initialState.ts | 15 + src/store/user/slices/auth/selectors.test.ts | 127 +++ src/store/user/slices/auth/selectors.ts | 39 +- .../settings/selectors/selectors.test.ts | 25 + .../slices/settings/selectors/settings.ts | 6 + src/types/fetch.ts | 1 + 136 files changed, 15860 insertions(+), 383 deletions(-) create mode 100644 locales/ar/auth.json create mode 100644 locales/ar/clerk.json create mode 100644 locales/bg-BG/auth.json create mode 100644 locales/bg-BG/clerk.json create mode 100644 locales/de-DE/auth.json create mode 100644 locales/de-DE/clerk.json create mode 100644 locales/en-US/auth.json create mode 100644 locales/en-US/clerk.json create mode 100644 locales/es-ES/auth.json create mode 100644 locales/es-ES/clerk.json create mode 100644 locales/fr-FR/auth.json create mode 100644 locales/fr-FR/clerk.json create mode 100644 locales/it-IT/auth.json create mode 100644 locales/it-IT/clerk.json create mode 100644 locales/ja-JP/auth.json create mode 100644 locales/ja-JP/clerk.json create mode 100644 locales/ko-KR/auth.json create mode 100644 locales/ko-KR/clerk.json create mode 100644 locales/nl-NL/auth.json create mode 100644 locales/nl-NL/clerk.json create mode 100644 locales/pl-PL/auth.json create mode 100644 locales/pl-PL/clerk.json create mode 100644 locales/pt-BR/auth.json create mode 100644 locales/pt-BR/clerk.json create mode 100644 locales/ru-RU/auth.json create mode 100644 locales/ru-RU/clerk.json create mode 100644 locales/tr-TR/auth.json create mode 100644 locales/tr-TR/clerk.json create mode 100644 locales/vi-VN/auth.json create mode 100644 locales/vi-VN/clerk.json create mode 100644 locales/zh-CN/auth.json create mode 100644 locales/zh-CN/clerk.json create mode 100644 locales/zh-TW/auth.json create mode 100644 locales/zh-TW/clerk.json create mode 100644 src/app/(auth)/layout.tsx create mode 100644 src/app/(auth)/login/[[...login]]/PageTitle.tsx create mode 100644 src/app/(auth)/login/[[...login]]/page.tsx create mode 100644 src/app/(auth)/profile/[[...slugs]]/PageTitle.tsx create mode 100644 src/app/(auth)/profile/[[...slugs]]/page.tsx create mode 100644 src/app/(auth)/signup/[[...signup]]/PageTitle.tsx create mode 100644 src/app/(auth)/signup/[[...signup]]/page.tsx create mode 100644 src/app/api/chat/auth/index.test.ts create mode 100644 src/config/auth.ts delete mode 100644 src/config/server/auth.ts create mode 100644 src/features/Conversation/Error/ClerkLogin/index.tsx create mode 100644 src/features/User/UserLoginOrSignup.tsx create mode 100644 src/features/User/UserPanel/PanelContent.tsx delete mode 100644 src/features/User/UserPanel/Popover.tsx create mode 100644 src/features/User/UserPanel/UpgradeBadge.tsx create mode 100644 src/features/User/__tests__/PanelContent.test.tsx create mode 100644 src/features/User/__tests__/UserAvatar.test.tsx create mode 100644 src/hooks/useGreeting/greetingTime.ts create mode 100644 src/hooks/useGreeting/index.ts create mode 100644 src/layout/AuthProvider/Clerk/UserUpdater.tsx create mode 100644 src/layout/AuthProvider/Clerk/index.tsx create mode 100644 src/layout/AuthProvider/Clerk/useAppearance.ts create mode 100644 src/locales/default/auth.ts create mode 100644 src/locales/default/clerk.ts create mode 100644 src/store/user/slices/auth/selectors.test.ts diff --git a/.npmrc b/.npmrc index 28121b65b1bef..669c1e1a12cca 100644 --- a/.npmrc +++ b/.npmrc @@ -14,3 +14,5 @@ public-hoist-pattern[]=*semantic-release* public-hoist-pattern[]=*stylelint* public-hoist-pattern[]=@auth/core +public-hoist-pattern[]=@clerk/backend +public-hoist-pattern[]=@clerk/types diff --git a/docs/self-hosting/advanced/authentication.mdx b/docs/self-hosting/advanced/authentication.mdx index 32967a55291e3..02570c1ffcf56 100644 --- a/docs/self-hosting/advanced/authentication.mdx +++ b/docs/self-hosting/advanced/authentication.mdx @@ -1,40 +1,47 @@ --- -title: >- - LobeChat Identity Verification Service - Centralized User Authorization - Management +title: LobeChat Authorization Service description: >- Learn about LobeChat's support for configuring external identity verification services for centralized user authorization within enterprises/organizations. Explore supported services like Auth0, Microsoft Entra ID, Authentik, Github, and ZITADEL. tags: - - Identity Verification Service - - Centralized User Authorization - SSO Providers - - Auth0 - - Microsoft Entra ID - - Authentik - - Github - - ZITADEL + - Next Auth + - Clerk --- -# Identity Verification Service +# LobeChat Authorization LobeChat supports the configuration of external identity verification services for internal use within enterprises/organizations to centrally manage user authorization. -Currently supported identity verification services include: +## Clerk + +Clerk is a comprehensive identity verification solution that has recently gained popularity. It provides a simple yet powerful API and services to handle user authentication and session management. Clerk's design philosophy is to offer a concise and modern authentication solution that enables developers to easily integrate and use it. + +LobeChat has deeply integrated with Clerk to provide users with a more secure and convenient login and registration experience. It also relieves developers from the burden of managing authentication logic. Clerk's concise and modern design philosophy aligns perfectly with LobeChat's goals, making user management on the entire platform more efficient and reliable. -- [Auth0](/docs/self-hosting/advanced/sso-providers/auth0) -- [Microsoft Entra ID](/docs/self-hosting/advanced/sso-providers/microsoft-entra-id) -- [Authentik](/docs/self-hosting/advanced/sso-providers/authentik) -- [Github](/docs/self-hosting/advanced/sso-providers/github) -- [ZITADEL](/docs/self-hosting/advanced/sso-providers/zitadel) +By setting the environment variables NEXT_PUBLIC_CLERK_PUBLISHABLE_KEY and CLERK_SECRET_KEY in LobeChat's environment, you can enable and use Clerk. + +## Next Auth + +Currently supported identity verification services include: + + + + + + + Click on the links to view the corresponding platform's configuration documentation. ## Advanced Configuration -To simultaneously enable multiple identity verification sources, please set the `SSO_PROVIDERS` environment variable, separating them with commas, for example, `auth0,azure-ad,authentik`. +To simultaneously enable multiple identity verification sources, please set the `NEXT_AUTH_SSO_PROVIDERS` environment variable, separating them with commas, for example, `auth0,azure-ad,authentik`. The order corresponds to the display order of the SSO providers. diff --git a/docs/self-hosting/advanced/authentication.zh-CN.mdx b/docs/self-hosting/advanced/authentication.zh-CN.mdx index 16c0fb5f9fc5b..3bbd5cb91f116 100644 --- a/docs/self-hosting/advanced/authentication.zh-CN.mdx +++ b/docs/self-hosting/advanced/authentication.zh-CN.mdx @@ -1,36 +1,45 @@ --- -title: LobeChat 外部身份验证服务配置指南 -description: >- - 了解如何配置外部身份验证服务以统一管理用户授权。支持的身份验证服务包括 Auth0, Microsoft Entra ID, Authentik, - Github, 和 ZITADEL。 +title: LobeChat 身份验证服务配置 +description: 了解如何使用 Clerk 或 Next Auth 配置外部身份验证服务,以统一管理用户授权。支持的身份验证服务包括 Auth0、 Azure ID 等。 tags: - 身份验证服务 - LobeChat - SSO - - Auth0 - - Microsoft Entra ID - - Authentik - - Github - - ZITADEL + - Clerk --- # 身份验证服务 -LobeChat 支持配置外部身份验证服务,供企业 / 组织内部使用,统一管理用户授权。 +LobeChat 支持使用 Clerk 或者 Next Auth 配置外部身份验证服务,供企业 / 组织内部使用,统一管理用户授权。 + +## Clerk + +Clerk 是一个近期流行起来的全面的身份验证解决方案,它提供了简单而强大的 API 和服务来处理用户认证和会话管理。Clerk 的设计哲学是提供一套简洁、现代的认证解决方案,使得开发者可以轻松集成和使用。 + +LobeChat 与 Clerk 做了深度集成,能够为用户提供一个更加安全、便捷的登录和注册体验,同时也为开发者减轻了管理身份验证逻辑的负担。Clerk 的简洁和现代的设计理念与 LobeChat 的目标非常契合,使得整个平台的用户管理更加高效和可靠。 + +在 LobeChat 的环境变量中设置 `NEXT_PUBLIC_CLERK_PUBLISHABLE_KEY` 和 `CLERK_SECRET_KEY`,即可开启和使用 Clerk。 + +## Next Auth 目前支持的身份验证服务有: -- [Auth0](/docs/self-hosting/advanced/sso-providers/auth0) -- [Microsoft Entra ID](/docs/self-hosting/advanced/sso-providers/microsoft-entra-id) -- [Authentik](/docs/self-hosting/advanced/sso-providers/authentik) -- [Github](/docs/self-hosting/advanced/sso-providers/github) -- [ZITADEL](/docs/self-hosting/advanced/sso-providers/zitadel) + + + + + + + -点击链接可以查看对应平台的配置文档。 +点击即可查看对应平台的配置文档。 ## 进阶配置 -同时启用多个身份验证源请设置 `SSO_PROVIDERS` 环境变量,以逗号 `,` 分割,例如 `auth0,azure-ad,authentik`。 +同时启用多个身份验证源请设置 `NEXT_AUTH_SSO_PROVIDERS` 环境变量,以逗号 `,` 分割,例如 `auth0,azure-ad,authentik`。 顺序为 SSO 提供商的显示顺序。 diff --git a/docs/self-hosting/advanced/model-list.mdx b/docs/self-hosting/advanced/model-list.mdx index 1b8aedb4fea37..9fa9eaafa21db 100644 --- a/docs/self-hosting/advanced/model-list.mdx +++ b/docs/self-hosting/advanced/model-list.mdx @@ -14,8 +14,8 @@ tags: LobeChat supports customizing the model list during deployment. You can use `+` to add a model, `-` to hide a model, and use `model name=display name` to customize the display name of a model, separated by English commas. The basic syntax is as follows: -```shell -id=displayName < maxToken:vision:fc:file > ,model2,model3 +```text +id=displayName,model2,model3 ``` For example: `+qwen-7b-chat,+glm-6b,-gpt-3.5-turbo,gpt-4-0125-preview=gpt-4-turbo` diff --git a/docs/self-hosting/advanced/model-list.zh-CN.mdx b/docs/self-hosting/advanced/model-list.zh-CN.mdx index 44c4449b55366..52949e1bce00c 100644 --- a/docs/self-hosting/advanced/model-list.zh-CN.mdx +++ b/docs/self-hosting/advanced/model-list.zh-CN.mdx @@ -12,8 +12,8 @@ tags: LobeChat 支持在部署时自定义模型列表,可以使用 `+` 增加一个模型,使用 `-` 来隐藏一个模型,使用 `模型名=展示名<扩展配置>` 来自定义模型的展示名,用英文逗号隔开。通过 `<>` 来添加扩展配置。基本语法如下: -```shell -id=displayName < maxToken:vision:fc:file > ,model2,model3 +```text +id=displayName,model2,model3 ``` 例如: `+qwen-7b-chat,+glm-6b,-gpt-3.5-turbo,gpt-4-0125-preview=gpt-4-turbo` diff --git a/docs/self-hosting/environment-variables/auth.mdx b/docs/self-hosting/environment-variables/auth.mdx index cb57434b671cc..42bb8a44029a2 100644 --- a/docs/self-hosting/environment-variables/auth.mdx +++ b/docs/self-hosting/environment-variables/auth.mdx @@ -5,150 +5,143 @@ description: >- services in LobeChat, including OAuth SSO, NextAuth settings, and provider-specific details. tags: - - LobeChat - Authentication Service - - Environment Variables - OAuth SSO + - Clerk - NextAuth - - Provider Details --- -## Authentication Service +# Authentication Service LobeChat provides a complete authentication service capability when deployed. The following are the relevant environment variables. You can use these environment variables to easily define the identity verification services that need to be enabled in LobeChat. -## General Settings +## Next Auth -### `ENABLE_OAUTH_SSO` +### General Settings -- Type: Required -- Description: Enable single sign-on (SSO) for LobeChat. Set to `1` to enable single sign-on. -- Default: `-` -- Example: `1` - -### `SSO_PROVIDERS` - -- Type: Required -- Description: Select the single sign-on provider for LoboChat. For multiple SSO Providers separating them with commas, for example, `auth0,azure-ad,authentik`. -- Default: `auth0` -- Example: `auth0,azure-ad,authentik` - -### `NEXTAUTH_SECRET` +#### `NEXTAUTH_SECRET` - Type: Required - Description: Key used to encrypt the session tokens in Auth.js. You can generate the key using the following command: `openssl rand -base64 32`. - Default: `-` - Example: `Tfhi2t2pelSMEA8eaV61KaqPNEndFFdMIxDaJnS1CUI=` -### `NEXTAUTH_URL` +#### `NEXTAUTH_URL` - Type: Optional - Description: This URL is used to specify the callback address for Auth.js during OAuth authentication. It does not need to be set when deploying on Vercel. - Default: `-` - Example: `https://example.com/api/auth` -## Auth0 +#### `NEXT_AUTH_SSO_PROVIDERS` + +- Type: Optional +- Description: Select the single sign-on provider for LoboChat. For multiple SSO Providers separating them with commas, for example, `auth0,azure-ad,authentik`. +- Default: `auth0` +- Example: `auth0,azure-ad,authentik` + +### Auth0 -### `AUTH0_CLIENT_ID` +#### `AUTH0_CLIENT_ID` - Type: Required - Description: Client ID of the Auth0 application. You can access it [here](https://manage.auth0.com/dashboard) and navigate to the application settings to view. - Default: `-` - Example: `evCnOJP1UX8FMnXR9Xkj5t0NyFn5p70P` -### `AUTH0_CLIENT_SECRET` +#### `AUTH0_CLIENT_SECRET` - Type: Required - Description: Client Secret of the Auth0 application. - Default: `-` - Example: `wnX7UbZg85ZUzF6ioxPLnJVEQa1Elbs7aqBUSF16xleBS5AdkVfASS49-fQIC8Rm` -### `AUTH0_ISSUER` +#### `AUTH0_ISSUER` - Type: Required - Description: Issuer/domain of the Auth0 application. - Default: `-` - Example: `https://example.auth0.com` -## Microsoft Entra ID +### Microsoft Entra ID -### `AZURE_AD_CLIENT_ID` +#### `AZURE_AD_CLIENT_ID` - Type: Required - Description: Client ID of the Microsoft Entra ID application. - Default: `-` - Example: `be8f6da1-58c3-4f16-ff1b-78f5148e10df` -### `AZURE_AD_CLIENT_SECRET` +#### `AZURE_AD_CLIENT_SECRET` - Type: Required - Description: Client Secret of the Microsoft Entra ID application. - Default: `-` - Example: `~gI8Q.pTiN1vwB6Gl.E1yFT1ojcXABkdACfJXaNj` -### `AZURE_AD_TENANT_ID` +#### `AZURE_AD_TENANT_ID` - Type: Required - Description: Tenant ID of the Microsoft Entra ID application. - Default: `-` - Example: `c8ae2f36-edf6-4cda-96b9-d3e198a47cba` -## Authentik +### Authentik -### `AUTHENTIK_CLIENT_ID` +#### `AUTHENTIK_CLIENT_ID` - Type: Required - Description: Client ID of the Authentik provider application. You can access it [here][auth0-client-page] and navigate to the application settings to view. - Default: `-` - Example: `evCnOJP1UX8FMnXR9Xkj5t0NyFn5p70P` -### `AUTHENTIK_CLIENT_SECRET` +#### `AUTHENTIK_CLIENT_SECRET` - Type: Required - Description: Client Secret of the Authentik provider application. - Default: `-` - Example: `wnX7UbZg85ZUzF6ioxPLnJVEQa1Elbs7aqBUSF16xleBS5AdkVfASS49-fQIC8Rm` -### `AUTHENTIK_ISSUER` +#### `AUTHENTIK_ISSUER` - Type: Required - Description: Issuer/domain of the Authentik provider application. - Default: `-` - Example: `https://your-authentik-domain.com/application/o/slug/` -## Github +### Github -### `GITHUB_CLIENT_ID` +#### `GITHUB_CLIENT_ID` - Type: Required - Description: Client ID of the Github application. You can access it [here](https://github.com/settings/apps) and navigate to the application settings to view. - Default: `-` - Example: `abd94200333283550508` -### `GITHUB_CLIENT_SECRET` +#### `GITHUB_CLIENT_SECRET` - Type: Required - Description: Client Secret of the Github application. - Default: `-` - Example: `dd262976ac0931d947e104891586a053f3d3750b` -## ZITADEL +### ZITADEL -### `ZITADEL_CLIENT_ID` +#### `ZITADEL_CLIENT_ID` - Type: Required - Description: Client ID of the ZITADEL application. This can be found under your application in the ZITADEL console. - Default: `-` - Example: `123456789012345678@your-project` -### `ZITADEL_CLIENT_SECRET` +#### `ZITADEL_CLIENT_SECRET` - Type: Required - Description: Client Secret of the ZITADEL application. - Default: `-` - Example: `9QF1n5ATzU7Z3mHp2Iw4gKX8kY6oR7uW1DnKcV3LqX2jF6iG3fBmJ1kV7nS5zE6A` -### `ZITADEL_ISSUER` +#### `ZITADEL_ISSUER` - Type: Required - Description: Issuer of the ZITADEL application. This is usually the URL of the ZITADEL instance, and can be found in `URLs` tab of your application in the console. @@ -160,3 +153,19 @@ LobeChat provides a complete authentication service capability when deployed. Th providers, you can submit a [feature request](https://github.com/lobehub/lobe-chat/issues/new/choose) or Pull Request. + +## Clerk + +### `NEXT_PUBLIC_CLERK_PUBLISHABLE_KEY` + +- Type: Required +- Description: Publishable key of the Clerk application. You can access it [here](https://dashboard.clerk.com) and navigate to the API Keys to view. +- Default: `-` +- Example: `pk_test_Zmxvd4luZy1wdW1hLTIyLmNsXXJrTmFjY291bnRzLmRldiQ` in dev / `pk_live_Y2xlcdsubG9iZWh1Yi1cbmMuY24k` in production + +### `CLERK_SECRET_KEY` + +- Type: Required +- Description: Secret key of the Clerk application. +- Default: `-` +- Example: `sk_test_513Ma0P7IAWM1XMv4waxZjRYRajWTaCfJLjpEO3SD2` in dev / `sk_live_eMMlHjwJvZFUfczFljSKqZdwQtLvmczmsJSNmdrpeZ` in production diff --git a/docs/self-hosting/environment-variables/auth.zh-CN.mdx b/docs/self-hosting/environment-variables/auth.zh-CN.mdx index 094a48848062c..ef984e06a39d7 100644 --- a/docs/self-hosting/environment-variables/auth.zh-CN.mdx +++ b/docs/self-hosting/environment-variables/auth.zh-CN.mdx @@ -1,155 +1,145 @@ --- title: LobeChat 身份验证服务设置 -description: >- - 了解如何配置 LobeChat 的身份验证服务环境变量,包括单点登录 (SSO)、Auth0、Microsoft Entra - ID、Authentik、Github 和 ZITADEL。 +description: 了解如何配置 LobeChat 的身份验证服务环境变量。 tags: - LobeChat - 身份验证服务 - 单点登录 - - Auth0 - - Microsoft Entra ID - - Authentik - - Github - - ZITADEL + - Next Auth + - Clerk --- # 身份验证服务 LobeChat 在部署时提供了完善的身份验证服务能力,以下是相关的环境变量,你可以使用这些环境变量轻松定义需要在 LobeChat 中开启的身份验证服务。 -## 通用设置 +## Next Auth -### `ENABLE_OAUTH_SSO` +### 通用设置 -- 类型:必选 -- 描述:为 LobeChat 启用单点登录 (SSO)。设置为 `1` 以启用单点登录。 -- 默认值: `-` -- 示例: `1` - -### `SSO_PROVIDERS` - -- Type: 必需 -- 描述:选择 LoboChat 的单点登录提供商。如果有多个单点登录提供商,请用逗号分隔,例如 `auth0,azure-ad,authentik` -- 默认值: `auth0` -- 示例: `auth0,azure-ad,authentik` - -### `NEXTAUTH_SECRET` +#### `NEXTAUTH_SECRET` - 类型:必选 - 描述:用于加密 Auth.js 会话令牌的密钥。您可以使用以下命令生成秘钥: `openssl rand -base64 32`. - 默认值: `-` - 示例: `Tfhi2t2pelSMEA8eaV61KaqPNEndFFdMIxDaJnS1CUI=` -### `NEXTAUTH_URL` +#### `NEXTAUTH_URL` - 类型:可选 - 描述:该 URL 用于指定 Auth.js 在执行 OAuth 验证时的回调地址,在 Vercel 上部署时无需设置。 - 默认值:`-` - 示例:`https://example.com/api/auth` -## Auth0 +#### `NEXT_AUTH_SSO_PROVIDERS` -### `AUTH0_CLIENT_ID` +- 类型:可选 +- 描述:选择 LoboChat 的单点登录提供商。如果有多个单点登录提供商,请用逗号分隔,例如 `auth0,azure-ad,authentik` +- 默认值: `auth0` +- 示例: `auth0,azure-ad,authentik` + +### Auth0 + +#### `AUTH0_CLIENT_ID` - 类型:必选 - 描述: Auth0 应用程序的 Client ID,您可以访问[这里](https://manage.auth0.com/dashboard)并导航至应用程序设置来查看 - 默认值: `-` - 示例: `evCnOJP1UX8FMnXR9Xkj5t0NyFn5p70P` -### `AUTH0_CLIENT_SECRET` +#### `AUTH0_CLIENT_SECRET` - 类型:必选 - 描述: Auth0 应用程序的 Client Secret - 默认值: `-` - 示例: `wnX7UbZg85ZUzF6ioxPLnJVEQa1Elbs7aqBUSF16xleBS5AdkVfASS49-fQIC8Rm` -### `AUTH0_ISSUER` +#### `AUTH0_ISSUER` - 类型:必选 - 描述: Auth0 应用程序的签发人 / 域 - 默认值: `-` - 示例: `https://example.auth0.com` -## Microsoft Entra ID +### Microsoft Entra ID -### `AZURE_AD_CLIENT_ID` +#### `AZURE_AD_CLIENT_ID` - 类型:必需 - 描述:Microsoft Entra ID 应用程序的客户端 ID。 - 默认值:`-` - 示例:`be8f6da1-58c3-4f16-ff1b-78f5148e10df` -### `AZURE_AD_CLIENT_SECRET` +#### `AZURE_AD_CLIENT_SECRET` - 类型:必需 - 描述:Microsoft Entra ID 应用程序的客户端密钥。 - 默认值:`-` - 示例:`~gI8Q.pTiN1vwB6Gl.E1yFT1ojcXABkdACfJXaNj` -### `AZURE_AD_TENANT_ID` +#### `AZURE_AD_TENANT_ID` - 类型:必需 - 描述:Microsoft Entra ID 应用程序的租户 ID。 - 默认值:`-` - 示例:`c8ae2f36-edf6-4cda-96b9-d3e198a47cba` -## Authentik +### Authentik -### `AUTHENTIK_CLIENT_ID` +#### `AUTHENTIK_CLIENT_ID` - 类型:必选 - 描述: Authentik 提供程序的 Client ID - 默认值: `-` - 示例: `YNtbIRlYF8Kj66mTLue59nsGLlb7HNyx1qjPH6VS` -### `AUTHENTIK_CLIENT_SECRET` +#### `AUTHENTIK_CLIENT_SECRET` - 类型:必选 - 描述: Authentik 提供程序的 Client Secret - 默认值: `-` - 示例: `h3lMI1vPUzqyqqeIDUbH5UNNOxyQLXk35h89yETeaAwHk7qVXBG3sJQWeqHBU5pyggwhP9u0eaZ1eq6DHUddVPLoS4gncqD37yuCr8jI8dY66WAt45MStDsDcQm0Ygze` -### `AUTHENTIK_ISSUER` +#### `AUTHENTIK_ISSUER` - 类型:必选 - 描述: Authentik 提供程序的 OpenID Connect 颁发者 - 默认值: `-` - 示例: `https://your-authentik-domain.com/application/o/slug/` -## Github +### Github -### `GITHUB_CLIENT_ID` +#### `GITHUB_CLIENT_ID` - Type: Required - Description: Github应用的客户端ID。您可以在[这里](https://github.com/settings/apps)访问,并导航到应用程序设置以查看。 - Default: `-` - Example: `abd94200333283550508` -### `GITHUB_CLIENT_SECRET` +#### `GITHUB_CLIENT_SECRET` - Type: Required - Description: Github应用的客户端密钥。 - Default: `-` - Example: `dd262976ac0931d947e104891586a053f3d3750b` -## ZITADEL +### ZITADEL -### `ZITADEL_CLIENT_ID` +#### `ZITADEL_CLIENT_ID` - 类型:必选 - 描述:ZITADEL 应用的 Client ID。您可以在 ZITADEL 控制台应用设置中找到 Client ID。 - 默认值:`-` - 示例:`123456789012345678@your-project` -### `ZITADEL_CLIENT_SECRET` +#### `ZITADEL_CLIENT_SECRET` - 类型:必选 - 描述:ZITADEL 应用的 Client Secret。 - 默认值:`-` - 示例:`9QF1n5ATzU7Z3mHp2Iw4gKX8kY6oR7uW1DnKcV3LqX2jF6iG3fBmJ1kV7nS5zE6A` -### `ZITADEL_ISSUER` +#### `ZITADEL_ISSUER` - 类型:必选 - 描述:ZITADEL 应用的 OpenID Connect 颁发者(issuer),通常为 ZITADEL 实例的 URL。您可以在 ZITADEL 控制台应用设置中的 `URLs` 选项卡中找到 issuer。 @@ -160,3 +150,19 @@ LobeChat 在部署时提供了完善的身份验证服务能力,以下是相 如果您需要使用其他身份验证服务提供商,可以提交 [功能请求](https://github.com/lobehub/lobe-chat/issues/new/choose) 或 Pull Request。 + +## Clerk + +### `NEXT_PUBLIC_CLERK_PUBLISHABLE_KEY` + +- 类型:必选 +- 描述: Clerk 应用程序的 Publishable key。您可以在[这里](https://dashboard.clerk.com)访问,并导航到 API Keys 以查看。 +- 默认值:`-` +- 示例: `pk_test_Zmxvd4luZy1wdW1hLTIyLmNsXXJrTmFjY291bnRzLmRldiQ` (测试环境) / `pk_live_Y2xlcdsubG9iZWh1Yi1cbmMuY24k` (生产环境) + +### `CLERK_SECRET_KEY` + +- 类型:必选 +- 描述: Clerk 应用程序的 Secret key。您可以在[这里](https://dashboard.clerk.com)访问,并导航到 API Keys 以查看。 +- 默认值:`-` +- 示例: `sk_test_513Ma0P7IAWM1XMv4waxZjRYRajWTaCfJLjpEO3SD2` (测试环境) / `sk_live_eMMlHjwJvZFUfczFljSKqZdwQtLvmczmsJSNmdrpeZ`(生产环境) diff --git a/locales/ar/auth.json b/locales/ar/auth.json new file mode 100644 index 0000000000000..545c222a15f86 --- /dev/null +++ b/locales/ar/auth.json @@ -0,0 +1,6 @@ +{ + "login": "تسجيل الدخول", + "loginOrSignup": "تسجيل الدخول / التسجيل", + "signout": "تسجيل الخروج", + "signup": "التسجيل" +} diff --git a/locales/ar/clerk.json b/locales/ar/clerk.json new file mode 100644 index 0000000000000..3702351fa31fa --- /dev/null +++ b/locales/ar/clerk.json @@ -0,0 +1,769 @@ +{ + "backButton": "الرجوع", + "badge__default": "افتراضي", + "badge__otherImpersonatorDevice": "جهاز تمثيل آخر", + "badge__primary": "أساسي", + "badge__requiresAction": "يتطلب إجراء", + "badge__thisDevice": "هذا الجهاز", + "badge__unverified": "غير موثق", + "badge__userDevice": "جهاز المستخدم", + "badge__you": "أنت", + "createOrganization": { + "formButtonSubmit": "إنشاء منظمة", + "invitePage": { + "formButtonReset": "تخطي" + }, + "title": "إنشاء منظمة" + }, + "dates": { + "lastDay": "أمس في {{ date | timeString('en-US') }}", + "next6Days": "{{ date | weekday('en-US','long') }} في {{ date | timeString('en-US') }}", + "nextDay": "غدًا في {{ date | timeString('en-US') }}", + "numeric": "{{ date | numeric('en-US') }}", + "previous6Days": "الماضي {{ date | weekday('en-US','long') }} في {{ date | timeString('en-US') }}", + "sameDay": "اليوم في {{ date | timeString('en-US') }}" + }, + "dividerText": "أو", + "footerActionLink__useAnotherMethod": "استخدام طريقة أخرى", + "footerPageLink__help": "المساعدة", + "footerPageLink__privacy": "الخصوصية", + "footerPageLink__terms": "البنود", + "formButtonPrimary": "متابعة", + "formButtonPrimary__verify": "التحقق", + "formFieldAction__forgotPassword": "هل نسيت كلمة المرور؟", + "formFieldError__matchingPasswords": "تتطابق كلمات المرور.", + "formFieldError__notMatchingPasswords": "كلمات المرور غير متطابقة.", + "formFieldError__verificationLinkExpired": "انتهت صلاحية رابط التحقق. يرجى طلب رابط جديد.", + "formFieldHintText__optional": "اختياري", + "formFieldHintText__slug": "الـ Slug هو معرف يمكن قراءته بواسطة الإنسان ويجب أن يكون فريدًا. غالبًا ما يُستخدم في عناوين URL.", + "formFieldInputPlaceholder__backupCode": "", + "formFieldInputPlaceholder__confirmDeletionUserAccount": "حذف الحساب", + "formFieldInputPlaceholder__emailAddress": "", + "formFieldInputPlaceholder__emailAddress_username": "", + "formFieldInputPlaceholder__emailAddresses": "example@email.com, example2@email.com", + "formFieldInputPlaceholder__firstName": "", + "formFieldInputPlaceholder__lastName": "", + "formFieldInputPlaceholder__organizationDomain": "", + "formFieldInputPlaceholder__organizationDomainEmailAddress": "", + "formFieldInputPlaceholder__organizationName": "", + "formFieldInputPlaceholder__organizationSlug": "my-org", + "formFieldInputPlaceholder__password": "", + "formFieldInputPlaceholder__phoneNumber": "", + "formFieldInputPlaceholder__username": "", + "formFieldLabel__automaticInvitations": "تمكين الدعوات التلقائية لهذا النطاق", + "formFieldLabel__backupCode": "رمز النسخ الاحتياطي", + "formFieldLabel__confirmDeletion": "تأكيد", + "formFieldLabel__confirmPassword": "تأكيد كلمة المرور", + "formFieldLabel__currentPassword": "كلمة المرور الحالية", + "formFieldLabel__emailAddress": "عنوان البريد الإلكتروني", + "formFieldLabel__emailAddress_username": "عنوان البريد الإلكتروني أو اسم المستخدم", + "formFieldLabel__emailAddresses": "عناوين البريد الإلكتروني", + "formFieldLabel__firstName": "الاسم الأول", + "formFieldLabel__lastName": "الاسم الأخير", + "formFieldLabel__newPassword": "كلمة مرور جديدة", + "formFieldLabel__organizationDomain": "نطاق", + "formFieldLabel__organizationDomainDeletePending": "حذف الدعوات والاقتراحات المعلقة", + "formFieldLabel__organizationDomainEmailAddress": "عنوان البريد الإلكتروني للتحقق", + "formFieldLabel__organizationDomainEmailAddressDescription": "أدخل عنوان بريد إلكتروني تحت هذا النطاق لتلقي رمز والتحقق من هذا النطاق.", + "formFieldLabel__organizationName": "الاسم", + "formFieldLabel__organizationSlug": "Slug", + "formFieldLabel__passkeyName": "اسم مفتاح الوصول", + "formFieldLabel__password": "كلمة المرور", + "formFieldLabel__phoneNumber": "رقم الهاتف", + "formFieldLabel__role": "الدور", + "formFieldLabel__signOutOfOtherSessions": "تسجيل الخروج من جميع الأجهزة الأخرى", + "formFieldLabel__username": "اسم المستخدم", + "impersonationFab": { + "action__signOut": "تسجيل الخروج", + "title": "تم تسجيل الدخول بواسطة {{identifier}}" + }, + "locale": "ar", + "maintenanceMode": "نحن حاليًا في وضع الصيانة، ولكن لا تقلق، لن يستغرق الأمر أكثر من بضع دقائق.", + "membershipRole__admin": "مسؤول", + "membershipRole__basicMember": "عضو", + "membershipRole__guestMember": "ضيف", + "organizationList": { + "action__createOrganization": "إنشاء منظمة", + "action__invitationAccept": "الانضمام", + "action__suggestionsAccept": "طلب الانضمام", + "createOrganization": "إنشاء منظمة", + "invitationAcceptedLabel": "انضمام", + "subtitle": "لمتابعة {{applicationName}}", + "suggestionsAcceptedLabel": "في انتظار الموافقة", + "title": "اختر حسابًا", + "titleWithoutPersonal": "اختر منظمة" + }, + "organizationProfile": { + "badge__automaticInvitation": "دعوات تلقائية", + "badge__automaticSuggestion": "اقتراحات تلقائية", + "badge__manualInvitation": "لا تسجيل تلقائي", + "badge__unverified": "غير موثق", + "createDomainPage": { + "subtitle": "أضف النطاق للتحقق. يمكن للمستخدمين الذين لديهم عناوين بريد إلكتروني في هذا النطاق الانضمام إلى المنظمة تلقائيًا أو طلب الانضمام.", + "title": "إضافة النطاق" + }, + "invitePage": { + "detailsTitle__inviteFailed": "تعذر إرسال الدعوات. هناك دعوات معلقة بالفعل لعناوين البريد الإلكتروني التالية: {{email_addresses}}.", + "formButtonPrimary__continue": "إرسال الدعوات", + "selectDropdown__role": "اختر الدور", + "subtitle": "أدخل أو الصق عناوين بريد إلكتروني واحدة أو أكثر، مفصولة بمسافات أو فواصل.", + "successMessage": "تم إرسال الدعوات بنجاح", + "title": "دعوة أعضاء جدد" + }, + "membersPage": { + "action__invite": "دعوة", + "activeMembersTab": { + "menuAction__remove": "إزالة العضو", + "tableHeader__actions": "", + "tableHeader__joined": "انضم", + "tableHeader__role": "الدور", + "tableHeader__user": "المستخدم" + }, + "detailsTitle__emptyRow": "لا يوجد أعضاء لعرضهم", + "invitationsTab": { + "autoInvitations": { + "headerSubtitle": "قم بدعوة المستخدمين عن طريق ربط نطاق البريد الإلكتروني بالمنظمة. سيتمكن أي شخص يسجل الدخول بنطاق بريد إلكتروني متطابق من الانضمام إلى المنظمة في أي وقت.", + "headerTitle": "دعوات تلقائية", + "primaryButton": "إدارة النطاقات الموثقة" + }, + "table__emptyRow": "لا توجد دعوات لعرضها" + }, + "invitedMembersTab": { + "menuAction__revoke": "إلغاء الدعوة", + "tableHeader__invited": "تمت الدعوة" + }, + "requestsTab": { + "autoSuggestions": { + "headerSubtitle": "المستخدمون الذين يسجلون الدخول بنطاق بريد إلكتروني متطابق، سيتمكنون من رؤية اقتراح لطلب الانضمام إلى منظمتك.", + "headerTitle": "اقتراحات تلقائية", + "primaryButton": "إدارة النطاقات الموثقة" + }, + "menuAction__approve": "الموافقة", + "menuAction__reject": "رفض", + "tableHeader__requested": "طلب الوصول", + "table__emptyRow": "لا توجد طلبات لعرضها" + }, + "start": { + "headerTitle__invitations": "دعوات", + "headerTitle__members": "أعضاء", + "headerTitle__requests": "طلبات" + } + }, + "navbar": { + "description": "إدارة منظمتك.", + "general": "عام", + "members": "أعضاء", + "title": "المنظمة" + }, + "profilePage": { + "dangerSection": { + "deleteOrganization": { + "actionDescription": "اكتب \"{{organizationName}}\" أدناه للمتابعة.", + "messageLine1": "هل أنت متأكد أنك تريد حذف هذه المنظمة؟", + "messageLine2": "هذا الإجراء دائم ولا يمكن التراجع عنه.", + "successMessage": "لقد حذفت المنظمة.", + "title": "حذف المنظمة" + }, + "leaveOrganization": { + "actionDescription": "اكتب \"{{organizationName}}\" أدناه للمتابعة.", + "messageLine1": "هل أنت متأكد أنك تريد مغادرة هذه المنظمة؟ ستفقد الوصول إلى هذه المنظمة وتطبيقاتها.", + "messageLine2": "هذا الإجراء دائم ولا يمكن التراجع عنه.", + "successMessage": "لقد غادرت المنظمة.", + "title": "مغادرة المنظمة" + }, + "title": "خطر" + }, + "domainSection": { + "menuAction__manage": "إدارة", + "menuAction__remove": "حذف", + "menuAction__verify": "التحقق", + "primaryButton": "إضافة النطاق", + "subtitle": "اسمح للمستخدمين بالانضمام إلى المنظمة تلقائيًا أو طلب الانضمام بناءً على نطاق بريد إلكتروني موثق.", + "title": "النطاقات الموثقة" + }, + "successMessage": "تم تحديث المنظمة.", + "title": "تحديث الملف الشخصي" + }, + "removeDomainPage": { + "messageLine1": "سيتم إزالة نطاق البريد الإلكتروني {{domain}}.", + "messageLine2": "لن يتمكن المستخدمون من الانضمام إلى المنظمة تلقائيًا بعد ذلك.", + "successMessage": "تمت إزالة {{domain}}.", + "title": "إزالة النطاق" + }, + "start": { + "headerTitle__general": "عام", + "headerTitle__members": "أعضاء", + "profileSection": { + "primaryButton": "تحديث الملف الشخصي", + "title": "ملف المنظمة", + "uploadAction__title": "شعار" + } + }, + "verifiedDomainPage": { + "dangerTab": { + "calloutInfoLabel": "سيؤثر إزالة هذا النطاق على المستخدمين المدعوين.", + "removeDomainActionLabel__remove": "إزالة النطاق", + "removeDomainSubtitle": "قم بإزالة هذا النطاق من نطاقاتك الموثقة", + "removeDomainTitle": "إزالة النطاق" + }, + "enrollmentTab": { + "automaticInvitationOption__description": "يتم دعوة المستخدمين تلقائيًا للانضمام إلى المنظمة عند تسجيلهم، ويمكنهم الانضمام في أي وقت.", + "automaticInvitationOption__label": "دعوات تلقائية", + "automaticSuggestionOption__description": "يتلقى المستخدمون اقتراحًا لطلب الانضمام، ولكن يجب أن يتمتعوا بموافقة من مسؤول قبل الانضمام إلى المنظمة.", + "automaticSuggestionOption__label": "اقتراحات تلقائية", + "calloutInfoLabel": "تؤثر تغيير وضع التسجيل فقط على المستخدمين الجدد.", + "calloutInvitationCountLabel": "الدعوات المعلقة المرسلة للمستخدمين: {{count}}", + "calloutSuggestionCountLabel": "الاقتراحات المعلقة المرسلة للمستخدمين: {{count}}", + "manualInvitationOption__description": "يمكن فقط دعوة المستخدمين يدويًا إلى المنظمة.", + "manualInvitationOption__label": "لا تسجيل تلقائي", + "subtitle": "اختر كيف يمكن للمستخدمين من هذا النطاق الانضمام إلى المنظمة." + }, + "start": { + "headerTitle__danger": "خطر", + "headerTitle__enrollment": "خيارات التسجيل" + }, + "subtitle": "تم التحقق الآن من النطاق {{domain}}. تابع باختيار وضع التسجيل.", + "title": "تحديث {{domain}}" + }, + "verifyDomainPage": { + "formSubtitle": "أدخل رمز التحقق المرسل إلى عنوان بريدك الإلكتروني", + "formTitle": "رمز التحقق", + "resendButton": "لم تتلقى الرمز؟ إعادة الإرسال", + "subtitle": "يجب التحقق من النطاق {{domainName}} عبر البريد الإلكتروني.", + "subtitleVerificationCodeScreen": "تم إرسال رمز التحقق إلى {{emailAddress}}. أدخل الرمز للمتابعة.", + "title": "التحقق من النطاق" + } + }, + "organizationSwitcher": { + "action__createOrganization": "إنشاء منظمة", + "action__invitationAccept": "الانضمام", + "action__manageOrganization": "إدارة", + "action__suggestionsAccept": "طلب الانضمام", + "notSelected": "لم يتم تحديد أي منظمة", + "personalWorkspace": "الحساب الشخصي", + "suggestionsAcceptedLabel": "في انتظار الموافقة" + }, + "paginationButton__next": "التالي", + "paginationButton__previous": "السابق", + "paginationRowText__displaying": "عرض", + "paginationRowText__of": "من", + "signIn": { + "accountSwitcher": { + "action__addAccount": "إضافة حساب", + "action__signOutAll": "تسجيل الخروج من جميع الحسابات", + "subtitle": "اختر الحساب الذي ترغب في الاستمرار به.", + "title": "اختر حسابًا" + }, + "alternativeMethods": { + "actionLink": "احصل على مساعدة", + "actionText": "ليس لديك أحد هذه؟", + "blockButton__backupCode": "استخدام رمز الاحتياطي", + "blockButton__emailCode": "إرسال رمز بريد إلكتروني إلى {{identifier}}", + "blockButton__emailLink": "إرسال رابط بريد إلكتروني إلى {{identifier}}", + "blockButton__passkey": "تسجيل الدخول برمز الدخول", + "blockButton__password": "تسجيل الدخول بكلمة المرور", + "blockButton__phoneCode": "إرسال رمز SMS إلى {{identifier}}", + "blockButton__totp": "استخدام تطبيق الموثق الخاص بك", + "getHelp": { + "blockButton__emailSupport": "الدعم عبر البريد الإلكتروني", + "content": "إذا كنت تواجه صعوبة في تسجيل الدخول إلى حسابك، ارسل لنا بريدًا إلكترونيًا وسنعمل معك لاستعادة الوصول في أقرب وقت ممكن.", + "title": "احصل على مساعدة" + }, + "subtitle": "هل تواجه مشاكل؟ يمكنك استخدام أي من هذه الطرق لتسجيل الدخول.", + "title": "استخدم طريقة أخرى" + }, + "backupCodeMfa": { + "subtitle": "رمز الاحتياطي هو الرمز الذي حصلت عليه عند إعداد المصادقة ثنائية العامل.", + "title": "أدخل رمز الاحتياطي" + }, + "emailCode": { + "formTitle": "رمز التحقق", + "resendButton": "لم تستلم الرمز؟ إعادة الإرسال", + "subtitle": "للمتابعة إلى {{applicationName}}", + "title": "تحقق من بريدك الإلكتروني" + }, + "emailLink": { + "expired": { + "subtitle": "الرجاء العودة إلى التبويب الأصلي للمتابعة.", + "title": "انتهت صلاحية رابط التحقق هذا" + }, + "failed": { + "subtitle": "الرجاء العودة إلى التبويب الأصلي للمتابعة.", + "title": "رابط التحقق هذا غير صالح" + }, + "formSubtitle": "استخدم الرابط المرسل إلى بريدك الإلكتروني للتحقق", + "formTitle": "رابط التحقق", + "loading": { + "subtitle": "سيتم توجيهك قريبًا", + "title": "تسجيل الدخول..." + }, + "resendButton": "لم تستلم الرابط؟ إعادة الإرسال", + "subtitle": "للمتابعة إلى {{applicationName}}", + "title": "تحقق من بريدك الإلكتروني", + "unusedTab": { + "title": "يمكنك إغلاق هذا التبويب" + }, + "verified": { + "subtitle": "سيتم توجيهك قريبًا", + "title": "تم تسجيل الدخول بنجاح" + }, + "verifiedSwitchTab": { + "subtitle": "الرجوع إلى التبويب الأصلي للمتابعة", + "subtitleNewTab": "الرجوع إلى التبويب الجديد للمتابعة", + "titleNewTab": "تم تسجيل الدخول على تبويب آخر" + } + }, + "forgotPassword": { + "formTitle": "رمز إعادة تعيين كلمة المرور", + "resendButton": "لم تستلم الرمز؟ إعادة الإرسال", + "subtitle": "لإعادة تعيين كلمة المرور", + "subtitle_email": "أدخل أولًا الرمز المرسل إلى عنوان بريدك الإلكتروني", + "subtitle_phone": "أدخل أولًا الرمز المرسل إلى هاتفك", + "title": "إعادة تعيين كلمة المرور" + }, + "forgotPasswordAlternativeMethods": { + "blockButton__resetPassword": "إعادة تعيين كلمة المرور", + "label__alternativeMethods": "أو، قم بتسجيل الدخول باستخدام طريقة أخرى", + "title": "نسيت كلمة المرور؟" + }, + "noAvailableMethods": { + "message": "لا يمكن المتابعة في عملية تسجيل الدخول. لا يوجد عامل مصادقة متاح.", + "subtitle": "حدث خطأ", + "title": "لا يمكن تسجيل الدخول" + }, + "passkey": { + "subtitle": "استخدام رمز الدخول يؤكد أنك أنت. قد يطلب جهازك بصمة الإصبع أو الوجه أو قفل الشاشة.", + "title": "استخدام رمز الدخول" + }, + "password": { + "actionLink": "استخدام طريقة أخرى", + "subtitle": "أدخل كلمة المرور المرتبطة بحسابك", + "title": "أدخل كلمة المرور" + }, + "passwordPwned": { + "title": "تم تسريب كلمة المرور" + }, + "phoneCode": { + "formTitle": "رمز التحقق", + "resendButton": "لم تستلم الرمز؟ إعادة الإرسال", + "subtitle": "للمتابعة إلى {{applicationName}}", + "title": "تحقق من هاتفك" + }, + "phoneCodeMfa": { + "formTitle": "رمز التحقق", + "resendButton": "لم تستلم الرمز؟ إعادة الإرسال", + "subtitle": "للمتابعة، يرجى إدخال رمز التحقق المرسل إلى هاتفك", + "title": "تحقق من هاتفك" + }, + "resetPassword": { + "formButtonPrimary": "إعادة تعيين كلمة المرور", + "requiredMessage": "من الضروري إعادة تعيين كلمة المرور لأسباب أمنية.", + "successMessage": "تم تغيير كلمة المرور بنجاح. جارٍ تسجيل الدخول، يرجى الانتظار لحظة.", + "title": "تعيين كلمة مرور جديدة" + }, + "resetPasswordMfa": { + "detailsLabel": "نحتاج إلى التحقق من هويتك قبل إعادة تعيين كلمة المرور." + }, + "start": { + "actionLink": "التسجيل", + "actionLink__use_email": "استخدام البريد الإلكتروني", + "actionLink__use_email_username": "استخدام البريد الإلكتروني أو اسم المستخدم", + "actionLink__use_passkey": "استخدام رمز الدخول بدلاً", + "actionLink__use_phone": "استخدام الهاتف", + "actionLink__use_username": "استخدام اسم المستخدم", + "actionText": "ليس لديك حساب؟", + "subtitle": "مرحبًا! يرجى ملء التفاصيل للبدء.", + "title": "إنشاء حسابك" + }, + "totpMfa": { + "formTitle": "رمز التحقق", + "subtitle": "للمتابعة، يرجى إدخال رمز التحقق الذي تم توليده بواسطة تطبيق الموثق الخاص بك", + "title": "التحقق الثنائي الخطوة" + } + }, + "signInEnterPasswordTitle": "أدخل كلمة المرور الخاصة بك", + "signUp": { + "continue": { + "actionLink": "تسجيل الدخول", + "actionText": "هل لديك حساب بالفعل؟", + "subtitle": "يرجى ملء التفاصيل المتبقية للمتابعة.", + "title": "املأ الحقول الناقصة" + }, + "emailCode": { + "formSubtitle": "أدخل رمز التحقق المرسل إلى عنوان بريدك الإلكتروني", + "formTitle": "رمز التحقق", + "resendButton": "لم تستلم الرمز؟ إعادة الإرسال", + "subtitle": "أدخل رمز التحقق المرسل إلى بريدك الإلكتروني", + "title": "تحقق من بريدك الإلكتروني" + }, + "emailLink": { + "formSubtitle": "استخدم الرابط المرسل إلى عنوان بريدك الإلكتروني للتحقق", + "formTitle": "رابط التحقق", + "loading": { + "title": "جارٍ التسجيل..." + }, + "resendButton": "لم تستلم الرابط؟ إعادة الإرسال", + "subtitle": "للمتابعة إلى {{applicationName}}", + "title": "تحقق من بريدك الإلكتروني", + "verified": { + "title": "تم التسجيل بنجاح" + }, + "verifiedSwitchTab": { + "subtitle": "الرجوع إلى التبويب الجديد للمتابعة", + "subtitleNewTab": "الرجوع إلى التبويب السابق للمتابعة", + "title": "تم التحقق بنجاح من البريد الإلكتروني" + } + }, + "phoneCode": { + "formSubtitle": "أدخل رمز التحقق المرسل إلى رقم هاتفك", + "formTitle": "رمز التحقق", + "resendButton": "لم تستلم الرمز؟ إعادة الإرسال", + "subtitle": "أدخل رمز التحقق المرسل إلى هاتفك", + "title": "تحقق من هاتفك" + }, + "start": { + "actionLink": "تسجيل الدخول", + "actionText": "هل لديك حساب بالفعل؟", + "subtitle": "مرحبًا! يرجى ملء التفاصيل للبدء.", + "title": "إنشاء حسابك" + } + }, + "socialButtonsBlockButton": "المتابعة مع {{provider|titleize}}", + "unstable__errors": { + "captcha_invalid": "فشل تسجيل الدخول بسبب فشل التحقق من الأمان. يرجى تحديث الصفحة للمحاولة مرة أخرى أو التواصل مع الدعم للمزيد من المساعدة.", + "captcha_unavailable": "فشل تسجيل الدخول بسبب فشل التحقق من الروبوت. يرجى تحديث الصفحة للمحاولة مرة أخرى أو التواصل مع الدعم للمزيد من المساعدة.", + "form_code_incorrect": "", + "form_identifier_exists": "", + "form_identifier_exists__email_address": "هذا البريد الإلكتروني مستخدم. يرجى المحاولة بعنوان آخر.", + "form_identifier_exists__phone_number": "هذا الرقم مستخدم. يرجى المحاولة برقم آخر.", + "form_identifier_exists__username": "اسم المستخدم هذا مستخدم. يرجى المحاولة بآخر.", + "form_identifier_not_found": "", + "form_param_format_invalid": "", + "form_param_format_invalid__email_address": "يجب أن يكون عنوان البريد الإلكتروني صالحًا.", + "form_param_format_invalid__phone_number": "يجب أن يكون رقم الهاتف بتنسيق دولي صالح.", + "form_param_max_length_exceeded__first_name": "يجب ألا يتجاوز الاسم الأول 256 حرفًا.", + "form_param_max_length_exceeded__last_name": "يجب ألا يتجاوز الاسم الأخير 256 حرفًا.", + "form_param_max_length_exceeded__name": "يجب ألا يتجاوز الاسم 256 حرفًا.", + "form_param_nil": "", + "form_password_incorrect": "", + "form_password_length_too_short": "", + "form_password_not_strong_enough": "كلمة المرور الخاصة بك غير قوية بما فيه الكفاية.", + "form_password_pwned": "تم العثور على هذه كلمة المرور كجزء من اختراق ولا يمكن استخدامها، يرجى تجربة كلمة مرور أخرى بدلاً منها.", + "form_password_pwned__sign_in": "تم العثور على هذه كلمة المرور كجزء من اختراق ولا يمكن استخدامها، يرجى إعادة تعيين كلمة المرور الخاصة بك.", + "form_password_size_in_bytes_exceeded": "لقد تجاوزت كلمة المرور الحد الأقصى المسموح به من البايتات، يرجى تقصيرها أو إزالة بعض الرموز الخاصة.", + "form_password_validation_failed": "كلمة المرور غير صحيحة", + "form_username_invalid_character": "", + "form_username_invalid_length": "", + "identification_deletion_failed": "لا يمكنك حذف هويتك الأخيرة.", + "not_allowed_access": "", + "passkey_already_exists": "تم تسجيل مفتاح الوصول مسبقًا بهذا الجهاز.", + "passkey_not_supported": "مفاتيح الوصول غير مدعومة على هذا الجهاز.", + "passkey_pa_not_supported": "التسجيل يتطلب مصادق النظام ولكن الجهاز لا يدعم ذلك.", + "passkey_registration_cancelled": "تم إلغاء تسجيل مفتاح الوصول أو انتهت صلاحيته.", + "passkey_retrieval_cancelled": "تم إلغاء استرداد مفتاح الوصول أو انتهت صلاحيته.", + "passwordComplexity": { + "maximumLength": "أقل من {{length}} حرف", + "minimumLength": "{{length}} أو أكثر من الأحرف", + "requireLowercase": "حرف صغير", + "requireNumbers": "رقم", + "requireSpecialCharacter": "رمز خاص", + "requireUppercase": "حرف كبير", + "sentencePrefix": "يجب أن تحتوي كلمة المرور الخاصة بك على" + }, + "phone_number_exists": "هذا الرقم مستخدم. يرجى المحاولة برقم آخر.", + "zxcvbn": { + "couldBeStronger": "كلمة المرور الخاصة بك تعمل، ولكن يمكن أن تكون أقوى. جرب إضافة المزيد من الأحرف.", + "goodPassword": "كلمة المرور الخاصة بك تلبي جميع المتطلبات اللازمة.", + "notEnough": "كلمة المرور الخاصة بك ليست قوية بما فيه الكفاية.", + "suggestions": { + "allUppercase": "قم بتحويل بعض الحروف إلى أحرف كبيرة، ولكن ليس كلها.", + "anotherWord": "أضف المزيد من الكلمات غير الشائعة.", + "associatedYears": "تجنب السنوات المرتبطة بك.", + "capitalization": "استخدم الحروف الكبيرة أكثر من الحرف الأول فقط.", + "dates": "تجنب التواريخ والسنوات المرتبطة بك.", + "l33t": "تجنب التبديلات التنبؤية للحروف مثل '@' بدلاً من 'a'.", + "longerKeyboardPattern": "استخدم أنماط لوحة المفاتيح الطويلة وغير اتجاه الكتابة عدة مرات.", + "noNeed": "يمكنك إنشاء كلمات مرور قوية دون استخدام رموز أو أرقام أو حروف كبيرة.", + "pwned": "إذا استخدمت هذه كلمة المرور في مكان آخر، يجب عليك تغييرها.", + "recentYears": "تجنب السنوات الحديثة.", + "repeated": "تجنب تكرار الكلمات والأحرف.", + "reverseWords": "تجنب تهجئة الكلمات الشائعة بشكل معكوس.", + "sequences": "تجنب تسلسلات الأحرف الشائعة.", + "useWords": "استخدم كلمات متعددة، ولكن تجنب العبارات الشائعة." + }, + "warnings": { + "common": "هذه كلمة مرور شائعة الاستخدام.", + "commonNames": "الأسماء الشائعة سهلة التخمين.", + "dates": "التواريخ سهلة التخمين.", + "extendedRepeat": "أنماط الحروف المتكررة مثل \"abcabcabc\" سهلة التخمين.", + "keyPattern": "أنماط لوحة المفاتيح القصيرة سهلة التخمين.", + "namesByThemselves": "الأسماء الفردية أو الأسماء العائلية سهلة التخمين.", + "pwned": "تمت تعريض كلمة المرور الخاصة بك في اختراق على الإنترنت.", + "recentYears": "السنوات الحديثة سهلة التخمين.", + "sequences": "تسلسلات الأحرف الشائعة مثل \"abc\" سهلة التخمين.", + "similarToCommon": "هذا مشابه لكلمة مرور شائعة الاستخدام.", + "simpleRepeat": "الحروف المتكررة مثل \"aaa\" سهلة التخمين.", + "straightRow": "صفوف الحروف المستقيمة على لوحة المفاتيح سهلة التخمين.", + "topHundred": "هذه كلمة مرور تستخدم بكثرة.", + "topTen": "هذه كلمة مرور تستخدم بشكل كبير.", + "userInputs": "يجب ألا يكون هناك أي بيانات شخصية أو ذات صلة بالصفحة.", + "wordByItself": "الكلمات الفردية سهلة التخمين." + } + } + }, + "userButton": { + "action__addAccount": "إضافة حساب", + "action__manageAccount": "إدارة الحساب", + "action__signOut": "تسجيل الخروج", + "action__signOutAll": "تسجيل الخروج من جميع الحسابات" + }, + "userProfile": { + "backupCodePage": { + "actionLabel__copied": "تم النسخ!", + "actionLabel__copy": "نسخ الكل", + "actionLabel__download": "تحميل .txt", + "actionLabel__print": "طباعة", + "infoText1": "سيتم تمكين رموز النسخ الاحتياطي لهذا الحساب.", + "infoText2": "احتفظ برموز النسخ الاحتياطي بسرية وقم بتخزينها بشكل آمن. يمكنك إعادة إنشاء رموز النسخ الاحتياطي إذا كنت تشتبه في تعرضها للخطر.", + "subtitle__codelist": "قم بتخزينها بشكل آمن واحتفظ بها سرية.", + "successMessage": "تم تمكين رموز النسخ الاحتياطي الآن. يمكنك استخدام أحد هذه الرموز لتسجيل الدخول إلى حسابك، إذا فقدت الوصول إلى جهاز المصادقة الخاص بك. يمكن استخدام كل رمز مرة واحدة فقط.", + "successSubtitle": "يمكنك استخدام أحد هذه الرموز لتسجيل الدخول إلى حسابك، إذا فقدت الوصول إلى جهاز المصادقة الخاص بك.", + "title": "إضافة التحقق برمز النسخ الاحتياطي", + "title__codelist": "رموز النسخ الاحتياطي" + }, + "connectedAccountPage": { + "formHint": "حدد مزودًا للاتصال بحسابك.", + "formHint__noAccounts": "لا توجد مزودي حساب خارجي متاحين.", + "removeResource": { + "messageLine1": "سيتم إزالة {{identifier}} من هذا الحساب.", + "messageLine2": "لن تتمكن بعد الآن من استخدام هذا الحساب المتصل ولن تعمل أي ميزات تعتمد عليه.", + "successMessage": "تمت إزالة {{connectedAccount}} من حسابك.", + "title": "إزالة الحساب المتصل" + }, + "socialButtonsBlockButton": "{{provider|titleize}}", + "successMessage": "تمت إضافة المزود إلى حسابك", + "title": "إضافة حساب متصل" + }, + "deletePage": { + "actionDescription": "اكتب \"حذف الحساب\" أدناه للمتابعة.", + "confirm": "حذف الحساب", + "messageLine1": "هل أنت متأكد أنك تريد حذف حسابك؟", + "messageLine2": "هذا الإجراء دائم ولا يمكن التراجع عنه.", + "title": "حذف الحساب" + }, + "emailAddressPage": { + "emailCode": { + "formHint": "سيتم إرسال بريد إلكتروني يحتوي على رمز التحقق إلى هذا العنوان الإلكتروني.", + "formSubtitle": "أدخل رمز التحقق المرسل إلى {{identifier}}", + "formTitle": "رمز التحقق", + "resendButton": "لم تستلم الرمز؟ إعادة الإرسال", + "successMessage": "تمت إضافة البريد الإلكتروني {{identifier}} إلى حسابك." + }, + "emailLink": { + "formHint": "سيتم إرسال بريد إلكتروني يحتوي على رابط التحقق إلى هذا العنوان الإلكتروني.", + "formSubtitle": "انقر على الرابط في البريد الإلكتروني المرسل إلى {{identifier}}", + "formTitle": "رابط التحقق", + "resendButton": "لم تستلم الرابط؟ إعادة الإرسال", + "successMessage": "تمت إضافة البريد الإلكتروني {{identifier}} إلى حسابك." + }, + "removeResource": { + "messageLine1": "سيتم إزالة {{identifier}} من هذا الحساب.", + "messageLine2": "لن تتمكن بعد الآن من تسجيل الدخول باستخدام هذا العنوان الإلكتروني.", + "successMessage": "تمت إزالة {{emailAddress}} من حسابك.", + "title": "إزالة عنوان البريد الإلكتروني" + }, + "title": "إضافة عنوان بريد إلكتروني", + "verifyTitle": "تحقق من عنوان البريد الإلكتروني" + }, + "formButtonPrimary__add": "إضافة", + "formButtonPrimary__continue": "متابعة", + "formButtonPrimary__finish": "إنهاء", + "formButtonPrimary__remove": "إزالة", + "formButtonPrimary__save": "حفظ", + "formButtonReset": "إلغاء", + "mfaPage": { + "formHint": "حدد طريقة للإضافة.", + "title": "إضافة التحقق بخطوتين" + }, + "mfaPhoneCodePage": { + "backButton": "استخدام الرقم الحالي", + "primaryButton__addPhoneNumber": "إضافة رقم الهاتف", + "removeResource": { + "messageLine1": "لن يتم استقبال رموز التحقق من هذا الرقم بعد الآن عند تسجيل الدخول.", + "messageLine2": "قد لا يكون حسابك آمنًا. هل أنت متأكد من رغبتك في المتابعة؟", + "successMessage": "تمت إزالة التحقق بخطوتين عبر رمز SMS لـ {{mfaPhoneCode}}", + "title": "إزالة التحقق بخطوتين" + }, + "subtitle__availablePhoneNumbers": "حدد رقم هاتف موجود للتسجيل في التحقق بخطوتين عبر رمز SMS أو أضف واحدًا جديدًا.", + "subtitle__unavailablePhoneNumbers": "لا توجد أرقام هواتف متاحة للتسجيل في التحقق بخطوتين عبر رمز SMS، يرجى إضافة واحدة جديدة.", + "successMessage1": "عند تسجيل الدخول، ستحتاج إلى إدخال رمز التحقق المرسل إلى هذا الرقم كخطوة إضافية.", + "successMessage2": "احفظ هذه الرموز الاحتياطية وقم بتخزينها في مكان آمن. إذا فقدت الوصول إلى جهاز المصادقة الخاص بك، يمكنك استخدام رموز النسخ الاحتياطي لتسجيل الدخول.", + "successTitle": "تم تمكين التحقق برمز SMS", + "title": "إضافة التحقق برمز SMS" + }, + "mfaTOTPPage": { + "authenticatorApp": { + "buttonAbleToScan__nonPrimary": "مسح رمز الاستجابة السريعة بدلاً من ذلك", + "buttonUnableToScan__nonPrimary": "لا يمكن مسح رمز الاستجابة السريعة؟", + "infoText__ableToScan": "قم بإعداد طريقة تسجيل دخول جديدة في تطبيق المصادقة الخاص بك وامسح رمز الاستجابة السريعة التالي لربطه بحسابك.", + "infoText__unableToScan": "قم بإعداد طريقة تسجيل دخول جديدة في تطبيق المصادقة الخاص بك وأدخل المفتاح المقدم أدناه.", + "inputLabel__unableToScan1": "تأكد من تمكين كلمة المرور الزمنية أو كلمات المرور لمرة واحدة، ثم انهي ربط حسابك.", + "inputLabel__unableToScan2": "بديلًا، إذا كان جهاز المصادقة الخاص بك يدعم TOTP URIs، يمكنك أيضًا نسخ الرابط الكامل." + }, + "removeResource": { + "messageLine1": "لن تكون هناك حاجة لرموز التحقق من هذا التطبيق بعد الآن عند تسجيل الدخول.", + "messageLine2": "قد لا يكون حسابك آمنًا. هل أنت متأكد من رغبتك في المتابعة؟", + "successMessage": "تمت إزالة التحقق بخطوتين عبر تطبيق المصادقة.", + "title": "إزالة التحقق بخطوتين" + }, + "successMessage": "تم تمكين التحقق بخطوتين الآن. عند تسجيل الدخول، ستحتاج إلى إدخال رمز التحقق من هذا التطبيق كخطوة إضافية.", + "title": "إضافة تطبيق المصادقة", + "verifySubtitle": "أدخل رمز التحقق الذي تم إنشاؤه بواسطة تطبيق المصادقة الخاص بك", + "verifyTitle": "رمز التحقق" + }, + "mobileButton__menu": "القائمة", + "navbar": { + "account": "الملف الشخصي", + "description": "إدارة معلومات حسابك.", + "security": "الأمان", + "title": "الحساب" + }, + "passkeyScreen": { + "removeResource": { + "messageLine1": "{{name}} سيتم إزالته من هذا الحساب.", + "title": "إزالة مفتاح المرور" + }, + "subtitle__rename": "يمكنك تغيير اسم مفتاح المرور لتسهيل العثور عليه.", + "title__rename": "إعادة تسمية مفتاح المرور" + }, + "passwordPage": { + "checkboxInfoText__signOutOfOtherSessions": "يُوصى بتسجيل الخروج من جميع الأجهزة الأخرى التي قد تكون استخدمت كلمة المرور القديمة الخاصة بك.", + "readonly": "لا يمكن تحرير كلمة المرور الخاصة بك حاليًا لأنه يمكنك تسجيل الدخول فقط عبر الاتصال بالشركة.", + "successMessage__set": "تم تعيين كلمة المرور الخاصة بك.", + "successMessage__signOutOfOtherSessions": "تم تسجيل الخروج من جميع الأجهزة الأخرى.", + "successMessage__update": "تم تحديث كلمة المرور الخاصة بك.", + "title__set": "تعيين كلمة المرور", + "title__update": "تحديث كلمة المرور" + }, + "phoneNumberPage": { + "infoText": "سيتم إرسال رسالة نصية تحتوي على رمز التحقق إلى هذا الرقم. قد تنطبق رسوم الرسائل والبيانات.", + "removeResource": { + "messageLine1": "{{identifier}} سيتم إزالته من هذا الحساب.", + "messageLine2": "لن تتمكن بعد الآن من تسجيل الدخول باستخدام هذا الرقم.", + "successMessage": "تمت إزالة {{phoneNumber}} من حسابك.", + "title": "إزالة رقم الهاتف" + }, + "successMessage": "{{identifier}} تمت إضافته إلى حسابك.", + "title": "إضافة رقم الهاتف", + "verifySubtitle": "أدخل رمز التحقق المرسل إلى {{identifier}}", + "verifyTitle": "تحقق من رقم الهاتف" + }, + "profilePage": { + "fileDropAreaHint": "الحجم الموصى به 1:1، حتى 10 ميغابايت.", + "imageFormDestructiveActionSubtitle": "إزالة", + "imageFormSubtitle": "تحميل", + "imageFormTitle": "صورة الملف الشخصي", + "readonly": "تم توفير معلومات ملفك الشخصي من خلال الاتصال بالشركة ولا يمكن تحريرها.", + "successMessage": "تم تحديث ملفك الشخصي.", + "title": "تحديث الملف الشخصي" + }, + "start": { + "activeDevicesSection": { + "destructiveAction": "تسجيل الخروج من الجهاز", + "title": "الأجهزة النشطة" + }, + "connectedAccountsSection": { + "actionLabel__connectionFailed": "حاول مرة أخرى", + "actionLabel__reauthorize": "التفويض الآن", + "destructiveActionTitle": "إزالة", + "primaryButton": "ربط الحساب", + "subtitle__reauthorize": "تم تحديث النطاقات المطلوبة، وقد تواجه قدرًا محدودًا من الوظائف. يرجى إعادة تفويض هذا التطبيق لتجنب أي مشاكل", + "title": "الحسابات المتصلة" + }, + "dangerSection": { + "deleteAccountButton": "حذف الحساب", + "title": "حذف الحساب" + }, + "emailAddressesSection": { + "destructiveAction": "إزالة البريد الإلكتروني", + "detailsAction__nonPrimary": "تعيين كأساسي", + "detailsAction__primary": "اكتمال التحقق", + "detailsAction__unverified": "التحقق", + "primaryButton": "إضافة عنوان بريد إلكتروني", + "title": "عناوين البريد الإلكتروني" + }, + "enterpriseAccountsSection": { + "title": "حسابات المؤسسة" + }, + "headerTitle__account": "تفاصيل الملف الشخصي", + "headerTitle__security": "الأمان", + "mfaSection": { + "backupCodes": { + "actionLabel__regenerate": "إعادة إنشاء", + "headerTitle": "رموز النسخ الاحتياطي", + "subtitle__regenerate": "احصل على مجموعة جديدة من رموز النسخ الاحتياطي الآمنة. سيتم حذف رموز النسخ الاحتياطي السابقة ولا يمكن استخدامها.", + "title__regenerate": "إعادة إنشاء رموز النسخ الاحتياطي" + }, + "phoneCode": { + "actionLabel__setDefault": "تعيين كافتراضي", + "destructiveActionLabel": "إزالة" + }, + "primaryButton": "إضافة التحقق من خطوتين", + "title": "التحقق من خطوتين", + "totp": { + "destructiveActionTitle": "إزالة", + "headerTitle": "تطبيق المصادقة" + } + }, + "passkeysSection": { + "menuAction__destructive": "إزالة", + "menuAction__rename": "إعادة تسمية", + "title": "مفاتيح المرور" + }, + "passwordSection": { + "primaryButton__setPassword": "تعيين كلمة مرور", + "primaryButton__updatePassword": "تحديث كلمة المرور", + "title": "كلمة المرور" + }, + "phoneNumbersSection": { + "destructiveAction": "إزالة رقم الهاتف", + "detailsAction__nonPrimary": "تعيين كأساسي", + "detailsAction__primary": "اكتمال التحقق", + "detailsAction__unverified": "التحقق من رقم الهاتف", + "primaryButton": "إضافة رقم الهاتف", + "title": "أرقام الهواتف" + }, + "profileSection": { + "primaryButton": "تحديث الملف الشخصي", + "title": "الملف الشخصي" + }, + "usernameSection": { + "primaryButton__setUsername": "تعيين اسم المستخدم", + "primaryButton__updateUsername": "تحديث اسم المستخدم", + "title": "اسم المستخدم" + }, + "web3WalletsSection": { + "destructiveAction": "إزالة المحفظة", + "primaryButton": "محافظ Web3", + "title": "محافظ Web3" + } + }, + "usernamePage": { + "successMessage": "تم تحديث اسم المستخدم الخاص بك.", + "title__set": "تعيين اسم المستخدم", + "title__update": "تحديث اسم المستخدم" + }, + "web3WalletPage": { + "removeResource": { + "messageLine1": "{{identifier}} سيتم إزالته من هذا الحساب.", + "messageLine2": "لن تتمكن بعد الآن من تسجيل الدخول باستخدام هذا المحفظة web3.", + "successMessage": "{{web3Wallet}} تمت إزالته من حسابك.", + "title": "إزالة محفظة web3" + }, + "subtitle__availableWallets": "حدد محفظة web3 للاتصال بحسابك.", + "subtitle__unavailableWallets": "لا توجد محافظ web3 متاحة.", + "successMessage": "تمت إضافة المحفظة إلى حسابك.", + "title": "إضافة محفظة web3" + } + } +} diff --git a/locales/ar/common.json b/locales/ar/common.json index 93c8b978e3a1b..e52eb22f813cc 100644 --- a/locales/ar/common.json +++ b/locales/ar/common.json @@ -160,6 +160,7 @@ "newVersion": "هناك إصدار جديد متاح: {{version}}" }, "userPanel": { + "anonymousNickName": "مستخدم مجهول", "billing": "إدارة الفواتير", "defaultNickname": "مستخدم النسخة المجتمعية", "discord": "الدعم المجتمعي", diff --git a/locales/ar/error.json b/locales/ar/error.json index 3769176958a64..d6b02f38459d5 100644 --- a/locales/ar/error.json +++ b/locales/ar/error.json @@ -1,4 +1,11 @@ { + "clerkAuth": { + "loginSuccess": { + "action": "استمر في الجلسة", + "desc": "{{greeting}}، يسعدني أن أواصل خدمتك. دعنا نواصل الحديث عن الموضوع الذي تحدثنا عنه مؤخرًا", + "title": "مرحبًا بعودتك، {{nickName}}" + } + }, "error": { "backHome": "العودة إلى الصفحة الرئيسية", "desc": "حاول مرة أخرى في وقت لاحق، أو عد إلى العالم المألوف", @@ -54,6 +61,7 @@ "InvalidAnthropicAPIKey": "مفتاح Anthropic API غير صحيح أو فارغ، يرجى التحقق من مفتاح Anthropic API وإعادة المحاولة", "InvalidAzureAPIKey": "مفتاح Azure API غير صحيح أو فارغ، يرجى التحقق من مفتاح Azure API وإعادة المحاولة", "InvalidBedrockCredentials": "فشلت مصادقة Bedrock، يرجى التحقق من AccessKeyId/SecretAccessKey وإعادة المحاولة", + "InvalidClerkUser": "عذرًا، لم تقم بتسجيل الدخول بعد، يرجى تسجيل الدخول أو التسجيل للمتابعة", "InvalidGoogleAPIKey": "مفتاح Google API غير صحيح أو فارغ، يرجى التحقق من مفتاح Google API وإعادة المحاولة", "InvalidGroqAPIKey": "مفتاح Groq API غير صحيح أو فارغ، يرجى التحقق من مفتاح Groq API وإعادة المحاولة", "InvalidMinimaxAPIKey": "مفتاح Minimax API غير صحيح أو فارغ، يرجى التحقق من مفتاح Minimax API وإعادة المحاولة", diff --git a/locales/bg-BG/auth.json b/locales/bg-BG/auth.json new file mode 100644 index 0000000000000..df5e68275e974 --- /dev/null +++ b/locales/bg-BG/auth.json @@ -0,0 +1,6 @@ +{ + "login": "Вход", + "loginOrSignup": "Вход / Регистрация", + "signout": "Изход", + "signup": "Регистрация" +} diff --git a/locales/bg-BG/clerk.json b/locales/bg-BG/clerk.json new file mode 100644 index 0000000000000..88a3d08017cf3 --- /dev/null +++ b/locales/bg-BG/clerk.json @@ -0,0 +1,769 @@ +{ + "backButton": "Назад", + "badge__default": "По подразбиране", + "badge__otherImpersonatorDevice": "Друго устройство за имитиране", + "badge__primary": "Основен", + "badge__requiresAction": "Изисква действие", + "badge__thisDevice": "Това устройство", + "badge__unverified": "Непотвърден", + "badge__userDevice": "Потребителско устройство", + "badge__you": "Вие", + "createOrganization": { + "formButtonSubmit": "Създай организация", + "invitePage": { + "formButtonReset": "Пропусни" + }, + "title": "Създаване на организация" + }, + "dates": { + "lastDay": "Вчера в {{ date | timeString('en-US') }}", + "next6Days": "{{ date | weekday('en-US', 'long') }} в {{ date | timeString('en-US') }}", + "nextDay": "Утре в {{ date | timeString('en-US') }}", + "numeric": "{{ date | numeric('en-US') }}", + "previous6Days": "Миналата {{ date | weekday('en-US', 'long') }} в {{ date | timeString('en-US') }}", + "sameDay": "Днес в {{ date | timeString('en-US') }}" + }, + "dividerText": "или", + "footerActionLink__useAnotherMethod": "Използвай друг метод", + "footerPageLink__help": "Помощ", + "footerPageLink__privacy": "Поверителност", + "footerPageLink__terms": "Условия", + "formButtonPrimary": "Продължи", + "formButtonPrimary__verify": "Потвърди", + "formFieldAction__forgotPassword": "Забравена парола?", + "formFieldError__matchingPasswords": "Паролите съвпадат.", + "formFieldError__notMatchingPasswords": "Паролите не съвпадат.", + "formFieldError__verificationLinkExpired": "Връзката за потвърждение изтече. Моля, поискайте нова връзка.", + "formFieldHintText__optional": "По избор", + "formFieldHintText__slug": "Slug е четим идентификатор, който трябва да бъде уникален. Често се използва в URL адреси.", + "formFieldInputPlaceholder__backupCode": "", + "formFieldInputPlaceholder__confirmDeletionUserAccount": "Изтрий профила", + "formFieldInputPlaceholder__emailAddress": "", + "formFieldInputPlaceholder__emailAddress_username": "", + "formFieldInputPlaceholder__emailAddresses": "пример@email.com, пример2@email.com", + "formFieldInputPlaceholder__firstName": "", + "formFieldInputPlaceholder__lastName": "", + "formFieldInputPlaceholder__organizationDomain": "", + "formFieldInputPlaceholder__organizationDomainEmailAddress": "", + "formFieldInputPlaceholder__organizationName": "", + "formFieldInputPlaceholder__organizationSlug": "моята-орг", + "formFieldInputPlaceholder__password": "", + "formFieldInputPlaceholder__phoneNumber": "", + "formFieldInputPlaceholder__username": "", + "formFieldLabel__automaticInvitations": "Активирай автоматични покани за този домейн", + "formFieldLabel__backupCode": "Резервен код", + "formFieldLabel__confirmDeletion": "Потвърждение", + "formFieldLabel__confirmPassword": "Потвърди парола", + "formFieldLabel__currentPassword": "Текуща парола", + "formFieldLabel__emailAddress": "Имейл адрес", + "formFieldLabel__emailAddress_username": "Имейл адрес или потребителско име", + "formFieldLabel__emailAddresses": "Имейл адреси", + "formFieldLabel__firstName": "Първо име", + "formFieldLabel__lastName": "Фамилия", + "formFieldLabel__newPassword": "Нова парола", + "formFieldLabel__organizationDomain": "Домейн", + "formFieldLabel__organizationDomainDeletePending": "Изтрийте изчакващите покани и предложения за този домейн", + "formFieldLabel__organizationDomainEmailAddress": "Имейл адрес за потвърждение", + "formFieldLabel__organizationDomainEmailAddressDescription": "Въведете имейл адрес под този домейн, за да получите код и да потвърдите този домейн.", + "formFieldLabel__organizationName": "Име", + "formFieldLabel__organizationSlug": "Slug", + "formFieldLabel__passkeyName": "Име на ключ", + "formFieldLabel__password": "Парола", + "formFieldLabel__phoneNumber": "Телефонен номер", + "formFieldLabel__role": "Роля", + "formFieldLabel__signOutOfOtherSessions": "Изход от всички други устройства", + "formFieldLabel__username": "Потребителско име", + "impersonationFab": { + "action__signOut": "Изход", + "title": "Влизане като {{identifier}}" + }, + "locale": "bg-BG", + "maintenanceMode": "В момента извършваме поддръжка, но не се притеснявайте, не би трябвало да отнеме повече от няколко минути.", + "membershipRole__admin": "Администратор", + "membershipRole__basicMember": "Член", + "membershipRole__guestMember": "Гост", + "organizationList": { + "action__createOrganization": "Създай организация", + "action__invitationAccept": "Присъедини се", + "action__suggestionsAccept": "Изпрати заявка за присъединяване", + "createOrganization": "Създай организация", + "invitationAcceptedLabel": "Присъединен", + "subtitle": "за продължаване към {{applicationName}}", + "suggestionsAcceptedLabel": "Чака одобрение", + "title": "Изберете акаунт", + "titleWithoutPersonal": "Изберете организация" + }, + "organizationProfile": { + "badge__automaticInvitation": "Автоматични покани", + "badge__automaticSuggestion": "Автоматични предложения", + "badge__manualInvitation": "Няма автоматично записване", + "badge__unverified": "Непотвърден", + "createDomainPage": { + "subtitle": "Добавете домейна за потвърждение. Потребителите с имейл адреси от този домейн могат автоматично да се присъединят към организацията или да поискат присъединяване.", + "title": "Добавете домейн" + }, + "invitePage": { + "detailsTitle__inviteFailed": "Поканите не могат да бъдат изпратени. Вече има чакащи покани за следните имейл адреси: {{email_addresses}}.", + "formButtonPrimary__continue": "Изпрати покани", + "selectDropdown__role": "Изберете роля", + "subtitle": "Въведете или поставете един или повече имейл адреси, разделени с интервали или запетая.", + "successMessage": "Поканите бяха успешно изпратени", + "title": "Покани нови членове" + }, + "membersPage": { + "action__invite": "Покани", + "activeMembersTab": { + "menuAction__remove": "Премахни член", + "tableHeader__actions": "", + "tableHeader__joined": "Присъединил се", + "tableHeader__role": "Роля", + "tableHeader__user": "Потребител" + }, + "detailsTitle__emptyRow": "Няма членове за показване", + "invitationsTab": { + "autoInvitations": { + "headerSubtitle": "Поканете потребители, като свържете имейл домейн с вашата организация. Всеки, който се регистрира със съвпадащ имейл домейн, ще може да се присъедини към организацията по всяко време.", + "headerTitle": "Автоматични покани", + "primaryButton": "Управление на потвърдени домейни" + }, + "table__emptyRow": "Няма покани за показване" + }, + "invitedMembersTab": { + "menuAction__revoke": "Оттегли поканата", + "tableHeader__invited": "Поканени" + }, + "requestsTab": { + "autoSuggestions": { + "headerSubtitle": "Потребителите, които се регистрират със съвпадащ имейл домейн, ще виждат предложение да поискат да се присъединят към вашата организация.", + "headerTitle": "Автоматични предложения", + "primaryButton": "Управление на потвърдени домейни" + }, + "menuAction__approve": "Одобри", + "menuAction__reject": "Отхвърли", + "tableHeader__requested": "Заявено право на достъп", + "table__emptyRow": "Няма заявки за показване" + }, + "start": { + "headerTitle__invitations": "Покани", + "headerTitle__members": "Членове", + "headerTitle__requests": "Заявки" + } + }, + "navbar": { + "description": "Управлявайте вашата организация", + "general": "Общи", + "members": "Членове", + "title": "Организация" + }, + "profilePage": { + "dangerSection": { + "deleteOrganization": { + "actionDescription": "Въведете \"{{organizationName}}\" по-долу, за да продължите.", + "messageLine1": "Сигурни ли сте, че искате да изтриете тази организация?", + "messageLine2": "Това действие е постоянно и необратимо.", + "successMessage": "Изтрили сте организацията.", + "title": "Изтрий организация" + }, + "leaveOrganization": { + "actionDescription": "Въведете \"{{organizationName}}\" по-долу, за да продължите.", + "messageLine1": "Сигурни ли сте, че искате да напуснете тази организация? Ще загубите достъп до тази организация и нейните приложения.", + "messageLine2": "Това действие е постоянно и необратимо.", + "successMessage": "Излязохте от организацията.", + "title": "Напусни организация" + }, + "title": "Опасност" + }, + "domainSection": { + "menuAction__manage": "Управление", + "menuAction__remove": "Изтрий", + "menuAction__verify": "Потвърди", + "primaryButton": "Добави домейн", + "subtitle": "Позволете на потребителите автоматично да се присъединяват към организацията или да поискат присъединяване въз основа на потвърден имейл домейн.", + "title": "Потвърдени домейни" + }, + "successMessage": "Организацията беше актуализирана.", + "title": "Актуализиране на профила" + }, + "removeDomainPage": { + "messageLine1": "Имейл домейнът {{domain}} ще бъде премахнат.", + "messageLine2": "Потребителите няма да могат автоматично да се присъединяват към организацията след това.", + "successMessage": "{{domain}} беше премахнат.", + "title": "Премахни домейн" + }, + "start": { + "headerTitle__general": "Общи", + "headerTitle__members": "Членове", + "profileSection": { + "primaryButton": "Актуализиране на профила", + "title": "Профил на организацията", + "uploadAction__title": "Лого" + } + }, + "verifiedDomainPage": { + "dangerTab": { + "calloutInfoLabel": "Премахването на този домейн ще засегне поканените потребители.", + "removeDomainActionLabel__remove": "Премахни домейна", + "removeDomainSubtitle": "Премахни този домейн от потвърдените ви домейни", + "removeDomainTitle": "Премахни домейн" + }, + "enrollmentTab": { + "automaticInvitationOption__description": "Потребителите се поканват автоматично да се присъединят към организацията, когато се регистрират и могат да се присъединят по всяко време.", + "automaticInvitationOption__label": "Автоматични покани", + "automaticSuggestionOption__description": "Потребителите получават предложение да поискат да се присъединят, но трябва да бъдат одобрени от администратор, преди да могат да се присъединят към организацията.", + "automaticSuggestionOption__label": "Автоматични предложения", + "calloutInfoLabel": "Промяната на режима на записване ще засегне само новите потребители.", + "calloutInvitationCountLabel": "Чакащи покани изпратени на потребители: {{count}}", + "calloutSuggestionCountLabel": "Чакащи предложения изпратени на потребители: {{count}}", + "manualInvitationOption__description": "Потребителите могат да бъдат поканени само ръчно към организацията.", + "manualInvitationOption__label": "Няма автоматично записване", + "subtitle": "Изберете как потребителите от този домейн могат да се присъединят към организацията." + }, + "start": { + "headerTitle__danger": "Опасност", + "headerTitle__enrollment": "Опции за записване" + }, + "subtitle": "Домейнът {{domain}} вече е потвърден. Продължете, като изберете режим на записване.", + "title": "Актуализиране на {{domain}}" + }, + "verifyDomainPage": { + "formSubtitle": "Въведете кода за потвърждение, изпратен на вашия имейл адрес", + "formTitle": "Код за потвърждение", + "resendButton": "Не сте получили код? Изпрати отново", + "subtitle": "Домейнът {{domainName}} трябва да бъде потвърден чрез имейл.", + "subtitleVerificationCodeScreen": "Беше изпратен код за потвърждение на {{emailAddress}}. Въведете кода, за да продължите.", + "title": "Потвърди домейн" + } + }, + "organizationSwitcher": { + "action__createOrganization": "Създай организация", + "action__invitationAccept": "Присъедини се", + "action__manageOrganization": "Управление", + "action__suggestionsAccept": "Изпрати заявка за присъединяване", + "notSelected": "Не е избрана организация", + "personalWorkspace": "Личен акаунт", + "suggestionsAcceptedLabel": "Чака одобрение" + }, + "paginationButton__next": "Следващ", + "paginationButton__previous": "Предишен", + "paginationRowText__displaying": "Показване на", + "paginationRowText__of": "от", + "signIn": { + "accountSwitcher": { + "action__addAccount": "Добавяне на акаунт", + "action__signOutAll": "Изход от всички акаунти", + "subtitle": "Изберете акаунта, с който искате да продължите.", + "title": "Изберете акаунт" + }, + "alternativeMethods": { + "actionLink": "Получете помощ", + "actionText": "Нямате нито един от тях?", + "blockButton__backupCode": "Използвайте резервен код", + "blockButton__emailCode": "Изпратете код на имейл до {{identifier}}", + "blockButton__emailLink": "Изпратете връзка на имейл до {{identifier}}", + "blockButton__passkey": "Влезте с вашата парола", + "blockButton__password": "Влезте с паролата си", + "blockButton__phoneCode": "Изпратете SMS код до {{identifier}}", + "blockButton__totp": "Използвайте вашето приложение за аутентикация", + "getHelp": { + "blockButton__emailSupport": "Имейл поддръжка", + "content": "Ако имате затруднения при влизане в профила си, пишете ни имейл и ще работим с вас, за да възстановим достъпа възможно най-бързо.", + "title": "Получете помощ" + }, + "subtitle": "Имате проблеми? Можете да използвате някой от тези методи за влизане.", + "title": "Използвайте друг метод" + }, + "backupCodeMfa": { + "subtitle": "Вашият резервен код е този, който сте получили при настройване на двустепенната аутентикация.", + "title": "Въведете резервен код" + }, + "emailCode": { + "formTitle": "Код за потвърждение", + "resendButton": "Не сте получили код? Изпратете отново", + "subtitle": "за да продължите към {{applicationName}}", + "title": "Проверете имейла си" + }, + "emailLink": { + "expired": { + "subtitle": "Върнете се към оригиналната разделка, за да продължите.", + "title": "Тази връзка за потвърждение е изтекла" + }, + "failed": { + "subtitle": "Върнете се към оригиналната разделка, за да продължите.", + "title": "Тази връзка за потвърждение е невалидна" + }, + "formSubtitle": "Използвайте връзката за потвърждение изпратена на вашия имейл", + "formTitle": "Връзка за потвърждение", + "loading": { + "subtitle": "Ще бъдете пренасочени скоро", + "title": "Влизане..." + }, + "resendButton": "Не сте получили връзка? Изпратете отново", + "subtitle": "за да продължите към {{applicationName}}", + "title": "Проверете имейла си", + "unusedTab": { + "title": "Можете да затворите тази разделка" + }, + "verified": { + "subtitle": "Ще бъдете пренасочени скоро", + "title": "Успешно влязохте" + }, + "verifiedSwitchTab": { + "subtitle": "Върнете се към оригиналната разделка, за да продължите", + "subtitleNewTab": "Върнете се към новоотворената разделка, за да продължите", + "titleNewTab": "Влязохте в друга разделка" + } + }, + "forgotPassword": { + "formTitle": "Код за нулиране на парола", + "resendButton": "Не сте получили код? Изпратете отново", + "subtitle": "за да нулирате паролата си", + "subtitle_email": "Първо въведете кода, изпратен на вашия имейл адрес", + "subtitle_phone": "Първо въведете кода, изпратен на вашия телефон", + "title": "Нулиране на парола" + }, + "forgotPasswordAlternativeMethods": { + "blockButton__resetPassword": "Нулиране на паролата си", + "label__alternativeMethods": "Или влезте с друг метод", + "title": "Забравена парола?" + }, + "noAvailableMethods": { + "message": "Не можем да продължим с влизането. Няма наличен аутентикационен фактор.", + "subtitle": "Възникна грешка", + "title": "Не може да се влезе" + }, + "passkey": { + "subtitle": "Използването на вашия код потвърждава, че сте вие. Вашият устройство може да поиска вашите пръсти, лице или заключване на екрана.", + "title": "Използвайте вашия код" + }, + "password": { + "actionLink": "Използвайте друг метод", + "subtitle": "Въведете паролата, свързана с вашия акаунт", + "title": "Въведете паролата си" + }, + "passwordPwned": { + "title": "Паролата е компрометирана" + }, + "phoneCode": { + "formTitle": "Код за потвърждение", + "resendButton": "Не сте получили код? Изпратете отново", + "subtitle": "за да продължите към {{applicationName}}", + "title": "Проверете телефона си" + }, + "phoneCodeMfa": { + "formTitle": "Код за потвърждение", + "resendButton": "Не сте получили код? Изпратете отново", + "subtitle": "За да продължите, моля въведете кода за потвърждение, изпратен на телефона ви", + "title": "Проверете телефона си" + }, + "resetPassword": { + "formButtonPrimary": "Нулиране на паролата", + "requiredMessage": "Поради сигурностни причини е необходимо да нулирате паролата си.", + "successMessage": "Паролата ви беше успешно променена. Влизане в процес, моля изчакайте момент.", + "title": "Задайте нова парола" + }, + "resetPasswordMfa": { + "detailsLabel": "Трябва да потвърдим вашата самоличност преди да нулираме паролата ви." + }, + "start": { + "actionLink": "Регистрирайте се", + "actionLink__use_email": "Използвайте имейл", + "actionLink__use_email_username": "Използвайте имейл или потребителско име", + "actionLink__use_passkey": "Използвайте кода си", + "actionLink__use_phone": "Използвайте телефона", + "actionLink__use_username": "Използвайте потребителско име", + "actionText": "Нямате акаунт?", + "subtitle": "Добре дошли отново! Моля, влезте, за да продължите", + "title": "Влезте в {{applicationName}}" + }, + "totpMfa": { + "formTitle": "Код за потвърждение", + "subtitle": "За да продължите, моля въведете кода за потвърждение, генериран от вашето приложение за аутентикация", + "title": "Двустепенна верификация" + } + }, + "signInEnterPasswordTitle": "Въведете паролата си", + "signUp": { + "continue": { + "actionLink": "Влезте", + "actionText": "Вече имате акаунт?", + "subtitle": "Моля, попълнете оставащите данни, за да продължите", + "title": "Попълнете липсващите полета" + }, + "emailCode": { + "formSubtitle": "Въведете кода за потвърждение, изпратен на вашия имейл адрес", + "formTitle": "Код за потвърждение", + "resendButton": "Не сте получили код? Изпратете отново", + "subtitle": "Въведете кода за потвърждение, изпратен на вашия имейл", + "title": "Потвърдете вашия имейл" + }, + "emailLink": { + "formSubtitle": "Използвайте връзката за потвърждение, изпратена на вашия имейл адрес", + "formTitle": "Връзка за потвърждение", + "loading": { + "title": "Регистриране..." + }, + "resendButton": "Не сте получили връзка? Изпратете отново", + "subtitle": "за да продължите към {{applicationName}}", + "title": "Потвърдете вашия имейл", + "verified": { + "title": "Успешно се регистрирахте" + }, + "verifiedSwitchTab": { + "subtitle": "Върнете се към новоотворената разделка, за да продължите", + "subtitleNewTab": "Върнете се към предишната разделка, за да продължите", + "title": "Успешно потвърден имейл" + } + }, + "phoneCode": { + "formSubtitle": "Въведете кода за потвърждение, изпратен на вашия телефонен номер", + "formTitle": "Код за потвърждение", + "resendButton": "Не сте получили код? Изпратете отново", + "subtitle": "Въведете кода за потвърждение, изпратен на вашия телефон", + "title": "Потвърдете вашия телефон" + }, + "start": { + "actionLink": "Влезте", + "actionText": "Вече имате акаунт?", + "subtitle": "Добре дошли! Моля, попълнете данните, за да започнете", + "title": "Създайте вашия акаунт" + } + }, + "socialButtonsBlockButton": "Продължете с {{provider|titleize}}", + "unstable__errors": { + "captcha_invalid": "Регистрацията не беше успешна поради неуспешни проверки за сигурност. Моля, опитайте отново като презаредите страницата или се свържете с поддръжката за повече помощ.", + "captcha_unavailable": "Регистрацията не беше успешна поради неуспешна валидация на бот. Моля, опитайте отново като презаредите страницата или се свържете с поддръжката за повече помощ.", + "form_code_incorrect": "", + "form_identifier_exists": "", + "form_identifier_exists__email_address": "Този имейл адрес е зает. Моля, опитайте с друг.", + "form_identifier_exists__phone_number": "Този телефонен номер е зает. Моля, опитайте с друг.", + "form_identifier_exists__username": "Това потребителско име е заето. Моля, опитайте с друго.", + "form_identifier_not_found": "", + "form_param_format_invalid": "", + "form_param_format_invalid__email_address": "Имейл адресът трябва да бъде валиден имейл адрес.", + "form_param_format_invalid__phone_number": "Телефонният номер трябва да бъде валиден в международен формат.", + "form_param_max_length_exceeded__first_name": "Първото име не трябва да надвишава 256 знака.", + "form_param_max_length_exceeded__last_name": "Фамилията не трябва да надвишава 256 знака.", + "form_param_max_length_exceeded__name": "Името не трябва да надвишава 256 знака.", + "form_param_nil": "", + "form_password_incorrect": "", + "form_password_length_too_short": "", + "form_password_not_strong_enough": "Паролата ви не е достатъчно силна.", + "form_password_pwned": "Тази парола е открита като част от нарушение и не може да се използва, моля опитайте с друга парола.", + "form_password_pwned__sign_in": "Тази парола е открита като част от нарушение и не може да се използва, моля нулирайте паролата си.", + "form_password_size_in_bytes_exceeded": "Паролата ви е надвишила максималния брой байтове, моля я скратете или премахнете някои специални знаци.", + "form_password_validation_failed": "Некоректна парола", + "form_username_invalid_character": "", + "form_username_invalid_length": "", + "identification_deletion_failed": "Не можете да изтриете последната си идентификация.", + "not_allowed_access": "", + "passkey_already_exists": "Паролата вече е регистрирана с този устройство.", + "passkey_not_supported": "Паролите не се поддържат на това устройство.", + "passkey_pa_not_supported": "Регистрацията изисква аутентикатор на платформата, но устройството не го поддържа.", + "passkey_registration_cancelled": "Регистрацията на паролата беше отменена или изтече.", + "passkey_retrieval_cancelled": "Проверката на паролата беше отменена или изтече.", + "passwordComplexity": { + "maximumLength": "по-малко от {{length}} знака", + "minimumLength": "{{length}} или повече знака", + "requireLowercase": "малка буква", + "requireNumbers": "число", + "requireSpecialCharacter": "специален символ", + "requireUppercase": "главна буква", + "sentencePrefix": "Паролата ви трябва да съдържа" + }, + "phone_number_exists": "Този телефонен номер е зает. Моля, опитайте с друг.", + "zxcvbn": { + "couldBeStronger": "Паролата ви работи, но може да бъде по-силна. Опитайте да добавите повече знаци.", + "goodPassword": "Паролата ви отговаря на всички необходими изисквания.", + "notEnough": "Паролата ви не е достатъчно силна.", + "suggestions": { + "allUppercase": "Напишете някои букви с главни, но не всички.", + "anotherWord": "Добавете повече думи, които не са толкова обичайни.", + "associatedYears": "Избягвайте години, които са свързани с вас.", + "capitalization": "Напишете с главни повече от първата буква.", + "dates": "Избягвайте дати и години, които са свързани с вас.", + "l33t": "Избягвайте предсказуеми замествания на букви като '@' за 'а'.", + "longerKeyboardPattern": "Използвайте по-дълги шаблони на клавиатурата и променяйте посоката на набиране няколко пъти.", + "noNeed": "Можете да създадете силни пароли без да използвате символи, числа или главни букви.", + "pwned": "Ако използвате тази парола някъде другаде, трябва да я промените.", + "recentYears": "Избягвайте скорошни години.", + "repeated": "Избягвайте повтарящи се думи и знаци.", + "reverseWords": "Избягвайте обратни написания на обичайни думи.", + "sequences": "Избягвайте обичайни последователности на знаци.", + "useWords": "Използвайте няколко думи, но избягвайте обичайни фрази." + }, + "warnings": { + "common": "Това е често използвана парола.", + "commonNames": "Обичайните имена и фамилии са лесни за отгатване.", + "dates": "Датите са лесни за отгатване.", + "extendedRepeat": "Повтарящи се шаблони на символи като \"abcabcabc\" са лесни за отгатване.", + "keyPattern": "Кратките шаблони на клавиатурата са лесни за отгатване.", + "namesByThemselves": "Единичните имена или фамилии са лесни за отгатване.", + "pwned": "Вашата парола беше изложена в интернет от данни.", + "recentYears": "Скорошните години са лесни за отгатване.", + "sequences": "Обичайните последователности на знаци като \"abc\" са лесни за отгатване.", + "similarToCommon": "Това е подобно на често използвана парола.", + "simpleRepeat": "Повтарящи се символи като \"aaa\" са лесни за отгатване.", + "straightRow": "Правите редове на клавишите на клавиатурата са лесни за отгатване.", + "topHundred": "Това е често използвана парола.", + "topTen": "Това е много използвана парола.", + "userInputs": "Не трябва да има лични или свързани със страницата данни.", + "wordByItself": "Единичните думи са лесни за отгатване." + } + } + }, + "userButton": { + "action__addAccount": "Добави акаунт", + "action__manageAccount": "Управлявай акаунта", + "action__signOut": "Изход", + "action__signOutAll": "Изход от всички акаунти" + }, + "userProfile": { + "backupCodePage": { + "actionLabel__copied": "Копирано!", + "actionLabel__copy": "Копиране на всички", + "actionLabel__download": "Изтегли .txt", + "actionLabel__print": "Принтиране", + "infoText1": "Резервните кодове ще бъдат активирани за този акаунт.", + "infoText2": "Пазете резервните кодове в тайна и ги съхранявайте на сигурно място. Можете да генерирате нови резервни кодове, ако подозирате, че са компрометирани.", + "subtitle__codelist": "Съхранявайте ги на сигурно място и ги пазете в тайна.", + "successMessage": "Резервните кодове вече са активирани. Можете да използвате един от тях, за да влезете в своя акаунт, ако загубите достъпа до устройството за удостоверяване. Всеки код може да бъде използван само веднъж.", + "successSubtitle": "Можете да използвате един от тези кодове, за да влезете в своя акаунт, ако загубите достъпа до устройството за удостоверяване.", + "title": "Добавяне на потвърждение с резервен код", + "title__codelist": "Резервни кодове" + }, + "connectedAccountPage": { + "formHint": "Изберете доставчик, за да свържете своя акаунт.", + "formHint__noAccounts": "Няма налични външни доставчици на акаунти.", + "removeResource": { + "messageLine1": "{{identifier}} ще бъде премахнат от този акаунт.", + "messageLine2": "Вече няма да можете да използвате този свързан акаунт и всички зависими функции няма да работят повече.", + "successMessage": "{{connectedAccount}} е премахнат от вашия акаунт.", + "title": "Премахване на свързан акаунт" + }, + "socialButtonsBlockButton": "{{provider|titleize}}", + "successMessage": "Доставчикът е добавен към вашия акаунт", + "title": "Добавяне на свързан акаунт" + }, + "deletePage": { + "actionDescription": "Въведете \"Изтриване на акаунт\" по-долу, за да продължите.", + "confirm": "Изтриване на акаунт", + "messageLine1": "Сигурни ли сте, че искате да изтриете своя акаунт?", + "messageLine2": "Това действие е постоянно и необратимо.", + "title": "Изтриване на акаунт" + }, + "emailAddressPage": { + "emailCode": { + "formHint": "На този имейл адрес ще бъде изпратен имейл с код за потвърждение.", + "formSubtitle": "Въведете кода за потвърждение, изпратен на {{identifier}}", + "formTitle": "Код за потвърждение", + "resendButton": "Не сте получили код? Изпрати отново", + "successMessage": "Имейлът {{identifier}} е добавен към вашия акаунт." + }, + "emailLink": { + "formHint": "На този имейл адрес ще бъде изпратен имейл с връзка за потвърждение.", + "formSubtitle": "Кликнете върху връзката за потвърждение в имейла, изпратен на {{identifier}}", + "formTitle": "Връзка за потвърждение", + "resendButton": "Не сте получили връзка? Изпрати отново", + "successMessage": "Имейлът {{identifier}} е добавен към вашия акаунт." + }, + "removeResource": { + "messageLine1": "{{identifier}} ще бъде премахнат от този акаунт.", + "messageLine2": "Вече няма да можете да влезете, използвайки този имейл адрес.", + "successMessage": "{{emailAddress}} е премахнат от вашия акаунт.", + "title": "Премахване на имейл адрес" + }, + "title": "Добавяне на имейл адрес", + "verifyTitle": "Потвърждение на имейл адрес" + }, + "formButtonPrimary__add": "Добавяне", + "formButtonPrimary__continue": "Продължи", + "formButtonPrimary__finish": "Завърши", + "formButtonPrimary__remove": "Премахване", + "formButtonPrimary__save": "Запазване", + "formButtonReset": "Отказ", + "mfaPage": { + "formHint": "Изберете метод за добавяне.", + "title": "Добавяне на двустепенна верификация" + }, + "mfaPhoneCodePage": { + "backButton": "Използвайте същия номер", + "primaryButton__addPhoneNumber": "Добавяне на телефонен номер", + "removeResource": { + "messageLine1": "{{identifier}} няма да получава повече кодове за потвърждение при влизане.", + "messageLine2": "Вашият акаунт може да не е толкова защитен. Сигурни ли сте, че искате да продължите?", + "successMessage": "Двустепенната верификация с код по SMS е премахната за {{mfaPhoneCode}}", + "title": "Премахване на двустепенна верификация" + }, + "subtitle__availablePhoneNumbers": "Изберете съществуващ телефонен номер, за да се регистрирате за двустепенна верификация с код по SMS или добавете нов.", + "subtitle__unavailablePhoneNumbers": "Няма налични телефонни номера за регистрация за двустепенна верификация с код по SMS, моля добавете нов.", + "successMessage1": "При влизане ще трябва да въведете код за потвърждение, изпратен на този телефонен номер като допълнителна стъпка.", + "successMessage2": "Запазете тези резервни кодове и ги съхранявайте на сигурно място. Ако загубите достъпа до устройството за удостоверяване, можете да използвате резервни кодове, за да влезете.", + "successTitle": "Активиране на верификация с код по SMS", + "title": "Добавяне на верификация с код по SMS" + }, + "mfaTOTPPage": { + "authenticatorApp": { + "buttonAbleToScan__nonPrimary": "Сканиране на QR код вместо това", + "buttonUnableToScan__nonPrimary": "Не може да се сканира QR код?", + "infoText__ableToScan": "Настройте нов метод за влизане във вашия аутентикатор и сканирайте следния QR код, за да го свържете с вашия акаунт.", + "infoText__unableToScan": "Настройте нов метод за влизане във вашия аутентикатор и въведете ключа, предоставен по-долу.", + "inputLabel__unableToScan1": "Уверете се, че времевите или еднократни пароли са активирани, след което завършете свързването на вашия акаунт.", + "inputLabel__unableToScan2": "Алтернативно, ако вашият аутентикатор поддържа TOTP URIs, можете също да копирате целия URI." + }, + "removeResource": { + "messageLine1": "Кодовете за потвърждение от този аутентикатор вече няма да са необходими при влизане.", + "messageLine2": "Вашият акаунт може да не е толкова защитен. Сигурни ли сте, че искате да продължите?", + "successMessage": "Двустепенната верификация чрез приложение за аутентикация е премахната.", + "title": "Премахване на двустепенна верификация" + }, + "successMessage": "Двустепенната верификация вече е активирана. При влизане ще трябва да въведете код за потвърждение от този аутентикатор като допълнителна стъпка.", + "title": "Добавяне на приложение за аутентикация", + "verifySubtitle": "Въведете кода за потвърждение, генериран от вашия аутентикатор", + "verifyTitle": "Код за потвърждение" + }, + "mobileButton__menu": "Меню", + "navbar": { + "account": "Профил", + "description": "Управлявайте информацията за вашия профил.", + "security": "Сигурност", + "title": "Профил" + }, + "passkeyScreen": { + "removeResource": { + "messageLine1": "{{name}} ще бъде премахнат от този профил.", + "title": "Премахни кода" + }, + "subtitle__rename": "Можете да промените името на кода, за да го намерите по-лесно.", + "title__rename": "Преименувай кода" + }, + "passwordPage": { + "checkboxInfoText__signOutOfOtherSessions": "Препоръчва се да излезете от всички други устройства, които може да са използвали старата ви парола.", + "readonly": "В момента не можете да редактирате паролата си, защото можете да влезете само чрез връзката с предприятието.", + "successMessage__set": "Паролата ви е зададена.", + "successMessage__signOutOfOtherSessions": "Всички други устройства са излезли.", + "successMessage__update": "Паролата ви е актуализирана.", + "title__set": "Задайте парола", + "title__update": "Актуализирайте паролата" + }, + "phoneNumberPage": { + "infoText": "Ще бъде изпратено съобщение с код за потвърждение на този телефонен номер. Могат да се прилагат такси за съобщения и данни.", + "removeResource": { + "messageLine1": "{{identifier}} ще бъде премахнат от този профил.", + "messageLine2": "Вече няма да можете да влезете с този телефонен номер.", + "successMessage": "{{phoneNumber}} е премахнат от вашия профил.", + "title": "Премахни телефонен номер" + }, + "successMessage": "{{identifier}} е добавен към вашия профил.", + "title": "Добави телефонен номер", + "verifySubtitle": "Въведете кода за потвърждение, изпратен на {{identifier}}", + "verifyTitle": "Потвърди телефонния номер" + }, + "profilePage": { + "fileDropAreaHint": "Препоръчителен размер 1:1, до 10MB.", + "imageFormDestructiveActionSubtitle": "Премахни", + "imageFormSubtitle": "Качи", + "imageFormTitle": "Профилна снимка", + "readonly": "Информацията за вашия профил е предоставена от връзката с предприятието и не може да бъде редактирана.", + "successMessage": "Профилът ви е актуализиран.", + "title": "Актуализирай профила" + }, + "start": { + "activeDevicesSection": { + "destructiveAction": "Изход от устройството", + "title": "Активни устройства" + }, + "connectedAccountsSection": { + "actionLabel__connectionFailed": "Опитайте отново", + "actionLabel__reauthorize": "Оторизирайте сега", + "destructiveActionTitle": "Премахни", + "primaryButton": "Свържете акаунт", + "subtitle__reauthorize": "Необходимите обхвати са актуализирани и може да изпитвате ограничена функционалност. Моля, повторно авторизирайте това приложение, за да избегнете проблеми", + "title": "Свързани акаунти" + }, + "dangerSection": { + "deleteAccountButton": "Изтрий акаунта", + "title": "Изтрий акаунта" + }, + "emailAddressesSection": { + "destructiveAction": "Премахни имейл", + "detailsAction__nonPrimary": "Задай като основен", + "detailsAction__primary": "Завърши верификацията", + "detailsAction__unverified": "Верифицирай", + "primaryButton": "Добави имейл адрес", + "title": "Имейл адреси" + }, + "enterpriseAccountsSection": { + "title": "Корпоративни акаунти" + }, + "headerTitle__account": "Детайли за профила", + "headerTitle__security": "Сигурност", + "mfaSection": { + "backupCodes": { + "actionLabel__regenerate": "Регенерирай", + "headerTitle": "Резервни кодове", + "subtitle__regenerate": "Получете нов комплект сигурни резервни кодове. Предишните резервни кодове ще бъдат изтрити и няма да могат да бъдат използвани.", + "title__regenerate": "Регенериране на резервни кодове" + }, + "phoneCode": { + "actionLabel__setDefault": "Задай като основен", + "destructiveActionLabel": "Премахни" + }, + "primaryButton": "Добави двустепенна верификация", + "title": "Двустепенна верификация", + "totp": { + "destructiveActionTitle": "Премахни", + "headerTitle": "Приложение за автентикация" + } + }, + "passkeysSection": { + "menuAction__destructive": "Премахни", + "menuAction__rename": "Преименувай", + "title": "Пароли" + }, + "passwordSection": { + "primaryButton__setPassword": "Задай парола", + "primaryButton__updatePassword": "Актуализирай паролата", + "title": "Парола" + }, + "phoneNumbersSection": { + "destructiveAction": "Премахни телефонен номер", + "detailsAction__nonPrimary": "Задай като основен", + "detailsAction__primary": "Завърши верификацията", + "detailsAction__unverified": "Верифицирай телефонния номер", + "primaryButton": "Добави телефонен номер", + "title": "Телефонни номера" + }, + "profileSection": { + "primaryButton": "Актуализирай профила", + "title": "Профил" + }, + "usernameSection": { + "primaryButton__setUsername": "Задай потребителско име", + "primaryButton__updateUsername": "Актуализирай потребителското име", + "title": "Потребителско име" + }, + "web3WalletsSection": { + "destructiveAction": "Премахни портфейла", + "primaryButton": "Web3 портфейли", + "title": "Web3 портфейли" + } + }, + "usernamePage": { + "successMessage": "Потребителското ви име е актуализирано.", + "title__set": "Задайте потребителско име", + "title__update": "Актуализирайте потребителското име" + }, + "web3WalletPage": { + "removeResource": { + "messageLine1": "{{identifier}} ще бъде премахнат от този профил.", + "messageLine2": "Вече няма да можете да влезете с този web3 портфейл.", + "successMessage": "{{web3Wallet}} е премахнат от вашия профил.", + "title": "Премахни web3 портфейла" + }, + "subtitle__availableWallets": "Изберете web3 портфейл, за да се свържете с вашия профил.", + "subtitle__unavailableWallets": "Няма налични web3 портфейли.", + "successMessage": "Портфейлът е добавен към вашия профил.", + "title": "Добави web3 портфейл" + } + } +} diff --git a/locales/bg-BG/common.json b/locales/bg-BG/common.json index c662d1cc1b714..cd88a0fc3c8ea 100644 --- a/locales/bg-BG/common.json +++ b/locales/bg-BG/common.json @@ -160,6 +160,7 @@ "newVersion": "Налична е нова версия: {{version}}" }, "userPanel": { + "anonymousNickName": "Анонимен потребител", "billing": "Управление на сметките", "defaultNickname": "Потребител на общността", "discord": "Поддръжка на общността", diff --git a/locales/bg-BG/error.json b/locales/bg-BG/error.json index e1df23ff1118b..e98dcc801fce2 100644 --- a/locales/bg-BG/error.json +++ b/locales/bg-BG/error.json @@ -1,4 +1,11 @@ { + "clerkAuth": { + "loginSuccess": { + "action": "继续会话", + "desc": "{{greeting}},很高兴能够继续为你服务。让我们接着刚刚的话题聊下去吧", + "title": "欢迎回来, {{nickName}}" + } + }, "error": { "backHome": "Върни се в началото", "desc": "Опитайте отново по-късно или се върнете в познатия свят", @@ -54,6 +61,7 @@ "InvalidAnthropicAPIKey": "API ключът на Anthropic е неправилен или празен. Моля, проверете API ключа на Anthropic и опитайте отново.", "InvalidAzureAPIKey": "API ключът на Azure е неправилен или празен. Моля, проверете API ключа на Azure и опитайте отново.", "InvalidBedrockCredentials": "Удостоверяването на Bedrock е неуспешно. Моля, проверете AccessKeyId/SecretAccessKey и опитайте отново.", + "InvalidClerkUser": "很抱歉,你当前尚未登录,请先登录或注册账号后继续操作", "InvalidGoogleAPIKey": "API ключът на Google е неправилен или празен. Моля, проверете API ключа на Google и опитайте отново.", "InvalidGroqAPIKey": "API ключът на Groq е неправилен или празен. Моля, проверете API ключа на Groq и опитайте отново.", "InvalidMinimaxAPIKey": "Невалиден или липсващ ключ за Minimax API, моля проверете ключа за Minimax API и опитайте отново", diff --git a/locales/de-DE/auth.json b/locales/de-DE/auth.json new file mode 100644 index 0000000000000..0c4903a641b44 --- /dev/null +++ b/locales/de-DE/auth.json @@ -0,0 +1,6 @@ +{ + "login": "Anmelden", + "loginOrSignup": "Anmelden / Registrieren", + "signout": "Abmelden", + "signup": "Registrieren" +} diff --git a/locales/de-DE/clerk.json b/locales/de-DE/clerk.json new file mode 100644 index 0000000000000..d1b54ae77ffef --- /dev/null +++ b/locales/de-DE/clerk.json @@ -0,0 +1,769 @@ +{ + "backButton": "Zurück", + "badge__default": "Standard", + "badge__otherImpersonatorDevice": "Anderes Impersonator-Gerät", + "badge__primary": "Primär", + "badge__requiresAction": "Erfordert Handlung", + "badge__thisDevice": "Dieses Gerät", + "badge__unverified": "Nicht verifiziert", + "badge__userDevice": "Benutzergerät", + "badge__you": "Du", + "createOrganization": { + "formButtonSubmit": "Organisation erstellen", + "invitePage": { + "formButtonReset": "Überspringen" + }, + "title": "Organisation erstellen" + }, + "dates": { + "lastDay": "Gestern um {{ date | timeString('de-DE') }}", + "next6Days": "{{ date | weekday('de-DE', 'long') }} um {{ date | timeString('de-DE') }}", + "nextDay": "Morgen um {{ date | timeString('de-DE') }}", + "numeric": "{{ date | numeric('de-DE') }}", + "previous6Days": "Letzten {{ date | weekday('de-DE', 'long') }} um {{ date | timeString('de-DE') }}", + "sameDay": "Heute um {{ date | timeString('de-DE') }}" + }, + "dividerText": "oder", + "footerActionLink__useAnotherMethod": "Andere Methode verwenden", + "footerPageLink__help": "Hilfe", + "footerPageLink__privacy": "Datenschutz", + "footerPageLink__terms": "Nutzungsbedingungen", + "formButtonPrimary": "Weiter", + "formButtonPrimary__verify": "Überprüfen", + "formFieldAction__forgotPassword": "Passwort vergessen?", + "formFieldError__matchingPasswords": "Passwörter stimmen überein.", + "formFieldError__notMatchingPasswords": "Passwörter stimmen nicht überein.", + "formFieldError__verificationLinkExpired": "Der Verifizierungslink ist abgelaufen. Bitte fordern Sie einen neuen Link an.", + "formFieldHintText__optional": "Optional", + "formFieldHintText__slug": "Ein Slug ist eine menschenlesbare ID, die eindeutig sein muss. Wird oft in URLs verwendet.", + "formFieldInputPlaceholder__backupCode": "", + "formFieldInputPlaceholder__confirmDeletionUserAccount": "Konto löschen", + "formFieldInputPlaceholder__emailAddress": "", + "formFieldInputPlaceholder__emailAddress_username": "", + "formFieldInputPlaceholder__emailAddresses": "beispiel@email.com, beispiel2@email.com", + "formFieldInputPlaceholder__firstName": "", + "formFieldInputPlaceholder__lastName": "", + "formFieldInputPlaceholder__organizationDomain": "", + "formFieldInputPlaceholder__organizationDomainEmailAddress": "", + "formFieldInputPlaceholder__organizationName": "", + "formFieldInputPlaceholder__organizationSlug": "meine-org", + "formFieldInputPlaceholder__password": "", + "formFieldInputPlaceholder__phoneNumber": "", + "formFieldInputPlaceholder__username": "", + "formFieldLabel__automaticInvitations": "Automatische Einladungen für diese Domain aktivieren", + "formFieldLabel__backupCode": "Backup-Code", + "formFieldLabel__confirmDeletion": "Bestätigung", + "formFieldLabel__confirmPassword": "Passwort bestätigen", + "formFieldLabel__currentPassword": "Aktuelles Passwort", + "formFieldLabel__emailAddress": "E-Mail-Adresse", + "formFieldLabel__emailAddress_username": "E-Mail-Adresse oder Benutzername", + "formFieldLabel__emailAddresses": "E-Mail-Adressen", + "formFieldLabel__firstName": "Vorname", + "formFieldLabel__lastName": "Nachname", + "formFieldLabel__newPassword": "Neues Passwort", + "formFieldLabel__organizationDomain": "Domain", + "formFieldLabel__organizationDomainDeletePending": "Ausstehende Einladungen und Vorschläge löschen", + "formFieldLabel__organizationDomainEmailAddress": "Verifizierungs-E-Mail-Adresse", + "formFieldLabel__organizationDomainEmailAddressDescription": "Geben Sie eine E-Mail-Adresse unter dieser Domain ein, um einen Code zu erhalten und diese Domain zu verifizieren.", + "formFieldLabel__organizationName": "Name", + "formFieldLabel__organizationSlug": "Slug", + "formFieldLabel__passkeyName": "Name des Passkeys", + "formFieldLabel__password": "Passwort", + "formFieldLabel__phoneNumber": "Telefonnummer", + "formFieldLabel__role": "Rolle", + "formFieldLabel__signOutOfOtherSessions": "Abmelden von allen anderen Geräten", + "formFieldLabel__username": "Benutzername", + "impersonationFab": { + "action__signOut": "Abmelden", + "title": "Angemeldet als {{identifier}}" + }, + "locale": "de-DE", + "maintenanceMode": "Wir führen derzeit Wartungsarbeiten durch, aber keine Sorge, es sollte nicht länger als ein paar Minuten dauern.", + "membershipRole__admin": "Admin", + "membershipRole__basicMember": "Mitglied", + "membershipRole__guestMember": "Gast", + "organizationList": { + "action__createOrganization": "Organisation erstellen", + "action__invitationAccept": "Beitreten", + "action__suggestionsAccept": "Anfrage zum Beitritt", + "createOrganization": "Organisation erstellen", + "invitationAcceptedLabel": "Beigetreten", + "subtitle": "um mit {{applicationName}} fortzufahren", + "suggestionsAcceptedLabel": "Ausstehende Genehmigung", + "title": "Wähle einen Account", + "titleWithoutPersonal": "Wähle eine Organisation" + }, + "organizationProfile": { + "badge__automaticInvitation": "Automatische Einladungen", + "badge__automaticSuggestion": "Automatische Vorschläge", + "badge__manualInvitation": "Keine automatische Einschreibung", + "badge__unverified": "Nicht verifiziert", + "createDomainPage": { + "subtitle": "Füge die Domain zur Verifizierung hinzu. Benutzer mit E-Mail-Adressen in dieser Domain können der Organisation automatisch beitreten oder eine Beitrittsanfrage stellen.", + "title": "Domain hinzufügen" + }, + "invitePage": { + "detailsTitle__inviteFailed": "Die Einladungen konnten nicht gesendet werden. Es gibt bereits ausstehende Einladungen für die folgenden E-Mail-Adressen: {{email_addresses}}.", + "formButtonPrimary__continue": "Einladungen senden", + "selectDropdown__role": "Rolle auswählen", + "subtitle": "Gib eine oder mehrere E-Mail-Adressen ein oder füge sie ein, getrennt durch Leerzeichen oder Kommas.", + "successMessage": "Einladungen erfolgreich gesendet", + "title": "Neue Mitglieder einladen" + }, + "membersPage": { + "action__invite": "Einladen", + "activeMembersTab": { + "menuAction__remove": "Mitglied entfernen", + "tableHeader__actions": "", + "tableHeader__joined": "Beigetreten", + "tableHeader__role": "Rolle", + "tableHeader__user": "Benutzer" + }, + "detailsTitle__emptyRow": "Keine Mitglieder zum Anzeigen", + "invitationsTab": { + "autoInvitations": { + "headerSubtitle": "Laden Sie Benutzer ein, indem Sie eine E-Mail-Domain mit Ihrer Organisation verbinden. Jeder, der sich mit einer passenden E-Mail-Domain anmeldet, kann jederzeit der Organisation beitreten.", + "headerTitle": "Automatische Einladungen", + "primaryButton": "Verifizierte Domains verwalten" + }, + "table__emptyRow": "Keine Einladungen zum Anzeigen" + }, + "invitedMembersTab": { + "menuAction__revoke": "Einladung widerrufen", + "tableHeader__invited": "Eingeladen" + }, + "requestsTab": { + "autoSuggestions": { + "headerSubtitle": "Benutzer, die sich mit einer passenden E-Mail-Domain anmelden, erhalten einen Vorschlag, um eine Beitrittsanfrage für Ihre Organisation zu stellen.", + "headerTitle": "Automatische Vorschläge", + "primaryButton": "Verifizierte Domains verwalten" + }, + "menuAction__approve": "Genehmigen", + "menuAction__reject": "Abweisen", + "tableHeader__requested": "Zugriff angefragt", + "table__emptyRow": "Keine Anfragen zum Anzeigen" + }, + "start": { + "headerTitle__invitations": "Einladungen", + "headerTitle__members": "Mitglieder", + "headerTitle__requests": "Anfragen" + } + }, + "navbar": { + "description": "Verwalten Sie Ihre Organisation.", + "general": "Allgemein", + "members": "Mitglieder", + "title": "Organisation" + }, + "profilePage": { + "dangerSection": { + "deleteOrganization": { + "actionDescription": "Geben Sie unten \"{{organizationName}}\" ein, um fortzufahren.", + "messageLine1": "Sind Sie sicher, dass Sie diese Organisation löschen möchten?", + "messageLine2": "Diese Aktion ist endgültig und nicht rückgängig zu machen.", + "successMessage": "Sie haben die Organisation gelöscht.", + "title": "Organisation löschen" + }, + "leaveOrganization": { + "actionDescription": "Geben Sie unten \"{{organizationName}}\" ein, um fortzufahren.", + "messageLine1": "Sind Sie sicher, dass Sie diese Organisation verlassen möchten? Sie verlieren den Zugriff auf diese Organisation und ihre Anwendungen.", + "messageLine2": "Diese Aktion ist endgültig und nicht rückgängig zu machen.", + "successMessage": "Sie haben die Organisation verlassen.", + "title": "Organisation verlassen" + }, + "title": "Gefahr" + }, + "domainSection": { + "menuAction__manage": "Verwalten", + "menuAction__remove": "Löschen", + "menuAction__verify": "Verifizieren", + "primaryButton": "Domain hinzufügen", + "subtitle": "Ermöglichen Sie Benutzern, automatisch der Organisation beizutreten oder basierend auf einer verifizierten E-Mail-Domain eine Beitrittsanfrage zu stellen.", + "title": "Verifizierte Domains" + }, + "successMessage": "Die Organisation wurde aktualisiert.", + "title": "Profil aktualisieren" + }, + "removeDomainPage": { + "messageLine1": "Die E-Mail-Domain {{domain}} wird entfernt.", + "messageLine2": "Benutzer können sich nach diesem Schritt nicht mehr automatisch der Organisation anschließen.", + "successMessage": "{{domain}} wurde entfernt.", + "title": "Domain entfernen" + }, + "start": { + "headerTitle__general": "Allgemein", + "headerTitle__members": "Mitglieder", + "profileSection": { + "primaryButton": "Profil aktualisieren", + "title": "Organisationsprofil", + "uploadAction__title": "Logo hochladen" + } + }, + "verifiedDomainPage": { + "dangerTab": { + "calloutInfoLabel": "Das Entfernen dieser Domain wird sich auf eingeladene Benutzer auswirken.", + "removeDomainActionLabel__remove": "Domain entfernen", + "removeDomainSubtitle": "Entfernen Sie diese Domain aus Ihren verifizierten Domains", + "removeDomainTitle": "Domain entfernen" + }, + "enrollmentTab": { + "automaticInvitationOption__description": "Benutzer werden automatisch eingeladen, der Organisation beizutreten, wenn sie sich anmelden und können jederzeit beitreten.", + "automaticInvitationOption__label": "Automatische Einladungen", + "automaticSuggestionOption__description": "Benutzer erhalten einen Vorschlag, um eine Beitrittsanfrage zu stellen, müssen jedoch von einem Admin genehmigt werden, bevor sie der Organisation beitreten können.", + "automaticSuggestionOption__label": "Automatische Vorschläge", + "calloutInfoLabel": "Die Änderung des Einschreibemodus betrifft nur neue Benutzer.", + "calloutInvitationCountLabel": "Ausstehende Einladungen an Benutzer gesendet: {{count}}", + "calloutSuggestionCountLabel": "Ausstehende Vorschläge an Benutzer gesendet: {{count}}", + "manualInvitationOption__description": "Benutzer können nur manuell zur Organisation eingeladen werden.", + "manualInvitationOption__label": "Keine automatische Einschreibung", + "subtitle": "Wählen Sie aus, wie Benutzer aus dieser Domain der Organisation beitreten können." + }, + "start": { + "headerTitle__danger": "Gefahr", + "headerTitle__enrollment": "Einschreibemöglichkeiten" + }, + "subtitle": "Die Domain {{domain}} ist jetzt verifiziert. Fahren Sie fort, indem Sie den Einschreibemodus auswählen.", + "title": "{{domain}} aktualisieren" + }, + "verifyDomainPage": { + "formSubtitle": "Geben Sie den Verifizierungscode ein, der an Ihre E-Mail-Adresse gesendet wurde.", + "formTitle": "Verifizierungscode", + "resendButton": "Code nicht erhalten? Erneut senden", + "subtitle": "Die Domain {{domainName}} muss per E-Mail verifiziert werden.", + "subtitleVerificationCodeScreen": "Ein Verifizierungscode wurde an {{emailAddress}} gesendet. Geben Sie den Code ein, um fortzufahren.", + "title": "Domain verifizieren" + } + }, + "organizationSwitcher": { + "action__createOrganization": "Organisation erstellen", + "action__invitationAccept": "Beitreten", + "action__manageOrganization": "Verwalten", + "action__suggestionsAccept": "Anfrage zum Beitritt", + "notSelected": "Keine Organisation ausgewählt", + "personalWorkspace": "Persönliches Konto", + "suggestionsAcceptedLabel": "Ausstehende Genehmigung" + }, + "paginationButton__next": "Weiter", + "paginationButton__previous": "Zurück", + "paginationRowText__displaying": "Anzeige", + "paginationRowText__of": "von", + "signIn": { + "accountSwitcher": { + "action__addAccount": "Konto hinzufügen", + "action__signOutAll": "Aus allen Konten abmelden", + "subtitle": "Wählen Sie das Konto aus, mit dem Sie fortfahren möchten.", + "title": "Konto auswählen" + }, + "alternativeMethods": { + "actionLink": "Hilfe erhalten", + "actionText": "Keins davon? ", + "blockButton__backupCode": "Backup-Code verwenden", + "blockButton__emailCode": "E-Mail-Code an {{identifier}} senden", + "blockButton__emailLink": "Link an {{identifier}} senden", + "blockButton__passkey": "Mit Ihrem Passkey anmelden", + "blockButton__password": "Mit Ihrem Passwort anmelden", + "blockButton__phoneCode": "SMS-Code an {{identifier}} senden", + "blockButton__totp": "Authenticator-App verwenden", + "getHelp": { + "blockButton__emailSupport": "E-Mail-Support", + "content": "Wenn Sie Probleme beim Anmelden haben, senden Sie uns eine E-Mail, und wir werden mit Ihnen zusammenarbeiten, um den Zugriff so schnell wie möglich wiederherzustellen.", + "title": "Hilfe erhalten" + }, + "subtitle": "Probleme? Sie können eine dieser Methoden verwenden, um sich anzumelden.", + "title": "Eine andere Methode verwenden" + }, + "backupCodeMfa": { + "subtitle": "Ihr Backup-Code ist der, den Sie bei der Einrichtung der Zwei-Faktor-Authentifizierung erhalten haben.", + "title": "Backup-Code eingeben" + }, + "emailCode": { + "formTitle": "Verifizierungscode", + "resendButton": "Code nicht erhalten? Erneut senden", + "subtitle": "Weiter zu {{applicationName}}", + "title": "E-Mail überprüfen" + }, + "emailLink": { + "expired": { + "subtitle": "Zurück zum Original-Tab, um fortzufahren.", + "title": "Dieser Bestätigungslink ist abgelaufen" + }, + "failed": { + "subtitle": "Zurück zum Original-Tab, um fortzufahren.", + "title": "Dieser Bestätigungslink ist ungültig" + }, + "formSubtitle": "Verwenden Sie den Bestätigungslink, der an Ihre E-Mail gesendet wurde", + "formTitle": "Bestätigungslink", + "loading": { + "subtitle": "Sie werden bald weitergeleitet", + "title": "Anmelden..." + }, + "resendButton": "Link nicht erhalten? Erneut senden", + "subtitle": "Weiter zu {{applicationName}}", + "title": "E-Mail überprüfen", + "unusedTab": { + "title": "Sie können diesen Tab schließen" + }, + "verified": { + "subtitle": "Sie werden bald weitergeleitet", + "title": "Erfolgreich angemeldet" + }, + "verifiedSwitchTab": { + "subtitle": "Zurück zum Original-Tab, um fortzufahren", + "subtitleNewTab": "Zur neu geöffneten Registerkarte zurückkehren, um fortzufahren", + "titleNewTab": "Auf anderer Registerkarte angemeldet" + } + }, + "forgotPassword": { + "formTitle": "Passwort zurücksetzen", + "resendButton": "Code nicht erhalten? Erneut senden", + "subtitle": "Zum Zurücksetzen Ihres Passworts", + "subtitle_email": "Geben Sie zuerst den an Ihre E-Mail-Adresse gesendeten Code ein", + "subtitle_phone": "Geben Sie zuerst den an Ihr Telefon gesendeten Code ein", + "title": "Passwort zurücksetzen" + }, + "forgotPasswordAlternativeMethods": { + "blockButton__resetPassword": "Passwort zurücksetzen", + "label__alternativeMethods": "Oder melden Sie sich mit einer anderen Methode an", + "title": "Passwort vergessen?" + }, + "noAvailableMethods": { + "message": "Anmeldung nicht möglich. Es gibt keinen verfügbaren Authentifizierungsfaktor.", + "subtitle": "Ein Fehler ist aufgetreten", + "title": "Anmeldung nicht möglich" + }, + "passkey": { + "subtitle": "Die Verwendung Ihres Passkeys bestätigt, dass Sie es sind. Ihr Gerät kann nach Ihrem Fingerabdruck, Gesicht oder Bildschirmsperre fragen.", + "title": "Ihren Passkey verwenden" + }, + "password": { + "actionLink": "Andere Methode verwenden", + "subtitle": "Geben Sie das Passwort für Ihr Konto ein", + "title": "Geben Sie Ihr Passwort ein" + }, + "passwordPwned": { + "title": "Passwort kompromittiert" + }, + "phoneCode": { + "formTitle": "Verifizierungscode", + "resendButton": "Code nicht erhalten? Erneut senden", + "subtitle": "Weiter zu {{applicationName}}", + "title": "Telefon überprüfen" + }, + "phoneCodeMfa": { + "formTitle": "Verifizierungscode", + "resendButton": "Code nicht erhalten? Erneut senden", + "subtitle": "Geben Sie den Verifizierungscode ein, der an Ihr Telefon gesendet wurde", + "title": "Telefon überprüfen" + }, + "resetPassword": { + "formButtonPrimary": "Passwort zurücksetzen", + "requiredMessage": "Aus Sicherheitsgründen ist es erforderlich, Ihr Passwort zurückzusetzen.", + "successMessage": "Ihr Passwort wurde erfolgreich geändert. Wir melden Sie an, bitte warten Sie einen Moment.", + "title": "Neues Passwort festlegen" + }, + "resetPasswordMfa": { + "detailsLabel": "Wir müssen Ihre Identität überprüfen, bevor wir Ihr Passwort zurücksetzen." + }, + "start": { + "actionLink": "Registrieren", + "actionLink__use_email": "E-Mail verwenden", + "actionLink__use_email_username": "E-Mail oder Benutzernamen verwenden", + "actionLink__use_passkey": "Stattdessen Passkey verwenden", + "actionLink__use_phone": "Telefon verwenden", + "actionLink__use_username": "Benutzernamen verwenden", + "actionText": "Sie haben noch kein Konto?", + "subtitle": "Willkommen zurück! Bitte melden Sie sich an, um fortzufahren", + "title": "Anmelden bei {{applicationName}}" + }, + "totpMfa": { + "formTitle": "Verifizierungscode", + "subtitle": "Geben Sie den Verifizierungscode ein, den Ihre Authenticator-App generiert", + "title": "Zwei-Faktor-Verifizierung" + } + }, + "signInEnterPasswordTitle": "Geben Sie Ihr Passwort ein", + "signUp": { + "continue": { + "actionLink": "Anmelden", + "actionText": "Haben Sie bereits ein Konto?", + "subtitle": "Bitte füllen Sie die fehlenden Details aus, um fortzufahren.", + "title": "Fehlende Felder ausfüllen" + }, + "emailCode": { + "formSubtitle": "Geben Sie den an Ihre E-Mail-Adresse gesendeten Verifizierungscode ein", + "formTitle": "Verifizierungscode", + "resendButton": "Code nicht erhalten? Erneut senden", + "subtitle": "Geben Sie den an Ihre E-Mail-Adresse gesendeten Verifizierungscode ein", + "title": "E-Mail überprüfen" + }, + "emailLink": { + "formSubtitle": "Verwenden Sie den an Ihre E-Mail-Adresse gesendeten Bestätigungslink", + "formTitle": "Bestätigungslink", + "loading": { + "title": "Anmelden..." + }, + "resendButton": "Link nicht erhalten? Erneut senden", + "subtitle": "Weiter zu {{applicationName}}", + "title": "E-Mail überprüfen", + "verified": { + "title": "Erfolgreich angemeldet" + }, + "verifiedSwitchTab": { + "subtitle": "Zur neu geöffneten Registerkarte zurückkehren, um fortzufahren", + "subtitleNewTab": "Zur vorherigen Registerkarte zurückkehren, um fortzufahren", + "title": "E-Mail erfolgreich bestätigt" + } + }, + "phoneCode": { + "formSubtitle": "Geben Sie den an Ihre Telefonnummer gesendeten Verifizierungscode ein", + "formTitle": "Verifizierungscode", + "resendButton": "Code nicht erhalten? Erneut senden", + "subtitle": "Geben Sie den an Ihre Telefonnummer gesendeten Verifizierungscode ein", + "title": "Telefon überprüfen" + }, + "start": { + "actionLink": "Anmelden", + "actionText": "Haben Sie bereits ein Konto?", + "subtitle": "Willkommen! Bitte füllen Sie die Details aus, um zu beginnen.", + "title": "Konto erstellen" + } + }, + "socialButtonsBlockButton": "Weiter mit {{provider|titleize}}", + "unstable__errors": { + "captcha_invalid": "Die Anmeldung war aufgrund fehlgeschlagener Sicherheitsüberprüfungen nicht erfolgreich. Bitte aktualisieren Sie die Seite, um es erneut zu versuchen, oder wenden Sie sich an den Support für weitere Unterstützung.", + "captcha_unavailable": "Die Anmeldung war aufgrund fehlgeschlagener Bot-Überprüfungen nicht erfolgreich. Bitte aktualisieren Sie die Seite, um es erneut zu versuchen, oder wenden Sie sich an den Support für weitere Unterstützung.", + "form_code_incorrect": "", + "form_identifier_exists": "", + "form_identifier_exists__email_address": "Diese E-Mail-Adresse ist bereits vergeben. Bitte versuchen Sie es mit einer anderen.", + "form_identifier_exists__phone_number": "Diese Telefonnummer ist bereits vergeben. Bitte versuchen Sie es mit einer anderen.", + "form_identifier_exists__username": "Dieser Benutzername ist bereits vergeben. Bitte versuchen Sie es mit einem anderen.", + "form_identifier_not_found": "", + "form_param_format_invalid": "", + "form_param_format_invalid__email_address": "Die E-Mail-Adresse muss eine gültige E-Mail-Adresse sein.", + "form_param_format_invalid__phone_number": "Die Telefonnummer muss im gültigen internationalen Format sein.", + "form_param_max_length_exceeded__first_name": "Der Vorname darf 256 Zeichen nicht überschreiten.", + "form_param_max_length_exceeded__last_name": "Der Nachname darf 256 Zeichen nicht überschreiten.", + "form_param_max_length_exceeded__name": "Der Name darf 256 Zeichen nicht überschreiten.", + "form_param_nil": "", + "form_password_incorrect": "", + "form_password_length_too_short": "", + "form_password_not_strong_enough": "Ihr Passwort ist nicht stark genug.", + "form_password_pwned": "Dieses Passwort wurde bei einem Datenleck gefunden und kann nicht verwendet werden. Bitte verwenden Sie stattdessen ein anderes Passwort.", + "form_password_pwned__sign_in": "Dieses Passwort wurde bei einem Datenleck gefunden und kann nicht verwendet werden. Bitte setzen Sie Ihr Passwort zurück.", + "form_password_size_in_bytes_exceeded": "Ihr Passwort hat die zulässige Anzahl von Bytes überschritten. Bitte kürzen Sie es oder entfernen Sie einige Sonderzeichen.", + "form_password_validation_failed": "Falsches Passwort", + "form_username_invalid_character": "", + "form_username_invalid_length": "", + "identification_deletion_failed": "Sie können Ihre letzte Identifikation nicht löschen.", + "not_allowed_access": "", + "passkey_already_exists": "Ein Passkey ist bereits mit diesem Gerät registriert.", + "passkey_not_supported": "Passkeys werden auf diesem Gerät nicht unterstützt.", + "passkey_pa_not_supported": "Die Registrierung erfordert einen Plattformauthentifikator, aber das Gerät unterstützt dies nicht.", + "passkey_registration_cancelled": "Die Passkey-Registrierung wurde abgebrochen oder ist abgelaufen.", + "passkey_retrieval_cancelled": "Die Passkey-Verifizierung wurde abgebrochen oder ist abgelaufen.", + "passwordComplexity": { + "maximumLength": "weniger als {{length}} Zeichen", + "minimumLength": "{{length}} oder mehr Zeichen", + "requireLowercase": "ein Kleinbuchstabe", + "requireNumbers": "eine Zahl", + "requireSpecialCharacter": "ein Sonderzeichen", + "requireUppercase": "ein Großbuchstabe", + "sentencePrefix": "Ihr Passwort muss enthalten" + }, + "phone_number_exists": "Diese Telefonnummer ist bereits vergeben. Bitte versuchen Sie es mit einer anderen.", + "zxcvbn": { + "couldBeStronger": "Ihr Passwort funktioniert, könnte aber stärker sein. Versuchen Sie, mehr Zeichen hinzuzufügen.", + "goodPassword": "Ihr Passwort erfüllt alle erforderlichen Anforderungen.", + "notEnough": "Ihr Passwort ist nicht stark genug.", + "suggestions": { + "allUppercase": "Verwenden Sie Großbuchstaben, aber nicht ausschließlich.", + "anotherWord": "Fügen Sie weitere Wörter hinzu, die weniger gebräuchlich sind.", + "associatedYears": "Vermeiden Sie Jahre, die mit Ihnen in Verbindung stehen.", + "capitalization": "Verwenden Sie mehr als nur den ersten Buchstaben in Großbuchstaben.", + "dates": "Vermeiden Sie Daten und Jahre, die mit Ihnen in Verbindung stehen.", + "l33t": "Vermeiden Sie vorhersehbare Buchstabenersetzungen wie '@' für 'a'.", + "longerKeyboardPattern": "Verwenden Sie längere Tastaturmuster und ändern Sie die Schreibrichtung mehrmals.", + "noNeed": "Sie können starke Passwörter erstellen, ohne Symbole, Zahlen oder Großbuchstaben zu verwenden.", + "pwned": "Wenn Sie dieses Passwort auch anderswo verwenden, sollten Sie es ändern.", + "recentYears": "Vermeiden Sie aktuelle Jahre.", + "repeated": "Vermeiden Sie wiederholte Wörter und Zeichen.", + "reverseWords": "Vermeiden Sie umgekehrte Schreibweisen von gebräuchlichen Wörtern.", + "sequences": "Vermeiden Sie gebräuchliche Zeichenfolgen.", + "useWords": "Verwenden Sie mehrere Wörter, aber vermeiden Sie gebräuchliche Phrasen." + }, + "warnings": { + "common": "Dies ist ein häufig verwendetes Passwort.", + "commonNames": "Gemeinsame Namen und Nachnamen sind leicht zu erraten.", + "dates": "Daten sind leicht zu erraten.", + "extendedRepeat": "Wiederholte Zeichenmuster wie \"abcabcabc\" sind leicht zu erraten.", + "keyPattern": "Kurze Tastaturmuster sind leicht zu erraten.", + "namesByThemselves": "Einzelne Namen oder Nachnamen sind leicht zu erraten.", + "pwned": "Ihr Passwort wurde bei einem Datenleck im Internet offengelegt.", + "recentYears": "Aktuelle Jahre sind leicht zu erraten.", + "sequences": "Gebräuchliche Zeichenfolgen wie \"abc\" sind leicht zu erraten.", + "similarToCommon": "Dies ähnelt einem häufig verwendeten Passwort.", + "simpleRepeat": "Wiederholte Zeichen wie \"aaa\" sind leicht zu erraten.", + "straightRow": "Gerade Tastenreihen auf Ihrer Tastatur sind leicht zu erraten.", + "topHundred": "Dies ist ein häufig verwendetes Passwort.", + "topTen": "Dies ist ein stark verwendetes Passwort.", + "userInputs": "Es sollten keine persönlichen oder seitenbezogenen Daten enthalten sein.", + "wordByItself": "Einzelne Wörter sind leicht zu erraten." + } + } + }, + "userButton": { + "action__addAccount": "Konto hinzufügen", + "action__manageAccount": "Konto verwalten", + "action__signOut": "Abmelden", + "action__signOutAll": "Aus allen Konten abmelden" + }, + "userProfile": { + "backupCodePage": { + "actionLabel__copied": "Kopiert!", + "actionLabel__copy": "Alle kopieren", + "actionLabel__download": "Herunterladen .txt", + "actionLabel__print": "Drucken", + "infoText1": "Backup-Codes werden für dieses Konto aktiviert.", + "infoText2": "Bewahren Sie die Backup-Codes geheim auf und speichern Sie sie sicher. Sie können Backup-Codes neu generieren, wenn Sie vermuten, dass sie kompromittiert wurden.", + "subtitle__codelist": "Speichern Sie sie sicher und halten Sie sie geheim.", + "successMessage": "Backup-Codes sind jetzt aktiviert. Sie können einen davon verwenden, um sich in Ihr Konto einzuloggen, wenn Sie den Zugriff auf Ihr Authentifizierungsgerät verlieren. Jeder Code kann nur einmal verwendet werden.", + "successSubtitle": "Sie können einen davon verwenden, um sich in Ihr Konto einzuloggen, wenn Sie den Zugriff auf Ihr Authentifizierungsgerät verlieren.", + "title": "Backup-Code-Verifizierung hinzufügen", + "title__codelist": "Backup-Codes" + }, + "connectedAccountPage": { + "formHint": "Wählen Sie einen Anbieter aus, um Ihr Konto zu verbinden.", + "formHint__noAccounts": "Es sind keine externen Kontenanbieter verfügbar.", + "removeResource": { + "messageLine1": "{{identifier}} wird von diesem Konto entfernt.", + "messageLine2": "Sie können dieses verbundene Konto nicht mehr verwenden, und alle abhängigen Funktionen funktionieren nicht mehr.", + "successMessage": "{{connectedAccount}} wurde von Ihrem Konto entfernt.", + "title": "Verbundenes Konto entfernen" + }, + "socialButtonsBlockButton": "{{provider|titleize}}", + "successMessage": "Der Anbieter wurde Ihrem Konto hinzugefügt", + "title": "Verbundenes Konto hinzufügen" + }, + "deletePage": { + "actionDescription": "Geben Sie unten \"Konto löschen\" ein, um fortzufahren.", + "confirm": "Konto löschen", + "messageLine1": "Möchten Sie Ihr Konto wirklich löschen?", + "messageLine2": "Diese Aktion ist dauerhaft und nicht rückgängig zu machen.", + "title": "Konto löschen" + }, + "emailAddressPage": { + "emailCode": { + "formHint": "Eine E-Mail mit einem Verifizierungscode wird an diese E-Mail-Adresse gesendet.", + "formSubtitle": "Geben Sie den Verifizierungscode ein, der an {{identifier}} gesendet wurde.", + "formTitle": "Verifizierungscode", + "resendButton": "Code nicht erhalten? Erneut senden", + "successMessage": "Die E-Mail {{identifier}} wurde Ihrem Konto hinzugefügt." + }, + "emailLink": { + "formHint": "Eine E-Mail mit einem Verifizierungslink wird an diese E-Mail-Adresse gesendet.", + "formSubtitle": "Klicken Sie auf den Verifizierungslink in der E-Mail, die an {{identifier}} gesendet wurde.", + "formTitle": "Verifizierungslink", + "resendButton": "Link nicht erhalten? Erneut senden", + "successMessage": "Die E-Mail {{identifier}} wurde Ihrem Konto hinzugefügt." + }, + "removeResource": { + "messageLine1": "{{identifier}} wird von diesem Konto entfernt.", + "messageLine2": "Sie können sich nicht mehr mit dieser E-Mail-Adresse anmelden.", + "successMessage": "{{emailAddress}} wurde von Ihrem Konto entfernt.", + "title": "E-Mail-Adresse entfernen" + }, + "title": "E-Mail-Adresse hinzufügen", + "verifyTitle": "E-Mail-Adresse verifizieren" + }, + "formButtonPrimary__add": "Hinzufügen", + "formButtonPrimary__continue": "Weiter", + "formButtonPrimary__finish": "Fertig", + "formButtonPrimary__remove": "Entfernen", + "formButtonPrimary__save": "Speichern", + "formButtonReset": "Abbrechen", + "mfaPage": { + "formHint": "Wählen Sie eine Methode zum Hinzufügen aus.", + "title": "Zweistufige Verifizierung hinzufügen" + }, + "mfaPhoneCodePage": { + "backButton": "Bestehende Nummer verwenden", + "primaryButton__addPhoneNumber": "Telefonnummer hinzufügen", + "removeResource": { + "messageLine1": "{{identifier}} erhält keine Verifizierungscodes mehr beim Anmelden.", + "messageLine2": "Ihr Konto ist möglicherweise nicht mehr so sicher. Möchten Sie wirklich fortfahren?", + "successMessage": "Zweistufige Verifizierung per SMS-Code wurde für {{mfaPhoneCode}} entfernt", + "title": "Zweistufige Verifizierung entfernen" + }, + "subtitle__availablePhoneNumbers": "Wählen Sie eine vorhandene Telefonnummer aus, um sich für die zweistufige Verifizierung per SMS-Code zu registrieren, oder fügen Sie eine neue hinzu.", + "subtitle__unavailablePhoneNumbers": "Es sind keine verfügbaren Telefonnummern zur Registrierung für die zweistufige Verifizierung per SMS-Code vorhanden. Bitte fügen Sie eine neue hinzu.", + "successMessage1": "Beim Anmelden müssen Sie einen Verifizierungscode eingeben, der an diese Telefonnummer gesendet wird.", + "successMessage2": "Speichern Sie diese Backup-Codes und bewahren Sie sie an einem sicheren Ort auf. Wenn Sie den Zugriff auf Ihr Authentifizierungsgerät verlieren, können Sie Backup-Codes zum Einloggen verwenden.", + "successTitle": "SMS-Code-Verifizierung aktiviert", + "title": "SMS-Code-Verifizierung hinzufügen" + }, + "mfaTOTPPage": { + "authenticatorApp": { + "buttonAbleToScan__nonPrimary": "QR-Code stattdessen scannen", + "buttonUnableToScan__nonPrimary": "Kann QR-Code nicht scannen?", + "infoText__ableToScan": "Richten Sie eine neue Anmelde-Methode in Ihrer Authenticator-App ein und scannen Sie den folgenden QR-Code, um ihn mit Ihrem Konto zu verknüpfen.", + "infoText__unableToScan": "Richten Sie eine neue Anmelde-Methode in Ihrem Authenticator ein und geben Sie den unten bereitgestellten Schlüssel ein.", + "inputLabel__unableToScan1": "Stellen Sie sicher, dass Zeitbasierte oder Einmalpasswörter aktiviert sind, und beenden Sie dann die Verknüpfung Ihres Kontos.", + "inputLabel__unableToScan2": "Alternativ können Sie, wenn Ihr Authenticator TOTP-URIs unterstützt, auch die vollständige URI kopieren." + }, + "removeResource": { + "messageLine1": "Verifizierungscodes von diesem Authenticator sind beim Anmelden nicht mehr erforderlich.", + "messageLine2": "Ihr Konto ist möglicherweise nicht mehr so sicher. Möchten Sie wirklich fortfahren?", + "successMessage": "Zweistufige Verifizierung über Authenticator-App wurde entfernt.", + "title": "Zweistufige Verifizierung entfernen" + }, + "successMessage": "Zweistufige Verifizierung ist jetzt aktiviert. Beim Anmelden müssen Sie einen Verifizierungscode von diesem Authenticator als zusätzlichen Schritt eingeben.", + "title": "Authenticator-App hinzufügen", + "verifySubtitle": "Geben Sie den Verifizierungscode ein, der von Ihrem Authenticator generiert wurde.", + "verifyTitle": "Verifizierungscode" + }, + "mobileButton__menu": "Menü", + "navbar": { + "account": "Profil", + "description": "Verwalten Sie Ihre Kontoinformationen.", + "security": "Sicherheit", + "title": "Konto" + }, + "passkeyScreen": { + "removeResource": { + "messageLine1": "{{name}} wird von diesem Konto entfernt.", + "title": "Passkey entfernen" + }, + "subtitle__rename": "Sie können den Passkey-Namen ändern, um ihn leichter zu finden.", + "title__rename": "Passkey umbenennen" + }, + "passwordPage": { + "checkboxInfoText__signOutOfOtherSessions": "Es wird empfohlen, sich von allen anderen Geräten abzumelden, die Ihr altes Passwort verwendet haben.", + "readonly": "Ihr Passwort kann derzeit nicht bearbeitet werden, da Sie sich nur über die Unternehmensverbindung anmelden können.", + "successMessage__set": "Ihr Passwort wurde festgelegt.", + "successMessage__signOutOfOtherSessions": "Alle anderen Geräte wurden abgemeldet.", + "successMessage__update": "Ihr Passwort wurde aktualisiert.", + "title__set": "Passwort festlegen", + "title__update": "Passwort aktualisieren" + }, + "phoneNumberPage": { + "infoText": "Eine SMS mit einem Bestätigungscode wird an diese Telefonnummer gesendet. Es können Nachrichten- und Datengebühren anfallen.", + "removeResource": { + "messageLine1": "{{identifier}} wird von diesem Konto entfernt.", + "messageLine2": "Sie können sich nicht mehr mit dieser Telefonnummer anmelden.", + "successMessage": "{{phoneNumber}} wurde von Ihrem Konto entfernt.", + "title": "Telefonnummer entfernen" + }, + "successMessage": "{{identifier}} wurde Ihrem Konto hinzugefügt.", + "title": "Telefonnummer hinzufügen", + "verifySubtitle": "Geben Sie den Bestätigungscode ein, der an {{identifier}} gesendet wurde.", + "verifyTitle": "Telefonnummer überprüfen" + }, + "profilePage": { + "fileDropAreaHint": "Empfohlene Größe 1:1, bis zu 10 MB.", + "imageFormDestructiveActionSubtitle": "Entfernen", + "imageFormSubtitle": "Hochladen", + "imageFormTitle": "Profilbild", + "readonly": "Ihre Profilinformationen wurden von der Unternehmensverbindung bereitgestellt und können nicht bearbeitet werden.", + "successMessage": "Ihr Profil wurde aktualisiert.", + "title": "Profil aktualisieren" + }, + "start": { + "activeDevicesSection": { + "destructiveAction": "Vom Gerät abmelden", + "title": "Aktive Geräte" + }, + "connectedAccountsSection": { + "actionLabel__connectionFailed": "Erneut versuchen", + "actionLabel__reauthorize": "Jetzt autorisieren", + "destructiveActionTitle": "Entfernen", + "primaryButton": "Konto verbinden", + "subtitle__reauthorize": "Die erforderlichen Berechtigungen wurden aktualisiert, und Sie könnten eine eingeschränkte Funktionalität erleben. Bitte autorisieren Sie diese Anwendung erneut, um Probleme zu vermeiden.", + "title": "Verbundene Konten" + }, + "dangerSection": { + "deleteAccountButton": "Konto löschen", + "title": "Konto löschen" + }, + "emailAddressesSection": { + "destructiveAction": "E-Mail entfernen", + "detailsAction__nonPrimary": "Als primär festlegen", + "detailsAction__primary": "Verifizierung abschließen", + "detailsAction__unverified": "Verifizieren", + "primaryButton": "E-Mail-Adresse hinzufügen", + "title": "E-Mail-Adressen" + }, + "enterpriseAccountsSection": { + "title": "Unternehmenskonten" + }, + "headerTitle__account": "Profilinformationen", + "headerTitle__security": "Sicherheit", + "mfaSection": { + "backupCodes": { + "actionLabel__regenerate": "Neu generieren", + "headerTitle": "Backup-Codes", + "subtitle__regenerate": "Erhalten Sie einen neuen Satz sicherer Backup-Codes. Vorherige Backup-Codes werden gelöscht und können nicht mehr verwendet werden.", + "title__regenerate": "Backup-Codes neu generieren" + }, + "phoneCode": { + "actionLabel__setDefault": "Als Standard festlegen", + "destructiveActionLabel": "Entfernen" + }, + "primaryButton": "Zweistufige Verifizierung hinzufügen", + "title": "Zweistufige Verifizierung", + "totp": { + "destructiveActionTitle": "Entfernen", + "headerTitle": "Authentifizierungsanwendung" + } + }, + "passkeysSection": { + "menuAction__destructive": "Entfernen", + "menuAction__rename": "Umbenennen", + "title": "Passwörter" + }, + "passwordSection": { + "primaryButton__setPassword": "Passwort festlegen", + "primaryButton__updatePassword": "Passwort aktualisieren", + "title": "Passwort" + }, + "phoneNumbersSection": { + "destructiveAction": "Telefonnummer entfernen", + "detailsAction__nonPrimary": "Als primär festlegen", + "detailsAction__primary": "Verifizierung abschließen", + "detailsAction__unverified": "Telefonnummer verifizieren", + "primaryButton": "Telefonnummer hinzufügen", + "title": "Telefonnummern" + }, + "profileSection": { + "primaryButton": "Profil aktualisieren", + "title": "Profil" + }, + "usernameSection": { + "primaryButton__setUsername": "Benutzernamen festlegen", + "primaryButton__updateUsername": "Benutzernamen aktualisieren", + "title": "Benutzername" + }, + "web3WalletsSection": { + "destructiveAction": "Wallet entfernen", + "primaryButton": "Web3-Wallets", + "title": "Web3-Wallets" + } + }, + "usernamePage": { + "successMessage": "Ihr Benutzername wurde aktualisiert.", + "title__set": "Benutzername festlegen", + "title__update": "Benutzername aktualisieren" + }, + "web3WalletPage": { + "removeResource": { + "messageLine1": "{{identifier}} wird von diesem Konto entfernt.", + "messageLine2": "Sie können sich nicht mehr mit diesem Web3-Wallet anmelden.", + "successMessage": "{{web3Wallet}} wurde von Ihrem Konto entfernt.", + "title": "Web3-Wallet entfernen" + }, + "subtitle__availableWallets": "Wählen Sie ein Web3-Wallet aus, um es mit Ihrem Konto zu verbinden.", + "subtitle__unavailableWallets": "Es sind keine verfügbaren Web3-Wallets vorhanden.", + "successMessage": "Das Wallet wurde Ihrem Konto hinzugefügt.", + "title": "Web3-Wallet hinzufügen" + } + } +} diff --git a/locales/de-DE/common.json b/locales/de-DE/common.json index ccd15a2b2ce3b..111ccc2182152 100644 --- a/locales/de-DE/common.json +++ b/locales/de-DE/common.json @@ -160,6 +160,7 @@ "newVersion": "Neue Version verfügbar: {{version}}" }, "userPanel": { + "anonymousNickName": "Anonymer Benutzer", "billing": "Abrechnung verwalten", "defaultNickname": "Community User", "discord": "Community-Support", diff --git a/locales/de-DE/error.json b/locales/de-DE/error.json index a6b419d7c6994..e52ae37253e78 100644 --- a/locales/de-DE/error.json +++ b/locales/de-DE/error.json @@ -1,4 +1,11 @@ { + "clerkAuth": { + "loginSuccess": { + "action": "Weitermachen", + "desc": "{{greeting}}, es freut mich, dass ich dir weiterhelfen kann. Lass uns das Gespräch fortsetzen.", + "title": "Willkommen zurück, {{nickName}}" + } + }, "error": { "backHome": "Zurück zur Startseite", "desc": "Versuchen Sie es später erneut oder kehren Sie in die bekannte Welt zurück", @@ -54,6 +61,7 @@ "InvalidAnthropicAPIKey": "Ungültiger oder leerer Anthropic API-Schlüssel. Bitte überprüfen Sie den Anthropic API-Schlüssel und versuchen Sie es erneut.", "InvalidAzureAPIKey": "Der Azure API-Schlüssel ist ungültig oder leer. Bitte überprüfen Sie den Azure API-Schlüssel und versuchen Sie es erneut.", "InvalidBedrockCredentials": "Die Bedrock-Authentifizierung ist fehlgeschlagen. Bitte überprüfen Sie AccessKeyId/SecretAccessKey und versuchen Sie es erneut.", + "InvalidClerkUser": "Entschuldigung, du bist derzeit nicht angemeldet. Bitte melde dich an oder registriere ein Konto, um fortzufahren.", "InvalidGoogleAPIKey": "Der Google API-Schlüssel ist ungültig oder leer. Bitte überprüfen Sie den Google API-Schlüssel und versuchen Sie es erneut.", "InvalidGroqAPIKey": "Der Groq API-Schlüssel ist ungültig oder leer. Bitte überprüfen Sie den Groq API-Schlüssel und versuchen Sie es erneut.", "InvalidMinimaxAPIKey": "Ungültiger oder leerer Minimax-API-Schlüssel. Bitte überprüfen Sie den Minimax-API-Schlüssel und versuchen Sie es erneut.", diff --git a/locales/en-US/auth.json b/locales/en-US/auth.json new file mode 100644 index 0000000000000..5e2b68c636a1c --- /dev/null +++ b/locales/en-US/auth.json @@ -0,0 +1,6 @@ +{ + "login": "Login", + "loginOrSignup": "Log in / Sign up", + "signout": "Sign out", + "signup": "Sign up" +} diff --git a/locales/en-US/clerk.json b/locales/en-US/clerk.json new file mode 100644 index 0000000000000..cfeeccf08b4a9 --- /dev/null +++ b/locales/en-US/clerk.json @@ -0,0 +1,769 @@ +{ + "backButton": "Back", + "badge__default": "Default", + "badge__otherImpersonatorDevice": "Other impersonator device", + "badge__primary": "Primary", + "badge__requiresAction": "Requires action", + "badge__thisDevice": "This device", + "badge__unverified": "Unverified", + "badge__userDevice": "User device", + "badge__you": "You", + "createOrganization": { + "formButtonSubmit": "Create organization", + "invitePage": { + "formButtonReset": "Skip" + }, + "title": "Create organization" + }, + "dates": { + "lastDay": "Yesterday at {{ date | timeString('en-US') }}", + "next6Days": "{{ date | weekday('en-US','long') }} at {{ date | timeString('en-US') }}", + "nextDay": "Tomorrow at {{ date | timeString('en-US') }}", + "numeric": "{{ date | numeric('en-US') }}", + "previous6Days": "Last {{ date | weekday('en-US','long') }} at {{ date | timeString('en-US') }}", + "sameDay": "Today at {{ date | timeString('en-US') }}" + }, + "dividerText": "or", + "footerActionLink__useAnotherMethod": "Use another method", + "footerPageLink__help": "Help", + "footerPageLink__privacy": "Privacy", + "footerPageLink__terms": "Terms", + "formButtonPrimary": "Continue", + "formButtonPrimary__verify": "Verify", + "formFieldAction__forgotPassword": "Forgot password?", + "formFieldError__matchingPasswords": "Passwords match.", + "formFieldError__notMatchingPasswords": "Passwords don't match.", + "formFieldError__verificationLinkExpired": "The verification link expired. Please request a new link.", + "formFieldHintText__optional": "Optional", + "formFieldHintText__slug": "A slug is a human-readable ID that must be unique. It’s often used in URLs.", + "formFieldInputPlaceholder__backupCode": "", + "formFieldInputPlaceholder__confirmDeletionUserAccount": "Delete account", + "formFieldInputPlaceholder__emailAddress": "", + "formFieldInputPlaceholder__emailAddress_username": "", + "formFieldInputPlaceholder__emailAddresses": "example@email.com, example2@email.com", + "formFieldInputPlaceholder__firstName": "", + "formFieldInputPlaceholder__lastName": "", + "formFieldInputPlaceholder__organizationDomain": "", + "formFieldInputPlaceholder__organizationDomainEmailAddress": "", + "formFieldInputPlaceholder__organizationName": "", + "formFieldInputPlaceholder__organizationSlug": "my-org", + "formFieldInputPlaceholder__password": "", + "formFieldInputPlaceholder__phoneNumber": "", + "formFieldInputPlaceholder__username": "", + "formFieldLabel__automaticInvitations": "Enable automatic invitations for this domain", + "formFieldLabel__backupCode": "Backup code", + "formFieldLabel__confirmDeletion": "Confirmation", + "formFieldLabel__confirmPassword": "Confirm password", + "formFieldLabel__currentPassword": "Current password", + "formFieldLabel__emailAddress": "Email address", + "formFieldLabel__emailAddress_username": "Email address or username", + "formFieldLabel__emailAddresses": "Email addresses", + "formFieldLabel__firstName": "First name", + "formFieldLabel__lastName": "Last name", + "formFieldLabel__newPassword": "New password", + "formFieldLabel__organizationDomain": "Domain", + "formFieldLabel__organizationDomainDeletePending": "Delete pending invitations and suggestions", + "formFieldLabel__organizationDomainEmailAddress": "Verification email address", + "formFieldLabel__organizationDomainEmailAddressDescription": "Enter an email address under this domain to receive a code and verify this domain.", + "formFieldLabel__organizationName": "Name", + "formFieldLabel__organizationSlug": "Slug", + "formFieldLabel__passkeyName": "Name of passkey", + "formFieldLabel__password": "Password", + "formFieldLabel__phoneNumber": "Phone number", + "formFieldLabel__role": "Role", + "formFieldLabel__signOutOfOtherSessions": "Sign out of all other devices", + "formFieldLabel__username": "Username", + "impersonationFab": { + "action__signOut": "Sign out", + "title": "Signed in as {{identifier}}" + }, + "locale": "en-US", + "maintenanceMode": "We are currently undergoing maintenance, but don't worry, it shouldn't take more than a few minutes.", + "membershipRole__admin": "Admin", + "membershipRole__basicMember": "Member", + "membershipRole__guestMember": "Guest", + "organizationList": { + "action__createOrganization": "Create organization", + "action__invitationAccept": "Join", + "action__suggestionsAccept": "Request to join", + "createOrganization": "Create Organization", + "invitationAcceptedLabel": "Joined", + "subtitle": "to continue to {{applicationName}}", + "suggestionsAcceptedLabel": "Pending approval", + "title": "Choose an account", + "titleWithoutPersonal": "Choose an organization" + }, + "organizationProfile": { + "badge__automaticInvitation": "Automatic invitations", + "badge__automaticSuggestion": "Automatic suggestions", + "badge__manualInvitation": "No automatic enrollment", + "badge__unverified": "Unverified", + "createDomainPage": { + "subtitle": "Add the domain to verify. Users with email addresses at this domain can join the organization automatically or request to join.", + "title": "Add domain" + }, + "invitePage": { + "detailsTitle__inviteFailed": "The invitations could not be sent. There are already pending invitations for the following email addresses: {{email_addresses}}.", + "formButtonPrimary__continue": "Send invitations", + "selectDropdown__role": "Select role", + "subtitle": "Enter or paste one or more email addresses, separated by spaces or commas.", + "successMessage": "Invitations successfully sent", + "title": "Invite new members" + }, + "membersPage": { + "action__invite": "Invite", + "activeMembersTab": { + "menuAction__remove": "Remove member", + "tableHeader__actions": "", + "tableHeader__joined": "Joined", + "tableHeader__role": "Role", + "tableHeader__user": "User" + }, + "detailsTitle__emptyRow": "No members to display", + "invitationsTab": { + "autoInvitations": { + "headerSubtitle": "Invite users by connecting an email domain with your organization. Anyone who signs up with a matching email domain will be able to join the organization anytime.", + "headerTitle": "Automatic invitations", + "primaryButton": "Manage verified domains" + }, + "table__emptyRow": "No invitations to display" + }, + "invitedMembersTab": { + "menuAction__revoke": "Revoke invitation", + "tableHeader__invited": "Invited" + }, + "requestsTab": { + "autoSuggestions": { + "headerSubtitle": "Users who sign up with a matching email domain, will be able to see a suggestion to request to join your organization.", + "headerTitle": "Automatic suggestions", + "primaryButton": "Manage verified domains" + }, + "menuAction__approve": "Approve", + "menuAction__reject": "Reject", + "tableHeader__requested": "Requested access", + "table__emptyRow": "No requests to display" + }, + "start": { + "headerTitle__invitations": "Invitations", + "headerTitle__members": "Members", + "headerTitle__requests": "Requests" + } + }, + "navbar": { + "description": "Manage your organization.", + "general": "General", + "members": "Members", + "title": "Organization" + }, + "profilePage": { + "dangerSection": { + "deleteOrganization": { + "actionDescription": "Type \"{{organizationName}}\" below to continue.", + "messageLine1": "Are you sure you want to delete this organization?", + "messageLine2": "This action is permanent and irreversible.", + "successMessage": "You have deleted the organization.", + "title": "Delete organization" + }, + "leaveOrganization": { + "actionDescription": "Type \"{{organizationName}}\" below to continue.", + "messageLine1": "Are you sure you want to leave this organization? You will lose access to this organization and its applications.", + "messageLine2": "This action is permanent and irreversible.", + "successMessage": "You have left the organization.", + "title": "Leave organization" + }, + "title": "Danger" + }, + "domainSection": { + "menuAction__manage": "Manage", + "menuAction__remove": "Delete", + "menuAction__verify": "Verify", + "primaryButton": "Add domain", + "subtitle": "Allow users to join the organization automatically or request to join based on a verified email domain.", + "title": "Verified domains" + }, + "successMessage": "The organization has been updated.", + "title": "Update profile" + }, + "removeDomainPage": { + "messageLine1": "The email domain {{domain}} will be removed.", + "messageLine2": "Users won’t be able to join the organization automatically after this.", + "successMessage": "{{domain}} has been removed.", + "title": "Remove domain" + }, + "start": { + "headerTitle__general": "General", + "headerTitle__members": "Members", + "profileSection": { + "primaryButton": "Update profile", + "title": "Organization Profile", + "uploadAction__title": "Logo" + } + }, + "verifiedDomainPage": { + "dangerTab": { + "calloutInfoLabel": "Removing this domain will affect invited users.", + "removeDomainActionLabel__remove": "Remove domain", + "removeDomainSubtitle": "Remove this domain from your verified domains", + "removeDomainTitle": "Remove domain" + }, + "enrollmentTab": { + "automaticInvitationOption__description": "Users are automatically invited to join the organization when they sign-up and can join anytime.", + "automaticInvitationOption__label": "Automatic invitations", + "automaticSuggestionOption__description": "Users receive a suggestion to request to join, but must be approved by an admin before they are able to join the organization.", + "automaticSuggestionOption__label": "Automatic suggestions", + "calloutInfoLabel": "Changing the enrollment mode will only affect new users.", + "calloutInvitationCountLabel": "Pending invitations sent to users: {{count}}", + "calloutSuggestionCountLabel": "Pending suggestions sent to users: {{count}}", + "manualInvitationOption__description": "Users can only be invited manually to the organization.", + "manualInvitationOption__label": "No automatic enrollment", + "subtitle": "Choose how users from this domain can join the organization." + }, + "start": { + "headerTitle__danger": "Danger", + "headerTitle__enrollment": "Enrollment options" + }, + "subtitle": "The domain {{domain}} is now verified. Continue by selecting enrollment mode.", + "title": "Update {{domain}}" + }, + "verifyDomainPage": { + "formSubtitle": "Enter the verification code sent to your email address", + "formTitle": "Verification code", + "resendButton": "Didn't receive a code? Resend", + "subtitle": "The domain {{domainName}} needs to be verified via email.", + "subtitleVerificationCodeScreen": "A verification code was sent to {{emailAddress}}. Enter the code to continue.", + "title": "Verify domain" + } + }, + "organizationSwitcher": { + "action__createOrganization": "Create organization", + "action__invitationAccept": "Join", + "action__manageOrganization": "Manage", + "action__suggestionsAccept": "Request to join", + "notSelected": "No organization selected", + "personalWorkspace": "Personal account", + "suggestionsAcceptedLabel": "Pending approval" + }, + "paginationButton__next": "Next", + "paginationButton__previous": "Previous", + "paginationRowText__displaying": "Displaying", + "paginationRowText__of": "of", + "signIn": { + "accountSwitcher": { + "action__addAccount": "Add account", + "action__signOutAll": "Sign out of all accounts", + "subtitle": "Select the account with which you wish to continue.", + "title": "Choose an account" + }, + "alternativeMethods": { + "actionLink": "Get help", + "actionText": "Don’t have any of these?", + "blockButton__backupCode": "Use a backup code", + "blockButton__emailCode": "Email code to {{identifier}}", + "blockButton__emailLink": "Email link to {{identifier}}", + "blockButton__passkey": "Sign in with your passkey", + "blockButton__password": "Sign in with your password", + "blockButton__phoneCode": "Send SMS code to {{identifier}}", + "blockButton__totp": "Use your authenticator app", + "getHelp": { + "blockButton__emailSupport": "Email support", + "content": "If you’re experiencing difficulty signing into your account, email us and we will work with you to restore access as soon as possible.", + "title": "Get help" + }, + "subtitle": "Facing issues? You can use any of these methods to sign in.", + "title": "Use another method" + }, + "backupCodeMfa": { + "subtitle": "Your backup code is the one you got when setting up two-step authentication.", + "title": "Enter a backup code" + }, + "emailCode": { + "formTitle": "Verification code", + "resendButton": "Didn't receive a code? Resend", + "subtitle": "to continue to {{applicationName}}", + "title": "Check your email" + }, + "emailLink": { + "expired": { + "subtitle": "Return to the original tab to continue.", + "title": "This verification link has expired" + }, + "failed": { + "subtitle": "Return to the original tab to continue.", + "title": "This verification link is invalid" + }, + "formSubtitle": "Use the verification link sent to your email", + "formTitle": "Verification link", + "loading": { + "subtitle": "You will be redirected soon", + "title": "Signing in..." + }, + "resendButton": "Didn't receive a link? Resend", + "subtitle": "to continue to {{applicationName}}", + "title": "Check your email", + "unusedTab": { + "title": "You may close this tab" + }, + "verified": { + "subtitle": "You will be redirected soon", + "title": "Successfully signed in" + }, + "verifiedSwitchTab": { + "subtitle": "Return to original tab to continue", + "subtitleNewTab": "Return to the newly opened tab to continue", + "titleNewTab": "Signed in on other tab" + } + }, + "forgotPassword": { + "formTitle": "Reset password code", + "resendButton": "Didn't receive a code? Resend", + "subtitle": "to reset your password", + "subtitle_email": "First, enter the code sent to your email address", + "subtitle_phone": "First, enter the code sent to your phone", + "title": "Reset password" + }, + "forgotPasswordAlternativeMethods": { + "blockButton__resetPassword": "Reset your password", + "label__alternativeMethods": "Or, sign in with another method", + "title": "Forgot Password?" + }, + "noAvailableMethods": { + "message": "Cannot proceed with sign in. There's no available authentication factor.", + "subtitle": "An error occurred", + "title": "Cannot sign in" + }, + "passkey": { + "subtitle": "Using your passkey confirms it's you. Your device may ask for your fingerprint, face or screen lock.", + "title": "Use your passkey" + }, + "password": { + "actionLink": "Use another method", + "subtitle": "Enter the password associated with your account", + "title": "Enter your password" + }, + "passwordPwned": { + "title": "Password compromised" + }, + "phoneCode": { + "formTitle": "Verification code", + "resendButton": "Didn't receive a code? Resend", + "subtitle": "to continue to {{applicationName}}", + "title": "Check your phone" + }, + "phoneCodeMfa": { + "formTitle": "Verification code", + "resendButton": "Didn't receive a code? Resend", + "subtitle": "To continue, please enter the verification code sent to your phone", + "title": "Check your phone" + }, + "resetPassword": { + "formButtonPrimary": "Reset Password", + "requiredMessage": "For security reasons, it is required to reset your password.", + "successMessage": "Your password was successfully changed. Signing you in, please wait a moment.", + "title": "Set new password" + }, + "resetPasswordMfa": { + "detailsLabel": "We need to verify your identity before resetting your password." + }, + "start": { + "actionLink": "Sign up", + "actionLink__use_email": "Use email", + "actionLink__use_email_username": "Use email or username", + "actionLink__use_passkey": "Use passkey instead", + "actionLink__use_phone": "Use phone", + "actionLink__use_username": "Use username", + "actionText": "Don’t have an account?", + "subtitle": "Welcome back! Please sign in to continue", + "title": "Sign in to {{applicationName}}" + }, + "totpMfa": { + "formTitle": "Verification code", + "subtitle": "To continue, please enter the verification code generated by your authenticator app", + "title": "Two-step verification" + } + }, + "signInEnterPasswordTitle": "Enter your password", + "signUp": { + "continue": { + "actionLink": "Sign in", + "actionText": "Already have an account?", + "subtitle": "Please fill in the remaining details to continue.", + "title": "Fill in missing fields" + }, + "emailCode": { + "formSubtitle": "Enter the verification code sent to your email address", + "formTitle": "Verification code", + "resendButton": "Didn't receive a code? Resend", + "subtitle": "Enter the verification code sent to your email", + "title": "Verify your email" + }, + "emailLink": { + "formSubtitle": "Use the verification link sent to your email address", + "formTitle": "Verification link", + "loading": { + "title": "Signing up..." + }, + "resendButton": "Didn't receive a link? Resend", + "subtitle": "to continue to {{applicationName}}", + "title": "Verify your email", + "verified": { + "title": "Successfully signed up" + }, + "verifiedSwitchTab": { + "subtitle": "Return to the newly opened tab to continue", + "subtitleNewTab": "Return to previous tab to continue", + "title": "Successfully verified email" + } + }, + "phoneCode": { + "formSubtitle": "Enter the verification code sent to your phone number", + "formTitle": "Verification code", + "resendButton": "Didn't receive a code? Resend", + "subtitle": "Enter the verification code sent to your phone", + "title": "Verify your phone" + }, + "start": { + "actionLink": "Sign in", + "actionText": "Already have an account?", + "subtitle": "Welcome! Please fill in the details to get started.", + "title": "Create your account" + } + }, + "socialButtonsBlockButton": "Continue with {{provider|titleize}}", + "unstable__errors": { + "captcha_invalid": "Sign up unsuccessful due to failed security validations. Please refresh the page to try again or reach out to support for more assistance.", + "captcha_unavailable": "Sign up unsuccessful due to failed bot validation. Please refresh the page to try again or reach out to support for more assistance.", + "form_code_incorrect": "", + "form_identifier_exists": "", + "form_identifier_exists__email_address": "This email address is taken. Please try another.", + "form_identifier_exists__phone_number": "This phone number is taken. Please try another.", + "form_identifier_exists__username": "This username is taken. Please try another.", + "form_identifier_not_found": "", + "form_param_format_invalid": "", + "form_param_format_invalid__email_address": "Email address must be a valid email address.", + "form_param_format_invalid__phone_number": "Phone number must be in a valid international format", + "form_param_max_length_exceeded__first_name": "First name should not exceed 256 characters.", + "form_param_max_length_exceeded__last_name": "Last name should not exceed 256 characters.", + "form_param_max_length_exceeded__name": "Name should not exceed 256 characters.", + "form_param_nil": "", + "form_password_incorrect": "", + "form_password_length_too_short": "", + "form_password_not_strong_enough": "Your password is not strong enough.", + "form_password_pwned": "This password has been found as part of a breach and can not be used, please try another password instead.", + "form_password_pwned__sign_in": "This password has been found as part of a breach and can not be used, please reset your password.", + "form_password_size_in_bytes_exceeded": "Your password has exceeded the maximum number of bytes allowed, please shorten it or remove some special characters.", + "form_password_validation_failed": "Incorrect Password", + "form_username_invalid_character": "", + "form_username_invalid_length": "", + "identification_deletion_failed": "You cannot delete your last identification.", + "not_allowed_access": "", + "passkey_already_exists": "A passkey is already registered with this device.", + "passkey_not_supported": "Passkeys are not supported on this device.", + "passkey_pa_not_supported": "Registration requires a platform authenticator but the device does not support it.", + "passkey_registration_cancelled": "Passkey registration was cancelled or timed out.", + "passkey_retrieval_cancelled": "Passkey verification was cancelled or timed out.", + "passwordComplexity": { + "maximumLength": "less than {{length}} characters", + "minimumLength": "{{length}} or more characters", + "requireLowercase": "a lowercase letter", + "requireNumbers": "a number", + "requireSpecialCharacter": "a special character", + "requireUppercase": "an uppercase letter", + "sentencePrefix": "Your password must contain" + }, + "phone_number_exists": "This phone number is taken. Please try another.", + "zxcvbn": { + "couldBeStronger": "Your password works, but could be stronger. Try adding more characters.", + "goodPassword": "Your password meets all the necessary requirements.", + "notEnough": "Your password is not strong enough.", + "suggestions": { + "allUppercase": "Capitalize some, but not all letters.", + "anotherWord": "Add more words that are less common.", + "associatedYears": "Avoid years that are associated with you.", + "capitalization": "Capitalize more than the first letter.", + "dates": "Avoid dates and years that are associated with you.", + "l33t": "Avoid predictable letter substitutions like '@' for 'a'.", + "longerKeyboardPattern": "Use longer keyboard patterns and change typing direction multiple times.", + "noNeed": "You can create strong passwords without using symbols, numbers, or uppercase letters.", + "pwned": "If you use this password elsewhere, you should change it.", + "recentYears": "Avoid recent years.", + "repeated": "Avoid repeated words and characters.", + "reverseWords": "Avoid reversed spellings of common words.", + "sequences": "Avoid common character sequences.", + "useWords": "Use multiple words, but avoid common phrases." + }, + "warnings": { + "common": "This is a commonly used password.", + "commonNames": "Common names and surnames are easy to guess.", + "dates": "Dates are easy to guess.", + "extendedRepeat": "Repeated character patterns like \"abcabcabc\" are easy to guess.", + "keyPattern": "Short keyboard patterns are easy to guess.", + "namesByThemselves": "Single names or surnames are easy to guess.", + "pwned": "Your password was exposed by a data breach on the Internet.", + "recentYears": "Recent years are easy to guess.", + "sequences": "Common character sequences like \"abc\" are easy to guess.", + "similarToCommon": "This is similar to a commonly used password.", + "simpleRepeat": "Repeated characters like \"aaa\" are easy to guess.", + "straightRow": "Straight rows of keys on your keyboard are easy to guess.", + "topHundred": "This is a frequently used password.", + "topTen": "This is a heavily used password.", + "userInputs": "There should not be any personal or page related data.", + "wordByItself": "Single words are easy to guess." + } + } + }, + "userButton": { + "action__addAccount": "Add account", + "action__manageAccount": "Manage account", + "action__signOut": "Sign out", + "action__signOutAll": "Sign out of all accounts" + }, + "userProfile": { + "backupCodePage": { + "actionLabel__copied": "Copied!", + "actionLabel__copy": "Copy all", + "actionLabel__download": "Download .txt", + "actionLabel__print": "Print", + "infoText1": "Backup codes will be enabled for this account.", + "infoText2": "Keep the backup codes secret and store them securely. You may regenerate backup codes if you suspect they have been compromised.", + "subtitle__codelist": "Store them securely and keep them secret.", + "successMessage": "Backup codes are now enabled. You can use one of these to sign in to your account, if you lose access to your authentication device. Each code can only be used once.", + "successSubtitle": "You can use one of these to sign in to your account, if you lose access to your authentication device.", + "title": "Add backup code verification", + "title__codelist": "Backup codes" + }, + "connectedAccountPage": { + "formHint": "Select a provider to connect your account.", + "formHint__noAccounts": "There are no available external account providers.", + "removeResource": { + "messageLine1": "{{identifier}} will be removed from this account.", + "messageLine2": "You will no longer be able to use this connected account and any dependent features will no longer work.", + "successMessage": "{{connectedAccount}} has been removed from your account.", + "title": "Remove connected account" + }, + "socialButtonsBlockButton": "{{provider|titleize}}", + "successMessage": "The provider has been added to your account", + "title": "Add connected account" + }, + "deletePage": { + "actionDescription": "Type \"Delete account\" below to continue.", + "confirm": "Delete account", + "messageLine1": "Are you sure you want to delete your account?", + "messageLine2": "This action is permanent and irreversible.", + "title": "Delete account" + }, + "emailAddressPage": { + "emailCode": { + "formHint": "An email containing a verification code will be sent to this email address.", + "formSubtitle": "Enter the verification code sent to {{identifier}}", + "formTitle": "Verification code", + "resendButton": "Didn't receive a code? Resend", + "successMessage": "The email {{identifier}} has been added to your account." + }, + "emailLink": { + "formHint": "An email containing a verification link will be sent to this email address.", + "formSubtitle": "Click on the verification link in the email sent to {{identifier}}", + "formTitle": "Verification link", + "resendButton": "Didn't receive a link? Resend", + "successMessage": "The email {{identifier}} has been added to your account." + }, + "removeResource": { + "messageLine1": "{{identifier}} will be removed from this account.", + "messageLine2": "You will no longer be able to sign in using this email address.", + "successMessage": "{{emailAddress}} has been removed from your account.", + "title": "Remove email address" + }, + "title": "Add email address", + "verifyTitle": "Verify email address" + }, + "formButtonPrimary__add": "Add", + "formButtonPrimary__continue": "Continue", + "formButtonPrimary__finish": "Finish", + "formButtonPrimary__remove": "Remove", + "formButtonPrimary__save": "Save", + "formButtonReset": "Cancel", + "mfaPage": { + "formHint": "Select a method to add.", + "title": "Add two-step verification" + }, + "mfaPhoneCodePage": { + "backButton": "Use existing number", + "primaryButton__addPhoneNumber": "Add phone number", + "removeResource": { + "messageLine1": "{{identifier}} will be no longer receiving verification codes when signing in.", + "messageLine2": "Your account may not be as secure. Are you sure you want to continue?", + "successMessage": "SMS code two-step verification has been removed for {{mfaPhoneCode}}", + "title": "Remove two-step verification" + }, + "subtitle__availablePhoneNumbers": "Select an existing phone number to register for SMS code two-step verification or add a new one.", + "subtitle__unavailablePhoneNumbers": "There are no available phone numbers to register for SMS code two-step verification, please add a new one.", + "successMessage1": "When signing in, you will need to enter a verification code sent to this phone number as an additional step.", + "successMessage2": "Save these backup codes and store them somewhere safe. If you lose access to your authentication device, you can use backup codes to sign in.", + "successTitle": "SMS code verification enabled", + "title": "Add SMS code verification" + }, + "mfaTOTPPage": { + "authenticatorApp": { + "buttonAbleToScan__nonPrimary": "Scan QR code instead", + "buttonUnableToScan__nonPrimary": "Can’t scan QR code?", + "infoText__ableToScan": "Set up a new sign-in method in your authenticator app and scan the following QR code to link it to your account.", + "infoText__unableToScan": "Set up a new sign-in method in your authenticator and enter the Key provided below.", + "inputLabel__unableToScan1": "Make sure Time-based or One-time passwords is enabled, then finish linking your account.", + "inputLabel__unableToScan2": "Alternatively, if your authenticator supports TOTP URIs, you can also copy the full URI." + }, + "removeResource": { + "messageLine1": "Verification codes from this authenticator will no longer be required when signing in.", + "messageLine2": "Your account may not be as secure. Are you sure you want to continue?", + "successMessage": "Two-step verification via authenticator application has been removed.", + "title": "Remove two-step verification" + }, + "successMessage": "Two-step verification is now enabled. When signing in, you will need to enter a verification code from this authenticator as an additional step.", + "title": "Add authenticator application", + "verifySubtitle": "Enter verification code generated by your authenticator", + "verifyTitle": "Verification code" + }, + "mobileButton__menu": "Menu", + "navbar": { + "account": "Profile", + "description": "Manage your account info.", + "security": "Security", + "title": "Account" + }, + "passkeyScreen": { + "removeResource": { + "messageLine1": "{{name}} will be removed from this account.", + "title": "Remove passkey" + }, + "subtitle__rename": "You can change the passkey name to make it easier to find.", + "title__rename": "Rename Passkey" + }, + "passwordPage": { + "checkboxInfoText__signOutOfOtherSessions": "It is recommended to sign out of all other devices which may have used your old password.", + "readonly": "Your password can currently not be edited because you can sign in only via the enterprise connection.", + "successMessage__set": "Your password has been set.", + "successMessage__signOutOfOtherSessions": "All other devices have been signed out.", + "successMessage__update": "Your password has been updated.", + "title__set": "Set password", + "title__update": "Update password" + }, + "phoneNumberPage": { + "infoText": "A text message containing a verification code will be sent to this phone number. Message and data rates may apply.", + "removeResource": { + "messageLine1": "{{identifier}} will be removed from this account.", + "messageLine2": "You will no longer be able to sign in using this phone number.", + "successMessage": "{{phoneNumber}} has been removed from your account.", + "title": "Remove phone number" + }, + "successMessage": "{{identifier}} has been added to your account.", + "title": "Add phone number", + "verifySubtitle": "Enter the verification code sent to {{identifier}}", + "verifyTitle": "Verify phone number" + }, + "profilePage": { + "fileDropAreaHint": "Recommended size 1:1, up to 10MB.", + "imageFormDestructiveActionSubtitle": "Remove", + "imageFormSubtitle": "Upload", + "imageFormTitle": "Profile image", + "readonly": "Your profile information has been provided by the enterprise connection and cannot be edited.", + "successMessage": "Your profile has been updated.", + "title": "Update profile" + }, + "start": { + "activeDevicesSection": { + "destructiveAction": "Sign out of device", + "title": "Active devices" + }, + "connectedAccountsSection": { + "actionLabel__connectionFailed": "Try again", + "actionLabel__reauthorize": "Authorize now", + "destructiveActionTitle": "Remove", + "primaryButton": "Connect account", + "subtitle__reauthorize": "The required scopes have been updated, and you may be experiencing limited functionality. Please re-authorize this application to avoid any issues", + "title": "Connected accounts" + }, + "dangerSection": { + "deleteAccountButton": "Delete account", + "title": "Delete account" + }, + "emailAddressesSection": { + "destructiveAction": "Remove email", + "detailsAction__nonPrimary": "Set as primary", + "detailsAction__primary": "Complete verification", + "detailsAction__unverified": "Verify", + "primaryButton": "Add email address", + "title": "Email addresses" + }, + "enterpriseAccountsSection": { + "title": "Enterprise accounts" + }, + "headerTitle__account": "Profile details", + "headerTitle__security": "Security", + "mfaSection": { + "backupCodes": { + "actionLabel__regenerate": "Regenerate", + "headerTitle": "Backup codes", + "subtitle__regenerate": "Get a fresh set of secure backup codes. Prior backup codes will be deleted and cannot be used.", + "title__regenerate": "Regenerate backup codes" + }, + "phoneCode": { + "actionLabel__setDefault": "Set as default", + "destructiveActionLabel": "Remove" + }, + "primaryButton": "Add two-step verification", + "title": "Two-step verification", + "totp": { + "destructiveActionTitle": "Remove", + "headerTitle": "Authenticator application" + } + }, + "passkeysSection": { + "menuAction__destructive": "Remove", + "menuAction__rename": "Rename", + "title": "Passkeys" + }, + "passwordSection": { + "primaryButton__setPassword": "Set password", + "primaryButton__updatePassword": "Update password", + "title": "Password" + }, + "phoneNumbersSection": { + "destructiveAction": "Remove phone number", + "detailsAction__nonPrimary": "Set as primary", + "detailsAction__primary": "Complete verification", + "detailsAction__unverified": "Verify phone number", + "primaryButton": "Add phone number", + "title": "Phone numbers" + }, + "profileSection": { + "primaryButton": "Update profile", + "title": "Profile" + }, + "usernameSection": { + "primaryButton__setUsername": "Set username", + "primaryButton__updateUsername": "Update username", + "title": "Username" + }, + "web3WalletsSection": { + "destructiveAction": "Remove wallet", + "primaryButton": "Web3 wallets", + "title": "Web3 wallets" + } + }, + "usernamePage": { + "successMessage": "Your username has been updated.", + "title__set": "Set username", + "title__update": "Update username" + }, + "web3WalletPage": { + "removeResource": { + "messageLine1": "{{identifier}} will be removed from this account.", + "messageLine2": "You will no longer be able to sign in using this web3 wallet.", + "successMessage": "{{web3Wallet}} has been removed from your account.", + "title": "Remove web3 wallet" + }, + "subtitle__availableWallets": "Select a web3 wallet to connect to your account.", + "subtitle__unavailableWallets": "There are no available web3 wallets.", + "successMessage": "The wallet has been added to your account.", + "title": "Add web3 wallet" + } + } +} diff --git a/locales/en-US/common.json b/locales/en-US/common.json index 440c96fc1934e..6efaacc4f167d 100644 --- a/locales/en-US/common.json +++ b/locales/en-US/common.json @@ -160,6 +160,7 @@ "newVersion": "New version available: {{version}}" }, "userPanel": { + "anonymousNickName": "Anonymous User", "billing": "Billing Management", "defaultNickname": "Community User", "discord": "Community Support", diff --git a/locales/en-US/error.json b/locales/en-US/error.json index b3b7fccf636dd..f98a5e13db431 100644 --- a/locales/en-US/error.json +++ b/locales/en-US/error.json @@ -1,4 +1,11 @@ { + "clerkAuth": { + "loginSuccess": { + "action": "Continue Session", + "desc": "{{greeting}}, it's great to continue serving you. Let's pick up where we left off.", + "title": "Welcome back, {{nickName}}" + } + }, "error": { "backHome": "Back to Home", "desc": "Give it a try later, or go back to the known world.", @@ -54,6 +61,7 @@ "InvalidAnthropicAPIKey": "The Anthropic API Key is incorrect or empty. Please check the Anthropic API Key and retry.", "InvalidAzureAPIKey": "Azure API Key is incorrect or empty. Please check the Azure API Key and retry.", "InvalidBedrockCredentials": "Bedrock authentication failed. Please check the AccessKeyId/SecretAccessKey and retry.", + "InvalidClerkUser": "Sorry, you are not currently logged in. Please log in or register an account to continue.", "InvalidGoogleAPIKey": "Google API Key is incorrect or empty. Please check the Google API Key and retry.", "InvalidGroqAPIKey": "Groq API Key is incorrect or empty. Please check the Groq API Key and retry.", "InvalidMinimaxAPIKey": "Incorrect or empty Minimax API Key, please check the Minimax API Key and try again", diff --git a/locales/es-ES/auth.json b/locales/es-ES/auth.json new file mode 100644 index 0000000000000..7921d9c3b6004 --- /dev/null +++ b/locales/es-ES/auth.json @@ -0,0 +1,6 @@ +{ + "login": "Iniciar sesión", + "loginOrSignup": "Iniciar sesión / Registrarse", + "signout": "Cerrar sesión", + "signup": "Registrarse" +} diff --git a/locales/es-ES/clerk.json b/locales/es-ES/clerk.json new file mode 100644 index 0000000000000..109560b966191 --- /dev/null +++ b/locales/es-ES/clerk.json @@ -0,0 +1,769 @@ +{ + "backButton": "Atrás", + "badge__default": "Predeterminado", + "badge__otherImpersonatorDevice": "Otro dispositivo de suplantación", + "badge__primary": "Principal", + "badge__requiresAction": "Requiere acción", + "badge__thisDevice": "Este dispositivo", + "badge__unverified": "No verificado", + "badge__userDevice": "Dispositivo del usuario", + "badge__you": "Tú", + "createOrganization": { + "formButtonSubmit": "Crear organización", + "invitePage": { + "formButtonReset": "Omitir" + }, + "title": "Crear organización" + }, + "dates": { + "lastDay": "Ayer a las {{ date | timeString('es-ES') }}", + "next6Days": "{{ date | weekday('es-ES','long') }} a las {{ date | timeString('es-ES') }}", + "nextDay": "Mañana a las {{ date | timeString('es-ES') }}", + "numeric": "{{ date | numeric('es-ES') }}", + "previous6Days": "Último {{ date | weekday('es-ES','long') }} a las {{ date | timeString('es-ES') }}", + "sameDay": "Hoy a las {{ date | timeString('es-ES') }}" + }, + "dividerText": "o", + "footerActionLink__useAnotherMethod": "Usar otro método", + "footerPageLink__help": "Ayuda", + "footerPageLink__privacy": "Privacidad", + "footerPageLink__terms": "Términos", + "formButtonPrimary": "Continuar", + "formButtonPrimary__verify": "Verificar", + "formFieldAction__forgotPassword": "¿Olvidaste tu contraseña?", + "formFieldError__matchingPasswords": "Las contraseñas coinciden.", + "formFieldError__notMatchingPasswords": "Las contraseñas no coinciden.", + "formFieldError__verificationLinkExpired": "El enlace de verificación ha caducado. Por favor, solicita uno nuevo.", + "formFieldHintText__optional": "Opcional", + "formFieldHintText__slug": "Un slug es un identificador legible por humanos que debe ser único. A menudo se utiliza en las URL.", + "formFieldInputPlaceholder__backupCode": "", + "formFieldInputPlaceholder__confirmDeletionUserAccount": "Eliminar cuenta", + "formFieldInputPlaceholder__emailAddress": "", + "formFieldInputPlaceholder__emailAddress_username": "", + "formFieldInputPlaceholder__emailAddresses": "ejemplo@email.com, ejemplo2@email.com", + "formFieldInputPlaceholder__firstName": "", + "formFieldInputPlaceholder__lastName": "", + "formFieldInputPlaceholder__organizationDomain": "", + "formFieldInputPlaceholder__organizationDomainEmailAddress": "", + "formFieldInputPlaceholder__organizationName": "", + "formFieldInputPlaceholder__organizationSlug": "mi-org", + "formFieldInputPlaceholder__password": "", + "formFieldInputPlaceholder__phoneNumber": "", + "formFieldInputPlaceholder__username": "", + "formFieldLabel__automaticInvitations": "Habilitar invitaciones automáticas para este dominio", + "formFieldLabel__backupCode": "Código de respaldo", + "formFieldLabel__confirmDeletion": "Confirmación", + "formFieldLabel__confirmPassword": "Confirmar contraseña", + "formFieldLabel__currentPassword": "Contraseña actual", + "formFieldLabel__emailAddress": "Dirección de correo electrónico", + "formFieldLabel__emailAddress_username": "Dirección de correo electrónico o nombre de usuario", + "formFieldLabel__emailAddresses": "Direcciones de correo electrónico", + "formFieldLabel__firstName": "Nombre", + "formFieldLabel__lastName": "Apellido", + "formFieldLabel__newPassword": "Nueva contraseña", + "formFieldLabel__organizationDomain": "Dominio", + "formFieldLabel__organizationDomainDeletePending": "Eliminar invitaciones y sugerencias pendientes", + "formFieldLabel__organizationDomainEmailAddress": "Dirección de correo electrónico de verificación", + "formFieldLabel__organizationDomainEmailAddressDescription": "Ingresa una dirección de correo electrónico bajo este dominio para recibir un código y verificar este dominio.", + "formFieldLabel__organizationName": "Nombre", + "formFieldLabel__organizationSlug": "Slug", + "formFieldLabel__passkeyName": "Nombre de la clave de paso", + "formFieldLabel__password": "Contraseña", + "formFieldLabel__phoneNumber": "Número de teléfono", + "formFieldLabel__role": "Rol", + "formFieldLabel__signOutOfOtherSessions": "Cerrar sesión en todos los demás dispositivos", + "formFieldLabel__username": "Nombre de usuario", + "impersonationFab": { + "action__signOut": "Cerrar sesión", + "title": "Sesión iniciada como {{identifier}}" + }, + "locale": "es-ES", + "maintenanceMode": "Actualmente estamos en mantenimiento, pero no te preocupes, no debería llevar más de unos minutos.", + "membershipRole__admin": "Admin", + "membershipRole__basicMember": "Miembro", + "membershipRole__guestMember": "Invitado", + "organizationList": { + "action__createOrganization": "Crear organización", + "action__invitationAccept": "Unirse", + "action__suggestionsAccept": "Solicitar unirse", + "createOrganization": "Crear organización", + "invitationAcceptedLabel": "Unido", + "subtitle": "para continuar con {{applicationName}}", + "suggestionsAcceptedLabel": "Aprobación pendiente", + "title": "Elige una cuenta", + "titleWithoutPersonal": "Elige una organización" + }, + "organizationProfile": { + "badge__automaticInvitation": "Invitaciones automáticas", + "badge__automaticSuggestion": "Sugerencias automáticas", + "badge__manualInvitation": "Sin inscripción automática", + "badge__unverified": "No verificado", + "createDomainPage": { + "subtitle": "Añade el dominio para verificar. Los usuarios con direcciones de correo electrónico en este dominio pueden unirse automáticamente a la organización o solicitar unirse.", + "title": "Añadir dominio" + }, + "invitePage": { + "detailsTitle__inviteFailed": "No se pudieron enviar las invitaciones. Ya hay invitaciones pendientes para las siguientes direcciones de correo electrónico: {{email_addresses}}.", + "formButtonPrimary__continue": "Enviar invitaciones", + "selectDropdown__role": "Seleccionar rol", + "subtitle": "Introduce o pega una o más direcciones de correo electrónico, separadas por espacios o comas.", + "successMessage": "Invitaciones enviadas con éxito", + "title": "Invitar nuevos miembros" + }, + "membersPage": { + "action__invite": "Invitar", + "activeMembersTab": { + "menuAction__remove": "Eliminar miembro", + "tableHeader__actions": "", + "tableHeader__joined": "Unido", + "tableHeader__role": "Rol", + "tableHeader__user": "Usuario" + }, + "detailsTitle__emptyRow": "No hay miembros para mostrar", + "invitationsTab": { + "autoInvitations": { + "headerSubtitle": "Invita a usuarios conectando un dominio de correo electrónico con tu organización. Cualquiera que se registre con un dominio de correo electrónico coincidente podrá unirse a la organización en cualquier momento.", + "headerTitle": "Invitaciones automáticas", + "primaryButton": "Gestionar dominios verificados" + }, + "table__emptyRow": "No hay invitaciones para mostrar" + }, + "invitedMembersTab": { + "menuAction__revoke": "Revocar invitación", + "tableHeader__invited": "Invitado" + }, + "requestsTab": { + "autoSuggestions": { + "headerSubtitle": "Los usuarios que se registren con un dominio de correo electrónico coincidente podrán ver una sugerencia para solicitar unirse a tu organización.", + "headerTitle": "Sugerencias automáticas", + "primaryButton": "Gestionar dominios verificados" + }, + "menuAction__approve": "Aprobar", + "menuAction__reject": "Rechazar", + "tableHeader__requested": "Solicitud de acceso", + "table__emptyRow": "No hay solicitudes para mostrar" + }, + "start": { + "headerTitle__invitations": "Invitaciones", + "headerTitle__members": "Miembros", + "headerTitle__requests": "Solicitudes" + } + }, + "navbar": { + "description": "Administra tu organización.", + "general": "General", + "members": "Miembros", + "title": "Organización" + }, + "profilePage": { + "dangerSection": { + "deleteOrganization": { + "actionDescription": "Escribe \"{{organizationName}}\" a continuación para continuar.", + "messageLine1": "¿Estás seguro de que quieres eliminar esta organización?", + "messageLine2": "Esta acción es permanente e irreversible.", + "successMessage": "Has eliminado la organización.", + "title": "Eliminar organización" + }, + "leaveOrganization": { + "actionDescription": "Escribe \"{{organizationName}}\" a continuación para continuar.", + "messageLine1": "¿Estás seguro de que quieres abandonar esta organización? Perderás acceso a esta organización y sus aplicaciones.", + "messageLine2": "Esta acción es permanente e irreversible.", + "successMessage": "Has abandonado la organización.", + "title": "Abandonar organización" + }, + "title": "Peligro" + }, + "domainSection": { + "menuAction__manage": "Gestionar", + "menuAction__remove": "Eliminar", + "menuAction__verify": "Verificar", + "primaryButton": "Añadir dominio", + "subtitle": "Permite a los usuarios unirse a la organización automáticamente o solicitar unirse en función de un dominio de correo electrónico verificado.", + "title": "Dominios verificados" + }, + "successMessage": "La organización ha sido actualizada.", + "title": "Actualizar perfil" + }, + "removeDomainPage": { + "messageLine1": "El dominio de correo electrónico {{domain}} se eliminará.", + "messageLine2": "Los usuarios no podrán unirse a la organización automáticamente después de esto.", + "successMessage": "{{domain}} ha sido eliminado.", + "title": "Eliminar dominio" + }, + "start": { + "headerTitle__general": "General", + "headerTitle__members": "Miembros", + "profileSection": { + "primaryButton": "Actualizar perfil", + "title": "Perfil de la organización", + "uploadAction__title": "Logo" + } + }, + "verifiedDomainPage": { + "dangerTab": { + "calloutInfoLabel": "Eliminar este dominio afectará a los usuarios invitados.", + "removeDomainActionLabel__remove": "Eliminar dominio", + "removeDomainSubtitle": "Elimina este dominio de tus dominios verificados", + "removeDomainTitle": "Eliminar dominio" + }, + "enrollmentTab": { + "automaticInvitationOption__description": "Los usuarios son invitados automáticamente a unirse a la organización cuando se registran y pueden unirse en cualquier momento.", + "automaticInvitationOption__label": "Invitaciones automáticas", + "automaticSuggestionOption__description": "Los usuarios reciben una sugerencia para solicitar unirse, pero deben ser aprobados por un administrador antes de poder unirse a la organización.", + "automaticSuggestionOption__label": "Sugerencias automáticas", + "calloutInfoLabel": "Cambiar el modo de inscripción solo afectará a los nuevos usuarios.", + "calloutInvitationCountLabel": "Invitaciones pendientes enviadas a usuarios: {{count}}", + "calloutSuggestionCountLabel": "Sugerencias pendientes enviadas a usuarios: {{count}}", + "manualInvitationOption__description": "Los usuarios solo pueden ser invitados manualmente a la organización.", + "manualInvitationOption__label": "Sin inscripción automática", + "subtitle": "Elige cómo los usuarios de este dominio pueden unirse a la organización." + }, + "start": { + "headerTitle__danger": "Peligro", + "headerTitle__enrollment": "Opciones de inscripción" + }, + "subtitle": "El dominio {{domain}} está ahora verificado. Continúa seleccionando el modo de inscripción.", + "title": "Actualizar {{domain}}" + }, + "verifyDomainPage": { + "formSubtitle": "Introduce el código de verificación enviado a tu dirección de correo electrónico", + "formTitle": "Código de verificación", + "resendButton": "¿No has recibido un código? Reenviar", + "subtitle": "El dominio {{domainName}} necesita ser verificado por correo electrónico.", + "subtitleVerificationCodeScreen": "Se ha enviado un código de verificación a {{emailAddress}}. Introduce el código para continuar.", + "title": "Verificar dominio" + } + }, + "organizationSwitcher": { + "action__createOrganization": "Crear organización", + "action__invitationAccept": "Unirse", + "action__manageOrganization": "Gestionar", + "action__suggestionsAccept": "Solicitar unirse", + "notSelected": "Ninguna organización seleccionada", + "personalWorkspace": "Cuenta personal", + "suggestionsAcceptedLabel": "Aprobación pendiente" + }, + "paginationButton__next": "Siguiente", + "paginationButton__previous": "Anterior", + "paginationRowText__displaying": "Mostrando", + "paginationRowText__of": "de", + "signIn": { + "accountSwitcher": { + "action__addAccount": "Añadir cuenta", + "action__signOutAll": "Cerrar sesión en todas las cuentas", + "subtitle": "Selecciona la cuenta con la que deseas continuar.", + "title": "Elige una cuenta" + }, + "alternativeMethods": { + "actionLink": "Obtener ayuda", + "actionText": "¿No tienes ninguna de estas?", + "blockButton__backupCode": "Usar un código de respaldo", + "blockButton__emailCode": "Enviar código por correo a {{identifier}}", + "blockButton__emailLink": "Enviar enlace por correo a {{identifier}}", + "blockButton__passkey": "Iniciar sesión con tu clave de acceso", + "blockButton__password": "Iniciar sesión con tu contraseña", + "blockButton__phoneCode": "Enviar código SMS a {{identifier}}", + "blockButton__totp": "Usar tu aplicación de autenticación", + "getHelp": { + "blockButton__emailSupport": "Soporte por correo", + "content": "Si tienes problemas para iniciar sesión en tu cuenta, envíanos un correo y trabajaremos contigo para restaurar el acceso lo antes posible.", + "title": "Obtener ayuda" + }, + "subtitle": "¿Problemas? Puedes utilizar cualquiera de estos métodos para iniciar sesión.", + "title": "Usar otro método" + }, + "backupCodeMfa": { + "subtitle": "Tu código de respaldo es aquel que obtuviste al configurar la autenticación de dos pasos.", + "title": "Introduce un código de respaldo" + }, + "emailCode": { + "formTitle": "Código de verificación", + "resendButton": "¿No recibiste un código? Reenviar", + "subtitle": "para continuar en {{applicationName}}", + "title": "Revisa tu correo electrónico" + }, + "emailLink": { + "expired": { + "subtitle": "Vuelve a la pestaña original para continuar.", + "title": "Este enlace de verificación ha caducado" + }, + "failed": { + "subtitle": "Vuelve a la pestaña original para continuar.", + "title": "Este enlace de verificación no es válido" + }, + "formSubtitle": "Utiliza el enlace de verificación enviado a tu correo electrónico", + "formTitle": "Enlace de verificación", + "loading": { + "subtitle": "Serás redirigido pronto", + "title": "Iniciando sesión..." + }, + "resendButton": "¿No recibiste un enlace? Reenviar", + "subtitle": "para continuar en {{applicationName}}", + "title": "Revisa tu correo electrónico", + "unusedTab": { + "title": "Puedes cerrar esta pestaña" + }, + "verified": { + "subtitle": "Serás redirigido pronto", + "title": "Inicio de sesión correcto" + }, + "verifiedSwitchTab": { + "subtitle": "Vuelve a la pestaña original para continuar", + "subtitleNewTab": "Vuelve a la pestaña recién abierta para continuar", + "titleNewTab": "Iniciaste sesión en otra pestaña" + } + }, + "forgotPassword": { + "formTitle": "Código de restablecimiento de contraseña", + "resendButton": "¿No recibiste un código? Reenviar", + "subtitle": "para restablecer tu contraseña", + "subtitle_email": "Primero, ingresa el código enviado a tu dirección de correo electrónico", + "subtitle_phone": "Primero, ingresa el código enviado a tu teléfono", + "title": "Restablecer contraseña" + }, + "forgotPasswordAlternativeMethods": { + "blockButton__resetPassword": "Restablecer tu contraseña", + "label__alternativeMethods": "O inicia sesión con otro método", + "title": "¿Olvidaste tu contraseña?" + }, + "noAvailableMethods": { + "message": "No se puede continuar con la sesión. No hay factor de autenticación disponible.", + "subtitle": "Se produjo un error", + "title": "No se puede iniciar sesión" + }, + "passkey": { + "subtitle": "Usar tu clave de acceso confirma que eres tú. Tu dispositivo puede solicitar tu huella dactilar, rostro o bloqueo de pantalla.", + "title": "Usar tu clave de acceso" + }, + "password": { + "actionLink": "Usar otro método", + "subtitle": "Ingresa la contraseña asociada a tu cuenta", + "title": "Ingresa tu contraseña" + }, + "passwordPwned": { + "title": "Contraseña comprometida" + }, + "phoneCode": { + "formTitle": "Código de verificación", + "resendButton": "¿No recibiste un código? Reenviar", + "subtitle": "para continuar en {{applicationName}}", + "title": "Revisa tu teléfono" + }, + "phoneCodeMfa": { + "formTitle": "Código de verificación", + "resendButton": "¿No recibiste un código? Reenviar", + "subtitle": "Para continuar, por favor ingresa el código de verificación enviado a tu teléfono", + "title": "Revisa tu teléfono" + }, + "resetPassword": { + "formButtonPrimary": "Restablecer contraseña", + "requiredMessage": "Por razones de seguridad, es necesario restablecer tu contraseña.", + "successMessage": "Tu contraseña se cambió correctamente. Iniciando sesión, por favor espera un momento.", + "title": "Establecer nueva contraseña" + }, + "resetPasswordMfa": { + "detailsLabel": "Necesitamos verificar tu identidad antes de restablecer tu contraseña." + }, + "start": { + "actionLink": "Registrarse", + "actionLink__use_email": "Usar correo electrónico", + "actionLink__use_email_username": "Usar correo electrónico o nombre de usuario", + "actionLink__use_passkey": "Usar clave de acceso en su lugar", + "actionLink__use_phone": "Usar teléfono", + "actionLink__use_username": "Usar nombre de usuario", + "actionText": "¿No tienes una cuenta?", + "subtitle": "¡Bienvenido de nuevo! Por favor inicia sesión para continuar", + "title": "Inicia sesión en {{applicationName}}" + }, + "totpMfa": { + "formTitle": "Código de verificación", + "subtitle": "Para continuar, por favor introduce el código de verificación generado por tu aplicación de autenticación", + "title": "Verificación de dos pasos" + } + }, + "signInEnterPasswordTitle": "Ingresa tu contraseña", + "signUp": { + "continue": { + "actionLink": "Iniciar sesión", + "actionText": "¿Ya tienes una cuenta?", + "subtitle": "Por favor completa los detalles restantes para continuar", + "title": "Completa los campos faltantes" + }, + "emailCode": { + "formSubtitle": "Ingresa el código de verificación enviado a tu dirección de correo electrónico", + "formTitle": "Código de verificación", + "resendButton": "¿No recibiste un código? Reenviar", + "subtitle": "Ingresa el código de verificación enviado a tu correo electrónico", + "title": "Verifica tu correo electrónico" + }, + "emailLink": { + "formSubtitle": "Utiliza el enlace de verificación enviado a tu dirección de correo electrónico", + "formTitle": "Enlace de verificación", + "loading": { + "title": "Registrándote..." + }, + "resendButton": "¿No recibiste un enlace? Reenviar", + "subtitle": "para continuar en {{applicationName}}", + "title": "Verifica tu correo electrónico", + "verified": { + "title": "Registro exitoso" + }, + "verifiedSwitchTab": { + "subtitle": "Vuelve a la pestaña recién abierta para continuar", + "subtitleNewTab": "Vuelve a la pestaña anterior para continuar", + "title": "Correo electrónico verificado con éxito" + } + }, + "phoneCode": { + "formSubtitle": "Ingresa el código de verificación enviado a tu número de teléfono", + "formTitle": "Código de verificación", + "resendButton": "¿No recibiste un código? Reenviar", + "subtitle": "Ingresa el código de verificación enviado a tu teléfono", + "title": "Verifica tu teléfono" + }, + "start": { + "actionLink": "Iniciar sesión", + "actionText": "¿Ya tienes una cuenta?", + "subtitle": "¡Bienvenido! Por favor completa los detalles para empezar", + "title": "Crea tu cuenta" + } + }, + "socialButtonsBlockButton": "Continuar con {{provider|titleize}}", + "unstable__errors": { + "captcha_invalid": "Registro no exitoso debido a validaciones de seguridad fallidas. Por favor, actualiza la página e inténtalo de nuevo o contacta al soporte para más ayuda.", + "captcha_unavailable": "Registro no exitoso debido a validación de bot fallida. Por favor, actualiza la página e inténtalo de nuevo o contacta al soporte para más ayuda.", + "form_code_incorrect": "", + "form_identifier_exists": "", + "form_identifier_exists__email_address": "Esta dirección de correo electrónico ya está en uso. Por favor, prueba con otra.", + "form_identifier_exists__phone_number": "Este número de teléfono ya está en uso. Por favor, prueba con otro.", + "form_identifier_exists__username": "Este nombre de usuario ya está en uso. Por favor, prueba con otro.", + "form_identifier_not_found": "", + "form_param_format_invalid": "", + "form_param_format_invalid__email_address": "La dirección de correo electrónico debe ser válida.", + "form_param_format_invalid__phone_number": "El número de teléfono debe tener un formato internacional válido.", + "form_param_max_length_exceeded__first_name": "El nombre no debe exceder los 256 caracteres.", + "form_param_max_length_exceeded__last_name": "El apellido no debe exceder los 256 caracteres.", + "form_param_max_length_exceeded__name": "El nombre no debe exceder los 256 caracteres.", + "form_param_nil": "", + "form_password_incorrect": "", + "form_password_length_too_short": "", + "form_password_not_strong_enough": "Tu contraseña no es lo suficientemente segura.", + "form_password_pwned": "Esta contraseña ha sido encontrada en una filtración y no puede ser utilizada, por favor prueba con otra contraseña.", + "form_password_pwned__sign_in": "Esta contraseña ha sido encontrada en una filtración y no puede ser utilizada, por favor restablece tu contraseña.", + "form_password_size_in_bytes_exceeded": "Tu contraseña ha excedido el número máximo de bytes permitido, por favor acórtala o elimina algunos caracteres especiales.", + "form_password_validation_failed": "Contraseña incorrecta", + "form_username_invalid_character": "", + "form_username_invalid_length": "", + "identification_deletion_failed": "No puedes eliminar tu última identificación.", + "not_allowed_access": "", + "passkey_already_exists": "Ya hay una clave de acceso registrada en este dispositivo.", + "passkey_not_supported": "Las claves de acceso no son compatibles con este dispositivo.", + "passkey_pa_not_supported": "El registro requiere un autenticador de plataforma pero el dispositivo no lo soporta.", + "passkey_registration_cancelled": "El registro de clave de acceso fue cancelado o expiró.", + "passkey_retrieval_cancelled": "La verificación de clave de acceso fue cancelada o expiró.", + "passwordComplexity": { + "maximumLength": "menos de {{length}} caracteres", + "minimumLength": "{{length}} o más caracteres", + "requireLowercase": "una letra minúscula", + "requireNumbers": "un número", + "requireSpecialCharacter": "un carácter especial", + "requireUppercase": "una letra mayúscula", + "sentencePrefix": "Tu contraseña debe contener" + }, + "phone_number_exists": "Este número de teléfono ya está en uso. Por favor, prueba con otro.", + "zxcvbn": { + "couldBeStronger": "Tu contraseña funciona, pero podría ser más segura. Intenta agregar más caracteres.", + "goodPassword": "Tu contraseña cumple con todos los requisitos necesarios.", + "notEnough": "Tu contraseña no es lo suficientemente segura.", + "suggestions": { + "allUppercase": "Pon en mayúscula algunas letras, pero no todas.", + "anotherWord": "Añade más palabras menos comunes.", + "associatedYears": "Evita años asociados contigo.", + "capitalization": "Pon en mayúscula más de la primera letra.", + "dates": "Evita fechas y años asociados contigo.", + "l33t": "Evita sustituciones predecibles como '@' por 'a'.", + "longerKeyboardPattern": "Usa patrones de teclado más largos y cambia la dirección de escritura varias veces.", + "noNeed": "Puedes crear contraseñas seguras sin usar símbolos, números o letras mayúsculas.", + "pwned": "Si usas esta contraseña en otro lugar, deberías cambiarla.", + "recentYears": "Evita años recientes.", + "repeated": "Evita palabras y caracteres repetidos.", + "reverseWords": "Evita deletrear al revés palabras comunes.", + "sequences": "Evita secuencias de caracteres comunes.", + "useWords": "Usa varias palabras, pero evita frases comunes." + }, + "warnings": { + "common": "Esta es una contraseña comúnmente utilizada.", + "commonNames": "Nombres y apellidos comunes son fáciles de adivinar.", + "dates": "Las fechas son fáciles de adivinar.", + "extendedRepeat": "Patrones de caracteres repetidos como \"abcabcabc\" son fáciles de adivinar.", + "keyPattern": "Patrones de teclado cortos son fáciles de adivinar.", + "namesByThemselves": "Nombres o apellidos solos son fáciles de adivinar.", + "pwned": "Tu contraseña fue expuesta en una filtración de datos en Internet.", + "recentYears": "Años recientes son fáciles de adivinar.", + "sequences": "Secuencias de caracteres comunes como \"abc\" son fáciles de adivinar.", + "similarToCommon": "Esto es similar a una contraseña comúnmente utilizada.", + "simpleRepeat": "Caracteres repetidos como \"aaa\" son fáciles de adivinar.", + "straightRow": "Filas rectas de teclas en tu teclado son fáciles de adivinar.", + "topHundred": "Esta es una contraseña frecuentemente utilizada.", + "topTen": "Esta es una contraseña muy utilizada.", + "userInputs": "No debería haber datos personales o relacionados con la página.", + "wordByItself": "Palabras solas son fáciles de adivinar." + } + } + }, + "userButton": { + "action__addAccount": "Añadir cuenta", + "action__manageAccount": "Gestionar cuenta", + "action__signOut": "Cerrar sesión", + "action__signOutAll": "Cerrar sesión en todas las cuentas" + }, + "userProfile": { + "backupCodePage": { + "actionLabel__copied": "¡Copiado!", + "actionLabel__copy": "Copiar todo", + "actionLabel__download": "Descargar .txt", + "actionLabel__print": "Imprimir", + "infoText1": "Los códigos de respaldo se activarán para esta cuenta.", + "infoText2": "Mantén los códigos de respaldo en secreto y guárdalos de forma segura. Puedes regenerar los códigos de respaldo si sospechas que han sido comprometidos.", + "subtitle__codelist": "Guárdalos de forma segura y mantenlos en secreto.", + "successMessage": "Los códigos de respaldo están ahora activados. Puedes usar uno de estos para iniciar sesión en tu cuenta si pierdes acceso a tu dispositivo de autenticación. Cada código solo se puede usar una vez.", + "successSubtitle": "Puedes usar uno de estos para iniciar sesión en tu cuenta si pierdes acceso a tu dispositivo de autenticación.", + "title": "Agregar verificación de código de respaldo", + "title__codelist": "Códigos de respaldo" + }, + "connectedAccountPage": { + "formHint": "Selecciona un proveedor para conectar tu cuenta.", + "formHint__noAccounts": "No hay proveedores de cuentas externas disponibles.", + "removeResource": { + "messageLine1": "{{identifier}} será eliminado de esta cuenta.", + "messageLine2": "Ya no podrás usar esta cuenta conectada y cualquier función dependiente dejará de funcionar.", + "successMessage": "{{connectedAccount}} ha sido eliminado de tu cuenta.", + "title": "Eliminar cuenta conectada" + }, + "socialButtonsBlockButton": "{{provider|titleize}}", + "successMessage": "El proveedor ha sido añadido a tu cuenta", + "title": "Agregar cuenta conectada" + }, + "deletePage": { + "actionDescription": "Escribe \"Eliminar cuenta\" abajo para continuar.", + "confirm": "Eliminar cuenta", + "messageLine1": "¿Estás seguro de que deseas eliminar tu cuenta?", + "messageLine2": "Esta acción es permanente e irreversible.", + "title": "Eliminar cuenta" + }, + "emailAddressPage": { + "emailCode": { + "formHint": "Se enviará un correo electrónico con un código de verificación a esta dirección de correo electrónico.", + "formSubtitle": "Ingresa el código de verificación enviado a {{identifier}}", + "formTitle": "Código de verificación", + "resendButton": "¿No recibiste un código? Reenviar", + "successMessage": "El correo electrónico {{identifier}} ha sido añadido a tu cuenta." + }, + "emailLink": { + "formHint": "Se enviará un correo electrónico con un enlace de verificación a esta dirección de correo electrónico.", + "formSubtitle": "Haz clic en el enlace de verificación en el correo electrónico enviado a {{identifier}}", + "formTitle": "Enlace de verificación", + "resendButton": "¿No recibiste un enlace? Reenviar", + "successMessage": "El correo electrónico {{identifier}} ha sido añadido a tu cuenta." + }, + "removeResource": { + "messageLine1": "{{identifier}} será eliminado de esta cuenta.", + "messageLine2": "Ya no podrás iniciar sesión usando esta dirección de correo electrónico.", + "successMessage": "{{emailAddress}} ha sido eliminado de tu cuenta.", + "title": "Eliminar dirección de correo electrónico" + }, + "title": "Agregar dirección de correo electrónico", + "verifyTitle": "Verificar dirección de correo electrónico" + }, + "formButtonPrimary__add": "Añadir", + "formButtonPrimary__continue": "Continuar", + "formButtonPrimary__finish": "Finalizar", + "formButtonPrimary__remove": "Eliminar", + "formButtonPrimary__save": "Guardar", + "formButtonReset": "Cancelar", + "mfaPage": { + "formHint": "Selecciona un método para añadir.", + "title": "Agregar verificación en dos pasos" + }, + "mfaPhoneCodePage": { + "backButton": "Usar número existente", + "primaryButton__addPhoneNumber": "Añadir número de teléfono", + "removeResource": { + "messageLine1": "{{identifier}} ya no recibirá códigos de verificación al iniciar sesión.", + "messageLine2": "Tu cuenta puede no ser tan segura. ¿Estás seguro de que quieres continuar?", + "successMessage": "La verificación en dos pasos con código SMS ha sido eliminada para {{mfaPhoneCode}}", + "title": "Eliminar verificación en dos pasos" + }, + "subtitle__availablePhoneNumbers": "Selecciona un número de teléfono existente para registrarte en la verificación en dos pasos con código SMS o añade uno nuevo.", + "subtitle__unavailablePhoneNumbers": "No hay números de teléfono disponibles para registrarte en la verificación en dos pasos con código SMS, por favor añade uno nuevo.", + "successMessage1": "Al iniciar sesión, deberás ingresar un código de verificación enviado a este número de teléfono como paso adicional.", + "successMessage2": "Guarda estos códigos de respaldo y guárdalos en un lugar seguro. Si pierdes acceso a tu dispositivo de autenticación, puedes usar los códigos de respaldo para iniciar sesión.", + "successTitle": "Verificación con código SMS habilitada", + "title": "Agregar verificación con código SMS" + }, + "mfaTOTPPage": { + "authenticatorApp": { + "buttonAbleToScan__nonPrimary": "Escanear código QR en su lugar", + "buttonUnableToScan__nonPrimary": "¿No puedes escanear el código QR?", + "infoText__ableToScan": "Configura un nuevo método de inicio de sesión en tu aplicación de autenticación y escanea el siguiente código QR para vincularlo a tu cuenta.", + "infoText__unableToScan": "Configura un nuevo método de inicio de sesión en tu autenticador e ingresa la clave proporcionada a continuación.", + "inputLabel__unableToScan1": "Asegúrate de que las contraseñas basadas en el tiempo o de un solo uso estén habilitadas, luego finaliza la vinculación de tu cuenta.", + "inputLabel__unableToScan2": "Alternativamente, si tu autenticador admite URIs TOTP, también puedes copiar el URI completo." + }, + "removeResource": { + "messageLine1": "Los códigos de verificación de este autenticador ya no serán necesarios al iniciar sesión.", + "messageLine2": "Tu cuenta puede no ser tan segura. ¿Estás seguro de que quieres continuar?", + "successMessage": "La verificación en dos pasos a través de la aplicación de autenticación ha sido eliminada.", + "title": "Eliminar verificación en dos pasos" + }, + "successMessage": "La verificación en dos pasos está ahora habilitada. Al iniciar sesión, deberás ingresar un código de verificación de este autenticador como paso adicional.", + "title": "Agregar aplicación de autenticación", + "verifySubtitle": "Ingresa el código de verificación generado por tu autenticador", + "verifyTitle": "Código de verificación" + }, + "mobileButton__menu": "Menú", + "navbar": { + "account": "Perfil", + "description": "Administra la información de tu cuenta.", + "security": "Seguridad", + "title": "Cuenta" + }, + "passkeyScreen": { + "removeResource": { + "messageLine1": "{{name}} será eliminado de esta cuenta.", + "title": "Eliminar passkey" + }, + "subtitle__rename": "Puedes cambiar el nombre del passkey para que sea más fácil de encontrar.", + "title__rename": "Renombrar Passkey" + }, + "passwordPage": { + "checkboxInfoText__signOutOfOtherSessions": "Se recomienda cerrar sesión en todos los demás dispositivos que puedan haber utilizado tu contraseña anterior.", + "readonly": "Actualmente no puedes editar tu contraseña porque solo puedes iniciar sesión a través de la conexión empresarial.", + "successMessage__set": "Tu contraseña ha sido establecida.", + "successMessage__signOutOfOtherSessions": "Todos los demás dispositivos han cerrado sesión.", + "successMessage__update": "Tu contraseña ha sido actualizada.", + "title__set": "Establecer contraseña", + "title__update": "Actualizar contraseña" + }, + "phoneNumberPage": { + "infoText": "Se enviará un mensaje de texto con un código de verificación a este número de teléfono. Pueden aplicarse tarifas por mensajes y datos.", + "removeResource": { + "messageLine1": "{{identifier}} será eliminado de esta cuenta.", + "messageLine2": "Ya no podrás iniciar sesión usando este número de teléfono.", + "successMessage": "{{phoneNumber}} ha sido eliminado de tu cuenta.", + "title": "Eliminar número de teléfono" + }, + "successMessage": "{{identifier}} se ha añadido a tu cuenta.", + "title": "Añadir número de teléfono", + "verifySubtitle": "Ingresa el código de verificación enviado a {{identifier}}", + "verifyTitle": "Verificar número de teléfono" + }, + "profilePage": { + "fileDropAreaHint": "Tamaño recomendado 1:1, hasta 10MB.", + "imageFormDestructiveActionSubtitle": "Eliminar", + "imageFormSubtitle": "Subir", + "imageFormTitle": "Imagen de perfil", + "readonly": "Tu información de perfil ha sido proporcionada por la conexión empresarial y no se puede editar.", + "successMessage": "Tu perfil ha sido actualizado.", + "title": "Actualizar perfil" + }, + "start": { + "activeDevicesSection": { + "destructiveAction": "Cerrar sesión en el dispositivo", + "title": "Dispositivos activos" + }, + "connectedAccountsSection": { + "actionLabel__connectionFailed": "Intentar de nuevo", + "actionLabel__reauthorize": "Autorizar ahora", + "destructiveActionTitle": "Eliminar", + "primaryButton": "Conectar cuenta", + "subtitle__reauthorize": "Los permisos requeridos han sido actualizados, y es posible que experimentes funcionalidad limitada. Por favor, vuelve a autorizar esta aplicación para evitar problemas", + "title": "Cuentas conectadas" + }, + "dangerSection": { + "deleteAccountButton": "Eliminar cuenta", + "title": "Eliminar cuenta" + }, + "emailAddressesSection": { + "destructiveAction": "Eliminar correo electrónico", + "detailsAction__nonPrimary": "Establecer como principal", + "detailsAction__primary": "Completar verificación", + "detailsAction__unverified": "Verificar", + "primaryButton": "Agregar dirección de correo electrónico", + "title": "Direcciones de correo electrónico" + }, + "enterpriseAccountsSection": { + "title": "Cuentas empresariales" + }, + "headerTitle__account": "Detalles del perfil", + "headerTitle__security": "Seguridad", + "mfaSection": { + "backupCodes": { + "actionLabel__regenerate": "Regenerar", + "headerTitle": "Códigos de respaldo", + "subtitle__regenerate": "Obtener un nuevo conjunto de códigos de respaldo seguros. Los códigos anteriores serán eliminados y no podrán ser utilizados.", + "title__regenerate": "Regenerar códigos de respaldo" + }, + "phoneCode": { + "actionLabel__setDefault": "Establecer como predeterminado", + "destructiveActionLabel": "Eliminar" + }, + "primaryButton": "Agregar verificación en dos pasos", + "title": "Verificación en dos pasos", + "totp": { + "destructiveActionTitle": "Eliminar", + "headerTitle": "Aplicación autenticadora" + } + }, + "passkeysSection": { + "menuAction__destructive": "Eliminar", + "menuAction__rename": "Renombrar", + "title": "Contraseñas" + }, + "passwordSection": { + "primaryButton__setPassword": "Establecer contraseña", + "primaryButton__updatePassword": "Actualizar contraseña", + "title": "Contraseña" + }, + "phoneNumbersSection": { + "destructiveAction": "Eliminar número de teléfono", + "detailsAction__nonPrimary": "Establecer como principal", + "detailsAction__primary": "Completar verificación", + "detailsAction__unverified": "Verificar número de teléfono", + "primaryButton": "Agregar número de teléfono", + "title": "Números de teléfono" + }, + "profileSection": { + "primaryButton": "Actualizar perfil", + "title": "Perfil" + }, + "usernameSection": { + "primaryButton__setUsername": "Establecer nombre de usuario", + "primaryButton__updateUsername": "Actualizar nombre de usuario", + "title": "Nombre de usuario" + }, + "web3WalletsSection": { + "destructiveAction": "Eliminar billetera", + "primaryButton": "Billeteras Web3", + "title": "Billeteras Web3" + } + }, + "usernamePage": { + "successMessage": "Tu nombre de usuario ha sido actualizado.", + "title__set": "Establecer nombre de usuario", + "title__update": "Actualizar nombre de usuario" + }, + "web3WalletPage": { + "removeResource": { + "messageLine1": "{{identifier}} será eliminado de esta cuenta.", + "messageLine2": "Ya no podrás iniciar sesión usando esta billetera web3.", + "successMessage": "{{web3Wallet}} ha sido eliminado de tu cuenta.", + "title": "Eliminar billetera web3" + }, + "subtitle__availableWallets": "Selecciona una billetera web3 para conectar a tu cuenta.", + "subtitle__unavailableWallets": "No hay billeteras web3 disponibles.", + "successMessage": "La billetera ha sido añadida a tu cuenta.", + "title": "Añadir billetera web3" + } + } +} diff --git a/locales/es-ES/common.json b/locales/es-ES/common.json index 0a6a4f6b89508..ab005472a6d29 100644 --- a/locales/es-ES/common.json +++ b/locales/es-ES/common.json @@ -160,6 +160,7 @@ "newVersion": "Nueva versión disponible: {{version}}" }, "userPanel": { + "anonymousNickName": "Usuario Anónimo", "billing": "Gestión de facturación", "defaultNickname": "Usuario de la comunidad", "discord": "Soporte de la comunidad", diff --git a/locales/es-ES/error.json b/locales/es-ES/error.json index 631fd8739826d..433aa233234e0 100644 --- a/locales/es-ES/error.json +++ b/locales/es-ES/error.json @@ -1,4 +1,11 @@ { + "clerkAuth": { + "loginSuccess": { + "action": "Continuar la sesión", + "desc": "{{greeting}}, es un placer poder seguir asistiéndote. Continuemos con el tema que estábamos tratando.", + "title": "Bienvenido de nuevo, {{nickName}}" + } + }, "error": { "backHome": "Volver a la página de inicio", "desc": "Inténtalo de nuevo más tarde, o regresa al mundo conocido", @@ -54,6 +61,7 @@ "InvalidAnthropicAPIKey": "La clave de API de Anthropic es incorrecta o está vacía. Por favor, revisa la clave de API de Anthropic e inténtalo de nuevo.", "InvalidAzureAPIKey": "La clave de API de Azure es incorrecta o está vacía, por favor, verifica la clave de API de Azure e inténtalo de nuevo", "InvalidBedrockCredentials": "La autenticación de Bedrock no se ha completado con éxito, por favor, verifica AccessKeyId/SecretAccessKey e inténtalo de nuevo", + "InvalidClerkUser": "Lo siento mucho, actualmente no has iniciado sesión. Por favor, inicia sesión o regístrate antes de continuar.", "InvalidGoogleAPIKey": "La clave de API de Google es incorrecta o está vacía, por favor, verifica la clave de API de Google e inténtalo de nuevo", "InvalidGroqAPIKey": "La clave de API de Groq es incorrecta o está vacía. Por favor, revisa la clave de API de Groq e inténtalo de nuevo.", "InvalidMinimaxAPIKey": "Clave de API de Minimax incorrecta o vacía, por favor, revise la clave de API de Minimax e inténtelo de nuevo", diff --git a/locales/fr-FR/auth.json b/locales/fr-FR/auth.json new file mode 100644 index 0000000000000..fc5b2019b3f31 --- /dev/null +++ b/locales/fr-FR/auth.json @@ -0,0 +1,6 @@ +{ + "login": "Connexion", + "loginOrSignup": "Connexion / Inscription", + "signout": "Déconnexion", + "signup": "Inscription" +} diff --git a/locales/fr-FR/clerk.json b/locales/fr-FR/clerk.json new file mode 100644 index 0000000000000..0293aa77e0e59 --- /dev/null +++ b/locales/fr-FR/clerk.json @@ -0,0 +1,769 @@ +{ + "backButton": "Retour", + "badge__default": "Par défaut", + "badge__otherImpersonatorDevice": "Autre appareil usurpateur", + "badge__primary": "Principal", + "badge__requiresAction": "Nécessite une action", + "badge__thisDevice": "Cet appareil", + "badge__unverified": "Non vérifié", + "badge__userDevice": "Appareil de l'utilisateur", + "badge__you": "Vous", + "createOrganization": { + "formButtonSubmit": "Créer une organisation", + "invitePage": { + "formButtonReset": "Passer" + }, + "title": "Créer une organisation" + }, + "dates": { + "lastDay": "Hier à {{ date | timeString('fr-FR') }}", + "next6Days": "{{ date | weekday('fr-FR','long') }} à {{ date | timeString('fr-FR') }}", + "nextDay": "Demain à {{ date | timeString('fr-FR') }}", + "numeric": "{{ date | numeric('fr-FR') }}", + "previous6Days": "Dernier {{ date | weekday('fr-FR','long') }} à {{ date | timeString('fr-FR') }}", + "sameDay": "Aujourd'hui à {{ date | timeString('fr-FR') }}" + }, + "dividerText": "ou", + "footerActionLink__useAnotherMethod": "Utiliser une autre méthode", + "footerPageLink__help": "Aide", + "footerPageLink__privacy": "Confidentialité", + "footerPageLink__terms": "Conditions", + "formButtonPrimary": "Continuer", + "formButtonPrimary__verify": "Vérifier", + "formFieldAction__forgotPassword": "Mot de passe oublié ?", + "formFieldError__matchingPasswords": "Les mots de passe correspondent.", + "formFieldError__notMatchingPasswords": "Les mots de passe ne correspondent pas.", + "formFieldError__verificationLinkExpired": "Le lien de vérification a expiré. Veuillez demander un nouveau lien.", + "formFieldHintText__optional": "Facultatif", + "formFieldHintText__slug": "Un slug est un identifiant lisible par l'homme qui doit être unique. Il est souvent utilisé dans les URL.", + "formFieldInputPlaceholder__backupCode": "", + "formFieldInputPlaceholder__confirmDeletionUserAccount": "Supprimer le compte", + "formFieldInputPlaceholder__emailAddress": "", + "formFieldInputPlaceholder__emailAddress_username": "", + "formFieldInputPlaceholder__emailAddresses": "exemple@email.com, exemple2@email.com", + "formFieldInputPlaceholder__firstName": "", + "formFieldInputPlaceholder__lastName": "", + "formFieldInputPlaceholder__organizationDomain": "", + "formFieldInputPlaceholder__organizationDomainEmailAddress": "", + "formFieldInputPlaceholder__organizationName": "", + "formFieldInputPlaceholder__organizationSlug": "mon-org", + "formFieldInputPlaceholder__password": "", + "formFieldInputPlaceholder__phoneNumber": "", + "formFieldInputPlaceholder__username": "", + "formFieldLabel__automaticInvitations": "Activer les invitations automatiques pour ce domaine", + "formFieldLabel__backupCode": "Code de secours", + "formFieldLabel__confirmDeletion": "Confirmation", + "formFieldLabel__confirmPassword": "Confirmer le mot de passe", + "formFieldLabel__currentPassword": "Mot de passe actuel", + "formFieldLabel__emailAddress": "Adresse e-mail", + "formFieldLabel__emailAddress_username": "Adresse e-mail ou nom d'utilisateur", + "formFieldLabel__emailAddresses": "Adresses e-mail", + "formFieldLabel__firstName": "Prénom", + "formFieldLabel__lastName": "Nom de famille", + "formFieldLabel__newPassword": "Nouveau mot de passe", + "formFieldLabel__organizationDomain": "Domaine", + "formFieldLabel__organizationDomainDeletePending": "Supprimer les invitations et suggestions en attente", + "formFieldLabel__organizationDomainEmailAddress": "Adresse e-mail de vérification", + "formFieldLabel__organizationDomainEmailAddressDescription": "Saisissez une adresse e-mail sous ce domaine pour recevoir un code et vérifier ce domaine.", + "formFieldLabel__organizationName": "Nom", + "formFieldLabel__organizationSlug": "Slug", + "formFieldLabel__passkeyName": "Nom de la clé d'accès", + "formFieldLabel__password": "Mot de passe", + "formFieldLabel__phoneNumber": "Numéro de téléphone", + "formFieldLabel__role": "Rôle", + "formFieldLabel__signOutOfOtherSessions": "Se déconnecter de tous les autres appareils", + "formFieldLabel__username": "Nom d'utilisateur", + "impersonationFab": { + "action__signOut": "Se déconnecter", + "title": "Connecté en tant que {{identifier}}" + }, + "locale": "fr-FR", + "maintenanceMode": "Nous sommes actuellement en maintenance, mais ne vous inquiétez pas, cela ne devrait pas prendre plus que quelques minutes.", + "membershipRole__admin": "Administrateur", + "membershipRole__basicMember": "Membre", + "membershipRole__guestMember": "Invité", + "organizationList": { + "action__createOrganization": "Créer une organisation", + "action__invitationAccept": "Rejoindre", + "action__suggestionsAccept": "Demander à rejoindre", + "createOrganization": "Créer une organisation", + "invitationAcceptedLabel": "Rejoint", + "subtitle": "pour continuer sur {{applicationName}}", + "suggestionsAcceptedLabel": "En attente d'approbation", + "title": "Choisir un compte", + "titleWithoutPersonal": "Choisir une organisation" + }, + "organizationProfile": { + "badge__automaticInvitation": "Invitations automatiques", + "badge__automaticSuggestion": "Suggestions automatiques", + "badge__manualInvitation": "Pas d'inscription automatique", + "badge__unverified": "Non vérifié", + "createDomainPage": { + "subtitle": "Ajoutez le domaine à vérifier. Les utilisateurs avec des adresses e-mail de ce domaine peuvent rejoindre l'organisation automatiquement ou demander à rejoindre.", + "title": "Ajouter un domaine" + }, + "invitePage": { + "detailsTitle__inviteFailed": "Les invitations n'ont pas pu être envoyées. Il existe déjà des invitations en attente pour les adresses e-mail suivantes : {{email_addresses}}.", + "formButtonPrimary__continue": "Envoyer les invitations", + "selectDropdown__role": "Sélectionner le rôle", + "subtitle": "Saisissez ou collez une ou plusieurs adresses e-mail, séparées par des espaces ou des virgules.", + "successMessage": "Invitations envoyées avec succès", + "title": "Inviter de nouveaux membres" + }, + "membersPage": { + "action__invite": "Inviter", + "activeMembersTab": { + "menuAction__remove": "Supprimer le membre", + "tableHeader__actions": "", + "tableHeader__joined": "Rejoint", + "tableHeader__role": "Rôle", + "tableHeader__user": "Utilisateur" + }, + "detailsTitle__emptyRow": "Aucun membre à afficher", + "invitationsTab": { + "autoInvitations": { + "headerSubtitle": "Invitez des utilisateurs en connectant un domaine e-mail à votre organisation. Toute personne qui s'inscrit avec un domaine e-mail correspondant pourra rejoindre l'organisation à tout moment.", + "headerTitle": "Invitations automatiques", + "primaryButton": "Gérer les domaines vérifiés" + }, + "table__emptyRow": "Aucune invitation à afficher" + }, + "invitedMembersTab": { + "menuAction__revoke": "Révoquer l'invitation", + "tableHeader__invited": "Invité" + }, + "requestsTab": { + "autoSuggestions": { + "headerSubtitle": "Les utilisateurs qui s'inscrivent avec un domaine e-mail correspondant pourront voir une suggestion pour demander à rejoindre votre organisation.", + "headerTitle": "Suggestions automatiques", + "primaryButton": "Gérer les domaines vérifiés" + }, + "menuAction__approve": "Approuver", + "menuAction__reject": "Rejeter", + "tableHeader__requested": "Demande d'accès", + "table__emptyRow": "Aucune demande à afficher" + }, + "start": { + "headerTitle__invitations": "Invitations", + "headerTitle__members": "Membres", + "headerTitle__requests": "Demandes" + } + }, + "navbar": { + "description": "Gérez votre organisation.", + "general": "Général", + "members": "Membres", + "title": "Organisation" + }, + "profilePage": { + "dangerSection": { + "deleteOrganization": { + "actionDescription": "Saisissez \"{{organizationName}}\" ci-dessous pour continuer.", + "messageLine1": "Êtes-vous sûr de vouloir supprimer cette organisation ?", + "messageLine2": "Cette action est définitive et irréversible.", + "successMessage": "Vous avez supprimé l'organisation.", + "title": "Supprimer l'organisation" + }, + "leaveOrganization": { + "actionDescription": "Saisissez \"{{organizationName}}\" ci-dessous pour continuer.", + "messageLine1": "Êtes-vous sûr de vouloir quitter cette organisation ? Vous perdrez l'accès à cette organisation et à ses applications.", + "messageLine2": "Cette action est définitive et irréversible.", + "successMessage": "Vous avez quitté l'organisation.", + "title": "Quitter l'organisation" + }, + "title": "Danger" + }, + "domainSection": { + "menuAction__manage": "Gérer", + "menuAction__remove": "Supprimer", + "menuAction__verify": "Vérifier", + "primaryButton": "Ajouter un domaine", + "subtitle": "Permettez aux utilisateurs de rejoindre l'organisation automatiquement ou de demander à rejoindre en fonction d'un domaine e-mail vérifié.", + "title": "Domaines vérifiés" + }, + "successMessage": "L'organisation a été mise à jour.", + "title": "Mettre à jour le profil" + }, + "removeDomainPage": { + "messageLine1": "Le domaine e-mail {{domain}} sera supprimé.", + "messageLine2": "Les utilisateurs ne pourront plus rejoindre l'organisation automatiquement après cela.", + "successMessage": "{{domain}} a été supprimé.", + "title": "Supprimer le domaine" + }, + "start": { + "headerTitle__general": "Général", + "headerTitle__members": "Membres", + "profileSection": { + "primaryButton": "Mettre à jour le profil", + "title": "Profil de l'organisation", + "uploadAction__title": "Logo" + } + }, + "verifiedDomainPage": { + "dangerTab": { + "calloutInfoLabel": "La suppression de ce domaine affectera les utilisateurs invités.", + "removeDomainActionLabel__remove": "Supprimer le domaine", + "removeDomainSubtitle": "Supprimer ce domaine de vos domaines vérifiés", + "removeDomainTitle": "Supprimer le domaine" + }, + "enrollmentTab": { + "automaticInvitationOption__description": "Les utilisateurs sont automatiquement invités à rejoindre l'organisation lorsqu'ils s'inscrivent et peuvent rejoindre à tout moment.", + "automaticInvitationOption__label": "Invitations automatiques", + "automaticSuggestionOption__description": "Les utilisateurs reçoivent une suggestion pour demander à rejoindre, mais doivent être approuvés par un administrateur avant de pouvoir rejoindre l'organisation.", + "automaticSuggestionOption__label": "Suggestions automatiques", + "calloutInfoLabel": "Le changement du mode d'inscription n'affectera que les nouveaux utilisateurs.", + "calloutInvitationCountLabel": "Invitations en attente envoyées aux utilisateurs : {{count}}", + "calloutSuggestionCountLabel": "Suggestions en attente envoyées aux utilisateurs : {{count}}", + "manualInvitationOption__description": "Les utilisateurs ne peuvent être invités à l'organisation que manuellement.", + "manualInvitationOption__label": "Pas d'inscription automatique", + "subtitle": "Choisissez comment les utilisateurs de ce domaine peuvent rejoindre l'organisation." + }, + "start": { + "headerTitle__danger": "Danger", + "headerTitle__enrollment": "Options d'inscription" + }, + "subtitle": "Le domaine {{domain}} est désormais vérifié. Poursuivez en sélectionnant le mode d'inscription.", + "title": "Mettre à jour {{domain}}" + }, + "verifyDomainPage": { + "formSubtitle": "Saisissez le code de vérification envoyé à votre adresse e-mail", + "formTitle": "Code de vérification", + "resendButton": "Vous n'avez pas reçu de code ? Renvoyer", + "subtitle": "Le domaine {{domainName}} doit être vérifié via e-mail.", + "subtitleVerificationCodeScreen": "Un code de vérification a été envoyé à {{emailAddress}}. Saisissez le code pour continuer.", + "title": "Vérifier le domaine" + } + }, + "organizationSwitcher": { + "action__createOrganization": "Créer une organisation", + "action__invitationAccept": "Rejoindre", + "action__manageOrganization": "Gérer", + "action__suggestionsAccept": "Demander à rejoindre", + "notSelected": "Aucune organisation sélectionnée", + "personalWorkspace": "Compte personnel", + "suggestionsAcceptedLabel": "En attente d'approbation" + }, + "paginationButton__next": "Suivant", + "paginationButton__previous": "Précédent", + "paginationRowText__displaying": "Affichage", + "paginationRowText__of": "de", + "signIn": { + "accountSwitcher": { + "action__addAccount": "Ajouter un compte", + "action__signOutAll": "Se déconnecter de tous les comptes", + "subtitle": "Sélectionnez le compte avec lequel vous souhaitez continuer.", + "title": "Choisissez un compte" + }, + "alternativeMethods": { + "actionLink": "Obtenir de l'aide", + "actionText": "Vous n'avez aucun de ces comptes ?", + "blockButton__backupCode": "Utiliser un code de secours", + "blockButton__emailCode": "Envoyer un code par e-mail à {{identifier}}", + "blockButton__emailLink": "Envoyer un lien par e-mail à {{identifier}}", + "blockButton__passkey": "Se connecter avec votre passkey", + "blockButton__password": "Se connecter avec votre mot de passe", + "blockButton__phoneCode": "Envoyer un code SMS à {{identifier}}", + "blockButton__totp": "Utiliser votre application d'authentification", + "getHelp": { + "blockButton__emailSupport": "Assistance par e-mail", + "content": "Si vous rencontrez des difficultés pour vous connecter à votre compte, envoyez-nous un e-mail et nous travaillerons avec vous pour restaurer l'accès dès que possible.", + "title": "Obtenir de l'aide" + }, + "subtitle": "Rencontrez-vous des problèmes ? Vous pouvez utiliser l'une de ces méthodes pour vous connecter.", + "title": "Utiliser une autre méthode" + }, + "backupCodeMfa": { + "subtitle": "Votre code de secours est celui que vous avez reçu lors de la configuration de l'authentification à deux facteurs.", + "title": "Saisir un code de secours" + }, + "emailCode": { + "formTitle": "Code de vérification", + "resendButton": "Vous n'avez pas reçu de code ? Renvoyer", + "subtitle": "pour continuer vers {{applicationName}}", + "title": "Vérifiez votre e-mail" + }, + "emailLink": { + "expired": { + "subtitle": "Retournez à l'onglet d'origine pour continuer.", + "title": "Ce lien de vérification a expiré" + }, + "failed": { + "subtitle": "Retournez à l'onglet d'origine pour continuer.", + "title": "Ce lien de vérification est invalide" + }, + "formSubtitle": "Utilisez le lien de vérification envoyé à votre e-mail", + "formTitle": "Lien de vérification", + "loading": { + "subtitle": "Vous serez bientôt redirigé", + "title": "Connexion en cours..." + }, + "resendButton": "Vous n'avez pas reçu de lien ? Renvoyer", + "subtitle": "pour continuer vers {{applicationName}}", + "title": "Vérifiez votre e-mail", + "unusedTab": { + "title": "Vous pouvez fermer cet onglet" + }, + "verified": { + "subtitle": "Vous serez bientôt redirigé", + "title": "Connexion réussie" + }, + "verifiedSwitchTab": { + "subtitle": "Retournez à l'onglet d'origine pour continuer", + "subtitleNewTab": "Retournez à l'onglet nouvellement ouvert pour continuer", + "titleNewTab": "Connecté sur un autre onglet" + } + }, + "forgotPassword": { + "formTitle": "Code de réinitialisation du mot de passe", + "resendButton": "Vous n'avez pas reçu de code ? Renvoyer", + "subtitle": "pour réinitialiser votre mot de passe", + "subtitle_email": "Tout d'abord, saisissez le code envoyé à votre adresse e-mail", + "subtitle_phone": "Tout d'abord, saisissez le code envoyé à votre téléphone", + "title": "Réinitialiser le mot de passe" + }, + "forgotPasswordAlternativeMethods": { + "blockButton__resetPassword": "Réinitialiser votre mot de passe", + "label__alternativeMethods": "Ou, connectez-vous avec une autre méthode", + "title": "Mot de passe oublié ?" + }, + "noAvailableMethods": { + "message": "Impossible de procéder à la connexion. Aucun facteur d'authentification disponible.", + "subtitle": "Une erreur s'est produite", + "title": "Connexion impossible" + }, + "passkey": { + "subtitle": "L'utilisation de votre passkey confirme que c'est bien vous. Votre appareil peut vous demander votre empreinte digitale, votre visage ou votre verrouillage d'écran.", + "title": "Utilisez votre passkey" + }, + "password": { + "actionLink": "Utiliser une autre méthode", + "subtitle": "Entrez le mot de passe associé à votre compte", + "title": "Entrez votre mot de passe" + }, + "passwordPwned": { + "title": "Mot de passe compromis" + }, + "phoneCode": { + "formTitle": "Code de vérification", + "resendButton": "Vous n'avez pas reçu de code ? Renvoyer", + "subtitle": "pour continuer vers {{applicationName}}", + "title": "Vérifiez votre téléphone" + }, + "phoneCodeMfa": { + "formTitle": "Code de vérification", + "resendButton": "Vous n'avez pas reçu de code ? Renvoyer", + "subtitle": "Pour continuer, veuillez saisir le code de vérification envoyé à votre téléphone", + "title": "Vérifiez votre téléphone" + }, + "resetPassword": { + "formButtonPrimary": "Réinitialiser le mot de passe", + "requiredMessage": "Pour des raisons de sécurité, il est nécessaire de réinitialiser votre mot de passe.", + "successMessage": "Votre mot de passe a été changé avec succès. Nous vous connectons, veuillez patienter un instant.", + "title": "Définir un nouveau mot de passe" + }, + "resetPasswordMfa": { + "detailsLabel": "Nous devons vérifier votre identité avant de réinitialiser votre mot de passe." + }, + "start": { + "actionLink": "S'inscrire", + "actionLink__use_email": "Utiliser un e-mail", + "actionLink__use_email_username": "Utiliser un e-mail ou un nom d'utilisateur", + "actionLink__use_passkey": "Utiliser le passkey à la place", + "actionLink__use_phone": "Utiliser le téléphone", + "actionLink__use_username": "Utiliser un nom d'utilisateur", + "actionText": "Vous n'avez pas de compte ?", + "subtitle": "Bienvenue ! Veuillez vous connecter pour continuer", + "title": "Se connecter à {{applicationName}}" + }, + "totpMfa": { + "formTitle": "Code de vérification", + "subtitle": "Pour continuer, veuillez saisir le code de vérification généré par votre application d'authentification", + "title": "Vérification en deux étapes" + } + }, + "signInEnterPasswordTitle": "Entrez votre mot de passe", + "signUp": { + "continue": { + "actionLink": "Se connecter", + "actionText": "Vous avez déjà un compte ?", + "subtitle": "Veuillez remplir les détails restants pour continuer", + "title": "Remplissez les champs manquants" + }, + "emailCode": { + "formSubtitle": "Saisissez le code de vérification envoyé à votre adresse e-mail", + "formTitle": "Code de vérification", + "resendButton": "Vous n'avez pas reçu de code ? Renvoyer", + "subtitle": "Saisissez le code de vérification envoyé à votre e-mail", + "title": "Vérifiez votre e-mail" + }, + "emailLink": { + "formSubtitle": "Utilisez le lien de vérification envoyé à votre adresse e-mail", + "formTitle": "Lien de vérification", + "loading": { + "title": "Inscription en cours..." + }, + "resendButton": "Vous n'avez pas reçu de lien ? Renvoyer", + "subtitle": "pour continuer vers {{applicationName}}", + "title": "Vérifiez votre e-mail", + "verified": { + "title": "Inscription réussie" + }, + "verifiedSwitchTab": { + "subtitle": "Retournez à l'onglet nouvellement ouvert pour continuer", + "subtitleNewTab": "Retournez à l'onglet précédent pour continuer", + "title": "E-mail vérifié avec succès" + } + }, + "phoneCode": { + "formSubtitle": "Saisissez le code de vérification envoyé à votre numéro de téléphone", + "formTitle": "Code de vérification", + "resendButton": "Vous n'avez pas reçu de code ? Renvoyer", + "subtitle": "Saisissez le code de vérification envoyé à votre téléphone", + "title": "Vérifiez votre téléphone" + }, + "start": { + "actionLink": "Se connecter", + "actionText": "Vous avez déjà un compte ?", + "subtitle": "Bienvenue ! Veuillez remplir les détails pour commencer", + "title": "Créez votre compte" + } + }, + "socialButtonsBlockButton": "Continuer avec {{provider|titleize}}", + "unstable__errors": { + "captcha_invalid": "Inscription échouée en raison d'échecs de validation de sécurité. Veuillez rafraîchir la page pour réessayer ou contacter le support pour plus d'aide.", + "captcha_unavailable": "Inscription échouée en raison d'une validation de bot échouée. Veuillez rafraîchir la page pour réessayer ou contacter le support pour plus d'aide.", + "form_code_incorrect": "", + "form_identifier_exists": "", + "form_identifier_exists__email_address": "Cette adresse e-mail est déjà utilisée. Veuillez en essayer une autre.", + "form_identifier_exists__phone_number": "Ce numéro de téléphone est déjà utilisé. Veuillez en essayer un autre.", + "form_identifier_exists__username": "Ce nom d'utilisateur est déjà pris. Veuillez en essayer un autre.", + "form_identifier_not_found": "", + "form_param_format_invalid": "", + "form_param_format_invalid__email_address": "L'adresse e-mail doit être une adresse e-mail valide.", + "form_param_format_invalid__phone_number": "Le numéro de téléphone doit être au format international valide.", + "form_param_max_length_exceeded__first_name": "Le prénom ne doit pas dépasser 256 caractères.", + "form_param_max_length_exceeded__last_name": "Le nom de famille ne doit pas dépasser 256 caractères.", + "form_param_max_length_exceeded__name": "Le nom ne doit pas dépasser 256 caractères.", + "form_param_nil": "", + "form_password_incorrect": "", + "form_password_length_too_short": "", + "form_password_not_strong_enough": "Votre mot de passe n'est pas assez fort.", + "form_password_pwned": "Ce mot de passe a été trouvé dans une violation et ne peut pas être utilisé, veuillez en essayer un autre à la place.", + "form_password_pwned__sign_in": "Ce mot de passe a été trouvé dans une violation et ne peut pas être utilisé, veuillez réinitialiser votre mot de passe.", + "form_password_size_in_bytes_exceeded": "Votre mot de passe a dépassé le nombre maximum d'octets autorisé, veuillez le raccourcir ou supprimer certains caractères spéciaux.", + "form_password_validation_failed": "Mot de passe incorrect", + "form_username_invalid_character": "", + "form_username_invalid_length": "", + "identification_deletion_failed": "Vous ne pouvez pas supprimer votre dernière identification.", + "not_allowed_access": "", + "passkey_already_exists": "Une clé d'accès est déjà enregistrée sur cet appareil.", + "passkey_not_supported": "Les clés d'accès ne sont pas prises en charge sur cet appareil.", + "passkey_pa_not_supported": "L'inscription nécessite un authentificateur de plateforme mais l'appareil ne le prend pas en charge.", + "passkey_registration_cancelled": "L'inscription de la clé d'accès a été annulée ou a expiré.", + "passkey_retrieval_cancelled": "La vérification de la clé d'accès a été annulée ou a expiré.", + "passwordComplexity": { + "maximumLength": "moins de {{length}} caractères", + "minimumLength": "{{length}} ou plus de caractères", + "requireLowercase": "une lettre minuscule", + "requireNumbers": "un chiffre", + "requireSpecialCharacter": "un caractère spécial", + "requireUppercase": "une lettre majuscule", + "sentencePrefix": "Votre mot de passe doit contenir" + }, + "phone_number_exists": "Ce numéro de téléphone est déjà utilisé. Veuillez en essayer un autre.", + "zxcvbn": { + "couldBeStronger": "Votre mot de passe fonctionne, mais pourrait être plus fort. Essayez d'ajouter plus de caractères.", + "goodPassword": "Votre mot de passe répond à toutes les exigences nécessaires.", + "notEnough": "Votre mot de passe n'est pas assez fort.", + "suggestions": { + "allUppercase": "Mettez des majuscules sur certaines lettres, mais pas sur toutes.", + "anotherWord": "Ajoutez des mots moins communs.", + "associatedYears": "Évitez les années qui vous sont associées.", + "capitalization": "Mettez des majuscules sur plus que la première lettre.", + "dates": "Évitez les dates et années qui vous sont associées.", + "l33t": "Évitez les substitutions de lettres prévisibles comme '@' pour 'a'.", + "longerKeyboardPattern": "Utilisez des motifs de clavier plus longs et changez de direction de frappe plusieurs fois.", + "noNeed": "Vous pouvez créer des mots de passe forts sans utiliser de symboles, de chiffres ou de lettres majuscules.", + "pwned": "Si vous utilisez ce mot de passe ailleurs, vous devriez le changer.", + "recentYears": "Évitez les années récentes.", + "repeated": "Évitez les mots et caractères répétés.", + "reverseWords": "Évitez les mots communs écrits à l'envers.", + "sequences": "Évitez les séquences de caractères communes.", + "useWords": "Utilisez plusieurs mots, mais évitez les phrases courantes." + }, + "warnings": { + "common": "C'est un mot de passe couramment utilisé.", + "commonNames": "Les noms et prénoms courants sont faciles à deviner.", + "dates": "Les dates sont faciles à deviner.", + "extendedRepeat": "Les motifs de caractères répétés comme \"abcabcabc\" sont faciles à deviner.", + "keyPattern": "Les motifs de clavier courts sont faciles à deviner.", + "namesByThemselves": "Les noms ou prénoms seuls sont faciles à deviner.", + "pwned": "Votre mot de passe a été exposé lors d'une violation de données sur Internet.", + "recentYears": "Les années récentes sont faciles à deviner.", + "sequences": "Les séquences de caractères communes comme \"abc\" sont faciles à deviner.", + "similarToCommon": "Cela ressemble à un mot de passe couramment utilisé.", + "simpleRepeat": "Les caractères répétés comme \"aaa\" sont faciles à deviner.", + "straightRow": "Les rangées de touches consécutives sur votre clavier sont faciles à deviner.", + "topHundred": "C'est un mot de passe fréquemment utilisé.", + "topTen": "C'est un mot de passe très utilisé.", + "userInputs": "Il ne devrait y avoir aucune donnée personnelle ou liée à la page.", + "wordByItself": "Les mots seuls sont faciles à deviner." + } + } + }, + "userButton": { + "action__addAccount": "Ajouter un compte", + "action__manageAccount": "Gérer le compte", + "action__signOut": "Déconnexion", + "action__signOutAll": "Déconnexion de tous les comptes" + }, + "userProfile": { + "backupCodePage": { + "actionLabel__copied": "Copié !", + "actionLabel__copy": "Copier tout", + "actionLabel__download": "Télécharger .txt", + "actionLabel__print": "Imprimer", + "infoText1": "Des codes de secours seront activés pour ce compte.", + "infoText2": "Gardez les codes de secours secrets et stockez-les en toute sécurité. Vous pouvez régénérer des codes de secours si vous soupçonnez qu'ils ont été compromis.", + "subtitle__codelist": "Stockez-les en toute sécurité et gardez-les secrets.", + "successMessage": "Les codes de secours sont maintenant activés. Vous pouvez utiliser l'un d'eux pour vous connecter à votre compte si vous perdez l'accès à votre appareil d'authentification. Chaque code ne peut être utilisé qu'une seule fois.", + "successSubtitle": "Vous pouvez utiliser l'un d'eux pour vous connecter à votre compte si vous perdez l'accès à votre appareil d'authentification.", + "title": "Ajouter la vérification par code de secours", + "title__codelist": "Codes de secours" + }, + "connectedAccountPage": { + "formHint": "Sélectionnez un fournisseur pour connecter votre compte.", + "formHint__noAccounts": "Aucun fournisseur de compte externe disponible.", + "removeResource": { + "messageLine1": "{{identifier}} sera supprimé de ce compte.", + "messageLine2": "Vous ne pourrez plus utiliser ce compte connecté et toutes les fonctionnalités dépendantes ne fonctionneront plus.", + "successMessage": "{{connectedAccount}} a été supprimé de votre compte.", + "title": "Supprimer le compte connecté" + }, + "socialButtonsBlockButton": "{{provider|titleize}}", + "successMessage": "Le fournisseur a été ajouté à votre compte", + "title": "Ajouter un compte connecté" + }, + "deletePage": { + "actionDescription": "Tapez \"Supprimer le compte\" ci-dessous pour continuer.", + "confirm": "Supprimer le compte", + "messageLine1": "Êtes-vous sûr de vouloir supprimer votre compte ?", + "messageLine2": "Cette action est permanente et irréversible.", + "title": "Supprimer le compte" + }, + "emailAddressPage": { + "emailCode": { + "formHint": "Un e-mail contenant un code de vérification sera envoyé à cette adresse e-mail.", + "formSubtitle": "Entrez le code de vérification envoyé à {{identifier}}", + "formTitle": "Code de vérification", + "resendButton": "Vous n'avez pas reçu de code ? Renvoyer", + "successMessage": "L'e-mail {{identifier}} a été ajouté à votre compte." + }, + "emailLink": { + "formHint": "Un e-mail contenant un lien de vérification sera envoyé à cette adresse e-mail.", + "formSubtitle": "Cliquez sur le lien de vérification dans l'e-mail envoyé à {{identifier}}", + "formTitle": "Lien de vérification", + "resendButton": "Vous n'avez pas reçu de lien ? Renvoyer", + "successMessage": "L'e-mail {{identifier}} a été ajouté à votre compte." + }, + "removeResource": { + "messageLine1": "{{identifier}} sera supprimé de ce compte.", + "messageLine2": "Vous ne pourrez plus vous connecter en utilisant cette adresse e-mail.", + "successMessage": "{{emailAddress}} a été supprimé de votre compte.", + "title": "Supprimer l'adresse e-mail" + }, + "title": "Ajouter une adresse e-mail", + "verifyTitle": "Vérifier l'adresse e-mail" + }, + "formButtonPrimary__add": "Ajouter", + "formButtonPrimary__continue": "Continuer", + "formButtonPrimary__finish": "Terminer", + "formButtonPrimary__remove": "Supprimer", + "formButtonPrimary__save": "Enregistrer", + "formButtonReset": "Annuler", + "mfaPage": { + "formHint": "Sélectionnez une méthode à ajouter.", + "title": "Ajouter la vérification en deux étapes" + }, + "mfaPhoneCodePage": { + "backButton": "Utiliser le numéro existant", + "primaryButton__addPhoneNumber": "Ajouter un numéro de téléphone", + "removeResource": { + "messageLine1": "{{identifier}} ne recevra plus de codes de vérification lors de la connexion.", + "messageLine2": "Votre compte peut ne pas être aussi sécurisé. Êtes-vous sûr de vouloir continuer ?", + "successMessage": "La vérification en deux étapes par code SMS a été supprimée pour {{mfaPhoneCode}}", + "title": "Supprimer la vérification en deux étapes" + }, + "subtitle__availablePhoneNumbers": "Sélectionnez un numéro de téléphone existant pour vous inscrire à la vérification en deux étapes par code SMS ou en ajouter un nouveau.", + "subtitle__unavailablePhoneNumbers": "Aucun numéro de téléphone disponible pour vous inscrire à la vérification en deux étapes par code SMS, veuillez en ajouter un nouveau.", + "successMessage1": "Lors de la connexion, vous devrez entrer un code de vérification envoyé à ce numéro de téléphone en tant qu'étape supplémentaire.", + "successMessage2": "Sauvegardez ces codes de secours et stockez-les en lieu sûr. Si vous perdez l'accès à votre appareil d'authentification, vous pourrez utiliser les codes de secours pour vous connecter.", + "successTitle": "Vérification par code SMS activée", + "title": "Ajouter la vérification par code SMS" + }, + "mfaTOTPPage": { + "authenticatorApp": { + "buttonAbleToScan__nonPrimary": "Scanner plutôt le code QR", + "buttonUnableToScan__nonPrimary": "Impossible de scanner le code QR ?", + "infoText__ableToScan": "Configurez une nouvelle méthode de connexion dans votre application d'authentification et scannez le code QR suivant pour le lier à votre compte.", + "infoText__unableToScan": "Configurez une nouvelle méthode de connexion dans votre application d'authentification et saisissez la clé fournie ci-dessous.", + "inputLabel__unableToScan1": "Assurez-vous que les mots de passe basés sur le temps ou à usage unique sont activés, puis terminez la liaison de votre compte.", + "inputLabel__unableToScan2": "Alternativement, si votre application d'authentification prend en charge les URI TOTP, vous pouvez également copier l'URI complet." + }, + "removeResource": { + "messageLine1": "Les codes de vérification de cet authentificateur ne seront plus nécessaires lors de la connexion.", + "messageLine2": "Votre compte peut ne pas être aussi sécurisé. Êtes-vous sûr de vouloir continuer ?", + "successMessage": "La vérification en deux étapes via l'application d'authentification a été supprimée.", + "title": "Supprimer la vérification en deux étapes" + }, + "successMessage": "La vérification en deux étapes est maintenant activée. Lors de la connexion, vous devrez entrer un code de vérification de cet authentificateur en tant qu'étape supplémentaire.", + "title": "Ajouter l'application d'authentification", + "verifySubtitle": "Saisissez le code de vérification généré par votre authentificateur", + "verifyTitle": "Code de vérification" + }, + "mobileButton__menu": "Menu", + "navbar": { + "account": "Profil", + "description": "Gérez les informations de votre compte.", + "security": "Sécurité", + "title": "Compte" + }, + "passkeyScreen": { + "removeResource": { + "messageLine1": "{{name}} sera supprimé de ce compte.", + "title": "Supprimer le passkey" + }, + "subtitle__rename": "Vous pouvez changer le nom du passkey pour le rendre plus facile à trouver.", + "title__rename": "Renommer Passkey" + }, + "passwordPage": { + "checkboxInfoText__signOutOfOtherSessions": "Il est recommandé de vous déconnecter de tous les autres appareils qui ont pu utiliser votre ancien mot de passe.", + "readonly": "Votre mot de passe ne peut actuellement pas être modifié car vous ne pouvez vous connecter que via la connexion d'entreprise.", + "successMessage__set": "Votre mot de passe a été défini.", + "successMessage__signOutOfOtherSessions": "Tous les autres appareils ont été déconnectés.", + "successMessage__update": "Votre mot de passe a été mis à jour.", + "title__set": "Définir le mot de passe", + "title__update": "Mettre à jour le mot de passe" + }, + "phoneNumberPage": { + "infoText": "Un message texte contenant un code de vérification sera envoyé à ce numéro de téléphone. Des frais de messagerie et de données peuvent s'appliquer.", + "removeResource": { + "messageLine1": "{{identifier}} sera supprimé de ce compte.", + "messageLine2": "Vous ne pourrez plus vous connecter en utilisant ce numéro de téléphone.", + "successMessage": "{{phoneNumber}} a été supprimé de votre compte.", + "title": "Supprimer le numéro de téléphone" + }, + "successMessage": "{{identifier}} a été ajouté à votre compte.", + "title": "Ajouter un numéro de téléphone", + "verifySubtitle": "Entrez le code de vérification envoyé à {{identifier}}", + "verifyTitle": "Vérifier le numéro de téléphone" + }, + "profilePage": { + "fileDropAreaHint": "Taille recommandée 1:1, jusqu'à 10 Mo.", + "imageFormDestructiveActionSubtitle": "Supprimer", + "imageFormSubtitle": "Télécharger", + "imageFormTitle": "Image de profil", + "readonly": "Vos informations de profil ont été fournies par la connexion d'entreprise et ne peuvent pas être modifiées.", + "successMessage": "Votre profil a été mis à jour.", + "title": "Mettre à jour le profil" + }, + "start": { + "activeDevicesSection": { + "destructiveAction": "Déconnexion de l'appareil", + "title": "Appareils actifs" + }, + "connectedAccountsSection": { + "actionLabel__connectionFailed": "Réessayer", + "actionLabel__reauthorize": "Autoriser maintenant", + "destructiveActionTitle": "Supprimer", + "primaryButton": "Connecter un compte", + "subtitle__reauthorize": "Les autorisations requises ont été mises à jour, et vous pourriez rencontrer des fonctionnalités limitées. Veuillez réautoriser cette application pour éviter tout problème", + "title": "Comptes connectés" + }, + "dangerSection": { + "deleteAccountButton": "Supprimer le compte", + "title": "Supprimer le compte" + }, + "emailAddressesSection": { + "destructiveAction": "Supprimer l'adresse e-mail", + "detailsAction__nonPrimary": "Définir comme principale", + "detailsAction__primary": "Vérification complète", + "detailsAction__unverified": "Vérifier", + "primaryButton": "Ajouter une adresse e-mail", + "title": "Adresses e-mail" + }, + "enterpriseAccountsSection": { + "title": "Comptes d'entreprise" + }, + "headerTitle__account": "Détails du profil", + "headerTitle__security": "Sécurité", + "mfaSection": { + "backupCodes": { + "actionLabel__regenerate": "Régénérer", + "headerTitle": "Codes de secours", + "subtitle__regenerate": "Obtenez un nouvel ensemble de codes de secours sécurisés. Les codes de secours précédents seront supprimés et ne pourront pas être utilisés.", + "title__regenerate": "Régénérer les codes de secours" + }, + "phoneCode": { + "actionLabel__setDefault": "Définir comme par défaut", + "destructiveActionLabel": "Supprimer" + }, + "primaryButton": "Ajouter une vérification en deux étapes", + "title": "Vérification en deux étapes", + "totp": { + "destructiveActionTitle": "Supprimer", + "headerTitle": "Application d'authentification" + } + }, + "passkeysSection": { + "menuAction__destructive": "Supprimer", + "menuAction__rename": "Renommer", + "title": "Passkeys" + }, + "passwordSection": { + "primaryButton__setPassword": "Définir le mot de passe", + "primaryButton__updatePassword": "Mettre à jour le mot de passe", + "title": "Mot de passe" + }, + "phoneNumbersSection": { + "destructiveAction": "Supprimer le numéro de téléphone", + "detailsAction__nonPrimary": "Définir comme principal", + "detailsAction__primary": "Vérification complète", + "detailsAction__unverified": "Vérifier le numéro de téléphone", + "primaryButton": "Ajouter un numéro de téléphone", + "title": "Numéros de téléphone" + }, + "profileSection": { + "primaryButton": "Mettre à jour le profil", + "title": "Profil" + }, + "usernameSection": { + "primaryButton__setUsername": "Définir le nom d'utilisateur", + "primaryButton__updateUsername": "Mettre à jour le nom d'utilisateur", + "title": "Nom d'utilisateur" + }, + "web3WalletsSection": { + "destructiveAction": "Supprimer le portefeuille", + "primaryButton": "Portefeuilles Web3", + "title": "Portefeuilles Web3" + } + }, + "usernamePage": { + "successMessage": "Votre nom d'utilisateur a été mis à jour.", + "title__set": "Définir le nom d'utilisateur", + "title__update": "Mettre à jour le nom d'utilisateur" + }, + "web3WalletPage": { + "removeResource": { + "messageLine1": "{{identifier}} sera supprimé de ce compte.", + "messageLine2": "Vous ne pourrez plus vous connecter en utilisant ce portefeuille web3.", + "successMessage": "{{web3Wallet}} a été supprimé de votre compte.", + "title": "Supprimer le portefeuille web3" + }, + "subtitle__availableWallets": "Sélectionnez un portefeuille web3 pour vous connecter à votre compte.", + "subtitle__unavailableWallets": "Il n'y a pas de portefeuilles web3 disponibles.", + "successMessage": "Le portefeuille a été ajouté à votre compte.", + "title": "Ajouter un portefeuille web3" + } + } +} diff --git a/locales/fr-FR/common.json b/locales/fr-FR/common.json index f82ae47cfeee7..08a9793bb0580 100644 --- a/locales/fr-FR/common.json +++ b/locales/fr-FR/common.json @@ -160,6 +160,7 @@ "newVersion": "Nouvelle version disponible : {{version}}" }, "userPanel": { + "anonymousNickName": "Utilisateur anonyme", "billing": "Gestion de la facturation", "defaultNickname": "Utilisateur de la version communautaire", "discord": "Support de la communauté", diff --git a/locales/fr-FR/error.json b/locales/fr-FR/error.json index 5a432ae323f9a..159eeb0c33d6d 100644 --- a/locales/fr-FR/error.json +++ b/locales/fr-FR/error.json @@ -1,4 +1,11 @@ { + "clerkAuth": { + "loginSuccess": { + "action": "Continuer la session", + "desc": "{{greeting}}, je suis ravi de pouvoir continuer à vous aider. Reprenons là où nous nous étions arrêtés.", + "title": "Bienvenue de retour, {{nickName}}" + } + }, "error": { "backHome": "Retour à la page d'accueil", "desc": "Réessayez plus tard, ou retournez au monde connu", @@ -54,6 +61,7 @@ "InvalidAnthropicAPIKey": "La clé API Anthropic est incorrecte ou manquante. Veuillez vérifier la clé API Anthropic et réessayer.", "InvalidAzureAPIKey": "Clé API Azure incorrecte ou vide, veuillez vérifier la clé API Azure et réessayer", "InvalidBedrockCredentials": "L'authentification Bedrock a échoué, veuillez vérifier AccessKeyId/SecretAccessKey et réessayer", + "InvalidClerkUser": "Désolé, vous n'êtes pas actuellement connecté. Veuillez vous connecter ou vous inscrire avant de continuer.", "InvalidGoogleAPIKey": "Clé API Google incorrecte ou vide, veuillez vérifier la clé API Google et réessayer", "InvalidGroqAPIKey": "Clé API Groq incorrecte ou vide, veuillez vérifier la clé API Groq et réessayer", "InvalidMinimaxAPIKey": "Clé API Minimax incorrecte ou vide, veuillez vérifier la clé API Minimax et réessayer", diff --git a/locales/it-IT/auth.json b/locales/it-IT/auth.json new file mode 100644 index 0000000000000..53732dab90b5b --- /dev/null +++ b/locales/it-IT/auth.json @@ -0,0 +1,6 @@ +{ + "login": "Accedi", + "loginOrSignup": "Accedi / Registrati", + "signout": "Esci", + "signup": "Registrati" +} diff --git a/locales/it-IT/clerk.json b/locales/it-IT/clerk.json new file mode 100644 index 0000000000000..1cb454fd8f2a7 --- /dev/null +++ b/locales/it-IT/clerk.json @@ -0,0 +1,769 @@ +{ + "backButton": "Indietro", + "badge__default": "Predefinito", + "badge__otherImpersonatorDevice": "Altro dispositivo impersonato", + "badge__primary": "Primario", + "badge__requiresAction": "Richiede azione", + "badge__thisDevice": "Questo dispositivo", + "badge__unverified": "Non verificato", + "badge__userDevice": "Dispositivo dell'utente", + "badge__you": "Tu", + "createOrganization": { + "formButtonSubmit": "Crea organizzazione", + "invitePage": { + "formButtonReset": "Ignora" + }, + "title": "Crea organizzazione" + }, + "dates": { + "lastDay": "Ieri alle {{ date | timeString('it-IT') }}", + "next6Days": "{{ date | weekday('it-IT','long') }} alle {{ date | timeString('it-IT') }}", + "nextDay": "Domani alle {{ date | timeString('it-IT') }}", + "numeric": "{{ date | numeric('it-IT') }}", + "previous6Days": "Ultimo {{ date | weekday('it-IT','long') }} alle {{ date | timeString('it-IT') }}", + "sameDay": "Oggi alle {{ date | timeString('it-IT') }}" + }, + "dividerText": "o", + "footerActionLink__useAnotherMethod": "Usa un altro metodo", + "footerPageLink__help": "Aiuto", + "footerPageLink__privacy": "Privacy", + "footerPageLink__terms": "Termini", + "formButtonPrimary": "Continua", + "formButtonPrimary__verify": "Verifica", + "formFieldAction__forgotPassword": "Password dimenticata?", + "formFieldError__matchingPasswords": "Le password corrispondono.", + "formFieldError__notMatchingPasswords": "Le password non corrispondono.", + "formFieldError__verificationLinkExpired": "Il link di verifica è scaduto. Si prega di richiedere un nuovo link.", + "formFieldHintText__optional": "Opzionale", + "formFieldHintText__slug": "Uno slug è un ID leggibile dall'uomo che deve essere univoco. Spesso viene utilizzato negli URL.", + "formFieldInputPlaceholder__backupCode": "", + "formFieldInputPlaceholder__confirmDeletionUserAccount": "Elimina account", + "formFieldInputPlaceholder__emailAddress": "", + "formFieldInputPlaceholder__emailAddress_username": "", + "formFieldInputPlaceholder__emailAddresses": "esempio@email.com, esempio2@email.com", + "formFieldInputPlaceholder__firstName": "", + "formFieldInputPlaceholder__lastName": "", + "formFieldInputPlaceholder__organizationDomain": "", + "formFieldInputPlaceholder__organizationDomainEmailAddress": "", + "formFieldInputPlaceholder__organizationName": "", + "formFieldInputPlaceholder__organizationSlug": "mia-org", + "formFieldInputPlaceholder__password": "", + "formFieldInputPlaceholder__phoneNumber": "", + "formFieldInputPlaceholder__username": "", + "formFieldLabel__automaticInvitations": "Abilita inviti automatici per questo dominio", + "formFieldLabel__backupCode": "Codice di backup", + "formFieldLabel__confirmDeletion": "Conferma", + "formFieldLabel__confirmPassword": "Conferma password", + "formFieldLabel__currentPassword": "Password attuale", + "formFieldLabel__emailAddress": "Indirizzo email", + "formFieldLabel__emailAddress_username": "Indirizzo email o username", + "formFieldLabel__emailAddresses": "Indirizzi email", + "formFieldLabel__firstName": "Nome", + "formFieldLabel__lastName": "Cognome", + "formFieldLabel__newPassword": "Nuova password", + "formFieldLabel__organizationDomain": "Dominio", + "formFieldLabel__organizationDomainDeletePending": "Elimina inviti e suggerimenti in sospeso", + "formFieldLabel__organizationDomainEmailAddress": "Indirizzo email di verifica", + "formFieldLabel__organizationDomainEmailAddressDescription": "Inserisci un indirizzo email sotto questo dominio per ricevere un codice e verificare questo dominio.", + "formFieldLabel__organizationName": "Nome", + "formFieldLabel__organizationSlug": "Slug", + "formFieldLabel__passkeyName": "Nome del passkey", + "formFieldLabel__password": "Password", + "formFieldLabel__phoneNumber": "Numero di telefono", + "formFieldLabel__role": "Ruolo", + "formFieldLabel__signOutOfOtherSessions": "Disconnetti da tutti gli altri dispositivi", + "formFieldLabel__username": "Username", + "impersonationFab": { + "action__signOut": "Disconnetti", + "title": "Accesso come {{identifier}}" + }, + "locale": "it-IT", + "maintenanceMode": "Attualmente siamo in manutenzione, ma non preoccuparti, non dovrebbe richiedere più di qualche minuto.", + "membershipRole__admin": "Amministratore", + "membershipRole__basicMember": "Membro", + "membershipRole__guestMember": "Ospite", + "organizationList": { + "action__createOrganization": "Crea organizzazione", + "action__invitationAccept": "Unisciti", + "action__suggestionsAccept": "Richiedi di unirti", + "createOrganization": "Crea Organizzazione", + "invitationAcceptedLabel": "Unito", + "subtitle": "per continuare con {{applicationName}}", + "suggestionsAcceptedLabel": "In attesa di approvazione", + "title": "Scegli un account", + "titleWithoutPersonal": "Scegli un'organizzazione" + }, + "organizationProfile": { + "badge__automaticInvitation": "Inviti automatici", + "badge__automaticSuggestion": "Suggerimenti automatici", + "badge__manualInvitation": "Nessuna iscrizione automatica", + "badge__unverified": "Non verificato", + "createDomainPage": { + "subtitle": "Aggiungi il dominio da verificare. Gli utenti con indirizzi email presso questo dominio possono unirsi all'organizzazione automaticamente o richiedere di farlo.", + "title": "Aggiungi dominio" + }, + "invitePage": { + "detailsTitle__inviteFailed": "Gli inviti non possono essere inviati. Ci sono già inviti in sospeso per i seguenti indirizzi email: {{email_addresses}}.", + "formButtonPrimary__continue": "Invia inviti", + "selectDropdown__role": "Seleziona ruolo", + "subtitle": "Inserisci o incolla uno o più indirizzi email, separati da spazi o virgole.", + "successMessage": "Inviti inviati con successo", + "title": "Invita nuovi membri" + }, + "membersPage": { + "action__invite": "Invita", + "activeMembersTab": { + "menuAction__remove": "Rimuovi membro", + "tableHeader__actions": "", + "tableHeader__joined": "Unito", + "tableHeader__role": "Ruolo", + "tableHeader__user": "Utente" + }, + "detailsTitle__emptyRow": "Nessun membro da visualizzare", + "invitationsTab": { + "autoInvitations": { + "headerSubtitle": "Invita gli utenti collegando un dominio email con la tua organizzazione. Chiunque si registri con un dominio email corrispondente potrà unirsi all'organizzazione in qualsiasi momento.", + "headerTitle": "Inviti automatici", + "primaryButton": "Gestisci domini verificati" + }, + "table__emptyRow": "Nessun invito da visualizzare" + }, + "invitedMembersTab": { + "menuAction__revoke": "Revoca invito", + "tableHeader__invited": "Invitato" + }, + "requestsTab": { + "autoSuggestions": { + "headerSubtitle": "Gli utenti che si registrano con un dominio email corrispondente, potranno vedere un suggerimento per richiedere di unirsi alla tua organizzazione.", + "headerTitle": "Suggerimenti automatici", + "primaryButton": "Gestisci domini verificati" + }, + "menuAction__approve": "Approva", + "menuAction__reject": "Rifiuta", + "tableHeader__requested": "Accesso richiesto", + "table__emptyRow": "Nessuna richiesta da visualizzare" + }, + "start": { + "headerTitle__invitations": "Inviti", + "headerTitle__members": "Membri", + "headerTitle__requests": "Richieste" + } + }, + "navbar": { + "description": "Gestisci la tua organizzazione.", + "general": "Generale", + "members": "Membri", + "title": "Organizzazione" + }, + "profilePage": { + "dangerSection": { + "deleteOrganization": { + "actionDescription": "Digita \"{{organizationName}}\" di seguito per continuare.", + "messageLine1": "Sei sicuro di voler eliminare questa organizzazione?", + "messageLine2": "Questa azione è permanente e irreversibile.", + "successMessage": "Hai eliminato l'organizzazione.", + "title": "Elimina organizzazione" + }, + "leaveOrganization": { + "actionDescription": "Digita \"{{organizationName}}\" di seguito per continuare.", + "messageLine1": "Sei sicuro di voler lasciare questa organizzazione? Perderai l'accesso a questa organizzazione e alle sue applicazioni.", + "messageLine2": "Questa azione è permanente e irreversibile.", + "successMessage": "Hai lasciato l'organizzazione.", + "title": "Lascia organizzazione" + }, + "title": "Pericolo" + }, + "domainSection": { + "menuAction__manage": "Gestisci", + "menuAction__remove": "Elimina", + "menuAction__verify": "Verifica", + "primaryButton": "Aggiungi dominio", + "subtitle": "Permetti agli utenti di unirsi all'organizzazione automaticamente o richiedere di farlo basandosi su un dominio email verificato.", + "title": "Domini verificati" + }, + "successMessage": "L'organizzazione è stata aggiornata.", + "title": "Aggiorna profilo" + }, + "removeDomainPage": { + "messageLine1": "Il dominio email {{domain}} verrà rimosso.", + "messageLine2": "Gli utenti non potranno più unirsi all'organizzazione automaticamente dopo questa operazione.", + "successMessage": "{{domain}} è stato rimosso.", + "title": "Rimuovi dominio" + }, + "start": { + "headerTitle__general": "Generale", + "headerTitle__members": "Membri", + "profileSection": { + "primaryButton": "Aggiorna profilo", + "title": "Profilo organizzazione", + "uploadAction__title": "Logo" + } + }, + "verifiedDomainPage": { + "dangerTab": { + "calloutInfoLabel": "La rimozione di questo dominio influenzerà gli utenti invitati.", + "removeDomainActionLabel__remove": "Rimuovi dominio", + "removeDomainSubtitle": "Rimuovi questo dominio dai tuoi domini verificati", + "removeDomainTitle": "Rimuovi dominio" + }, + "enrollmentTab": { + "automaticInvitationOption__description": "Gli utenti sono automaticamente invitati a unirsi all'organizzazione quando si registrano e possono farlo in qualsiasi momento.", + "automaticInvitationOption__label": "Inviti automatici", + "automaticSuggestionOption__description": "Gli utenti ricevono un suggerimento per richiedere di unirsi, ma devono essere approvati da un amministratore prima di poter farlo.", + "automaticSuggestionOption__label": "Suggerimenti automatici", + "calloutInfoLabel": "La modifica della modalità di iscrizione influenzerà solo i nuovi utenti.", + "calloutInvitationCountLabel": "Inviti in sospeso inviati agli utenti: {{count}}", + "calloutSuggestionCountLabel": "Suggerimenti in sospeso inviati agli utenti: {{count}}", + "manualInvitationOption__description": "Gli utenti possono essere invitati manualmente all'organizzazione.", + "manualInvitationOption__label": "Nessuna iscrizione automatica", + "subtitle": "Scegli come gli utenti da questo dominio possono unirsi all'organizzazione." + }, + "start": { + "headerTitle__danger": "Pericolo", + "headerTitle__enrollment": "Opzioni di iscrizione" + }, + "subtitle": "Il dominio {{domain}} è ora verificato. Prosegui selezionando la modalità di iscrizione.", + "title": "Aggiorna {{domain}}" + }, + "verifyDomainPage": { + "formSubtitle": "Inserisci il codice di verifica inviato al tuo indirizzo email", + "formTitle": "Codice di verifica", + "resendButton": "Non hai ricevuto il codice? Invia di nuovo", + "subtitle": "Il dominio {{domainName}} deve essere verificato tramite email.", + "subtitleVerificationCodeScreen": "Un codice di verifica è stato inviato a {{emailAddress}}. Inserisci il codice per continuare.", + "title": "Verifica dominio" + } + }, + "organizationSwitcher": { + "action__createOrganization": "Crea organizzazione", + "action__invitationAccept": "Unisciti", + "action__manageOrganization": "Gestisci", + "action__suggestionsAccept": "Richiedi di unirti", + "notSelected": "Nessuna organizzazione selezionata", + "personalWorkspace": "Account personale", + "suggestionsAcceptedLabel": "In attesa di approvazione" + }, + "paginationButton__next": "Avanti", + "paginationButton__previous": "Indietro", + "paginationRowText__displaying": "Visualizzazione", + "paginationRowText__of": "di", + "signIn": { + "accountSwitcher": { + "action__addAccount": "Aggiungi account", + "action__signOutAll": "Disconnetti da tutti gli account", + "subtitle": "Seleziona l'account con cui desideri continuare.", + "title": "Scegli un account" + }, + "alternativeMethods": { + "actionLink": "Ottieni aiuto", + "actionText": "Non ne hai nessuno di questi?", + "blockButton__backupCode": "Usa un codice di backup", + "blockButton__emailCode": "Invia codice via email a {{identifier}}", + "blockButton__emailLink": "Invia link via email a {{identifier}}", + "blockButton__passkey": "Accedi con il tuo passkey", + "blockButton__password": "Accedi con la tua password", + "blockButton__phoneCode": "Invia codice SMS a {{identifier}}", + "blockButton__totp": "Usa la tua app di autenticazione", + "getHelp": { + "blockButton__emailSupport": "Supporto via email", + "content": "Se riscontri difficoltà nell'accesso al tuo account, inviaci un'email e lavoreremo con te per ripristinare l'accesso il prima possibile.", + "title": "Ottieni aiuto" + }, + "subtitle": "Problemi? Puoi utilizzare uno di questi metodi per accedere.", + "title": "Usa un altro metodo" + }, + "backupCodeMfa": { + "subtitle": "Il tuo codice di backup è quello che hai ricevuto durante la configurazione dell'autenticazione a due fattori.", + "title": "Inserisci un codice di backup" + }, + "emailCode": { + "formTitle": "Codice di verifica", + "resendButton": "Non hai ricevuto il codice? Rispedisci", + "subtitle": "per continuare su {{applicationName}}", + "title": "Controlla la tua email" + }, + "emailLink": { + "expired": { + "subtitle": "Torna alla scheda originale per continuare.", + "title": "Questo link di verifica è scaduto" + }, + "failed": { + "subtitle": "Torna alla scheda originale per continuare.", + "title": "Questo link di verifica non è valido" + }, + "formSubtitle": "Utilizza il link di verifica inviato alla tua email", + "formTitle": "Link di verifica", + "loading": { + "subtitle": "Verrai reindirizzato presto", + "title": "Accesso in corso..." + }, + "resendButton": "Non hai ricevuto il link? Rispedisci", + "subtitle": "per continuare su {{applicationName}}", + "title": "Controlla la tua email", + "unusedTab": { + "title": "Puoi chiudere questa scheda" + }, + "verified": { + "subtitle": "Verrai reindirizzato presto", + "title": "Accesso effettuato con successo" + }, + "verifiedSwitchTab": { + "subtitle": "Torna alla scheda originale per continuare", + "subtitleNewTab": "Torna alla scheda appena aperta per continuare", + "titleNewTab": "Accesso effettuato su un'altra scheda" + } + }, + "forgotPassword": { + "formTitle": "Codice di reset della password", + "resendButton": "Non hai ricevuto il codice? Rispedisci", + "subtitle": "per reimpostare la tua password", + "subtitle_email": "Inserisci prima il codice inviato al tuo indirizzo email", + "subtitle_phone": "Inserisci prima il codice inviato al tuo telefono", + "title": "Reimposta la password" + }, + "forgotPasswordAlternativeMethods": { + "blockButton__resetPassword": "Reimposta la tua password", + "label__alternativeMethods": "Oppure accedi con un altro metodo", + "title": "Password dimenticata?" + }, + "noAvailableMethods": { + "message": "Impossibile procedere con l'accesso. Non è disponibile alcun fattore di autenticazione.", + "subtitle": "Si è verificato un errore", + "title": "Impossibile accedere" + }, + "passkey": { + "subtitle": "L'utilizzo del tuo passkey conferma la tua identità. Il tuo dispositivo potrebbe richiedere l'impronta digitale, il riconoscimento facciale o il blocco dello schermo.", + "title": "Usa il tuo passkey" + }, + "password": { + "actionLink": "Usa un altro metodo", + "subtitle": "Inserisci la password associata al tuo account", + "title": "Inserisci la tua password" + }, + "passwordPwned": { + "title": "Password compromessa" + }, + "phoneCode": { + "formTitle": "Codice di verifica", + "resendButton": "Non hai ricevuto il codice? Rispedisci", + "subtitle": "per continuare su {{applicationName}}", + "title": "Controlla il tuo telefono" + }, + "phoneCodeMfa": { + "formTitle": "Codice di verifica", + "resendButton": "Non hai ricevuto il codice? Rispedisci", + "subtitle": "Per continuare, inserisci il codice di verifica inviato al tuo telefono", + "title": "Controlla il tuo telefono" + }, + "resetPassword": { + "formButtonPrimary": "Reimposta password", + "requiredMessage": "Per motivi di sicurezza, è necessario reimpostare la tua password.", + "successMessage": "La tua password è stata cambiata con successo. Ti stiamo accedendo, attendi un momento.", + "title": "Imposta una nuova password" + }, + "resetPasswordMfa": { + "detailsLabel": "Dobbiamo verificare la tua identità prima di reimpostare la tua password." + }, + "start": { + "actionLink": "Registrati", + "actionLink__use_email": "Usa l'email", + "actionLink__use_email_username": "Usa l'email o il nome utente", + "actionLink__use_passkey": "Usa il passkey invece", + "actionLink__use_phone": "Usa il telefono", + "actionLink__use_username": "Usa il nome utente", + "actionText": "Non hai un account?", + "subtitle": "Bentornato! Effettua l'accesso per continuare", + "title": "Accedi a {{applicationName}}" + }, + "totpMfa": { + "formTitle": "Codice di verifica", + "subtitle": "Per continuare, inserisci il codice di verifica generato dalla tua app di autenticazione", + "title": "Verifica a due passaggi" + } + }, + "signInEnterPasswordTitle": "Inserisci la tua password", + "signUp": { + "continue": { + "actionLink": "Accedi", + "actionText": "Hai già un account?", + "subtitle": "Completa i dettagli rimanenti per continuare", + "title": "Completa i campi mancanti" + }, + "emailCode": { + "formSubtitle": "Inserisci il codice di verifica inviato al tuo indirizzo email", + "formTitle": "Codice di verifica", + "resendButton": "Non hai ricevuto il codice? Rispedisci", + "subtitle": "Inserisci il codice di verifica inviato alla tua email", + "title": "Verifica la tua email" + }, + "emailLink": { + "formSubtitle": "Utilizza il link di verifica inviato al tuo indirizzo email", + "formTitle": "Link di verifica", + "loading": { + "title": "Registrazione in corso..." + }, + "resendButton": "Non hai ricevuto il link? Rispedisci", + "subtitle": "per continuare su {{applicationName}}", + "title": "Verifica la tua email", + "verified": { + "title": "Registrazione completata" + }, + "verifiedSwitchTab": { + "subtitle": "Torna alla scheda appena aperta per continuare", + "subtitleNewTab": "Torna alla scheda precedente per continuare", + "title": "Email verificata con successo" + } + }, + "phoneCode": { + "formSubtitle": "Inserisci il codice di verifica inviato al tuo numero di telefono", + "formTitle": "Codice di verifica", + "resendButton": "Non hai ricevuto il codice? Rispedisci", + "subtitle": "Inserisci il codice di verifica inviato al tuo telefono", + "title": "Verifica il tuo telefono" + }, + "start": { + "actionLink": "Accedi", + "actionText": "Hai già un account?", + "subtitle": "Benvenuto! Completa i dettagli per iniziare", + "title": "Crea il tuo account" + } + }, + "socialButtonsBlockButton": "Continua con {{provider|titleize}}", + "unstable__errors": { + "captcha_invalid": "Registrazione non riuscita a causa di validazioni di sicurezza fallite. Si prega di aggiornare la pagina e riprovare o contattare il supporto per ulteriore assistenza.", + "captcha_unavailable": "Registrazione non riuscita a causa di validazione bot fallita. Si prega di aggiornare la pagina e riprovare o contattare il supporto per ulteriore assistenza.", + "form_code_incorrect": "", + "form_identifier_exists": "", + "form_identifier_exists__email_address": "Questo indirizzo email è già in uso. Si prega di provare un altro.", + "form_identifier_exists__phone_number": "Questo numero di telefono è già in uso. Si prega di provare un altro.", + "form_identifier_exists__username": "Questo nome utente è già in uso. Si prega di provare un altro.", + "form_identifier_not_found": "", + "form_param_format_invalid": "", + "form_param_format_invalid__email_address": "L'indirizzo email deve essere un indirizzo email valido.", + "form_param_format_invalid__phone_number": "Il numero di telefono deve essere in un formato internazionale valido.", + "form_param_max_length_exceeded__first_name": "Il nome non deve superare i 256 caratteri.", + "form_param_max_length_exceeded__last_name": "Il cognome non deve superare i 256 caratteri.", + "form_param_max_length_exceeded__name": "Il nome non deve superare i 256 caratteri.", + "form_param_nil": "", + "form_password_incorrect": "", + "form_password_length_too_short": "", + "form_password_not_strong_enough": "La tua password non è abbastanza sicura.", + "form_password_pwned": "Questa password è stata trovata in una violazione e non può essere utilizzata, si prega di provare un'altra password.", + "form_password_pwned__sign_in": "Questa password è stata trovata in una violazione e non può essere utilizzata, si prega di reimpostare la password.", + "form_password_size_in_bytes_exceeded": "La tua password ha superato il numero massimo di byte consentito, si prega di accorciarla o rimuovere alcuni caratteri speciali.", + "form_password_validation_failed": "Password incorretta.", + "form_username_invalid_character": "", + "form_username_invalid_length": "", + "identification_deletion_failed": "Non puoi eliminare la tua ultima identificazione.", + "not_allowed_access": "", + "passkey_already_exists": "Un passkey è già registrato su questo dispositivo.", + "passkey_not_supported": "I passkey non sono supportati su questo dispositivo.", + "passkey_pa_not_supported": "La registrazione richiede un autenticatore di piattaforma ma il dispositivo non lo supporta.", + "passkey_registration_cancelled": "La registrazione del passkey è stata annullata o è scaduta.", + "passkey_retrieval_cancelled": "La verifica del passkey è stata annullata o è scaduta.", + "passwordComplexity": { + "maximumLength": "meno di {{length}} caratteri", + "minimumLength": "{{length}} o più caratteri", + "requireLowercase": "una lettera minuscola", + "requireNumbers": "un numero", + "requireSpecialCharacter": "un carattere speciale", + "requireUppercase": "una lettera maiuscola", + "sentencePrefix": "La tua password deve contenere" + }, + "phone_number_exists": "Questo numero di telefono è già in uso. Si prega di provare un altro.", + "zxcvbn": { + "couldBeStronger": "La tua password funziona, ma potrebbe essere più sicura. Prova ad aggiungere più caratteri.", + "goodPassword": "La tua password soddisfa tutti i requisiti necessari.", + "notEnough": "La tua password non è abbastanza sicura.", + "suggestions": { + "allUppercase": "Maiuscolizzare alcune lettere, ma non tutte.", + "anotherWord": "Aggiungi più parole meno comuni.", + "associatedYears": "Evita anni associati a te.", + "capitalization": "Maiuscolizzare più della prima lettera.", + "dates": "Evita date e anni associati a te.", + "l33t": "Evita sostituzioni di lettere prevedibili come '@' per 'a'.", + "longerKeyboardPattern": "Usa pattern di tastiera più lunghi e cambia direzione di scrittura più volte.", + "noNeed": "Puoi creare password sicure senza simboli, numeri o lettere maiuscole.", + "pwned": "Se usi questa password altrove, dovresti cambiarla.", + "recentYears": "Evita anni recenti.", + "repeated": "Evita parole e caratteri ripetuti.", + "reverseWords": "Evita inversioni di parole comuni.", + "sequences": "Evita sequenze di caratteri comuni.", + "useWords": "Usa più parole, ma evita frasi comuni." + }, + "warnings": { + "common": "Questa è una password comunemente usata.", + "commonNames": "Nomi e cognomi comuni sono facili da indovinare.", + "dates": "Le date sono facili da indovinare.", + "extendedRepeat": "Pattern di caratteri ripetuti come \"abcabcabc\" sono facili da indovinare.", + "keyPattern": "Pattern di tastiera corti sono facili da indovinare.", + "namesByThemselves": "Nomi o cognomi singoli sono facili da indovinare.", + "pwned": "La tua password è stata esposta da una violazione di dati su Internet.", + "recentYears": "Gli anni recenti sono facili da indovinare.", + "sequences": "Sequenze di caratteri comuni come \"abc\" sono facili da indovinare.", + "similarToCommon": "Questo è simile a una password comunemente usata.", + "simpleRepeat": "Caratteri ripetuti come \"aaa\" sono facili da indovinare.", + "straightRow": "File di tasti consecutivi sulla tastiera sono facili da indovinare.", + "topHundred": "Questa è una password frequentemente usata.", + "topTen": "Questa è una password molto usata.", + "userInputs": "Non dovrebbero esserci dati personali o relativi alla pagina.", + "wordByItself": "Le singole parole sono facili da indovinare." + } + } + }, + "userButton": { + "action__addAccount": "Aggiungi account", + "action__manageAccount": "Gestisci account", + "action__signOut": "Disconnetti", + "action__signOutAll": "Disconnetti da tutti gli account" + }, + "userProfile": { + "backupCodePage": { + "actionLabel__copied": "Copiato!", + "actionLabel__copy": "Copia tutto", + "actionLabel__download": "Scarica .txt", + "actionLabel__print": "Stampa", + "infoText1": "I codici di backup saranno abilitati per questo account.", + "infoText2": "Mantieni segreti i codici di backup e conservali in modo sicuro. Puoi rigenerare i codici di backup se sospetti che siano stati compromessi.", + "subtitle__codelist": "Conservali in modo sicuro e mantienili segreti.", + "successMessage": "I codici di backup sono ora abilitati. Puoi utilizzarne uno per accedere al tuo account, nel caso in cui perdessi l'accesso al tuo dispositivo di autenticazione. Ogni codice può essere utilizzato una sola volta.", + "successSubtitle": "Puoi utilizzarne uno per accedere al tuo account, nel caso in cui perdessi l'accesso al tuo dispositivo di autenticazione.", + "title": "Aggiungi verifica del codice di backup", + "title__codelist": "Codici di backup" + }, + "connectedAccountPage": { + "formHint": "Seleziona un provider per collegare il tuo account.", + "formHint__noAccounts": "Non ci sono provider di account esterni disponibili.", + "removeResource": { + "messageLine1": "{{identifier}} sarà rimosso da questo account.", + "messageLine2": "Non potrai più utilizzare questo account collegato e le relative funzionalità non funzioneranno più.", + "successMessage": "{{connectedAccount}} è stato rimosso dal tuo account.", + "title": "Rimuovi account collegato" + }, + "socialButtonsBlockButton": "{{provider|titleize}}", + "successMessage": "Il provider è stato aggiunto al tuo account", + "title": "Aggiungi account collegato" + }, + "deletePage": { + "actionDescription": "Digita \"Elimina account\" di seguito per continuare.", + "confirm": "Elimina account", + "messageLine1": "Sei sicuro di voler eliminare il tuo account?", + "messageLine2": "Questa azione è permanente e irreversibile.", + "title": "Elimina account" + }, + "emailAddressPage": { + "emailCode": { + "formHint": "Verrà inviata un'email contenente un codice di verifica a questo indirizzo email.", + "formSubtitle": "Inserisci il codice di verifica inviato a {{identifier}}", + "formTitle": "Codice di verifica", + "resendButton": "Non hai ricevuto un codice? Richiedi di nuovo", + "successMessage": "L'email {{identifier}} è stata aggiunta al tuo account." + }, + "emailLink": { + "formHint": "Verrà inviata un'email contenente un link di verifica a questo indirizzo email.", + "formSubtitle": "Clicca sul link di verifica nell'email inviata a {{identifier}}", + "formTitle": "Link di verifica", + "resendButton": "Non hai ricevuto un link? Richiedi di nuovo", + "successMessage": "L'email {{identifier}} è stata aggiunta al tuo account." + }, + "removeResource": { + "messageLine1": "{{identifier}} sarà rimosso da questo account.", + "messageLine2": "Non potrai più accedere utilizzando questo indirizzo email.", + "successMessage": "{{emailAddress}} è stato rimosso dal tuo account.", + "title": "Rimuovi indirizzo email" + }, + "title": "Aggiungi indirizzo email", + "verifyTitle": "Verifica indirizzo email" + }, + "formButtonPrimary__add": "Aggiungi", + "formButtonPrimary__continue": "Continua", + "formButtonPrimary__finish": "Fine", + "formButtonPrimary__remove": "Rimuovi", + "formButtonPrimary__save": "Salva", + "formButtonReset": "Annulla", + "mfaPage": { + "formHint": "Seleziona un metodo da aggiungere.", + "title": "Aggiungi verifica a due passaggi" + }, + "mfaPhoneCodePage": { + "backButton": "Usa numero esistente", + "primaryButton__addPhoneNumber": "Aggiungi numero di telefono", + "removeResource": { + "messageLine1": "{{identifier}} non riceverà più codici di verifica durante l'accesso.", + "messageLine2": "Il tuo account potrebbe non essere più sicuro. Sei sicuro di voler continuare?", + "successMessage": "La verifica a due passaggi tramite codice SMS è stata rimossa per {{mfaPhoneCode}}", + "title": "Rimuovi verifica a due passaggi" + }, + "subtitle__availablePhoneNumbers": "Seleziona un numero di telefono esistente per registrarti alla verifica a due passaggi tramite codice SMS o aggiungine uno nuovo.", + "subtitle__unavailablePhoneNumbers": "Non ci sono numeri di telefono disponibili per registrarsi alla verifica a due passaggi tramite codice SMS, aggiungine uno nuovo.", + "successMessage1": "Durante l'accesso, dovrai inserire un codice di verifica inviato a questo numero di telefono come passaggio aggiuntivo.", + "successMessage2": "Salva questi codici di backup e conservali in un posto sicuro. Se perdi l'accesso al tuo dispositivo di autenticazione, puoi utilizzare i codici di backup per accedere.", + "successTitle": "Verifica tramite codice SMS abilitata", + "title": "Aggiungi verifica tramite codice SMS" + }, + "mfaTOTPPage": { + "authenticatorApp": { + "buttonAbleToScan__nonPrimary": "Scansiona invece il codice QR", + "buttonUnableToScan__nonPrimary": "Non puoi scansionare il codice QR?", + "infoText__ableToScan": "Configura un nuovo metodo di accesso nella tua app di autenticazione e scannerizza il seguente codice QR per collegarlo al tuo account.", + "infoText__unableToScan": "Configura un nuovo metodo di accesso nella tua app di autenticazione e inserisci la chiave fornita di seguito.", + "inputLabel__unableToScan1": "Assicurati che le password basate sul tempo o monouso siano abilitate, quindi completa il collegamento del tuo account.", + "inputLabel__unableToScan2": "In alternativa, se il tuo autenticatore supporta gli URI TOTP, puoi anche copiare l'URI completo." + }, + "removeResource": { + "messageLine1": "I codici di verifica da questo autenticatore non saranno più richiesti durante l'accesso.", + "messageLine2": "Il tuo account potrebbe non essere più sicuro. Sei sicuro di voler continuare?", + "successMessage": "La verifica a due passaggi tramite app di autenticazione è stata rimossa.", + "title": "Rimuovi verifica a due passaggi" + }, + "successMessage": "La verifica a due passaggi è ora abilitata. Durante l'accesso, dovrai inserire un codice di verifica da questo autenticatore come passaggio aggiuntivo.", + "title": "Aggiungi app di autenticazione", + "verifySubtitle": "Inserisci il codice di verifica generato dal tuo autenticatore", + "verifyTitle": "Codice di verifica" + }, + "mobileButton__menu": "Menu", + "navbar": { + "account": "Profilo", + "description": "Gestisci le informazioni del tuo account.", + "security": "Sicurezza", + "title": "Account" + }, + "passkeyScreen": { + "removeResource": { + "messageLine1": "{{name}} sarà rimosso da questo account.", + "title": "Rimuovi passkey" + }, + "subtitle__rename": "Puoi cambiare il nome del passkey per trovarlo più facilmente.", + "title__rename": "Rinomina Passkey" + }, + "passwordPage": { + "checkboxInfoText__signOutOfOtherSessions": "Si consiglia di disconnettersi da tutti gli altri dispositivi che potrebbero aver utilizzato la tua vecchia password.", + "readonly": "Attualmente la tua password non può essere modificata perché puoi accedere solo tramite la connessione aziendale.", + "successMessage__set": "La tua password è stata impostata.", + "successMessage__signOutOfOtherSessions": "Tutti gli altri dispositivi sono stati disconnessi.", + "successMessage__update": "La tua password è stata aggiornata.", + "title__set": "Imposta password", + "title__update": "Aggiorna password" + }, + "phoneNumberPage": { + "infoText": "Un messaggio di testo contenente un codice di verifica verrà inviato a questo numero di telefono. Potrebbero essere applicate tariffe per messaggi e dati.", + "removeResource": { + "messageLine1": "{{identifier}} sarà rimosso da questo account.", + "messageLine2": "Non potrai più accedere utilizzando questo numero di telefono.", + "successMessage": "{{phoneNumber}} è stato rimosso dal tuo account.", + "title": "Rimuovi numero di telefono" + }, + "successMessage": "{{identifier}} è stato aggiunto al tuo account.", + "title": "Aggiungi numero di telefono", + "verifySubtitle": "Inserisci il codice di verifica inviato a {{identifier}}", + "verifyTitle": "Verifica numero di telefono" + }, + "profilePage": { + "fileDropAreaHint": "Dimensione consigliata 1:1, fino a 10MB.", + "imageFormDestructiveActionSubtitle": "Rimuovi", + "imageFormSubtitle": "Carica", + "imageFormTitle": "Immagine del profilo", + "readonly": "Le informazioni del tuo profilo sono state fornite dalla connessione aziendale e non possono essere modificate.", + "successMessage": "Il tuo profilo è stato aggiornato.", + "title": "Aggiorna profilo" + }, + "start": { + "activeDevicesSection": { + "destructiveAction": "Disconnetti dal dispositivo", + "title": "Dispositivi attivi" + }, + "connectedAccountsSection": { + "actionLabel__connectionFailed": "Riprova", + "actionLabel__reauthorize": "Autorizza ora", + "destructiveActionTitle": "Rimuovi", + "primaryButton": "Collega account", + "subtitle__reauthorize": "Gli ambiti richiesti sono stati aggiornati e potresti riscontrare funzionalità limitate. Si prega di ri-autorizzare questa applicazione per evitare problemi", + "title": "Account collegati" + }, + "dangerSection": { + "deleteAccountButton": "Elimina account", + "title": "Elimina account" + }, + "emailAddressesSection": { + "destructiveAction": "Rimuovi email", + "detailsAction__nonPrimary": "Imposta come primaria", + "detailsAction__primary": "Completa la verifica", + "detailsAction__unverified": "Verifica", + "primaryButton": "Aggiungi indirizzo email", + "title": "Indirizzi email" + }, + "enterpriseAccountsSection": { + "title": "Account aziendali" + }, + "headerTitle__account": "Dettagli del profilo", + "headerTitle__security": "Sicurezza", + "mfaSection": { + "backupCodes": { + "actionLabel__regenerate": "Rigenera", + "headerTitle": "Codici di backup", + "subtitle__regenerate": "Ottieni un nuovo set di codici di backup sicuri. I codici di backup precedenti saranno eliminati e non potranno essere utilizzati.", + "title__regenerate": "Rigenera codici di backup" + }, + "phoneCode": { + "actionLabel__setDefault": "Imposta come predefinito", + "destructiveActionLabel": "Rimuovi" + }, + "primaryButton": "Aggiungi verifica a due passaggi", + "title": "Verifica a due passaggi", + "totp": { + "destructiveActionTitle": "Rimuovi", + "headerTitle": "Applicazione autenticatore" + } + }, + "passkeysSection": { + "menuAction__destructive": "Rimuovi", + "menuAction__rename": "Rinomina", + "title": "Passkeys" + }, + "passwordSection": { + "primaryButton__setPassword": "Imposta password", + "primaryButton__updatePassword": "Aggiorna password", + "title": "Password" + }, + "phoneNumbersSection": { + "destructiveAction": "Rimuovi numero di telefono", + "detailsAction__nonPrimary": "Imposta come primario", + "detailsAction__primary": "Completa la verifica", + "detailsAction__unverified": "Verifica numero di telefono", + "primaryButton": "Aggiungi numero di telefono", + "title": "Numeri di telefono" + }, + "profileSection": { + "primaryButton": "Aggiorna profilo", + "title": "Profilo" + }, + "usernameSection": { + "primaryButton__setUsername": "Imposta username", + "primaryButton__updateUsername": "Aggiorna username", + "title": "Username" + }, + "web3WalletsSection": { + "destructiveAction": "Rimuovi portafoglio", + "primaryButton": "Portafogli Web3", + "title": "Portafogli Web3" + } + }, + "usernamePage": { + "successMessage": "Il tuo nome utente è stato aggiornato.", + "title__set": "Imposta nome utente", + "title__update": "Aggiorna nome utente" + }, + "web3WalletPage": { + "removeResource": { + "messageLine1": "{{identifier}} sarà rimosso da questo account.", + "messageLine2": "Non potrai più accedere utilizzando questo portafoglio web3.", + "successMessage": "{{web3Wallet}} è stato rimosso dal tuo account.", + "title": "Rimuovi portafoglio web3" + }, + "subtitle__availableWallets": "Seleziona un portafoglio web3 per connetterti al tuo account.", + "subtitle__unavailableWallets": "Non ci sono portafogli web3 disponibili.", + "successMessage": "Il portafoglio è stato aggiunto al tuo account.", + "title": "Aggiungi portafoglio web3" + } + } +} diff --git a/locales/it-IT/common.json b/locales/it-IT/common.json index 5208e87ebc7f2..aa733c32ed984 100644 --- a/locales/it-IT/common.json +++ b/locales/it-IT/common.json @@ -160,6 +160,7 @@ "newVersion": "Nuova versione disponibile: {{version}}" }, "userPanel": { + "anonymousNickName": "Utente Anonimo", "billing": "Gestione fatturazione", "defaultNickname": "Utente Community", "discord": "Supporto della community", diff --git a/locales/it-IT/error.json b/locales/it-IT/error.json index 7b67e5a0f3de5..c805656c03a9a 100644 --- a/locales/it-IT/error.json +++ b/locales/it-IT/error.json @@ -1,4 +1,11 @@ { + "clerkAuth": { + "loginSuccess": { + "action": "Continua la sessione", + "desc": "{{greeting}}, Sono felice di poterti aiutare ancora. Continuiamo a parlare di quello di cui stavamo discutendo.", + "title": "Bentornato, {{nickName}}" + } + }, "error": { "backHome": "Torna alla homepage", "desc": "Prova di nuovo più tardi, o torna al mondo conosciuto", @@ -54,6 +61,7 @@ "InvalidAnthropicAPIKey": "La chiave API Anthropic non è valida o è vuota. Si prega di controllare la chiave API Anthropic e riprovare.", "InvalidAzureAPIKey": "Chiave API Azure non corretta o vuota, controlla la chiave API Azure e riprova", "InvalidBedrockCredentials": "Autenticazione Bedrock non riuscita, controlla AccessKeyId/SecretAccessKey e riprova", + "InvalidClerkUser": "Spiacenti, al momento non hai effettuato l'accesso. Per favore, effettua l'accesso o registrati prima di continuare.", "InvalidGoogleAPIKey": "Chiave API Google non corretta o vuota, controlla la chiave API Google e riprova", "InvalidGroqAPIKey": "Chiave API Groq non valida o vuota, controlla la chiave API Groq e riprova", "InvalidMinimaxAPIKey": "Chiave API Minimax non valida o vuota, controllare la chiave API Minimax e riprovare", diff --git a/locales/ja-JP/auth.json b/locales/ja-JP/auth.json new file mode 100644 index 0000000000000..35c0e6535c269 --- /dev/null +++ b/locales/ja-JP/auth.json @@ -0,0 +1,6 @@ +{ + "login": "ログイン", + "loginOrSignup": "ログイン / 登録", + "signout": "ログアウト", + "signup": "サインアップ" +} diff --git a/locales/ja-JP/clerk.json b/locales/ja-JP/clerk.json new file mode 100644 index 0000000000000..949e6f3cd23d4 --- /dev/null +++ b/locales/ja-JP/clerk.json @@ -0,0 +1,769 @@ +{ + "backButton": "戻る", + "badge__default": "デフォルト", + "badge__otherImpersonatorDevice": "他のなりすましデバイス", + "badge__primary": "プライマリ", + "badge__requiresAction": "アクションが必要", + "badge__thisDevice": "このデバイス", + "badge__unverified": "未確認", + "badge__userDevice": "ユーザーデバイス", + "badge__you": "あなた", + "createOrganization": { + "formButtonSubmit": "組織を作成", + "invitePage": { + "formButtonReset": "スキップ" + }, + "title": "組織を作成" + }, + "dates": { + "lastDay": "昨日 {{ date | timeString('ja-JP') }}", + "next6Days": "{{ date | weekday('ja-JP','long') }} {{ date | timeString('ja-JP') }}", + "nextDay": "明日 {{ date | timeString('ja-JP') }}", + "numeric": "{{ date | numeric('ja-JP') }}", + "previous6Days": "先週の{{ date | weekday('ja-JP','long') }} {{ date | timeString('ja-JP') }}", + "sameDay": "今日 {{ date | timeString('ja-JP') }}" + }, + "dividerText": "または", + "footerActionLink__useAnotherMethod": "他の方法を使用", + "footerPageLink__help": "ヘルプ", + "footerPageLink__privacy": "プライバシー", + "footerPageLink__terms": "利用規約", + "formButtonPrimary": "続行", + "formButtonPrimary__verify": "確認", + "formFieldAction__forgotPassword": "パスワードを忘れましたか?", + "formFieldError__matchingPasswords": "パスワードが一致しています。", + "formFieldError__notMatchingPasswords": "パスワードが一致しません。", + "formFieldError__verificationLinkExpired": "確認リンクの有効期限が切れています。新しいリンクをリクエストしてください。", + "formFieldHintText__optional": "任意", + "formFieldHintText__slug": "スラッグはユニークで人間が読めるIDです。URLでよく使用されます。", + "formFieldInputPlaceholder__backupCode": "", + "formFieldInputPlaceholder__confirmDeletionUserAccount": "アカウントを削除", + "formFieldInputPlaceholder__emailAddress": "", + "formFieldInputPlaceholder__emailAddress_username": "", + "formFieldInputPlaceholder__emailAddresses": "example@email.com, example2@email.com", + "formFieldInputPlaceholder__firstName": "", + "formFieldInputPlaceholder__lastName": "", + "formFieldInputPlaceholder__organizationDomain": "", + "formFieldInputPlaceholder__organizationDomainEmailAddress": "", + "formFieldInputPlaceholder__organizationName": "", + "formFieldInputPlaceholder__organizationSlug": "my-org", + "formFieldInputPlaceholder__password": "", + "formFieldInputPlaceholder__phoneNumber": "", + "formFieldInputPlaceholder__username": "", + "formFieldLabel__automaticInvitations": "このドメインの自動招待を有効にする", + "formFieldLabel__backupCode": "バックアップコード", + "formFieldLabel__confirmDeletion": "確認", + "formFieldLabel__confirmPassword": "パスワードを確認", + "formFieldLabel__currentPassword": "現在のパスワード", + "formFieldLabel__emailAddress": "メールアドレス", + "formFieldLabel__emailAddress_username": "メールアドレスまたはユーザー名", + "formFieldLabel__emailAddresses": "メールアドレス", + "formFieldLabel__firstName": "名", + "formFieldLabel__lastName": "姓", + "formFieldLabel__newPassword": "新しいパスワード", + "formFieldLabel__organizationDomain": "ドメイン", + "formFieldLabel__organizationDomainDeletePending": "保留中の招待と提案を削除", + "formFieldLabel__organizationDomainEmailAddress": "検証メールアドレス", + "formFieldLabel__organizationDomainEmailAddressDescription": "このドメインの下でコードを受信してこのドメインを確認するためのメールアドレスを入力してください。", + "formFieldLabel__organizationName": "名前", + "formFieldLabel__organizationSlug": "スラッグ", + "formFieldLabel__passkeyName": "パスキーの名前", + "formFieldLabel__password": "パスワード", + "formFieldLabel__phoneNumber": "電話番号", + "formFieldLabel__role": "役割", + "formFieldLabel__signOutOfOtherSessions": "他のデバイスからサインアウト", + "formFieldLabel__username": "ユーザー名", + "impersonationFab": { + "action__signOut": "サインアウト", + "title": "{{identifier}} としてサインインしています" + }, + "locale": "ja-JP", + "maintenanceMode": "現在、メンテナンス中ですが、心配しないでください。数分以内に完了するはずです。", + "membershipRole__admin": "管理者", + "membershipRole__basicMember": "メンバー", + "membershipRole__guestMember": "ゲスト", + "organizationList": { + "action__createOrganization": "組織を作成", + "action__invitationAccept": "参加する", + "action__suggestionsAccept": "参加リクエスト", + "createOrganization": "組織を作成", + "invitationAcceptedLabel": "参加済み", + "subtitle": "{{applicationName}} を続行するため", + "suggestionsAcceptedLabel": "承認待ち", + "title": "アカウントを選択", + "titleWithoutPersonal": "組織を選択" + }, + "organizationProfile": { + "badge__automaticInvitation": "自動招待", + "badge__automaticSuggestion": "自動提案", + "badge__manualInvitation": "自動登録なし", + "badge__unverified": "未確認", + "createDomainPage": { + "subtitle": "ドメインを追加して確認してください。このドメインのメールアドレスを持つユーザーは、組織に自動的に参加するか、参加をリクエストできます。", + "title": "ドメインを追加" + }, + "invitePage": { + "detailsTitle__inviteFailed": "招待状を送信できませんでした。次のメールアドレスには既に保留中の招待状があります:{{email_addresses}}。", + "formButtonPrimary__continue": "招待状を送信", + "selectDropdown__role": "役割を選択", + "subtitle": "1つ以上のメールアドレスを入力または貼り付けてください。スペースやカンマで区切ってください。", + "successMessage": "招待状が正常に送信されました", + "title": "新しいメンバーを招待" + }, + "membersPage": { + "action__invite": "招待", + "activeMembersTab": { + "menuAction__remove": "メンバーを削除", + "tableHeader__actions": "アクション", + "tableHeader__joined": "参加日", + "tableHeader__role": "役割", + "tableHeader__user": "ユーザー" + }, + "detailsTitle__emptyRow": "表示するメンバーはありません", + "invitationsTab": { + "autoInvitations": { + "headerSubtitle": "組織とメールドメインを接続してユーザーを招待します。一致するメールドメインでサインアップしたユーザーはいつでも組織に参加できます。", + "headerTitle": "自動招待", + "primaryButton": "確認済みドメインを管理" + }, + "table__emptyRow": "表示する招待状はありません" + }, + "invitedMembersTab": { + "menuAction__revoke": "招待を取り消す", + "tableHeader__invited": "招待中" + }, + "requestsTab": { + "autoSuggestions": { + "headerSubtitle": "一致するメールドメインでサインアップしたユーザーは、組織に参加をリクエストする提案を見ることができます。", + "headerTitle": "自動提案", + "primaryButton": "確認済みドメインを管理" + }, + "menuAction__approve": "承認", + "menuAction__reject": "拒否", + "tableHeader__requested": "リクエスト済み", + "table__emptyRow": "表示するリクエストはありません" + }, + "start": { + "headerTitle__invitations": "招待状", + "headerTitle__members": "メンバー", + "headerTitle__requests": "リクエスト" + } + }, + "navbar": { + "description": "組織を管理します", + "general": "一般", + "members": "メンバー", + "title": "組織" + }, + "profilePage": { + "dangerSection": { + "deleteOrganization": { + "actionDescription": "{{organizationName}} を入力して続行してください。", + "messageLine1": "この組織を削除してもよろしいですか?", + "messageLine2": "この操作は取り消せません。", + "successMessage": "組織を削除しました", + "title": "組織を削除" + }, + "leaveOrganization": { + "actionDescription": "{{organizationName}} を入力して続行してください。", + "messageLine1": "この組織を退出してもよろしいですか?", + "messageLine2": "この操作は取り消せません。", + "successMessage": "組織を退出しました", + "title": "組織を退出" + }, + "title": "危険" + }, + "domainSection": { + "menuAction__manage": "管理", + "menuAction__remove": "削除", + "menuAction__verify": "確認", + "primaryButton": "ドメインを追加", + "subtitle": "確認済みメールドメインに基づいてユーザーが組織に自動的に参加するか、参加をリクエストできるようにします。", + "title": "確認済みドメイン" + }, + "successMessage": "組織が更新されました", + "title": "プロフィールを更新" + }, + "removeDomainPage": { + "messageLine1": "{{domain}} のメールドメインが削除されます。", + "messageLine2": "この後、ユーザーは組織に自動的に参加できなくなります。", + "successMessage": "{{domain}} が削除されました", + "title": "ドメインを削除" + }, + "start": { + "headerTitle__general": "一般", + "headerTitle__members": "メンバー", + "profileSection": { + "primaryButton": "プロフィールを更新", + "title": "組織プロフィール", + "uploadAction__title": "ロゴをアップロード" + } + }, + "verifiedDomainPage": { + "dangerTab": { + "calloutInfoLabel": "このドメインを削除すると招待中のユーザーに影響します", + "removeDomainActionLabel__remove": "ドメインを削除", + "removeDomainSubtitle": "このドメインを確認済みドメインから削除します", + "removeDomainTitle": "ドメインを削除" + }, + "enrollmentTab": { + "automaticInvitationOption__description": "ユーザーはサインアップ時に組織に自動的に招待され、いつでも参加できます。", + "automaticInvitationOption__label": "自動招待", + "automaticSuggestionOption__description": "ユーザーは参加をリクエストする提案を受け取りますが、管理者の承認が必要です。", + "automaticSuggestionOption__label": "自動提案", + "calloutInfoLabel": "登録モードの変更は新規ユーザーにのみ影響します", + "calloutInvitationCountLabel": "ユーザーに送信された保留中の招待状:{{count}}", + "calloutSuggestionCountLabel": "ユーザーに送信された保留中の提案:{{count}}", + "manualInvitationOption__description": "ユーザーは組織に手動でのみ招待できます。", + "manualInvitationOption__label": "自動登録なし", + "subtitle": "このドメインからのユーザーが組織に参加する方法を選択してください" + }, + "start": { + "headerTitle__danger": "危険", + "headerTitle__enrollment": "登録オプション" + }, + "subtitle": "ドメイン {{domain}} が確認済みです。登録モードを選択して続行してください", + "title": "{{domain}} を更新" + }, + "verifyDomainPage": { + "formSubtitle": "メールアドレスに送信された確認コードを入力してください", + "formTitle": "確認コード", + "resendButton": "コードを受信していませんか? 再送信", + "subtitle": "{{domainName}} のドメインをメールで確認する必要があります", + "subtitleVerificationCodeScreen": "確認コードが {{emailAddress}} に送信されました。コードを入力して続行してください", + "title": "ドメインを確認" + } + }, + "organizationSwitcher": { + "action__createOrganization": "組織を作成", + "action__invitationAccept": "参加する", + "action__manageOrganization": "管理", + "action__suggestionsAccept": "参加リクエスト", + "notSelected": "選択されている組織はありません", + "personalWorkspace": "個人アカウント", + "suggestionsAcceptedLabel": "承認待ち" + }, + "paginationButton__next": "次へ", + "paginationButton__previous": "前へ", + "paginationRowText__displaying": "表示中", + "paginationRowText__of": "/", + "signIn": { + "accountSwitcher": { + "action__addAccount": "アカウントを追加", + "action__signOutAll": "すべてのアカウントからサインアウト", + "subtitle": "続行するアカウントを選択してください。", + "title": "アカウントを選択" + }, + "alternativeMethods": { + "actionLink": "ヘルプを受ける", + "actionText": "これらのいずれも持っていない場合", + "blockButton__backupCode": "バックアップコードを使用", + "blockButton__emailCode": "{{identifier}} にメールコードを送信", + "blockButton__emailLink": "{{identifier}} にメールリンクを送信", + "blockButton__passkey": "パスキーを使用してサインイン", + "blockButton__password": "パスワードでサインイン", + "blockButton__phoneCode": "{{identifier}} にSMSコードを送信", + "blockButton__totp": "認証アプリを使用", + "getHelp": { + "blockButton__emailSupport": "メールサポート", + "content": "アカウントにサインインできない場合は、お問い合わせいただければ、できるだけ早くアクセスを回復するために協力します。", + "title": "ヘルプを受ける" + }, + "subtitle": "問題が発生していますか?これらの方法のいずれかを使用してサインインできます。", + "title": "別の方法を使用" + }, + "backupCodeMfa": { + "subtitle": "バックアップコードは、2段階認証を設定する際に受け取ったものです。", + "title": "バックアップコードを入力" + }, + "emailCode": { + "formTitle": "確認コード", + "resendButton": "コードが届かない場合は再送信", + "subtitle": "{{applicationName}} へ続行するために", + "title": "メールを確認" + }, + "emailLink": { + "expired": { + "subtitle": "続行するには元のタブに戻ってください。", + "title": "この検証リンクは期限切れです" + }, + "failed": { + "subtitle": "続行するには元のタブに戻ってください。", + "title": "この検証リンクは無効です" + }, + "formSubtitle": "メールに送信された検証リンクを使用", + "formTitle": "検証リンク", + "loading": { + "subtitle": "すぐにリダイレクトされます", + "title": "サインイン中..." + }, + "resendButton": "リンクが届かない場合は再送信", + "subtitle": "{{applicationName}} へ続行するために", + "title": "メールを確認", + "unusedTab": { + "title": "このタブを閉じても構いません" + }, + "verified": { + "subtitle": "すぐにリダイレクトされます", + "title": "正常にサインインしました" + }, + "verifiedSwitchTab": { + "subtitle": "続行するには元のタブに戻ってください", + "subtitleNewTab": "続行するには新しく開いたタブに戻ってください", + "titleNewTab": "他のタブでサインイン済み" + } + }, + "forgotPassword": { + "formTitle": "パスワードをリセットするコード", + "resendButton": "コードが届かない場合は再送信", + "subtitle": "パスワードをリセットするため", + "subtitle_email": "まず、メールアドレスに送信されたコードを入力してください", + "subtitle_phone": "まず、電話に送信されたコードを入力してください", + "title": "パスワードをリセット" + }, + "forgotPasswordAlternativeMethods": { + "blockButton__resetPassword": "パスワードをリセット", + "label__alternativeMethods": "または、他の方法でサインイン", + "title": "パスワードを忘れましたか?" + }, + "noAvailableMethods": { + "message": "サインインを続行できません。利用可能な認証要素がありません。", + "subtitle": "エラーが発生しました", + "title": "サインインできません" + }, + "passkey": { + "subtitle": "パスキーを使用することで、あなたであることが確認されます。デバイスが指紋、顔認証、または画面ロックを要求する場合があります。", + "title": "パスキーを使用" + }, + "password": { + "actionLink": "他の方法を使用", + "subtitle": "アカウントに関連付けられたパスワードを入力してください", + "title": "パスワードを入力" + }, + "passwordPwned": { + "title": "パスワードが危険にさらされています" + }, + "phoneCode": { + "formTitle": "確認コード", + "resendButton": "コードが届かない場合は再送信", + "subtitle": "{{applicationName}} へ続行するために", + "title": "携帯電話を確認" + }, + "phoneCodeMfa": { + "formTitle": "確認コード", + "resendButton": "コードが届かない場合は再送信", + "subtitle": "続行するには、携帯電話に送信された確認コードを入力してください", + "title": "携帯電話を確認" + }, + "resetPassword": { + "formButtonPrimary": "パスワードをリセット", + "requiredMessage": "セキュリティ上の理由から、パスワードをリセットする必要があります。", + "successMessage": "パスワードが正常に変更されました。サインイン中です、しばらくお待ちください。", + "title": "新しいパスワードを設定" + }, + "resetPasswordMfa": { + "detailsLabel": "パスワードをリセットする前に、あなたの身元を確認する必要があります。" + }, + "start": { + "actionLink": "サインアップ", + "actionLink__use_email": "メールを使用", + "actionLink__use_email_username": "メールまたはユーザー名を使用", + "actionLink__use_passkey": "代わりにパスキーを使用", + "actionLink__use_phone": "電話を使用", + "actionLink__use_username": "ユーザー名を使用", + "actionText": "アカウントを持っていませんか?", + "subtitle": "お帰りなさい!続行するにはサインインしてください", + "title": "{{applicationName}} にサインイン" + }, + "totpMfa": { + "formTitle": "確認コード", + "subtitle": "続行するには、認証アプリで生成された確認コードを入力してください", + "title": "2段階認証" + } + }, + "signInEnterPasswordTitle": "パスワードを入力", + "signUp": { + "continue": { + "actionLink": "サインイン", + "actionText": "すでにアカウントをお持ちですか?", + "subtitle": "続行するために残りの詳細を入力してください", + "title": "残りのフィールドを入力" + }, + "emailCode": { + "formSubtitle": "メールアドレスに送信された検証コードを入力", + "formTitle": "検証コード", + "resendButton": "コードが届かない場合は再送信", + "subtitle": "メールアドレスに送信された検証コードを入力してください", + "title": "メールを検証" + }, + "emailLink": { + "formSubtitle": "メールアドレスに送信された検証リンクを使用", + "formTitle": "検証リンク", + "loading": { + "title": "サインアップ中..." + }, + "resendButton": "リンクが届かない場合は再送信", + "subtitle": "{{applicationName}} へ続行するために", + "title": "メールを検証", + "verified": { + "title": "正常にサインアップしました" + }, + "verifiedSwitchTab": { + "subtitle": "続行するには新しく開いたタブに戻ってください", + "subtitleNewTab": "続行するには前のタブに戻ってください", + "title": "メールが正常に検証されました" + } + }, + "phoneCode": { + "formSubtitle": "電話番号に送信された検証コードを入力", + "formTitle": "検証コード", + "resendButton": "コードが届かない場合は再送信", + "subtitle": "電話番号に送信された検証コードを入力してください", + "title": "電話を検証" + }, + "start": { + "actionLink": "サインイン", + "actionText": "すでにアカウントをお持ちですか?", + "subtitle": "ようこそ!始めるには詳細を入力してください", + "title": "アカウントを作成" + } + }, + "socialButtonsBlockButton": "{{provider|titleize}} で続行", + "unstable__errors": { + "captcha_invalid": "セキュリティ検証に失敗したため、サインアップできませんでした。もう一度試すにはページを更新するか、サポートにお問い合わせください。", + "captcha_unavailable": "ボット検証に失敗したため、サインアップできませんでした。もう一度試すにはページを更新するか、サポートにお問い合わせください。", + "form_code_incorrect": "", + "form_identifier_exists": "", + "form_identifier_exists__email_address": "このメールアドレスは既に使用されています。別のものをお試しください。", + "form_identifier_exists__phone_number": "この電話番号は既に使用されています。別のものをお試しください。", + "form_identifier_exists__username": "このユーザー名は既に使用されています。別のものをお試しください。", + "form_identifier_not_found": "", + "form_param_format_invalid": "", + "form_param_format_invalid__email_address": "有効なメールアドレスを入力してください。", + "form_param_format_invalid__phone_number": "有効な国際フォーマットの電話番号を入力してください。", + "form_param_max_length_exceeded__first_name": "名前は256文字を超えることはできません。", + "form_param_max_length_exceeded__last_name": "姓は256文字を超えることはできません。", + "form_param_max_length_exceeded__name": "名前は256文字を超えることはできません。", + "form_param_nil": "", + "form_password_incorrect": "", + "form_password_length_too_short": "", + "form_password_not_strong_enough": "パスワードが強力ではありません。", + "form_password_pwned": "このパスワードは侵害の一部として見つかったため使用できません。別のパスワードをお試しください。", + "form_password_pwned__sign_in": "このパスワードは侵害の一部として見つかったため使用できません。パスワードをリセットしてください。", + "form_password_size_in_bytes_exceeded": "パスワードが許容されるバイト数を超えています。短くするか、一部の特殊文字を削除してください。", + "form_password_validation_failed": "パスワードが間違っています。", + "form_username_invalid_character": "", + "form_username_invalid_length": "", + "identification_deletion_failed": "最後の識別情報を削除することはできません。", + "not_allowed_access": "", + "passkey_already_exists": "このデバイスにはすでにパスキーが登録されています。", + "passkey_not_supported": "このデバイスではパスキーはサポートされていません。", + "passkey_pa_not_supported": "登録にはプラットフォーム認証子が必要ですが、デバイスがサポートしていません。", + "passkey_registration_cancelled": "パスキーの登録がキャンセルされたか、タイムアウトしました。", + "passkey_retrieval_cancelled": "パスキーの確認がキャンセルされたか、タイムアウトしました。", + "passwordComplexity": { + "maximumLength": "{{length}}文字未満", + "minimumLength": "{{length}}文字以上", + "requireLowercase": "小文字の文字", + "requireNumbers": "数字", + "requireSpecialCharacter": "特殊文字", + "requireUppercase": "大文字の文字", + "sentencePrefix": "パスワードには次の要素が含まれる必要があります" + }, + "phone_number_exists": "この電話番号は既に使用されています。別のものをお試しください。", + "zxcvbn": { + "couldBeStronger": "パスワードは機能しますが、もっと強力にすることができます。もっと文字を追加してみてください。", + "goodPassword": "パスワードはすべての必要条件を満たしています。", + "notEnough": "パスワードが強力ではありません。", + "suggestions": { + "allUppercase": "すべての文字を大文字にする", + "anotherWord": "一般的でない単語を追加する", + "associatedYears": "自分に関連する年を避ける", + "capitalization": "最初の文字以外も大文字にする", + "dates": "自分に関連する日付を避ける", + "l33t": "予測可能な文字の置換(例:'a' を '@' に)を避ける", + "longerKeyboardPattern": "長いキーボードパターンを使用し、入力方向を複数回変更する", + "noNeed": "記号、数字、大文字を使用せずに強力なパスワードを作成できます", + "pwned": "他の場所でこのパスワードを使用している場合は変更してください", + "recentYears": "最近の年を避ける", + "repeated": "繰り返された単語や文字を避ける", + "reverseWords": "一般的な単語の逆スペルを避ける", + "sequences": "一般的な文字のシーケンスを避ける", + "useWords": "複数の単語を使用するが、一般的なフレーズは避ける" + }, + "warnings": { + "common": "これは一般的に使用されるパスワードです", + "commonNames": "一般的な名前や姓は推測されやすいです", + "dates": "日付は推測されやすいです", + "extendedRepeat": "「abcabcabc」のような繰り返し文字パターンは推測されやすいです", + "keyPattern": "短いキーボードパターンは推測されやすいです", + "namesByThemselves": "単独の名前や姓は推測されやすいです", + "pwned": "インターネット上のデータ侵害でパスワードが公開されました", + "recentYears": "最近の年は推測されやすいです", + "sequences": "「abc」のような一般的な文字のシーケンスは推測されやすいです", + "similarToCommon": "これは一般的に使用されるパスワードに類似しています", + "simpleRepeat": "「aaa」のような繰り返し文字は推測されやすいです", + "straightRow": "キーボードの直線的な行は推測されやすいです", + "topHundred": "これは頻繁に使用されるパスワードです", + "topTen": "これは非常に使用されるパスワードです", + "userInputs": "個人情報やページ関連のデータを含めないでください", + "wordByItself": "単語単体は推測されやすいです" + } + } + }, + "userButton": { + "action__addAccount": "アカウントを追加", + "action__manageAccount": "アカウントを管理", + "action__signOut": "サインアウト", + "action__signOutAll": "すべてのアカウントからサインアウト" + }, + "userProfile": { + "backupCodePage": { + "actionLabel__copied": "コピーしました!", + "actionLabel__copy": "すべてコピー", + "actionLabel__download": ".txt ダウンロード", + "actionLabel__print": "印刷", + "infoText1": "このアカウントのバックアップコードが有効になります。", + "infoText2": "バックアップコードは秘密に保ち、安全に保管してください。疑わしい場合はバックアップコードを再生成できます。", + "subtitle__codelist": "安全に保管し、秘密にしてください。", + "successMessage": "バックアップコードが有効になりました。認証デバイスへのアクセスが失われた場合、これらのいずれかを使用してアカウントにサインインできます。各コードは1回しか使用できません。", + "successSubtitle": "認証デバイスへのアクセスが失われた場合、これらのいずれかを使用してアカウントにサインインできます。", + "title": "バックアップコードの検証を追加", + "title__codelist": "バックアップコード" + }, + "connectedAccountPage": { + "formHint": "アカウントを接続するプロバイダを選択してください。", + "formHint__noAccounts": "利用可能な外部アカウントプロバイダはありません。", + "removeResource": { + "messageLine1": "{{identifier}} はこのアカウントから削除されます。", + "messageLine2": "この接続されたアカウントを使用したり、依存する機能を使用したりすることはできなくなります。", + "successMessage": "{{connectedAccount}} がアカウントから削除されました。", + "title": "接続されたアカウントを削除" + }, + "socialButtonsBlockButton": "{{provider|titleize}}", + "successMessage": "プロバイダがアカウントに追加されました", + "title": "接続されたアカウントを追加" + }, + "deletePage": { + "actionDescription": "\"アカウントを削除\" と入力して続行してください。", + "confirm": "アカウントを削除", + "messageLine1": "アカウントを削除してもよろしいですか?", + "messageLine2": "この操作は永久的で取り消しできません。", + "title": "アカウントを削除" + }, + "emailAddressPage": { + "emailCode": { + "formHint": "このメールアドレスに送信された確認コードを含むメールが送信されます。", + "formSubtitle": "{{identifier}} に送信された確認コードを入力してください。", + "formTitle": "確認コード", + "resendButton": "コードを受信していませんか? 再送信", + "successMessage": "メール {{identifier}} がアカウントに追加されました。" + }, + "emailLink": { + "formHint": "このメールアドレスに送信された確認リンクを含むメールが送信されます。", + "formSubtitle": "{{identifier}} に送信されたメール内の確認リンクをクリックしてください。", + "formTitle": "確認リンク", + "resendButton": "リンクを受信していませんか? 再送信", + "successMessage": "メール {{identifier}} がアカウントに追加されました。" + }, + "removeResource": { + "messageLine1": "{{identifier}} はこのアカウントから削除されます。", + "messageLine2": "このメールアドレスを使用してサインインすることはできなくなります。", + "successMessage": "{{emailAddress}} がアカウントから削除されました。", + "title": "メールアドレスを削除" + }, + "title": "メールアドレスを追加", + "verifyTitle": "メールアドレスを確認" + }, + "formButtonPrimary__add": "追加", + "formButtonPrimary__continue": "続行", + "formButtonPrimary__finish": "完了", + "formButtonPrimary__remove": "削除", + "formButtonPrimary__save": "保存", + "formButtonReset": "キャンセル", + "mfaPage": { + "formHint": "追加する方法を選択してください。", + "title": "2段階認証を追加" + }, + "mfaPhoneCodePage": { + "backButton": "既存の番号を使用", + "primaryButton__addPhoneNumber": "電話番号を追加", + "removeResource": { + "messageLine1": "サインイン時にこの番号からの確認コードが不要になります。", + "messageLine2": "アカウントのセキュリティが低下する可能性があります。続行しますか?", + "successMessage": "{{mfaPhoneCode}} のSMSコード2段階認証が削除されました。", + "title": "2段階認証を削除" + }, + "subtitle__availablePhoneNumbers": "SMSコード2段階認証に登録する既存の電話番号を選択するか、新しい電話番号を追加してください。", + "subtitle__unavailablePhoneNumbers": "SMSコード2段階認証に登録する利用可能な電話番号はありません。新しい電話番号を追加してください。", + "successMessage1": "サインイン時に、この電話番号に送信された確認コードを追加の手順として入力する必要があります。", + "successMessage2": "これらのバックアップコードを保存し、安全な場所に保管してください。認証デバイスへのアクセスが失われた場合、バックアップコードを使用できます。", + "successTitle": "SMSコード検証が有効になりました", + "title": "SMSコード検証を追加" + }, + "mfaTOTPPage": { + "authenticatorApp": { + "buttonAbleToScan__nonPrimary": "代わりにQRコードをスキャン", + "buttonUnableToScan__nonPrimary": "QRコードをスキャンできませんか?", + "infoText__ableToScan": "認証アプリで新しいサインイン方法を設定し、以下のQRコードをスキャンしてアカウントにリンクしてください。", + "infoText__unableToScan": "認証アプリで新しいサインイン方法を設定し、以下のキーを入力してください。", + "inputLabel__unableToScan1": "タイムベースまたはワンタイムパスワードが有効になっていることを確認し、アカウントのリンクを完了してください。", + "inputLabel__unableToScan2": "代替として、認証アプリがTOTP URIをサポートしている場合は、フルURIをコピーすることもできます。" + }, + "removeResource": { + "messageLine1": "この認証アプリからの確認コードは、サインイン時に不要になります。", + "messageLine2": "アカウントのセキュリティが低下する可能性があります。続行しますか?", + "successMessage": "認証アプリによる2段階認証が削除されました。", + "title": "2段階認証を削除" + }, + "successMessage": "2段階認証が有効になりました。サインイン時に、この認証アプリからの確認コードを追加の手順として入力する必要があります。", + "title": "認証アプリを追加", + "verifySubtitle": "認証アプリで生成された確認コードを入力してください", + "verifyTitle": "確認コード" + }, + "mobileButton__menu": "メニュー", + "navbar": { + "account": "プロフィール", + "description": "アカウント情報を管理します。", + "security": "セキュリティ", + "title": "アカウント" + }, + "passkeyScreen": { + "removeResource": { + "messageLine1": "{{name}} がこのアカウントから削除されます。", + "title": "パスキーを削除" + }, + "subtitle__rename": "パスキー名を変更して見つけやすくすることができます。", + "title__rename": "パスキーの名前を変更" + }, + "passwordPage": { + "checkboxInfoText__signOutOfOtherSessions": "古いパスワードを使用した可能性のあるすべての他のデバイスからサインアウトすることをお勧めします。", + "readonly": "現在、パスワードを編集できません。企業接続を介してのみサインインできます。", + "successMessage__set": "パスワードが設定されました。", + "successMessage__signOutOfOtherSessions": "すべての他のデバイスからサインアウトされました。", + "successMessage__update": "パスワードが更新されました。", + "title__set": "パスワードを設定", + "title__update": "パスワードを更新" + }, + "phoneNumberPage": { + "infoText": "検証コードが含まれたテキストメッセージがこの電話番号に送信されます。メッセージ料金が発生する場合があります。", + "removeResource": { + "messageLine1": "{{identifier}} がこのアカウントから削除されます。", + "messageLine2": "この電話番号を使用してサインインすることはできなくなります。", + "successMessage": "{{phoneNumber}} がアカウントから削除されました。", + "title": "電話番号を削除" + }, + "successMessage": "{{identifier}} がアカウントに追加されました。", + "title": "電話番号を追加", + "verifySubtitle": "{{identifier}} に送信された検証コードを入力してください。", + "verifyTitle": "電話番号を検証" + }, + "profilePage": { + "fileDropAreaHint": "推奨サイズ 1:1、最大10MB。", + "imageFormDestructiveActionSubtitle": "削除", + "imageFormSubtitle": "アップロード", + "imageFormTitle": "プロフィール画像", + "readonly": "プロフィール情報は企業接続によって提供され、編集できません。", + "successMessage": "プロフィールが更新されました。", + "title": "プロフィールを更新" + }, + "start": { + "activeDevicesSection": { + "destructiveAction": "デバイスからサインアウト", + "title": "アクティブデバイス" + }, + "connectedAccountsSection": { + "actionLabel__connectionFailed": "再試行", + "actionLabel__reauthorize": "今すぐ認証", + "destructiveActionTitle": "削除", + "primaryButton": "アカウントを接続", + "subtitle__reauthorize": "必要なスコープが更新されており、機能が制限されている可能性があります。問題を回避するために、このアプリケーションを再認証してください。", + "title": "接続されたアカウント" + }, + "dangerSection": { + "deleteAccountButton": "アカウントを削除", + "title": "アカウントを削除" + }, + "emailAddressesSection": { + "destructiveAction": "メールを削除", + "detailsAction__nonPrimary": "プライマリに設定", + "detailsAction__primary": "検証を完了", + "detailsAction__unverified": "検証", + "primaryButton": "メールアドレスを追加", + "title": "メールアドレス" + }, + "enterpriseAccountsSection": { + "title": "エンタープライズアカウント" + }, + "headerTitle__account": "プロフィール詳細", + "headerTitle__security": "セキュリティ", + "mfaSection": { + "backupCodes": { + "actionLabel__regenerate": "再生成", + "headerTitle": "バックアップコード", + "subtitle__regenerate": "安全なバックアップコードの新しいセットを取得します。以前のバックアップコードは削除され、使用できなくなります。", + "title__regenerate": "バックアップコードを再生成" + }, + "phoneCode": { + "actionLabel__setDefault": "デフォルトに設定", + "destructiveActionLabel": "削除" + }, + "primaryButton": "2段階認証を追加", + "title": "2段階認証", + "totp": { + "destructiveActionTitle": "削除", + "headerTitle": "認証アプリケーション" + } + }, + "passkeysSection": { + "menuAction__destructive": "削除", + "menuAction__rename": "名前を変更", + "title": "パスキー" + }, + "passwordSection": { + "primaryButton__setPassword": "パスワードを設定", + "primaryButton__updatePassword": "パスワードを更新", + "title": "パスワード" + }, + "phoneNumbersSection": { + "destructiveAction": "電話番号を削除", + "detailsAction__nonPrimary": "プライマリに設定", + "detailsAction__primary": "検証を完了", + "detailsAction__unverified": "電話番号を検証", + "primaryButton": "電話番号を追加", + "title": "電話番号" + }, + "profileSection": { + "primaryButton": "プロフィールを更新", + "title": "プロフィール" + }, + "usernameSection": { + "primaryButton__setUsername": "ユーザー名を設定", + "primaryButton__updateUsername": "ユーザー名を更新", + "title": "ユーザー名" + }, + "web3WalletsSection": { + "destructiveAction": "ウォレットを削除", + "primaryButton": "Web3ウォレット", + "title": "Web3ウォレット" + } + }, + "usernamePage": { + "successMessage": "ユーザー名が更新されました。", + "title__set": "ユーザー名を設定", + "title__update": "ユーザー名を更新" + }, + "web3WalletPage": { + "removeResource": { + "messageLine1": "{{identifier}} がこのアカウントから削除されます。", + "messageLine2": "このWeb3ウォレットを使用してサインインすることはできなくなります。", + "successMessage": "{{web3Wallet}} がアカウントから削除されました。", + "title": "Web3ウォレットを削除" + }, + "subtitle__availableWallets": "アカウントに接続するWeb3ウォレットを選択してください。", + "subtitle__unavailableWallets": "利用可能なWeb3ウォレットはありません。", + "successMessage": "ウォレットがアカウントに追加されました。", + "title": "Web3ウォレットを追加" + } + } +} diff --git a/locales/ja-JP/common.json b/locales/ja-JP/common.json index 2cc7512aa562b..26b2bb0b59af0 100644 --- a/locales/ja-JP/common.json +++ b/locales/ja-JP/common.json @@ -160,6 +160,7 @@ "newVersion": "新しいバージョンが利用可能です:{{version}}" }, "userPanel": { + "anonymousNickName": "匿名ユーザー", "billing": "請求管理", "defaultNickname": "コミュニティユーザー", "discord": "コミュニティサポート", diff --git a/locales/ja-JP/error.json b/locales/ja-JP/error.json index c7144f339c208..5771b7f27e594 100644 --- a/locales/ja-JP/error.json +++ b/locales/ja-JP/error.json @@ -1,4 +1,11 @@ { + "clerkAuth": { + "loginSuccess": { + "action": "続ける", + "desc": "{{greeting}}、続けてサービスを提供できて嬉しいです。前回の話題に戻りましょう", + "title": "おかえりなさい、{{nickName}}" + } + }, "error": { "backHome": "ホームに戻る", "desc": "後で試してみるか、既知の世界に戻る", @@ -54,6 +61,7 @@ "InvalidAnthropicAPIKey": "Anthropic APIキーが正しくないか空です。Anthropic APIキーを確認してもう一度お試しください。", "InvalidAzureAPIKey": "Azure APIキーが正しくないか空です。Azure APIキーを確認してから再試行してください。", "InvalidBedrockCredentials": "Bedrockの認証に失敗しました。AccessKeyId/SecretAccessKeyを確認してから再試行してください。", + "InvalidClerkUser": "申し訳ありませんが、現在ログインしていません。続行するにはログインまたはアカウント登録を行ってください", "InvalidGoogleAPIKey": "Google APIキーが正しくないか空です。Google APIキーを確認してから再試行してください。", "InvalidGroqAPIKey": "Groq APIキーが正しくないか空です。Groq APIキーを確認して再試行してください。", "InvalidMinimaxAPIKey": "Minimax APIキーが正しくないか空です。Minimax APIキーを確認して再試行してください。", diff --git a/locales/ko-KR/auth.json b/locales/ko-KR/auth.json new file mode 100644 index 0000000000000..6487e8da19c05 --- /dev/null +++ b/locales/ko-KR/auth.json @@ -0,0 +1,6 @@ +{ + "login": "로그인", + "loginOrSignup": "로그인 / 가입", + "signout": "로그아웃", + "signup": "가입" +} diff --git a/locales/ko-KR/clerk.json b/locales/ko-KR/clerk.json new file mode 100644 index 0000000000000..e52f576d5b60d --- /dev/null +++ b/locales/ko-KR/clerk.json @@ -0,0 +1,769 @@ +{ + "backButton": "뒤로", + "badge__default": "기본", + "badge__otherImpersonatorDevice": "다른 가장자리 장치", + "badge__primary": "기본", + "badge__requiresAction": "조치 필요", + "badge__thisDevice": "이 장치", + "badge__unverified": "미인증", + "badge__userDevice": "사용자 장치", + "badge__you": "당신", + "createOrganization": { + "formButtonSubmit": "조직 생성", + "invitePage": { + "formButtonReset": "건너뛰기" + }, + "title": "조직 생성" + }, + "dates": { + "lastDay": "어제 {{ date | timeString('en-US') }}", + "next6Days": "{{ date | weekday('en-US','long') }} {{ date | timeString('en-US') }}", + "nextDay": "내일 {{ date | timeString('en-US') }}", + "numeric": "{{ date | numeric('en-US') }}", + "previous6Days": "지난 {{ date | weekday('en-US','long') }} {{ date | timeString('en-US') }}", + "sameDay": "오늘 {{ date | timeString('en-US') }}" + }, + "dividerText": "또는", + "footerActionLink__useAnotherMethod": "다른 방법 사용", + "footerPageLink__help": "도움말", + "footerPageLink__privacy": "개인정보 처리방침", + "footerPageLink__terms": "약관", + "formButtonPrimary": "계속", + "formButtonPrimary__verify": "확인", + "formFieldAction__forgotPassword": "비밀번호를 잊으셨나요?", + "formFieldError__matchingPasswords": "비밀번호가 일치합니다.", + "formFieldError__notMatchingPasswords": "비밀번호가 일치하지 않습니다.", + "formFieldError__verificationLinkExpired": "확인 링크가 만료되었습니다. 새 링크를 요청하세요.", + "formFieldHintText__optional": "선택 사항", + "formFieldHintText__slug": "Slug는 고유해야 하는 사람이 읽을 수 있는 ID입니다. 주소(URL)에서 자주 사용됩니다.", + "formFieldInputPlaceholder__backupCode": "", + "formFieldInputPlaceholder__confirmDeletionUserAccount": "계정 삭제", + "formFieldInputPlaceholder__emailAddress": "", + "formFieldInputPlaceholder__emailAddress_username": "", + "formFieldInputPlaceholder__emailAddresses": "example@email.com, example2@email.com", + "formFieldInputPlaceholder__firstName": "", + "formFieldInputPlaceholder__lastName": "", + "formFieldInputPlaceholder__organizationDomain": "", + "formFieldInputPlaceholder__organizationDomainEmailAddress": "", + "formFieldInputPlaceholder__organizationName": "", + "formFieldInputPlaceholder__organizationSlug": "my-org", + "formFieldInputPlaceholder__password": "", + "formFieldInputPlaceholder__phoneNumber": "", + "formFieldInputPlaceholder__username": "", + "formFieldLabel__automaticInvitations": "이 도메인에 대한 자동 초대 활성화", + "formFieldLabel__backupCode": "백업 코드", + "formFieldLabel__confirmDeletion": "확인", + "formFieldLabel__confirmPassword": "비밀번호 확인", + "formFieldLabel__currentPassword": "현재 비밀번호", + "formFieldLabel__emailAddress": "이메일 주소", + "formFieldLabel__emailAddress_username": "이메일 주소 또는 사용자 이름", + "formFieldLabel__emailAddresses": "이메일 주소", + "formFieldLabel__firstName": "이름", + "formFieldLabel__lastName": "성", + "formFieldLabel__newPassword": "새 비밀번호", + "formFieldLabel__organizationDomain": "도메인", + "formFieldLabel__organizationDomainDeletePending": "보류 중인 초대 및 제안 삭제", + "formFieldLabel__organizationDomainEmailAddress": "확인 이메일 주소", + "formFieldLabel__organizationDomainEmailAddressDescription": "이 도메인에서 코드를 받고 확인하려면 이메일 주소를 입력하세요.", + "formFieldLabel__organizationName": "이름", + "formFieldLabel__organizationSlug": "Slug", + "formFieldLabel__passkeyName": "패스키 이름", + "formFieldLabel__password": "비밀번호", + "formFieldLabel__phoneNumber": "전화번호", + "formFieldLabel__role": "역할", + "formFieldLabel__signOutOfOtherSessions": "다른 장치에서 로그아웃", + "formFieldLabel__username": "사용자 이름", + "impersonationFab": { + "action__signOut": "로그아웃", + "title": "{{identifier}}로 로그인함" + }, + "locale": "ko-KR", + "maintenanceMode": "현재 유지 보수 중입니다. 걱정하지 마세요. 몇 분 안에 완료될 것입니다.", + "membershipRole__admin": "관리자", + "membershipRole__basicMember": "회원", + "membershipRole__guestMember": "손님", + "organizationList": { + "action__createOrganization": "조직 생성", + "action__invitationAccept": "가입", + "action__suggestionsAccept": "가입 요청", + "createOrganization": "조직 생성", + "invitationAcceptedLabel": "가입됨", + "subtitle": "{{applicationName}}을(를) 계속하려면", + "suggestionsAcceptedLabel": "승인 대기 중", + "title": "계정 선택", + "titleWithoutPersonal": "조직 선택" + }, + "organizationProfile": { + "badge__automaticInvitation": "자동 초대", + "badge__automaticSuggestion": "자동 제안", + "badge__manualInvitation": "자동 가입 없음", + "badge__unverified": "미인증", + "createDomainPage": { + "subtitle": "도메인을 추가하여 인증합니다. 이 도메인의 이메일 주소를 가진 사용자는 조직에 자동으로 가입하거나 가입 요청을 할 수 있습니다.", + "title": "도메인 추가" + }, + "invitePage": { + "detailsTitle__inviteFailed": "초대장을 보낼 수 없습니다. 다음 이메일 주소에 대기 중인 초대장이 이미 있습니다: {{email_addresses}}.", + "formButtonPrimary__continue": "초대 보내기", + "selectDropdown__role": "역할 선택", + "subtitle": "이메일 주소를 하나 이상 입력하거나 붙여넣어주세요. 띄어쓰기나 쉼표로 구분됩니다.", + "successMessage": "초대장이 성공적으로 전송되었습니다.", + "title": "새 멤버 초대" + }, + "membersPage": { + "action__invite": "초대", + "activeMembersTab": { + "menuAction__remove": "멤버 제거", + "tableHeader__actions": "", + "tableHeader__joined": "가입일", + "tableHeader__role": "역할", + "tableHeader__user": "사용자" + }, + "detailsTitle__emptyRow": "표시할 멤버가 없습니다.", + "invitationsTab": { + "autoInvitations": { + "headerSubtitle": "이메일 도메인을 연결하여 사용자를 초대합니다. 일치하는 이메일 도메인으로 가입한 사용자는 언제든지 조직에 가입할 수 있습니다.", + "headerTitle": "자동 초대", + "primaryButton": "인증된 도메인 관리" + }, + "table__emptyRow": "표시할 초대가 없습니다." + }, + "invitedMembersTab": { + "menuAction__revoke": "초대 철회", + "tableHeader__invited": "초대됨" + }, + "requestsTab": { + "autoSuggestions": { + "headerSubtitle": "일치하는 이메일 도메인으로 가입하는 사용자는 조직 가입 요청을 보낼 수 있습니다.", + "headerTitle": "자동 제안", + "primaryButton": "인증된 도메인 관리" + }, + "menuAction__approve": "승인", + "menuAction__reject": "거부", + "tableHeader__requested": "요청된 액세스", + "table__emptyRow": "표시할 요청이 없습니다." + }, + "start": { + "headerTitle__invitations": "초대", + "headerTitle__members": "멤버", + "headerTitle__requests": "요청" + } + }, + "navbar": { + "description": "조직을 관리합니다.", + "general": "일반", + "members": "멤버", + "title": "조직" + }, + "profilePage": { + "dangerSection": { + "deleteOrganization": { + "actionDescription": "\"{{organizationName}}\"을(를) 입력하여 계속합니다.", + "messageLine1": "이 조직을 삭제하시겠습니까?", + "messageLine2": "이 작업은 영구적이며 되돌릴 수 없습니다.", + "successMessage": "조직이 삭제되었습니다.", + "title": "조직 삭제" + }, + "leaveOrganization": { + "actionDescription": "\"{{organizationName}}\"을(를) 입력하여 계속합니다.", + "messageLine1": "이 조직을 나가시겠습니까? 이 조직 및 해당 응용프로그램에 대한 액세스 권한이 상실됩니다.", + "messageLine2": "이 작업은 영구적이며 되돌릴 수 없습니다.", + "successMessage": "조직을 나갔습니다.", + "title": "조직 나가기" + }, + "title": "위험" + }, + "domainSection": { + "menuAction__manage": "관리", + "menuAction__remove": "삭제", + "menuAction__verify": "인증", + "primaryButton": "도메인 추가", + "subtitle": "인증된 이메일 도메인을 기반으로 조직에 자동으로 가입하거나 가입 요청할 수 있습니다.", + "title": "인증된 도메인" + }, + "successMessage": "조직이 업데이트되었습니다.", + "title": "프로필 업데이트" + }, + "removeDomainPage": { + "messageLine1": "{{domain}} 이메일 도메인이 제거됩니다.", + "messageLine2": "이후에 사용자는 이 조직에 자동으로 가입할 수 없습니다.", + "successMessage": "{{domain}}이(가) 제거되었습니다.", + "title": "도메인 제거" + }, + "start": { + "headerTitle__general": "일반", + "headerTitle__members": "멤버", + "profileSection": { + "primaryButton": "프로필 업데이트", + "title": "조직 프로필", + "uploadAction__title": "로고 업로드" + } + }, + "verifiedDomainPage": { + "dangerTab": { + "calloutInfoLabel": "이 도메인을 제거하면 초대된 사용자에게 영향을 줍니다.", + "removeDomainActionLabel__remove": "도메인 제거", + "removeDomainSubtitle": "이 도메인을 인증된 도메인에서 제거합니다.", + "removeDomainTitle": "도메인 제거" + }, + "enrollmentTab": { + "automaticInvitationOption__description": "사용자는 가입 시 자동으로 조직에 초대되어 언제든지 가입할 수 있습니다.", + "automaticInvitationOption__label": "자동 초대", + "automaticSuggestionOption__description": "사용자는 가입 요청을 받지만 관리자의 승인이 필요합니다.", + "automaticSuggestionOption__label": "자동 제안", + "calloutInfoLabel": "가입 모드 변경은 새 사용자에만 영향을 줍니다.", + "calloutInvitationCountLabel": "사용자에게 보낸 보류 중인 초대장: {{count}}", + "calloutSuggestionCountLabel": "사용자에게 보낸 보류 중인 제안: {{count}}", + "manualInvitationOption__description": "사용자는 수동으로만 조직에 초대할 수 있습니다.", + "manualInvitationOption__label": "자동 가입 없음", + "subtitle": "이 도메인에서 조직에 가입하는 사용자의 방법을 선택하세요." + }, + "start": { + "headerTitle__danger": "위험", + "headerTitle__enrollment": "가입 옵션" + }, + "subtitle": "{{domain}} 도메인이 이제 인증되었습니다. 가입 모드를 선택하여 계속하세요.", + "title": "{{domain}} 업데이트" + }, + "verifyDomainPage": { + "formSubtitle": "이메일 주소로 전송된 인증 코드를 입력하세요.", + "formTitle": "인증 코드", + "resendButton": "코드 받지 못했나요? 재전송", + "subtitle": "{{domainName}} 도메인은 이메일을 통해 인증되어야 합니다.", + "subtitleVerificationCodeScreen": "{{emailAddress}}로 인증 코드가 전송되었습니다. 계속하려면 코드를 입력하세요.", + "title": "도메인 인증" + } + }, + "organizationSwitcher": { + "action__createOrganization": "조직 생성", + "action__invitationAccept": "가입", + "action__manageOrganization": "관리", + "action__suggestionsAccept": "가입 요청", + "notSelected": "선택된 조직 없음", + "personalWorkspace": "개인 계정", + "suggestionsAcceptedLabel": "승인 대기 중" + }, + "paginationButton__next": "다음", + "paginationButton__previous": "이전", + "paginationRowText__displaying": "표시 중", + "paginationRowText__of": "중", + "signIn": { + "accountSwitcher": { + "action__addAccount": "계정 추가", + "action__signOutAll": "모든 계정 로그아웃", + "subtitle": "계속하려는 계정을 선택하세요.", + "title": "계정 선택" + }, + "alternativeMethods": { + "actionLink": "도움 받기", + "actionText": "이러한 방법 중 하나를 사용하시겠어요?", + "blockButton__backupCode": "백업 코드 사용", + "blockButton__emailCode": "{{identifier}}에게 이메일 코드 보내기", + "blockButton__emailLink": "{{identifier}}에게 이메일 링크 보내기", + "blockButton__passkey": "패스키로 로그인", + "blockButton__password": "비밀번호로 로그인", + "blockButton__phoneCode": "{{identifier}}에게 SMS 코드 보내기", + "blockButton__totp": "인증 앱 사용", + "getHelp": { + "blockButton__emailSupport": "이메일 지원", + "content": "계정에 로그인하는 데 어려움을 겪고 계신다면, 이메일을 보내주시면 최대한 빨리 접속을 복구하는 데 도움을 드리겠습니다.", + "title": "도움 받기" + }, + "subtitle": "문제가 발생했나요? 이 방법 중 하나를 사용하여 로그인할 수 있습니다.", + "title": "다른 방법 사용" + }, + "backupCodeMfa": { + "subtitle": "백업 코드는 이중 인증 설정 시 받은 코드입니다.", + "title": "백업 코드 입력" + }, + "emailCode": { + "formTitle": "인증 코드", + "resendButton": "코드를 받지 못했나요? 다시 보내기", + "subtitle": "{{applicationName}}으로 계속하려면", + "title": "이메일 확인" + }, + "emailLink": { + "expired": { + "subtitle": "계속하려면 원래 탭으로 돌아가세요.", + "title": "이 확인 링크가 만료되었습니다." + }, + "failed": { + "subtitle": "계속하려면 원래 탭으로 돌아가세요.", + "title": "이 확인 링크가 유효하지 않습니다." + }, + "formSubtitle": "이메일로 보낸 확인 링크 사용", + "formTitle": "확인 링크", + "loading": { + "subtitle": "곧 리디렉션됩니다.", + "title": "로그인 중..." + }, + "resendButton": "링크를 받지 못했나요? 다시 보내기", + "subtitle": "{{applicationName}}으로 계속하려면", + "title": "이메일 확인", + "unusedTab": { + "title": "이 탭을 닫아도 됩니다." + }, + "verified": { + "subtitle": "곧 리디렉션됩니다.", + "title": "로그인 성공" + }, + "verifiedSwitchTab": { + "subtitle": "계속하려면 원래 탭으로 돌아가세요.", + "subtitleNewTab": "계속하려면 새로 열린 탭으로 이동하세요.", + "titleNewTab": "다른 탭에서 로그인 완료" + } + }, + "forgotPassword": { + "formTitle": "비밀번호 재설정 코드", + "resendButton": "코드를 받지 못했나요? 다시 보내기", + "subtitle": "비밀번호를 재설정하려면", + "subtitle_email": "먼저 이메일 주소로 보낸 코드를 입력하세요.", + "subtitle_phone": "먼저 전화로 받은 코드를 입력하세요.", + "title": "비밀번호 재설정" + }, + "forgotPasswordAlternativeMethods": { + "blockButton__resetPassword": "비밀번호 재설정", + "label__alternativeMethods": "또는 다른 방법으로 로그인", + "title": "비밀번호를 잊으셨나요?" + }, + "noAvailableMethods": { + "message": "로그인 진행 불가. 사용 가능한 인증 요소가 없습니다.", + "subtitle": "오류가 발생했습니다.", + "title": "로그인할 수 없음" + }, + "passkey": { + "subtitle": "패스키를 사용하면 자신임을 확인합니다. 기기에서 지문, 얼굴 또는 화면 잠금을 요청할 수 있습니다.", + "title": "패스키 사용" + }, + "password": { + "actionLink": "다른 방법 사용", + "subtitle": "계정과 관련된 비밀번호를 입력하세요.", + "title": "비밀번호 입력" + }, + "passwordPwned": { + "title": "비밀번호가 노출되었습니다." + }, + "phoneCode": { + "formTitle": "인증 코드", + "resendButton": "코드를 받지 못했나요? 다시 보내기", + "subtitle": "{{applicationName}}으로 계속하려면", + "title": "전화 확인" + }, + "phoneCodeMfa": { + "formTitle": "인증 코드", + "resendButton": "코드를 받지 못했나요? 다시 보내기", + "subtitle": "계속하려면 전화로 받은 인증 코드를 입력하세요.", + "title": "전화 확인" + }, + "resetPassword": { + "formButtonPrimary": "비밀번호 재설정", + "requiredMessage": "보안상의 이유로 비밀번호를 재설정해야 합니다.", + "successMessage": "비밀번호가 성공적으로 변경되었습니다. 로그인 중입니다. 잠시 기다려 주세요.", + "title": "새 비밀번호 설정" + }, + "resetPasswordMfa": { + "detailsLabel": "비밀번호 재설정 전에 정체성을 확인해야 합니다." + }, + "start": { + "actionLink": "가입하기", + "actionLink__use_email": "이메일 사용", + "actionLink__use_email_username": "이메일 또는 사용자 이름 사용", + "actionLink__use_passkey": "패스키 사용", + "actionLink__use_phone": "전화 사용", + "actionLink__use_username": "사용자 이름 사용", + "actionText": "계정이 없으신가요?", + "subtitle": "다시 오신 것을 환영합니다! 계속하려면 로그인하세요.", + "title": "{{applicationName}}에 로그인" + }, + "totpMfa": { + "formTitle": "인증 코드", + "subtitle": "계속하려면 인증 앱에서 생성된 인증 코드를 입력하세요.", + "title": "이중 인증" + } + }, + "signInEnterPasswordTitle": "비밀번호 입력", + "signUp": { + "continue": { + "actionLink": "로그인", + "actionText": "계정이 있으신가요?", + "subtitle": "계속하려면 남은 정보를 입력하세요.", + "title": "누락된 필드 입력" + }, + "emailCode": { + "formSubtitle": "이메일 주소로 보낸 확인 코드를 입력하세요.", + "formTitle": "인증 코드", + "resendButton": "코드를 받지 못했나요? 다시 보내기", + "subtitle": "이메일로 보낸 확인 코드를 입력하세요.", + "title": "이메일 확인" + }, + "emailLink": { + "formSubtitle": "이메일 주소로 보낸 확인 링크 사용", + "formTitle": "확인 링크", + "loading": { + "title": "가입 중..." + }, + "resendButton": "링크를 받지 못했나요? 다시 보내기", + "subtitle": "{{applicationName}}으로 계속하려면", + "title": "이메일 확인", + "verified": { + "title": "가입이 완료되었습니다." + }, + "verifiedSwitchTab": { + "subtitle": "계속하려면 새로 열린 탭으로 이동하세요.", + "subtitleNewTab": "이전 탭으로 돌아가려면 새로 열린 탭으로 이동하세요.", + "title": "이메일 확인 완료" + } + }, + "phoneCode": { + "formSubtitle": "전화번호로 받은 인증 코드를 입력하세요.", + "formTitle": "인증 코드", + "resendButton": "코드를 받지 못했나요? 다시 보내기", + "subtitle": "전화로 받은 인증 코드를 입력하세요.", + "title": "전화 확인" + }, + "start": { + "actionLink": "로그인", + "actionText": "계정이 있으신가요?", + "subtitle": "환영합니다! 시작하려면 세부 정보를 입력하세요.", + "title": "계정 생성" + } + }, + "socialButtonsBlockButton": "{{provider|titleize}}로 계속하기", + "unstable__errors": { + "captcha_invalid": "보안 확인에 실패하여 가입할 수 없습니다. 다시 시도하려면 페이지를 새로 고치거나 지원팀에 문의하십시오.", + "captcha_unavailable": "봇 확인에 실패하여 가입할 수 없습니다. 다시 시도하려면 페이지를 새로 고치거나 지원팀에 문의하십시오.", + "form_code_incorrect": "", + "form_identifier_exists": "", + "form_identifier_exists__email_address": "이 이메일 주소는 사용 중입니다. 다른 이메일 주소를 시도하십시오.", + "form_identifier_exists__phone_number": "이 전화번호는 사용 중입니다. 다른 번호를 시도하십시오.", + "form_identifier_exists__username": "이 사용자 이름은 사용 중입니다. 다른 이름을 시도하십시오.", + "form_identifier_not_found": "", + "form_param_format_invalid": "", + "form_param_format_invalid__email_address": "이메일 주소는 유효한 이메일 주소여야 합니다.", + "form_param_format_invalid__phone_number": "전화번호는 유효한 국제 형식이어야 합니다.", + "form_param_max_length_exceeded__first_name": "이름은 256자를 초과할 수 없습니다.", + "form_param_max_length_exceeded__last_name": "성은 256자를 초과할 수 없습니다.", + "form_param_max_length_exceeded__name": "이름은 256자를 초과할 수 없습니다.", + "form_param_nil": "", + "form_password_incorrect": "", + "form_password_length_too_short": "", + "form_password_not_strong_enough": "비밀번호가 충분히 강력하지 않습니다.", + "form_password_pwned": "이 비밀번호는 누출 사고의 일부로 확인되었으므로 사용할 수 없습니다. 대신 다른 비밀번호를 시도하십시오.", + "form_password_pwned__sign_in": "이 비밀번호는 누출 사고의 일부로 확인되었으므로 사용할 수 없습니다. 비밀번호를 재설정하십시오.", + "form_password_size_in_bytes_exceeded": "비밀번호가 허용된 최대 바이트 수를 초과했습니다. 짧게 만들거나 일부 특수 문자를 제거하십시오.", + "form_password_validation_failed": "잘못된 비밀번호", + "form_username_invalid_character": "", + "form_username_invalid_length": "", + "identification_deletion_failed": "마지막 식별 정보를 삭제할 수 없습니다.", + "not_allowed_access": "", + "passkey_already_exists": "이 장치에 이미 등록된 패스키가 있습니다.", + "passkey_not_supported": "이 장치에서 패스키는 지원되지 않습니다.", + "passkey_pa_not_supported": "등록에는 플랫폼 인증기가 필요하지만 장치가 지원하지 않습니다.", + "passkey_registration_cancelled": "패스키 등록이 취소되었거나 시간이 초과되었습니다.", + "passkey_retrieval_cancelled": "패스키 확인이 취소되었거나 시간이 초과되었습니다.", + "passwordComplexity": { + "maximumLength": "{{length}}자 미만", + "minimumLength": "{{length}}자 이상", + "requireLowercase": "소문자", + "requireNumbers": "숫자", + "requireSpecialCharacter": "특수 문자", + "requireUppercase": "대문자", + "sentencePrefix": "비밀번호는 다음을 포함해야 합니다." + }, + "phone_number_exists": "이 전화번호는 사용 중입니다. 다른 번호를 시도하십시오.", + "zxcvbn": { + "couldBeStronger": "비밀번호가 작동하지만 더 강력해질 수 있습니다. 더 많은 문자를 추가해보세요.", + "goodPassword": "비밀번호는 필요한 모든 요구 사항을 충족합니다.", + "notEnough": "비밀번호가 충분히 강력하지 않습니다.", + "suggestions": { + "allUppercase": "모든 문자를 대문자로 바꾸세요.", + "anotherWord": "덜 일반적인 단어를 추가하세요.", + "associatedYears": "자신과 연관된 연도를 피하세요.", + "capitalization": "첫 글자 이상을 대문자로 바꾸세요.", + "dates": "자신과 연관된 날짜를 피하세요.", + "l33t": "'a'를 '@'로 대체하는 예측 가능한 문자 대체를 피하세요.", + "longerKeyboardPattern": "더 긴 키보드 패턴을 사용하고 여러 번 타이핑 방향을 변경하세요.", + "noNeed": "기호, 숫자 또는 대문자를 사용하지 않고도 강력한 비밀번호를 만들 수 있습니다.", + "pwned": "다른 곳에서 이 비밀번호를 사용한다면 변경해야 합니다.", + "recentYears": "최근 연도를 피하세요.", + "repeated": "단어와 문자를 반복하지 마세요.", + "reverseWords": "일반 단어의 역순 철자를 피하세요.", + "sequences": "일반적인 문자 시퀀스를 피하세요.", + "useWords": "여러 단어를 사용하지만 일반적인 구문을 피하세요." + }, + "warnings": { + "common": "이 비밀번호는 흔히 사용됩니다.", + "commonNames": "일반적인 이름과 성은 추측하기 쉽습니다.", + "dates": "날짜는 추측하기 쉽습니다.", + "extendedRepeat": "\"abcabcabc\"와 같은 반복된 문자 패턴은 추측하기 쉽습니다.", + "keyPattern": "짧은 키보드 패턴은 추측하기 쉽습니다.", + "namesByThemselves": "단일 이름 또는 성은 추측하기 쉽습니다.", + "pwned": "인터넷의 데이터 누출로 비밀번호가 노출되었습니다.", + "recentYears": "최근 연도는 추측하기 쉽습니다.", + "sequences": "\"abc\"와 같은 일반적인 문자 시퀀스는 추측하기 쉽습니다.", + "similarToCommon": "이것은 흔히 사용되는 비밀번호와 유사합니다.", + "simpleRepeat": "\"aaa\"와 같이 반복된 문자는 추측하기 쉽습니다.", + "straightRow": "키보드의 직선 행은 추측하기 쉽습니다.", + "topHundred": "이것은 자주 사용되는 비밀번호입니다.", + "topTen": "이것은 많이 사용되는 비밀번호입니다.", + "userInputs": "개인 또는 페이지 관련 데이터를 사용해서는 안 됩니다.", + "wordByItself": "단일 단어는 추측하기 쉽습니다." + } + } + }, + "userButton": { + "action__addAccount": "계정 추가", + "action__manageAccount": "계정 관리", + "action__signOut": "로그아웃", + "action__signOutAll": "모든 계정에서 로그아웃" + }, + "userProfile": { + "backupCodePage": { + "actionLabel__copied": "복사됨!", + "actionLabel__copy": "모두 복사", + "actionLabel__download": "다운로드 .txt", + "actionLabel__print": "인쇄", + "infoText1": "이 계정에 대해 백업 코드가 활성화됩니다.", + "infoText2": "백업 코드를 비밀리에 보관하고 안전하게 저장하세요. 만약 유출되었다고 의심된다면 백업 코드를 재생성할 수 있습니다.", + "subtitle__codelist": "안전하게 보관하고 비밀리에 유지하세요.", + "successMessage": "백업 코드가 이제 활성화되었습니다. 계정에 로그인할 때 인증 장치에 액세스할 수 없는 경우 이 중 하나를 사용할 수 있습니다. 각 코드는 한 번만 사용할 수 있습니다.", + "successSubtitle": "계정에 로그인할 때 인증 장치에 액세스할 수 없는 경우 이 중 하나를 사용할 수 있습니다.", + "title": "백업 코드 확인 추가", + "title__codelist": "백업 코드" + }, + "connectedAccountPage": { + "formHint": "계정을 연결할 공급업체를 선택하세요.", + "formHint__noAccounts": "사용 가능한 외부 계정 공급업체가 없습니다.", + "removeResource": { + "messageLine1": "{{identifier}}이(가) 이 계정에서 제거됩니다.", + "messageLine2": "이제 더 이상이 연결된 계정을 사용할 수 없으며 종속 기능도 작동하지 않습니다.", + "successMessage": "{{connectedAccount}}이(가) 계정에서 제거되었습니다.", + "title": "연결된 계정 제거" + }, + "socialButtonsBlockButton": "{{provider|titleize}}", + "successMessage": "공급업체가 계정에 추가되었습니다", + "title": "연결된 계정 추가" + }, + "deletePage": { + "actionDescription": "계속하려면 \"계정 삭제\"를 입력하세요.", + "confirm": "계정 삭제", + "messageLine1": "계정을 삭제하시겠습니까?", + "messageLine2": "이 작업은 영구적이며 되돌릴 수 없습니다.", + "title": "계정 삭제" + }, + "emailAddressPage": { + "emailCode": { + "formHint": "이 이메일 주소로 인증 코드가 포함된 이메일이 전송됩니다.", + "formSubtitle": "{{identifier}}로 전송된 이메일의 인증 코드를 입력하세요.", + "formTitle": "인증 코드", + "resendButton": "코드를 받지 못했나요? 다시 보내기", + "successMessage": "이 이메일 {{identifier}}이(가) 계정에 추가되었습니다." + }, + "emailLink": { + "formHint": "이 이메일 주소로 인증 링크가 포함된 이메일이 전송됩니다.", + "formSubtitle": "{{identifier}}로 전송된 이메일의 인증 링크를 클릭하세요.", + "formTitle": "인증 링크", + "resendButton": "링크를 받지 못했나요? 다시 보내기", + "successMessage": "이 이메일 {{identifier}}이(가) 계정에 추가되었습니다." + }, + "removeResource": { + "messageLine1": "{{identifier}}이(가) 이 계정에서 제거됩니다.", + "messageLine2": "이제 이 이메일 주소를 사용하여 로그인할 수 없습니다.", + "successMessage": "{{emailAddress}}이(가) 계정에서 제거되었습니다.", + "title": "이메일 주소 제거" + }, + "title": "이메일 주소 추가", + "verifyTitle": "이메일 주소 확인" + }, + "formButtonPrimary__add": "추가", + "formButtonPrimary__continue": "계속", + "formButtonPrimary__finish": "완료", + "formButtonPrimary__remove": "제거", + "formButtonPrimary__save": "저장", + "formButtonReset": "취소", + "mfaPage": { + "formHint": "추가할 방법을 선택하세요.", + "title": "이중 인증 추가" + }, + "mfaPhoneCodePage": { + "backButton": "기존 번호 사용", + "primaryButton__addPhoneNumber": "전화번호 추가", + "removeResource": { + "messageLine1": "이 번호로부터의 인증 코드 수신이 중지됩니다.", + "messageLine2": "계정이 덜 안전해질 수 있습니다. 계속하시겠습니까?", + "successMessage": "{{mfaPhoneCode}}에 대한 SMS 코드 이중 인증이 제거되었습니다", + "title": "이중 인증 제거" + }, + "subtitle__availablePhoneNumbers": "SMS 코드 이중 인증을 위해 기존 전화번호를 선택하거나 새로 추가하세요.", + "subtitle__unavailablePhoneNumbers": "SMS 코드 이중 인증을 위해 사용 가능한 전화번호가 없습니다. 새로 추가하세요.", + "successMessage1": "로그인할 때 이 번호로 전송된 인증 코드를 추가 단계로 입력해야 합니다.", + "successMessage2": "이 백업 코드를 저장하고 안전한 곳에 보관하세요. 인증 장치에 액세스를 잃으면 백업 코드를 사용할 수 있습니다.", + "successTitle": "SMS 코드 확인이 활성화되었습니다", + "title": "SMS 코드 확인 추가" + }, + "mfaTOTPPage": { + "authenticatorApp": { + "buttonAbleToScan__nonPrimary": "대신 QR 코드 스캔", + "buttonUnableToScan__nonPrimary": "QR 코드를 스캔할 수 없음?", + "infoText__ableToScan": "인증 앱에서 새로운 로그인 방법을 설정하고 계정에 연결할 QR 코드를 스캔하세요.", + "infoText__unableToScan": "인증 앱에서 새로운 로그인 방법을 설정하고 아래 제공된 키를 입력하세요.", + "inputLabel__unableToScan1": "시간 기반 또는 일회용 비밀번호가 활성화되어 있는지 확인한 후 계정 연결을 완료하세요.", + "inputLabel__unableToScan2": "또는 인증 앱이 TOTP URI를 지원하는 경우 전체 URI를 복사할 수도 있습니다." + }, + "removeResource": { + "messageLine1": "이 인증 앱에서의 인증 코드는 더 이상 로그인할 때 필요하지 않습니다.", + "messageLine2": "계정이 덜 안전해질 수 있습니다. 계속하시겠습니까?", + "successMessage": "인증 앱을 통한 이중 인증이 제거되었습니다.", + "title": "이중 인증 제거" + }, + "successMessage": "이제 이중 인증이 활성화되었습니다. 로그인할 때 이 인증 앱에서 생성된 인증 코드를 추가 단계로 입력해야 합니다.", + "title": "인증 앱 추가", + "verifySubtitle": "인증 앱에서 생성된 인증 코드를 입력하세요", + "verifyTitle": "인증 코드" + }, + "mobileButton__menu": "메뉴", + "navbar": { + "account": "프로필", + "description": "계정 정보를 관리합니다.", + "security": "보안", + "title": "계정" + }, + "passkeyScreen": { + "removeResource": { + "messageLine1": "{{name}}이(가) 이 계정에서 제거됩니다.", + "title": "패스키 제거" + }, + "subtitle__rename": "패스키 이름을 변경하여 찾기 쉽게 할 수 있습니다.", + "title__rename": "패스키 이름 변경" + }, + "passwordPage": { + "checkboxInfoText__signOutOfOtherSessions": "이전 비밀번호를 사용했을 수 있는 모든 기기에서 로그아웃하는 것이 좋습니다.", + "readonly": "현재 비밀번호는 기업 연결을 통해서만 로그인할 수 있기 때문에 편집할 수 없습니다.", + "successMessage__set": "비밀번호가 설정되었습니다.", + "successMessage__signOutOfOtherSessions": "다른 모든 기기에서 로그아웃되었습니다.", + "successMessage__update": "비밀번호가 업데이트되었습니다.", + "title__set": "비밀번호 설정", + "title__update": "비밀번호 업데이트" + }, + "phoneNumberPage": { + "infoText": "인증 코드가 포함된 텍스트 메시지가 이 전화번호로 전송됩니다. 메시지 및 데이터 요금이 부과될 수 있습니다.", + "removeResource": { + "messageLine1": "{{identifier}}이(가) 이 계정에서 제거됩니다.", + "messageLine2": "더 이상 이 전화번호를 사용하여 로그인할 수 없습니다.", + "successMessage": "{{phoneNumber}}이(가) 계정에서 제거되었습니다.", + "title": "전화번호 제거" + }, + "successMessage": "{{identifier}}이(가) 계정에 추가되었습니다.", + "title": "전화번호 추가", + "verifySubtitle": "{{identifier}}로 전송된 인증 코드를 입력하세요.", + "verifyTitle": "전화번호 인증" + }, + "profilePage": { + "fileDropAreaHint": "권장 크기 1:1, 최대 10MB.", + "imageFormDestructiveActionSubtitle": "제거", + "imageFormSubtitle": "업로드", + "imageFormTitle": "프로필 이미지", + "readonly": "프로필 정보는 기업 연결을 통해 제공되어 편집할 수 없습니다.", + "successMessage": "프로필이 업데이트되었습니다.", + "title": "프로필 업데이트" + }, + "start": { + "activeDevicesSection": { + "destructiveAction": "기기에서 로그아웃", + "title": "활성 기기" + }, + "connectedAccountsSection": { + "actionLabel__connectionFailed": "다시 시도", + "actionLabel__reauthorize": "지금 승인", + "destructiveActionTitle": "제거", + "primaryButton": "계정 연결", + "subtitle__reauthorize": "필요한 범위가 업데이트되어 기능이 제한될 수 있습니다. 문제를 피하기 위해 이 애플리케이션을 다시 승인하십시오.", + "title": "연결된 계정" + }, + "dangerSection": { + "deleteAccountButton": "계정 삭제", + "title": "계정 삭제" + }, + "emailAddressesSection": { + "destructiveAction": "이메일 제거", + "detailsAction__nonPrimary": "기본 설정으로 설정", + "detailsAction__primary": "인증 완료", + "detailsAction__unverified": "인증", + "primaryButton": "이메일 주소 추가", + "title": "이메일 주소" + }, + "enterpriseAccountsSection": { + "title": "기업 계정" + }, + "headerTitle__account": "프로필 세부정보", + "headerTitle__security": "보안", + "mfaSection": { + "backupCodes": { + "actionLabel__regenerate": "재생성", + "headerTitle": "백업 코드", + "subtitle__regenerate": "새로운 안전한 백업 코드를 받으세요. 이전 백업 코드는 삭제되고 사용할 수 없습니다.", + "title__regenerate": "백업 코드 재생성" + }, + "phoneCode": { + "actionLabel__setDefault": "기본 설정으로 설정", + "destructiveActionLabel": "제거" + }, + "primaryButton": "이중 인증 추가", + "title": "이중 인증", + "totp": { + "destructiveActionTitle": "제거", + "headerTitle": "인증 애플리케이션" + } + }, + "passkeysSection": { + "menuAction__destructive": "제거", + "menuAction__rename": "이름 바꾸기", + "title": "패스키" + }, + "passwordSection": { + "primaryButton__setPassword": "비밀번호 설정", + "primaryButton__updatePassword": "비밀번호 업데이트", + "title": "비밀번호" + }, + "phoneNumbersSection": { + "destructiveAction": "전화번호 제거", + "detailsAction__nonPrimary": "기본 설정으로 설정", + "detailsAction__primary": "인증 완료", + "detailsAction__unverified": "전화번호 인증", + "primaryButton": "전화번호 추가", + "title": "전화번호" + }, + "profileSection": { + "primaryButton": "프로필 업데이트", + "title": "프로필" + }, + "usernameSection": { + "primaryButton__setUsername": "사용자 이름 설정", + "primaryButton__updateUsername": "사용자 이름 업데이트", + "title": "사용자 이름" + }, + "web3WalletsSection": { + "destructiveAction": "지갑 제거", + "primaryButton": "Web3 지갑", + "title": "Web3 지갑" + } + }, + "usernamePage": { + "successMessage": "사용자 이름이 업데이트되었습니다.", + "title__set": "사용자 이름 설정", + "title__update": "사용자 이름 업데이트" + }, + "web3WalletPage": { + "removeResource": { + "messageLine1": "{{identifier}}이(가) 이 계정에서 제거됩니다.", + "messageLine2": "더 이상 이 Web3 지갑을 사용하여 로그인할 수 없습니다.", + "successMessage": "{{web3Wallet}}이(가) 계정에서 제거되었습니다.", + "title": "Web3 지갑 제거" + }, + "subtitle__availableWallets": "계정에 연결할 Web3 지갑을 선택하세요.", + "subtitle__unavailableWallets": "사용 가능한 Web3 지갑이 없습니다.", + "successMessage": "지갑이 계정에 추가되었습니다.", + "title": "Web3 지갑 추가" + } + } +} diff --git a/locales/ko-KR/common.json b/locales/ko-KR/common.json index b1b63b2ce4db6..c6e9990093d88 100644 --- a/locales/ko-KR/common.json +++ b/locales/ko-KR/common.json @@ -160,6 +160,7 @@ "newVersion": "새 버전 사용 가능: {{version}}" }, "userPanel": { + "anonymousNickName": "익명 사용자", "billing": "결제 관리", "defaultNickname": "커뮤니티 사용자", "discord": "커뮤니티 지원", diff --git a/locales/ko-KR/error.json b/locales/ko-KR/error.json index e4d58dcf975b8..86d315017d45f 100644 --- a/locales/ko-KR/error.json +++ b/locales/ko-KR/error.json @@ -1,4 +1,11 @@ { + "clerkAuth": { + "loginSuccess": { + "action": "계속하기", + "desc": "{{greeting}}님, 다시 뵙게 되어 기쁩니다. 이전 대화를 이어나갈까요?", + "title": "다시 환영합니다, {{nickName}}" + } + }, "error": { "backHome": "홈페이지로 돌아가기", "desc": "잠시 후 다시 시도하거나 익숙한 세계로 돌아가세요", @@ -54,6 +61,7 @@ "InvalidAnthropicAPIKey": "Anthropic API 키가 잘못되었거나 비어 있습니다. Anthropic API 키를 확인하고 다시 시도하십시오.", "InvalidAzureAPIKey": "잘못된 또는 비어 있는 Azure API Key입니다. Azure API Key를 확인한 후 다시 시도하십시오.", "InvalidBedrockCredentials": "Bedrock 인증에 실패했습니다. AccessKeyId/SecretAccessKey를 확인한 후 다시 시도하십시오.", + "InvalidClerkUser": "죄송합니다. 현재 로그인되어 있지 않습니다. 계속하려면 먼저 로그인하거나 계정을 등록해주세요.", "InvalidGoogleAPIKey": "잘못된 또는 비어 있는 Google API Key입니다. Google API Key를 확인한 후 다시 시도하십시오.", "InvalidGroqAPIKey": "잘못된 또는 비어 있는 Groq API Key입니다. Groq API Key를 확인한 후 다시 시도하십시오.", "InvalidMinimaxAPIKey": "잘못된 Minimax API 키이거나 비어 있습니다. Minimax API 키를 확인한 후 다시 시도해주세요.", diff --git a/locales/nl-NL/auth.json b/locales/nl-NL/auth.json new file mode 100644 index 0000000000000..fd4c8776634a4 --- /dev/null +++ b/locales/nl-NL/auth.json @@ -0,0 +1,6 @@ +{ + "login": "Inloggen", + "loginOrSignup": "Inloggen / Registreren", + "signout": "Uitloggen", + "signup": "Registreren" +} diff --git a/locales/nl-NL/clerk.json b/locales/nl-NL/clerk.json new file mode 100644 index 0000000000000..08e06da8f9a50 --- /dev/null +++ b/locales/nl-NL/clerk.json @@ -0,0 +1,769 @@ +{ + "backButton": "Terug", + "badge__default": "Standaard", + "badge__otherImpersonatorDevice": "Ander impersonatorapparaat", + "badge__primary": "Primair", + "badge__requiresAction": "Vereist actie", + "badge__thisDevice": "Dit apparaat", + "badge__unverified": "Ongeverifieerd", + "badge__userDevice": "Gebruikersapparaat", + "badge__you": "Jij", + "createOrganization": { + "formButtonSubmit": "Organisatie aanmaken", + "invitePage": { + "formButtonReset": "Overslaan" + }, + "title": "Organisatie aanmaken" + }, + "dates": { + "lastDay": "Gisteren om {{ date | timeString('nl-NL') }}", + "next6Days": "{{ date | weekday('nl-NL','long') }} om {{ date | timeString('nl-NL') }}", + "nextDay": "Morgen om {{ date | timeString('nl-NL') }}", + "numeric": "{{ date | numeric('nl-NL') }}", + "previous6Days": "Vorige {{ date | weekday('nl-NL','long') }} om {{ date | timeString('nl-NL') }}", + "sameDay": "Vandaag om {{ date | timeString('nl-NL') }}" + }, + "dividerText": "of", + "footerActionLink__useAnotherMethod": "Een andere methode gebruiken", + "footerPageLink__help": "Help", + "footerPageLink__privacy": "Privacy", + "footerPageLink__terms": "Voorwaarden", + "formButtonPrimary": "Doorgaan", + "formButtonPrimary__verify": "Verifiëren", + "formFieldAction__forgotPassword": "Wachtwoord vergeten?", + "formFieldError__matchingPasswords": "Wachtwoorden komen overeen.", + "formFieldError__notMatchingPasswords": "Wachtwoorden komen niet overeen.", + "formFieldError__verificationLinkExpired": "De verificatielink is verlopen. Vraag een nieuwe link aan.", + "formFieldHintText__optional": "Optioneel", + "formFieldHintText__slug": "Een slug is een leesbare ID die uniek moet zijn. Het wordt vaak gebruikt in URL's.", + "formFieldInputPlaceholder__backupCode": "", + "formFieldInputPlaceholder__confirmDeletionUserAccount": "Account verwijderen", + "formFieldInputPlaceholder__emailAddress": "", + "formFieldInputPlaceholder__emailAddress_username": "", + "formFieldInputPlaceholder__emailAddresses": "voorbeeld@email.com, voorbeeld2@email.com", + "formFieldInputPlaceholder__firstName": "", + "formFieldInputPlaceholder__lastName": "", + "formFieldInputPlaceholder__organizationDomain": "", + "formFieldInputPlaceholder__organizationDomainEmailAddress": "", + "formFieldInputPlaceholder__organizationName": "", + "formFieldInputPlaceholder__organizationSlug": "mijn-org", + "formFieldInputPlaceholder__password": "", + "formFieldInputPlaceholder__phoneNumber": "", + "formFieldInputPlaceholder__username": "", + "formFieldLabel__automaticInvitations": "Automatische uitnodigingen inschakelen voor dit domein", + "formFieldLabel__backupCode": "Back-upcode", + "formFieldLabel__confirmDeletion": "Bevestiging", + "formFieldLabel__confirmPassword": "Wachtwoord bevestigen", + "formFieldLabel__currentPassword": "Huidig wachtwoord", + "formFieldLabel__emailAddress": "E-mailadres", + "formFieldLabel__emailAddress_username": "E-mailadres of gebruikersnaam", + "formFieldLabel__emailAddresses": "E-mailadressen", + "formFieldLabel__firstName": "Voornaam", + "formFieldLabel__lastName": "Achternaam", + "formFieldLabel__newPassword": "Nieuw wachtwoord", + "formFieldLabel__organizationDomain": "Domein", + "formFieldLabel__organizationDomainDeletePending": "Verwijder uitnodigingen en suggesties in behandeling", + "formFieldLabel__organizationDomainEmailAddress": "Verificatie e-mailadres", + "formFieldLabel__organizationDomainEmailAddressDescription": "Voer een e-mailadres onder dit domein in om een code te ontvangen en dit domein te verifiëren.", + "formFieldLabel__organizationName": "Naam", + "formFieldLabel__organizationSlug": "Slug", + "formFieldLabel__passkeyName": "Naam van passkey", + "formFieldLabel__password": "Wachtwoord", + "formFieldLabel__phoneNumber": "Telefoonnummer", + "formFieldLabel__role": "Rol", + "formFieldLabel__signOutOfOtherSessions": "Afmelden bij alle andere apparaten", + "formFieldLabel__username": "Gebruikersnaam", + "impersonationFab": { + "action__signOut": "Afmelden", + "title": "Aangemeld als {{identifier}}" + }, + "locale": "nl-NL", + "maintenanceMode": "We zijn momenteel bezig met onderhoud, maar maak je geen zorgen, het zou niet langer dan een paar minuten moeten duren.", + "membershipRole__admin": "Admin", + "membershipRole__basicMember": "Lid", + "membershipRole__guestMember": "Gast", + "organizationList": { + "action__createOrganization": "Organisatie creëren", + "action__invitationAccept": "Deelnemen", + "action__suggestionsAccept": "Verzoek om deel te nemen", + "createOrganization": "Organisatie creëren", + "invitationAcceptedLabel": "Toegetreden", + "subtitle": "om door te gaan naar {{applicationName}}", + "suggestionsAcceptedLabel": "In afwachting van goedkeuring", + "title": "Kies een account", + "titleWithoutPersonal": "Kies een organisatie" + }, + "organizationProfile": { + "badge__automaticInvitation": "Automatische uitnodigingen", + "badge__automaticSuggestion": "Automatische suggesties", + "badge__manualInvitation": "Geen automatische inschrijving", + "badge__unverified": "Ongeverifieerd", + "createDomainPage": { + "subtitle": "Voeg het domein toe ter verificatie. Gebruikers met e-mailadressen op dit domein kunnen automatisch lid worden van de organisatie of een verzoek indienen om lid te worden.", + "title": "Domein toevoegen" + }, + "invitePage": { + "detailsTitle__inviteFailed": "De uitnodigingen konden niet worden verstuurd. Er zijn al uitstaande uitnodigingen voor de volgende e-mailadressen: {{email_addresses}}.", + "formButtonPrimary__continue": "Uitnodigingen versturen", + "selectDropdown__role": "Rol selecteren", + "subtitle": "Voer één of meer e-mailadressen in of plak ze, gescheiden door spaties of komma's.", + "successMessage": "Uitnodigingen succesvol verstuurd", + "title": "Nieuwe leden uitnodigen" + }, + "membersPage": { + "action__invite": "Uitnodigen", + "activeMembersTab": { + "menuAction__remove": "Lid verwijderen", + "tableHeader__actions": "", + "tableHeader__joined": "Toegetreden", + "tableHeader__role": "Rol", + "tableHeader__user": "Gebruiker" + }, + "detailsTitle__emptyRow": "Geen leden om weer te geven", + "invitationsTab": { + "autoInvitations": { + "headerSubtitle": "Nodig gebruikers uit door een e-maildomein te koppelen aan je organisatie. Iedereen die zich aanmeldt met een overeenkomstig e-maildomein kan op elk moment lid worden van de organisatie.", + "headerTitle": "Automatische uitnodigingen", + "primaryButton": "Beheer geverifieerde domeinen" + }, + "table__emptyRow": "Geen uitnodigingen om weer te geven" + }, + "invitedMembersTab": { + "menuAction__revoke": "Uitnodiging intrekken", + "tableHeader__invited": "Uitgenodigd" + }, + "requestsTab": { + "autoSuggestions": { + "headerSubtitle": "Gebruikers die zich aanmelden met een overeenkomstig e-maildomein, kunnen een suggestie zien om een verzoek in te dienen om lid te worden van je organisatie.", + "headerTitle": "Automatische suggesties", + "primaryButton": "Beheer geverifieerde domeinen" + }, + "menuAction__approve": "Goedkeuren", + "menuAction__reject": "Afwijzen", + "tableHeader__requested": "Toegang aangevraagd", + "table__emptyRow": "Geen verzoeken om weer te geven" + }, + "start": { + "headerTitle__invitations": "Uitnodigingen", + "headerTitle__members": "Leden", + "headerTitle__requests": "Verzoeken" + } + }, + "navbar": { + "description": "Beheer je organisatie.", + "general": "Algemeen", + "members": "Leden", + "title": "Organisatie" + }, + "profilePage": { + "dangerSection": { + "deleteOrganization": { + "actionDescription": "Typ \"{{organizationName}}\" hieronder om door te gaan.", + "messageLine1": "Weet je zeker dat je deze organisatie wilt verwijderen?", + "messageLine2": "Deze actie is permanent en onomkeerbaar.", + "successMessage": "Je hebt de organisatie verwijderd.", + "title": "Organisatie verwijderen" + }, + "leaveOrganization": { + "actionDescription": "Typ \"{{organizationName}}\" hieronder om door te gaan.", + "messageLine1": "Weet je zeker dat je deze organisatie wilt verlaten? Je verliest toegang tot deze organisatie en de bijbehorende applicaties.", + "messageLine2": "Deze actie is permanent en onomkeerbaar.", + "successMessage": "Je hebt de organisatie verlaten.", + "title": "Organisatie verlaten" + }, + "title": "Gevaar" + }, + "domainSection": { + "menuAction__manage": "Beheren", + "menuAction__remove": "Verwijderen", + "menuAction__verify": "Verifiëren", + "primaryButton": "Domein toevoegen", + "subtitle": "Laat gebruikers automatisch lid worden van de organisatie of een verzoek indienen om lid te worden op basis van een geverifieerd e-maildomein.", + "title": "Geverifieerde domeinen" + }, + "successMessage": "De organisatie is bijgewerkt.", + "title": "Profiel bijwerken" + }, + "removeDomainPage": { + "messageLine1": "Het e-maildomein {{domain}} wordt verwijderd.", + "messageLine2": "Gebruikers kunnen zich niet langer automatisch bij de organisatie aansluiten na deze actie.", + "successMessage": "{{domain}} is verwijderd.", + "title": "Domein verwijderen" + }, + "start": { + "headerTitle__general": "Algemeen", + "headerTitle__members": "Leden", + "profileSection": { + "primaryButton": "Profiel bijwerken", + "title": "Organisatieprofiel", + "uploadAction__title": "Logo" + } + }, + "verifiedDomainPage": { + "dangerTab": { + "calloutInfoLabel": "Het verwijderen van dit domein zal van invloed zijn op uitgenodigde gebruikers.", + "removeDomainActionLabel__remove": "Domein verwijderen", + "removeDomainSubtitle": "Verwijder dit domein uit je geverifieerde domeinen", + "removeDomainTitle": "Domein verwijderen" + }, + "enrollmentTab": { + "automaticInvitationOption__description": "Gebruikers worden automatisch uitgenodigd om lid te worden van de organisatie wanneer ze zich aanmelden en kunnen op elk moment lid worden.", + "automaticInvitationOption__label": "Automatische uitnodigingen", + "automaticSuggestionOption__description": "Gebruikers ontvangen een suggestie om lid te worden, maar moeten worden goedgekeurd door een beheerder voordat ze lid kunnen worden van de organisatie.", + "automaticSuggestionOption__label": "Automatische suggesties", + "calloutInfoLabel": "Het wijzigen van de inschrijvingsmodus heeft alleen invloed op nieuwe gebruikers.", + "calloutInvitationCountLabel": "Uitstaande uitnodigingen verzonden naar gebruikers: {{count}}", + "calloutSuggestionCountLabel": "Uitstaande suggesties verzonden naar gebruikers: {{count}}", + "manualInvitationOption__description": "Gebruikers kunnen alleen handmatig worden uitgenodigd voor de organisatie.", + "manualInvitationOption__label": "Geen automatische inschrijving", + "subtitle": "Kies hoe gebruikers van dit domein lid kunnen worden van de organisatie." + }, + "start": { + "headerTitle__danger": "Gevaar", + "headerTitle__enrollment": "Inschrijvingsopties" + }, + "subtitle": "Het domein {{domain}} is nu geverifieerd. Ga verder door de inschrijvingsmodus te selecteren.", + "title": "{{domain}} bijwerken" + }, + "verifyDomainPage": { + "formSubtitle": "Voer de verificatiecode in die naar je e-mailadres is gestuurd", + "formTitle": "Verificatiecode", + "resendButton": "Code niet ontvangen? Opnieuw verzenden", + "subtitle": "Het domein {{domainName}} moet worden geverifieerd via e-mail.", + "subtitleVerificationCodeScreen": "Er is een verificatiecode naar {{emailAddress}} gestuurd. Voer de code in om door te gaan.", + "title": "Domein verifiëren" + } + }, + "organizationSwitcher": { + "action__createOrganization": "Organisatie creëren", + "action__invitationAccept": "Deelnemen", + "action__manageOrganization": "Beheren", + "action__suggestionsAccept": "Verzoek om deel te nemen", + "notSelected": "Geen organisatie geselecteerd", + "personalWorkspace": "Persoonlijk account", + "suggestionsAcceptedLabel": "In afwachting van goedkeuring" + }, + "paginationButton__next": "Volgende", + "paginationButton__previous": "Vorige", + "paginationRowText__displaying": "Weergeven", + "paginationRowText__of": "van", + "signIn": { + "accountSwitcher": { + "action__addAccount": "Account toevoegen", + "action__signOutAll": "Afmelden bij alle accounts", + "subtitle": "Selecteer het account waarmee je wilt doorgaan.", + "title": "Kies een account" + }, + "alternativeMethods": { + "actionLink": "Hulp krijgen", + "actionText": "Heb je geen van deze?", + "blockButton__backupCode": "Een back-upcode gebruiken", + "blockButton__emailCode": "Code e-mailen naar {{identifier}}", + "blockButton__emailLink": "Link e-mailen naar {{identifier}}", + "blockButton__passkey": "Inloggen met je pascode", + "blockButton__password": "Inloggen met je wachtwoord", + "blockButton__phoneCode": "SMS-code verzenden naar {{identifier}}", + "blockButton__totp": "Je authenticator-app gebruiken", + "getHelp": { + "blockButton__emailSupport": "E-mailondersteuning", + "content": "Als je problemen ondervindt bij het inloggen op je account, stuur ons een e-mail en we zullen samen met jou werken om zo snel mogelijk toegang te herstellen.", + "title": "Hulp krijgen" + }, + "subtitle": "Problemen? Je kunt een van deze methoden gebruiken om in te loggen.", + "title": "Een andere methode gebruiken" + }, + "backupCodeMfa": { + "subtitle": "Je back-upcode is degene die je hebt gekregen bij het instellen van tweestapsverificatie.", + "title": "Voer een back-upcode in" + }, + "emailCode": { + "formTitle": "Verificatiecode", + "resendButton": "Geen code ontvangen? Opnieuw verzenden", + "subtitle": "om door te gaan naar {{applicationName}}", + "title": "Controleer je e-mail" + }, + "emailLink": { + "expired": { + "subtitle": "Ga terug naar het oorspronkelijke tabblad om door te gaan.", + "title": "Deze verificatielink is verlopen" + }, + "failed": { + "subtitle": "Ga terug naar het oorspronkelijke tabblad om door te gaan.", + "title": "Deze verificatielink is ongeldig" + }, + "formSubtitle": "Gebruik de verificatielink die naar je e-mail is verzonden", + "formTitle": "Verificatielink", + "loading": { + "subtitle": "Je wordt binnenkort doorgestuurd", + "title": "Aanmelden..." + }, + "resendButton": "Geen link ontvangen? Opnieuw verzenden", + "subtitle": "om door te gaan naar {{applicationName}}", + "title": "Controleer je e-mail", + "unusedTab": { + "title": "Je kunt dit tabblad sluiten" + }, + "verified": { + "subtitle": "Je wordt binnenkort doorgestuurd", + "title": "Succesvol aangemeld" + }, + "verifiedSwitchTab": { + "subtitle": "Ga terug naar het oorspronkelijke tabblad om door te gaan", + "subtitleNewTab": "Ga terug naar het nieuw geopende tabblad om door te gaan", + "titleNewTab": "Aangemeld op ander tabblad" + } + }, + "forgotPassword": { + "formTitle": "Wachtwoord resetcode", + "resendButton": "Geen code ontvangen? Opnieuw verzenden", + "subtitle": "om je wachtwoord opnieuw in te stellen", + "subtitle_email": "Voer eerst de code in die naar je e-mailadres is verzonden", + "subtitle_phone": "Voer eerst de code in die naar je telefoon is verzonden", + "title": "Wachtwoord opnieuw instellen" + }, + "forgotPasswordAlternativeMethods": { + "blockButton__resetPassword": "Je wachtwoord opnieuw instellen", + "label__alternativeMethods": "Of meld je aan met een andere methode", + "title": "Wachtwoord vergeten?" + }, + "noAvailableMethods": { + "message": "Kan niet doorgaan met aanmelden. Er is geen beschikbare authenticatiefactor.", + "subtitle": "Er is een fout opgetreden", + "title": "Kan niet aanmelden" + }, + "passkey": { + "subtitle": "Het gebruik van je pascode bevestigt dat jij het bent. Je apparaat kan vragen om je vingerafdruk, gezicht of schermvergrendeling.", + "title": "Gebruik je pascode" + }, + "password": { + "actionLink": "Een andere methode gebruiken", + "subtitle": "Voer het wachtwoord in dat is gekoppeld aan je account", + "title": "Voer je wachtwoord in" + }, + "passwordPwned": { + "title": "Wachtwoord gecompromitteerd" + }, + "phoneCode": { + "formTitle": "Verificatiecode", + "resendButton": "Geen code ontvangen? Opnieuw verzenden", + "subtitle": "om door te gaan naar {{applicationName}}", + "title": "Controleer je telefoon" + }, + "phoneCodeMfa": { + "formTitle": "Verificatiecode", + "resendButton": "Geen code ontvangen? Opnieuw verzenden", + "subtitle": "Voer de verificatiecode in die naar je telefoon is verzonden", + "title": "Controleer je telefoon" + }, + "resetPassword": { + "formButtonPrimary": "Wachtwoord opnieuw instellen", + "requiredMessage": "Om veiligheidsredenen moet je je wachtwoord opnieuw instellen.", + "successMessage": "Je wachtwoord is succesvol gewijzigd. We melden je aan, even geduld a.u.b.", + "title": "Stel een nieuw wachtwoord in" + }, + "resetPasswordMfa": { + "detailsLabel": "We moeten je identiteit verifiëren voordat we je wachtwoord opnieuw instellen." + }, + "start": { + "actionLink": "Aanmelden", + "actionLink__use_email": "Gebruik e-mail", + "actionLink__use_email_username": "Gebruik e-mail of gebruikersnaam", + "actionLink__use_passkey": "Gebruik pascode in plaats daarvan", + "actionLink__use_phone": "Gebruik telefoon", + "actionLink__use_username": "Gebruik gebruikersnaam", + "actionText": "Heb je nog geen account?", + "subtitle": "Welkom terug! Meld je aan om door te gaan", + "title": "Meld je aan bij {{applicationName}}" + }, + "totpMfa": { + "formTitle": "Verificatiecode", + "subtitle": "Voer de verificatiecode in die is gegenereerd door je authenticator-app", + "title": "Tweestapsverificatie" + } + }, + "signInEnterPasswordTitle": "Voer je wachtwoord in", + "signUp": { + "continue": { + "actionLink": "Aanmelden", + "actionText": "Heb je al een account?", + "subtitle": "Vul de overgebleven gegevens in om door te gaan", + "title": "Ontbrekende velden invullen" + }, + "emailCode": { + "formSubtitle": "Voer de verificatiecode in die naar je e-mailadres is verzonden", + "formTitle": "Verificatiecode", + "resendButton": "Geen code ontvangen? Opnieuw verzenden", + "subtitle": "Voer de verificatiecode in die naar je e-mail is verzonden", + "title": "Je e-mail verifiëren" + }, + "emailLink": { + "formSubtitle": "Gebruik de verificatielink die naar je e-mailadres is verzonden", + "formTitle": "Verificatielink", + "loading": { + "title": "Aanmelden..." + }, + "resendButton": "Geen link ontvangen? Opnieuw verzenden", + "subtitle": "om door te gaan naar {{applicationName}}", + "title": "Je e-mail verifiëren", + "verified": { + "title": "Succesvol aangemeld" + }, + "verifiedSwitchTab": { + "subtitle": "Ga terug naar het nieuw geopende tabblad om door te gaan", + "subtitleNewTab": "Ga terug naar het vorige tabblad om door te gaan", + "title": "E-mail succesvol geverifieerd" + } + }, + "phoneCode": { + "formSubtitle": "Voer de verificatiecode in die naar je telefoonnummer is verzonden", + "formTitle": "Verificatiecode", + "resendButton": "Geen code ontvangen? Opnieuw verzenden", + "subtitle": "Voer de verificatiecode in die naar je telefoon is verzonden", + "title": "Je telefoon verifiëren" + }, + "start": { + "actionLink": "Aanmelden", + "actionText": "Heb je al een account?", + "subtitle": "Welkom! Vul de gegevens in om te beginnen", + "title": "Maak je account aan" + } + }, + "socialButtonsBlockButton": "Doorgaan met {{provider|titleize}}", + "unstable__errors": { + "captcha_invalid": "Aanmelding mislukt vanwege mislukte beveiligingsvalidaties. Vernieuw de pagina om het opnieuw te proberen of neem contact op met de ondersteuning voor meer hulp.", + "captcha_unavailable": "Aanmelding mislukt vanwege mislukte botvalidatie. Vernieuw de pagina om het opnieuw te proberen of neem contact op met de ondersteuning voor meer hulp.", + "form_code_incorrect": "", + "form_identifier_exists": "", + "form_identifier_exists__email_address": "Dit e-mailadres is al in gebruik. Probeer een ander e-mailadres.", + "form_identifier_exists__phone_number": "Dit telefoonnummer is al in gebruik. Probeer een ander telefoonnummer.", + "form_identifier_exists__username": "Deze gebruikersnaam is al in gebruik. Probeer een andere gebruikersnaam.", + "form_identifier_not_found": "", + "form_param_format_invalid": "", + "form_param_format_invalid__email_address": "E-mailadres moet een geldig e-mailadres zijn.", + "form_param_format_invalid__phone_number": "Telefoonnummer moet in een geldig internationaal formaat zijn.", + "form_param_max_length_exceeded__first_name": "Voornaam mag niet meer dan 256 tekens bevatten.", + "form_param_max_length_exceeded__last_name": "Achternaam mag niet meer dan 256 tekens bevatten.", + "form_param_max_length_exceeded__name": "Naam mag niet meer dan 256 tekens bevatten.", + "form_param_nil": "", + "form_password_incorrect": "", + "form_password_length_too_short": "", + "form_password_not_strong_enough": "Uw wachtwoord is niet sterk genoeg.", + "form_password_pwned": "Dit wachtwoord is gevonden als onderdeel van een datalek en kan niet worden gebruikt, probeer in plaats daarvan een ander wachtwoord.", + "form_password_pwned__sign_in": "Dit wachtwoord is gevonden als onderdeel van een datalek en kan niet worden gebruikt, reset alstublieft uw wachtwoord.", + "form_password_size_in_bytes_exceeded": "Uw wachtwoord heeft het maximale aantal bytes overschreden, verkort het of verwijder enkele speciale tekens.", + "form_password_validation_failed": "Onjuist wachtwoord", + "form_username_invalid_character": "", + "form_username_invalid_length": "", + "identification_deletion_failed": "U kunt uw laatste identificatie niet verwijderen.", + "not_allowed_access": "", + "passkey_already_exists": "Er is al een pascode geregistreerd op dit apparaat.", + "passkey_not_supported": "Pascodes worden niet ondersteund op dit apparaat.", + "passkey_pa_not_supported": "Registratie vereist een platformauthenticator, maar het apparaat ondersteunt dit niet.", + "passkey_registration_cancelled": "Registratie van pascode is geannuleerd of verlopen.", + "passkey_retrieval_cancelled": "Verificatie van pascode is geannuleerd of verlopen.", + "passwordComplexity": { + "maximumLength": "minder dan {{length}} tekens", + "minimumLength": "{{length}} of meer tekens", + "requireLowercase": "een kleine letter", + "requireNumbers": "een nummer", + "requireSpecialCharacter": "een speciaal teken", + "requireUppercase": "een hoofdletter", + "sentencePrefix": "Uw wachtwoord moet bevatten" + }, + "phone_number_exists": "Dit telefoonnummer is al in gebruik. Probeer een ander telefoonnummer.", + "zxcvbn": { + "couldBeStronger": "Uw wachtwoord werkt, maar kan sterker zijn. Probeer meer tekens toe te voegen.", + "goodPassword": "Uw wachtwoord voldoet aan alle vereisten.", + "notEnough": "Uw wachtwoord is niet sterk genoeg.", + "suggestions": { + "allUppercase": "Maak sommige letters hoofdletters, maar niet allemaal.", + "anotherWord": "Voeg meer woorden toe die minder gebruikelijk zijn.", + "associatedYears": "Vermijd jaren die met u geassocieerd zijn.", + "capitalization": "Maak meer dan alleen de eerste letter hoofdletter.", + "dates": "Vermijd data en jaren die met u geassocieerd zijn.", + "l33t": "Vermijd voorspelbare lettervervangingen zoals '@' voor 'a'.", + "longerKeyboardPattern": "Gebruik langere toetsenbordpatronen en verander meerdere keren van typrichting.", + "noNeed": "U kunt sterke wachtwoorden maken zonder symbolen, cijfers of hoofdletters te gebruiken.", + "pwned": "Als u dit wachtwoord elders gebruikt, moet u het wijzigen.", + "recentYears": "Vermijd recente jaren.", + "repeated": "Vermijd herhaalde woorden en tekens.", + "reverseWords": "Vermijd omgekeerde spellingen van veelvoorkomende woorden.", + "sequences": "Vermijd veelvoorkomende karakterreeksen.", + "useWords": "Gebruik meerdere woorden, maar vermijd veelvoorkomende zinnen." + }, + "warnings": { + "common": "Dit is een veelgebruikt wachtwoord.", + "commonNames": "Gemeenschappelijke namen en achternamen zijn gemakkelijk te raden.", + "dates": "Data zijn gemakkelijk te raden.", + "extendedRepeat": "Herhaalde karakterpatronen zoals \"abcabcabc\" zijn gemakkelijk te raden.", + "keyPattern": "Korte toetsenbordpatronen zijn gemakkelijk te raden.", + "namesByThemselves": "Enkele namen of achternamen zijn gemakkelijk te raden.", + "pwned": "Uw wachtwoord is blootgesteld door een datalek op het internet.", + "recentYears": "Recente jaren zijn gemakkelijk te raden.", + "sequences": "Gemeenschappelijke karakterreeksen zoals \"abc\" zijn gemakkelijk te raden.", + "similarToCommon": "Dit lijkt op een veelgebruikt wachtwoord.", + "simpleRepeat": "Herhaalde tekens zoals \"aaa\" zijn gemakkelijk te raden.", + "straightRow": "Rechte rijen toetsen op uw toetsenbord zijn gemakkelijk te raden.", + "topHundred": "Dit is een veelgebruikt wachtwoord.", + "topTen": "Dit is een zeer gebruikt wachtwoord.", + "userInputs": "Er mogen geen persoonlijke of paginagerelateerde gegevens zijn.", + "wordByItself": "Enkele woorden zijn gemakkelijk te raden." + } + } + }, + "userButton": { + "action__addAccount": "Account toevoegen", + "action__manageAccount": "Account beheren", + "action__signOut": "Afmelden", + "action__signOutAll": "Afmelden bij alle accounts" + }, + "userProfile": { + "backupCodePage": { + "actionLabel__copied": "Gekopieerd!", + "actionLabel__copy": "Alles kopiëren", + "actionLabel__download": "Download .txt", + "actionLabel__print": "Afdrukken", + "infoText1": "Back-upcodes worden ingeschakeld voor dit account.", + "infoText2": "Houd de back-upcodes geheim en bewaar ze veilig. U kunt back-upcodes opnieuw genereren als u vermoedt dat ze zijn gecompromitteerd.", + "subtitle__codelist": "Bewaar ze veilig en houd ze geheim.", + "successMessage": "Back-upcodes zijn nu ingeschakeld. U kunt een van deze gebruiken om in te loggen op uw account als u geen toegang meer heeft tot uw verificatieapparaat. Elke code kan slechts eenmaal worden gebruikt.", + "successSubtitle": "U kunt een van deze gebruiken om in te loggen op uw account als u geen toegang meer heeft tot uw verificatieapparaat.", + "title": "Back-upcodeverificatie toevoegen", + "title__codelist": "Back-upcodes" + }, + "connectedAccountPage": { + "formHint": "Selecteer een provider om uw account te koppelen.", + "formHint__noAccounts": "Er zijn geen beschikbare externe accountproviders.", + "removeResource": { + "messageLine1": "{{identifier}} wordt verwijderd van dit account.", + "messageLine2": "U kunt dit gekoppelde account niet langer gebruiken en eventuele afhankelijke functies zullen niet meer werken.", + "successMessage": "{{connectedAccount}} is verwijderd van uw account.", + "title": "Gekoppeld account verwijderen" + }, + "socialButtonsBlockButton": "{{provider|titleize}}", + "successMessage": "De provider is toegevoegd aan uw account", + "title": "Gekoppeld account toevoegen" + }, + "deletePage": { + "actionDescription": "Typ \"Account verwijderen\" hieronder om door te gaan.", + "confirm": "Account verwijderen", + "messageLine1": "Weet u zeker dat u uw account wilt verwijderen?", + "messageLine2": "Deze actie is permanent en onomkeerbaar.", + "title": "Account verwijderen" + }, + "emailAddressPage": { + "emailCode": { + "formHint": "Er wordt een e-mail met een verificatiecode naar dit e-mailadres gestuurd.", + "formSubtitle": "Voer de verificatiecode in die naar {{identifier}} is gestuurd.", + "formTitle": "Verificatiecode", + "resendButton": "Geen code ontvangen? Opnieuw verzenden", + "successMessage": "Het e-mailadres {{identifier}} is toegevoegd aan uw account." + }, + "emailLink": { + "formHint": "Er wordt een e-mail met een verificatielink naar dit e-mailadres gestuurd.", + "formSubtitle": "Klik op de verificatielink in de e-mail die naar {{identifier}} is gestuurd.", + "formTitle": "Verificatielink", + "resendButton": "Geen link ontvangen? Opnieuw verzenden", + "successMessage": "Het e-mailadres {{identifier}} is toegevoegd aan uw account." + }, + "removeResource": { + "messageLine1": "{{identifier}} wordt verwijderd van dit account.", + "messageLine2": "U kunt niet langer inloggen met dit e-mailadres.", + "successMessage": "{{emailAddress}} is verwijderd van uw account.", + "title": "E-mailadres verwijderen" + }, + "title": "E-mailadres toevoegen", + "verifyTitle": "E-mailadres verifiëren" + }, + "formButtonPrimary__add": "Toevoegen", + "formButtonPrimary__continue": "Doorgaan", + "formButtonPrimary__finish": "Voltooien", + "formButtonPrimary__remove": "Verwijderen", + "formButtonPrimary__save": "Opslaan", + "formButtonReset": "Annuleren", + "mfaPage": { + "formHint": "Selecteer een methode om toe te voegen.", + "title": "Tweestapsverificatie toevoegen" + }, + "mfaPhoneCodePage": { + "backButton": "Bestaand nummer gebruiken", + "primaryButton__addPhoneNumber": "Telefoonnummer toevoegen", + "removeResource": { + "messageLine1": "{{identifier}} ontvangt geen verificatiecodes meer bij het inloggen.", + "messageLine2": "Uw account is mogelijk minder veilig. Weet u zeker dat u wilt doorgaan?", + "successMessage": "SMS-code tweestapsverificatie is verwijderd voor {{mfaPhoneCode}}", + "title": "Tweestapsverificatie verwijderen" + }, + "subtitle__availablePhoneNumbers": "Selecteer een bestaand telefoonnummer om te registreren voor SMS-code tweestapsverificatie of voeg een nieuw nummer toe.", + "subtitle__unavailablePhoneNumbers": "Er zijn geen beschikbare telefoonnummers om te registreren voor SMS-code tweestapsverificatie, voeg alstublieft een nieuw nummer toe.", + "successMessage1": "Bij het inloggen moet u een verificatiecode invoeren die naar dit telefoonnummer is gestuurd als extra stap.", + "successMessage2": "Sla deze back-upcodes op en bewaar ze op een veilige plek. Als u geen toegang meer heeft tot uw verificatieapparaat, kunt u back-upcodes gebruiken om in te loggen.", + "successTitle": "SMS-codeverificatie ingeschakeld", + "title": "SMS-codeverificatie toevoegen" + }, + "mfaTOTPPage": { + "authenticatorApp": { + "buttonAbleToScan__nonPrimary": "In plaats daarvan QR-code scannen", + "buttonUnableToScan__nonPrimary": "Kan QR-code niet scannen?", + "infoText__ableToScan": "Stel een nieuwe aanmeldmethode in in uw authenticator-app en scan de volgende QR-code om deze aan uw account te koppelen.", + "infoText__unableToScan": "Stel een nieuwe aanmeldmethode in in uw authenticator en voer de onderstaande sleutel in.", + "inputLabel__unableToScan1": "Zorg ervoor dat Tijdgebaseerde of Eenmalige wachtwoorden zijn ingeschakeld en voltooi vervolgens het koppelen van uw account.", + "inputLabel__unableToScan2": "Als uw authenticator TOTP URI's ondersteunt, kunt u ook de volledige URI kopiëren." + }, + "removeResource": { + "messageLine1": "Verificatiecodes van deze authenticator zijn niet langer vereist bij het inloggen.", + "messageLine2": "Uw account is mogelijk minder veilig. Weet u zeker dat u wilt doorgaan?", + "successMessage": "Tweestapsverificatie via authenticator-applicatie is verwijderd.", + "title": "Tweestapsverificatie verwijderen" + }, + "successMessage": "Tweestapsverificatie is nu ingeschakeld. Bij het inloggen moet u een verificatiecode van deze authenticator invoeren als extra stap.", + "title": "Authenticator-applicatie toevoegen", + "verifySubtitle": "Voer de verificatiecode in die is gegenereerd door uw authenticator", + "verifyTitle": "Verificatiecode" + }, + "mobileButton__menu": "Menu", + "navbar": { + "account": "Profiel", + "description": "Beheer uw accountgegevens.", + "security": "Beveiliging", + "title": "Account" + }, + "passkeyScreen": { + "removeResource": { + "messageLine1": "{{name}} wordt van dit account verwijderd.", + "title": "Passkey verwijderen" + }, + "subtitle__rename": "U kunt de naam van de passkey wijzigen om deze gemakkelijker te vinden.", + "title__rename": "Passkey hernoemen" + }, + "passwordPage": { + "checkboxInfoText__signOutOfOtherSessions": "Het wordt aanbevolen om uit te loggen op alle andere apparaten die uw oude wachtwoord hebben gebruikt.", + "readonly": "Uw wachtwoord kan momenteel niet worden bewerkt omdat u alleen kunt inloggen via de bedrijfsverbinding.", + "successMessage__set": "Uw wachtwoord is ingesteld.", + "successMessage__signOutOfOtherSessions": "Alle andere apparaten zijn uitgelogd.", + "successMessage__update": "Uw wachtwoord is bijgewerkt.", + "title__set": "Wachtwoord instellen", + "title__update": "Wachtwoord bijwerken" + }, + "phoneNumberPage": { + "infoText": "Een sms met een verificatiecode wordt naar dit telefoonnummer gestuurd. Bericht- en datatarieven kunnen van toepassing zijn.", + "removeResource": { + "messageLine1": "{{identifier}} wordt van dit account verwijderd.", + "messageLine2": "U kunt niet langer inloggen met dit telefoonnummer.", + "successMessage": "{{phoneNumber}} is verwijderd uit uw account.", + "title": "Telefoonnummer verwijderen" + }, + "successMessage": "{{identifier}} is toegevoegd aan uw account.", + "title": "Telefoonnummer toevoegen", + "verifySubtitle": "Voer de verificatiecode in die naar {{identifier}} is gestuurd.", + "verifyTitle": "Telefoonnummer verifiëren" + }, + "profilePage": { + "fileDropAreaHint": "Aanbevolen grootte 1:1, tot 10 MB.", + "imageFormDestructiveActionSubtitle": "Verwijderen", + "imageFormSubtitle": "Uploaden", + "imageFormTitle": "Profielafbeelding", + "readonly": "Uw profielinformatie is verstrekt via de bedrijfsverbinding en kan niet worden bewerkt.", + "successMessage": "Uw profiel is bijgewerkt.", + "title": "Profiel bijwerken" + }, + "start": { + "activeDevicesSection": { + "destructiveAction": "Uitloggen van apparaat", + "title": "Actieve apparaten" + }, + "connectedAccountsSection": { + "actionLabel__connectionFailed": "Probeer opnieuw", + "actionLabel__reauthorize": "Nu autoriseren", + "destructiveActionTitle": "Verwijderen", + "primaryButton": "Verbind account", + "subtitle__reauthorize": "De vereiste rechten zijn bijgewerkt en u kunt beperkte functionaliteit ervaren. Autoriseer deze applicatie opnieuw om problemen te voorkomen", + "title": "Gekoppelde accounts" + }, + "dangerSection": { + "deleteAccountButton": "Account verwijderen", + "title": "Account verwijderen" + }, + "emailAddressesSection": { + "destructiveAction": "E-mail verwijderen", + "detailsAction__nonPrimary": "Instellen als primair", + "detailsAction__primary": "Verificatie voltooien", + "detailsAction__unverified": "Verifiëren", + "primaryButton": "E-mailadres toevoegen", + "title": "E-mailadressen" + }, + "enterpriseAccountsSection": { + "title": "Zakelijke accounts" + }, + "headerTitle__account": "Profielgegevens", + "headerTitle__security": "Beveiliging", + "mfaSection": { + "backupCodes": { + "actionLabel__regenerate": "Regenereren", + "headerTitle": "Back-upcodes", + "subtitle__regenerate": "Ontvang een nieuwe set veilige back-upcodes. Eerdere back-upcodes worden verwijderd en kunnen niet meer worden gebruikt.", + "title__regenerate": "Back-upcodes regenereren" + }, + "phoneCode": { + "actionLabel__setDefault": "Als standaard instellen", + "destructiveActionLabel": "Verwijderen" + }, + "primaryButton": "Tweestapsverificatie toevoegen", + "title": "Tweestapsverificatie", + "totp": { + "destructiveActionTitle": "Verwijderen", + "headerTitle": "Authenticator-applicatie" + } + }, + "passkeysSection": { + "menuAction__destructive": "Verwijderen", + "menuAction__rename": "Hernoemen", + "title": "Wachtwoorden" + }, + "passwordSection": { + "primaryButton__setPassword": "Wachtwoord instellen", + "primaryButton__updatePassword": "Wachtwoord bijwerken", + "title": "Wachtwoord" + }, + "phoneNumbersSection": { + "destructiveAction": "Telefoonnummer verwijderen", + "detailsAction__nonPrimary": "Instellen als primair", + "detailsAction__primary": "Verificatie voltooien", + "detailsAction__unverified": "Telefoonnummer verifiëren", + "primaryButton": "Telefoonnummer toevoegen", + "title": "Telefoonnummers" + }, + "profileSection": { + "primaryButton": "Profiel bijwerken", + "title": "Profiel" + }, + "usernameSection": { + "primaryButton__setUsername": "Gebruikersnaam instellen", + "primaryButton__updateUsername": "Gebruikersnaam bijwerken", + "title": "Gebruikersnaam" + }, + "web3WalletsSection": { + "destructiveAction": "Portemonnee verwijderen", + "primaryButton": "Web3-portefeuilles", + "title": "Web3-portefeuilles" + } + }, + "usernamePage": { + "successMessage": "Uw gebruikersnaam is bijgewerkt.", + "title__set": "Gebruikersnaam instellen", + "title__update": "Gebruikersnaam bijwerken" + }, + "web3WalletPage": { + "removeResource": { + "messageLine1": "{{identifier}} wordt van dit account verwijderd.", + "messageLine2": "U kunt niet langer inloggen met deze web3-portemonnee.", + "successMessage": "{{web3Wallet}} is verwijderd uit uw account.", + "title": "Web3-portemonnee verwijderen" + }, + "subtitle__availableWallets": "Selecteer een web3-portemonnee om verbinding te maken met uw account.", + "subtitle__unavailableWallets": "Er zijn geen beschikbare web3-portemonnees.", + "successMessage": "De portemonnee is toegevoegd aan uw account.", + "title": "Web3-portemonnee toevoegen" + } + } +} diff --git a/locales/nl-NL/common.json b/locales/nl-NL/common.json index a8b909aefa08c..5c504e8dc25fd 100644 --- a/locales/nl-NL/common.json +++ b/locales/nl-NL/common.json @@ -160,6 +160,7 @@ "newVersion": "有新版本可用:{{version}}" }, "userPanel": { + "anonymousNickName": "Anonieme gebruiker", "billing": "账单管理", "defaultNickname": "Standaardgebruiker", "discord": "社区支持", diff --git a/locales/nl-NL/error.json b/locales/nl-NL/error.json index e3c39e69be623..6a391f746e284 100644 --- a/locales/nl-NL/error.json +++ b/locales/nl-NL/error.json @@ -1,4 +1,11 @@ { + "clerkAuth": { + "loginSuccess": { + "action": "Continue session", + "desc": "{{greeting}}, it's great to continue serving you. Let's pick up where we left off.", + "title": "Welcome back, {{nickName}}" + } + }, "error": { "backHome": "Terug naar startpagina", "desc": "Probeer het later opnieuw of keer terug naar de bekende wereld", @@ -54,6 +61,7 @@ "InvalidAnthropicAPIKey": "Anthropic API Key is onjuist of leeg. Controleer de Anthropic API Key en probeer het opnieuw.", "InvalidAzureAPIKey": "Incorrect or empty Azure API Key, please check the Azure API Key and retry", "InvalidBedrockCredentials": "Bedrock authentication failed, please check AccessKeyId/SecretAccessKey and retry", + "InvalidClerkUser": "Sorry, you are not currently logged in. Please log in or register an account to continue.", "InvalidGoogleAPIKey": "Incorrect or empty Google API Key, please check the Google API Key and retry", "InvalidGroqAPIKey": "Groq API Key is onjuist of leeg. Controleer de Groq API Key en probeer het opnieuw.", "InvalidMinimaxAPIKey": "Ongeldige of lege Minimax API-sleutel. Controleer de Minimax API-sleutel en probeer het opnieuw.", diff --git a/locales/pl-PL/auth.json b/locales/pl-PL/auth.json new file mode 100644 index 0000000000000..1f97ad9ed2730 --- /dev/null +++ b/locales/pl-PL/auth.json @@ -0,0 +1,6 @@ +{ + "login": "Zaloguj się", + "loginOrSignup": "Zaloguj się / Zarejestruj się", + "signout": "Wyloguj", + "signup": "Zarejestruj się" +} diff --git a/locales/pl-PL/clerk.json b/locales/pl-PL/clerk.json new file mode 100644 index 0000000000000..e84c2a5a9831b --- /dev/null +++ b/locales/pl-PL/clerk.json @@ -0,0 +1,769 @@ +{ + "backButton": "Wróć", + "badge__default": "Domyślny", + "badge__otherImpersonatorDevice": "Inne urządzenie podszywające się", + "badge__primary": "Podstawowy", + "badge__requiresAction": "Wymaga działania", + "badge__thisDevice": "To urządzenie", + "badge__unverified": "Niezweryfikowany", + "badge__userDevice": "Urządzenie użytkownika", + "badge__you": "Ty", + "createOrganization": { + "formButtonSubmit": "Utwórz organizację", + "invitePage": { + "formButtonReset": "Pomiń" + }, + "title": "Utwórz organizację" + }, + "dates": { + "lastDay": "Wczoraj o {{ date | timeString('pl-PL') }}", + "next6Days": "{{ date | weekday('pl-PL','long') }} o {{ date | timeString('pl-PL') }}", + "nextDay": "Jutro o {{ date | timeString('pl-PL') }}", + "numeric": "{{ date | numeric('pl-PL') }}", + "previous6Days": "Ostatni {{ date | weekday('pl-PL','long') }} o {{ date | timeString('pl-PL') }}", + "sameDay": "Dziś o {{ date | timeString('pl-PL') }}" + }, + "dividerText": "lub", + "footerActionLink__useAnotherMethod": "Użyj innej metody", + "footerPageLink__help": "Pomoc", + "footerPageLink__privacy": "Prywatność", + "footerPageLink__terms": "Warunki", + "formButtonPrimary": "Kontynuuj", + "formButtonPrimary__verify": "Zweryfikuj", + "formFieldAction__forgotPassword": "Zapomniałeś hasła?", + "formFieldError__matchingPasswords": "Hasła pasują.", + "formFieldError__notMatchingPasswords": "Hasła nie pasują.", + "formFieldError__verificationLinkExpired": "Link weryfikacyjny wygasł. Proszę poproś o nowy link.", + "formFieldHintText__optional": "Opcjonalne", + "formFieldHintText__slug": "Slug to czytelne dla człowieka ID, które musi być unikalne. Często używane w adresach URL.", + "formFieldInputPlaceholder__backupCode": "", + "formFieldInputPlaceholder__confirmDeletionUserAccount": "Usuń konto", + "formFieldInputPlaceholder__emailAddress": "", + "formFieldInputPlaceholder__emailAddress_username": "", + "formFieldInputPlaceholder__emailAddresses": "przykład@email.com, przykład2@email.com", + "formFieldInputPlaceholder__firstName": "", + "formFieldInputPlaceholder__lastName": "", + "formFieldInputPlaceholder__organizationDomain": "", + "formFieldInputPlaceholder__organizationDomainEmailAddress": "", + "formFieldInputPlaceholder__organizationName": "", + "formFieldInputPlaceholder__organizationSlug": "moja-org", + "formFieldInputPlaceholder__password": "", + "formFieldInputPlaceholder__phoneNumber": "", + "formFieldInputPlaceholder__username": "", + "formFieldLabel__automaticInvitations": "Włącz automatyczne zaproszenia dla tej domeny", + "formFieldLabel__backupCode": "Kod zapasowy", + "formFieldLabel__confirmDeletion": "Potwierdzenie", + "formFieldLabel__confirmPassword": "Potwierdź hasło", + "formFieldLabel__currentPassword": "Aktualne hasło", + "formFieldLabel__emailAddress": "Adres email", + "formFieldLabel__emailAddress_username": "Adres email lub nazwa użytkownika", + "formFieldLabel__emailAddresses": "Adresy email", + "formFieldLabel__firstName": "Imię", + "formFieldLabel__lastName": "Nazwisko", + "formFieldLabel__newPassword": "Nowe hasło", + "formFieldLabel__organizationDomain": "Domena", + "formFieldLabel__organizationDomainDeletePending": "Usuń oczekujące zaproszenia i sugestie", + "formFieldLabel__organizationDomainEmailAddress": "Adres email weryfikacyjny", + "formFieldLabel__organizationDomainEmailAddressDescription": "Wprowadź adres email pod tą domeną, aby otrzymać kod i zweryfikować tę domenę.", + "formFieldLabel__organizationName": "Nazwa", + "formFieldLabel__organizationSlug": "Slug", + "formFieldLabel__passkeyName": "Nazwa klucza dostępu", + "formFieldLabel__password": "Hasło", + "formFieldLabel__phoneNumber": "Numer telefonu", + "formFieldLabel__role": "Rola", + "formFieldLabel__signOutOfOtherSessions": "Wyloguj ze wszystkich innych urządzeń", + "formFieldLabel__username": "Nazwa użytkownika", + "impersonationFab": { + "action__signOut": "Wyloguj", + "title": "Zalogowany jako {{identifier}}" + }, + "locale": "pl-PL", + "maintenanceMode": "Obecnie trwają prace konserwacyjne, ale nie martw się, nie powinny potrwać dłużej niż kilka minut.", + "membershipRole__admin": "Administrator", + "membershipRole__basicMember": "Członek", + "membershipRole__guestMember": "Gość", + "organizationList": { + "action__createOrganization": "Utwórz organizację", + "action__invitationAccept": "Dołącz", + "action__suggestionsAccept": "Poproś o dołączenie", + "createOrganization": "Utwórz organizację", + "invitationAcceptedLabel": "Dołączono", + "subtitle": "aby kontynuować jako {{applicationName}}", + "suggestionsAcceptedLabel": "Oczekuje na zatwierdzenie", + "title": "Wybierz konto", + "titleWithoutPersonal": "Wybierz organizację" + }, + "organizationProfile": { + "badge__automaticInvitation": "Automatyczne zaproszenia", + "badge__automaticSuggestion": "Automatyczne sugestie", + "badge__manualInvitation": "Brak automatycznego zapisu", + "badge__unverified": "Niezweryfikowany", + "createDomainPage": { + "subtitle": "Dodaj domenę do weryfikacji. Użytkownicy z adresami e-mail na tej domenie mogą automatycznie dołączyć do organizacji lub poprosić o dołączenie.", + "title": "Dodaj domenę" + }, + "invitePage": { + "detailsTitle__inviteFailed": "Zaproszenia nie mogły zostać wysłane. Istnieją już oczekujące zaproszenia dla następujących adresów e-mail: {{email_addresses}}.", + "formButtonPrimary__continue": "Wyślij zaproszenia", + "selectDropdown__role": "Wybierz rolę", + "subtitle": "Wprowadź lub wklej jeden lub więcej adresów e-mail, oddzielając je spacjami lub przecinkami.", + "successMessage": "Zaproszenia zostały pomyślnie wysłane", + "title": "Zaproś nowych członków" + }, + "membersPage": { + "action__invite": "Zaproś", + "activeMembersTab": { + "menuAction__remove": "Usuń członka", + "tableHeader__actions": "", + "tableHeader__joined": "Dołączono", + "tableHeader__role": "Rola", + "tableHeader__user": "Użytkownik" + }, + "detailsTitle__emptyRow": "Brak członków do wyświetlenia", + "invitationsTab": { + "autoInvitations": { + "headerSubtitle": "Zaproś użytkowników, łącząc domenę e-mail z Twoją organizacją. Każdy, kto zarejestruje się z pasującą domeną e-mail, będzie mógł dołączyć do organizacji w dowolnym momencie.", + "headerTitle": "Automatyczne zaproszenia", + "primaryButton": "Zarządzaj zweryfikowanymi domenami" + }, + "table__emptyRow": "Brak zaproszeń do wyświetlenia" + }, + "invitedMembersTab": { + "menuAction__revoke": "Anuluj zaproszenie", + "tableHeader__invited": "Zaproszony" + }, + "requestsTab": { + "autoSuggestions": { + "headerSubtitle": "Użytkownicy, którzy zarejestrują się z pasującą domeną e-mail, będą mogli zobaczyć sugestię, aby poprosić o dołączenie do Twojej organizacji.", + "headerTitle": "Automatyczne sugestie", + "primaryButton": "Zarządzaj zweryfikowanymi domenami" + }, + "menuAction__approve": "Zatwierdź", + "menuAction__reject": "Odrzuć", + "tableHeader__requested": "Żądany dostęp", + "table__emptyRow": "Brak żądań do wyświetlenia" + }, + "start": { + "headerTitle__invitations": "Zaproszenia", + "headerTitle__members": "Członkowie", + "headerTitle__requests": "Żądania" + } + }, + "navbar": { + "description": "Zarządzaj swoją organizacją.", + "general": "Ogólne", + "members": "Członkowie", + "title": "Organizacja" + }, + "profilePage": { + "dangerSection": { + "deleteOrganization": { + "actionDescription": "Wpisz „{{organizationName}}” poniżej, aby kontynuować.", + "messageLine1": "Czy na pewno chcesz usunąć tę organizację?", + "messageLine2": "Ta czynność jest trwała i nieodwracalna.", + "successMessage": "Usunąłeś organizację.", + "title": "Usuń organizację" + }, + "leaveOrganization": { + "actionDescription": "Wpisz „{{organizationName}}” poniżej, aby kontynuować.", + "messageLine1": "Czy na pewno chcesz opuścić tę organizację? Stracisz dostęp do tej organizacji i jej aplikacji.", + "messageLine2": "Ta czynność jest trwała i nieodwracalna.", + "successMessage": "Opuściłeś organizację.", + "title": "Opuść organizację" + }, + "title": "Zagrożenie" + }, + "domainSection": { + "menuAction__manage": "Zarządzaj", + "menuAction__remove": "Usuń", + "menuAction__verify": "Zweryfikuj", + "primaryButton": "Dodaj domenę", + "subtitle": "Pozwól użytkownikom automatycznie dołączać do organizacji lub prosić o dołączenie na podstawie zweryfikowanej domeny e-mail.", + "title": "Zweryfikowane domeny" + }, + "successMessage": "Organizacja została zaktualizowana.", + "title": "Zaktualizuj profil" + }, + "removeDomainPage": { + "messageLine1": "Domena e-mail {{domain}} zostanie usunięta.", + "messageLine2": "Użytkownicy nie będą mogli automatycznie dołączać do organizacji po tej czynności.", + "successMessage": "{{domain}} została usunięta.", + "title": "Usuń domenę" + }, + "start": { + "headerTitle__general": "Ogólne", + "headerTitle__members": "Członkowie", + "profileSection": { + "primaryButton": "Zaktualizuj profil", + "title": "Profil organizacji", + "uploadAction__title": "Logo" + } + }, + "verifiedDomainPage": { + "dangerTab": { + "calloutInfoLabel": "Usunięcie tej domeny wpłynie na zaproszonych użytkowników.", + "removeDomainActionLabel__remove": "Usuń domenę", + "removeDomainSubtitle": "Usuń tę domenę z Twoich zweryfikowanych domen", + "removeDomainTitle": "Usuń domenę" + }, + "enrollmentTab": { + "automaticInvitationOption__description": "Użytkownicy są automatycznie zapraszani do dołączenia do organizacji podczas rejestracji i mogą dołączyć w dowolnym momencie.", + "automaticInvitationOption__label": "Automatyczne zaproszenia", + "automaticSuggestionOption__description": "Użytkownicy otrzymują sugestię, aby poprosić o dołączenie, ale muszą zostać zatwierdzeni przez administratora przed dołączeniem do organizacji.", + "automaticSuggestionOption__label": "Automatyczne sugestie", + "calloutInfoLabel": "Zmiana trybu zapisu dotyczy tylko nowych użytkowników.", + "calloutInvitationCountLabel": "Liczba zaproszeń wysłanych do użytkowników: {{count}}", + "calloutSuggestionCountLabel": "Liczba sugestii wysłanych do użytkowników: {{count}}", + "manualInvitationOption__description": "Użytkownicy mogą być zapraszani ręcznie do organizacji.", + "manualInvitationOption__label": "Brak automatycznego zapisu", + "subtitle": "Wybierz, w jaki sposób użytkownicy z tej domeny mogą dołączyć do organizacji." + }, + "start": { + "headerTitle__danger": "Zagrożenie", + "headerTitle__enrollment": "Opcje zapisu" + }, + "subtitle": "Domena {{domain}} jest teraz zweryfikowana. Kontynuuj, wybierając tryb zapisu.", + "title": "Aktualizuj {{domain}}" + }, + "verifyDomainPage": { + "formSubtitle": "Wprowadź kod weryfikacyjny wysłany na Twój adres e-mail", + "formTitle": "Kod weryfikacyjny", + "resendButton": "Nie otrzymałeś kodu? Wyślij ponownie", + "subtitle": "Domena {{domainName}} musi zostać zweryfikowana za pomocą e-maila.", + "subtitleVerificationCodeScreen": "Kod weryfikacyjny został wysłany na {{emailAddress}}. Wprowadź kod, aby kontynuować.", + "title": "Zweryfikuj domenę" + } + }, + "organizationSwitcher": { + "action__createOrganization": "Utwórz organizację", + "action__invitationAccept": "Dołącz", + "action__manageOrganization": "Zarządzaj", + "action__suggestionsAccept": "Poproś o dołączenie", + "notSelected": "Nie wybrano organizacji", + "personalWorkspace": "Konto osobiste", + "suggestionsAcceptedLabel": "Oczekuje na zatwierdzenie" + }, + "paginationButton__next": "Następny", + "paginationButton__previous": "Poprzedni", + "paginationRowText__displaying": "Wyświetlanie", + "paginationRowText__of": "z", + "signIn": { + "accountSwitcher": { + "action__addAccount": "Dodaj konto", + "action__signOutAll": "Wyloguj ze wszystkich kont", + "subtitle": "Wybierz konto, z którym chcesz kontynuować.", + "title": "Wybierz konto" + }, + "alternativeMethods": { + "actionLink": "Uzyskaj pomoc", + "actionText": "Nie masz żadnego z tych?", + "blockButton__backupCode": "Użyj kodu zapasowego", + "blockButton__emailCode": "Wyślij kod e-mailem na {{identifier}}", + "blockButton__emailLink": "Wyślij link e-mailem na {{identifier}}", + "blockButton__passkey": "Zaloguj się za pomocą klucza", + "blockButton__password": "Zaloguj się za pomocą hasła", + "blockButton__phoneCode": "Wyślij kod SMS na {{identifier}}", + "blockButton__totp": "Użyj aplikacji uwierzytelniającej", + "getHelp": { + "blockButton__emailSupport": "Wsparcie e-mailowe", + "content": "Jeśli masz problemy z zalogowaniem się do swojego konta, prześlij do nas e-mail, a postaramy się przywrócić dostęp tak szybko, jak to możliwe.", + "title": "Uzyskaj pomoc" + }, + "subtitle": "Masz problemy? Możesz skorzystać z dowolnej z tych metod logowania.", + "title": "Użyj innej metody" + }, + "backupCodeMfa": { + "subtitle": "Twój kod zapasowy to ten, który otrzymałeś podczas konfigurowania uwierzytelniania dwuetapowego.", + "title": "Wprowadź kod zapasowy" + }, + "emailCode": { + "formTitle": "Kod weryfikacyjny", + "resendButton": "Nie otrzymałeś kodu? Wyślij ponownie", + "subtitle": "aby kontynuować do {{applicationName}}", + "title": "Sprawdź swój e-mail" + }, + "emailLink": { + "expired": { + "subtitle": "Wróć do oryginalnej karty, aby kontynuować.", + "title": "Ten link weryfikacyjny wygasł" + }, + "failed": { + "subtitle": "Wróć do oryginalnej karty, aby kontynuować.", + "title": "Ten link weryfikacyjny jest nieprawidłowy" + }, + "formSubtitle": "Użyj linku weryfikacyjnego wysłanego na Twój e-mail", + "formTitle": "Link weryfikacyjny", + "loading": { + "subtitle": "Zostaniesz przekierowany wkrótce", + "title": "Logowanie..." + }, + "resendButton": "Nie otrzymałeś linku? Wyślij ponownie", + "subtitle": "aby kontynuować do {{applicationName}}", + "title": "Sprawdź swój e-mail", + "unusedTab": { + "title": "Możesz zamknąć tę kartę" + }, + "verified": { + "subtitle": "Zostaniesz przekierowany wkrótce", + "title": "Pomyślnie zalogowano" + }, + "verifiedSwitchTab": { + "subtitle": "Wróć do oryginalnej karty, aby kontynuować", + "subtitleNewTab": "Wróć do nowo otwartej karty, aby kontynuować", + "titleNewTab": "Zalogowano na innej karcie" + } + }, + "forgotPassword": { + "formTitle": "Kod resetowania hasła", + "resendButton": "Nie otrzymałeś kodu? Wyślij ponownie", + "subtitle": "aby zresetować hasło", + "subtitle_email": "Najpierw wprowadź kod wysłany na Twój adres e-mail", + "subtitle_phone": "Najpierw wprowadź kod wysłany na Twój telefon", + "title": "Zresetuj hasło" + }, + "forgotPasswordAlternativeMethods": { + "blockButton__resetPassword": "Zresetuj swoje hasło", + "label__alternativeMethods": "Albo zaloguj się za pomocą innej metody", + "title": "Zapomniałeś hasła?" + }, + "noAvailableMethods": { + "message": "Nie można kontynuować logowania. Brak dostępnych czynników uwierzytelniających.", + "subtitle": "Wystąpił błąd", + "title": "Nie można się zalogować" + }, + "passkey": { + "subtitle": "Użycie klucza potwierdza Twoją tożsamość. Twóje urządzenie może poprosić o odcisk palca, rozpoznanie twarzy lub blokadę ekranu.", + "title": "Użyj swojego klucza" + }, + "password": { + "actionLink": "Użyj innej metody", + "subtitle": "Wprowadź hasło powiązane z Twoim kontem", + "title": "Wprowadź swoje hasło" + }, + "passwordPwned": { + "title": "Hasło skompromitowane" + }, + "phoneCode": { + "formTitle": "Kod weryfikacyjny", + "resendButton": "Nie otrzymałeś kodu? Wyślij ponownie", + "subtitle": "aby kontynuować do {{applicationName}}", + "title": "Sprawdź swój telefon" + }, + "phoneCodeMfa": { + "formTitle": "Kod weryfikacyjny", + "resendButton": "Nie otrzymałeś kodu? Wyślij ponownie", + "subtitle": "Aby kontynuować, wprowadź kod weryfikacyjny wysłany na Twój telefon", + "title": "Sprawdź swój telefon" + }, + "resetPassword": { + "formButtonPrimary": "Zresetuj hasło", + "requiredMessage": "Z powodów bezpieczeństwa konieczne jest zresetowanie hasła.", + "successMessage": "Twoje hasło zostało pomyślnie zmienione. Logowanie, proszę czekać chwilę.", + "title": "Ustaw nowe hasło" + }, + "resetPasswordMfa": { + "detailsLabel": "Musimy zweryfikować Twoją tożsamość przed zresetowaniem hasła." + }, + "start": { + "actionLink": "Zarejestruj się", + "actionLink__use_email": "Użyj e-maila", + "actionLink__use_email_username": "Użyj e-maila lub nazwy użytkownika", + "actionLink__use_passkey": "Użyj klucza", + "actionLink__use_phone": "Użyj telefonu", + "actionLink__use_username": "Użyj nazwy użytkownika", + "actionText": "Nie masz konta?", + "subtitle": "Witaj ponownie! Proszę zaloguj się, aby kontynuować", + "title": "Zaloguj się do {{applicationName}}" + }, + "totpMfa": { + "formTitle": "Kod weryfikacyjny", + "subtitle": "Aby kontynuować, wprowadź kod weryfikacyjny wygenerowany przez swoją aplikację uwierzytelniającą", + "title": "Weryfikacja dwuetapowa" + } + }, + "signInEnterPasswordTitle": "Wprowadź swoje hasło", + "signUp": { + "continue": { + "actionLink": "Zaloguj się", + "actionText": "Masz już konto?", + "subtitle": "Proszę uzupełnij pozostałe dane, aby kontynuować.", + "title": "Uzupełnij brakujące pola" + }, + "emailCode": { + "formSubtitle": "Wprowadź kod weryfikacyjny wysłany na Twój adres e-mail", + "formTitle": "Kod weryfikacyjny", + "resendButton": "Nie otrzymałeś kodu? Wyślij ponownie", + "subtitle": "Wprowadź kod weryfikacyjny wysłany na Twój adres e-mail", + "title": "Zweryfikuj swój e-mail" + }, + "emailLink": { + "formSubtitle": "Użyj linku weryfikacyjnego wysłanego na Twój adres e-mail", + "formTitle": "Link weryfikacyjny", + "loading": { + "title": "Rejestrowanie..." + }, + "resendButton": "Nie otrzymałeś linku? Wyślij ponownie", + "subtitle": "Aby kontynuować do {{applicationName}}", + "title": "Zweryfikuj swój e-mail", + "verified": { + "title": "Pomyślnie zarejestrowano" + }, + "verifiedSwitchTab": { + "subtitle": "Wróć do nowo otwartej karty, aby kontynuować", + "subtitleNewTab": "Wróć do poprzedniej karty, aby kontynuować", + "title": "Pomyślnie zweryfikowano e-mail" + } + }, + "phoneCode": { + "formSubtitle": "Wprowadź kod weryfikacyjny wysłany na Twój numer telefonu", + "formTitle": "Kod weryfikacyjny", + "resendButton": "Nie otrzymałeś kodu? Wyślij ponownie", + "subtitle": "Wprowadź kod weryfikacyjny wysłany na Twój numer telefonu", + "title": "Zweryfikuj swój telefon" + }, + "start": { + "actionLink": "Zaloguj się", + "actionText": "Masz już konto?", + "subtitle": "Witaj! Proszę wypełnij szczegóły, aby rozpocząć.", + "title": "Utwórz swoje konto" + } + }, + "socialButtonsBlockButton": "Kontynuuj z {{provider|titleize}}", + "unstable__errors": { + "captcha_invalid": "Rejestracja nieudana z powodu nieprawidłowych walidacji zabezpieczeń. Proszę odświeżyć stronę i spróbować ponownie lub skontaktować się z pomocą techniczną.", + "captcha_unavailable": "Rejestracja nieudana z powodu nieprawidłowej weryfikacji botów. Proszę odświeżyć stronę i spróbować ponownie lub skontaktować się z pomocą techniczną.", + "form_code_incorrect": "", + "form_identifier_exists": "", + "form_identifier_exists__email_address": "Ten adres e-mail jest zajęty. Proszę spróbować innego.", + "form_identifier_exists__phone_number": "Ten numer telefonu jest zajęty. Proszę spróbować innego.", + "form_identifier_exists__username": "Ta nazwa użytkownika jest zajęta. Proszę spróbować innego.", + "form_identifier_not_found": "", + "form_param_format_invalid": "", + "form_param_format_invalid__email_address": "Adres e-mail musi być poprawny.", + "form_param_format_invalid__phone_number": "Numer telefonu musi być w poprawnym formacie międzynarodowym.", + "form_param_max_length_exceeded__first_name": "Imię nie powinno przekraczać 256 znaków.", + "form_param_max_length_exceeded__last_name": "Nazwisko nie powinno przekraczać 256 znaków.", + "form_param_max_length_exceeded__name": "Nazwa nie powinna przekraczać 256 znaków.", + "form_param_nil": "", + "form_password_incorrect": "", + "form_password_length_too_short": "", + "form_password_not_strong_enough": "Twoje hasło nie jest wystarczająco silne.", + "form_password_pwned": "To hasło zostało znalezione w wyniku naruszenia i nie może być używane, proszę spróbować innego hasła.", + "form_password_pwned__sign_in": "To hasło zostało znalezione w wyniku naruszenia i nie może być używane, proszę zresetować hasło.", + "form_password_size_in_bytes_exceeded": "Twoje hasło przekroczyło maksymalną liczbę dozwolonych bajtów, proszę skrócić je lub usunąć niektóre znaki specjalne.", + "form_password_validation_failed": "Nieprawidłowe hasło.", + "form_username_invalid_character": "", + "form_username_invalid_length": "", + "identification_deletion_failed": "Nie możesz usunąć swojej ostatniej identyfikacji.", + "not_allowed_access": "", + "passkey_already_exists": "Klucz dostępu jest już zarejestrowany na tym urządzeniu.", + "passkey_not_supported": "Klucze dostępu nie są obsługiwane na tym urządzeniu.", + "passkey_pa_not_supported": "Rejestracja wymaga autentykatora platformy, ale urządzenie go nie obsługuje.", + "passkey_registration_cancelled": "Rejestracja klucza dostępu została anulowana lub przekroczyła limit czasu.", + "passkey_retrieval_cancelled": "Weryfikacja klucza dostępu została anulowana lub przekroczyła limit czasu.", + "passwordComplexity": { + "maximumLength": "mniej niż {{length}} znaków", + "minimumLength": "{{length}} lub więcej znaków", + "requireLowercase": "małą literę", + "requireNumbers": "cyfrę", + "requireSpecialCharacter": "znak specjalny", + "requireUppercase": "wielką literę", + "sentencePrefix": "Twoje hasło musi zawierać" + }, + "phone_number_exists": "Ten numer telefonu jest zajęty. Proszę spróbować innego.", + "zxcvbn": { + "couldBeStronger": "Twoje hasło działa, ale mogłoby być silniejsze. Spróbuj dodać więcej znaków.", + "goodPassword": "Twoje hasło spełnia wszystkie wymagane kryteria.", + "notEnough": "Twoje hasło nie jest wystarczająco silne.", + "suggestions": { + "allUppercase": "Zastosuj wielką literę w niektórych, ale nie we wszystkich literach.", + "anotherWord": "Dodaj więcej mniej popularnych słów.", + "associatedYears": "Unikaj lat związanych z Tobą.", + "capitalization": "Zastosuj wielką literę nie tylko na początku.", + "dates": "Unikaj dat związanych z Tobą.", + "l33t": "Unikaj przewidywalnych zastąpień liter, np. '@' zamiast 'a'.", + "longerKeyboardPattern": "Użyj dłuższych wzorców klawiatury i zmieniaj kierunek pisania kilka razy.", + "noNeed": "Możesz tworzyć silne hasła bez użycia symboli, cyfr ani wielkich liter.", + "pwned": "Jeśli używasz tego hasła gdzie indziej, powinieneś je zmienić.", + "recentYears": "Unikaj ostatnich lat.", + "repeated": "Unikaj powtórzonych słów i znaków.", + "reverseWords": "Unikaj odwróconych zapisów powszechnych słów.", + "sequences": "Unikaj powszechnych sekwencji znaków.", + "useWords": "Użyj kilku słów, ale unikaj powszechnych fraz." + }, + "warnings": { + "common": "To jest powszechnie używane hasło.", + "commonNames": "Powszechne imiona i nazwiska są łatwe do odgadnięcia.", + "dates": "Daty są łatwe do odgadnięcia.", + "extendedRepeat": "Powtarzające się wzorce znaków, np. \"abcabcabc\", są łatwe do odgadnięcia.", + "keyPattern": "Krótkie wzorce klawiatury są łatwe do odgadnięcia.", + "namesByThemselves": "Same imiona lub nazwiska są łatwe do odgadnięcia.", + "pwned": "Twoje hasło zostało ujawnione w wyniku naruszenia danych w Internecie.", + "recentYears": "Ostatnie lata są łatwe do odgadnięcia.", + "sequences": "Powszechne sekwencje znaków, np. \"abc\", są łatwe do odgadnięcia.", + "similarToCommon": "To jest podobne do powszechnie używanego hasła.", + "simpleRepeat": "Powtarzające się znaki, np. \"aaa\", są łatwe do odgadnięcia.", + "straightRow": "Proste rzędy klawiszy na klawiaturze są łatwe do odgadnięcia.", + "topHundred": "To jest często używane hasło.", + "topTen": "To jest bardzo popularne hasło.", + "userInputs": "Nie powinno zawierać danych osobistych ani związanych z stroną.", + "wordByItself": "Same słowa są łatwe do odgadnięcia." + } + } + }, + "userButton": { + "action__addAccount": "Dodaj konto", + "action__manageAccount": "Zarządzaj kontem", + "action__signOut": "Wyloguj", + "action__signOutAll": "Wyloguj ze wszystkich kont" + }, + "userProfile": { + "backupCodePage": { + "actionLabel__copied": "Skopiowano!", + "actionLabel__copy": "Skopiuj wszystko", + "actionLabel__download": "Pobierz .txt", + "actionLabel__print": "Drukuj", + "infoText1": "Kody zapasowe zostaną włączone dla tego konta.", + "infoText2": "Trzymaj kody zapasowe w tajemnicy i przechowuj je bezpiecznie. Możesz wygenerować nowe kody zapasowe, jeśli podejrzewasz, że zostały skompromitowane.", + "subtitle__codelist": "Przechowuj je bezpiecznie i trzymaj je w tajemnicy.", + "successMessage": "Kody zapasowe są teraz włączone. Możesz użyć jednego z nich, aby zalogować się do swojego konta, jeśli stracisz dostęp do swojego urządzenia uwierzytelniającego. Każdy kod można użyć tylko raz.", + "successSubtitle": "Możesz użyć jednego z tych kodów, aby zalogować się do swojego konta, jeśli stracisz dostęp do swojego urządzenia uwierzytelniającego.", + "title": "Dodaj weryfikację kodu zapasowego", + "title__codelist": "Kody zapasowe" + }, + "connectedAccountPage": { + "formHint": "Wybierz dostawcę, aby połączyć swoje konto.", + "formHint__noAccounts": "Brak dostępnych zewnętrznych dostawców kont.", + "removeResource": { + "messageLine1": "{{identifier}} zostanie usunięty z tego konta.", + "messageLine2": "Nie będziesz już mógł używać tego połączonego konta, a wszelkie zależne funkcje przestaną działać.", + "successMessage": "{{connectedAccount}} został usunięty z Twojego konta.", + "title": "Usuń połączone konto" + }, + "socialButtonsBlockButton": "{{provider|titleize}}", + "successMessage": "Dostawca został dodany do Twojego konta", + "title": "Dodaj połączone konto" + }, + "deletePage": { + "actionDescription": "Wpisz \"Usuń konto\" poniżej, aby kontynuować.", + "confirm": "Usuń konto", + "messageLine1": "Czy na pewno chcesz usunąć swoje konto?", + "messageLine2": "Ta czynność jest trwała i nieodwracalna.", + "title": "Usuń konto" + }, + "emailAddressPage": { + "emailCode": { + "formHint": "Na ten adres e-mail zostanie wysłany e-mail z kodem weryfikacyjnym.", + "formSubtitle": "Wprowadź kod weryfikacyjny wysłany na {{identifier}}", + "formTitle": "Kod weryfikacyjny", + "resendButton": "Nie otrzymałeś kodu? Wyślij ponownie", + "successMessage": "E-mail {{identifier}} został dodany do Twojego konta." + }, + "emailLink": { + "formHint": "Na ten adres e-mail zostanie wysłany e-mail z linkiem weryfikacyjnym.", + "formSubtitle": "Kliknij w link weryfikacyjny w e-mailu wysłanym na {{identifier}}", + "formTitle": "Link weryfikacyjny", + "resendButton": "Nie otrzymałeś linku? Wyślij ponownie", + "successMessage": "E-mail {{identifier}} został dodany do Twojego konta." + }, + "removeResource": { + "messageLine1": "{{identifier}} zostanie usunięty z tego konta.", + "messageLine2": "Nie będziesz już mógł się zalogować używając tego adresu e-mail.", + "successMessage": "{{emailAddress}} został usunięty z Twojego konta.", + "title": "Usuń adres e-mail" + }, + "title": "Dodaj adres e-mail", + "verifyTitle": "Zweryfikuj adres e-mail" + }, + "formButtonPrimary__add": "Dodaj", + "formButtonPrimary__continue": "Kontynuuj", + "formButtonPrimary__finish": "Zakończ", + "formButtonPrimary__remove": "Usuń", + "formButtonPrimary__save": "Zapisz", + "formButtonReset": "Anuluj", + "mfaPage": { + "formHint": "Wybierz metodę do dodania.", + "title": "Dodaj weryfikację dwuetapową" + }, + "mfaPhoneCodePage": { + "backButton": "Użyj istniejącego numeru", + "primaryButton__addPhoneNumber": "Dodaj numer telefonu", + "removeResource": { + "messageLine1": "{{identifier}} nie będzie już otrzymywać kodów weryfikacyjnych podczas logowania.", + "messageLine2": "Twoje konto może być mniej bezpieczne. Czy na pewno chcesz kontynuować?", + "successMessage": "Weryfikacja dwuetapowa za pomocą kodów SMS została usunięta dla {{mfaPhoneCode}}", + "title": "Usuń weryfikację dwuetapową" + }, + "subtitle__availablePhoneNumbers": "Wybierz istniejący numer telefonu, aby zarejestrować się do weryfikacji dwuetapowej za pomocą kodów SMS lub dodaj nowy.", + "subtitle__unavailablePhoneNumbers": "Brak dostępnych numerów telefonów do rejestracji weryfikacji dwuetapowej za pomocą kodów SMS, proszę dodać nowy.", + "successMessage1": "Podczas logowania będziesz musiał wprowadzić kod weryfikacyjny wysłany na ten numer telefonu jako dodatkowy krok.", + "successMessage2": "Zapisz te kody zapasowe i przechowuj je w bezpiecznym miejscu. Jeśli stracisz dostęp do swojego urządzenia uwierzytelniającego, możesz użyć kodów zapasowych do zalogowania się.", + "successTitle": "Weryfikacja kodów SMS włączona", + "title": "Dodaj weryfikację kodów SMS" + }, + "mfaTOTPPage": { + "authenticatorApp": { + "buttonAbleToScan__nonPrimary": "Zeskanuj kod QR", + "buttonUnableToScan__nonPrimary": "Nie możesz zeskanować kodu QR?", + "infoText__ableToScan": "Skonfiguruj nową metodę logowania w swojej aplikacji uwierzytelniającej i zeskanuj poniższy kod QR, aby połączyć go z Twoim kontem.", + "infoText__unableToScan": "Skonfiguruj nową metodę logowania w swojej aplikacji uwierzytelniającej i wprowadź poniższy klucz.", + "inputLabel__unableToScan1": "Upewnij się, że hasła oparte na czasie lub jednorazowe są włączone, a następnie zakończ łączenie konta.", + "inputLabel__unableToScan2": "Alternatywnie, jeśli Twój uwierzytelniacz obsługuje adresy URL TOTP, możesz również skopiować pełny adres URL." + }, + "removeResource": { + "messageLine1": "Kody weryfikacyjne z tego uwierzytelniacza nie będą już wymagane podczas logowania.", + "messageLine2": "Twoje konto może być mniej bezpieczne. Czy na pewno chcesz kontynuować?", + "successMessage": "Weryfikacja dwuetapowa za pomocą aplikacji uwierzytelniającej została usunięta.", + "title": "Usuń weryfikację dwuetapową" + }, + "successMessage": "Weryfikacja dwuetapowa jest teraz włączona. Podczas logowania będziesz musiał wprowadzić kod weryfikacyjny z tego uwierzytelniacza jako dodatkowy krok.", + "title": "Dodaj aplikację uwierzytelniającą", + "verifySubtitle": "Wprowadź kod weryfikacyjny wygenerowany przez swoją aplikację uwierzytelniającą", + "verifyTitle": "Kod weryfikacyjny" + }, + "mobileButton__menu": "Menu", + "navbar": { + "account": "Profil", + "description": "Zarządzaj informacjami o koncie.", + "security": "Bezpieczeństwo", + "title": "Konto" + }, + "passkeyScreen": { + "removeResource": { + "messageLine1": "{{name}} zostanie usunięty z tego konta.", + "title": "Usuń klucz dostępu" + }, + "subtitle__rename": "Możesz zmienić nazwę klucza dostępu, aby łatwiej go znaleźć.", + "title__rename": "Zmień nazwę klucza dostępu" + }, + "passwordPage": { + "checkboxInfoText__signOutOfOtherSessions": "Zaleca się wylogowanie ze wszystkich innych urządzeń, które mogły używać twojego starego hasła.", + "readonly": "Twoje hasło obecnie nie może być edytowane, ponieważ możesz się zalogować tylko za pośrednictwem połączenia korporacyjnego.", + "successMessage__set": "Twoje hasło zostało ustawione.", + "successMessage__signOutOfOtherSessions": "Wszystkie inne urządzenia zostały wylogowane.", + "successMessage__update": "Twoje hasło zostało zaktualizowane.", + "title__set": "Ustaw hasło", + "title__update": "Zaktualizuj hasło" + }, + "phoneNumberPage": { + "infoText": "Na ten numer telefonu zostanie wysłana wiadomość tekstowa z kodem weryfikacyjnym. Mogą obowiązywać opłaty za wiadomości i dane.", + "removeResource": { + "messageLine1": "{{identifier}} zostanie usunięty z tego konta.", + "messageLine2": "Nie będziesz już mógł się zalogować za pomocą tego numeru telefonu.", + "successMessage": "{{phoneNumber}} został usunięty z twojego konta.", + "title": "Usuń numer telefonu" + }, + "successMessage": "{{identifier}} został dodany do twojego konta.", + "title": "Dodaj numer telefonu", + "verifySubtitle": "Wprowadź kod weryfikacyjny wysłany na {{identifier}}", + "verifyTitle": "Zweryfikuj numer telefonu" + }, + "profilePage": { + "fileDropAreaHint": "Zalecany rozmiar 1:1, do 10 MB.", + "imageFormDestructiveActionSubtitle": "Usuń", + "imageFormSubtitle": "Prześlij", + "imageFormTitle": "Zdjęcie profilowe", + "readonly": "Twoje informacje profilowe zostały dostarczone przez połączenie korporacyjne i nie mogą być edytowane.", + "successMessage": "Twój profil został zaktualizowany.", + "title": "Zaktualizuj profil" + }, + "start": { + "activeDevicesSection": { + "destructiveAction": "Wyloguj z urządzenia", + "title": "Aktywne urządzenia" + }, + "connectedAccountsSection": { + "actionLabel__connectionFailed": "Spróbuj ponownie", + "actionLabel__reauthorize": "Autoryzuj teraz", + "destructiveActionTitle": "Usuń", + "primaryButton": "Połącz konto", + "subtitle__reauthorize": "Wymagane zakresy zostały zaktualizowane, a możesz doświadczać ograniczonej funkcjonalności. Proszę ponownie autoryzować tę aplikację, aby uniknąć problemów", + "title": "Połączone konta" + }, + "dangerSection": { + "deleteAccountButton": "Usuń konto", + "title": "Usuń konto" + }, + "emailAddressesSection": { + "destructiveAction": "Usuń e-mail", + "detailsAction__nonPrimary": "Ustaw jako główny", + "detailsAction__primary": "Zakończ weryfikację", + "detailsAction__unverified": "Zweryfikuj", + "primaryButton": "Dodaj adres e-mail", + "title": "Adresy e-mail" + }, + "enterpriseAccountsSection": { + "title": "Konta firmowe" + }, + "headerTitle__account": "Szczegóły profilu", + "headerTitle__security": "Bezpieczeństwo", + "mfaSection": { + "backupCodes": { + "actionLabel__regenerate": "Wygeneruj ponownie", + "headerTitle": "Kody zapasowe", + "subtitle__regenerate": "Uzyskaj nowy zestaw bezpiecznych kodów zapasowych. Poprzednie kody zapasowe zostaną usunięte i nie będą mogły być użyte.", + "title__regenerate": "Wygeneruj ponownie kody zapasowe" + }, + "phoneCode": { + "actionLabel__setDefault": "Ustaw jako domyślny", + "destructiveActionLabel": "Usuń" + }, + "primaryButton": "Dodaj weryfikację dwuetapową", + "title": "Weryfikacja dwuetapowa", + "totp": { + "destructiveActionTitle": "Usuń", + "headerTitle": "Aplikacja autoryzacyjna" + } + }, + "passkeysSection": { + "menuAction__destructive": "Usuń", + "menuAction__rename": "Zmień nazwę", + "title": "Klucze dostępu" + }, + "passwordSection": { + "primaryButton__setPassword": "Ustaw hasło", + "primaryButton__updatePassword": "Zaktualizuj hasło", + "title": "Hasło" + }, + "phoneNumbersSection": { + "destructiveAction": "Usuń numer telefonu", + "detailsAction__nonPrimary": "Ustaw jako główny", + "detailsAction__primary": "Zakończ weryfikację", + "detailsAction__unverified": "Zweryfikuj numer telefonu", + "primaryButton": "Dodaj numer telefonu", + "title": "Numery telefonów" + }, + "profileSection": { + "primaryButton": "Zaktualizuj profil", + "title": "Profil" + }, + "usernameSection": { + "primaryButton__setUsername": "Ustaw nazwę użytkownika", + "primaryButton__updateUsername": "Zaktualizuj nazwę użytkownika", + "title": "Nazwa użytkownika" + }, + "web3WalletsSection": { + "destructiveAction": "Usuń portfel", + "primaryButton": "Portfele Web3", + "title": "Portfele Web3" + } + }, + "usernamePage": { + "successMessage": "Twoja nazwa użytkownika została zaktualizowana.", + "title__set": "Ustaw nazwę użytkownika", + "title__update": "Zaktualizuj nazwę użytkownika" + }, + "web3WalletPage": { + "removeResource": { + "messageLine1": "{{identifier}} zostanie usunięty z tego konta.", + "messageLine2": "Nie będziesz już mógł się zalogować za pomocą tej portfela web3.", + "successMessage": "{{web3Wallet}} został usunięty z twojego konta.", + "title": "Usuń portfel web3" + }, + "subtitle__availableWallets": "Wybierz portfel web3, aby połączyć go z twoim kontem.", + "subtitle__unavailableWallets": "Brak dostępnych portfeli web3.", + "successMessage": "Portfel został dodany do twojego konta.", + "title": "Dodaj portfel web3" + } + } +} diff --git a/locales/pl-PL/common.json b/locales/pl-PL/common.json index ecf832a1ea1e7..df1e3e87d1a3a 100644 --- a/locales/pl-PL/common.json +++ b/locales/pl-PL/common.json @@ -160,6 +160,7 @@ "newVersion": "Dostępna jest nowa wersja: {{version}}" }, "userPanel": { + "anonymousNickName": "Użytkownik Anonimowy", "billing": "Zarządzanie rachunkami", "defaultNickname": "Użytkownik Wersji Społecznościowej", "discord": "Wsparcie społeczności", diff --git a/locales/pl-PL/error.json b/locales/pl-PL/error.json index da548fe854cf1..a1a34a4129cc3 100644 --- a/locales/pl-PL/error.json +++ b/locales/pl-PL/error.json @@ -1,4 +1,11 @@ { + "clerkAuth": { + "loginSuccess": { + "action": "继续会话", + "desc": "{{greeting}},很高兴能够继续为你服务。让我们接着刚刚的话题聊下去吧", + "title": "欢迎回来, {{nickName}}" + } + }, "error": { "backHome": "Powrót do strony głównej", "desc": "Spróbuj ponownie później lub wróć do znanego świata", @@ -54,6 +61,7 @@ "InvalidAnthropicAPIKey": "Anthropic API Key jest nieprawidłowy lub pusty. Sprawdź poprawność klucza API Anthropic i spróbuj ponownie.", "InvalidAzureAPIKey": "Nieprawidłowy lub pusty klucz API Azure, prosimy sprawdzić klucz API Azure i spróbować ponownie.", "InvalidBedrockCredentials": "Uwierzytelnienie Bedrock nie powiodło się, prosimy sprawdzić AccessKeyId/SecretAccessKey i spróbować ponownie.", + "InvalidClerkUser": "Przepraszamy, nie jesteś obecnie zalogowany. Proszę najpierw zalogować się lub zarejestrować, aby kontynuować.", "InvalidGoogleAPIKey": "Nieprawidłowy lub pusty klucz API Google, prosimy sprawdzić klucz API Google i spróbować ponownie.", "InvalidGroqAPIKey": "Nieprawidłowy klucz API Groq, prosimy sprawdzić klucz API Groq i spróbować ponownie.", "InvalidMinimaxAPIKey": "Nieprawidłowy lub pusty klucz API Minimax, proszę sprawdzić klucz API Minimax i spróbować ponownie", diff --git a/locales/pt-BR/auth.json b/locales/pt-BR/auth.json new file mode 100644 index 0000000000000..59c54583b4865 --- /dev/null +++ b/locales/pt-BR/auth.json @@ -0,0 +1,6 @@ +{ + "login": "Entrar", + "loginOrSignup": "Entrar / Registrar", + "signout": "Sair", + "signup": "Cadastre-se" +} diff --git a/locales/pt-BR/clerk.json b/locales/pt-BR/clerk.json new file mode 100644 index 0000000000000..6955b90f59ee5 --- /dev/null +++ b/locales/pt-BR/clerk.json @@ -0,0 +1,769 @@ +{ + "backButton": "Voltar", + "badge__default": "Padrão", + "badge__otherImpersonatorDevice": "Outro dispositivo de impostor", + "badge__primary": "Primário", + "badge__requiresAction": "Requer ação", + "badge__thisDevice": "Este dispositivo", + "badge__unverified": "Não verificado", + "badge__userDevice": "Dispositivo do usuário", + "badge__you": "Você", + "createOrganization": { + "formButtonSubmit": "Criar organização", + "invitePage": { + "formButtonReset": "Pular" + }, + "title": "Criar organização" + }, + "dates": { + "lastDay": "Ontem às {{ date | timeString('pt-BR') }}", + "next6Days": "{{ date | weekday('pt-BR','long') }} às {{ date | timeString('pt-BR') }}", + "nextDay": "Amanhã às {{ date | timeString('pt-BR') }}", + "numeric": "{{ date | numeric('pt-BR') }}", + "previous6Days": "Último(a) {{ date | weekday('pt-BR','long') }} às {{ date | timeString('pt-BR') }}", + "sameDay": "Hoje às {{ date | timeString('pt-BR') }}" + }, + "dividerText": "ou", + "footerActionLink__useAnotherMethod": "Usar outro método", + "footerPageLink__help": "Ajuda", + "footerPageLink__privacy": "Privacidade", + "footerPageLink__terms": "Termos", + "formButtonPrimary": "Continuar", + "formButtonPrimary__verify": "Verificar", + "formFieldAction__forgotPassword": "Esqueceu a senha?", + "formFieldError__matchingPasswords": "Senhas correspondem.", + "formFieldError__notMatchingPasswords": "Senhas não correspondem.", + "formFieldError__verificationLinkExpired": "O link de verificação expirou. Por favor, solicite um novo link.", + "formFieldHintText__optional": "Opcional", + "formFieldHintText__slug": "Um slug é um ID legível por humanos que deve ser único. Muitas vezes é usado em URLs.", + "formFieldInputPlaceholder__backupCode": "", + "formFieldInputPlaceholder__confirmDeletionUserAccount": "Excluir conta", + "formFieldInputPlaceholder__emailAddress": "", + "formFieldInputPlaceholder__emailAddress_username": "", + "formFieldInputPlaceholder__emailAddresses": "exemplo@email.com, exemplo2@email.com", + "formFieldInputPlaceholder__firstName": "", + "formFieldInputPlaceholder__lastName": "", + "formFieldInputPlaceholder__organizationDomain": "", + "formFieldInputPlaceholder__organizationDomainEmailAddress": "", + "formFieldInputPlaceholder__organizationName": "", + "formFieldInputPlaceholder__organizationSlug": "minha-org", + "formFieldInputPlaceholder__password": "", + "formFieldInputPlaceholder__phoneNumber": "", + "formFieldInputPlaceholder__username": "", + "formFieldLabel__automaticInvitations": "Ativar convites automáticos para este domínio", + "formFieldLabel__backupCode": "Código de backup", + "formFieldLabel__confirmDeletion": "Confirmação", + "formFieldLabel__confirmPassword": "Confirmar senha", + "formFieldLabel__currentPassword": "Senha atual", + "formFieldLabel__emailAddress": "Endereço de e-mail", + "formFieldLabel__emailAddress_username": "Endereço de e-mail ou nome de usuário", + "formFieldLabel__emailAddresses": "Endereços de e-mail", + "formFieldLabel__firstName": "Primeiro nome", + "formFieldLabel__lastName": "Sobrenome", + "formFieldLabel__newPassword": "Nova senha", + "formFieldLabel__organizationDomain": "Domínio", + "formFieldLabel__organizationDomainDeletePending": "Excluir convites e sugestões pendentes", + "formFieldLabel__organizationDomainEmailAddress": "Endereço de e-mail de verificação", + "formFieldLabel__organizationDomainEmailAddressDescription": "Insira um endereço de e-mail sob este domínio para receber um código e verificar este domínio.", + "formFieldLabel__organizationName": "Nome", + "formFieldLabel__organizationSlug": "Slug", + "formFieldLabel__passkeyName": "Nome do passkey", + "formFieldLabel__password": "Senha", + "formFieldLabel__phoneNumber": "Número de telefone", + "formFieldLabel__role": "Função", + "formFieldLabel__signOutOfOtherSessions": "Sair de todas as outras sessões", + "formFieldLabel__username": "Nome de usuário", + "impersonationFab": { + "action__signOut": "Sair", + "title": "Logado como {{identifier}}" + }, + "locale": "pt-BR", + "maintenanceMode": "Estamos passando por manutenção no momento, mas não se preocupe, não deve levar mais do que alguns minutos.", + "membershipRole__admin": "Administrador", + "membershipRole__basicMember": "Membro", + "membershipRole__guestMember": "Visitante", + "organizationList": { + "action__createOrganization": "Criar organização", + "action__invitationAccept": "Participar", + "action__suggestionsAccept": "Solicitar participação", + "createOrganization": "Criar Organização", + "invitationAcceptedLabel": "Participou", + "subtitle": "para continuar no(a) {{applicationName}}", + "suggestionsAcceptedLabel": "Aprovação pendente", + "title": "Escolha uma conta", + "titleWithoutPersonal": "Escolha uma organização" + }, + "organizationProfile": { + "badge__automaticInvitation": "Convites automáticos", + "badge__automaticSuggestion": "Sugestões automáticas", + "badge__manualInvitation": "Sem inscrição automática", + "badge__unverified": "Não verificado", + "createDomainPage": { + "subtitle": "Adicione o domínio para verificar. Usuários com endereços de e-mail neste domínio podem se juntar à organização automaticamente ou solicitar participação.", + "title": "Adicionar domínio" + }, + "invitePage": { + "detailsTitle__inviteFailed": "Os convites não puderam ser enviados. Já existem convites pendentes para os seguintes endereços de e-mail: {{email_addresses}}.", + "formButtonPrimary__continue": "Enviar convites", + "selectDropdown__role": "Selecione a função", + "subtitle": "Digite ou cole um ou mais endereços de e-mail, separados por espaços ou vírgulas.", + "successMessage": "Convites enviados com sucesso", + "title": "Convidar novos membros" + }, + "membersPage": { + "action__invite": "Convidar", + "activeMembersTab": { + "menuAction__remove": "Remover membro", + "tableHeader__actions": "", + "tableHeader__joined": "Participou", + "tableHeader__role": "Função", + "tableHeader__user": "Usuário" + }, + "detailsTitle__emptyRow": "Nenhum membro para exibir", + "invitationsTab": { + "autoInvitations": { + "headerSubtitle": "Convide usuários conectando um domínio de e-mail à sua organização. Qualquer pessoa que se inscrever com um domínio de e-mail correspondente poderá se juntar à organização a qualquer momento.", + "headerTitle": "Convites automáticos", + "primaryButton": "Gerenciar domínios verificados" + }, + "table__emptyRow": "Nenhum convite para exibir" + }, + "invitedMembersTab": { + "menuAction__revoke": "Revogar convite", + "tableHeader__invited": "Convidado" + }, + "requestsTab": { + "autoSuggestions": { + "headerSubtitle": "Usuários que se inscreverem com um domínio de e-mail correspondente poderão ver uma sugestão para solicitar participação em sua organização.", + "headerTitle": "Sugestões automáticas", + "primaryButton": "Gerenciar domínios verificados" + }, + "menuAction__approve": "Aprovar", + "menuAction__reject": "Rejeitar", + "tableHeader__requested": "Acesso solicitado", + "table__emptyRow": "Nenhuma solicitação para exibir" + }, + "start": { + "headerTitle__invitations": "Convites", + "headerTitle__members": "Membros", + "headerTitle__requests": "Solicitações" + } + }, + "navbar": { + "description": "Gerencie sua organização", + "general": "Geral", + "members": "Membros", + "title": "Organização" + }, + "profilePage": { + "dangerSection": { + "deleteOrganization": { + "actionDescription": "Digite \"{{organizationName}}\" abaixo para continuar.", + "messageLine1": "Tem certeza de que deseja excluir esta organização?", + "messageLine2": "Esta ação é permanente e irreversível.", + "successMessage": "Você excluiu a organização.", + "title": "Excluir organização" + }, + "leaveOrganization": { + "actionDescription": "Digite \"{{organizationName}}\" abaixo para continuar.", + "messageLine1": "Tem certeza de que deseja sair desta organização? Você perderá o acesso a esta organização e seus aplicativos.", + "messageLine2": "Esta ação é permanente e irreversível.", + "successMessage": "Você saiu da organização.", + "title": "Sair da organização" + }, + "title": "Perigo" + }, + "domainSection": { + "menuAction__manage": "Gerenciar", + "menuAction__remove": "Excluir", + "menuAction__verify": "Verificar", + "primaryButton": "Adicionar domínio", + "subtitle": "Permita que os usuários se juntem à organização automaticamente ou solicitem participação com base em um domínio de e-mail verificado.", + "title": "Domínios verificados" + }, + "successMessage": "A organização foi atualizada.", + "title": "Atualizar perfil" + }, + "removeDomainPage": { + "messageLine1": "O domínio de e-mail {{domain}} será removido.", + "messageLine2": "Os usuários não poderão se juntar automaticamente à organização após isso.", + "successMessage": "{{domain}} foi removido.", + "title": "Remover domínio" + }, + "start": { + "headerTitle__general": "Geral", + "headerTitle__members": "Membros", + "profileSection": { + "primaryButton": "Atualizar perfil", + "title": "Perfil da Organização", + "uploadAction__title": "Logotipo" + } + }, + "verifiedDomainPage": { + "dangerTab": { + "calloutInfoLabel": "Remover este domínio afetará os usuários convidados.", + "removeDomainActionLabel__remove": "Remover domínio", + "removeDomainSubtitle": "Remova este domínio de seus domínios verificados", + "removeDomainTitle": "Remover domínio" + }, + "enrollmentTab": { + "automaticInvitationOption__description": "Os usuários são convidados automaticamente para se juntar à organização quando se inscrevem e podem se juntar a qualquer momento.", + "automaticInvitationOption__label": "Convites automáticos", + "automaticSuggestionOption__description": "Os usuários recebem uma sugestão para solicitar participação, mas devem ser aprovados por um administrador antes de poderem se juntar à organização.", + "automaticSuggestionOption__label": "Sugestões automáticas", + "calloutInfoLabel": "Alterar o modo de inscrição afetará apenas novos usuários.", + "calloutInvitationCountLabel": "Convites pendentes enviados aos usuários: {{count}}", + "calloutSuggestionCountLabel": "Sugestões pendentes enviadas aos usuários: {{count}}", + "manualInvitationOption__description": "Os usuários só podem ser convidados manualmente para a organização.", + "manualInvitationOption__label": "Sem inscrição automática", + "subtitle": "Escolha como os usuários deste domínio podem se juntar à organização." + }, + "start": { + "headerTitle__danger": "Perigo", + "headerTitle__enrollment": "Opções de inscrição" + }, + "subtitle": "O domínio {{domain}} agora está verificado. Continue selecionando o modo de inscrição.", + "title": "Atualizar {{domain}}" + }, + "verifyDomainPage": { + "formSubtitle": "Digite o código de verificação enviado para o seu endereço de e-mail", + "formTitle": "Código de verificação", + "resendButton": "Não recebeu o código? Reenviar", + "subtitle": "O domínio {{domainName}} precisa ser verificado por e-mail.", + "subtitleVerificationCodeScreen": "Um código de verificação foi enviado para {{emailAddress}}. Digite o código para continuar.", + "title": "Verificar domínio" + } + }, + "organizationSwitcher": { + "action__createOrganization": "Criar organização", + "action__invitationAccept": "Participar", + "action__manageOrganization": "Gerenciar", + "action__suggestionsAccept": "Solicitar participação", + "notSelected": "Nenhuma organização selecionada", + "personalWorkspace": "Conta pessoal", + "suggestionsAcceptedLabel": "Aprovação pendente" + }, + "paginationButton__next": "Próximo", + "paginationButton__previous": "Anterior", + "paginationRowText__displaying": "Exibindo", + "paginationRowText__of": "de", + "signIn": { + "accountSwitcher": { + "action__addAccount": "Adicionar conta", + "action__signOutAll": "Sair de todas as contas", + "subtitle": "Selecione a conta com a qual deseja continuar.", + "title": "Escolha uma conta" + }, + "alternativeMethods": { + "actionLink": "Obter ajuda", + "actionText": "Não tem nenhuma destas?", + "blockButton__backupCode": "Usar um código de backup", + "blockButton__emailCode": "Enviar código por e-mail para {{identifier}}", + "blockButton__emailLink": "Enviar link por e-mail para {{identifier}}", + "blockButton__passkey": "Entrar com sua chave de acesso", + "blockButton__password": "Entrar com sua senha", + "blockButton__phoneCode": "Enviar código por SMS para {{identifier}}", + "blockButton__totp": "Usar seu aplicativo autenticador", + "getHelp": { + "blockButton__emailSupport": "Suporte por e-mail", + "content": "Se estiver com dificuldades para entrar na sua conta, nos envie um e-mail e trabalharemos com você para restaurar o acesso o mais rápido possível.", + "title": "Obter ajuda" + }, + "subtitle": "Enfrentando problemas? Você pode usar qualquer um destes métodos para entrar.", + "title": "Usar outro método" + }, + "backupCodeMfa": { + "subtitle": "Seu código de backup é aquele que você recebeu ao configurar a autenticação em duas etapas.", + "title": "Digite um código de backup" + }, + "emailCode": { + "formTitle": "Código de verificação", + "resendButton": "Não recebeu um código? Reenviar", + "subtitle": "para continuar em {{applicationName}}", + "title": "Verifique seu e-mail" + }, + "emailLink": { + "expired": { + "subtitle": "Retorne à aba original para continuar.", + "title": "Este link de verificação expirou" + }, + "failed": { + "subtitle": "Retorne à aba original para continuar.", + "title": "Este link de verificação é inválido" + }, + "formSubtitle": "Use o link de verificação enviado para o seu e-mail", + "formTitle": "Link de verificação", + "loading": { + "subtitle": "Você será redirecionado em breve", + "title": "Entrando..." + }, + "resendButton": "Não recebeu um link? Reenviar", + "subtitle": "para continuar em {{applicationName}}", + "title": "Verifique seu e-mail", + "unusedTab": { + "title": "Você pode fechar esta aba" + }, + "verified": { + "subtitle": "Você será redirecionado em breve", + "title": "Entrou com sucesso" + }, + "verifiedSwitchTab": { + "subtitle": "Retorne à aba original para continuar", + "subtitleNewTab": "Retorne à nova aba aberta para continuar", + "titleNewTab": "Entrou em outra aba" + } + }, + "forgotPassword": { + "formTitle": "Código de redefinição de senha", + "resendButton": "Não recebeu um código? Reenviar", + "subtitle": "para redefinir sua senha", + "subtitle_email": "Primeiro, insira o código enviado para o seu endereço de e-mail", + "subtitle_phone": "Primeiro, insira o código enviado para o seu telefone", + "title": "Redefinir senha" + }, + "forgotPasswordAlternativeMethods": { + "blockButton__resetPassword": "Redefinir sua senha", + "label__alternativeMethods": "Ou, entrar com outro método", + "title": "Esqueceu a senha?" + }, + "noAvailableMethods": { + "message": "Não é possível prosseguir com o login. Não há fator de autenticação disponível.", + "subtitle": "Ocorreu um erro", + "title": "Não é possível entrar" + }, + "passkey": { + "subtitle": "Usar sua chave de acesso confirma que é você. Seu dispositivo pode solicitar sua impressão digital, rosto ou bloqueio de tela.", + "title": "Use sua chave de acesso" + }, + "password": { + "actionLink": "Usar outro método", + "subtitle": "Digite a senha associada à sua conta", + "title": "Digite sua senha" + }, + "passwordPwned": { + "title": "Senha comprometida" + }, + "phoneCode": { + "formTitle": "Código de verificação", + "resendButton": "Não recebeu um código? Reenviar", + "subtitle": "para continuar em {{applicationName}}", + "title": "Verifique seu telefone" + }, + "phoneCodeMfa": { + "formTitle": "Código de verificação", + "resendButton": "Não recebeu um código? Reenviar", + "subtitle": "Para continuar, por favor insira o código de verificação enviado para o seu telefone", + "title": "Verifique seu telefone" + }, + "resetPassword": { + "formButtonPrimary": "Redefinir senha", + "requiredMessage": "Por motivos de segurança, é necessário redefinir sua senha.", + "successMessage": "Sua senha foi alterada com sucesso. Entrando, por favor aguarde um momento.", + "title": "Definir nova senha" + }, + "resetPasswordMfa": { + "detailsLabel": "Precisamos verificar sua identidade antes de redefinir sua senha." + }, + "start": { + "actionLink": "Registrar", + "actionLink__use_email": "Usar e-mail", + "actionLink__use_email_username": "Usar e-mail ou nome de usuário", + "actionLink__use_passkey": "Usar chave de acesso", + "actionLink__use_phone": "Usar telefone", + "actionLink__use_username": "Usar nome de usuário", + "actionText": "Não tem uma conta?", + "subtitle": "Bem-vindo de volta! Por favor, faça login para continuar", + "title": "Faça login em {{applicationName}}" + }, + "totpMfa": { + "formTitle": "Código de verificação", + "subtitle": "Para continuar, por favor insira o código de verificação gerado pelo seu aplicativo autenticador", + "title": "Verificação em duas etapas" + } + }, + "signInEnterPasswordTitle": "Digite sua senha", + "signUp": { + "continue": { + "actionLink": "Login", + "actionText": "Já tem uma conta?", + "subtitle": "Por favor, preencha os detalhes restantes para continuar", + "title": "Preencha os campos em falta" + }, + "emailCode": { + "formSubtitle": "Digite o código de verificação enviado para o seu endereço de e-mail", + "formTitle": "Código de verificação", + "resendButton": "Não recebeu um código? Reenviar", + "subtitle": "Digite o código de verificação enviado para o seu e-mail", + "title": "Verifique seu e-mail" + }, + "emailLink": { + "formSubtitle": "Use o link de verificação enviado para o seu endereço de e-mail", + "formTitle": "Link de verificação", + "loading": { + "title": "Registrando..." + }, + "resendButton": "Não recebeu um link? Reenviar", + "subtitle": "para continuar em {{applicationName}}", + "title": "Verifique seu e-mail", + "verified": { + "title": "Registrado com sucesso" + }, + "verifiedSwitchTab": { + "subtitle": "Retorne à nova aba aberta para continuar", + "subtitleNewTab": "Retorne à aba anterior para continuar", + "title": "E-mail verificado com sucesso" + } + }, + "phoneCode": { + "formSubtitle": "Digite o código de verificação enviado para o seu número de telefone", + "formTitle": "Código de verificação", + "resendButton": "Não recebeu um código? Reenviar", + "subtitle": "Digite o código de verificação enviado para o seu telefone", + "title": "Verifique seu telefone" + }, + "start": { + "actionLink": "Login", + "actionText": "Já tem uma conta?", + "subtitle": "Bem-vindo! Por favor, preencha os detalhes para começar", + "title": "Crie sua conta" + } + }, + "socialButtonsBlockButton": "Continuar com {{provider|titleize}}", + "unstable__errors": { + "captcha_invalid": "O cadastro não foi bem-sucedido devido a validações de segurança falhadas. Por favor, atualize a página para tentar novamente ou entre em contato com o suporte para mais assistência.", + "captcha_unavailable": "O cadastro não foi bem-sucedido devido à validação de bot falhada. Por favor, atualize a página para tentar novamente ou entre em contato com o suporte para mais assistência.", + "form_code_incorrect": "", + "form_identifier_exists": "", + "form_identifier_exists__email_address": "Este endereço de e-mail já está em uso. Por favor, tente outro.", + "form_identifier_exists__phone_number": "Este número de telefone já está em uso. Por favor, tente outro.", + "form_identifier_exists__username": "Este nome de usuário já está em uso. Por favor, tente outro.", + "form_identifier_not_found": "", + "form_param_format_invalid": "", + "form_param_format_invalid__email_address": "O endereço de e-mail deve ser um endereço de e-mail válido.", + "form_param_format_invalid__phone_number": "O número de telefone deve estar em um formato internacional válido.", + "form_param_max_length_exceeded__first_name": "O primeiro nome não deve exceder 256 caracteres.", + "form_param_max_length_exceeded__last_name": "O sobrenome não deve exceder 256 caracteres.", + "form_param_max_length_exceeded__name": "O nome não deve exceder 256 caracteres.", + "form_param_nil": "", + "form_password_incorrect": "", + "form_password_length_too_short": "", + "form_password_not_strong_enough": "Sua senha não é forte o suficiente.", + "form_password_pwned": "Esta senha foi encontrada em uma violação e não pode ser usada, por favor, tente outra senha.", + "form_password_pwned__sign_in": "Esta senha foi encontrada em uma violação e não pode ser usada, por favor, redefina sua senha.", + "form_password_size_in_bytes_exceeded": "Sua senha excedeu o número máximo de bytes permitido, por favor, encurte-a ou remova alguns caracteres especiais.", + "form_password_validation_failed": "Senha incorreta", + "form_username_invalid_character": "", + "form_username_invalid_length": "", + "identification_deletion_failed": "Você não pode excluir sua última identificação.", + "not_allowed_access": "", + "passkey_already_exists": "Um passkey já está registrado neste dispositivo.", + "passkey_not_supported": "Passkeys não são suportados neste dispositivo.", + "passkey_pa_not_supported": "O registro requer um autenticador de plataforma, mas o dispositivo não o suporta.", + "passkey_registration_cancelled": "O registro do passkey foi cancelado ou expirou.", + "passkey_retrieval_cancelled": "A verificação do passkey foi cancelada ou expirou.", + "passwordComplexity": { + "maximumLength": "menos de {{length}} caracteres", + "minimumLength": "{{length}} ou mais caracteres", + "requireLowercase": "uma letra minúscula", + "requireNumbers": "um número", + "requireSpecialCharacter": "um caractere especial", + "requireUppercase": "uma letra maiúscula", + "sentencePrefix": "Sua senha deve conter" + }, + "phone_number_exists": "Este número de telefone já está em uso. Por favor, tente outro.", + "zxcvbn": { + "couldBeStronger": "Sua senha funciona, mas poderia ser mais forte. Tente adicionar mais caracteres.", + "goodPassword": "Sua senha atende a todos os requisitos necessários.", + "notEnough": "Sua senha não é forte o suficiente.", + "suggestions": { + "allUppercase": "Coloque letras maiúsculas em algumas, mas não em todas as letras.", + "anotherWord": "Adicione mais palavras menos comuns.", + "associatedYears": "Evite anos associados a você.", + "capitalization": "Coloque mais letras maiúsculas além da primeira letra.", + "dates": "Evite datas e anos associados a você.", + "l33t": "Evite substituições previsíveis de letras como '@' por 'a'.", + "longerKeyboardPattern": "Use padrões de teclado mais longos e mude a direção de digitação várias vezes.", + "noNeed": "Você pode criar senhas fortes sem usar símbolos, números ou letras maiúsculas.", + "pwned": "Se você usar esta senha em outro lugar, você deve alterá-la.", + "recentYears": "Evite anos recentes.", + "repeated": "Evite palavras e caracteres repetidos.", + "reverseWords": "Evite soletrações invertidas de palavras comuns.", + "sequences": "Evite sequências de caracteres comuns.", + "useWords": "Use várias palavras, mas evite frases comuns." + }, + "warnings": { + "common": "Esta é uma senha comumente usada.", + "commonNames": "Nomes comuns são fáceis de adivinhar.", + "dates": "Datas são fáceis de adivinhar.", + "extendedRepeat": "Padrões de caracteres repetidos como \"abcabcabc\" são fáceis de adivinhar.", + "keyPattern": "Padrões de teclado curtos são fáceis de adivinhar.", + "namesByThemselves": "Nomes ou sobrenomes isolados são fáceis de adivinhar.", + "pwned": "Sua senha foi exposta em uma violação de dados na Internet.", + "recentYears": "Anos recentes são fáceis de adivinhar.", + "sequences": "Sequências de caracteres comuns como \"abc\" são fáceis de adivinhar.", + "similarToCommon": "Isso é semelhante a uma senha comumente usada.", + "simpleRepeat": "Caracteres repetidos como \"aaa\" são fáceis de adivinhar.", + "straightRow": "Linhas retas de teclas no seu teclado são fáceis de adivinhar.", + "topHundred": "Esta é uma senha frequentemente usada.", + "topTen": "Esta é uma senha muito usada.", + "userInputs": "Não deve haver dados pessoais ou relacionados à página.", + "wordByItself": "Palavras isoladas são fáceis de adivinhar." + } + } + }, + "userButton": { + "action__addAccount": "Adicionar conta", + "action__manageAccount": "Gerenciar conta", + "action__signOut": "Sair", + "action__signOutAll": "Sair de todas as contas" + }, + "userProfile": { + "backupCodePage": { + "actionLabel__copied": "Copiado!", + "actionLabel__copy": "Copiar tudo", + "actionLabel__download": "Baixar .txt", + "actionLabel__print": "Imprimir", + "infoText1": "Os códigos de backup serão habilitados para esta conta.", + "infoText2": "Mantenha os códigos de backup em segredo e armazene-os com segurança. Você pode regenerar os códigos de backup se suspeitar que foram comprometidos.", + "subtitle__codelist": "Armazene-os com segurança e mantenha-os em segredo.", + "successMessage": "Os códigos de backup estão agora habilitados. Você pode usar um deles para entrar em sua conta, caso perca o acesso ao seu dispositivo de autenticação. Cada código só pode ser usado uma vez.", + "successSubtitle": "Você pode usar um deles para entrar em sua conta, caso perca o acesso ao seu dispositivo de autenticação.", + "title": "Adicionar verificação de código de backup", + "title__codelist": "Códigos de backup" + }, + "connectedAccountPage": { + "formHint": "Selecione um provedor para conectar sua conta.", + "formHint__noAccounts": "Não há provedores de conta externos disponíveis.", + "removeResource": { + "messageLine1": "{{identifier}} será removido desta conta.", + "messageLine2": "Você não poderá mais usar esta conta conectada e quaisquer recursos dependentes deixarão de funcionar.", + "successMessage": "{{connectedAccount}} foi removido de sua conta.", + "title": "Remover conta conectada" + }, + "socialButtonsBlockButton": "{{provider|titleize}}", + "successMessage": "O provedor foi adicionado à sua conta", + "title": "Adicionar conta conectada" + }, + "deletePage": { + "actionDescription": "Digite \"Excluir conta\" abaixo para continuar.", + "confirm": "Excluir conta", + "messageLine1": "Tem certeza de que deseja excluir sua conta?", + "messageLine2": "Esta ação é permanente e irreversível.", + "title": "Excluir conta" + }, + "emailAddressPage": { + "emailCode": { + "formHint": "Um e-mail contendo um código de verificação será enviado para este endereço de e-mail.", + "formSubtitle": "Digite o código de verificação enviado para {{identifier}}", + "formTitle": "Código de verificação", + "resendButton": "Não recebeu um código? Reenviar", + "successMessage": "O e-mail {{identifier}} foi adicionado à sua conta." + }, + "emailLink": { + "formHint": "Um e-mail contendo um link de verificação será enviado para este endereço de e-mail.", + "formSubtitle": "Clique no link de verificação no e-mail enviado para {{identifier}}", + "formTitle": "Link de verificação", + "resendButton": "Não recebeu um link? Reenviar", + "successMessage": "O e-mail {{identifier}} foi adicionado à sua conta." + }, + "removeResource": { + "messageLine1": "{{identifier}} será removido desta conta.", + "messageLine2": "Você não poderá mais entrar usando este endereço de e-mail.", + "successMessage": "{{emailAddress}} foi removido de sua conta.", + "title": "Remover endereço de e-mail" + }, + "title": "Adicionar endereço de e-mail", + "verifyTitle": "Verificar endereço de e-mail" + }, + "formButtonPrimary__add": "Adicionar", + "formButtonPrimary__continue": "Continuar", + "formButtonPrimary__finish": "Finalizar", + "formButtonPrimary__remove": "Remover", + "formButtonPrimary__save": "Salvar", + "formButtonReset": "Cancelar", + "mfaPage": { + "formHint": "Selecione um método para adicionar.", + "title": "Adicionar verificação em duas etapas" + }, + "mfaPhoneCodePage": { + "backButton": "Usar número existente", + "primaryButton__addPhoneNumber": "Adicionar número de telefone", + "removeResource": { + "messageLine1": "{{identifier}} não receberá mais códigos de verificação ao entrar.", + "messageLine2": "Sua conta pode não ser tão segura. Tem certeza de que deseja continuar?", + "successMessage": "A verificação em duas etapas por código SMS foi removida para {{mfaPhoneCode}}", + "title": "Remover verificação em duas etapas" + }, + "subtitle__availablePhoneNumbers": "Selecione um número de telefone existente para se registrar na verificação em duas etapas por código SMS ou adicione um novo.", + "subtitle__unavailablePhoneNumbers": "Não há números de telefone disponíveis para se registrar na verificação em duas etapas por código SMS, por favor adicione um novo.", + "successMessage1": "Ao entrar, você precisará inserir um código de verificação enviado para este número de telefone como uma etapa adicional.", + "successMessage2": "Salve esses códigos de backup e armazene-os em um local seguro. Se perder o acesso ao seu dispositivo de autenticação, você pode usar os códigos de backup para entrar.", + "successTitle": "Verificação por código SMS habilitada", + "title": "Adicionar verificação por código SMS" + }, + "mfaTOTPPage": { + "authenticatorApp": { + "buttonAbleToScan__nonPrimary": "Escanear código QR em vez disso", + "buttonUnableToScan__nonPrimary": "Não consegue escanear o código QR?", + "infoText__ableToScan": "Configure um novo método de entrada em seu aplicativo autenticador e escaneie o código QR a seguir para vinculá-lo à sua conta.", + "infoText__unableToScan": "Configure um novo método de entrada em seu autenticador e insira a Chave fornecida abaixo.", + "inputLabel__unableToScan1": "Certifique-se de que as senhas baseadas em tempo ou únicas estão habilitadas e, em seguida, termine de vincular sua conta.", + "inputLabel__unableToScan2": "Alternativamente, se seu autenticador suportar URIs TOTP, você também pode copiar o URI completo." + }, + "removeResource": { + "messageLine1": "Os códigos de verificação deste autenticador não serão mais necessários ao entrar.", + "messageLine2": "Sua conta pode não ser tão segura. Tem certeza de que deseja continuar?", + "successMessage": "A verificação em duas etapas via aplicativo autenticador foi removida.", + "title": "Remover verificação em duas etapas" + }, + "successMessage": "A verificação em duas etapas está agora habilitada. Ao entrar, você precisará inserir um código de verificação deste autenticador como uma etapa adicional.", + "title": "Adicionar aplicativo autenticador", + "verifySubtitle": "Digite o código de verificação gerado pelo seu autenticador", + "verifyTitle": "Código de verificação" + }, + "mobileButton__menu": "Menu", + "navbar": { + "account": "Perfil", + "description": "Gerencie as informações da sua conta.", + "security": "Segurança", + "title": "Conta" + }, + "passkeyScreen": { + "removeResource": { + "messageLine1": "{{name}} será removido desta conta.", + "title": "Remover senha" + }, + "subtitle__rename": "Você pode alterar o nome da senha para facilitar a busca.", + "title__rename": "Renomear Senha" + }, + "passwordPage": { + "checkboxInfoText__signOutOfOtherSessions": "É recomendado sair de todas as outras sessões que possam ter usado sua senha antiga.", + "readonly": "Sua senha atualmente não pode ser editada porque você só pode fazer login via conexão empresarial.", + "successMessage__set": "Sua senha foi definida.", + "successMessage__signOutOfOtherSessions": "Todos os outros dispositivos foram desconectados.", + "successMessage__update": "Sua senha foi atualizada.", + "title__set": "Definir senha", + "title__update": "Atualizar senha" + }, + "phoneNumberPage": { + "infoText": "Será enviado um SMS contendo um código de verificação para este número de telefone. Podem ser aplicadas taxas de mensagem e dados.", + "removeResource": { + "messageLine1": "{{identifier}} será removido desta conta.", + "messageLine2": "Você não poderá mais fazer login usando este número de telefone.", + "successMessage": "{{phoneNumber}} foi removido da sua conta.", + "title": "Remover número de telefone" + }, + "successMessage": "{{identifier}} foi adicionado à sua conta.", + "title": "Adicionar número de telefone", + "verifySubtitle": "Digite o código de verificação enviado para {{identifier}}", + "verifyTitle": "Verificar número de telefone" + }, + "profilePage": { + "fileDropAreaHint": "Tamanho recomendado 1:1, até 10MB.", + "imageFormDestructiveActionSubtitle": "Remover", + "imageFormSubtitle": "Enviar", + "imageFormTitle": "Imagem de perfil", + "readonly": "Suas informações de perfil foram fornecidas pela conexão empresarial e não podem ser editadas.", + "successMessage": "Seu perfil foi atualizado.", + "title": "Atualizar perfil" + }, + "start": { + "activeDevicesSection": { + "destructiveAction": "Sair do dispositivo", + "title": "Dispositivos ativos" + }, + "connectedAccountsSection": { + "actionLabel__connectionFailed": "Tentar novamente", + "actionLabel__reauthorize": "Autorizar agora", + "destructiveActionTitle": "Remover", + "primaryButton": "Conectar conta", + "subtitle__reauthorize": "Os escopos necessários foram atualizados e você pode estar experimentando funcionalidades limitadas. Por favor, reautorize este aplicativo para evitar problemas", + "title": "Contas conectadas" + }, + "dangerSection": { + "deleteAccountButton": "Excluir conta", + "title": "Excluir conta" + }, + "emailAddressesSection": { + "destructiveAction": "Remover e-mail", + "detailsAction__nonPrimary": "Definir como principal", + "detailsAction__primary": "Completar verificação", + "detailsAction__unverified": "Verificar", + "primaryButton": "Adicionar endereço de e-mail", + "title": "Endereços de e-mail" + }, + "enterpriseAccountsSection": { + "title": "Contas empresariais" + }, + "headerTitle__account": "Detalhes do perfil", + "headerTitle__security": "Segurança", + "mfaSection": { + "backupCodes": { + "actionLabel__regenerate": "Regenerar", + "headerTitle": "Códigos de backup", + "subtitle__regenerate": "Obtenha um novo conjunto de códigos de backup seguros. Os códigos de backup anteriores serão excluídos e não poderão ser usados.", + "title__regenerate": "Regenerar códigos de backup" + }, + "phoneCode": { + "actionLabel__setDefault": "Definir como padrão", + "destructiveActionLabel": "Remover" + }, + "primaryButton": "Adicionar verificação em duas etapas", + "title": "Verificação em duas etapas", + "totp": { + "destructiveActionTitle": "Remover", + "headerTitle": "Aplicativo autenticador" + } + }, + "passkeysSection": { + "menuAction__destructive": "Remover", + "menuAction__rename": "Renomear", + "title": "Senhas" + }, + "passwordSection": { + "primaryButton__setPassword": "Definir senha", + "primaryButton__updatePassword": "Atualizar senha", + "title": "Senha" + }, + "phoneNumbersSection": { + "destructiveAction": "Remover número de telefone", + "detailsAction__nonPrimary": "Definir como principal", + "detailsAction__primary": "Completar verificação", + "detailsAction__unverified": "Verificar número de telefone", + "primaryButton": "Adicionar número de telefone", + "title": "Números de telefone" + }, + "profileSection": { + "primaryButton": "Atualizar perfil", + "title": "Perfil" + }, + "usernameSection": { + "primaryButton__setUsername": "Definir nome de usuário", + "primaryButton__updateUsername": "Atualizar nome de usuário", + "title": "Nome de usuário" + }, + "web3WalletsSection": { + "destructiveAction": "Remover carteira", + "primaryButton": "Carteiras Web3", + "title": "Carteiras Web3" + } + }, + "usernamePage": { + "successMessage": "Seu nome de usuário foi atualizado.", + "title__set": "Definir nome de usuário", + "title__update": "Atualizar nome de usuário" + }, + "web3WalletPage": { + "removeResource": { + "messageLine1": "{{identifier}} será removido desta conta.", + "messageLine2": "Você não poderá mais fazer login usando esta carteira web3.", + "successMessage": "{{web3Wallet}} foi removida da sua conta.", + "title": "Remover carteira web3" + }, + "subtitle__availableWallets": "Selecione uma carteira web3 para conectar à sua conta.", + "subtitle__unavailableWallets": "Não há carteiras web3 disponíveis.", + "successMessage": "A carteira foi adicionada à sua conta.", + "title": "Adicionar carteira web3" + } + } +} diff --git a/locales/pt-BR/common.json b/locales/pt-BR/common.json index 25350978acba4..391e5971599ac 100644 --- a/locales/pt-BR/common.json +++ b/locales/pt-BR/common.json @@ -160,6 +160,7 @@ "newVersion": "Nova versão disponível: {{version}}" }, "userPanel": { + "anonymousNickName": "Usuário Anônimo", "billing": "Gerenciamento de faturas", "defaultNickname": "Usuário da Comunidade", "discord": "Suporte da Comunidade", diff --git a/locales/pt-BR/error.json b/locales/pt-BR/error.json index 0d478db8df958..073e4c63d412b 100644 --- a/locales/pt-BR/error.json +++ b/locales/pt-BR/error.json @@ -1,4 +1,11 @@ { + "clerkAuth": { + "loginSuccess": { + "action": "Continuar a sessão", + "desc": "{{greeting}}, é um prazer poder continuar a te ajudar. Vamos continuar a conversa de onde paramos.", + "title": "Bem-vindo de volta, {{nickName}}" + } + }, "error": { "backHome": "Voltar para a página inicial", "desc": "Tente novamente mais tarde, ou retorne ao mundo conhecido", @@ -54,6 +61,7 @@ "InvalidAnthropicAPIKey": "A chave da API Anthropic está incorreta ou vazia. Por favor, verifique a chave da API Anthropic e tente novamente.", "InvalidAzureAPIKey": "Chave de API Azure incorreta ou vazia, por favor, verifique a chave de API Azure e tente novamente", "InvalidBedrockCredentials": "Credenciais Bedrock inválidas, por favor, verifique AccessKeyId/SecretAccessKey e tente novamente", + "InvalidClerkUser": "Desculpe, você ainda não fez login. Por favor, faça login ou registre uma conta antes de continuar.", "InvalidGoogleAPIKey": "Chave de API Google incorreta ou vazia, por favor, verifique a chave de API Google e tente novamente", "InvalidGroqAPIKey": "Chave de API Groq AI inválida ou em branco, verifique a chave de API Groq e tente novamente", "InvalidMinimaxAPIKey": "Chave de API Minimax inválida ou em branco, verifique a chave de API Minimax e tente novamente", diff --git a/locales/ru-RU/auth.json b/locales/ru-RU/auth.json new file mode 100644 index 0000000000000..4e6b39c25f5ea --- /dev/null +++ b/locales/ru-RU/auth.json @@ -0,0 +1,6 @@ +{ + "login": "Войти", + "loginOrSignup": "Войти / Зарегистрироваться", + "signout": "Выйти", + "signup": "Зарегистрироваться" +} diff --git a/locales/ru-RU/clerk.json b/locales/ru-RU/clerk.json new file mode 100644 index 0000000000000..31b49b6636900 --- /dev/null +++ b/locales/ru-RU/clerk.json @@ -0,0 +1,769 @@ +{ + "backButton": "Назад", + "badge__default": "По умолчанию", + "badge__otherImpersonatorDevice": "Другое устройство имперсонации", + "badge__primary": "Основной", + "badge__requiresAction": "Требуется действие", + "badge__thisDevice": "Это устройство", + "badge__unverified": "Непроверенный", + "badge__userDevice": "Устройство пользователя", + "badge__you": "Вы", + "createOrganization": { + "formButtonSubmit": "Создать организацию", + "invitePage": { + "formButtonReset": "Пропустить" + }, + "title": "Создать организацию" + }, + "dates": { + "lastDay": "Вчера в {{ date | timeString('ru-RU') }}", + "next6Days": "{{ date | weekday('ru-RU','long') }} в {{ date | timeString('ru-RU') }}", + "nextDay": "Завтра в {{ date | timeString('ru-RU') }}", + "numeric": "{{ date | numeric('ru-RU') }}", + "previous6Days": "Прошлая {{ date | weekday('ru-RU','long') }} в {{ date | timeString('ru-RU') }}", + "sameDay": "Сегодня в {{ date | timeString('ru-RU') }}" + }, + "dividerText": "или", + "footerActionLink__useAnotherMethod": "Использовать другой метод", + "footerPageLink__help": "Помощь", + "footerPageLink__privacy": "Конфиденциальность", + "footerPageLink__terms": "Условия", + "formButtonPrimary": "Продолжить", + "formButtonPrimary__verify": "Подтвердить", + "formFieldAction__forgotPassword": "Забыли пароль?", + "formFieldError__matchingPasswords": "Пароли совпадают.", + "formFieldError__notMatchingPasswords": "Пароли не совпадают.", + "formFieldError__verificationLinkExpired": "Срок действия ссылки для подтверждения истек. Пожалуйста, запросите новую ссылку.", + "formFieldHintText__optional": "Необязательно", + "formFieldHintText__slug": "Slug - это уникальный идентификатор, который удобно использовать в URL.", + "formFieldInputPlaceholder__backupCode": "", + "formFieldInputPlaceholder__confirmDeletionUserAccount": "Удалить аккаунт", + "formFieldInputPlaceholder__emailAddress": "", + "formFieldInputPlaceholder__emailAddress_username": "", + "formFieldInputPlaceholder__emailAddresses": "example@email.com, example2@email.com", + "formFieldInputPlaceholder__firstName": "", + "formFieldInputPlaceholder__lastName": "", + "formFieldInputPlaceholder__organizationDomain": "", + "formFieldInputPlaceholder__organizationDomainEmailAddress": "", + "formFieldInputPlaceholder__organizationName": "", + "formFieldInputPlaceholder__organizationSlug": "моя-орг", + "formFieldInputPlaceholder__password": "", + "formFieldInputPlaceholder__phoneNumber": "", + "formFieldInputPlaceholder__username": "", + "formFieldLabel__automaticInvitations": "Включить автоматические приглашения для этого домена", + "formFieldLabel__backupCode": "Резервный код", + "formFieldLabel__confirmDeletion": "Подтверждение", + "formFieldLabel__confirmPassword": "Подтвердите пароль", + "formFieldLabel__currentPassword": "Текущий пароль", + "formFieldLabel__emailAddress": "Адрес электронной почты", + "formFieldLabel__emailAddress_username": "Адрес электронной почты или имя пользователя", + "formFieldLabel__emailAddresses": "Адреса электронной почты", + "formFieldLabel__firstName": "Имя", + "formFieldLabel__lastName": "Фамилия", + "formFieldLabel__newPassword": "Новый пароль", + "formFieldLabel__organizationDomain": "Домен", + "formFieldLabel__organizationDomainDeletePending": "Удалить ожидающие приглашения и предложения", + "formFieldLabel__organizationDomainEmailAddress": "Адрес электронной почты для подтверждения", + "formFieldLabel__organizationDomainEmailAddressDescription": "Введите адрес электронной почты под этим доменом, чтобы получить код и подтвердить домен.", + "formFieldLabel__organizationName": "Название", + "formFieldLabel__organizationSlug": "Slug", + "formFieldLabel__passkeyName": "Имя ключа доступа", + "formFieldLabel__password": "Пароль", + "formFieldLabel__phoneNumber": "Номер телефона", + "formFieldLabel__role": "Роль", + "formFieldLabel__signOutOfOtherSessions": "Выйти из всех других устройств", + "formFieldLabel__username": "Имя пользователя", + "impersonationFab": { + "action__signOut": "Выйти", + "title": "Вошли как {{identifier}}" + }, + "locale": "ru-RU", + "maintenanceMode": "В настоящее время мы находимся на техническом обслуживании, но не волнуйтесь, это не займет больше нескольких минут.", + "membershipRole__admin": "Администратор", + "membershipRole__basicMember": "Участник", + "membershipRole__guestMember": "Гость", + "organizationList": { + "action__createOrganization": "Создать организацию", + "action__invitationAccept": "Присоединиться", + "action__suggestionsAccept": "Запросить присоединение", + "createOrganization": "Создать организацию", + "invitationAcceptedLabel": "Присоединен", + "subtitle": "для продолжения в {{applicationName}}", + "suggestionsAcceptedLabel": "Ожидает подтверждения", + "title": "Выберите учетную запись", + "titleWithoutPersonal": "Выберите организацию" + }, + "organizationProfile": { + "badge__automaticInvitation": "Автоматические приглашения", + "badge__automaticSuggestion": "Автоматические предложения", + "badge__manualInvitation": "Нет автоматического вступления", + "badge__unverified": "Неподтвержденный", + "createDomainPage": { + "subtitle": "Добавьте домен для проверки. Пользователи с адресами электронной почты на этом домене могут присоединиться к организации автоматически или запросить присоединение.", + "title": "Добавить домен" + }, + "invitePage": { + "detailsTitle__inviteFailed": "Приглашения не могут быть отправлены. Уже есть ожидающие приглашения для следующих адресов электронной почты: {{email_addresses}}.", + "formButtonPrimary__continue": "Отправить приглашения", + "selectDropdown__role": "Выберите роль", + "subtitle": "Введите или вставьте один или несколько адресов электронной почты, разделенные пробелами или запятыми.", + "successMessage": "Приглашения успешно отправлены", + "title": "Пригласить новых участников" + }, + "membersPage": { + "action__invite": "Пригласить", + "activeMembersTab": { + "menuAction__remove": "Удалить участника", + "tableHeader__actions": "", + "tableHeader__joined": "Присоединился", + "tableHeader__role": "Роль", + "tableHeader__user": "Пользователь" + }, + "detailsTitle__emptyRow": "Нет участников для отображения", + "invitationsTab": { + "autoInvitations": { + "headerSubtitle": "Пригласите пользователей, подключив домен электронной почты к вашей организации. Любой, кто зарегистрируется с соответствующим доменом электронной почты, сможет присоединиться к организации в любое время.", + "headerTitle": "Автоматические приглашения", + "primaryButton": "Управление подтвержденными доменами" + }, + "table__emptyRow": "Нет приглашений для отображения" + }, + "invitedMembersTab": { + "menuAction__revoke": "Отозвать приглашение", + "tableHeader__invited": "Приглашен" + }, + "requestsTab": { + "autoSuggestions": { + "headerSubtitle": "Пользователи, зарегистрировавшиеся с соответствующим доменом электронной почты, смогут видеть предложение запросить присоединение к вашей организации.", + "headerTitle": "Автоматические предложения", + "primaryButton": "Управление подтвержденными доменами" + }, + "menuAction__approve": "Утвердить", + "menuAction__reject": "Отклонить", + "tableHeader__requested": "Запрошен доступ", + "table__emptyRow": "Нет запросов для отображения" + }, + "start": { + "headerTitle__invitations": "Приглашения", + "headerTitle__members": "Участники", + "headerTitle__requests": "Запросы" + } + }, + "navbar": { + "description": "Управляйте своей организацией.", + "general": "Общее", + "members": "Участники", + "title": "Организация" + }, + "profilePage": { + "dangerSection": { + "deleteOrganization": { + "actionDescription": "Введите \"{{organizationName}}\" ниже, чтобы продолжить.", + "messageLine1": "Вы уверены, что хотите удалить эту организацию?", + "messageLine2": "Это действие является постоянным и необратимым.", + "successMessage": "Вы удалили организацию.", + "title": "Удалить организацию" + }, + "leaveOrganization": { + "actionDescription": "Введите \"{{organizationName}}\" ниже, чтобы продолжить.", + "messageLine1": "Вы уверены, что хотите покинуть эту организацию? Вы потеряете доступ к этой организации и ее приложениям.", + "messageLine2": "Это действие является постоянным и необратимым.", + "successMessage": "Вы покинули организацию.", + "title": "Покинуть организацию" + }, + "title": "Опасность" + }, + "domainSection": { + "menuAction__manage": "Управление", + "menuAction__remove": "Удалить", + "menuAction__verify": "Подтвердить", + "primaryButton": "Добавить домен", + "subtitle": "Разрешите пользователям присоединяться к организации автоматически или запрашивать присоединение на основе подтвержденного электронного домена.", + "title": "Подтвержденные домены" + }, + "successMessage": "Организация была обновлена.", + "title": "Обновить профиль" + }, + "removeDomainPage": { + "messageLine1": "Домен электронной почты {{domain}} будет удален.", + "messageLine2": "Пользователи больше не смогут присоединяться к организации автоматически после этого.", + "successMessage": "{{domain}} был удален.", + "title": "Удалить домен" + }, + "start": { + "headerTitle__general": "Общее", + "headerTitle__members": "Участники", + "profileSection": { + "primaryButton": "Обновить профиль", + "title": "Профиль организации", + "uploadAction__title": "Логотип" + } + }, + "verifiedDomainPage": { + "dangerTab": { + "calloutInfoLabel": "Удаление этого домена повлияет на приглашенных пользователей.", + "removeDomainActionLabel__remove": "Удалить домен", + "removeDomainSubtitle": "Удалить этот домен из ваших подтвержденных доменов", + "removeDomainTitle": "Удалить домен" + }, + "enrollmentTab": { + "automaticInvitationOption__description": "Пользователи автоматически приглашаются присоединиться к организации при регистрации и могут присоединиться в любое время.", + "automaticInvitationOption__label": "Автоматические приглашения", + "automaticSuggestionOption__description": "Пользователи получают предложение запросить присоединение, но должны быть утверждены администратором, прежде чем они смогут присоединиться к организации.", + "automaticSuggestionOption__label": "Автоматические предложения", + "calloutInfoLabel": "Изменение режима вступления повлияет только на новых пользователей.", + "calloutInvitationCountLabel": "Ожидающие приглашения, отправленные пользователям: {{count}}", + "calloutSuggestionCountLabel": "Ожидающие предложения, отправленные пользователям: {{count}}", + "manualInvitationOption__description": "Пользователи могут быть приглашены в организацию только вручную.", + "manualInvitationOption__label": "Нет автоматического вступления", + "subtitle": "Выберите, как пользователи с этого домена могут присоединиться к организации." + }, + "start": { + "headerTitle__danger": "Опасность", + "headerTitle__enrollment": "Варианты вступления" + }, + "subtitle": "Домен {{domain}} теперь подтвержден. Продолжайте, выбрав режим вступления.", + "title": "Обновить {{domain}}" + }, + "verifyDomainPage": { + "formSubtitle": "Введите код подтверждения, отправленный на ваш адрес электронной почты", + "formTitle": "Код подтверждения", + "resendButton": "Не получили код? Отправить еще раз", + "subtitle": "Домен {{domainName}} необходимо подтвердить по электронной почте.", + "subtitleVerificationCodeScreen": "На {{emailAddress}} был отправлен код подтверждения. Введите код для продолжения.", + "title": "Подтвердить домен" + } + }, + "organizationSwitcher": { + "action__createOrganization": "Создать организацию", + "action__invitationAccept": "Присоединиться", + "action__manageOrganization": "Управление", + "action__suggestionsAccept": "Запросить присоединение", + "notSelected": "Организация не выбрана", + "personalWorkspace": "Личный аккаунт", + "suggestionsAcceptedLabel": "Ожидает подтверждения" + }, + "paginationButton__next": "Далее", + "paginationButton__previous": "Назад", + "paginationRowText__displaying": "Отображение", + "paginationRowText__of": "из", + "signIn": { + "accountSwitcher": { + "action__addAccount": "Добавить аккаунт", + "action__signOutAll": "Выйти из всех аккаунтов", + "subtitle": "Выберите аккаунт, с которым вы хотите продолжить.", + "title": "Выберите аккаунт" + }, + "alternativeMethods": { + "actionLink": "Получить помощь", + "actionText": "Нет ни одного из них?", + "blockButton__backupCode": "Использовать резервный код", + "blockButton__emailCode": "Отправить код на почту {{identifier}}", + "blockButton__emailLink": "Отправить ссылку на почту {{identifier}}", + "blockButton__passkey": "Войти с помощью вашего парольного ключа", + "blockButton__password": "Войти с помощью вашего пароля", + "blockButton__phoneCode": "Отправить SMS-код на {{identifier}}", + "blockButton__totp": "Использовать приложение аутентификации", + "getHelp": { + "blockButton__emailSupport": "Поддержка по почте", + "content": "Если у вас возникли проблемы с входом в ваш аккаунт, напишите нам, и мы постараемся восстановить доступ как можно скорее.", + "title": "Получить помощь" + }, + "subtitle": "Столкнулись с проблемами? Вы можете использовать любой из этих методов для входа.", + "title": "Используйте другой метод" + }, + "backupCodeMfa": { + "subtitle": "Ваш резервный код - тот, который вы получили при настройке двухэтапной аутентификации.", + "title": "Введите резервный код" + }, + "emailCode": { + "formTitle": "Код подтверждения", + "resendButton": "Не получили код? Отправить еще раз", + "subtitle": "для продолжения в {{applicationName}}", + "title": "Проверьте свою почту" + }, + "emailLink": { + "expired": { + "subtitle": "Вернитесь на исходную вкладку, чтобы продолжить.", + "title": "Срок действия этой ссылки подтверждения истек" + }, + "failed": { + "subtitle": "Вернитесь на исходную вкладку, чтобы продолжить.", + "title": "Эта ссылка подтверждения недействительна" + }, + "formSubtitle": "Используйте ссылку подтверждения, отправленную на вашу почту", + "formTitle": "Ссылка подтверждения", + "loading": { + "subtitle": "Вы будете перенаправлены в ближайшее время", + "title": "Вход в систему..." + }, + "resendButton": "Не получили ссылку? Отправить еще раз", + "subtitle": "для продолжения в {{applicationName}}", + "title": "Проверьте свою почту", + "unusedTab": { + "title": "Вы можете закрыть эту вкладку" + }, + "verified": { + "subtitle": "Вы будете перенаправлены в ближайшее время", + "title": "Успешный вход в систему" + }, + "verifiedSwitchTab": { + "subtitle": "Вернитесь на исходную вкладку, чтобы продолжить", + "subtitleNewTab": "Вернитесь на вновь открытую вкладку, чтобы продолжить", + "titleNewTab": "Вход выполнен на другой вкладке" + } + }, + "forgotPassword": { + "formTitle": "Код сброса пароля", + "resendButton": "Не получили код? Отправить еще раз", + "subtitle": "для сброса вашего пароля", + "subtitle_email": "Сначала введите код, отправленный на ваш адрес электронной почты", + "subtitle_phone": "Сначала введите код, отправленный на ваш телефон", + "title": "Сброс пароля" + }, + "forgotPasswordAlternativeMethods": { + "blockButton__resetPassword": "Сбросить пароль", + "label__alternativeMethods": "Или войдите другим способом", + "title": "Забыли пароль?" + }, + "noAvailableMethods": { + "message": "Невозможно продолжить вход. Нет доступных факторов аутентификации.", + "subtitle": "Произошла ошибка", + "title": "Невозможно войти" + }, + "passkey": { + "subtitle": "Использование вашего парольного ключа подтверждает, что это вы. Ваше устройство может запросить ваш отпечаток пальца, лицо или блокировку экрана.", + "title": "Используйте ваш парольный ключ" + }, + "password": { + "actionLink": "Использовать другой метод", + "subtitle": "Введите пароль, связанный с вашим аккаунтом", + "title": "Введите ваш пароль" + }, + "passwordPwned": { + "title": "Пароль скомпрометирован" + }, + "phoneCode": { + "formTitle": "Код подтверждения", + "resendButton": "Не получили код? Отправить еще раз", + "subtitle": "для продолжения в {{applicationName}}", + "title": "Проверьте свой телефон" + }, + "phoneCodeMfa": { + "formTitle": "Код подтверждения", + "resendButton": "Не получили код? Отправить еще раз", + "subtitle": "Для продолжения введите код подтверждения, отправленный на ваш телефон", + "title": "Проверьте свой телефон" + }, + "resetPassword": { + "formButtonPrimary": "Сбросить пароль", + "requiredMessage": "По соображениям безопасности требуется сбросить ваш пароль.", + "successMessage": "Ваш пароль успешно изменен. Выполняется вход, подождите немного.", + "title": "Установите новый пароль" + }, + "resetPasswordMfa": { + "detailsLabel": "Мы должны проверить вашу личность перед сбросом пароля." + }, + "start": { + "actionLink": "Зарегистрироваться", + "actionLink__use_email": "Использовать почту", + "actionLink__use_email_username": "Использовать почту или имя пользователя", + "actionLink__use_passkey": "Использовать парольный ключ", + "actionLink__use_phone": "Использовать телефон", + "actionLink__use_username": "Использовать имя пользователя", + "actionText": "Нет учетной записи?", + "subtitle": "Добро пожаловать! Пожалуйста, заполните данные, чтобы начать.", + "title": "Создайте свою учетную запись" + }, + "totpMfa": { + "formTitle": "Код подтверждения", + "subtitle": "Для продолжения введите код подтверждения, сгенерированный вашим приложением аутентификации", + "title": "Двухэтапная проверка" + } + }, + "signInEnterPasswordTitle": "Введите ваш пароль", + "signUp": { + "continue": { + "actionLink": "Войти", + "actionText": "Уже есть аккаунт?", + "subtitle": "Пожалуйста, заполните оставшиеся данные, чтобы продолжить.", + "title": "Заполните недостающие поля" + }, + "emailCode": { + "formSubtitle": "Введите код подтверждения, отправленный на ваш адрес электронной почты", + "formTitle": "Код подтверждения", + "resendButton": "Не получили код? Отправить еще раз", + "subtitle": "Введите код подтверждения, отправленный на ваш адрес электронной почты", + "title": "Подтвердите вашу почту" + }, + "emailLink": { + "formSubtitle": "Используйте ссылку подтверждения, отправленную на ваш адрес электронной почты", + "formTitle": "Ссылка подтверждения", + "loading": { + "title": "Регистрация..." + }, + "resendButton": "Не получили ссылку? Отправить еще раз", + "subtitle": "для продолжения в {{applicationName}}", + "title": "Подтвердите вашу почту", + "verified": { + "title": "Успешная регистрация" + }, + "verifiedSwitchTab": { + "subtitle": "Вернитесь на вновь открытую вкладку, чтобы продолжить", + "subtitleNewTab": "Вернитесь на предыдущую вкладку, чтобы продолжить", + "title": "Электронная почта успешно подтверждена" + } + }, + "phoneCode": { + "formSubtitle": "Введите код подтверждения, отправленный на ваш номер телефона", + "formTitle": "Код подтверждения", + "resendButton": "Не получили код? Отправить еще раз", + "subtitle": "Введите код подтверждения, отправленный на ваш номер телефона", + "title": "Подтвердите ваш телефон" + }, + "start": { + "actionLink": "Войти", + "actionText": "Уже есть аккаунт?", + "subtitle": "Добро пожаловать! Пожалуйста, заполните данные, чтобы начать.", + "title": "Создайте свою учетную запись" + } + }, + "socialButtonsBlockButton": "Продолжить с {{provider|titleize}}", + "unstable__errors": { + "captcha_invalid": "Регистрация не удалась из-за неудачной проверки безопасности. Пожалуйста, обновите страницу и попробуйте снова или обратитесь в службу поддержки для получения дополнительной помощи.", + "captcha_unavailable": "Регистрация не удалась из-за неудачной проверки на ботов. Пожалуйста, обновите страницу и попробуйте снова или обратитесь в службу поддержки для получения дополнительной помощи.", + "form_code_incorrect": "", + "form_identifier_exists": "", + "form_identifier_exists__email_address": "Этот адрес электронной почты занят. Пожалуйста, попробуйте другой.", + "form_identifier_exists__phone_number": "Этот номер телефона занят. Пожалуйста, попробуйте другой.", + "form_identifier_exists__username": "Это имя пользователя занято. Пожалуйста, попробуйте другое.", + "form_identifier_not_found": "", + "form_param_format_invalid": "", + "form_param_format_invalid__email_address": "Адрес электронной почты должен быть действительным адресом электронной почты.", + "form_param_format_invalid__phone_number": "Номер телефона должен быть в действительном международном формате.", + "form_param_max_length_exceeded__first_name": "Имя не должно превышать 256 символов.", + "form_param_max_length_exceeded__last_name": "Фамилия не должна превышать 256 символов.", + "form_param_max_length_exceeded__name": "Имя не должно превышать 256 символов.", + "form_param_nil": "", + "form_password_incorrect": "", + "form_password_length_too_short": "", + "form_password_not_strong_enough": "Ваш пароль недостаточно надежен.", + "form_password_pwned": "Этот пароль был обнаружен в результате утечки данных и не может быть использован. Пожалуйста, попробуйте другой пароль.", + "form_password_pwned__sign_in": "Этот пароль был обнаружен в результате утечки данных и не может быть использован. Пожалуйста, сбросьте свой пароль.", + "form_password_size_in_bytes_exceeded": "Ваш пароль превысил максимально допустимое количество байт. Пожалуйста, сократите его или удалите некоторые специальные символы.", + "form_password_validation_failed": "Неверный пароль.", + "form_username_invalid_character": "", + "form_username_invalid_length": "", + "identification_deletion_failed": "Вы не можете удалить свою последнюю идентификацию.", + "not_allowed_access": "", + "passkey_already_exists": "Ключ доступа уже зарегистрирован на этом устройстве.", + "passkey_not_supported": "Ключи доступа не поддерживаются на этом устройстве.", + "passkey_pa_not_supported": "Для регистрации требуется аутентификатор платформы, но устройство его не поддерживает.", + "passkey_registration_cancelled": "Регистрация ключа доступа была отменена или истекло время ожидания.", + "passkey_retrieval_cancelled": "Проверка ключа доступа была отменена или истекло время ожидания.", + "passwordComplexity": { + "maximumLength": "менее {{length}} символов", + "minimumLength": "{{length}} или более символов", + "requireLowercase": "строчную букву", + "requireNumbers": "цифру", + "requireSpecialCharacter": "специальный символ", + "requireUppercase": "заглавную букву", + "sentencePrefix": "Ваш пароль должен содержать" + }, + "phone_number_exists": "Этот номер телефона занят. Пожалуйста, попробуйте другой.", + "zxcvbn": { + "couldBeStronger": "Ваш пароль работает, но может быть надежнее. Попробуйте добавить больше символов.", + "goodPassword": "Ваш пароль соответствует всем необходимым требованиям.", + "notEnough": "Ваш пароль недостаточно надежен.", + "suggestions": { + "allUppercase": "Сделайте заглавными некоторые, но не все буквы.", + "anotherWord": "Добавьте больше слов, которые редко используются.", + "associatedYears": "Избегайте годов, которые связаны с вами.", + "capitalization": "Используйте заглавные буквы не только в начале слова.", + "dates": "Избегайте дат и годов, связанных с вами.", + "l33t": "Избегайте предсказуемых замен букв, например, '@' вместо 'a'.", + "longerKeyboardPattern": "Используйте более длинные шаблоны клавиатуры и меняйте направление набора несколько раз.", + "noNeed": "Вы можете создавать надежные пароли без использования символов, цифр или заглавных букв.", + "pwned": "Если вы используете этот пароль в другом месте, вам следует его изменить.", + "recentYears": "Избегайте недавних лет.", + "repeated": "Избегайте повторяющихся слов и символов.", + "reverseWords": "Избегайте перевернутых написаний обычных слов.", + "sequences": "Избегайте обычных последовательностей символов.", + "useWords": "Используйте несколько слов, но избегайте общих фраз." + }, + "warnings": { + "common": "Это часто используемый пароль.", + "commonNames": "Общие имена и фамилии легко угадать.", + "dates": "Даты легко угадать.", + "extendedRepeat": "Повторяющиеся шаблоны символов, например, \"abcabcabc\", легко угадать.", + "keyPattern": "Короткие шаблоны клавиатуры легко угадать.", + "namesByThemselves": "Одиночные имена или фамилии легко угадать.", + "pwned": "Ваш пароль был обнаружен в результате утечки данных в Интернете.", + "recentYears": "Недавние годы легко угадать.", + "sequences": "Общие последовательности символов, например, \"abc\", легко угадать.", + "similarToCommon": "Этот пароль похож на часто используемый.", + "simpleRepeat": "Повторяющиеся символы, например, \"aaa\", легко угадать.", + "straightRow": "Прямые ряды клавиш на вашей клавиатуре легко угадать.", + "topHundred": "Это часто используемый пароль.", + "topTen": "Это очень часто используемый пароль.", + "userInputs": "Не должно быть никаких персональных или связанных с страницей данных.", + "wordByItself": "Одиночные слова легко угадать." + } + } + }, + "userButton": { + "action__addAccount": "Добавить аккаунт", + "action__manageAccount": "Управление аккаунтом", + "action__signOut": "Выйти", + "action__signOutAll": "Выйти из всех аккаунтов" + }, + "userProfile": { + "backupCodePage": { + "actionLabel__copied": "Скопировано!", + "actionLabel__copy": "Скопировать все", + "actionLabel__download": "Скачать .txt", + "actionLabel__print": "Распечатать", + "infoText1": "Резервные коды будут включены для этой учетной записи.", + "infoText2": "Храните резервные коды в тайне и надежно. Вы можете восстановить резервные коды, если подозреваете их компрометацию.", + "subtitle__codelist": "Храните их надежно и держите в секрете.", + "successMessage": "Резервные коды теперь включены. Вы можете использовать один из них для входа в свою учетную запись, если потеряете доступ к своему аутентификационному устройству. Каждый код можно использовать только один раз.", + "successSubtitle": "Вы можете использовать один из них для входа в свою учетную запись, если потеряете доступ к своему аутентификационному устройству.", + "title": "Добавить проверку резервного кода", + "title__codelist": "Резервные коды" + }, + "connectedAccountPage": { + "formHint": "Выберите провайдера для подключения вашей учетной записи.", + "formHint__noAccounts": "Нет доступных внешних провайдеров учетных записей.", + "removeResource": { + "messageLine1": "{{identifier}} будет удален из этой учетной записи.", + "messageLine2": "Вы больше не сможете использовать эту подключенную учетную запись, и любые зависимые функции перестанут работать.", + "successMessage": "{{connectedAccount}} был удален из вашей учетной записи.", + "title": "Удалить подключенную учетную запись" + }, + "socialButtonsBlockButton": "{{provider|titleize}}", + "successMessage": "Провайдер был добавлен в вашу учетную запись", + "title": "Добавить подключенную учетную запись" + }, + "deletePage": { + "actionDescription": "Введите \"Удалить учетную запись\" ниже, чтобы продолжить.", + "confirm": "Удалить учетную запись", + "messageLine1": "Вы уверены, что хотите удалить свою учетную запись?", + "messageLine2": "Это действие является постоянным и необратимым.", + "title": "Удалить учетную запись" + }, + "emailAddressPage": { + "emailCode": { + "formHint": "На этот адрес электронной почты будет отправлено письмо с кодом подтверждения.", + "formSubtitle": "Введите код подтверждения, отправленный на {{identifier}}", + "formTitle": "Код подтверждения", + "resendButton": "Не получили код? Отправить еще раз", + "successMessage": "Электронная почта {{identifier}} была добавлена в вашу учетную запись." + }, + "emailLink": { + "formHint": "На этот адрес электронной почты будет отправлена ссылка для подтверждения.", + "formSubtitle": "Щелкните по ссылке подтверждения в письме, отправленном на {{identifier}}", + "formTitle": "Ссылка для подтверждения", + "resendButton": "Не получили ссылку? Отправить еще раз", + "successMessage": "Электронная почта {{identifier}} была добавлена в вашу учетную запись." + }, + "removeResource": { + "messageLine1": "{{identifier}} будет удален из этой учетной записи.", + "messageLine2": "Вы больше не сможете входить, используя этот адрес электронной почты.", + "successMessage": "{{emailAddress}} был удален из вашей учетной записи.", + "title": "Удалить адрес электронной почты" + }, + "title": "Добавить адрес электронной почты", + "verifyTitle": "Подтвердить адрес электронной почты" + }, + "formButtonPrimary__add": "Добавить", + "formButtonPrimary__continue": "Продолжить", + "formButtonPrimary__finish": "Завершить", + "formButtonPrimary__remove": "Удалить", + "formButtonPrimary__save": "Сохранить", + "formButtonReset": "Отмена", + "mfaPage": { + "formHint": "Выберите метод для добавления.", + "title": "Добавить двухэтапную проверку" + }, + "mfaPhoneCodePage": { + "backButton": "Использовать существующий номер", + "primaryButton__addPhoneNumber": "Добавить номер телефона", + "removeResource": { + "messageLine1": "{{identifier}} больше не будет получать коды подтверждения при входе.", + "messageLine2": "Ваша учетная запись может быть менее защищенной. Вы уверены, что хотите продолжить?", + "successMessage": "Двухэтапная проверка по SMS-коду была удалена для {{mfaPhoneCode}}", + "title": "Удалить двухэтапную проверку" + }, + "subtitle__availablePhoneNumbers": "Выберите существующий номер телефона для регистрации двухэтапной проверки по SMS-коду или добавьте новый.", + "subtitle__unavailablePhoneNumbers": "Нет доступных номеров телефонов для регистрации двухэтапной проверки по SMS-коду, добавьте новый.", + "successMessage1": "При входе в систему вам потребуется ввести код подтверждения, отправленный на этот номер телефона, как дополнительный шаг.", + "successMessage2": "Сохраните эти резервные коды и храните их в надежном месте. Если вы потеряете доступ к своему аутентификационному устройству, вы сможете использовать резервные коды для входа.", + "successTitle": "Включена проверка по SMS-коду", + "title": "Добавить проверку по SMS-коду" + }, + "mfaTOTPPage": { + "authenticatorApp": { + "buttonAbleToScan__nonPrimary": "Вместо этого отсканируйте QR-код", + "buttonUnableToScan__nonPrimary": "Не удается отсканировать QR-код?", + "infoText__ableToScan": "Настройте новый метод входа в свое приложение аутентификации и отсканируйте следующий QR-код, чтобы связать его с вашей учетной записью.", + "infoText__unableToScan": "Настройте новый метод входа в свое приложение аутентификации и введите предоставленный ключ ниже.", + "inputLabel__unableToScan1": "Убедитесь, что включены одноразовые пароли на основе времени, затем завершите привязку вашей учетной записи.", + "inputLabel__unableToScan2": "Кроме того, если ваш аутентификатор поддерживает URI TOTP, вы также можете скопировать полный URI." + }, + "removeResource": { + "messageLine1": "При входе в систему больше не потребуются коды подтверждения от этого аутентификатора.", + "messageLine2": "Ваша учетная запись может быть менее защищенной. Вы уверены, что хотите продолжить?", + "successMessage": "Двухэтапная проверка через приложение аутентификации была удалена.", + "title": "Удалить двухэтапную проверку" + }, + "successMessage": "Двухэтапная проверка теперь включена. При входе в систему вам потребуется ввести код подтверждения от этого аутентификатора как дополнительный шаг.", + "title": "Добавить приложение аутентификации", + "verifySubtitle": "Введите код подтверждения, сгенерированный вашим аутентификатором", + "verifyTitle": "Код подтверждения" + }, + "mobileButton__menu": "Меню", + "navbar": { + "account": "Профиль", + "description": "Управление информацией вашей учетной записи.", + "security": "Безопасность", + "title": "Учетная запись" + }, + "passkeyScreen": { + "removeResource": { + "messageLine1": "{{name}} будет удален из этой учетной записи.", + "title": "Удалить код доступа" + }, + "subtitle__rename": "Вы можете изменить имя кода доступа, чтобы его было легче найти.", + "title__rename": "Переименовать код доступа" + }, + "passwordPage": { + "checkboxInfoText__signOutOfOtherSessions": "Рекомендуется выйти из всех других устройств, которые могли использовать ваш старый пароль.", + "readonly": "Ваш пароль в настоящее время нельзя изменить, потому что вы можете войти только через корпоративное подключение.", + "successMessage__set": "Ваш пароль установлен.", + "successMessage__signOutOfOtherSessions": "Все другие устройства были отключены.", + "successMessage__update": "Ваш пароль обновлен.", + "title__set": "Установить пароль", + "title__update": "Обновить пароль" + }, + "phoneNumberPage": { + "infoText": "На этот номер телефона будет отправлено текстовое сообщение с кодом подтверждения. Могут применяться тарифы за сообщения и данные.", + "removeResource": { + "messageLine1": "{{identifier}} будет удален из этой учетной записи.", + "messageLine2": "Вы больше не сможете войти, используя этот номер телефона.", + "successMessage": "{{phoneNumber}} был удален из вашей учетной записи.", + "title": "Удалить номер телефона" + }, + "successMessage": "{{identifier}} был добавлен в вашу учетную запись.", + "title": "Добавить номер телефона", + "verifySubtitle": "Введите код подтверждения, отправленный на {{identifier}}", + "verifyTitle": "Подтвердить номер телефона" + }, + "profilePage": { + "fileDropAreaHint": "Рекомендуемый размер 1:1, до 10 МБ.", + "imageFormDestructiveActionSubtitle": "Удалить", + "imageFormSubtitle": "Загрузить", + "imageFormTitle": "Изображение профиля", + "readonly": "Информация о вашем профиле была предоставлена через корпоративное подключение и не может быть изменена.", + "successMessage": "Ваш профиль обновлен.", + "title": "Обновить профиль" + }, + "start": { + "activeDevicesSection": { + "destructiveAction": "Выйти из устройства", + "title": "Активные устройства" + }, + "connectedAccountsSection": { + "actionLabel__connectionFailed": "Попробуйте снова", + "actionLabel__reauthorize": "Авторизовать сейчас", + "destructiveActionTitle": "Удалить", + "primaryButton": "Подключить аккаунт", + "subtitle__reauthorize": "Требуемые разрешения были обновлены, и вы можете испытывать ограниченную функциональность. Пожалуйста, повторно авторизуйте это приложение, чтобы избежать проблем", + "title": "Подключенные аккаунты" + }, + "dangerSection": { + "deleteAccountButton": "Удалить аккаунт", + "title": "Удалить аккаунт" + }, + "emailAddressesSection": { + "destructiveAction": "Удалить электронную почту", + "detailsAction__nonPrimary": "Установить как основную", + "detailsAction__primary": "Завершить верификацию", + "detailsAction__unverified": "Проверить", + "primaryButton": "Добавить адрес электронной почты", + "title": "Адреса электронной почты" + }, + "enterpriseAccountsSection": { + "title": "Корпоративные аккаунты" + }, + "headerTitle__account": "Детали профиля", + "headerTitle__security": "Безопасность", + "mfaSection": { + "backupCodes": { + "actionLabel__regenerate": "Сгенерировать заново", + "headerTitle": "Резервные коды", + "subtitle__regenerate": "Получите новый набор безопасных резервных кодов. Предыдущие резервные коды будут удалены и не могут быть использованы.", + "title__regenerate": "Сгенерировать резервные коды" + }, + "phoneCode": { + "actionLabel__setDefault": "Установить по умолчанию", + "destructiveActionLabel": "Удалить" + }, + "primaryButton": "Добавить двухэтапную верификацию", + "title": "Двухэтапная верификация", + "totp": { + "destructiveActionTitle": "Удалить", + "headerTitle": "Приложение аутентификатора" + } + }, + "passkeysSection": { + "menuAction__destructive": "Удалить", + "menuAction__rename": "Переименовать", + "title": "Парольные ключи" + }, + "passwordSection": { + "primaryButton__setPassword": "Установить пароль", + "primaryButton__updatePassword": "Обновить пароль", + "title": "Пароль" + }, + "phoneNumbersSection": { + "destructiveAction": "Удалить номер телефона", + "detailsAction__nonPrimary": "Установить как основной", + "detailsAction__primary": "Завершить верификацию", + "detailsAction__unverified": "Проверить номер телефона", + "primaryButton": "Добавить номер телефона", + "title": "Номера телефонов" + }, + "profileSection": { + "primaryButton": "Обновить профиль", + "title": "Профиль" + }, + "usernameSection": { + "primaryButton__setUsername": "Установить имя пользователя", + "primaryButton__updateUsername": "Обновить имя пользователя", + "title": "Имя пользователя" + }, + "web3WalletsSection": { + "destructiveAction": "Удалить кошелек", + "primaryButton": "Кошельки Web3", + "title": "Кошельки Web3" + } + }, + "usernamePage": { + "successMessage": "Ваше имя пользователя обновлено.", + "title__set": "Установить имя пользователя", + "title__update": "Обновить имя пользователя" + }, + "web3WalletPage": { + "removeResource": { + "messageLine1": "{{identifier}} будет удален из этой учетной записи.", + "messageLine2": "Вы больше не сможете войти, используя этот кошелек web3.", + "successMessage": "{{web3Wallet}} был удален из вашей учетной записи.", + "title": "Удалить кошелек web3" + }, + "subtitle__availableWallets": "Выберите кошелек web3 для подключения к вашей учетной записи.", + "subtitle__unavailableWallets": "Нет доступных кошельков web3.", + "successMessage": "Кошелек был добавлен в вашу учетную запись.", + "title": "Добавить кошелек web3" + } + } +} diff --git a/locales/ru-RU/common.json b/locales/ru-RU/common.json index 99a4a65ecbbd8..0128c15c191f5 100644 --- a/locales/ru-RU/common.json +++ b/locales/ru-RU/common.json @@ -160,6 +160,7 @@ "newVersion": "Доступна новая версия: {{version}}" }, "userPanel": { + "anonymousNickName": "Анонимный пользователь", "billing": "Управление счетами", "defaultNickname": "Пользователь сообщества", "discord": "Поддержка сообщества", diff --git a/locales/ru-RU/error.json b/locales/ru-RU/error.json index 2495f9b53fc5f..c7cc2a238e9c6 100644 --- a/locales/ru-RU/error.json +++ b/locales/ru-RU/error.json @@ -1,4 +1,11 @@ { + "clerkAuth": { + "loginSuccess": { + "action": "继续会话", + "desc": "{{greeting}},很高兴能够继续为你服务。让我们接着刚刚的话题聊下去吧", + "title": "欢迎回来, {{nickName}}" + } + }, "error": { "backHome": "Вернуться на главную", "desc": "Попробуйте позже или вернитесь в знакомый мир", @@ -54,6 +61,7 @@ "InvalidAnthropicAPIKey": "Anthropic API Key недействителен или отсутствует. Пожалуйста, проверьте Anthropic API Key и повторите попытку", "InvalidAzureAPIKey": "Неверный или пустой ключ API Azure, пожалуйста, проверьте ключ API Azure и повторите попытку", "InvalidBedrockCredentials": "Аутентификация Bedrock не прошла, пожалуйста, проверьте AccessKeyId/SecretAccessKey и повторите попытку", + "InvalidClerkUser": "Извините, вы еще не вошли в систему. Пожалуйста, войдите или зарегистрируйтесь, прежде чем продолжить", "InvalidGoogleAPIKey": "Неверный или пустой ключ API Google, пожалуйста, проверьте ключ API Google и повторите попытку", "InvalidGroqAPIKey": "Неверный или пустой ключ API Groq, пожалуйста, проверьте ключ API Groq и повторите попытку", "InvalidMinimaxAPIKey": "Неверный или пустой ключ Minimax API. Пожалуйста, проверьте ключ Minimax API и повторите попытку", diff --git a/locales/tr-TR/auth.json b/locales/tr-TR/auth.json new file mode 100644 index 0000000000000..a87d0eb8b9e94 --- /dev/null +++ b/locales/tr-TR/auth.json @@ -0,0 +1,6 @@ +{ + "login": "Giriş Yap", + "loginOrSignup": "Giriş Yap / Kayıt Ol", + "signout": "Çıkış Yap", + "signup": "Kaydol" +} diff --git a/locales/tr-TR/clerk.json b/locales/tr-TR/clerk.json new file mode 100644 index 0000000000000..da41b582e985c --- /dev/null +++ b/locales/tr-TR/clerk.json @@ -0,0 +1,769 @@ +{ + "backButton": "Geri", + "badge__default": "Varsayılan", + "badge__otherImpersonatorDevice": "Diğer kişiyi taklit eden cihaz", + "badge__primary": "Birincil", + "badge__requiresAction": "Eylem gerektirir", + "badge__thisDevice": "Bu cihaz", + "badge__unverified": "Doğrulanmamış", + "badge__userDevice": "Kullanıcı cihazı", + "badge__you": "Sen", + "createOrganization": { + "formButtonSubmit": "Organizasyon oluştur", + "invitePage": { + "formButtonReset": "Atla" + }, + "title": "Organizasyon oluştur" + }, + "dates": { + "lastDay": "Dün {{ date | timeString('tr-TR') }}", + "next6Days": "{{ date | weekday('tr-TR','long') }} {{ date | timeString('tr-TR') }}", + "nextDay": "Yarın {{ date | timeString('tr-TR') }}", + "numeric": "{{ date | numeric('tr-TR') }}", + "previous6Days": "Geçen {{ date | weekday('tr-TR','long') }} {{ date | timeString('tr-TR') }}", + "sameDay": "Bugün {{ date | timeString('tr-TR') }}" + }, + "dividerText": "veya", + "footerActionLink__useAnotherMethod": "Başka bir yöntem kullan", + "footerPageLink__help": "Yardım", + "footerPageLink__privacy": "Gizlilik", + "footerPageLink__terms": "Şartlar", + "formButtonPrimary": "Devam", + "formButtonPrimary__verify": "Doğrula", + "formFieldAction__forgotPassword": "Şifremi unuttum?", + "formFieldError__matchingPasswords": "Şifreler eşleşiyor.", + "formFieldError__notMatchingPasswords": "Şifreler eşleşmiyor.", + "formFieldError__verificationLinkExpired": "Doğrulama bağlantısı süresi doldu. Lütfen yeni bir bağlantı isteyin.", + "formFieldHintText__optional": "İsteğe bağlı", + "formFieldHintText__slug": "Slug, benzersiz olması gereken insan tarafından okunabilir bir kimliktir. Genellikle URL'lerde kullanılır.", + "formFieldInputPlaceholder__backupCode": "", + "formFieldInputPlaceholder__confirmDeletionUserAccount": "Hesabı sil", + "formFieldInputPlaceholder__emailAddress": "", + "formFieldInputPlaceholder__emailAddress_username": "", + "formFieldInputPlaceholder__emailAddresses": "ornek@email.com, ornek2@email.com", + "formFieldInputPlaceholder__firstName": "", + "formFieldInputPlaceholder__lastName": "", + "formFieldInputPlaceholder__organizationDomain": "", + "formFieldInputPlaceholder__organizationDomainEmailAddress": "", + "formFieldInputPlaceholder__organizationName": "", + "formFieldInputPlaceholder__organizationSlug": "benim-org", + "formFieldInputPlaceholder__password": "", + "formFieldInputPlaceholder__phoneNumber": "", + "formFieldInputPlaceholder__username": "", + "formFieldLabel__automaticInvitations": "Bu alan için otomatik davetleri etkinleştir", + "formFieldLabel__backupCode": "Yedek kod", + "formFieldLabel__confirmDeletion": "Onay", + "formFieldLabel__confirmPassword": "Şifreyi onayla", + "formFieldLabel__currentPassword": "Mevcut şifre", + "formFieldLabel__emailAddress": "E-posta adresi", + "formFieldLabel__emailAddress_username": "E-posta adresi veya kullanıcı adı", + "formFieldLabel__emailAddresses": "E-posta adresleri", + "formFieldLabel__firstName": "Ad", + "formFieldLabel__lastName": "Soyad", + "formFieldLabel__newPassword": "Yeni şifre", + "formFieldLabel__organizationDomain": "Alan adı", + "formFieldLabel__organizationDomainDeletePending": "Bekleyen davetiyeleri ve önerileri sil", + "formFieldLabel__organizationDomainEmailAddress": "Doğrulama e-posta adresi", + "formFieldLabel__organizationDomainEmailAddressDescription": "Bu alan adı altında bir e-posta adresi girin, bir kod almak ve bu alan adını doğrulamak için.", + "formFieldLabel__organizationName": "Ad", + "formFieldLabel__organizationSlug": "Slug", + "formFieldLabel__passkeyName": "Anahtar adı", + "formFieldLabel__password": "Şifre", + "formFieldLabel__phoneNumber": "Telefon numarası", + "formFieldLabel__role": "Rol", + "formFieldLabel__signOutOfOtherSessions": "Diğer cihazlardan çıkış yap", + "formFieldLabel__username": "Kullanıcı adı", + "impersonationFab": { + "action__signOut": "Çıkış yap", + "title": "{{identifier}} olarak oturum açıldı" + }, + "locale": "tr-TR", + "maintenanceMode": "Şu anda bakımdayız, ancak endişelenmeyin, birkaç dakikadan fazla sürmemeli.", + "membershipRole__admin": "Yönetici", + "membershipRole__basicMember": "Üye", + "membershipRole__guestMember": "Misafir", + "organizationList": { + "action__createOrganization": "Organizasyon Oluştur", + "action__invitationAccept": "Katıl", + "action__suggestionsAccept": "Katılma İsteği", + "createOrganization": "Organizasyon Oluştur", + "invitationAcceptedLabel": "Katıldı", + "subtitle": "{{applicationName}}'e devam etmek için", + "suggestionsAcceptedLabel": "Onay Bekliyor", + "title": "Bir hesap seç", + "titleWithoutPersonal": "Bir organizasyon seç" + }, + "organizationProfile": { + "badge__automaticInvitation": "Otomatik Davetler", + "badge__automaticSuggestion": "Otomatik Öneriler", + "badge__manualInvitation": "Otomatik Kayıt Yok", + "badge__unverified": "Doğrulanmamış", + "createDomainPage": { + "subtitle": "Doğrulamak için alan adını ekleyin. Bu alan adına sahip e-posta adreslerine sahip kullanıcılar organizasyona otomatik olarak katılabilir veya katılma isteğinde bulunabilir.", + "title": "Alan Adı Ekle" + }, + "invitePage": { + "detailsTitle__inviteFailed": "Davetler gönderilemedi. Aşağıdaki e-posta adresleri için zaten bekleyen davetler var: {{email_addresses}}.", + "formButtonPrimary__continue": "Davet Gönder", + "selectDropdown__role": "Rol Seç", + "subtitle": "Bir veya daha fazla e-posta adresi girin veya yapıştırın, boşluklar veya virgüllerle ayırın.", + "successMessage": "Davetler başarıyla gönderildi", + "title": "Yeni Üyeleri Davet Et" + }, + "membersPage": { + "action__invite": "Davet Et", + "activeMembersTab": { + "menuAction__remove": "Üyeyi Kaldır", + "tableHeader__actions": "İşlemler", + "tableHeader__joined": "Katılma Tarihi", + "tableHeader__role": "Rol", + "tableHeader__user": "Kullanıcı" + }, + "detailsTitle__emptyRow": "Gösterilecek üye yok", + "invitationsTab": { + "autoInvitations": { + "headerSubtitle": "Bir e-posta alanınızı organizasyonunuzla bağlayarak kullanıcıları davet edin. Eşleşen bir e-posta alanıyla kaydolan herkes, istediği zaman organizasyona katılabilecektir.", + "headerTitle": "Otomatik Davetler", + "primaryButton": "Doğrulanmış Alanları Yönet" + }, + "table__emptyRow": "Gösterilecek davet yok" + }, + "invitedMembersTab": { + "menuAction__revoke": "Daveti Geri Çek", + "tableHeader__invited": "Davet Edildi" + }, + "requestsTab": { + "autoSuggestions": { + "headerSubtitle": "Eşleşen bir e-posta alanıyla kaydolan kullanıcılar, organizasyonunuza katılma isteğinde bulunmak için bir öneri görebilecekler.", + "headerTitle": "Otomatik Öneriler", + "primaryButton": "Doğrulanmış Alanları Yönet" + }, + "menuAction__approve": "Onayla", + "menuAction__reject": "Reddet", + "tableHeader__requested": "İstek", + "table__emptyRow": "Gösterilecek istek yok" + }, + "start": { + "headerTitle__invitations": "Davetler", + "headerTitle__members": "Üyeler", + "headerTitle__requests": "İstekler" + } + }, + "navbar": { + "description": "Organizasyonunuzu yönetin.", + "general": "Genel", + "members": "Üyeler", + "title": "Organizasyon" + }, + "profilePage": { + "dangerSection": { + "deleteOrganization": { + "actionDescription": "\"{{organizationName}}\" yazarak devam edin.", + "messageLine1": "Bu organizasyonu silmek istediğinizden emin misiniz?", + "messageLine2": "Bu işlem kalıcı ve geri alınamaz.", + "successMessage": "Organizasyonu sildiniz.", + "title": "Organizasyonu Sil" + }, + "leaveOrganization": { + "actionDescription": "\"{{organizationName}}\" yazarak devam edin.", + "messageLine1": "Bu organizasyondan ayrılmak istediğinizden emin misiniz? Bu organizasyona ve uygulamalarına erişiminiz kaybolacak.", + "messageLine2": "Bu işlem kalıcı ve geri alınamaz.", + "successMessage": "Organizasyondan ayrıldınız.", + "title": "Organizasyondan Ayrıl" + }, + "title": "Riskli" + }, + "domainSection": { + "menuAction__manage": "Yönet", + "menuAction__remove": "Sil", + "menuAction__verify": "Doğrula", + "primaryButton": "Alan Adı Ekle", + "subtitle": "Doğrulanmış bir e-posta alanına dayanarak kullanıcıların organizasyona otomatik olarak katılmasına veya katılma isteğinde bulunmasına izin verin.", + "title": "Doğrulanmış Alanlar" + }, + "successMessage": "Organizasyon güncellendi.", + "title": "Profili Güncelle" + }, + "removeDomainPage": { + "messageLine1": "{{domain}} e-posta alanı kaldırılacak.", + "messageLine2": "Bu işlemden sonra kullanıcılar organizasyona otomatik olarak katılamayacak.", + "successMessage": "{{domain}} kaldırıldı.", + "title": "Alanı Kaldır" + }, + "start": { + "headerTitle__general": "Genel", + "headerTitle__members": "Üyeler", + "profileSection": { + "primaryButton": "Profili Güncelle", + "title": "Organizasyon Profili", + "uploadAction__title": "Logo Yükle" + } + }, + "verifiedDomainPage": { + "dangerTab": { + "calloutInfoLabel": "Bu alanı kaldırmak, davet edilen kullanıcıları etkileyecektir.", + "removeDomainActionLabel__remove": "Alanı Kaldır", + "removeDomainSubtitle": "Bu alanı doğrulanmış alanlarınızdan kaldırın.", + "removeDomainTitle": "Alanı Kaldır" + }, + "enrollmentTab": { + "automaticInvitationOption__description": "Kullanıcılar kaydolduğunda organizasyona otomatik davet edilir ve istedikleri zaman katılabilirler.", + "automaticInvitationOption__label": "Otomatik Davetler", + "automaticSuggestionOption__description": "Kullanıcılar bir öneri alır ve organizasyona katılmadan önce bir yönetici tarafından onaylanmalıdır.", + "automaticSuggestionOption__label": "Otomatik Öneriler", + "calloutInfoLabel": "Kayıt modunu değiştirmek sadece yeni kullanıcıları etkiler.", + "calloutInvitationCountLabel": "Kullanıcılara gönderilen bekleyen davetler: {{count}}", + "calloutSuggestionCountLabel": "Kullanıcılara gönderilen bekleyen öneriler: {{count}}", + "manualInvitationOption__description": "Kullanıcılar yalnızca manuel olarak organizasyona davet edilebilir.", + "manualInvitationOption__label": "Otomatik Kayıt Yok", + "subtitle": "Bu alan adından gelen kullanıcıların organizasyona nasıl katılabileceğini seçin." + }, + "start": { + "headerTitle__danger": "Riskli", + "headerTitle__enrollment": "Kayıt Seçenekleri" + }, + "subtitle": "{{domain}} alanı artık doğrulandı. Kayıt modunu seçerek devam edin.", + "title": "{{domain}} Güncelle" + }, + "verifyDomainPage": { + "formSubtitle": "E-posta adresinize gönderilen doğrulama kodunu girin", + "formTitle": "Doğrulama Kodu", + "resendButton": "Kodu Almadınız mı? Tekrar Gönder", + "subtitle": "{{domainName}} alanı e-posta yoluyla doğrulanmalıdır.", + "subtitleVerificationCodeScreen": "{{emailAddress}} adresine bir doğrulama kodu gönderildi. Devam etmek için kodu girin.", + "title": "Alanı Doğrula" + } + }, + "organizationSwitcher": { + "action__createOrganization": "Organizasyon Oluştur", + "action__invitationAccept": "Katıl", + "action__manageOrganization": "Yönet", + "action__suggestionsAccept": "Katılma İsteği", + "notSelected": "Seçili organizasyon yok", + "personalWorkspace": "Kişisel hesap", + "suggestionsAcceptedLabel": "Onay Bekliyor" + }, + "paginationButton__next": "Sonraki", + "paginationButton__previous": "Önceki", + "paginationRowText__displaying": "Gösteriliyor", + "paginationRowText__of": "/", + "signIn": { + "accountSwitcher": { + "action__addAccount": "Hesap ekle", + "action__signOutAll": "Tüm hesaplardan çıkış yap", + "subtitle": "Devam etmek istediğiniz hesabı seçin.", + "title": "Bir hesap seçin" + }, + "alternativeMethods": { + "actionLink": "Yardım al", + "actionText": "Bunlardan hiçbiri yok mu?", + "blockButton__backupCode": "Yedek kod kullan", + "blockButton__emailCode": "{{identifier}} adresine e-posta kodu gönder", + "blockButton__emailLink": "{{identifier}} adresine e-posta bağlantısı gönder", + "blockButton__passkey": "Parolayla giriş yap", + "blockButton__password": "Şifrenizle giriş yap", + "blockButton__phoneCode": "{{identifier}} numarasına SMS kodu gönder", + "blockButton__totp": "Kimlik doğrulama uygulamanızı kullanın", + "getHelp": { + "blockButton__emailSupport": "E-posta desteği", + "content": "Hesabınıza giriş yaparken zorluk yaşıyorsanız, bize e-posta gönderin ve en kısa sürede erişimi geri yüklemek için size yardımcı olacağız.", + "title": "Yardım al" + }, + "subtitle": "Sorun mu yaşıyorsunuz? Giriş yapmak için bu yöntemlerden birini kullanabilirsiniz.", + "title": "Başka bir yöntem kullan" + }, + "backupCodeMfa": { + "subtitle": "Yedek kodunuz, iki adımlı kimlik doğrulama kurulumu sırasında aldığınız koddur.", + "title": "Yedek kodu girin" + }, + "emailCode": { + "formTitle": "Doğrulama kodu", + "resendButton": "Kod almadınız mı? Tekrar gönder", + "subtitle": "{{applicationName}} devam etmek için", + "title": "E-postanızı kontrol edin" + }, + "emailLink": { + "expired": { + "subtitle": "Devam etmek için orijinal sekme'ye dönün.", + "title": "Bu doğrulama bağlantısı süresi doldu" + }, + "failed": { + "subtitle": "Devam etmek için orijinal sekme'ye dönün.", + "title": "Bu doğrulama bağlantısı geçersiz" + }, + "formSubtitle": "E-postanıza gönderilen doğrulama bağlantısını kullanın", + "formTitle": "Doğrulama bağlantısı", + "loading": { + "subtitle": "Yakında yönlendirileceksiniz", + "title": "Giriş yapılıyor..." + }, + "resendButton": "Bağlantı almadınız mı? Tekrar gönder", + "subtitle": "{{applicationName}} devam etmek için", + "title": "E-postanızı kontrol edin", + "unusedTab": { + "title": "Bu sekme'yi kapatabilirsiniz" + }, + "verified": { + "subtitle": "Yakında yönlendirileceksiniz", + "title": "Başarıyla giriş yapıldı" + }, + "verifiedSwitchTab": { + "subtitle": "Devam etmek için orijinal sekme'ye dönün", + "subtitleNewTab": "Devam etmek için yeni açılan sekme'ye dönün", + "titleNewTab": "Diğer sekmede oturum açıldı" + } + }, + "forgotPassword": { + "formTitle": "Şifre sıfırlama kodu", + "resendButton": "Kod almadınız mı? Tekrar gönder", + "subtitle": "Şifrenizi sıfırlamak için", + "subtitle_email": "Önce e-posta adresinize gönderilen kodu girin", + "subtitle_phone": "Önce telefonunuza gönderilen kodu girin", + "title": "Şifrenizi sıfırlayın" + }, + "forgotPasswordAlternativeMethods": { + "blockButton__resetPassword": "Şifrenizi sıfırlayın", + "label__alternativeMethods": "Veya başka bir yöntemle oturum açın", + "title": "Şifrenizi mi unuttunuz?" + }, + "noAvailableMethods": { + "message": "Oturum açmaya devam edilemiyor. Kullanılabilir kimlik doğrulama faktörü yok.", + "subtitle": "Bir hata oluştu", + "title": "Oturum açılamıyor" + }, + "passkey": { + "subtitle": "Parolayı kullanarak giriş yapmak kim olduğunuzu onaylar. Cihazınız parmak izinizi, yüzünüzü veya ekran kilidinizi isteyebilir.", + "title": "Parolanızı kullanın" + }, + "password": { + "actionLink": "Başka bir yöntem kullan", + "subtitle": "Hesabınıza ilişkilendirilmiş şifreyi girin", + "title": "Şifrenizi girin" + }, + "passwordPwned": { + "title": "Şifre tehlikede" + }, + "phoneCode": { + "formTitle": "Doğrulama kodu", + "resendButton": "Kod almadınız mı? Tekrar gönder", + "subtitle": "{{applicationName}} devam etmek için", + "title": "Telefonunuzu kontrol edin" + }, + "phoneCodeMfa": { + "formTitle": "Doğrulama kodu", + "resendButton": "Kod almadınız mı? Tekrar gönder", + "subtitle": "Devam etmek için lütfen telefonunuza gönderilen doğrulama kodunu girin", + "title": "Telefonunuzu kontrol edin" + }, + "resetPassword": { + "formButtonPrimary": "Şifreyi sıfırla", + "requiredMessage": "Güvenlik nedeniyle şifrenizi sıfırlamanız gerekmektedir.", + "successMessage": "Şifreniz başarıyla değiştirildi. Sizi oturum açıyoruz, lütfen biraz bekleyin.", + "title": "Yeni şifre belirleyin" + }, + "resetPasswordMfa": { + "detailsLabel": "Şifrenizi sıfırlamadan önce kimliğinizi doğrulamamız gerekiyor." + }, + "start": { + "actionLink": "Üye ol", + "actionLink__use_email": "E-posta kullan", + "actionLink__use_email_username": "E-posta veya kullanıcı adı kullan", + "actionLink__use_passkey": "Yerine parolayı kullan", + "actionLink__use_phone": "Telefon kullan", + "actionLink__use_username": "Kullanıcı adı kullan", + "actionText": "Hesabınız yok mu?", + "subtitle": "Tekrar hoş geldiniz! Devam etmek için lütfen oturum açın", + "title": "{{applicationName}}'e oturum açın" + }, + "totpMfa": { + "formTitle": "Doğrulama kodu", + "subtitle": "Devam etmek için lütfen kimlik doğrulama uygulamanız tarafından oluşturulan doğrulama kodunu girin", + "title": "İki adımlı doğrulama" + } + }, + "signInEnterPasswordTitle": "Şifrenizi girin", + "signUp": { + "continue": { + "actionLink": "Oturum aç", + "actionText": "Zaten bir hesabınız var mı?", + "subtitle": "Devam etmek için lütfen kalan detayları doldurun.", + "title": "Eksik alanları doldurun" + }, + "emailCode": { + "formSubtitle": "E-posta adresinize gönderilen doğrulama kodunu girin", + "formTitle": "Doğrulama kodu", + "resendButton": "Kod almadınız mı? Tekrar gönder", + "subtitle": "E-postanıza gönderilen doğrulama kodunu girin", + "title": "E-postanızı doğrulayın" + }, + "emailLink": { + "formSubtitle": "E-posta adresinize gönderilen doğrulama bağlantısını kullanın", + "formTitle": "Doğrulama bağlantısı", + "loading": { + "title": "Üye olunuyor..." + }, + "resendButton": "Bağlantı almadınız mı? Tekrar gönder", + "subtitle": "{{applicationName}} devam etmek için", + "title": "E-postanızı doğrulayın", + "verified": { + "title": "Başarıyla üye oldunuz" + }, + "verifiedSwitchTab": { + "subtitle": "Devam etmek için yeni açılan sekme'ye dönün", + "subtitleNewTab": "Devam etmek için önceki sekme'ye dönün", + "title": "E-posta doğrulaması başarılı" + } + }, + "phoneCode": { + "formSubtitle": "Telefon numaranıza gönderilen doğrulama kodunu girin", + "formTitle": "Doğrulama kodu", + "resendButton": "Kod almadınız mı? Tekrar gönder", + "subtitle": "Telefonunuza gönderilen doğrulama kodunu girin", + "title": "Telefonunuzu doğrulayın" + }, + "start": { + "actionLink": "Oturum aç", + "actionText": "Zaten bir hesabınız var mı?", + "subtitle": "Hoş geldiniz! Başlamak için lütfen detayları doldurun.", + "title": "Hesabınızı oluşturun" + } + }, + "socialButtonsBlockButton": "Devam et {{provider|titleize}}", + "unstable__errors": { + "captcha_invalid": "Güvenlik doğrulamaları başarısız olduğu için kaydolma başarısız oldu. Lütfen tekrar denemek için sayfayı yenileyin veya daha fazla yardım için destek ekibine başvurun.", + "captcha_unavailable": "Bot doğrulaması başarısız olduğu için kaydolma başarısız oldu. Lütfen tekrar denemek için sayfayı yenileyin veya daha fazla yardım için destek ekibine başvurun.", + "form_code_incorrect": "", + "form_identifier_exists": "", + "form_identifier_exists__email_address": "Bu e-posta adresi alınmış. Lütfen başka bir tane deneyin.", + "form_identifier_exists__phone_number": "Bu telefon numarası alınmış. Lütfen başka bir tane deneyin.", + "form_identifier_exists__username": "Bu kullanıcı adı alınmış. Lütfen başka bir tane deneyin.", + "form_identifier_not_found": "", + "form_param_format_invalid": "", + "form_param_format_invalid__email_address": "E-posta adresi geçerli bir e-posta adresi olmalıdır.", + "form_param_format_invalid__phone_number": "Telefon numarası geçerli bir uluslararası formatta olmalıdır.", + "form_param_max_length_exceeded__first_name": "Adınız 256 karakteri aşmamalıdır.", + "form_param_max_length_exceeded__last_name": "Soyadınız 256 karakteri aşmamalıdır.", + "form_param_max_length_exceeded__name": "Adınız 256 karakteri aşmamalıdır.", + "form_param_nil": "", + "form_password_incorrect": "", + "form_password_length_too_short": "", + "form_password_not_strong_enough": "Şifreniz yeterince güçlü değil.", + "form_password_pwned": "Bu şifre ihlal edilmiş bir parça olarak bulundu ve kullanılamaz, lütfen başka bir şifre deneyin.", + "form_password_pwned__sign_in": "Bu şifre ihlal edilmiş bir parça olarak bulundu ve kullanılamaz, lütfen şifrenizi sıfırlayın.", + "form_password_size_in_bytes_exceeded": "Şifreniz izin verilen maksimum bayt sayısını aştı, lütfen kısaltın veya bazı özel karakterleri kaldırın.", + "form_password_validation_failed": "Yanlış Şifre", + "form_username_invalid_character": "", + "form_username_invalid_length": "", + "identification_deletion_failed": "Son kimliğinizi silemezsiniz.", + "not_allowed_access": "", + "passkey_already_exists": "Bu cihazda zaten kayıtlı bir geçiş anahtarı var.", + "passkey_not_supported": "Bu cihazda geçiş anahtarları desteklenmiyor.", + "passkey_pa_not_supported": "Kayıt, platform kimlik doğrulayıcı gerektirir ancak cihaz bunu desteklemiyor.", + "passkey_registration_cancelled": "Geçiş anahtarı kaydı iptal edildi veya zaman aşımına uğradı.", + "passkey_retrieval_cancelled": "Geçiş anahtarı doğrulaması iptal edildi veya zaman aşımına uğradı.", + "passwordComplexity": { + "maximumLength": "{{length}} karakterden az olmalıdır", + "minimumLength": "{{length}} veya daha fazla karakter", + "requireLowercase": "bir küçük harf", + "requireNumbers": "bir sayı", + "requireSpecialCharacter": "bir özel karakter", + "requireUppercase": "büyük harf", + "sentencePrefix": "Şifreniz şunları içermelidir" + }, + "phone_number_exists": "Bu telefon numarası alınmış. Lütfen başka bir tane deneyin.", + "zxcvbn": { + "couldBeStronger": "Şifreniz işe yarıyor, ancak daha güçlü olabilir. Daha fazla karakter eklemeyi deneyin.", + "goodPassword": "Şifreniz tüm gerekli gereksinimleri karşılıyor.", + "notEnough": "Şifreniz yeterince güçlü değil.", + "suggestions": { + "allUppercase": "Tüm harfleri büyük yapın.", + "anotherWord": "Daha az yaygın olan daha fazla kelime ekleyin.", + "associatedYears": "Size ilişkilendirilen yıllardan kaçının.", + "capitalization": "Sadece ilk harfi büyük yapın.", + "dates": "Tarihlerden kaçının.", + "l33t": "'@' yerine 'a' gibi tahmin edilebilir harf değişimlerinden kaçının.", + "longerKeyboardPattern": "Daha uzun klavye desenleri kullanın ve yazma yönünü birden çok kez değiştirin.", + "noNeed": "Semboller, sayılar veya büyük harfler kullanmadan da güçlü şifreler oluşturabilirsiniz.", + "pwned": "Bu şifreyi başka bir yerde kullanıyorsanız, değiştirmelisiniz.", + "recentYears": "Son yıllardan kaçının.", + "repeated": "Tekrarlanan kelimelerden ve karakterlerden kaçının.", + "reverseWords": "Ortak kelimelerin ters yazımlarından kaçının.", + "sequences": "Ortak karakter dizilerinden kaçının.", + "useWords": "Birden fazla kelime kullanın, ancak ortak ifadelerden kaçının." + }, + "warnings": { + "common": "Bu sıkça kullanılan bir şifredir.", + "commonNames": "Ortak isimler ve soyadları kolayca tahmin edilebilir.", + "dates": "Tarihler kolayca tahmin edilebilir.", + "extendedRepeat": "\"abcabcabc\" gibi tekrarlanan karakter desenleri kolayca tahmin edilebilir.", + "keyPattern": "Kısa klavye desenleri kolayca tahmin edilebilir.", + "namesByThemselves": "Tek başına isimler veya soyadları kolayca tahmin edilebilir.", + "pwned": "Şifreniz İnternet'teki bir veri ihlalinde ortaya çıktı.", + "recentYears": "Son yıllar kolayca tahmin edilebilir.", + "sequences": "\"abc\" gibi ortak karakter dizilerinden kaçının.", + "similarToCommon": "Bu sıkça kullanılan bir şifreye benziyor.", + "simpleRepeat": "\"aaa\" gibi tekrarlanan karakterler kolayca tahmin edilebilir.", + "straightRow": "Klavyenizdeki düz sıralar kolayca tahmin edilebilir.", + "topHundred": "Bu sıkça kullanılan bir şifredir.", + "topTen": "Bu yoğun bir şekilde kullanılan bir şifredir.", + "userInputs": "Kişisel veya sayfa ile ilgili veriler olmamalıdır.", + "wordByItself": "Tek kelimeler kolayca tahmin edilebilir." + } + } + }, + "userButton": { + "action__addAccount": "Hesap Ekle", + "action__manageAccount": "Hesabı Yönet", + "action__signOut": "Çıkış Yap", + "action__signOutAll": "Tüm Hesaplardan Çıkış Yap" + }, + "userProfile": { + "backupCodePage": { + "actionLabel__copied": "Kopyalandı!", + "actionLabel__copy": "Tümünü Kopyala", + "actionLabel__download": "İndir .txt", + "actionLabel__print": "Yazdır", + "infoText1": "Yedek kodlar bu hesap için etkinleştirilecek.", + "infoText2": "Yedek kodları gizli tutun ve güvenli bir şekilde saklayın. Şüphelenirseniz yedek kodları yeniden oluşturabilirsiniz.", + "subtitle__codelist": "Güvenli bir şekilde saklayın ve gizli tutun.", + "successMessage": "Yedek kodlar şimdi etkinleştirildi. Hesabınıza giriş yapmak için bunlardan birini kullanabilirsiniz, kimlik doğrulama cihazınıza erişiminizi kaybederseniz. Her kod yalnızca bir kez kullanılabilir.", + "successSubtitle": "Hesabınıza giriş yapmak için bunlardan birini kullanabilirsiniz, kimlik doğrulama cihazınıza erişiminizi kaybederseniz.", + "title": "Yedek kod doğrulaması ekle", + "title__codelist": "Yedek kodlar" + }, + "connectedAccountPage": { + "formHint": "Hesabınızı bağlamak için bir sağlayıcı seçin.", + "formHint__noAccounts": "Mevcut harici hesap sağlayıcıları yok.", + "removeResource": { + "messageLine1": "{{identifier}} bu hesaptan kaldırılacak.", + "messageLine2": "Bu bağlı hesabı artık kullanamayacak ve bağımlı özellikler artık çalışmayacak.", + "successMessage": "{{connectedAccount}} hesabınızdan kaldırıldı.", + "title": "Bağlı hesabı kaldır" + }, + "socialButtonsBlockButton": "{{provider|titleize}}", + "successMessage": "Sağlayıcı hesabınıza eklendi", + "title": "Bağlı hesap ekle" + }, + "deletePage": { + "actionDescription": "Devam etmek için \"Hesabı Sil\" yazın.", + "confirm": "Hesabı Sil", + "messageLine1": "Hesabınızı silmek istediğinizden emin misiniz?", + "messageLine2": "Bu işlem kalıcı ve geri alınamaz.", + "title": "Hesabı Sil" + }, + "emailAddressPage": { + "emailCode": { + "formHint": "Bu e-posta adresine gönderilen doğrulama kodunu içeren bir e-posta gönderilecektir.", + "formSubtitle": "{{identifier}}'e gönderilen doğrulama kodunu girin", + "formTitle": "Doğrulama kodu", + "resendButton": "Kod almadınız mı? Tekrar gönder", + "successMessage": "E-posta {{identifier}} hesabınıza eklendi." + }, + "emailLink": { + "formHint": "Bu e-posta adresine gönderilen doğrulama bağlantısını içeren bir e-posta gönderilecektir.", + "formSubtitle": "{{identifier}}'e gönderilen e-postadaki doğrulama bağlantısına tıklayın", + "formTitle": "Doğrulama bağlantısı", + "resendButton": "Bağlantı almadınız mı? Tekrar gönder", + "successMessage": "E-posta {{identifier}} hesabınıza eklendi." + }, + "removeResource": { + "messageLine1": "{{identifier}} bu hesaptan kaldırılacak.", + "messageLine2": "Bu e-posta adresini kullanarak artık oturum açamayacaksınız.", + "successMessage": "{{emailAddress}} hesabınızdan kaldırıldı.", + "title": "E-posta adresini kaldır" + }, + "title": "E-posta adresi ekle", + "verifyTitle": "E-posta adresini doğrula" + }, + "formButtonPrimary__add": "Ekle", + "formButtonPrimary__continue": "Devam", + "formButtonPrimary__finish": "Bitir", + "formButtonPrimary__remove": "Kaldır", + "formButtonPrimary__save": "Kaydet", + "formButtonReset": "İptal", + "mfaPage": { + "formHint": "Eklemek için bir yöntem seçin.", + "title": "İki adımlı doğrulama ekle" + }, + "mfaPhoneCodePage": { + "backButton": "Mevcut numarayı kullan", + "primaryButton__addPhoneNumber": "Telefon numarası ekle", + "removeResource": { + "messageLine1": "{{identifier}} artık oturum açarken doğrulama kodları almayacak.", + "messageLine2": "Hesabınız belki de güvenli olmayabilir. Devam etmek istediğinizden emin misiniz?", + "successMessage": "SMS kodu iki adımlı doğrulama {{mfaPhoneCode}} için kaldırıldı", + "title": "İki adımlı doğrulamayı kaldır" + }, + "subtitle__availablePhoneNumbers": "SMS kodu iki adımlı doğrulama için mevcut bir telefon numarası seçin veya yeni bir tane ekleyin.", + "subtitle__unavailablePhoneNumbers": "SMS kodu iki adımlı doğrulama için mevcut telefon numaraları yok, lütfen yeni bir tane ekleyin.", + "successMessage1": "Oturum açarken, bu telefon numarasına gönderilen doğrulama kodunu ek bir adım olarak girmeniz gerekecek.", + "successMessage2": "Bu yedek kodları kaydedin ve güvenli bir yere saklayın. Kimlik doğrulama cihazınıza erişiminizi kaybederseniz, yedek kodları kullanabilirsiniz.", + "successTitle": "SMS kodu doğrulaması etkinleştirildi", + "title": "SMS kodu doğrulaması ekle" + }, + "mfaTOTPPage": { + "authenticatorApp": { + "buttonAbleToScan__nonPrimary": "QR kodunu tarayabilirsiniz", + "buttonUnableToScan__nonPrimary": "QR kodunu tarayamıyor musunuz?", + "infoText__ableToScan": "Kimlik doğrulayıcı uygulamanızda yeni bir giriş yöntemi kurun ve aşağıdaki QR kodunu bağlamak için tarayın.", + "infoText__unableToScan": "Kimlik doğrulayıcıda yeni bir giriş yöntemi kurun ve aşağıda verilen Anahtarı girin.", + "inputLabel__unableToScan1": "Zaman tabanlı veya Tek kullanımlık şifrelerin etkin olduğundan emin olun, sonra hesabınızı bağlamayı bitirin.", + "inputLabel__unableToScan2": "Ayrıca, kimlik doğrulayıcınız TOTP URI'leri destekliyorsa, tam URI'yi de kopyalayabilirsiniz." + }, + "removeResource": { + "messageLine1": "Bu kimlik doğrulayıcıdan gelen doğrulama kodları artık gerekli olmayacak.", + "messageLine2": "Hesabınız belki de güvenli olmayabilir. Devam etmek istediğinizden emin misiniz?", + "successMessage": "Kimlik doğrulayıcı uygulaması ile iki adımlı doğrulama kaldırıldı.", + "title": "İki adımlı doğrulamayı kaldır" + }, + "successMessage": "İki adımlı doğrulama şimdi etkin. Oturum açarken, hesabınıza ek bir adım olarak bu kimlik doğrulayıcıdan bir doğrulama kodu girmeniz gerekecek.", + "title": "Kimlik doğrulayıcı uygulaması ekle", + "verifySubtitle": "Kimlik doğrulayıcınız tarafından oluşturulan doğrulama kodunu girin", + "verifyTitle": "Doğrulama kodu" + }, + "mobileButton__menu": "Menü", + "navbar": { + "account": "Profil", + "description": "Hesap bilgilerinizi yönetin.", + "security": "Güvenlik", + "title": "Hesap" + }, + "passkeyScreen": { + "removeResource": { + "messageLine1": "{{name}} bu hesaptan kaldırılacak.", + "title": "Parola kaldır" + }, + "subtitle__rename": "Parola adını değiştirerek daha kolay bulabilirsiniz.", + "title__rename": "Parolayı Yeniden Adlandır" + }, + "passwordPage": { + "checkboxInfoText__signOutOfOtherSessions": "Eski şifrenizi kullanan diğer cihazlardan çıkış yapmanız önerilir.", + "readonly": "Şu anda şifreniz düzenlenemez çünkü yalnızca kurumsal bağlantı aracılığıyla oturum açabilirsiniz.", + "successMessage__set": "Şifreniz oluşturuldu.", + "successMessage__signOutOfOtherSessions": "Diğer cihazlardan çıkış yapıldı.", + "successMessage__update": "Şifreniz güncellendi.", + "title__set": "Şifre Oluştur", + "title__update": "Şifre Güncelle" + }, + "phoneNumberPage": { + "infoText": "Doğrulama kodu içeren bir metin mesajı bu telefon numarasına gönderilecektir. Mesaj ve veri ücretleri uygulanabilir.", + "removeResource": { + "messageLine1": "{{identifier}} bu hesaptan kaldırılacak.", + "messageLine2": "Bu telefon numarasını kullanarak artık oturum açamayacaksınız.", + "successMessage": "{{phoneNumber}} hesabınızdan kaldırıldı.", + "title": "Telefon Numarasını Kaldır" + }, + "successMessage": "{{identifier}} hesabınıza eklendi.", + "title": "Telefon Numarası Ekle", + "verifySubtitle": "{{identifier}}'a gönderilen doğrulama kodunu girin", + "verifyTitle": "Telefon Numarasını Doğrula" + }, + "profilePage": { + "fileDropAreaHint": "Önerilen boyut 1:1, en fazla 10MB.", + "imageFormDestructiveActionSubtitle": "Kaldır", + "imageFormSubtitle": "Yükle", + "imageFormTitle": "Profil resmi", + "readonly": "Profil bilgileriniz kurumsal bağlantı tarafından sağlanmıştır ve düzenlenemez.", + "successMessage": "Profiliniz güncellendi.", + "title": "Profil Güncelle" + }, + "start": { + "activeDevicesSection": { + "destructiveAction": "Cihazdan çıkış yap", + "title": "Aktif cihazlar" + }, + "connectedAccountsSection": { + "actionLabel__connectionFailed": "Yeniden dene", + "actionLabel__reauthorize": "Şimdi yetkilendir", + "destructiveActionTitle": "Kaldır", + "primaryButton": "Hesabı bağla", + "subtitle__reauthorize": "Gerekli kapsamlar güncellendi ve sınırlı işlevsellik yaşayabilirsiniz. Herhangi bir sorun yaşamamak için bu uygulamayı yeniden yetkilendirin", + "title": "Bağlı hesaplar" + }, + "dangerSection": { + "deleteAccountButton": "Hesabı sil", + "title": "Hesabı sil" + }, + "emailAddressesSection": { + "destructiveAction": "E-postayı kaldır", + "detailsAction__nonPrimary": "Ana e-posta olarak ayarla", + "detailsAction__primary": "Doğrulamayı tamamla", + "detailsAction__unverified": "Doğrula", + "primaryButton": "E-posta adresi ekle", + "title": "E-posta adresleri" + }, + "enterpriseAccountsSection": { + "title": "Kurumsal hesaplar" + }, + "headerTitle__account": "Profil detayları", + "headerTitle__security": "Güvenlik", + "mfaSection": { + "backupCodes": { + "actionLabel__regenerate": "Yeniden oluştur", + "headerTitle": "Yedek kodlar", + "subtitle__regenerate": "Güvenli yedek kodların yeni bir setini alın. Önceki yedek kodlar silinecek ve kullanılamayacak.", + "title__regenerate": "Yedek kodları yeniden oluştur" + }, + "phoneCode": { + "actionLabel__setDefault": "Varsayılan olarak ayarla", + "destructiveActionLabel": "Kaldır" + }, + "primaryButton": "İki adımlı doğrulama ekle", + "title": "İki adımlı doğrulama", + "totp": { + "destructiveActionTitle": "Kaldır", + "headerTitle": "Kimlik doğrulama uygulaması" + } + }, + "passkeysSection": { + "menuAction__destructive": "Kaldır", + "menuAction__rename": "Yeniden adlandır", + "title": "Parola anahtarları" + }, + "passwordSection": { + "primaryButton__setPassword": "Parola ayarla", + "primaryButton__updatePassword": "Parolayı güncelle", + "title": "Parola" + }, + "phoneNumbersSection": { + "destructiveAction": "Telefon numarasını kaldır", + "detailsAction__nonPrimary": "Ana telefon olarak ayarla", + "detailsAction__primary": "Doğrulamayı tamamla", + "detailsAction__unverified": "Telefon numarasını doğrula", + "primaryButton": "Telefon numarası ekle", + "title": "Telefon numaraları" + }, + "profileSection": { + "primaryButton": "Profili güncelle", + "title": "Profil" + }, + "usernameSection": { + "primaryButton__setUsername": "Kullanıcı adı ayarla", + "primaryButton__updateUsername": "Kullanıcı adını güncelle", + "title": "Kullanıcı adı" + }, + "web3WalletsSection": { + "destructiveAction": "Cüzdanı kaldır", + "primaryButton": "Web3 cüzdanları", + "title": "Web3 cüzdanları" + } + }, + "usernamePage": { + "successMessage": "Kullanıcı adınız güncellendi.", + "title__set": "Kullanıcı Adı Belirle", + "title__update": "Kullanıcı Adını Güncelle" + }, + "web3WalletPage": { + "removeResource": { + "messageLine1": "{{identifier}} bu hesaptan kaldırılacak.", + "messageLine2": "Bu web3 cüzdanını kullanarak artık oturum açamayacaksınız.", + "successMessage": "{{web3Wallet}} hesabınızdan kaldırıldı.", + "title": "Web3 Cüzdanını Kaldır" + }, + "subtitle__availableWallets": "Hesabınıza bağlanmak için bir web3 cüzdanı seçin.", + "subtitle__unavailableWallets": "Uygun web3 cüzdanı bulunmamaktadır.", + "successMessage": "Cüzdan hesabınıza eklendi.", + "title": "Web3 Cüzdanı Ekle" + } + } +} diff --git a/locales/tr-TR/common.json b/locales/tr-TR/common.json index d9d3ed7054e9b..6a7aea59b99ce 100644 --- a/locales/tr-TR/common.json +++ b/locales/tr-TR/common.json @@ -160,6 +160,7 @@ "newVersion": "Yeni sürüm mevcut: {{version}}" }, "userPanel": { + "anonymousNickName": "Anonim Kullanıcı", "billing": "Fatura Yönetimi", "defaultNickname": "Topluluk Kullanıcısı", "discord": "Topluluk Destek", diff --git a/locales/tr-TR/error.json b/locales/tr-TR/error.json index d33925ffedb26..45f4ed12b1aa5 100644 --- a/locales/tr-TR/error.json +++ b/locales/tr-TR/error.json @@ -1,4 +1,11 @@ { + "clerkAuth": { + "loginSuccess": { + "action": "devam et", + "desc": "{{greeting}},senin için hizmet vermeye devam edebilmek çok mutluluk verici. Hadi konuşmamıza kaldığımız yerden devam edelim", + "title": "Tekrar hoş geldin, {{nickName}}" + } + }, "error": { "backHome": "Ana Sayfaya Dön", "desc": "Biraz sonra tekrar deneyin veya bilinen dünyaya geri dönün", @@ -54,6 +61,7 @@ "InvalidAnthropicAPIKey": "Anthropic API Key geçersiz veya boş, lütfen Anthropic API Key'inizi kontrol edip tekrar deneyin", "InvalidAzureAPIKey": "Azure API Anahtarı yanlış veya boş, lütfen Azure API Anahtarınızı kontrol edip tekrar deneyin", "InvalidBedrockCredentials": "Bedrock kimlik doğrulaması geçersiz, lütfen AccessKeyId/SecretAccessKey bilgilerinizi kontrol edip tekrar deneyin", + "InvalidClerkUser": "Üzgünüz, şu anda giriş yapmadınız. Lütfen işlemlere devam etmeden önce giriş yapın veya hesap oluşturun", "InvalidGoogleAPIKey": "Google API Anahtarı yanlış veya boş, lütfen Google API Anahtarınızı kontrol edip tekrar deneyin", "InvalidGroqAPIKey": "Groq API Anahtarı yanlış veya boş, lütfen Groq API Anahtarınızı kontrol edip tekrar deneyin", "InvalidMinimaxAPIKey": "Minimax API Anahtarı geçersiz veya boş, lütfen Minimax API Anahtarınızı kontrol edip tekrar deneyin", diff --git a/locales/vi-VN/auth.json b/locales/vi-VN/auth.json new file mode 100644 index 0000000000000..ccb276eb490eb --- /dev/null +++ b/locales/vi-VN/auth.json @@ -0,0 +1,6 @@ +{ + "login": "Đăng nhập", + "loginOrSignup": "Đăng nhập / Đăng ký", + "signout": "Đăng xuất", + "signup": "Đăng ký" +} diff --git a/locales/vi-VN/clerk.json b/locales/vi-VN/clerk.json new file mode 100644 index 0000000000000..c4f656da6ae1d --- /dev/null +++ b/locales/vi-VN/clerk.json @@ -0,0 +1,769 @@ +{ + "backButton": "Quay lại", + "badge__default": "Mặc định", + "badge__otherImpersonatorDevice": "Thiết bị giả mạo khác", + "badge__primary": "Chính", + "badge__requiresAction": "Yêu cầu hành động", + "badge__thisDevice": "Thiết bị này", + "badge__unverified": "Chưa xác minh", + "badge__userDevice": "Thiết bị người dùng", + "badge__you": "Bạn", + "createOrganization": { + "formButtonSubmit": "Tạo tổ chức", + "invitePage": { + "formButtonReset": "Bỏ qua" + }, + "title": "Tạo tổ chức" + }, + "dates": { + "lastDay": "Hôm qua vào {{ date | timeString('vi-VN') }}", + "next6Days": "{{ date | weekday('vi-VN','long') }} vào {{ date | timeString('vi-VN') }}", + "nextDay": "Ngày mai vào {{ date | timeString('vi-VN') }}", + "numeric": "{{ date | numeric('vi-VN') }}", + "previous6Days": "Vào {{ date | weekday('vi-VN','long') }} trước vào {{ date | timeString('vi-VN') }}", + "sameDay": "Hôm nay vào {{ date | timeString('vi-VN') }}" + }, + "dividerText": "hoặc", + "footerActionLink__useAnotherMethod": "Sử dụng phương pháp khác", + "footerPageLink__help": "Trợ giúp", + "footerPageLink__privacy": "Quyền riêng tư", + "footerPageLink__terms": "Điều khoản", + "formButtonPrimary": "Tiếp tục", + "formButtonPrimary__verify": "Xác minh", + "formFieldAction__forgotPassword": "Quên mật khẩu?", + "formFieldError__matchingPasswords": "Mật khẩu khớp.", + "formFieldError__notMatchingPasswords": "Mật khẩu không khớp.", + "formFieldError__verificationLinkExpired": "Liên kết xác minh đã hết hạn. Vui lòng yêu cầu một liên kết mới.", + "formFieldHintText__optional": "Tùy chọn", + "formFieldHintText__slug": "Slug là một ID có thể đọc được cho con người phải là duy nhất. Thường được sử dụng trong URL.", + "formFieldInputPlaceholder__backupCode": "", + "formFieldInputPlaceholder__confirmDeletionUserAccount": "Xóa tài khoản", + "formFieldInputPlaceholder__emailAddress": "", + "formFieldInputPlaceholder__emailAddress_username": "", + "formFieldInputPlaceholder__emailAddresses": "ví dụ@email.com, ví dụ2@email.com", + "formFieldInputPlaceholder__firstName": "", + "formFieldInputPlaceholder__lastName": "", + "formFieldInputPlaceholder__organizationDomain": "", + "formFieldInputPlaceholder__organizationDomainEmailAddress": "", + "formFieldInputPlaceholder__organizationName": "", + "formFieldInputPlaceholder__organizationSlug": "tổ-chức-của-tôi", + "formFieldInputPlaceholder__password": "", + "formFieldInputPlaceholder__phoneNumber": "", + "formFieldInputPlaceholder__username": "", + "formFieldLabel__automaticInvitations": "Bật mời tự động cho miền này", + "formFieldLabel__backupCode": "Mã sao lưu", + "formFieldLabel__confirmDeletion": "Xác nhận", + "formFieldLabel__confirmPassword": "Xác nhận mật khẩu", + "formFieldLabel__currentPassword": "Mật khẩu hiện tại", + "formFieldLabel__emailAddress": "Địa chỉ email", + "formFieldLabel__emailAddress_username": "Địa chỉ email hoặc tên người dùng", + "formFieldLabel__emailAddresses": "Địa chỉ email", + "formFieldLabel__firstName": "Tên", + "formFieldLabel__lastName": "Họ", + "formFieldLabel__newPassword": "Mật khẩu mới", + "formFieldLabel__organizationDomain": "Miền", + "formFieldLabel__organizationDomainDeletePending": "Xóa lời mời và gợi ý đang chờ", + "formFieldLabel__organizationDomainEmailAddress": "Địa chỉ email xác minh", + "formFieldLabel__organizationDomainEmailAddressDescription": "Nhập một địa chỉ email dưới miền này để nhận mã xác minh và xác minh miền này.", + "formFieldLabel__organizationName": "Tên", + "formFieldLabel__organizationSlug": "Slug", + "formFieldLabel__passkeyName": "Tên của passkey", + "formFieldLabel__password": "Mật khẩu", + "formFieldLabel__phoneNumber": "Số điện thoại", + "formFieldLabel__role": "Vai trò", + "formFieldLabel__signOutOfOtherSessions": "Đăng xuất khỏi tất cả các thiết bị khác", + "formFieldLabel__username": "Tên người dùng", + "impersonationFab": { + "action__signOut": "Đăng xuất", + "title": "Đã đăng nhập với tư cách {{identifier}}" + }, + "locale": "vi-VN", + "maintenanceMode": "Chúng tôi đang tiến hành bảo trì, nhưng đừng lo, nó không nên mất nhiều hơn vài phút.", + "membershipRole__admin": "Quản trị viên", + "membershipRole__basicMember": "Thành viên", + "membershipRole__guestMember": "Khách", + "organizationList": { + "action__createOrganization": "Tạo tổ chức", + "action__invitationAccept": "Tham gia", + "action__suggestionsAccept": "Yêu cầu tham gia", + "createOrganization": "Tạo Tổ chức", + "invitationAcceptedLabel": "Đã tham gia", + "subtitle": "để tiếp tục {{applicationName}}", + "suggestionsAcceptedLabel": "Chờ phê duyệt", + "title": "Chọn một tài khoản", + "titleWithoutPersonal": "Chọn một tổ chức" + }, + "organizationProfile": { + "badge__automaticInvitation": "Mời tự động", + "badge__automaticSuggestion": "Đề xuất tự động", + "badge__manualInvitation": "Không tự động", + "badge__unverified": "Chưa xác minh", + "createDomainPage": { + "subtitle": "Thêm miền để xác minh. Người dùng có địa chỉ email tại miền này có thể tham gia tự động hoặc yêu cầu tham gia tổ chức.", + "title": "Thêm miền" + }, + "invitePage": { + "detailsTitle__inviteFailed": "Không thể gửi lời mời. Đã có lời mời đang chờ xử lý cho các địa chỉ email sau: {{email_addresses}}.", + "formButtonPrimary__continue": "Gửi lời mời", + "selectDropdown__role": "Chọn vai trò", + "subtitle": "Nhập hoặc dán một hoặc nhiều địa chỉ email, cách nhau bằng dấu cách hoặc dấu phẩy.", + "successMessage": "Lời mời đã được gửi thành công", + "title": "Mời thành viên mới" + }, + "membersPage": { + "action__invite": "Mời", + "activeMembersTab": { + "menuAction__remove": "Xóa thành viên", + "tableHeader__actions": "", + "tableHeader__joined": "Đã tham gia", + "tableHeader__role": "Vai trò", + "tableHeader__user": "Người dùng" + }, + "detailsTitle__emptyRow": "Không có thành viên để hiển thị", + "invitationsTab": { + "autoInvitations": { + "headerSubtitle": "Mời người dùng bằng cách kết nối miền email với tổ chức của bạn. Bất kỳ ai đăng ký với miền email phù hợp sẽ có thể tham gia tổ chức bất cứ lúc nào.", + "headerTitle": "Mời tự động", + "primaryButton": "Quản lý miền đã xác minh" + }, + "table__emptyRow": "Không có lời mời để hiển thị" + }, + "invitedMembersTab": { + "menuAction__revoke": "Thu hồi lời mời", + "tableHeader__invited": "Đã mời" + }, + "requestsTab": { + "autoSuggestions": { + "headerSubtitle": "Người dùng đăng ký với miền email phù hợp, sẽ thấy một đề xuất để yêu cầu tham gia tổ chức của bạn.", + "headerTitle": "Đề xuất tự động", + "primaryButton": "Quản lý miền đã xác minh" + }, + "menuAction__approve": "Phê duyệt", + "menuAction__reject": "Từ chối", + "tableHeader__requested": "Yêu cầu truy cập", + "table__emptyRow": "Không có yêu cầu để hiển thị" + }, + "start": { + "headerTitle__invitations": "Lời mời", + "headerTitle__members": "Thành viên", + "headerTitle__requests": "Yêu cầu" + } + }, + "navbar": { + "description": "Quản lý tổ chức của bạn", + "general": "Chung", + "members": "Thành viên", + "title": "Tổ chức" + }, + "profilePage": { + "dangerSection": { + "deleteOrganization": { + "actionDescription": "Nhập \"{{organizationName}}\" bên dưới để tiếp tục.", + "messageLine1": "Bạn có chắc chắn muốn xóa tổ chức này không?", + "messageLine2": "Hành động này là vĩnh viễn và không thể hoàn tác.", + "successMessage": "Bạn đã xóa tổ chức.", + "title": "Xóa tổ chức" + }, + "leaveOrganization": { + "actionDescription": "Nhập \"{{organizationName}}\" bên dưới để tiếp tục.", + "messageLine1": "Bạn có chắc chắn muốn rời khỏi tổ chức này không? Bạn sẽ mất quyền truy cập vào tổ chức và các ứng dụng của nó.", + "messageLine2": "Hành động này là vĩnh viễn và không thể hoàn tác.", + "successMessage": "Bạn đã rời khỏi tổ chức.", + "title": "Rời khỏi tổ chức" + }, + "title": "Nguy hiểm" + }, + "domainSection": { + "menuAction__manage": "Quản lý", + "menuAction__remove": "Xóa", + "menuAction__verify": "Xác minh", + "primaryButton": "Thêm miền", + "subtitle": "Cho phép người dùng tham gia tự động hoặc yêu cầu tham gia dựa trên miền email đã xác minh.", + "title": "Miền đã xác minh" + }, + "successMessage": "Tổ chức đã được cập nhật.", + "title": "Cập nhật hồ sơ" + }, + "removeDomainPage": { + "messageLine1": "Miền email {{domain}} sẽ bị xóa.", + "messageLine2": "Người dùng sẽ không thể tham gia tự động vào tổ chức sau đây.", + "successMessage": "{{domain}} đã được xóa.", + "title": "Xóa miền" + }, + "start": { + "headerTitle__general": "Chung", + "headerTitle__members": "Thành viên", + "profileSection": { + "primaryButton": "Cập nhật hồ sơ", + "title": "Hồ sơ tổ chức", + "uploadAction__title": "Logo" + } + }, + "verifiedDomainPage": { + "dangerTab": { + "calloutInfoLabel": "Việc xóa miền này sẽ ảnh hưởng đến người dùng đã được mời.", + "removeDomainActionLabel__remove": "Xóa miền", + "removeDomainSubtitle": "Xóa miền này khỏi các miền đã xác minh của bạn", + "removeDomainTitle": "Xóa miền" + }, + "enrollmentTab": { + "automaticInvitationOption__description": "Người dùng được mời tự động tham gia tổ chức khi đăng ký và có thể tham gia bất kỳ lúc nào.", + "automaticInvitationOption__label": "Mời tự động", + "automaticSuggestionOption__description": "Người dùng nhận được đề xuất để yêu cầu tham gia, nhưng phải được quản trị viên phê duyệt trước khi họ có thể tham gia tổ chức.", + "automaticSuggestionOption__label": "Đề xuất tự động", + "calloutInfoLabel": "Thay đổi chế độ nhập học chỉ ảnh hưởng đến người dùng mới.", + "calloutInvitationCountLabel": "Lời mời đang chờ xử lý: {{count}}", + "calloutSuggestionCountLabel": "Đề xuất đang chờ xử lý: {{count}}", + "manualInvitationOption__description": "Người dùng chỉ có thể được mời thủ công vào tổ chức.", + "manualInvitationOption__label": "Không tự động", + "subtitle": "Chọn cách người dùng từ miền này có thể tham gia tổ chức." + }, + "start": { + "headerTitle__danger": "Nguy hiểm", + "headerTitle__enrollment": "Tùy chọn nhập học" + }, + "subtitle": "Miền {{domain}} đã được xác minh. Tiếp tục bằng cách chọn chế độ nhập học.", + "title": "Cập nhật {{domain}}" + }, + "verifyDomainPage": { + "formSubtitle": "Nhập mã xác minh được gửi đến địa chỉ email của bạn", + "formTitle": "Mã xác minh", + "resendButton": "Không nhận được mã? Gửi lại", + "subtitle": "Miền {{domainName}} cần được xác minh qua email.", + "subtitleVerificationCodeScreen": "Một mã xác minh đã được gửi đến {{emailAddress}}. Nhập mã để tiếp tục.", + "title": "Xác minh miền" + } + }, + "organizationSwitcher": { + "action__createOrganization": "Tạo tổ chức", + "action__invitationAccept": "Tham gia", + "action__manageOrganization": "Quản lý", + "action__suggestionsAccept": "Yêu cầu tham gia", + "notSelected": "Không có tổ chức nào được chọn", + "personalWorkspace": "Tài khoản cá nhân", + "suggestionsAcceptedLabel": "Chờ phê duyệt" + }, + "paginationButton__next": "Tiếp theo", + "paginationButton__previous": "Trước", + "paginationRowText__displaying": "Hiển thị", + "paginationRowText__of": "của", + "signIn": { + "accountSwitcher": { + "action__addAccount": "Thêm tài khoản", + "action__signOutAll": "Đăng xuất khỏi tất cả các tài khoản", + "subtitle": "Chọn tài khoản mà bạn muốn tiếp tục.", + "title": "Chọn một tài khoản" + }, + "alternativeMethods": { + "actionLink": "Nhận trợ giúp", + "actionText": "Chưa có trong số này?", + "blockButton__backupCode": "Sử dụng mã sao lưu", + "blockButton__emailCode": "Gửi mã qua email đến {{identifier}}", + "blockButton__emailLink": "Gửi liên kết qua email đến {{identifier}}", + "blockButton__passkey": "Đăng nhập bằng passkey của bạn", + "blockButton__password": "Đăng nhập bằng mật khẩu của bạn", + "blockButton__phoneCode": "Gửi mã qua tin nhắn SMS đến {{identifier}}", + "blockButton__totp": "Sử dụng ứng dụng xác thực của bạn", + "getHelp": { + "blockButton__emailSupport": "Hỗ trợ qua email", + "content": "Nếu bạn gặp khó khăn khi đăng nhập vào tài khoản của mình, hãy gửi email cho chúng tôi và chúng tôi sẽ làm việc với bạn để khôi phục truy cập càng sớm càng tốt.", + "title": "Nhận trợ giúp" + }, + "subtitle": "Gặp vấn đề? Bạn có thể sử dụng bất kỳ phương pháp nào sau để đăng nhập.", + "title": "Sử dụng phương pháp khác" + }, + "backupCodeMfa": { + "subtitle": "Mã sao lưu của bạn là mã bạn nhận được khi thiết lập xác thực hai bước.", + "title": "Nhập mã sao lưu" + }, + "emailCode": { + "formTitle": "Mã xác minh", + "resendButton": "Không nhận được mã? Gửi lại", + "subtitle": "để tiếp tục đến {{applicationName}}", + "title": "Kiểm tra email của bạn" + }, + "emailLink": { + "expired": { + "subtitle": "Quay trở lại tab ban đầu để tiếp tục.", + "title": "Liên kết xác minh này đã hết hạn" + }, + "failed": { + "subtitle": "Quay trở lại tab ban đầu để tiếp tục.", + "title": "Liên kết xác minh này không hợp lệ" + }, + "formSubtitle": "Sử dụng liên kết xác minh được gửi đến email của bạn", + "formTitle": "Liên kết xác minh", + "loading": { + "subtitle": "Bạn sẽ được chuyển hướng sớm.", + "title": "Đang đăng nhập..." + }, + "resendButton": "Không nhận được liên kết? Gửi lại", + "subtitle": "để tiếp tục đến {{applicationName}}", + "title": "Kiểm tra email của bạn", + "unusedTab": { + "title": "Bạn có thể đóng tab này" + }, + "verified": { + "subtitle": "Bạn sẽ được chuyển hướng sớm.", + "title": "Đăng nhập thành công" + }, + "verifiedSwitchTab": { + "subtitle": "Quay trở lại tab ban đầu để tiếp tục", + "subtitleNewTab": "Quay lại tab mới mở để tiếp tục", + "titleNewTab": "Đã đăng nhập trên tab khác" + } + }, + "forgotPassword": { + "formTitle": "Mã đặt lại mật khẩu", + "resendButton": "Không nhận được mã? Gửi lại", + "subtitle": "để đặt lại mật khẩu của bạn", + "subtitle_email": "Đầu tiên, nhập mã được gửi đến địa chỉ email của bạn", + "subtitle_phone": "Đầu tiên, nhập mã được gửi đến điện thoại của bạn", + "title": "Đặt lại mật khẩu" + }, + "forgotPasswordAlternativeMethods": { + "blockButton__resetPassword": "Đặt lại mật khẩu của bạn", + "label__alternativeMethods": "Hoặc, đăng nhập bằng phương pháp khác", + "title": "Quên mật khẩu?" + }, + "noAvailableMethods": { + "message": "Không thể tiếp tục đăng nhập. Không có yếu tố xác thực nào khả dụng.", + "subtitle": "Đã xảy ra lỗi", + "title": "Không thể đăng nhập" + }, + "passkey": { + "subtitle": "Sử dụng passkey của bạn xác nhận đó là bạn. Thiết bị của bạn có thể yêu cầu vân tay, khuôn mặt hoặc khóa màn hình của bạn.", + "title": "Sử dụng passkey của bạn" + }, + "password": { + "actionLink": "Sử dụng phương pháp khác", + "subtitle": "Nhập mật khẩu liên kết với tài khoản của bạn", + "title": "Nhập mật khẩu của bạn" + }, + "passwordPwned": { + "title": "Mật khẩu đã bị đánh cắp" + }, + "phoneCode": { + "formTitle": "Mã xác minh", + "resendButton": "Không nhận được mã? Gửi lại", + "subtitle": "để tiếp tục đến {{applicationName}}", + "title": "Kiểm tra điện thoại của bạn" + }, + "phoneCodeMfa": { + "formTitle": "Mã xác minh", + "resendButton": "Không nhận được mã? Gửi lại", + "subtitle": "Để tiếp tục, vui lòng nhập mã xác minh được gửi đến điện thoại của bạn", + "title": "Kiểm tra điện thoại của bạn" + }, + "resetPassword": { + "formButtonPrimary": "Đặt lại mật khẩu", + "requiredMessage": "Vì lý do bảo mật, cần phải đặt lại mật khẩu của bạn.", + "successMessage": "Mật khẩu của bạn đã được thay đổi thành công. Đang đăng nhập, vui lòng đợi một chút.", + "title": "Thiết lập mật khẩu mới" + }, + "resetPasswordMfa": { + "detailsLabel": "Chúng tôi cần xác minh danh tính của bạn trước khi đặt lại mật khẩu của bạn." + }, + "start": { + "actionLink": "Đăng ký", + "actionLink__use_email": "Sử dụng email", + "actionLink__use_email_username": "Sử dụng email hoặc tên người dùng", + "actionLink__use_passkey": "Sử dụng passkey thay thế", + "actionLink__use_phone": "Sử dụng điện thoại", + "actionLink__use_username": "Sử dụng tên người dùng", + "actionText": "Chưa có tài khoản?", + "subtitle": "Chào mừng trở lại! Vui lòng đăng nhập để tiếp tục", + "title": "Đăng nhập vào {{applicationName}}" + }, + "totpMfa": { + "formTitle": "Mã xác minh", + "subtitle": "Để tiếp tục, vui lòng nhập mã xác minh được tạo bởi ứng dụng xác thực của bạn", + "title": "Xác thực hai bước" + } + }, + "signInEnterPasswordTitle": "Nhập mật khẩu của bạn", + "signUp": { + "continue": { + "actionLink": "Đăng nhập", + "actionText": "Đã có tài khoản?", + "subtitle": "Vui lòng điền thông tin còn thiếu để tiếp tục.", + "title": "Điền vào các trường còn thiếu" + }, + "emailCode": { + "formSubtitle": "Nhập mã xác minh được gửi đến địa chỉ email của bạn", + "formTitle": "Mã xác minh", + "resendButton": "Không nhận được mã? Gửi lại", + "subtitle": "Nhập mã xác minh được gửi đến email của bạn", + "title": "Xác minh email của bạn" + }, + "emailLink": { + "formSubtitle": "Sử dụng liên kết xác minh được gửi đến địa chỉ email của bạn", + "formTitle": "Liên kết xác minh", + "loading": { + "title": "Đang đăng ký..." + }, + "resendButton": "Không nhận được liên kết? Gửi lại", + "subtitle": "để tiếp tục đến {{applicationName}}", + "title": "Xác minh email của bạn", + "verified": { + "title": "Đăng ký thành công" + }, + "verifiedSwitchTab": { + "subtitle": "Quay lại tab mới mở để tiếp tục", + "subtitleNewTab": "Quay lại tab trước để tiếp tục", + "title": "Đã xác minh email thành công" + } + }, + "phoneCode": { + "formSubtitle": "Nhập mã xác minh được gửi đến số điện thoại của bạn", + "formTitle": "Mã xác minh", + "resendButton": "Không nhận được mã? Gửi lại", + "subtitle": "Nhập mã xác minh được gửi đến số điện thoại của bạn", + "title": "Xác minh số điện thoại của bạn" + }, + "start": { + "actionLink": "Đăng nhập", + "actionText": "Đã có tài khoản?", + "subtitle": "Chào mừng! Vui lòng điền thông tin để bắt đầu.", + "title": "Tạo tài khoản của bạn" + } + }, + "socialButtonsBlockButton": "Tiếp tục với {{provider|titleize}}", + "unstable__errors": { + "captcha_invalid": "Đăng ký không thành công do việc xác thực bảo mật không thành công. Vui lòng làm mới trang để thử lại hoặc liên hệ với bộ phận hỗ trợ để được hỗ trợ thêm.", + "captcha_unavailable": "Đăng ký không thành công do việc xác thực bot không thành công. Vui lòng làm mới trang để thử lại hoặc liên hệ với bộ phận hỗ trợ để được hỗ trợ thêm.", + "form_code_incorrect": "", + "form_identifier_exists": "", + "form_identifier_exists__email_address": "Địa chỉ email này đã được sử dụng. Vui lòng thử lại.", + "form_identifier_exists__phone_number": "Số điện thoại này đã được sử dụng. Vui lòng thử lại.", + "form_identifier_exists__username": "Tên người dùng này đã được sử dụng. Vui lòng thử lại.", + "form_identifier_not_found": "", + "form_param_format_invalid": "", + "form_param_format_invalid__email_address": "Địa chỉ email phải là một địa chỉ email hợp lệ.", + "form_param_format_invalid__phone_number": "Số điện thoại phải ở định dạng quốc tế hợp lệ.", + "form_param_max_length_exceeded__first_name": "Tên không được vượt quá 256 ký tự.", + "form_param_max_length_exceeded__last_name": "Họ không được vượt quá 256 ký tự.", + "form_param_max_length_exceeded__name": "Tên không được vượt quá 256 ký tự.", + "form_param_nil": "", + "form_password_incorrect": "", + "form_password_length_too_short": "", + "form_password_not_strong_enough": "Mật khẩu của bạn không đủ mạnh.", + "form_password_pwned": "Mật khẩu này đã được tìm thấy trong một vụ vi phạm và không thể sử dụng, vui lòng thử mật khẩu khác.", + "form_password_pwned__sign_in": "Mật khẩu này đã được tìm thấy trong một vụ vi phạm và không thể sử dụng, vui lòng đặt lại mật khẩu của bạn.", + "form_password_size_in_bytes_exceeded": "Mật khẩu của bạn đã vượt quá số lượng byte tối đa cho phép, vui lòng rút ngắn hoặc loại bỏ một số ký tự đặc biệt.", + "form_password_validation_failed": "Mật khẩu không chính xác", + "form_username_invalid_character": "", + "form_username_invalid_length": "", + "identification_deletion_failed": "Bạn không thể xóa thông tin nhận dạng cuối cùng của mình.", + "not_allowed_access": "", + "passkey_already_exists": "Một passkey đã được đăng ký với thiết bị này.", + "passkey_not_supported": "Passkeys không được hỗ trợ trên thiết bị này.", + "passkey_pa_not_supported": "Đăng ký yêu cầu một bộ xác thực nền tảng nhưng thiết bị không hỗ trợ.", + "passkey_registration_cancelled": "Đăng ký passkey đã bị hủy bỏ hoặc hết thời gian.", + "passkey_retrieval_cancelled": "Xác minh passkey đã bị hủy bỏ hoặc hết thời gian.", + "passwordComplexity": { + "maximumLength": "ít hơn {{length}} ký tự", + "minimumLength": "{{length}} hoặc nhiều hơn ký tự", + "requireLowercase": "một chữ thường", + "requireNumbers": "một số", + "requireSpecialCharacter": "một ký tự đặc biệt", + "requireUppercase": "một chữ hoa", + "sentencePrefix": "Mật khẩu của bạn phải chứa" + }, + "phone_number_exists": "Số điện thoại này đã được sử dụng. Vui lòng thử lại.", + "zxcvbn": { + "couldBeStronger": "Mật khẩu của bạn hoạt động, nhưng có thể mạnh hơn. Hãy thêm nhiều ký tự hơn.", + "goodPassword": "Mật khẩu của bạn đáp ứng tất cả các yêu cầu cần thiết.", + "notEnough": "Mật khẩu của bạn không đủ mạnh.", + "suggestions": { + "allUppercase": "Viết hoa một số chữ, nhưng không phải tất cả.", + "anotherWord": "Thêm nhiều từ ít phổ biến hơn.", + "associatedYears": "Tránh các năm mà bạn liên kết với mình.", + "capitalization": "Viết hoa nhiều hơn chỉ chữ đầu tiên.", + "dates": "Tránh các ngày và năm mà bạn liên kết với mình.", + "l33t": "Tránh việc thay thế chữ dễ đoán như '@' cho 'a'.", + "longerKeyboardPattern": "Sử dụng các mẫu bàn phím dài hơn và thay đổi hướng gõ nhiều lần.", + "noNeed": "Bạn có thể tạo mật khẩu mạnh mà không cần sử dụng ký tự đặc biệt, số hoặc chữ hoa.", + "pwned": "Nếu bạn sử dụng mật khẩu này ở nơi khác, bạn nên thay đổi nó.", + "recentYears": "Tránh các năm gần đây.", + "repeated": "Tránh các từ và ký tự lặp lại.", + "reverseWords": "Tránh việc đảo ngược chính tả của các từ thông thường.", + "sequences": "Tránh các chuỗi ký tự phổ biến.", + "useWords": "Sử dụng nhiều từ, nhưng tránh các cụm từ phổ biến." + }, + "warnings": { + "common": "Đây là một mật khẩu phổ biến.", + "commonNames": "Tên và họ phổ biến dễ đoán.", + "dates": "Ngày tháng dễ đoán.", + "extendedRepeat": "Mẫu ký tự lặp lại như \"abcabcabc\" dễ đoán.", + "keyPattern": "Mẫu bàn phím ngắn dễ đoán.", + "namesByThemselves": "Tên đơn hoặc họ dễ đoán.", + "pwned": "Mật khẩu của bạn đã bị tiết lộ trong một vụ vi phạm trên Internet.", + "recentYears": "Các năm gần đây dễ đoán.", + "sequences": "Các chuỗi ký tự phổ biến như \"abc\" dễ đoán.", + "similarToCommon": "Đây giống với một mật khẩu phổ biến.", + "simpleRepeat": "Các ký tự lặp lại như \"aaa\" dễ đoán.", + "straightRow": "Các hàng ký tự thẳng trên bàn phím dễ đoán.", + "topHundred": "Đây là một mật khẩu được sử dụng thường xuyên.", + "topTen": "Đây là một mật khẩu được sử dụng nhiều.", + "userInputs": "Không nên có bất kỳ dữ liệu cá nhân hoặc liên quan đến trang nào.", + "wordByItself": "Các từ đơn dễ đoán." + } + } + }, + "userButton": { + "action__addAccount": "Thêm tài khoản", + "action__manageAccount": "Quản lý tài khoản", + "action__signOut": "Đăng xuất", + "action__signOutAll": "Đăng xuất khỏi tất cả các tài khoản" + }, + "userProfile": { + "backupCodePage": { + "actionLabel__copied": "Đã sao chép!", + "actionLabel__copy": "Sao chép tất cả", + "actionLabel__download": "Tải xuống .txt", + "actionLabel__print": "In", + "infoText1": "Mã sao lưu sẽ được kích hoạt cho tài khoản này.", + "infoText2": "Giữ bí mật mã sao lưu và lưu trữ chúng một cách an toàn. Bạn có thể tạo lại mã sao lưu nếu nghi ngờ rằng chúng đã bị xâm phạm.", + "subtitle__codelist": "Lưu trữ chúng một cách an toàn và giữ chúng bí mật.", + "successMessage": "Mã sao lưu đã được kích hoạt. Bạn có thể sử dụng một trong số chúng để đăng nhập vào tài khoản của mình, nếu bạn mất quyền truy cập vào thiết bị xác thực của mình. Mỗi mã chỉ có thể sử dụng một lần.", + "successSubtitle": "Bạn có thể sử dụng một trong số chúng để đăng nhập vào tài khoản của mình, nếu bạn mất quyền truy cập vào thiết bị xác thực của mình.", + "title": "Thêm xác minh mã sao lưu", + "title__codelist": "Mã sao lưu" + }, + "connectedAccountPage": { + "formHint": "Chọn một nhà cung cấp để kết nối tài khoản của bạn.", + "formHint__noAccounts": "Không có nhà cung cấp tài khoản bên ngoài nào có sẵn.", + "removeResource": { + "messageLine1": "{{identifier}} sẽ bị xóa khỏi tài khoản này.", + "messageLine2": "Bạn sẽ không còn có khả năng sử dụng tài khoản kết nối này và bất kỳ tính năng phụ thuộc nào cũng sẽ không hoạt động nữa.", + "successMessage": "{{connectedAccount}} đã bị xóa khỏi tài khoản của bạn.", + "title": "Xóa tài khoản kết nối" + }, + "socialButtonsBlockButton": "{{provider|titleize}}", + "successMessage": "Nhà cung cấp đã được thêm vào tài khoản của bạn", + "title": "Thêm tài khoản kết nối" + }, + "deletePage": { + "actionDescription": "Nhập \"Xóa tài khoản\" bên dưới để tiếp tục.", + "confirm": "Xóa tài khoản", + "messageLine1": "Bạn có chắc chắn muốn xóa tài khoản của mình không?", + "messageLine2": "Hành động này là vĩnh viễn và không thể đảo ngược.", + "title": "Xóa tài khoản" + }, + "emailAddressPage": { + "emailCode": { + "formHint": "Một email chứa mã xác minh sẽ được gửi đến địa chỉ email này.", + "formSubtitle": "Nhập mã xác minh được gửi đến {{identifier}}", + "formTitle": "Mã xác minh", + "resendButton": "Không nhận được mã? Gửi lại", + "successMessage": "Email {{identifier}} đã được thêm vào tài khoản của bạn." + }, + "emailLink": { + "formHint": "Một email chứa liên kết xác minh sẽ được gửi đến địa chỉ email này.", + "formSubtitle": "Nhấp vào liên kết xác minh trong email được gửi đến {{identifier}}", + "formTitle": "Liên kết xác minh", + "resendButton": "Không nhận được liên kết? Gửi lại", + "successMessage": "Email {{identifier}} đã được thêm vào tài khoản của bạn." + }, + "removeResource": { + "messageLine1": "{{identifier}} sẽ bị xóa khỏi tài khoản này.", + "messageLine2": "Bạn sẽ không còn có khả năng đăng nhập bằng địa chỉ email này nữa.", + "successMessage": "{{emailAddress}} đã bị xóa khỏi tài khoản của bạn.", + "title": "Xóa địa chỉ email" + }, + "title": "Thêm địa chỉ email", + "verifyTitle": "Xác minh địa chỉ email" + }, + "formButtonPrimary__add": "Thêm", + "formButtonPrimary__continue": "Tiếp tục", + "formButtonPrimary__finish": "Hoàn tất", + "formButtonPrimary__remove": "Xóa", + "formButtonPrimary__save": "Lưu", + "formButtonReset": "Hủy", + "mfaPage": { + "formHint": "Chọn một phương pháp để thêm.", + "title": "Thêm xác minh hai bước" + }, + "mfaPhoneCodePage": { + "backButton": "Sử dụng số hiện có", + "primaryButton__addPhoneNumber": "Thêm số điện thoại", + "removeResource": { + "messageLine1": "{{identifier}} sẽ không còn nhận được mã xác minh khi đăng nhập nữa.", + "messageLine2": "Tài khoản của bạn có thể không an toàn. Bạn có chắc chắn muốn tiếp tục không?", + "successMessage": "Xác minh hai bước qua mã SMS đã bị xóa cho {{mfaPhoneCode}}", + "title": "Xóa xác minh hai bước" + }, + "subtitle__availablePhoneNumbers": "Chọn một số điện thoại hiện có để đăng ký xác minh hai bước qua mã SMS hoặc thêm một số mới.", + "subtitle__unavailablePhoneNumbers": "Không có số điện thoại nào có sẵn để đăng ký xác minh hai bước qua mã SMS, vui lòng thêm một số mới.", + "successMessage1": "Khi đăng nhập, bạn sẽ cần nhập mã xác minh được gửi đến số điện thoại này như một bước bổ sung.", + "successMessage2": "Lưu các mã sao lưu này và lưu trữ chúng một cách an toàn. Nếu bạn mất quyền truy cập vào thiết bị xác thực của mình, bạn có thể sử dụng mã sao lưu để đăng nhập.", + "successTitle": "Xác minh qua mã SMS đã được kích hoạt", + "title": "Thêm xác minh qua mã SMS" + }, + "mfaTOTPPage": { + "authenticatorApp": { + "buttonAbleToScan__nonPrimary": "Quét mã QR thay vì", + "buttonUnableToScan__nonPrimary": "Không thể quét mã QR?", + "infoText__ableToScan": "Thiết lập một phương pháp đăng nhập mới trong ứng dụng xác thực của bạn và quét mã QR sau để liên kết nó với tài khoản của bạn.", + "infoText__unableToScan": "Thiết lập một phương pháp đăng nhập mới trong ứng dụng xác thực của bạn và nhập Khóa được cung cấp dưới đây.", + "inputLabel__unableToScan1": "Đảm bảo rằng Mật khẩu dựa trên thời gian hoặc Mật khẩu một lần đã được kích hoạt, sau đó hoàn tất việc liên kết tài khoản của bạn.", + "inputLabel__unableToScan2": "Hoặc nếu ứng dụng xác thực của bạn hỗ trợ URI TOTP, bạn cũng có thể sao chép toàn bộ URI." + }, + "removeResource": { + "messageLine1": "Mã xác minh từ ứng dụng xác thực này sẽ không còn được yêu cầu khi đăng nhập nữa.", + "messageLine2": "Tài khoản của bạn có thể không an toàn. Bạn có chắc chắn muốn tiếp tục không?", + "successMessage": "Xác minh hai bước qua ứng dụng xác thực đã bị xóa.", + "title": "Xóa xác minh hai bước" + }, + "successMessage": "Xác minh hai bước hiện đã được kích hoạt. Khi đăng nhập, bạn sẽ cần nhập mã xác minh từ ứng dụng xác thực này như một bước bổ sung.", + "title": "Thêm ứng dụng xác thực", + "verifySubtitle": "Nhập mã xác minh được tạo bởi ứng dụng xác thực của bạn", + "verifyTitle": "Mã xác minh" + }, + "mobileButton__menu": "Menu", + "navbar": { + "account": "Hồ sơ", + "description": "Quản lý thông tin tài khoản của bạn.", + "security": "Bảo mật", + "title": "Tài khoản" + }, + "passkeyScreen": { + "removeResource": { + "messageLine1": "{{name}} sẽ được xóa khỏi tài khoản này.", + "title": "Xóa passkey" + }, + "subtitle__rename": "Bạn có thể đổi tên passkey để dễ dàng tìm kiếm.", + "title__rename": "Đổi tên Passkey" + }, + "passwordPage": { + "checkboxInfoText__signOutOfOtherSessions": "Đề nghị đăng xuất khỏi tất cả các thiết bị khác có thể đã sử dụng mật khẩu cũ của bạn.", + "readonly": "Mật khẩu của bạn hiện không thể chỉnh sửa vì bạn chỉ có thể đăng nhập qua kết nối doanh nghiệp.", + "successMessage__set": "Mật khẩu của bạn đã được thiết lập.", + "successMessage__signOutOfOtherSessions": "Tất cả các thiết bị khác đã được đăng xuất.", + "successMessage__update": "Mật khẩu của bạn đã được cập nhật.", + "title__set": "Thiết lập mật khẩu", + "title__update": "Cập nhật mật khẩu" + }, + "phoneNumberPage": { + "infoText": "Một tin nhắn chứa mã xác minh sẽ được gửi đến số điện thoại này. Có thể áp dụng cước phí tin nhắn và dữ liệu.", + "removeResource": { + "messageLine1": "{{identifier}} sẽ được xóa khỏi tài khoản này.", + "messageLine2": "Bạn sẽ không thể đăng nhập bằng số điện thoại này nữa.", + "successMessage": "{{phoneNumber}} đã được xóa khỏi tài khoản của bạn.", + "title": "Xóa số điện thoại" + }, + "successMessage": "{{identifier}} đã được thêm vào tài khoản của bạn.", + "title": "Thêm số điện thoại", + "verifySubtitle": "Nhập mã xác minh được gửi đến {{identifier}}", + "verifyTitle": "Xác minh số điện thoại" + }, + "profilePage": { + "fileDropAreaHint": "Kích thước khuyến nghị 1:1, tối đa 10MB.", + "imageFormDestructiveActionSubtitle": "Xóa", + "imageFormSubtitle": "Tải lên", + "imageFormTitle": "Ảnh hồ sơ", + "readonly": "Thông tin hồ sơ của bạn đã được cung cấp bởi kết nối doanh nghiệp và không thể chỉnh sửa.", + "successMessage": "Hồ sơ của bạn đã được cập nhật.", + "title": "Cập nhật hồ sơ" + }, + "start": { + "activeDevicesSection": { + "destructiveAction": "Đăng xuất khỏi thiết bị", + "title": "Thiết bị hoạt động" + }, + "connectedAccountsSection": { + "actionLabel__connectionFailed": "Thử lại", + "actionLabel__reauthorize": "Ủy quyền ngay", + "destructiveActionTitle": "Xóa", + "primaryButton": "Kết nối tài khoản", + "subtitle__reauthorize": "Phạm vi yêu cầu đã được cập nhật, và bạn có thể gặp hạn chế về chức năng. Vui lòng ủy quyền lại ứng dụng này để tránh bất kỳ vấn đề nào", + "title": "Tài khoản đã kết nối" + }, + "dangerSection": { + "deleteAccountButton": "Xóa tài khoản", + "title": "Xóa tài khoản" + }, + "emailAddressesSection": { + "destructiveAction": "Xóa email", + "detailsAction__nonPrimary": "Đặt làm chính", + "detailsAction__primary": "Hoàn tất xác minh", + "detailsAction__unverified": "Xác minh", + "primaryButton": "Thêm địa chỉ email", + "title": "Địa chỉ email" + }, + "enterpriseAccountsSection": { + "title": "Tài khoản doanh nghiệp" + }, + "headerTitle__account": "Chi tiết hồ sơ", + "headerTitle__security": "Bảo mật", + "mfaSection": { + "backupCodes": { + "actionLabel__regenerate": "Tạo lại", + "headerTitle": "Mã dự phòng", + "subtitle__regenerate": "Nhận một bộ mã dự phòng an toàn mới. Các mã dự phòng trước sẽ bị xóa và không thể sử dụng.", + "title__regenerate": "Tạo lại mã dự phòng" + }, + "phoneCode": { + "actionLabel__setDefault": "Đặt làm mặc định", + "destructiveActionLabel": "Xóa" + }, + "primaryButton": "Thêm xác minh hai bước", + "title": "Xác minh hai bước", + "totp": { + "destructiveActionTitle": "Xóa", + "headerTitle": "Ứng dụng xác thực" + } + }, + "passkeysSection": { + "menuAction__destructive": "Xóa", + "menuAction__rename": "Đổi tên", + "title": "Passkeys" + }, + "passwordSection": { + "primaryButton__setPassword": "Đặt mật khẩu", + "primaryButton__updatePassword": "Cập nhật mật khẩu", + "title": "Mật khẩu" + }, + "phoneNumbersSection": { + "destructiveAction": "Xóa số điện thoại", + "detailsAction__nonPrimary": "Đặt làm chính", + "detailsAction__primary": "Hoàn tất xác minh", + "detailsAction__unverified": "Xác minh số điện thoại", + "primaryButton": "Thêm số điện thoại", + "title": "Số điện thoại" + }, + "profileSection": { + "primaryButton": "Cập nhật hồ sơ", + "title": "Hồ sơ" + }, + "usernameSection": { + "primaryButton__setUsername": "Đặt tên người dùng", + "primaryButton__updateUsername": "Cập nhật tên người dùng", + "title": "Tên người dùng" + }, + "web3WalletsSection": { + "destructiveAction": "Xóa ví", + "primaryButton": "Ví Web3", + "title": "Ví Web3" + } + }, + "usernamePage": { + "successMessage": "Tên người dùng của bạn đã được cập nhật.", + "title__set": "Thiết lập tên người dùng", + "title__update": "Cập nhật tên người dùng" + }, + "web3WalletPage": { + "removeResource": { + "messageLine1": "{{identifier}} sẽ được xóa khỏi tài khoản này.", + "messageLine2": "Bạn sẽ không thể đăng nhập bằng ví web3 này nữa.", + "successMessage": "{{web3Wallet}} đã được xóa khỏi tài khoản của bạn.", + "title": "Xóa ví web3" + }, + "subtitle__availableWallets": "Chọn một ví web3 để kết nối với tài khoản của bạn.", + "subtitle__unavailableWallets": "Không có ví web3 nào khả dụng.", + "successMessage": "Ví đã được thêm vào tài khoản của bạn.", + "title": "Thêm ví web3" + } + } +} diff --git a/locales/vi-VN/common.json b/locales/vi-VN/common.json index ef71b10368203..f2cf25710d926 100644 --- a/locales/vi-VN/common.json +++ b/locales/vi-VN/common.json @@ -160,6 +160,7 @@ "newVersion": "Có phiên bản mới: {{version}}" }, "userPanel": { + "anonymousNickName": "Người dùng ẩn danh", "billing": "Quản lý hóa đơn", "defaultNickname": "Người dùng phiên bản cộng đồng", "discord": "Hỗ trợ cộng đồng", diff --git a/locales/vi-VN/error.json b/locales/vi-VN/error.json index 41ee14189ac2c..042ddd7b5ff5a 100644 --- a/locales/vi-VN/error.json +++ b/locales/vi-VN/error.json @@ -1,4 +1,11 @@ { + "clerkAuth": { + "loginSuccess": { + "action": "Tiếp tục cuộc trò chuyện", + "desc": "{{greeting}}, rất vui được tiếp tục phục vụ bạn. Hãy tiếp tục cuộc trò chuyện chúng ta vừa mới bắt đầu nhé", + "title": "Chào mừng trở lại, {{nickName}}" + } + }, "error": { "backHome": "Quay về Trang chủ", "desc": "Hãy thử lại sau, hoặc quay về thế giới đã biết", @@ -54,6 +61,7 @@ "InvalidAnthropicAPIKey": "Khóa API Anthropic không hợp lệ hoặc trống, vui lòng kiểm tra lại và thử lại", "InvalidAzureAPIKey": "Khóa API Azure không chính xác hoặc trống, vui lòng kiểm tra lại Khóa API Azure và thử lại", "InvalidBedrockCredentials": "Xác thực Bedrock không thành công, vui lòng kiểm tra AccessKeyId/SecretAccessKey và thử lại", + "InvalidClerkUser": "Xin lỗi, bạn chưa đăng nhập. Vui lòng đăng nhập hoặc đăng ký tài khoản trước khi tiếp tục.", "InvalidGoogleAPIKey": "Khóa API Google không chính xác hoặc trống, vui lòng kiểm tra lại Khóa API Google và thử lại", "InvalidGroqAPIKey": "Khóa API Groq không hợp lệ hoặc trống, vui lòng kiểm tra lại Khóa API Groq và thử lại", "InvalidMinimaxAPIKey": "Khóa API Minimax không hợp lệ hoặc trống, vui lòng kiểm tra lại Khóa API Minimax và thử lại", diff --git a/locales/zh-CN/auth.json b/locales/zh-CN/auth.json new file mode 100644 index 0000000000000..0b4018154a78b --- /dev/null +++ b/locales/zh-CN/auth.json @@ -0,0 +1,6 @@ +{ + "login": "登录", + "loginOrSignup": "登录 / 注册", + "signout": "退出登录", + "signup": "注册" +} diff --git a/locales/zh-CN/clerk.json b/locales/zh-CN/clerk.json new file mode 100644 index 0000000000000..ec5038d944784 --- /dev/null +++ b/locales/zh-CN/clerk.json @@ -0,0 +1,769 @@ +{ + "backButton": "返回", + "badge__default": "默认", + "badge__otherImpersonatorDevice": "其他模拟器设备", + "badge__primary": "主要", + "badge__requiresAction": "需要采取行动", + "badge__thisDevice": "此设备", + "badge__unverified": "未验证", + "badge__userDevice": "用户设备", + "badge__you": "您", + "createOrganization": { + "formButtonSubmit": "创建组织", + "invitePage": { + "formButtonReset": "跳过" + }, + "title": "创建组织" + }, + "dates": { + "lastDay": "昨天 {{ date | timeString('zh-CN') }}", + "next6Days": "{{ date | weekday('zh-CN','long') }} {{ date | timeString('zh-CN') }}", + "nextDay": "明天 {{ date | timeString('zh-CN') }}", + "numeric": "{{ date | numeric('zh-CN') }}", + "previous6Days": "上周{{ date | weekday('zh-CN','long') }} {{ date | timeString('zh-CN') }}", + "sameDay": "今天 {{ date | timeString('zh-CN') }}" + }, + "dividerText": "或者", + "footerActionLink__useAnotherMethod": "使用另一种方法", + "footerPageLink__help": "帮助", + "footerPageLink__privacy": "隐私", + "footerPageLink__terms": "条款", + "formButtonPrimary": "继续", + "formButtonPrimary__verify": "验证", + "formFieldAction__forgotPassword": "忘记密码?", + "formFieldError__matchingPasswords": "密码匹配。", + "formFieldError__notMatchingPasswords": "密码不匹配。", + "formFieldError__verificationLinkExpired": "验证链接已过期。请申请新的链接。", + "formFieldHintText__optional": "选填", + "formFieldHintText__slug": "Slug 是一个人类可读的 ID,它必须是唯一的。它通常用于 URL 中。", + "formFieldInputPlaceholder__backupCode": "", + "formFieldInputPlaceholder__confirmDeletionUserAccount": "删除帐户", + "formFieldInputPlaceholder__emailAddress": "", + "formFieldInputPlaceholder__emailAddress_username": "", + "formFieldInputPlaceholder__emailAddresses": "输入或粘贴一个或多个电子邮件地址,用空格或逗号分隔", + "formFieldInputPlaceholder__firstName": "", + "formFieldInputPlaceholder__lastName": "", + "formFieldInputPlaceholder__organizationDomain": "", + "formFieldInputPlaceholder__organizationDomainEmailAddress": "", + "formFieldInputPlaceholder__organizationName": "", + "formFieldInputPlaceholder__organizationSlug": "my-org", + "formFieldInputPlaceholder__password": "", + "formFieldInputPlaceholder__phoneNumber": "", + "formFieldInputPlaceholder__username": "", + "formFieldLabel__automaticInvitations": "为此域名启用自动邀请", + "formFieldLabel__backupCode": "备用代码", + "formFieldLabel__confirmDeletion": "确认", + "formFieldLabel__confirmPassword": "确认密码", + "formFieldLabel__currentPassword": "当前密码", + "formFieldLabel__emailAddress": "电子邮件地址", + "formFieldLabel__emailAddress_username": "电子邮件地址或用户名", + "formFieldLabel__emailAddresses": "电子邮件地址", + "formFieldLabel__firstName": "名字", + "formFieldLabel__lastName": "姓氏", + "formFieldLabel__newPassword": "新密码", + "formFieldLabel__organizationDomain": "域名", + "formFieldLabel__organizationDomainDeletePending": "删除待处理的邀请和建议", + "formFieldLabel__organizationDomainEmailAddress": "验证邮箱地址", + "formFieldLabel__organizationDomainEmailAddressDescription": "输入此域名下的一个邮箱地址以接收验证码并验证此域名。", + "formFieldLabel__organizationName": "组织名称", + "formFieldLabel__organizationSlug": "URL 简称", + "formFieldLabel__passkeyName": "Passkey 名称", + "formFieldLabel__password": "密码", + "formFieldLabel__phoneNumber": "电话号码", + "formFieldLabel__role": "角色", + "formFieldLabel__signOutOfOtherSessions": "登出所有其他设备", + "formFieldLabel__username": "用户名", + "impersonationFab": { + "action__signOut": "退出登录", + "title": "以 {{identifier}} 的身份登录" + }, + "locale": "zh-CN", + "maintenanceMode": "我们目前正在进行维护,但不用担心,不会超过几分钟。", + "membershipRole__admin": "管理员", + "membershipRole__basicMember": "成员", + "membershipRole__guestMember": "访客", + "organizationList": { + "action__createOrganization": "创建组织", + "action__invitationAccept": "加入", + "action__suggestionsAccept": "请求加入", + "createOrganization": "创建组织", + "invitationAcceptedLabel": "已加入", + "subtitle": "以继续使用 {{applicationName}}", + "suggestionsAcceptedLabel": "等待批准", + "title": "选择一个帐户", + "titleWithoutPersonal": "选择一个组织" + }, + "organizationProfile": { + "badge__automaticInvitation": "自动邀请", + "badge__automaticSuggestion": "自动建议", + "badge__manualInvitation": "无自动注册", + "badge__unverified": "未验证", + "createDomainPage": { + "subtitle": "添加域名以进行验证。具有此域名电子邮件地址的用户可以自动加入组织或请求加入。", + "title": "添加域名" + }, + "invitePage": { + "detailsTitle__inviteFailed": "邀请未发送。以下电子邮件地址已有待处理的邀请:{{email_addresses}}。", + "formButtonPrimary__continue": "发送邀请", + "selectDropdown__role": "选择角色", + "subtitle": "输入或粘贴一个或多个电子邮件地址,用空格或逗号分隔。", + "successMessage": "邀请已成功发送", + "title": "邀请新成员" + }, + "membersPage": { + "action__invite": "邀请", + "activeMembersTab": { + "menuAction__remove": "移除成员", + "tableHeader__actions": "", + "tableHeader__joined": "加入时间", + "tableHeader__role": "角色", + "tableHeader__user": "用户" + }, + "detailsTitle__emptyRow": "没有可显示的成员", + "invitationsTab": { + "autoInvitations": { + "headerSubtitle": "通过连接电子邮件域邀请用户加入组织。任何使用匹配电子邮件域注册的用户都可以随时加入组织。", + "headerTitle": "自动邀请", + "primaryButton": "管理已验证域名" + }, + "table__emptyRow": "没有可显示的邀请" + }, + "invitedMembersTab": { + "menuAction__revoke": "撤销邀请", + "tableHeader__invited": "已邀请" + }, + "requestsTab": { + "autoSuggestions": { + "headerSubtitle": "使用匹配电子邮件域注册的用户可以看到请求加入组织的建议。", + "headerTitle": "自动建议", + "primaryButton": "管理已验证的域" + }, + "menuAction__approve": "批准", + "menuAction__reject": "拒绝", + "tableHeader__requested": "请求访问", + "table__emptyRow": "没有请求显示" + }, + "start": { + "headerTitle__invitations": "邀请", + "headerTitle__members": "成员", + "headerTitle__requests": "请求" + } + }, + "navbar": { + "description": "管理您的组织", + "general": "常规", + "members": "成员", + "title": "组织" + }, + "profilePage": { + "dangerSection": { + "deleteOrganization": { + "actionDescription": "在下方输入“{{organizationName}}”以继续。", + "messageLine1": "您确定要删除此组织吗?", + "messageLine2": "此操作是永久且不可逆转的。", + "successMessage": "您已删除组织", + "title": "删除组织" + }, + "leaveOrganization": { + "actionDescription": "在下方输入“{{organizationName}}”以继续。", + "messageLine1": "您确定要离开此组织吗?您将失去对该组织及其应用程序的访问权限。", + "messageLine2": "此操作是永久且不可逆转的。", + "successMessage": "您已离开组织", + "title": "离开组织" + }, + "title": "危险" + }, + "domainSection": { + "menuAction__manage": "管理", + "menuAction__remove": "删除", + "menuAction__verify": "验证", + "primaryButton": "添加域", + "subtitle": "允许用户根据已验证的电子邮件域自动加入组织或请求加入。", + "title": "已验证的域" + }, + "successMessage": "组织已更新", + "title": "更新配置文件" + }, + "removeDomainPage": { + "messageLine1": "电子邮件域 {{domain}} 将被移除。", + "messageLine2": "此后用户将无法自动加入组织。", + "successMessage": "{{domain}} 已移除", + "title": "移除域" + }, + "start": { + "headerTitle__general": "常规", + "headerTitle__members": "成员", + "profileSection": { + "primaryButton": "更新配置文件", + "title": "组织配置文件", + "uploadAction__title": "标识" + } + }, + "verifiedDomainPage": { + "dangerTab": { + "calloutInfoLabel": "移除此域将影响已邀请的用户。", + "removeDomainActionLabel__remove": "移除域", + "removeDomainSubtitle": "从已验证的域中移除此域", + "removeDomainTitle": "移除域" + }, + "enrollmentTab": { + "automaticInvitationOption__description": "用户注册时将自动邀请加入组织,并随时可以加入。", + "automaticInvitationOption__label": "自动邀请", + "automaticSuggestionOption__description": "用户将收到请求加入的建议,但必须由管理员批准后才能加入组织。", + "automaticSuggestionOption__label": "自动建议", + "calloutInfoLabel": "更改注册模式仅影响新用户。", + "calloutInvitationCountLabel": "已发送给用户的待处理邀请:{{count}}", + "calloutSuggestionCountLabel": "已发送给用户的待处理建议:{{count}}", + "manualInvitationOption__description": "用户只能手动邀请加入组织。", + "manualInvitationOption__label": "不自动加入", + "subtitle": "选择来自此域的用户如何加入组织。" + }, + "start": { + "headerTitle__danger": "危险", + "headerTitle__enrollment": "注册选项" + }, + "subtitle": "域 {{domain}} 已验证。继续选择注册模式。", + "title": "更新 {{domain}}" + }, + "verifyDomainPage": { + "formSubtitle": "输入发送到您电子邮件地址的验证代码", + "formTitle": "验证代码", + "resendButton": "没有收到验证码?重新发送", + "subtitle": "需要通过电子邮件验证域 {{domainName}}。", + "subtitleVerificationCodeScreen": "已发送验证码至 {{emailAddress}}。输入验证码以继续。", + "title": "验证域" + } + }, + "organizationSwitcher": { + "action__createOrganization": "创建组织", + "action__invitationAccept": "加入", + "action__manageOrganization": "管理", + "action__suggestionsAccept": "请求加入", + "notSelected": "未选择组织", + "personalWorkspace": "个人账户", + "suggestionsAcceptedLabel": "待批准" + }, + "paginationButton__next": "下一页", + "paginationButton__previous": "上一页", + "paginationRowText__displaying": "显示", + "paginationRowText__of": "共", + "signIn": { + "accountSwitcher": { + "action__addAccount": "添加账户", + "action__signOutAll": "退出所有账户", + "subtitle": "选择要继续使用的账户。", + "title": "选择一个账户" + }, + "alternativeMethods": { + "actionLink": "获取帮助", + "actionText": "没有这些?", + "blockButton__backupCode": "使用备用代码", + "blockButton__emailCode": "将验证码发送至 {{identifier}}", + "blockButton__emailLink": "将链接发送至 {{identifier}}", + "blockButton__passkey": "使用您的密钥登录", + "blockButton__password": "使用密码登录", + "blockButton__phoneCode": "将短信验证码发送至 {{identifier}}", + "blockButton__totp": "使用您的身份验证器应用程序", + "getHelp": { + "blockButton__emailSupport": "邮件支持", + "content": "如果您在登录您的帐户时遇到困难,请给我们发送电子邮件,我们将尽快与您合作恢复访问权限。", + "title": "获取帮助" + }, + "subtitle": "遇到问题?您可以使用以下任一方法登录。", + "title": "使用其他方法" + }, + "backupCodeMfa": { + "subtitle": "您的备用代码是在设置两步验证时获得的。", + "title": "输入备用代码" + }, + "emailCode": { + "formTitle": "验证码", + "resendButton": "没有收到验证码?重新发送", + "subtitle": "继续访问 {{applicationName}}", + "title": "查看您的电子邮件" + }, + "emailLink": { + "expired": { + "subtitle": "返回原始标签继续。", + "title": "此验证链接已过期" + }, + "failed": { + "subtitle": "返回原始标签继续。", + "title": "此验证链接无效" + }, + "formSubtitle": "使用发送到您电子邮件的验证链接", + "formTitle": "验证链接", + "loading": { + "subtitle": "您将很快被重定向", + "title": "登录中..." + }, + "resendButton": "没有收到链接?重新发送", + "subtitle": "继续访问 {{applicationName}}", + "title": "查看您的电子邮件", + "unusedTab": { + "title": "您可以关闭此标签" + }, + "verified": { + "subtitle": "您将很快被重定向", + "title": "成功登录" + }, + "verifiedSwitchTab": { + "subtitle": "返回原始标签继续", + "subtitleNewTab": "返回新打开的标签继续", + "titleNewTab": "在其他标签上登录" + } + }, + "forgotPassword": { + "formTitle": "重置密码代码", + "resendButton": "没有收到验证码?重新发送", + "subtitle": "重置您的密码", + "subtitle_email": "首先,输入发送到您电子邮件地址的代码", + "subtitle_phone": "首先,输入发送到您手机的代码", + "title": "重置密码" + }, + "forgotPasswordAlternativeMethods": { + "blockButton__resetPassword": "重置您的密码", + "label__alternativeMethods": "或者,使用其他方法登录", + "title": "忘记密码?" + }, + "noAvailableMethods": { + "message": "无法继续登录。没有可用的身份验证因素。", + "subtitle": "发生错误", + "title": "无法登录" + }, + "passkey": { + "subtitle": "使用您的密钥确认是您本人。您的设备可能会要求您的指纹、面容或屏幕锁。", + "title": "使用您的密钥" + }, + "password": { + "actionLink": "使用其他方法", + "subtitle": "输入与您的帐户关联的密码", + "title": "输入您的密码" + }, + "passwordPwned": { + "title": "密码已泄露" + }, + "phoneCode": { + "formTitle": "验证码", + "resendButton": "没有收到验证码?重新发送", + "subtitle": "继续访问 {{applicationName}}", + "title": "检查您的手机" + }, + "phoneCodeMfa": { + "formTitle": "验证码", + "resendButton": "没有收到验证码?重新发送", + "subtitle": "请继续,输入发送到您手机的验证码", + "title": "检查您的手机" + }, + "resetPassword": { + "formButtonPrimary": "重置密码", + "requiredMessage": "出于安全原因,需要重置您的密码。", + "successMessage": "您的密码已成功更改。正在登录,请稍候。", + "title": "设置新密码" + }, + "resetPasswordMfa": { + "detailsLabel": "在重置密码之前,我们需要验证您的身份。" + }, + "start": { + "actionLink": "注册", + "actionLink__use_email": "使用电子邮件", + "actionLink__use_email_username": "使用电子邮件或用户名", + "actionLink__use_passkey": "改用密钥", + "actionLink__use_phone": "使用手机", + "actionLink__use_username": "使用用户名", + "actionText": "没有帐户?", + "subtitle": "欢迎回来!请登录以继续", + "title": "登录到 {{applicationName}}" + }, + "totpMfa": { + "formTitle": "验证码", + "subtitle": "请继续,输入您的身份验证器应用程序生成的验证码", + "title": "双重验证" + } + }, + "signInEnterPasswordTitle": "输入您的密码", + "signUp": { + "continue": { + "actionLink": "登录", + "actionText": "已有帐户?", + "subtitle": "请填写剩余的细节以继续。", + "title": "填写缺失的字段" + }, + "emailCode": { + "formSubtitle": "输入发送到您电子邮件地址的验证码", + "formTitle": "验证码", + "resendButton": "没有收到验证码?重新发送", + "subtitle": "输入发送到您电子邮件的验证码", + "title": "验证您的电子邮件" + }, + "emailLink": { + "formSubtitle": "使用发送到您电子邮件地址的验证链接", + "formTitle": "验证链接", + "loading": { + "title": "注册中..." + }, + "resendButton": "没有收到链接?重新发送", + "subtitle": "继续访问 {{applicationName}}", + "title": "验证您的电子邮件", + "verified": { + "title": "成功注册" + }, + "verifiedSwitchTab": { + "subtitle": "返回新打开的标签继续", + "subtitleNewTab": "返回上一个标签继续", + "title": "成功验证电子邮件" + } + }, + "phoneCode": { + "formSubtitle": "输入发送到您电话号码的验证码", + "formTitle": "验证码", + "resendButton": "没有收到验证码?重新发送", + "subtitle": "输入发送到您手机的验证码", + "title": "验证您的手机" + }, + "start": { + "actionLink": "登录", + "actionText": "已有帐户?", + "subtitle": "欢迎!请填写详细信息开始。", + "title": "创建您的帐户" + } + }, + "socialButtonsBlockButton": "继续使用 {{provider|titleize}}", + "unstable__errors": { + "captcha_invalid": "由于安全验证失败,注册失败。请刷新页面重试,或联系支持获取更多帮助。", + "captcha_unavailable": "由于机器人验证失败,注册失败。请刷新页面重试,或联系支持获取更多帮助。", + "form_code_incorrect": "", + "form_identifier_exists": "", + "form_identifier_exists__email_address": "此电子邮件地址已被使用。请尝试另一个。", + "form_identifier_exists__phone_number": "此电话号码已被使用。请尝试另一个。", + "form_identifier_exists__username": "此用户名已被使用。请尝试另一个。", + "form_identifier_not_found": "", + "form_param_format_invalid": "", + "form_param_format_invalid__email_address": "电子邮件地址必须是有效的电子邮件地址。", + "form_param_format_invalid__phone_number": "电话号码必须符合有效的国际格式。", + "form_param_max_length_exceeded__first_name": "名字不应超过256个字符。", + "form_param_max_length_exceeded__last_name": "姓氏不应超过256个字符。", + "form_param_max_length_exceeded__name": "名称不应超过256个字符。", + "form_param_nil": "", + "form_password_incorrect": "", + "form_password_length_too_short": "", + "form_password_not_strong_enough": "您的密码不够强大。", + "form_password_pwned": "此密码已经被发现为泄露的一部分,不能使用,请尝试其他密码。", + "form_password_pwned__sign_in": "此密码已经被发现为泄露的一部分,不能使用,请重置您的密码。", + "form_password_size_in_bytes_exceeded": "您的密码已超过允许的最大字节数,请缩短或删除一些特殊字符。", + "form_password_validation_failed": "密码不正确", + "form_username_invalid_character": "", + "form_username_invalid_length": "", + "identification_deletion_failed": "您不能删除您的最后一个身份验证。", + "not_allowed_access": "", + "passkey_already_exists": "此设备已注册过通行密钥。", + "passkey_not_supported": "此设备不支持通行密钥。", + "passkey_pa_not_supported": "注册需要平台验证器,但设备不支持。", + "passkey_registration_cancelled": "通行密钥注册已取消或超时。", + "passkey_retrieval_cancelled": "通行密钥验证已取消或超时。", + "passwordComplexity": { + "maximumLength": "少于{{length}}个字符", + "minimumLength": "{{length}}个或更多字符", + "requireLowercase": "一个小写字母", + "requireNumbers": "一个数字", + "requireSpecialCharacter": "一个特殊字符", + "requireUppercase": "一个大写字母", + "sentencePrefix": "您的密码必须包含" + }, + "phone_number_exists": "此电话号码已被使用。请尝试另一个。", + "zxcvbn": { + "couldBeStronger": "您的密码可以更强大。尝试添加更多字符。", + "goodPassword": "您的密码符合所有必要要求。", + "notEnough": "您的密码不够强大。", + "suggestions": { + "allUppercase": "将一些字母大写,但不是全部。", + "anotherWord": "添加更少见的单词。", + "associatedYears": "避免与您相关的年份。", + "capitalization": "大写不止第一个字母。", + "dates": "避免与您相关的日期和年份。", + "l33t": "避免可预测的字母替换,如将'@'替换为'a'。", + "longerKeyboardPattern": "使用更长的键盘模式,多次改变输入方向。", + "noNeed": "您可以创建强大的密码,而无需使用符号、数字或大写字母。", + "pwned": "如果您在其他地方使用此密码,应该更改它。", + "recentYears": "避免最近的年份。", + "repeated": "避免重复的单词和字符。", + "reverseWords": "避免常见单词的反向拼写。", + "sequences": "避免常见的字符序列。", + "useWords": "使用多个单词,但避免常见短语。" + }, + "warnings": { + "common": "这是一个常用的密码。", + "commonNames": "常见的名字和姓氏容易被猜到。", + "dates": "日期容易被猜到。", + "extendedRepeat": "重复的字符模式如“abcabcabc”容易被猜到。", + "keyPattern": "简短的键盘模式容易被猜到。", + "namesByThemselves": "单个名字或姓氏容易被猜到。", + "pwned": "您的密码在互联网上的数据泄露中曝光。", + "recentYears": "最近的年份容易被猜到。", + "sequences": "常见的字符序列如“abc”容易被猜到。", + "similarToCommon": "这与常用密码相似。", + "simpleRepeat": "重复的字符如“aaa”容易被猜到。", + "straightRow": "键盘上直线排列的键易被猜到。", + "topHundred": "这是一个常用密码。", + "topTen": "这是一个广泛使用的密码。", + "userInputs": "密码中不应包含任何个人或页面相关数据。", + "wordByItself": "单个单词容易被猜到。" + } + } + }, + "userButton": { + "action__addAccount": "添加账户", + "action__manageAccount": "管理账户", + "action__signOut": "登出", + "action__signOutAll": "从所有账户登出" + }, + "userProfile": { + "backupCodePage": { + "actionLabel__copied": "已复制!", + "actionLabel__copy": "复制全部", + "actionLabel__download": "下载 .txt", + "actionLabel__print": "打印", + "infoText1": "此帐户将启用备份代码。", + "infoText2": "保持备份代码的机密性并安全存储。如果怀疑备份代码已泄露,可以重新生成备份代码。", + "subtitle__codelist": "安全存储并保密备份代码。", + "successMessage": "备份代码现已启用。如果您无法访问您的身份验证设备,可以使用其中之一登录您的帐户。每个代码只能使用一次。", + "successSubtitle": "如果您无法访问您的身份验证设备,您可以使用其中之一登录您的帐户。", + "title": "添加备份代码验证", + "title__codelist": "备份代码" + }, + "connectedAccountPage": { + "formHint": "选择要连接您的帐户的提供商。", + "formHint__noAccounts": "没有可用的外部帐户提供商。", + "removeResource": { + "messageLine1": "{{identifier}} 将从此帐户中删除。", + "messageLine2": "您将无法再使用此连接的帐户,并且任何依赖功能将不再起作用。", + "successMessage": "{{connectedAccount}} 已从您的帐户中删除。", + "title": "删除连接的帐户" + }, + "socialButtonsBlockButton": "{{provider|titleize}}", + "successMessage": "提供商已添加到您的帐户", + "title": "添加连接的帐户" + }, + "deletePage": { + "actionDescription": "在下方输入“删除帐户”以继续。", + "confirm": "删除帐户", + "messageLine1": "您确定要删除您的帐户吗?", + "messageLine2": "此操作是永久且不可逆转的。", + "title": "删除帐户" + }, + "emailAddressPage": { + "emailCode": { + "formHint": "将发送包含验证码的电子邮件至此电子邮件地址。", + "formSubtitle": "输入发送至 {{identifier}} 的验证码。", + "formTitle": "验证码", + "resendButton": "没有收到验证码?重新发送", + "successMessage": "电子邮件 {{identifier}} 已添加到您的帐户。" + }, + "emailLink": { + "formHint": "将发送包含验证链接的电子邮件至此电子邮件地址。", + "formSubtitle": "点击发送至 {{identifier}} 的电子邮件中的验证链接。", + "formTitle": "验证链接", + "resendButton": "没有收到链接?重新发送", + "successMessage": "电子邮件 {{identifier}} 已添加到您的帐户。" + }, + "removeResource": { + "messageLine1": "{{identifier}} 将从此帐户中删除。", + "messageLine2": "您将无法再使用此电子邮件地址登录。", + "successMessage": "{{emailAddress}} 已从您的帐户中删除。", + "title": "删除电子邮件地址" + }, + "title": "添加电子邮件地址", + "verifyTitle": "验证电子邮件地址" + }, + "formButtonPrimary__add": "添加", + "formButtonPrimary__continue": "继续", + "formButtonPrimary__finish": "完成", + "formButtonPrimary__remove": "删除", + "formButtonPrimary__save": "保存", + "formButtonReset": "取消", + "mfaPage": { + "formHint": "选择要添加的方法。", + "title": "添加双重验证" + }, + "mfaPhoneCodePage": { + "backButton": "使用现有号码", + "primaryButton__addPhoneNumber": "添加电话号码", + "removeResource": { + "messageLine1": "{{identifier}} 在登录时将不再接收验证代码。", + "messageLine2": "您的帐户可能不够安全。您确定要继续吗?", + "successMessage": "{{mfaPhoneCode}} 的短信代码双重验证已移除。", + "title": "移除双重验证" + }, + "subtitle__availablePhoneNumbers": "选择现有电话号码注册短信代码双重验证,或添加新号码。", + "subtitle__unavailablePhoneNumbers": "没有可用的电话号码用于注册短信代码双重验证,请添加新号码。", + "successMessage1": "登录时,您需要输入发送至此电话号码的验证代码作为额外步骤。", + "successMessage2": "保存这些备份代码并将其安全存储。如果无法访问您的身份验证设备,可以使用备份代码登录。", + "successTitle": "短信代码验证已启用", + "title": "添加短信代码验证" + }, + "mfaTOTPPage": { + "authenticatorApp": { + "buttonAbleToScan__nonPrimary": "扫描 QR 码", + "buttonUnableToScan__nonPrimary": "无法扫描 QR 码?", + "infoText__ableToScan": "在您的身份验证器应用中设置新的登录方法,并扫描以下 QR 码将其链接到您的帐户。", + "infoText__unableToScan": "在您的身份验证器中设置新的登录方法,并输入下面提供的密钥。", + "inputLabel__unableToScan1": "确保已启用基于时间或一次性密码,然后完成链接您的帐户。", + "inputLabel__unableToScan2": "或者,如果您的身份验证器支持 TOTP URI,您也可以复制完整的 URI。" + }, + "removeResource": { + "messageLine1": "登录时将不再需要此身份验证器的验证代码。", + "messageLine2": "您的帐户可能不够安全。您确定要继续吗?", + "successMessage": "通过身份验证器应用的双重验证已移除。", + "title": "移除双重验证" + }, + "successMessage": "双重验证现已启用。登录时,您将需要输入此身份验证器生成的验证代码作为额外步骤。", + "title": "添加身份验证器应用", + "verifySubtitle": "输入您的身份验证器生成的验证代码", + "verifyTitle": "验证代码" + }, + "mobileButton__menu": "菜单", + "navbar": { + "account": "个人资料", + "description": "管理您的帐户信息。", + "security": "安全", + "title": "帐户" + }, + "passkeyScreen": { + "removeResource": { + "messageLine1": "{{name}} 将从此帐户中删除。", + "title": "删除密码" + }, + "subtitle__rename": "您可以更改密码名称以便更容易找到。", + "title__rename": "重命名密码" + }, + "passwordPage": { + "checkboxInfoText__signOutOfOtherSessions": "建议注销所有可能使用旧密码的其他设备。", + "readonly": "您当前无法编辑密码,因为只能通过企业连接登录。", + "successMessage__set": "您的密码已设置。", + "successMessage__signOutOfOtherSessions": "所有其他设备已注销。", + "successMessage__update": "您的密码已更新。", + "title__set": "设置密码", + "title__update": "更新密码" + }, + "phoneNumberPage": { + "infoText": "将向此电话号码发送包含验证码的短信。可能会收取短信和数据费用。", + "removeResource": { + "messageLine1": "{{identifier}} 将从此帐户中删除。", + "messageLine2": "您将无法再使用此电话号码登录。", + "successMessage": "{{phoneNumber}} 已从您的帐户中删除。", + "title": "删除电话号码" + }, + "successMessage": "{{identifier}} 已添加到您的帐户。", + "title": "添加电话号码", + "verifySubtitle": "输入发送至 {{identifier}} 的验证码", + "verifyTitle": "验证电话号码" + }, + "profilePage": { + "fileDropAreaHint": "推荐尺寸 1:1,最多 10MB。", + "imageFormDestructiveActionSubtitle": "移除", + "imageFormSubtitle": "上传", + "imageFormTitle": "个人资料图片", + "readonly": "您的个人资料信息由企业连接提供,无法编辑。", + "successMessage": "您的个人资料已更新。", + "title": "更新个人资料" + }, + "start": { + "activeDevicesSection": { + "destructiveAction": "注销设备", + "title": "活动设备" + }, + "connectedAccountsSection": { + "actionLabel__connectionFailed": "重试", + "actionLabel__reauthorize": "立即授权", + "destructiveActionTitle": "删除", + "primaryButton": "连接帐户", + "subtitle__reauthorize": "所需的范围已更新,您可能体验到功能受限。请重新授权此应用以避免任何问题。", + "title": "连接的帐户" + }, + "dangerSection": { + "deleteAccountButton": "删除帐户", + "title": "删除帐户" + }, + "emailAddressesSection": { + "destructiveAction": "删除电子邮件", + "detailsAction__nonPrimary": "设为主要", + "detailsAction__primary": "完成验证", + "detailsAction__unverified": "验证", + "primaryButton": "添加电子邮件地址", + "title": "电子邮件地址" + }, + "enterpriseAccountsSection": { + "title": "企业帐户" + }, + "headerTitle__account": "个人资料详情", + "headerTitle__security": "安全", + "mfaSection": { + "backupCodes": { + "actionLabel__regenerate": "重新生成", + "headerTitle": "备份代码", + "subtitle__regenerate": "获取一组新的安全备份代码。之前的备份代码将被删除且无法使用。", + "title__regenerate": "重新生成备份代码" + }, + "phoneCode": { + "actionLabel__setDefault": "设为默认", + "destructiveActionLabel": "删除" + }, + "primaryButton": "添加双重验证", + "title": "双重验证", + "totp": { + "destructiveActionTitle": "删除", + "headerTitle": "身份验证器应用" + } + }, + "passkeysSection": { + "menuAction__destructive": "删除", + "menuAction__rename": "重命名", + "title": "密码" + }, + "passwordSection": { + "primaryButton__setPassword": "设置密码", + "primaryButton__updatePassword": "更新密码", + "title": "密码" + }, + "phoneNumbersSection": { + "destructiveAction": "删除电话号码", + "detailsAction__nonPrimary": "设为主要", + "detailsAction__primary": "完成验证", + "detailsAction__unverified": "验证电话号码", + "primaryButton": "添加电话号码", + "title": "电话号码" + }, + "profileSection": { + "primaryButton": "更新个人资料", + "title": "个人资料" + }, + "usernameSection": { + "primaryButton__setUsername": "设置用户名", + "primaryButton__updateUsername": "更新用户名", + "title": "用户名" + }, + "web3WalletsSection": { + "destructiveAction": "删除钱包", + "primaryButton": "Web3 钱包", + "title": "Web3 钱包" + } + }, + "usernamePage": { + "successMessage": "您的用户名已更新。", + "title__set": "设置用户名", + "title__update": "更新用户名" + }, + "web3WalletPage": { + "removeResource": { + "messageLine1": "{{identifier}} 将从此帐户中删除。", + "messageLine2": "您将无法再使用此 Web3 钱包登录。", + "successMessage": "{{web3Wallet}} 已从您的帐户中删除。", + "title": "删除 Web3 钱包" + }, + "subtitle__availableWallets": "选择要连接到您的帐户的 Web3 钱包。", + "subtitle__unavailableWallets": "没有可用的 Web3 钱包。", + "successMessage": "钱包已添加到您的帐户。", + "title": "添加 Web3 钱包" + } + } +} diff --git a/locales/zh-CN/common.json b/locales/zh-CN/common.json index 8f57211622645..c6295bffb8bc1 100644 --- a/locales/zh-CN/common.json +++ b/locales/zh-CN/common.json @@ -160,6 +160,7 @@ "newVersion": "有新版本可用:{{version}}" }, "userPanel": { + "anonymousNickName": "匿名用户", "billing": "账单管理", "defaultNickname": "社区版用户", "discord": "社区支持", diff --git a/locales/zh-CN/error.json b/locales/zh-CN/error.json index 2ad48b3c78a05..2a3dca19a8cec 100644 --- a/locales/zh-CN/error.json +++ b/locales/zh-CN/error.json @@ -1,4 +1,11 @@ { + "clerkAuth": { + "loginSuccess": { + "action": "继续会话", + "desc": "{{greeting}},很高兴能够继续为你服务。让我们接着刚刚的话题聊下去吧", + "title": "欢迎回来, {{nickName}}" + } + }, "error": { "backHome": "返回首页", "desc": "待会来试试,或者回到已知的世界", @@ -57,6 +64,7 @@ "PluginGatewayError": "很抱歉,插件网关出现错误,请检查插件网关配置是否正确", "PluginOpenApiInitError": "很抱歉,OpenAPI 客户端初始化失败,请检查 OpenAPI 的配置信息是否正确", "InvalidAccessCode": "密码不正确或为空,请输入正确的访问密码,或者添加自定义 API Key", + "InvalidClerkUser": "很抱歉,你当前尚未登录,请先登录或注册账号后继续操作", "LocationNotSupportError": "很抱歉,你的所在位置不支持此模型服务,可能是由于地区限制或服务未开通。请确认当前位置是否支持使用此服务,或尝试使用其他位置信息。", "OpenAIBizError": "请求 OpenAI 服务出错,请根据以下信息排查或重试", "NoOpenAIAPIKey": "OpenAI API Key 为空,请添加自定义 OpenAI API Key", diff --git a/locales/zh-TW/auth.json b/locales/zh-TW/auth.json new file mode 100644 index 0000000000000..574818f15a1d1 --- /dev/null +++ b/locales/zh-TW/auth.json @@ -0,0 +1,6 @@ +{ + "login": "登入", + "loginOrSignup": "登入 / 註冊", + "signout": "登出", + "signup": "註冊" +} diff --git a/locales/zh-TW/clerk.json b/locales/zh-TW/clerk.json new file mode 100644 index 0000000000000..fa8bcacbe276d --- /dev/null +++ b/locales/zh-TW/clerk.json @@ -0,0 +1,769 @@ +{ + "backButton": "返回", + "badge__default": "預設", + "badge__otherImpersonatorDevice": "其他冒名頂替裝置", + "badge__primary": "主要", + "badge__requiresAction": "需要採取行動", + "badge__thisDevice": "此裝置", + "badge__unverified": "未驗證", + "badge__userDevice": "使用者裝置", + "badge__you": "您", + "createOrganization": { + "formButtonSubmit": "建立組織", + "invitePage": { + "formButtonReset": "跳過" + }, + "title": "建立組織" + }, + "dates": { + "lastDay": "昨天 {{ date | timeString('zh-TW') }}", + "next6Days": "{{ date | weekday('zh-TW','long') }} {{ date | timeString('zh-TW') }}", + "nextDay": "明天 {{ date | timeString('zh-TW') }}", + "numeric": "{{ date | numeric('zh-TW') }}", + "previous6Days": "上週{{ date | weekday('zh-TW','long') }} {{ date | timeString('zh-TW') }}", + "sameDay": "今天 {{ date | timeString('zh-TW') }}" + }, + "dividerText": "或", + "footerActionLink__useAnotherMethod": "使用其他方法", + "footerPageLink__help": "幫助", + "footerPageLink__privacy": "隱私", + "footerPageLink__terms": "條款", + "formButtonPrimary": "繼續", + "formButtonPrimary__verify": "驗證", + "formFieldAction__forgotPassword": "忘記密碼?", + "formFieldError__matchingPasswords": "密碼相符。", + "formFieldError__notMatchingPasswords": "密碼不相符。", + "formFieldError__verificationLinkExpired": "驗證連結已過期。請求新連結。", + "formFieldHintText__optional": "選填", + "formFieldHintText__slug": "Slug 是一個人可讀的 ID,必須是唯一的。通常用於 URL。", + "formFieldInputPlaceholder__backupCode": "", + "formFieldInputPlaceholder__confirmDeletionUserAccount": "刪除帳號", + "formFieldInputPlaceholder__emailAddress": "", + "formFieldInputPlaceholder__emailAddress_username": "", + "formFieldInputPlaceholder__emailAddresses": "範例@email.com,範例2@email.com", + "formFieldInputPlaceholder__firstName": "", + "formFieldInputPlaceholder__lastName": "", + "formFieldInputPlaceholder__organizationDomain": "", + "formFieldInputPlaceholder__organizationDomainEmailAddress": "", + "formFieldInputPlaceholder__organizationName": "", + "formFieldInputPlaceholder__organizationSlug": "我的組織", + "formFieldInputPlaceholder__password": "", + "formFieldInputPlaceholder__phoneNumber": "", + "formFieldInputPlaceholder__username": "", + "formFieldLabel__automaticInvitations": "啟用此域名的自動邀請", + "formFieldLabel__backupCode": "備份代碼", + "formFieldLabel__confirmDeletion": "確認", + "formFieldLabel__confirmPassword": "確認密碼", + "formFieldLabel__currentPassword": "目前密碼", + "formFieldLabel__emailAddress": "電子郵件地址", + "formFieldLabel__emailAddress_username": "電子郵件地址或使用者名稱", + "formFieldLabel__emailAddresses": "電子郵件地址", + "formFieldLabel__firstName": "名字", + "formFieldLabel__lastName": "姓氏", + "formFieldLabel__newPassword": "新密碼", + "formFieldLabel__organizationDomain": "域名", + "formFieldLabel__organizationDomainDeletePending": "刪除待處理的邀請和建議", + "formFieldLabel__organizationDomainEmailAddress": "驗證電子郵件地址", + "formFieldLabel__organizationDomainEmailAddressDescription": "輸入此域名下的電子郵件地址,以接收代碼並驗證此域名。", + "formFieldLabel__organizationName": "名稱", + "formFieldLabel__organizationSlug": "Slug", + "formFieldLabel__passkeyName": "通行證名稱", + "formFieldLabel__password": "密碼", + "formFieldLabel__phoneNumber": "電話號碼", + "formFieldLabel__role": "角色", + "formFieldLabel__signOutOfOtherSessions": "登出所有其他裝置", + "formFieldLabel__username": "使用者名稱", + "impersonationFab": { + "action__signOut": "登出", + "title": "以 {{identifier}} 身分登入" + }, + "locale": "zh-TW", + "maintenanceMode": "我們目前正在進行維護,但請放心,這不應該超過幾分鐘。", + "membershipRole__admin": "管理員", + "membershipRole__basicMember": "會員", + "membershipRole__guestMember": "訪客", + "organizationList": { + "action__createOrganization": "建立組織", + "action__invitationAccept": "加入", + "action__suggestionsAccept": "請求加入", + "createOrganization": "建立組織", + "invitationAcceptedLabel": "已加入", + "subtitle": "繼續使用{{applicationName}}", + "suggestionsAcceptedLabel": "待審批", + "title": "選擇帳號", + "titleWithoutPersonal": "選擇組織" + }, + "organizationProfile": { + "badge__automaticInvitation": "自動邀請", + "badge__automaticSuggestion": "自動建議", + "badge__manualInvitation": "無自動註冊", + "badge__unverified": "未驗證", + "createDomainPage": { + "subtitle": "新增要驗證的網域。使用此網域電子郵件地址的使用者可以自動加入組織,或請求加入。", + "title": "新增網域" + }, + "invitePage": { + "detailsTitle__inviteFailed": "無法發送邀請。以下電子郵件地址已有待處理的邀請:{{email_addresses}}。", + "formButtonPrimary__continue": "發送邀請", + "selectDropdown__role": "選擇角色", + "subtitle": "輸入或貼上一個或多個以空格或逗號分隔的電子郵件地址。", + "successMessage": "邀請成功發送", + "title": "邀請新成員" + }, + "membersPage": { + "action__invite": "邀請", + "activeMembersTab": { + "menuAction__remove": "移除成員", + "tableHeader__actions": "", + "tableHeader__joined": "加入時間", + "tableHeader__role": "角色", + "tableHeader__user": "使用者" + }, + "detailsTitle__emptyRow": "沒有成員可顯示", + "invitationsTab": { + "autoInvitations": { + "headerSubtitle": "透過連接電子郵件網域來邀請使用者加入組織。任何使用符合電子郵件網域的人都可以隨時加入組織。", + "headerTitle": "自動邀請", + "primaryButton": "管理已驗證的網域" + }, + "table__emptyRow": "沒有邀請可顯示" + }, + "invitedMembersTab": { + "menuAction__revoke": "撤銷邀請", + "tableHeader__invited": "已邀請" + }, + "requestsTab": { + "autoSuggestions": { + "headerSubtitle": "使用符合電子郵件網域的使用者,將能看到請求加入您組織的建議。", + "headerTitle": "自動建議", + "primaryButton": "管理已驗證的網域" + }, + "menuAction__approve": "核准", + "menuAction__reject": "拒絕", + "tableHeader__requested": "請求存取", + "table__emptyRow": "沒有請求可顯示" + }, + "start": { + "headerTitle__invitations": "邀請", + "headerTitle__members": "成員", + "headerTitle__requests": "請求" + } + }, + "navbar": { + "description": "管理您的組織", + "general": "一般", + "members": "成員", + "title": "組織" + }, + "profilePage": { + "dangerSection": { + "deleteOrganization": { + "actionDescription": "在下方輸入\"{{organizationName}}\"以繼續。", + "messageLine1": "您確定要刪除此組織嗎?", + "messageLine2": "此操作是永久且不可逆轉的。", + "successMessage": "您已刪除組織。", + "title": "刪除組織" + }, + "leaveOrganization": { + "actionDescription": "在下方輸入\"{{organizationName}}\"以繼續。", + "messageLine1": "您確定要離開此組織嗎?您將失去對此組織及其應用程式的存取權。", + "messageLine2": "此操作是永久且不可逆轉的。", + "successMessage": "您已離開組織。", + "title": "離開組織" + }, + "title": "風險" + }, + "domainSection": { + "menuAction__manage": "管理", + "menuAction__remove": "刪除", + "menuAction__verify": "驗證", + "primaryButton": "新增網域", + "subtitle": "允許使用者根據驗證的電子郵件網域自動加入組織或請求加入。", + "title": "已驗證的網域" + }, + "successMessage": "組織已更新", + "title": "更新檔案" + }, + "removeDomainPage": { + "messageLine1": "將移除電子郵件網域{{domain}}。", + "messageLine2": "此後使用者將無法自動加入組織。", + "successMessage": "{{domain}}已移除", + "title": "移除網域" + }, + "start": { + "headerTitle__general": "一般", + "headerTitle__members": "成員", + "profileSection": { + "primaryButton": "更新檔案", + "title": "組織檔案", + "uploadAction__title": "標誌" + } + }, + "verifiedDomainPage": { + "dangerTab": { + "calloutInfoLabel": "移除此網域將影響被邀請的使用者。", + "removeDomainActionLabel__remove": "移除網域", + "removeDomainSubtitle": "從您的已驗證網域中移除此網域", + "removeDomainTitle": "移除網域" + }, + "enrollmentTab": { + "automaticInvitationOption__description": "使用者在註冊時將自動獲得邀請加入組織,並隨時加入。", + "automaticInvitationOption__label": "自動邀請", + "automaticSuggestionOption__description": "使用者會收到請求加入的建議,但必須經管理員核准後才能加入組織。", + "automaticSuggestionOption__label": "自動建議", + "calloutInfoLabel": "更改註冊模式僅影響新使用者。", + "calloutInvitationCountLabel": "已發送給使用者的待處理邀請:{{count}}", + "calloutSuggestionCountLabel": "已發送給使用者的待處理建議:{{count}}", + "manualInvitationOption__description": "只能手動邀請使用者加入組織。", + "manualInvitationOption__label": "無自動註冊", + "subtitle": "選擇此網域的使用者如何加入組織。" + }, + "start": { + "headerTitle__danger": "風險", + "headerTitle__enrollment": "註冊選項" + }, + "subtitle": "網域{{domain}}現已驗證。請選擇註冊模式繼續。", + "title": "更新{{domain}}" + }, + "verifyDomainPage": { + "formSubtitle": "輸入發送到您電子郵件地址的驗證碼", + "formTitle": "驗證碼", + "resendButton": "未收到驗證碼?重新發送", + "subtitle": "需透過電子郵件驗證{{domainName}}網域。", + "subtitleVerificationCodeScreen": "驗證碼已發送至{{emailAddress}}。請輸入驗證碼以繼續。", + "title": "驗證網域" + } + }, + "organizationSwitcher": { + "action__createOrganization": "建立組織", + "action__invitationAccept": "加入", + "action__manageOrganization": "管理", + "action__suggestionsAccept": "請求加入", + "notSelected": "未選擇組織", + "personalWorkspace": "個人帳戶", + "suggestionsAcceptedLabel": "待審批" + }, + "paginationButton__next": "下一步", + "paginationButton__previous": "上一步", + "paginationRowText__displaying": "顯示", + "paginationRowText__of": "共", + "signIn": { + "accountSwitcher": { + "action__addAccount": "新增帳戶", + "action__signOutAll": "登出所有帳戶", + "subtitle": "選擇您希望繼續使用的帳戶。", + "title": "選擇帳戶" + }, + "alternativeMethods": { + "actionLink": "獲取幫助", + "actionText": "沒有這些?", + "blockButton__backupCode": "使用備份代碼", + "blockButton__emailCode": "將代碼發送至 {{identifier}} 的電子郵件", + "blockButton__emailLink": "將連結發送至 {{identifier}} 的電子郵件", + "blockButton__passkey": "使用您的通行證登入", + "blockButton__password": "使用密碼登入", + "blockButton__phoneCode": "將簡訊代碼發送至 {{identifier}}", + "blockButton__totp": "使用您的驗證器應用程式", + "getHelp": { + "blockButton__emailSupport": "電子郵件支援", + "content": "如果您在登入帳戶時遇到問題,請給我們發送電子郵件,我們將盡快與您合作恢復訪問權限。", + "title": "獲取幫助" + }, + "subtitle": "遇到問題嗎?您可以使用以下任何方法登入。", + "title": "使用其他方法" + }, + "backupCodeMfa": { + "subtitle": "您的備份代碼是設置兩步驗證時獲得的代碼。", + "title": "輸入備份代碼" + }, + "emailCode": { + "formTitle": "驗證碼", + "resendButton": "未收到代碼?重新發送", + "subtitle": "繼續至 {{applicationName}}", + "title": "檢查您的電子郵件" + }, + "emailLink": { + "expired": { + "subtitle": "返回原始標籤以繼續。", + "title": "此驗證連結已過期" + }, + "failed": { + "subtitle": "返回原始標籤以繼續。", + "title": "此驗證連結無效" + }, + "formSubtitle": "使用發送至您電子郵件的驗證連結", + "formTitle": "驗證連結", + "loading": { + "subtitle": "您將很快被重新導向", + "title": "登入中..." + }, + "resendButton": "未收到連結?重新發送", + "subtitle": "繼續至 {{applicationName}}", + "title": "檢查您的電子郵件", + "unusedTab": { + "title": "您可以關閉此標籤" + }, + "verified": { + "subtitle": "您將很快被重新導向", + "title": "成功登入" + }, + "verifiedSwitchTab": { + "subtitle": "返回原始標籤以繼續", + "subtitleNewTab": "返回新開啟的標籤以繼續", + "titleNewTab": "在其他標籤上登入" + } + }, + "forgotPassword": { + "formTitle": "重設密碼代碼", + "resendButton": "未收到代碼?重新發送", + "subtitle": "重設您的密碼", + "subtitle_email": "首先,輸入發送至您電子郵件地址的代碼", + "subtitle_phone": "首先,輸入發送至您電話的代碼", + "title": "重設密碼" + }, + "forgotPasswordAlternativeMethods": { + "blockButton__resetPassword": "重設您的密碼", + "label__alternativeMethods": "或使用其他方法登入", + "title": "忘記密碼?" + }, + "noAvailableMethods": { + "message": "無法繼續登入。沒有可用的身份驗證因素。", + "subtitle": "發生錯誤", + "title": "無法登入" + }, + "passkey": { + "subtitle": "使用您的通行證確認您的身份。您的設備可能要求您的指紋、臉部或螢幕鎖。", + "title": "使用您的通行證" + }, + "password": { + "actionLink": "使用其他方法", + "subtitle": "輸入與您帳戶關聯的密碼", + "title": "輸入您的密碼" + }, + "passwordPwned": { + "title": "密碼已被盜用" + }, + "phoneCode": { + "formTitle": "驗證碼", + "resendButton": "未收到代碼?重新發送", + "subtitle": "繼續至 {{applicationName}}", + "title": "檢查您的手機" + }, + "phoneCodeMfa": { + "formTitle": "驗證碼", + "resendButton": "未收到代碼?重新發送", + "subtitle": "請輸入發送至您手機的驗證碼以繼續", + "title": "檢查您的手機" + }, + "resetPassword": { + "formButtonPrimary": "重設密碼", + "requiredMessage": "出於安全原因,需要重設您的密碼。", + "successMessage": "您的密碼已成功更改。正在為您登入,請稍候片刻。", + "title": "設置新密碼" + }, + "resetPasswordMfa": { + "detailsLabel": "在重設密碼之前,我們需要驗證您的身份。" + }, + "start": { + "actionLink": "註冊", + "actionLink__use_email": "使用電子郵件", + "actionLink__use_email_username": "使用電子郵件或使用者名稱", + "actionLink__use_passkey": "改用通行證", + "actionLink__use_phone": "使用手機", + "actionLink__use_username": "使用使用者名稱", + "actionText": "還沒有帳戶?", + "subtitle": "歡迎回來!請登入以繼續", + "title": "登入 {{applicationName}}" + }, + "totpMfa": { + "formTitle": "驗證碼", + "subtitle": "請輸入您的驗證器應用程式生成的驗證碼以繼續", + "title": "兩步驗證" + } + }, + "signInEnterPasswordTitle": "輸入您的密碼", + "signUp": { + "continue": { + "actionLink": "登入", + "actionText": "已有帳戶?", + "subtitle": "請填寫剩餘的詳細信息以繼續。", + "title": "填寫缺少的字段" + }, + "emailCode": { + "formSubtitle": "輸入發送至您電子郵件地址的驗證碼", + "formTitle": "驗證碼", + "resendButton": "未收到代碼?重新發送", + "subtitle": "輸入發送至您電子郵件的驗證碼", + "title": "驗證您的電子郵件" + }, + "emailLink": { + "formSubtitle": "使用發送至您電子郵件地址的驗證連結", + "formTitle": "驗證連結", + "loading": { + "title": "正在註冊..." + }, + "resendButton": "未收到連結?重新發送", + "subtitle": "繼續至 {{applicationName}}", + "title": "驗證您的電子郵件", + "verified": { + "title": "註冊成功" + }, + "verifiedSwitchTab": { + "subtitle": "返回新開啟的標籤以繼續", + "subtitleNewTab": "返回上一個標籤以繼續", + "title": "電子郵件驗證成功" + } + }, + "phoneCode": { + "formSubtitle": "輸入發送至您手機號碼的驗證碼", + "formTitle": "驗證碼", + "resendButton": "未收到代碼?重新發送", + "subtitle": "輸入發送至您手機的驗證碼", + "title": "驗證您的手機" + }, + "start": { + "actionLink": "登入", + "actionText": "已有帳戶?", + "subtitle": "歡迎!請填寫詳細信息開始。", + "title": "創建您的帳戶" + } + }, + "socialButtonsBlockButton": "使用 {{provider|titleize}} 繼續", + "unstable__errors": { + "captcha_invalid": "由於安全驗證失敗,註冊失敗。請重新整理頁面再試一次,或聯繫支援部門尋求協助。", + "captcha_unavailable": "由於機器人驗證失敗,註冊失敗。請重新整理頁面再試一次,或聯繫支援部門尋求協助。", + "form_code_incorrect": "", + "form_identifier_exists": "", + "form_identifier_exists__email_address": "此電子郵件地址已被使用。請嘗試其他地址。", + "form_identifier_exists__phone_number": "此電話號碼已被使用。請嘗試其他號碼。", + "form_identifier_exists__username": "此使用者名稱已被使用。請嘗試其他名稱。", + "form_identifier_not_found": "", + "form_param_format_invalid": "", + "form_param_format_invalid__email_address": "電子郵件地址必須是有效的電子郵件地址。", + "form_param_format_invalid__phone_number": "電話號碼必須符合有效的國際格式。", + "form_param_max_length_exceeded__first_name": "名字不應超過256個字符。", + "form_param_max_length_exceeded__last_name": "姓氏不應超過256個字符。", + "form_param_max_length_exceeded__name": "名稱不應超過256個字符。", + "form_param_nil": "", + "form_password_incorrect": "", + "form_password_length_too_short": "", + "form_password_not_strong_enough": "您的密碼不夠強大。", + "form_password_pwned": "此密碼已被發現存在安全漏洞,請嘗試其他密碼。", + "form_password_pwned__sign_in": "此密碼已被發現存在安全漏洞,請重設您的密碼。", + "form_password_size_in_bytes_exceeded": "您的密碼超過允許的最大字節數,請縮短或刪除一些特殊字符。", + "form_password_validation_failed": "密碼不正確", + "form_username_invalid_character": "", + "form_username_invalid_length": "", + "identification_deletion_failed": "您無法刪除您的最後一個身分證。", + "not_allowed_access": "", + "passkey_already_exists": "此設備已註冊了一個通行證。", + "passkey_not_supported": "此設備不支援通行證。", + "passkey_pa_not_supported": "註冊需要平台驗證器,但設備不支援。", + "passkey_registration_cancelled": "通行證註冊已取消或超時。", + "passkey_retrieval_cancelled": "通行證驗證已取消或超時。", + "passwordComplexity": { + "maximumLength": "少於{{length}}個字符", + "minimumLength": "{{length}}個或更多字符", + "requireLowercase": "小寫字母", + "requireNumbers": "數字", + "requireSpecialCharacter": "特殊字符", + "requireUppercase": "大寫字母", + "sentencePrefix": "您的密碼必須包含" + }, + "phone_number_exists": "此電話號碼已被使用。請嘗試其他號碼。", + "zxcvbn": { + "couldBeStronger": "您的密碼有效,但可以更強大。嘗試添加更多字符。", + "goodPassword": "您的密碼符合所有必要條件。", + "notEnough": "您的密碼不夠強大。", + "suggestions": { + "allUppercase": "將一些字母大寫。", + "anotherWord": "添加更多不常見的單詞。", + "associatedYears": "避免與您有關的年份。", + "capitalization": "大寫第一個字母以外的字母。", + "dates": "避免與您有關的日期和年份。", + "l33t": "避免可預測的字母替換,如將'@'替換為'a'。", + "longerKeyboardPattern": "使用更長的鍵盤模式,並多次改變打字方向。", + "noNeed": "您可以創建強大的密碼,而無需使用符號、數字或大寫字母。", + "pwned": "如果您在其他地方使用此密碼,應該更改它。", + "recentYears": "避免最近的年份。", + "repeated": "避免重複的單詞和字符。", + "reverseWords": "避免常見單詞的反向拼寫。", + "sequences": "避免常見的字符序列。", + "useWords": "使用多個單詞,但避免常見短語。" + }, + "warnings": { + "common": "這是常用的密碼。", + "commonNames": "常見名字和姓氏容易被猜測。", + "dates": "日期容易被猜測。", + "extendedRepeat": "重複字符模式如“abcabcabc”容易被猜測。", + "keyPattern": "短鍵盤模式容易被猜測。", + "namesByThemselves": "單個名字或姓氏容易被猜測。", + "pwned": "您的密碼在互聯網上的數據洩露中曝光。", + "recentYears": "最近的年份容易被猜測。", + "sequences": "常見的字符序列如“abc”容易被猜測。", + "similarToCommon": "這與常用密碼類似。", + "simpleRepeat": "重複字符如“aaa”容易被猜測。", + "straightRow": "鍵盤上的直行鍵容易被猜測。", + "topHundred": "這是常用的密碼。", + "topTen": "這是常用的密碼。", + "userInputs": "不應包含任何個人或頁面相關數據。", + "wordByItself": "單詞容易被猜測。" + } + } + }, + "userButton": { + "action__addAccount": "新增帳戶", + "action__manageAccount": "管理帳戶", + "action__signOut": "登出", + "action__signOutAll": "登出所有帳戶" + }, + "userProfile": { + "backupCodePage": { + "actionLabel__copied": "已複製!", + "actionLabel__copy": "全部複製", + "actionLabel__download": "下載 .txt", + "actionLabel__print": "列印", + "infoText1": "此帳戶將啟用備份代碼。", + "infoText2": "請保密並安全存放備份代碼。如果懷疑代碼已被泄露,可以重新生成備份代碼。", + "subtitle__codelist": "安全存放並保密。", + "successMessage": "備份代碼現已啟用。如果您無法使用身份驗證裝置,可以使用其中一個代碼登入您的帳戶。每個代碼只能使用一次。", + "successSubtitle": "如果您無法使用身份驗證裝置,可以使用其中一個代碼登入您的帳戶。", + "title": "新增備份代碼驗證", + "title__codelist": "備份代碼" + }, + "connectedAccountPage": { + "formHint": "選擇提供者以連接您的帳戶。", + "formHint__noAccounts": "沒有可用的外部帳戶提供者。", + "removeResource": { + "messageLine1": "{{identifier}} 將從此帳戶中移除。", + "messageLine2": "您將無法再使用此連接帳戶,任何相關功能也將無法使用。", + "successMessage": "{{connectedAccount}} 已從您的帳戶中移除。", + "title": "移除連接帳戶" + }, + "socialButtonsBlockButton": "{{provider|titleize}}", + "successMessage": "提供者已添加至您的帳戶", + "title": "新增連接帳戶" + }, + "deletePage": { + "actionDescription": "在下方輸入\"刪除帳戶\"。", + "confirm": "刪除帳戶", + "messageLine1": "您確定要刪除您的帳戶嗎?", + "messageLine2": "此操作是永久且不可逆轉的。", + "title": "刪除帳戶" + }, + "emailAddressPage": { + "emailCode": { + "formHint": "將發送包含驗證碼的郵件至此電子郵件地址。", + "formSubtitle": "輸入發送至 {{identifier}} 的驗證碼。", + "formTitle": "驗證碼", + "resendButton": "未收到驗證碼?重新發送", + "successMessage": "電子郵件 {{identifier}} 已添加至您的帳戶。" + }, + "emailLink": { + "formHint": "將發送包含驗證連結的郵件至此電子郵件地址。", + "formSubtitle": "點擊發送至 {{identifier}} 的郵件中的驗證連結。", + "formTitle": "驗證連結", + "resendButton": "未收到連結?重新發送", + "successMessage": "電子郵件 {{identifier}} 已添加至您的帳戶。" + }, + "removeResource": { + "messageLine1": "{{identifier}} 將從此帳戶中移除。", + "messageLine2": "您將無法再使用此電子郵件地址登入。", + "successMessage": "{{emailAddress}} 已從您的帳戶中移除。", + "title": "移除電子郵件地址" + }, + "title": "新增電子郵件地址", + "verifyTitle": "驗證電子郵件地址" + }, + "formButtonPrimary__add": "新增", + "formButtonPrimary__continue": "繼續", + "formButtonPrimary__finish": "完成", + "formButtonPrimary__remove": "移除", + "formButtonPrimary__save": "儲存", + "formButtonReset": "取消", + "mfaPage": { + "formHint": "選擇一種方法進行添加。", + "title": "新增兩步驗證" + }, + "mfaPhoneCodePage": { + "backButton": "使用現有號碼", + "primaryButton__addPhoneNumber": "新增電話號碼", + "removeResource": { + "messageLine1": "登入時將不再接收來自此號碼的驗證碼。", + "messageLine2": "您的帳戶可能不夠安全。您確定要繼續嗎?", + "successMessage": "已移除 {{mfaPhoneCode}} 的簡訊驗證。", + "title": "移除兩步驗證" + }, + "subtitle__availablePhoneNumbers": "選擇現有電話號碼註冊簡訊驗證,或新增一個。", + "subtitle__unavailablePhoneNumbers": "沒有可用的電話號碼可註冊簡訊驗證,請新增一個。", + "successMessage1": "登入時,您需要輸入發送至此電話號碼的驗證碼作為額外步驟。", + "successMessage2": "請儲存這些備份代碼並安全保管。如果您無法使用身份驗證裝置,可以使用備份代碼登入。", + "successTitle": "已啟用簡訊驗證", + "title": "新增簡訊驗證" + }, + "mfaTOTPPage": { + "authenticatorApp": { + "buttonAbleToScan__nonPrimary": "掃描 QR 碼", + "buttonUnableToScan__nonPrimary": "無法掃描 QR 碼?", + "infoText__ableToScan": "在您的驗證器應用程式中設定新的登入方法,並掃描以下 QR 碼以將其連結至您的帳戶。", + "infoText__unableToScan": "在您的驗證器中設定新的登入方法,並輸入下方提供的金鑰。", + "inputLabel__unableToScan1": "確保已啟用基於時間或一次性密碼,然後完成連結您的帳戶。", + "inputLabel__unableToScan2": "或者,如果您的驗證器支援 TOTP URI,您也可以複製完整的 URI。" + }, + "removeResource": { + "messageLine1": "登入時將不再需要來自此驗證器的驗證碼。", + "messageLine2": "您的帳戶可能不夠安全。您確定要繼續嗎?", + "successMessage": "已移除驗證器應用程式的兩步驗證。", + "title": "移除兩步驗證" + }, + "successMessage": "已啟用兩步驗證。登入時,您需要輸入來自此驗證器的驗證碼作為額外步驟。", + "title": "新增驗證器應用程式", + "verifySubtitle": "輸入您的驗證器生成的驗證碼", + "verifyTitle": "驗證碼" + }, + "mobileButton__menu": "選單", + "navbar": { + "account": "個人資料", + "description": "管理您的帳戶資訊。", + "security": "安全性", + "title": "帳戶" + }, + "passkeyScreen": { + "removeResource": { + "messageLine1": "{{name}} 將從此帳戶中移除。", + "title": "移除密碼鍵" + }, + "subtitle__rename": "您可以更改密碼鍵名稱,以便更容易找到。", + "title__rename": "重新命名密碼鍵" + }, + "passwordPage": { + "checkboxInfoText__signOutOfOtherSessions": "建議登出所有可能使用過您舊密碼的其他裝置。", + "readonly": "您目前無法編輯密碼,因為只能透過企業連線登入。", + "successMessage__set": "您的密碼已設定。", + "successMessage__signOutOfOtherSessions": "所有其他裝置已登出。", + "successMessage__update": "您的密碼已更新。", + "title__set": "設定密碼", + "title__update": "更新密碼" + }, + "phoneNumberPage": { + "infoText": "將發送包含驗證碼的簡訊至此電話號碼。可能會產生訊息和資料費用。", + "removeResource": { + "messageLine1": "{{identifier}} 將從此帳戶中移除。", + "messageLine2": "您將無法再使用此電話號碼登入。", + "successMessage": "{{phoneNumber}} 已從您的帳戶中移除。", + "title": "移除電話號碼" + }, + "successMessage": "{{identifier}} 已新增至您的帳戶。", + "title": "新增電話號碼", + "verifySubtitle": "輸入發送至 {{identifier}} 的驗證碼", + "verifyTitle": "驗證電話號碼" + }, + "profilePage": { + "fileDropAreaHint": "建議尺寸 1:1,最大 10MB。", + "imageFormDestructiveActionSubtitle": "移除", + "imageFormSubtitle": "上傳", + "imageFormTitle": "個人形象", + "readonly": "您的個人資訊已由企業連線提供,無法編輯。", + "successMessage": "您的個人資料已更新。", + "title": "更新個人資料" + }, + "start": { + "activeDevicesSection": { + "destructiveAction": "登出裝置", + "title": "活躍裝置" + }, + "connectedAccountsSection": { + "actionLabel__connectionFailed": "重試", + "actionLabel__reauthorize": "現在授權", + "destructiveActionTitle": "移除", + "primaryButton": "連結帳戶", + "subtitle__reauthorize": "所需範圍已更新,您可能遇到功能受限的情況。請重新授權此應用以避免任何問題", + "title": "已連結帳戶" + }, + "dangerSection": { + "deleteAccountButton": "刪除帳戶", + "title": "刪除帳戶" + }, + "emailAddressesSection": { + "destructiveAction": "移除電子郵件", + "detailsAction__nonPrimary": "設為主要", + "detailsAction__primary": "完成驗證", + "detailsAction__unverified": "驗證", + "primaryButton": "新增電子郵件地址", + "title": "電子郵件地址" + }, + "enterpriseAccountsSection": { + "title": "企業帳戶" + }, + "headerTitle__account": "個人資料詳情", + "headerTitle__security": "安全性", + "mfaSection": { + "backupCodes": { + "actionLabel__regenerate": "重新生成", + "headerTitle": "備份代碼", + "subtitle__regenerate": "取得一組新的安全備份代碼。之前的備份代碼將被刪除且無法使用。", + "title__regenerate": "重新生成備份代碼" + }, + "phoneCode": { + "actionLabel__setDefault": "設為預設", + "destructiveActionLabel": "移除" + }, + "primaryButton": "新增雙重驗證", + "title": "雙重驗證", + "totp": { + "destructiveActionTitle": "移除", + "headerTitle": "驗證器應用程式" + } + }, + "passkeysSection": { + "menuAction__destructive": "移除", + "menuAction__rename": "重新命名", + "title": "通行證" + }, + "passwordSection": { + "primaryButton__setPassword": "設定密碼", + "primaryButton__updatePassword": "更新密碼", + "title": "密碼" + }, + "phoneNumbersSection": { + "destructiveAction": "移除電話號碼", + "detailsAction__nonPrimary": "設為主要", + "detailsAction__primary": "完成驗證", + "detailsAction__unverified": "驗證電話號碼", + "primaryButton": "新增電話號碼", + "title": "電話號碼" + }, + "profileSection": { + "primaryButton": "更新個人資料", + "title": "個人資料" + }, + "usernameSection": { + "primaryButton__setUsername": "設定使用者名稱", + "primaryButton__updateUsername": "更新使用者名稱", + "title": "使用者名稱" + }, + "web3WalletsSection": { + "destructiveAction": "移除錢包", + "primaryButton": "Web3錢包", + "title": "Web3錢包" + } + }, + "usernamePage": { + "successMessage": "您的使用者名稱已更新。", + "title__set": "設定使用者名稱", + "title__update": "更新使用者名稱" + }, + "web3WalletPage": { + "removeResource": { + "messageLine1": "{{identifier}} 將從此帳戶中移除。", + "messageLine2": "您將無法再使用此 Web3 錢包登入。", + "successMessage": "{{web3Wallet}} 已從您的帳戶中移除。", + "title": "移除 Web3 錢包" + }, + "subtitle__availableWallets": "選擇一個 Web3 錢包連線至您的帳戶。", + "subtitle__unavailableWallets": "目前沒有可用的 Web3 錢包。", + "successMessage": "錢包已新增至您的帳戶。", + "title": "新增 Web3 錢包" + } + } +} diff --git a/locales/zh-TW/common.json b/locales/zh-TW/common.json index c4635ba1e232d..8017b17442d65 100644 --- a/locales/zh-TW/common.json +++ b/locales/zh-TW/common.json @@ -160,6 +160,7 @@ "newVersion": "有新版本可用:{{version}}" }, "userPanel": { + "anonymousNickName": "匿名使用者", "billing": "帳單管理", "defaultNickname": "社群版使用者", "discord": "社區支援", diff --git a/locales/zh-TW/error.json b/locales/zh-TW/error.json index 1380baa6da2e3..a22454f8e1f2d 100644 --- a/locales/zh-TW/error.json +++ b/locales/zh-TW/error.json @@ -1,4 +1,11 @@ { + "clerkAuth": { + "loginSuccess": { + "action": "繼續會話", + "desc": "{{greeting}},很高興能夠繼續為你服務。讓我們接著剛剛的話題聊下去吧", + "title": "歡迎回來, {{nickName}}" + } + }, "error": { "backHome": "返回首頁", "desc": "待會再試試,或者回到已知的世界", @@ -54,6 +61,7 @@ "InvalidAnthropicAPIKey": "Anthropic API 金鑰不正確或為空,請檢查 Anthropic API 金鑰後重試", "InvalidAzureAPIKey": "Azure API Key 不正確或為空,請檢查 Azure API Key 後重試", "InvalidBedrockCredentials": "Bedrock 驗證未通過,請檢查 AccessKeyId/SecretAccessKey 後重試", + "InvalidClerkUser": "很抱歉,你當前尚未登錄,請先登錄或註冊帳號後繼續操作", "InvalidGoogleAPIKey": "Google API Key 不正確或為空,請檢查 Google API Key 後重試", "InvalidGroqAPIKey": "Groq API 金鑰不正確或為空,請檢查 Groq API 金鑰後重試", "InvalidMinimaxAPIKey": "Minimax API 金鑰不正確或為空,請檢查 Minimax API 金鑰後重試", diff --git a/package.json b/package.json index 3639dadf23ddc..d7908d18f6c2f 100644 --- a/package.json +++ b/package.json @@ -32,6 +32,7 @@ "build:analyze": "ANALYZE=true next build", "build:docker": "DOCKER=true next build && npm run build-sitemap", "dev": "next dev -p 3010", + "dev:clerk-proxy": "ngrok http http://localhost:3011", "docs:i18n": "lobe-i18n md && npm run workflow:docs && npm run lint:mdx", "docs:seo": "lobe-seo && npm run workflow:mdx && npm run lint:mdx", "i18n": "npm run workflow:i18n && lobe-i18n", @@ -86,6 +87,9 @@ "@aws-sdk/client-bedrock-runtime": "^3.565.0", "@azure/openai": "1.0.0-beta.12", "@cfworker/json-schema": "^1.12.8", + "@clerk/localizations": "2.0.0", + "@clerk/nextjs": "^5.0.6", + "@clerk/themes": "^2.0.0", "@google/generative-ai": "^0.8.0", "@icons-pack/react-simple-icons": "^9.4.1", "@lobehub/chat-plugin-sdk": "latest", diff --git a/src/app/(auth)/layout.tsx b/src/app/(auth)/layout.tsx new file mode 100644 index 0000000000000..6c20a1a33727d --- /dev/null +++ b/src/app/(auth)/layout.tsx @@ -0,0 +1,19 @@ +import { notFound } from 'next/navigation'; +import { PropsWithChildren } from 'react'; +import { Center, Flexbox } from 'react-layout-kit'; + +import { enableClerk } from '@/const/auth'; + +const Page = ({ children }: PropsWithChildren) => { + if (!enableClerk) return notFound(); + + return ( + +
+ {children} +
+
+ ); +}; + +export default Page; diff --git a/src/app/(auth)/login/[[...login]]/PageTitle.tsx b/src/app/(auth)/login/[[...login]]/PageTitle.tsx new file mode 100644 index 0000000000000..79cfdf3c830a6 --- /dev/null +++ b/src/app/(auth)/login/[[...login]]/PageTitle.tsx @@ -0,0 +1,13 @@ +'use client'; + +import { memo } from 'react'; +import { useTranslation } from 'react-i18next'; + +import PageTitle from '@/components/PageTitle'; + +const Title = memo(() => { + const { t } = useTranslation('auth'); + + return ; +}); +export default Title; diff --git a/src/app/(auth)/login/[[...login]]/page.tsx b/src/app/(auth)/login/[[...login]]/page.tsx new file mode 100644 index 0000000000000..2f819cafa1b3e --- /dev/null +++ b/src/app/(auth)/login/[[...login]]/page.tsx @@ -0,0 +1,14 @@ +import { SignIn } from '@clerk/nextjs'; + +import PageTitle from './PageTitle'; + +const Page = () => { + return ( + <> + + + + ); +}; + +export default Page; diff --git a/src/app/(auth)/profile/[[...slugs]]/PageTitle.tsx b/src/app/(auth)/profile/[[...slugs]]/PageTitle.tsx new file mode 100644 index 0000000000000..a0924ce20997d --- /dev/null +++ b/src/app/(auth)/profile/[[...slugs]]/PageTitle.tsx @@ -0,0 +1,13 @@ +'use client'; + +import { memo } from 'react'; +import { useTranslation } from 'react-i18next'; + +import PageTitle from '@/components/PageTitle'; + +const Title = memo(() => { + const { t } = useTranslation('auth'); + + return ; +}); +export default Title; diff --git a/src/app/(auth)/profile/[[...slugs]]/page.tsx b/src/app/(auth)/profile/[[...slugs]]/page.tsx new file mode 100644 index 0000000000000..506df1465ea87 --- /dev/null +++ b/src/app/(auth)/profile/[[...slugs]]/page.tsx @@ -0,0 +1,14 @@ +import { UserProfile } from '@clerk/nextjs'; + +import PageTitle from './PageTitle'; + +const Page = () => { + return ( + <> + + + + ); +}; + +export default Page; diff --git a/src/app/(auth)/signup/[[...signup]]/PageTitle.tsx b/src/app/(auth)/signup/[[...signup]]/PageTitle.tsx new file mode 100644 index 0000000000000..a0924ce20997d --- /dev/null +++ b/src/app/(auth)/signup/[[...signup]]/PageTitle.tsx @@ -0,0 +1,13 @@ +'use client'; + +import { memo } from 'react'; +import { useTranslation } from 'react-i18next'; + +import PageTitle from '@/components/PageTitle'; + +const Title = memo(() => { + const { t } = useTranslation('auth'); + + return ; +}); +export default Title; diff --git a/src/app/(auth)/signup/[[...signup]]/page.tsx b/src/app/(auth)/signup/[[...signup]]/page.tsx new file mode 100644 index 0000000000000..b1913f71e2a29 --- /dev/null +++ b/src/app/(auth)/signup/[[...signup]]/page.tsx @@ -0,0 +1,14 @@ +import { SignUp } from '@clerk/nextjs'; + +import PageTitle from './PageTitle'; + +const Page = () => { + return ( + <> + + + + ); +}; + +export default Page; diff --git a/src/app/(main)/settings/common/features/Common.tsx b/src/app/(main)/settings/common/features/Common.tsx index 730997a96dce8..cd1db5a1e8867 100644 --- a/src/app/(main)/settings/common/features/Common.tsx +++ b/src/app/(main)/settings/common/features/Common.tsx @@ -21,7 +21,7 @@ type SettingItemGroup = ItemGroup; export interface SettingsCommonProps { showAccessCodeConfig: boolean; - showOAuthLogin: boolean; + showOAuthLogin?: boolean; } const Common = memo(({ showAccessCodeConfig, showOAuthLogin }) => { diff --git a/src/app/(main)/settings/common/features/Theme/index.tsx b/src/app/(main)/settings/common/features/Theme/index.tsx index d62d76869fc01..6f1440c01a9ec 100644 --- a/src/app/(main)/settings/common/features/Theme/index.tsx +++ b/src/app/(main)/settings/common/features/Theme/index.tsx @@ -8,6 +8,7 @@ import { memo } from 'react'; import { useTranslation } from 'react-i18next'; import { useSyncSettings } from '@/app/(main)/settings/hooks/useSyncSettings'; +import { enableAuth } from '@/const/auth'; import { FORM_STYLE } from '@/const/layoutTokens'; import { imageUrl } from '@/const/url'; import AvatarWithUpload from '@/features/AvatarWithUpload'; @@ -32,6 +33,7 @@ const Theme = memo(() => { children: [ { children: , + hidden: enableAuth, label: t('settingTheme.avatar.title'), minWidth: undefined, }, diff --git a/src/app/(main)/settings/common/index.tsx b/src/app/(main)/settings/common/index.tsx index cf66e7e0f4325..5017da805f486 100644 --- a/src/app/(main)/settings/common/index.tsx +++ b/src/app/(main)/settings/common/index.tsx @@ -1,15 +1,19 @@ +import { authEnv } from '@/config/auth'; import { getServerConfig } from '@/config/server'; import Common from './features/Common'; import Theme from './features/Theme'; -const { SHOW_ACCESS_CODE_CONFIG, ENABLE_OAUTH_SSO } = getServerConfig(); - const Page = () => { + const { SHOW_ACCESS_CODE_CONFIG } = getServerConfig(); + return ( <> - + ); }; diff --git a/src/app/api/chat/[provider]/route.test.ts b/src/app/api/chat/[provider]/route.test.ts index ca2897ff005da..ebb3fe1fa597c 100644 --- a/src/app/api/chat/[provider]/route.test.ts +++ b/src/app/api/chat/[provider]/route.test.ts @@ -1,18 +1,37 @@ // @vitest-environment edge-runtime +import { getAuth } from '@clerk/nextjs/server'; import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'; import { LOBE_CHAT_AUTH_HEADER, OAUTH_AUTHORIZED } from '@/const/auth'; import { AgentRuntime, LobeRuntimeAI } from '@/libs/agent-runtime'; import { ChatErrorType } from '@/types/fetch'; -import { getJWTPayload } from '../auth/utils'; +import { checkAuthMethod, getJWTPayload } from '../auth/utils'; import { POST } from './route'; +vi.mock('@clerk/nextjs/server', () => ({ + getAuth: vi.fn(), +})); + vi.mock('../auth/utils', () => ({ getJWTPayload: vi.fn(), checkAuthMethod: vi.fn(), })); +// 定义一个变量来存储 enableAuth 的值 +let enableClerk = false; + +// 模拟 @/const/auth 模块 +vi.mock('@/const/auth', async (importOriginal) => { + const modules = await importOriginal(); + return { + ...(modules as any), + get enableClerk() { + return enableClerk; + }, + }; +}); + // 模拟请求和响应 let request: Request; beforeEach(() => { @@ -29,15 +48,16 @@ beforeEach(() => { afterEach(() => { // 清除模拟调用历史 vi.clearAllMocks(); + enableClerk = false; }); describe('POST handler', () => { - describe(' init chat model', () => { + describe('init chat model', () => { it('should initialize AgentRuntime correctly with valid authorization', async () => { const mockParams = { provider: 'test-provider' }; // 设置 getJWTPayload 和 initAgentRuntimeWithUserPayload 的模拟返回值 - vi.mocked(getJWTPayload).mockResolvedValue({ + vi.mocked(getJWTPayload).mockResolvedValueOnce({ accessCode: 'test-access-code', apiKey: 'test-api-key', azureApiVersion: 'v1', @@ -76,6 +96,46 @@ describe('POST handler', () => { errorType: 401, }); }); + + it('should have pass clerk Auth when enable clerk', async () => { + enableClerk = true; + + vi.mocked(getJWTPayload).mockResolvedValueOnce({ + accessCode: 'test-access-code', + apiKey: 'test-api-key', + azureApiVersion: 'v1', + }); + + const mockParams = { provider: 'test-provider' }; + // 设置 initAgentRuntimeWithUserPayload 的模拟返回值 + vi.mocked(getAuth).mockReturnValue({} as any); + vi.mocked(checkAuthMethod).mockReset(); + + const mockRuntime: LobeRuntimeAI = { baseURL: 'abc', chat: vi.fn() }; + + vi.spyOn(AgentRuntime, 'initializeWithProviderOptions').mockResolvedValue( + new AgentRuntime(mockRuntime), + ); + + const request = new Request(new URL('https://test.com'), { + method: 'POST', + body: JSON.stringify({ model: 'test-model' }), + headers: { + [LOBE_CHAT_AUTH_HEADER]: 'some-valid-token', + [OAUTH_AUTHORIZED]: '1', + }, + }); + + await POST(request, { params: mockParams }); + + expect(checkAuthMethod).toBeCalledWith({ + accessCode: 'test-access-code', + apiKey: 'test-api-key', + clerkAuth: {}, + nextAuthAuthorized: true, + }); + }); + it('should return InternalServerError error when throw a unknown error', async () => { const mockParams = { provider: 'test-provider' }; vi.mocked(getJWTPayload).mockRejectedValueOnce(new Error('unknown error')); @@ -95,6 +155,12 @@ describe('POST handler', () => { describe('chat', () => { it('should correctly handle chat completion with valid payload', async () => { + vi.mocked(getJWTPayload).mockResolvedValueOnce({ + accessCode: 'test-access-code', + apiKey: 'test-api-key', + azureApiVersion: 'v1', + }); + const mockParams = { provider: 'test-provider' }; const mockChatPayload = { message: 'Hello, world!' }; request = new Request(new URL('https://test.com'), { @@ -114,6 +180,13 @@ describe('POST handler', () => { }); it('should return an error response when chat completion fails', async () => { + // 设置 getJWTPayload 和 initAgentRuntimeWithUserPayload 的模拟返回值 + vi.mocked(getJWTPayload).mockResolvedValueOnce({ + accessCode: 'test-access-code', + apiKey: 'test-api-key', + azureApiVersion: 'v1', + }); + const mockParams = { provider: 'test-provider' }; const mockChatPayload = { message: 'Hello, world!' }; request = new Request(new URL('https://test.com'), { diff --git a/src/app/api/chat/auth/index.test.ts b/src/app/api/chat/auth/index.test.ts new file mode 100644 index 0000000000000..80045cb45c16c --- /dev/null +++ b/src/app/api/chat/auth/index.test.ts @@ -0,0 +1,77 @@ +import { getAuth } from '@clerk/nextjs/server'; +import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'; + +import { createErrorResponse } from '@/app/api/errorResponse'; +import { AgentRuntimeError } from '@/libs/agent-runtime'; +import { ChatErrorType } from '@/types/fetch'; + +import { RequestHandler, checkAuth } from './index'; +import { checkAuthMethod, getJWTPayload } from './utils'; + +vi.mock('@clerk/nextjs/server', () => ({ + getAuth: vi.fn(), +})); + +vi.mock('@/app/api/errorResponse', () => ({ + createErrorResponse: vi.fn(), +})); + +vi.mock('./utils', () => ({ + checkAuthMethod: vi.fn(), + getJWTPayload: vi.fn(), +})); + +describe('checkAuth', () => { + const mockHandler: RequestHandler = vi.fn(); + const mockRequest = new Request('https://example.com'); + const mockOptions = { params: { provider: 'mock' } }; + + beforeEach(() => { + vi.clearAllMocks(); + }); + + afterEach(() => { + vi.resetAllMocks(); + }); + + it('should return unauthorized error if no authorization header', async () => { + await checkAuth(mockHandler)(mockRequest, mockOptions); + + expect(createErrorResponse).toHaveBeenCalledWith(ChatErrorType.Unauthorized, { + error: AgentRuntimeError.createError(ChatErrorType.Unauthorized), + provider: 'mock', + }); + expect(mockHandler).not.toHaveBeenCalled(); + }); + + it('should return error response on getJWTPayload error', async () => { + const mockError = AgentRuntimeError.createError(ChatErrorType.Unauthorized); + mockRequest.headers.set('Authorization', 'invalid'); + vi.mocked(getJWTPayload).mockRejectedValueOnce(mockError); + + await checkAuth(mockHandler)(mockRequest, mockOptions); + + expect(createErrorResponse).toHaveBeenCalledWith(ChatErrorType.Unauthorized, { + error: mockError, + provider: 'mock', + }); + expect(mockHandler).not.toHaveBeenCalled(); + }); + + it('should return error response on checkAuthMethod error', async () => { + const mockError = AgentRuntimeError.createError(ChatErrorType.Unauthorized); + mockRequest.headers.set('Authorization', 'valid'); + vi.mocked(getJWTPayload).mockResolvedValueOnce({}); + vi.mocked(checkAuthMethod).mockImplementationOnce(() => { + throw mockError; + }); + + await checkAuth(mockHandler)(mockRequest, mockOptions); + + expect(createErrorResponse).toHaveBeenCalledWith(ChatErrorType.Unauthorized, { + error: mockError, + provider: 'mock', + }); + expect(mockHandler).not.toHaveBeenCalled(); + }); +}); diff --git a/src/app/api/chat/auth/index.ts b/src/app/api/chat/auth/index.ts index 9e0d25fe29a52..b5b8f7c5161d7 100644 --- a/src/app/api/chat/auth/index.ts +++ b/src/app/api/chat/auth/index.ts @@ -1,5 +1,9 @@ +import { AuthObject } from '@clerk/backend/internal'; +import { getAuth } from '@clerk/nextjs/server'; +import { NextRequest } from 'next/server'; + import { createErrorResponse } from '@/app/api/errorResponse'; -import { JWTPayload, LOBE_CHAT_AUTH_HEADER, OAUTH_AUTHORIZED } from '@/const/auth'; +import { JWTPayload, LOBE_CHAT_AUTH_HEADER, OAUTH_AUTHORIZED, enableClerk } from '@/const/auth'; import { AgentRuntimeError, ChatCompletionErrorPayload } from '@/libs/agent-runtime'; import { ChatErrorType } from '@/types/fetch'; @@ -23,9 +27,21 @@ export const checkAuth = if (!authorization) throw AgentRuntimeError.createError(ChatErrorType.Unauthorized); - // check the Auth With payload + // check the Auth With payload and clerk auth + let clerkAuth = {} as AuthObject; + + if (enableClerk) { + clerkAuth = getAuth(req as NextRequest); + } + jwtPayload = await getJWTPayload(authorization); - checkAuthMethod(jwtPayload.accessCode, jwtPayload.apiKey, oauthAuthorized); + + checkAuthMethod({ + accessCode: jwtPayload.accessCode, + apiKey: jwtPayload.apiKey, + clerkAuth, + nextAuthAuthorized: oauthAuthorized, + }); } catch (e) { const { errorType = ChatErrorType.InternalServerError, diff --git a/src/app/api/chat/auth/utils.ts b/src/app/api/chat/auth/utils.ts index c0cb82bdd65de..f9a808c253846 100644 --- a/src/app/api/chat/auth/utils.ts +++ b/src/app/api/chat/auth/utils.ts @@ -1,7 +1,14 @@ +import { type AuthObject } from '@clerk/backend/internal'; import { importJWK, jwtVerify } from 'jose'; import { getServerConfig } from '@/config/server'; -import { JWTPayload, JWT_SECRET_KEY, NON_HTTP_PREFIX } from '@/const/auth'; +import { + JWTPayload, + JWT_SECRET_KEY, + NON_HTTP_PREFIX, + enableClerk, + enableNextAuth, +} from '@/const/auth'; import { AgentRuntimeError } from '@/libs/agent-runtime'; import { ChatErrorType } from '@/types/fetch'; @@ -30,6 +37,12 @@ export const getJWTPayload = async (token: string): Promise => { return payload as JWTPayload; }; +interface CheckAuthParams { + accessCode?: string; + apiKey?: string; + clerkAuth: AuthObject; + nextAuthAuthorized?: boolean; +} /** * Check if the provided access code is valid, a user API key should be used or the OAuth 2 header is provided. * @@ -38,19 +51,28 @@ export const getJWTPayload = async (token: string): Promise => { * @param {boolean} oauthAuthorized - Whether the OAuth 2 header is provided. * @throws {AgentRuntimeError} If the access code is invalid and no user API key is provided. */ -export const checkAuthMethod = ( - accessCode?: string, - apiKey?: string, - oauthAuthorized?: boolean, -) => { - const { ACCESS_CODES, ENABLE_OAUTH_SSO } = getServerConfig(); +export const checkAuthMethod = ({ + apiKey, + nextAuthAuthorized, + accessCode, + clerkAuth, +}: CheckAuthParams) => { + // clerk auth handler + if (enableClerk) { + // if there is no userId, means the use is not login, just throw error + if (!clerkAuth?.userId) throw AgentRuntimeError.createError(ChatErrorType.InvalidClerkUser); + // if the user is login, just return + else return; + } - // if OAuth 2 header is provided - if (ENABLE_OAUTH_SSO && oauthAuthorized) return; + // if next auth handler is provided + if (enableNextAuth && nextAuthAuthorized) return; // if apiKey exist if (apiKey) return; + const { ACCESS_CODES } = getServerConfig(); + // if accessCode doesn't exist if (!ACCESS_CODES.length) return; diff --git a/src/app/api/plugin/gateway/route.ts b/src/app/api/plugin/gateway/route.ts index 5860e7460e663..832b712735c46 100644 --- a/src/app/api/plugin/gateway/route.ts +++ b/src/app/api/plugin/gateway/route.ts @@ -4,7 +4,7 @@ import { createGatewayOnEdgeRuntime } from '@lobehub/chat-plugins-gateway'; import { getJWTPayload } from '@/app/api/chat/auth/utils'; import { createErrorResponse } from '@/app/api/errorResponse'; import { getServerConfig } from '@/config/server'; -import { LOBE_CHAT_AUTH_HEADER, OAUTH_AUTHORIZED } from '@/const/auth'; +import { LOBE_CHAT_AUTH_HEADER, OAUTH_AUTHORIZED, enableNextAuth } from '@/const/auth'; import { LOBE_CHAT_TRACE_ID, TraceNameMap } from '@/const/trace'; import { AgentRuntimeError } from '@/libs/agent-runtime'; import { TraceClient } from '@/libs/traces'; @@ -14,13 +14,13 @@ import { getTracePayload } from '@/utils/trace'; import { parserPluginSettings } from './settings'; const checkAuth = (accessCode: string | null, oauthAuthorized: boolean | null) => { - const { ACCESS_CODES, PLUGIN_SETTINGS, ENABLE_OAUTH_SSO } = getServerConfig(); + const { ACCESS_CODES, PLUGIN_SETTINGS } = getServerConfig(); // if there is no plugin settings, just skip the auth if (!PLUGIN_SETTINGS) return { auth: true }; // If authorized by oauth - if (oauthAuthorized && ENABLE_OAUTH_SSO) return { auth: true }; + if (oauthAuthorized && enableNextAuth) return { auth: true }; // if accessCode doesn't exist if (!ACCESS_CODES.length) return { auth: true }; diff --git a/src/config/auth.ts b/src/config/auth.ts new file mode 100644 index 0000000000000..01a1b6ec7a2c5 --- /dev/null +++ b/src/config/auth.ts @@ -0,0 +1,146 @@ +/* eslint-disable sort-keys-fix/sort-keys-fix , typescript-sort-keys/interface */ +import { createEnv } from '@t3-oss/env-nextjs'; +import { z } from 'zod'; + +declare global { + // eslint-disable-next-line @typescript-eslint/no-namespace + namespace NodeJS { + interface ProcessEnv { + // ===== Clerk ===== // + NEXT_PUBLIC_CLERK_PUBLISHABLE_KEY?: string; + CLERK_SECRET_KEY?: string; + CLERK_WEBHOOK_SECRET?: string; + + // ===== Next Auth ===== // + /** + * @deprecated + */ + ENABLE_OAUTH_SSO?: string; + NEXT_AUTH_SECRET?: string; + /** + * @deprecated + */ + SSO_PROVIDERS?: string; + NEXT_AUTH_SSO_PROVIDERS?: string; + + AUTH0_CLIENT_ID?: string; + AUTH0_CLIENT_SECRET?: string; + AUTH0_ISSUER?: string; + + // Github + GITHUB_CLIENT_ID?: string; + GITHUB_CLIENT_SECRET?: string; + + // Azure AD + AZURE_AD_CLIENT_ID?: string; + AZURE_AD_CLIENT_SECRET?: string; + AZURE_AD_TENANT_ID?: string; + + // AUTHENTIK + AUTHENTIK_CLIENT_ID?: string; + AUTHENTIK_CLIENT_SECRET?: string; + AUTHENTIK_ISSUER?: string; + + // ZITADEL + ZITADEL_CLIENT_ID?: string; + ZITADEL_CLIENT_SECRET?: string; + ZITADEL_ISSUER?: string; + } + } +} + +export const getAuthConfig = () => { + if (process.env.ENABLE_OAUTH_SSO) { + console.warn( + '`ENABLE_OAUTH_SSO` is deprecated and will be removed in LobeChat 1.0. just set `NEXT_AUTH_SECRET` enough', + ); + } + + if (process.env.SSO_PROVIDERS) { + console.warn( + '`SSO_PROVIDERS` is deprecated and will be removed in LobeChat 1.0. Please replace with `NEXT_AUTH_SSO_PROVIDERS`', + ); + } + + return createEnv({ + client: { + NEXT_PUBLIC_CLERK_PUBLISHABLE_KEY: z.string().optional(), + /** + * whether to enabled clerk + */ + NEXT_PUBLIC_ENABLE_CLERK_AUTH: z.boolean().optional(), + + NEXT_PUBLIC_ENABLE_NEXT_AUTH: z.boolean().optional(), + }, + server: { + // Clerk + CLERK_SECRET_KEY: z.string().optional(), + + // NEXT-AUTH + NEXT_AUTH_SECRET: z.string().optional(), + NEXT_AUTH_SSO_PROVIDERS: z.string().optional().default('auth0'), + + // Auth0 + AUTH0_CLIENT_ID: z.string().optional(), + AUTH0_CLIENT_SECRET: z.string().optional(), + AUTH0_ISSUER: z.string().optional(), + + // Github + GITHUB_CLIENT_ID: z.string().optional(), + GITHUB_CLIENT_SECRET: z.string().optional(), + + // Azure AD + AZURE_AD_CLIENT_ID: z.string().optional(), + AZURE_AD_CLIENT_SECRET: z.string().optional(), + AZURE_AD_TENANT_ID: z.string().optional(), + + // AUTHENTIK + AUTHENTIK_CLIENT_ID: z.string().optional(), + AUTHENTIK_CLIENT_SECRET: z.string().optional(), + AUTHENTIK_ISSUER: z.string().optional(), + + // ZITADEL + ZITADEL_CLIENT_ID: z.string().optional(), + ZITADEL_CLIENT_SECRET: z.string().optional(), + ZITADEL_ISSUER: z.string().optional(), + }, + + runtimeEnv: { + // Clerk + NEXT_PUBLIC_ENABLE_CLERK_AUTH: !!process.env.NEXT_PUBLIC_CLERK_PUBLISHABLE_KEY, + NEXT_PUBLIC_CLERK_PUBLISHABLE_KEY: process.env.NEXT_PUBLIC_CLERK_PUBLISHABLE_KEY, + CLERK_SECRET_KEY: process.env.CLERK_SECRET_KEY, + + // Next Auth + NEXT_PUBLIC_ENABLE_NEXT_AUTH: !!process.env.NEXT_AUTH_SECRET || process.env.ENABLE_OAUTH_SSO, + NEXT_AUTH_SSO_PROVIDERS: process.env.NEXT_AUTH_SSO_PROVIDERS || process.env.SSO_PROVIDERS, + NEXT_AUTH_SECRET: process.env.NEXT_AUTH_SECRET, + + // Auth0 + AUTH0_CLIENT_ID: process.env.AUTH0_CLIENT_ID, + AUTH0_CLIENT_SECRET: process.env.AUTH0_CLIENT_SECRET, + AUTH0_ISSUER: process.env.AUTH0_ISSUER, + + // Github + GITHUB_CLIENT_ID: process.env.GITHUB_CLIENT_ID, + GITHUB_CLIENT_SECRET: process.env.GITHUB_CLIENT_SECRET, + + // Azure AD + AZURE_AD_CLIENT_ID: process.env.AZURE_AD_CLIENT_ID, + AZURE_AD_CLIENT_SECRET: process.env.AZURE_AD_CLIENT_SECRET, + AZURE_AD_TENANT_ID: process.env.AZURE_AD_TENANT_ID, + + // AUTHENTIK + AUTHENTIK_CLIENT_ID: process.env.AUTHENTIK_CLIENT_ID, + AUTHENTIK_CLIENT_SECRET: process.env.AUTHENTIK_CLIENT_SECRET, + AUTHENTIK_ISSUER: process.env.AUTHENTIK_ISSUER, + + // ZITADEL + ZITADEL_CLIENT_ID: process.env.ZITADEL_CLIENT_ID, + ZITADEL_CLIENT_SECRET: process.env.ZITADEL_CLIENT_SECRET, + ZITADEL_ISSUER: process.env.ZITADEL_ISSUER, + }, + }); +}; + +export const authEnv = getAuthConfig(); diff --git a/src/config/server/auth.ts b/src/config/server/auth.ts deleted file mode 100644 index 99ea0a0ed3363..0000000000000 --- a/src/config/server/auth.ts +++ /dev/null @@ -1,71 +0,0 @@ -/* eslint-disable sort-keys-fix/sort-keys-fix , typescript-sort-keys/interface */ - -declare global { - // eslint-disable-next-line @typescript-eslint/no-namespace - namespace NodeJS { - interface ProcessEnv { - ENABLE_OAUTH_SSO?: string; - SSO_PROVIDERS?: string; - - AUTH0_CLIENT_ID?: string; - AUTH0_CLIENT_SECRET?: string; - AUTH0_ISSUER?: string; - - // Github - GITHUB_CLIENT_ID?: string; - GITHUB_CLIENT_SECRET?: string; - - // Azure AD - AZURE_AD_CLIENT_ID?: string; - AZURE_AD_CLIENT_SECRET?: string; - AZURE_AD_TENANT_ID?: string; - - // AUTHENTIK - AUTHENTIK_CLIENT_ID?: string; - AUTHENTIK_CLIENT_SECRET?: string; - AUTHENTIK_ISSUER?: string; - - // ZITADEL - ZITADEL_CLIENT_ID?: string; - ZITADEL_CLIENT_SECRET?: string; - ZITADEL_ISSUER?: string; - NEXTAUTH_SECRET?: string; - } - } -} - -export const getAuthConfig = () => { - if (typeof process === 'undefined') { - throw new Error('[Server Config] you are importing a server-only module outside of server'); - } - - return { - ENABLE_OAUTH_SSO: !!process.env.ENABLE_OAUTH_SSO, - SSO_PROVIDERS: process.env.SSO_PROVIDERS || 'auth0', - - // Auth0 - AUTH0_CLIENT_ID: process.env.AUTH0_CLIENT_ID || '', - AUTH0_CLIENT_SECRET: process.env.AUTH0_CLIENT_SECRET || '', - AUTH0_ISSUER: process.env.AUTH0_ISSUER || '', - - // Github - GITHUB_CLIENT_ID: process.env.GITHUB_CLIENT_ID || '', - GITHUB_CLIENT_SECRET: process.env.GITHUB_CLIENT_SECRET || '', - - // Azure AD - AZURE_AD_CLIENT_ID: process.env.AZURE_AD_CLIENT_ID || '', - AZURE_AD_CLIENT_SECRET: process.env.AZURE_AD_CLIENT_SECRET || '', - AZURE_AD_TENANT_ID: process.env.AZURE_AD_TENANT_ID || '', - - // AUTHENTIK - AUTHENTIK_CLIENT_ID: process.env.AUTHENTIK_CLIENT_ID || '', - AUTHENTIK_CLIENT_SECRET: process.env.AUTHENTIK_CLIENT_SECRET || '', - AUTHENTIK_ISSUER: process.env.AUTHENTIK_ISSUER || '', - - // ZITADEL - ZITADEL_CLIENT_ID: process.env.ZITADEL_CLIENT_ID || '', - ZITADEL_CLIENT_SECRET: process.env.ZITADEL_CLIENT_SECRET || '', - ZITADEL_ISSUER: process.env.ZITADEL_ISSUER || '', - NEXTAUTH_SECRET: process.env.NEXTAUTH_SECRET || '', - }; -}; diff --git a/src/config/server/index.ts b/src/config/server/index.ts index 6cfde4ddb29bd..cf221cd65a989 100644 --- a/src/config/server/index.ts +++ b/src/config/server/index.ts @@ -1,6 +1,5 @@ import { getAnalyticsConfig } from './analytics'; import { getAppConfig } from './app'; -import { getAuthConfig } from './auth'; import { getProviderConfig } from './provider'; export const getServerConfig = () => { @@ -10,8 +9,7 @@ export const getServerConfig = () => { const provider = getProviderConfig(); const app = getAppConfig(); - const auth = getAuthConfig(); const analytics = getAnalyticsConfig(); - return { ...provider, ...app, ...analytics, ...auth }; + return { ...provider, ...app, ...analytics }; }; diff --git a/src/const/auth.ts b/src/const/auth.ts index 5c148dfe347e8..ff9d723b5f298 100644 --- a/src/const/auth.ts +++ b/src/const/auth.ts @@ -1,3 +1,10 @@ +import { authEnv } from '@/config/auth'; + +export const enableClerk = authEnv.NEXT_PUBLIC_ENABLE_CLERK_AUTH; +export const enableNextAuth = authEnv.NEXT_PUBLIC_ENABLE_NEXT_AUTH; +export const enableAuth = + authEnv.NEXT_PUBLIC_ENABLE_CLERK_AUTH || authEnv.NEXT_PUBLIC_ENABLE_NEXT_AUTH; + export const LOBE_CHAT_AUTH_HEADER = 'X-lobe-chat-auth'; export const OAUTH_AUTHORIZED = 'X-oauth-authorized'; diff --git a/src/features/Conversation/Error/ClerkLogin/index.tsx b/src/features/Conversation/Error/ClerkLogin/index.tsx new file mode 100644 index 0000000000000..407d90ee8ef3e --- /dev/null +++ b/src/features/Conversation/Error/ClerkLogin/index.tsx @@ -0,0 +1,47 @@ +import { Button } from 'antd'; +import { memo } from 'react'; +import { useTranslation } from 'react-i18next'; + +import UserLoginOrSignup from '@/features/User/UserLoginOrSignup'; +import { useGreeting } from '@/hooks/useGreeting'; +import { useChatStore } from '@/store/chat'; +import { useUserStore } from '@/store/user'; +import { userProfileSelectors } from '@/store/user/selectors'; + +import { ErrorActionContainer, FormAction } from '../style'; + +const ClerkLogin = memo<{ id: string }>(({ id }) => { + const { t } = useTranslation('error'); + const [openSignIn, isSignedIn] = useUserStore((s) => [s.openLogin, s.isSignedIn]); + const greeting = useGreeting(); + const nickName = useUserStore(userProfileSelectors.nickName); + const [resend, deleteMessage] = useChatStore((s) => [s.internalResendMessage, s.deleteMessage]); + + return ( + + {isSignedIn ? ( + + + + ) : ( + + )} + + ); +}); + +export default ClerkLogin; diff --git a/src/features/Conversation/Error/index.tsx b/src/features/Conversation/Error/index.tsx index bc29efbc000d1..e41528991dec9 100644 --- a/src/features/Conversation/Error/index.tsx +++ b/src/features/Conversation/Error/index.tsx @@ -6,6 +6,7 @@ import { AgentRuntimeErrorType, ILobeAgentRuntimeErrorType } from '@/libs/agent- import { ChatErrorType, ErrorType } from '@/types/fetch'; import { ChatMessage, ChatMessageError } from '@/types/message'; +import ClerkLogin from './ClerkLogin'; import ErrorJsonViewer from './ErrorJsonViewer'; import InvalidAPIKey from './InvalidAPIKey'; import InvalidAccessCode from './InvalidAccessCode'; @@ -63,6 +64,10 @@ const ErrorMessageExtra = memo<{ data: ChatMessage }>(({ data }) => { return ; } + case ChatErrorType.InvalidClerkUser: { + return ; + } + case ChatErrorType.InvalidAccessCode: { return ; } diff --git a/src/features/Conversation/components/InboxWelcome/index.tsx b/src/features/Conversation/components/InboxWelcome/index.tsx index aa8c1b97b7584..a61666769361c 100644 --- a/src/features/Conversation/components/InboxWelcome/index.tsx +++ b/src/features/Conversation/components/InboxWelcome/index.tsx @@ -2,10 +2,11 @@ import { FluentEmoji, Markdown } from '@lobehub/ui'; import { createStyles } from 'antd-style'; -import { memo, useEffect, useState } from 'react'; +import { memo } from 'react'; import { useTranslation } from 'react-i18next'; import { Center, Flexbox } from 'react-layout-kit'; +import { useGreeting } from '@/hooks/useGreeting'; import { useIsMobile } from '@/hooks/useIsMobile'; import AgentsSuggest from './AgentsSuggest'; @@ -40,30 +41,16 @@ const useStyles = createStyles(({ css, responsive }) => ({ const InboxWelcome = memo(() => { const { t } = useTranslation('welcome'); - const [greeting, setGreeting] = useState<'morning' | 'noon' | 'afternoon' | 'night'>(); const { styles } = useStyles(); const mobile = useIsMobile(); - useEffect(() => { - const now = new Date(); - const hours = now.getHours(); - - if (hours >= 4 && hours < 11) { - setGreeting('morning'); - } else if (hours >= 11 && hours < 14) { - setGreeting('noon'); - } else if (hours >= 14 && hours < 18) { - setGreeting('afternoon'); - } else { - setGreeting('night'); - } - }, []); + const greeting = useGreeting(); return (
-

{greeting && t(`guide.welcome.${greeting}`)}

+

{greeting}

{t('guide.defaultMessage')} diff --git a/src/features/User/UserAvatar.tsx b/src/features/User/UserAvatar.tsx index 01834a61f7d8b..85c0c74db696b 100644 --- a/src/features/User/UserAvatar.tsx +++ b/src/features/User/UserAvatar.tsx @@ -6,7 +6,7 @@ import { memo } from 'react'; import { DEFAULT_USER_AVATAR_URL } from '@/const/meta'; import { useUserStore } from '@/store/user'; -import { userProfileSelectors } from '@/store/user/selectors'; +import { authSelectors, userProfileSelectors } from '@/store/user/selectors'; const useStyles = createStyles(({ css, token }) => ({ clickable: css` @@ -47,12 +47,18 @@ export interface UserAvatarProps extends AvatarProps { const UserAvatar = memo( ({ size = 40, background, clickable, className, ...rest }) => { const { styles, cx } = useStyles(); - const avatar = useUserStore(userProfileSelectors.userAvatar); + const [avatar, username] = useUserStore((s) => [ + userProfileSelectors.userAvatar(s), + userProfileSelectors.username(s), + ]); + + const isSignedIn = useUserStore(authSelectors.isLogin); + return ( ({ nickname: css` font-size: 16px; @@ -28,10 +27,12 @@ export interface UserInfoProps extends FlexboxProps { } const UserInfo = memo(({ avatarProps, ...rest }) => { - const { t } = useTranslation('common'); const { styles, theme } = useStyles(); - const DEFAULT_NICKNAME = t('userPanel.defaultNickname'); + const [nickname, username] = useUserStore((s) => [ + userProfileSelectors.nickName(s), + userProfileSelectors.username(s), + ]); return ( (({ avatarProps, ...rest }) => { -
{DEFAULT_NICKNAME}
-
{DEFAULT_USERNAME}
+
{nickname}
+
{username}
diff --git a/src/features/User/UserLoginOrSignup.tsx b/src/features/User/UserLoginOrSignup.tsx new file mode 100644 index 0000000000000..77d072e8f44c9 --- /dev/null +++ b/src/features/User/UserLoginOrSignup.tsx @@ -0,0 +1,23 @@ +import { Button } from 'antd'; +import { memo } from 'react'; +import { useTranslation } from 'react-i18next'; +import { Flexbox } from 'react-layout-kit'; + +import UserInfo from '@/features/User/UserInfo'; + +const UserLoginOrSignup = memo<{ onClick: () => void }>(({ onClick }) => { + const { t } = useTranslation('auth'); + + return ( + <> + + + + + + ); +}); + +export default UserLoginOrSignup; diff --git a/src/features/User/UserPanel/PanelContent.tsx b/src/features/User/UserPanel/PanelContent.tsx new file mode 100644 index 0000000000000..b84f9206db98b --- /dev/null +++ b/src/features/User/UserPanel/PanelContent.tsx @@ -0,0 +1,74 @@ +import { useRouter } from 'next/navigation'; +import { memo } from 'react'; +import { Flexbox } from 'react-layout-kit'; + +import BrandWatermark from '@/components/BrandWatermark'; +import Menu from '@/components/Menu'; +import { enableAuth } from '@/const/auth'; +import { useUserStore } from '@/store/user'; +import { authSelectors } from '@/store/user/selectors'; + +import UserInfo from '../UserInfo'; +import UserLoginOrSignup from '../UserLoginOrSignup'; +import LangButton from './LangButton'; +import ThemeButton from './ThemeButton'; +import { useMenu } from './useMenu'; + +const PanelContent = memo<{ closePopover: () => void }>(({ closePopover }) => { + const router = useRouter(); + const isLoginWithAuth = useUserStore(authSelectors.isLoginWithAuth); + const [openSignIn, signOut, openUserProfile] = useUserStore((s) => [ + s.openLogin, + s.logout, + s.openUserProfile, + ]); + const { mainItems, logoutItems } = useMenu(); + + const handleOpenProfile = () => { + if (!enableAuth) return; + openUserProfile(); + closePopover(); + }; + + const handleSignIn = () => { + openSignIn(); + closePopover(); + }; + + const handleSignOut = () => { + signOut(); + closePopover(); + router.push('/login'); + }; + + return ( + + {!enableAuth ? ( + + ) : isLoginWithAuth ? ( + + ) : ( + + )} + + + {isLoginWithAuth ? ( + + ) : ( + + )} + + + + + + + ); +}); + +export default PanelContent; diff --git a/src/features/User/UserPanel/Popover.tsx b/src/features/User/UserPanel/Popover.tsx deleted file mode 100644 index 616c9aec8fc27..0000000000000 --- a/src/features/User/UserPanel/Popover.tsx +++ /dev/null @@ -1,35 +0,0 @@ -import { memo } from 'react'; -import { Flexbox } from 'react-layout-kit'; - -import BrandWatermark from '@/components/BrandWatermark'; -import Menu from '@/components/Menu'; - -import UserInfo from '../UserInfo'; -import LangButton from './LangButton'; -import ThemeButton from './ThemeButton'; -import { useMenu } from './useMenu'; - -const PopoverContent = memo<{ closePopover: () => void }>(({ closePopover }) => { - const { mainItems } = useMenu(); - - return ( - - - - - - - - - - - - ); -}); - -export default PopoverContent; diff --git a/src/features/User/UserPanel/UpgradeBadge.tsx b/src/features/User/UserPanel/UpgradeBadge.tsx new file mode 100644 index 0000000000000..d258c31fe71c2 --- /dev/null +++ b/src/features/User/UserPanel/UpgradeBadge.tsx @@ -0,0 +1,19 @@ +import { Badge, ConfigProvider } from 'antd'; +import { PropsWithChildren, memo } from 'react'; +import { Flexbox } from 'react-layout-kit'; + +const UpgradeBadge = memo(({ children, showBadge }: PropsWithChildren<{ showBadge?: boolean }>) => { + if (!showBadge) return children; + + return ( + + + + {children} + + + + ); +}); + +export default UpgradeBadge; diff --git a/src/features/User/UserPanel/index.tsx b/src/features/User/UserPanel/index.tsx index d3b70a2e3e621..e048f0983d0dc 100644 --- a/src/features/User/UserPanel/index.tsx +++ b/src/features/User/UserPanel/index.tsx @@ -1,11 +1,11 @@ 'use client'; -import { Badge, ConfigProvider, Popover } from 'antd'; +import { Popover } from 'antd'; import { createStyles } from 'antd-style'; -import { PropsWithChildren, memo, useCallback, useState } from 'react'; -import { Flexbox } from 'react-layout-kit'; +import { PropsWithChildren, memo, useState } from 'react'; -import PopoverContent from './Popover'; +import PanelContent from './PanelContent'; +import UpgradeBadge from './UpgradeBadge'; import { useNewVersion } from './useNewVersion'; const useStyles = createStyles(({ css }) => ({ @@ -20,40 +20,21 @@ const UserPanel = memo(({ children }) => { const [open, setOpen] = useState(false); const { styles } = useStyles(); - const AvatarBadge = useCallback( - ({ children: badgeChildren, showBadge }: PropsWithChildren<{ showBadge?: boolean }>) => { - if (!showBadge) return badgeChildren; - - return ( - - - - {badgeChildren} - - - - ); - }, - [], - ); - return ( - + setOpen(false)} />} + content={ setOpen(false)} />} onOpenChange={setOpen} open={open} - overlayInnerStyle={{ - padding: 0, - }} + overlayInnerStyle={{ padding: 0 }} placement={'topRight'} rootClassName={styles.popover} trigger={['click']} > {children} - + ); }); diff --git a/src/features/User/UserPanel/useMenu.tsx b/src/features/User/UserPanel/useMenu.tsx index 2e3251e30c7a7..5fff7ee296220 100644 --- a/src/features/User/UserPanel/useMenu.tsx +++ b/src/features/User/UserPanel/useMenu.tsx @@ -2,48 +2,53 @@ import { ActionIcon, DiscordIcon, Icon } from '@lobehub/ui'; import { Badge } from 'antd'; import { Book, + CircleUserRound, Feather, HardDriveDownload, HardDriveUpload, LifeBuoy, + LogOut, Mail, Maximize, Settings2, } from 'lucide-react'; import Link from 'next/link'; -import { PropsWithChildren, useCallback } from 'react'; +import { PropsWithChildren, memo } from 'react'; import { useTranslation } from 'react-i18next'; import { Flexbox } from 'react-layout-kit'; import urlJoin from 'url-join'; -import { type MenuProps } from '@/components/Menu'; +import type { MenuProps } from '@/components/Menu'; import { DISCORD, DOCUMENTS, EMAIL_SUPPORT, GITHUB_ISSUES } from '@/const/url'; import DataImporter from '@/features/DataImporter'; import { useOpenSettings } from '@/hooks/useInterceptingRoutes'; import { useQueryRoute } from '@/hooks/useQueryRoute'; import { configService } from '@/services/config'; import { SettingsTabs } from '@/store/global/initialState'; +import { useUserStore } from '@/store/user'; +import { authSelectors } from '@/store/user/selectors'; import { useNewVersion } from './useNewVersion'; +const NewVersionBadge = memo( + ({ children, showBadge }: PropsWithChildren & { showBadge?: boolean }) => { + const { t } = useTranslation('common'); + if (!showBadge) return children; + return ( + + {children} + + + ); + }, +); + export const useMenu = () => { const router = useQueryRoute(); const hasNewVersion = useNewVersion(); const openSettings = useOpenSettings(); - const { t } = useTranslation(['common', 'setting']); - - const NewVersionBadge = useCallback( - ({ children, showBadge }: PropsWithChildren & { showBadge?: boolean }) => { - if (!showBadge) return children; - return ( - - {children} - - - ); - }, - [t], - ); + const { t } = useTranslation(['common', 'setting', 'auth']); + const isSignedIn = useUserStore(authSelectors.isLoginWithAuth); const settings: MenuProps['items'] = [ { @@ -109,6 +114,22 @@ export const useMenu = () => { }, ]; + const openUserProfile = useUserStore((s) => s.openUserProfile); + + const planAndBilling: MenuProps['items'] = [ + { + icon: , + key: 'profile', + label: t('userPanel.profile'), + onClick: () => { + openUserProfile(); + }, + }, + { + type: 'divider', + }, + ]; + const helps: MenuProps['items'] = [ { icon: , @@ -153,6 +174,9 @@ export const useMenu = () => { key: 'help', label: t('userPanel.help'), }, + { + type: 'divider', + }, ]; const mainItems = [ @@ -160,14 +184,18 @@ export const useMenu = () => { type: 'divider', }, ...settings, + ...(isSignedIn ? planAndBilling : []), ...exports, ...helps, + ].filter(Boolean) as MenuProps['items']; + + const logoutItems: MenuProps['items'] = [ { - type: 'divider', + icon: , + key: 'logout', + label: {t('signout', { ns: 'auth' })}, }, - ].filter(Boolean) as MenuProps['items']; + ]; - return { - mainItems, - }; + return { logoutItems, mainItems }; }; diff --git a/src/features/User/__tests__/PanelContent.test.tsx b/src/features/User/__tests__/PanelContent.test.tsx new file mode 100644 index 0000000000000..4a66129d3a3e1 --- /dev/null +++ b/src/features/User/__tests__/PanelContent.test.tsx @@ -0,0 +1,151 @@ +import { act, render, screen } from '@testing-library/react'; +import { afterEach, describe, expect, it, vi } from 'vitest'; + +import { useUserStore } from '@/store/user'; + +import PanelContent from '../UserPanel/PanelContent'; + +// Mock dependencies +vi.mock('zustand/traditional'); + +vi.mock('next/navigation', () => ({ + useRouter: vi.fn(() => ({ + push: vi.fn(), + })), +})); + +vi.mock('@/components/BrandWatermark', () => ({ + default: vi.fn(() =>
Mocked BrandWatermark
), +})); + +vi.mock('@/components/Menu', () => ({ + default: vi.fn(({ items, onClick }) => ( +
+ Mocked Menu + {items.map((item: any) => ( + + ))} +
+ )), +})); + +vi.mock('../UserInfo', () => ({ + default: vi.fn(({ onClick }) => ( + + )), +})); + +vi.mock('../UserPanel/useMenu', () => ({ + useMenu: vi.fn(() => ({ + logoutItems: [{ key: 'logout', label: 'Logout' }], + mainItems: [ + { key: 'item1', label: 'Main Item 1' }, + { key: 'item2', label: 'Main Item 2' }, + ], + })), +})); + +vi.mock('../UserLoginOrSignup', () => ({ + default: vi.fn(({ onClick }) => ( + + )), +})); + +// 定义一个变量来存储 enableAuth 的值 +let enableAuth = true; + +// 模拟 @/const/auth 模块 +vi.mock('@/const/auth', () => ({ + get enableAuth() { + return enableAuth; + }, +})); + +afterEach(() => { + enableAuth = true; +}); + +describe('PanelContent', () => { + const closePopover = vi.fn(); + + describe('enable auth', () => { + it('should render UserInfo when user is signed in', () => { + act(() => { + useUserStore.setState({ isSignedIn: true }); + }); + + render(); + + expect(screen.getByText('Mocked UserInfo')).toBeInTheDocument(); + expect(screen.queryByText('Mocked SignInBlock')).not.toBeInTheDocument(); + }); + + it('should render SignInBlock when user is not signed in and enable auth', () => { + act(() => { + useUserStore.setState({ isSignedIn: false }); + }); + + render(); + + expect(screen.getByText('Mocked SignInBlock')).toBeInTheDocument(); + expect(screen.queryByText('Mocked UserInfo')).not.toBeInTheDocument(); + }); + + it('should render logout items when user is signed in', () => { + act(() => { + useUserStore.setState({ isSignedIn: true }); + }); + + render(); + + expect(screen.getAllByText('Mocked Menu').length).toBe(2); + }); + + it('should render BrandWatermark when user is not signed in', () => { + act(() => { + useUserStore.setState({ isSignedIn: false }); + }); + + render(); + + expect(screen.getByText('Mocked BrandWatermark')).toBeInTheDocument(); + }); + }); + + describe('disable auth', () => { + it('should render UserInfo', () => { + act(() => { + useUserStore.setState({ isSignedIn: true }); + }); + + render(); + + expect(screen.getByText('Mocked UserInfo')).toBeInTheDocument(); + expect(screen.queryByText('Mocked SignInBlock')).not.toBeInTheDocument(); + }); + + it('should render BrandWatermark when disable auth', () => { + enableAuth = false; + + act(() => { + useUserStore.setState({ isSignedIn: false }); + }); + + render(); + + expect(screen.getByText('Mocked BrandWatermark')).toBeInTheDocument(); + }); + }); + + it('should render Menu with main items', () => { + render(); + + expect(screen.getByText('Mocked Menu')).toBeInTheDocument(); + }); +}); diff --git a/src/features/User/__tests__/UserAvatar.test.tsx b/src/features/User/__tests__/UserAvatar.test.tsx new file mode 100644 index 0000000000000..18e5ada92bb27 --- /dev/null +++ b/src/features/User/__tests__/UserAvatar.test.tsx @@ -0,0 +1,78 @@ +import { act, render, screen } from '@testing-library/react'; +import { afterEach, describe, expect, it, vi } from 'vitest'; + +import { DEFAULT_USER_AVATAR_URL } from '@/const/meta'; +import { useUserStore } from '@/store/user'; + +import UserAvatar from '../UserAvatar'; + +vi.mock('zustand/traditional'); + +// 定义一个变量来存储 enableAuth 的值 +let enableAuth = true; + +// 模拟 @/const/auth 模块 +vi.mock('@/const/auth', () => ({ + get enableAuth() { + return enableAuth; + }, +})); + +afterEach(() => { + enableAuth = true; +}); + +describe('UserAvatar', () => { + describe('enable Auth', () => { + it('should show the username and avatar are displayed when the user is logged in', async () => { + const mockAvatar = 'https://example.com/avatar.png'; + const mockUsername = 'teeeeeestuser'; + + act(() => { + useUserStore.setState({ + isSignedIn: true, + user: { avatar: mockAvatar, id: 'abc', username: mockUsername }, + }); + }); + + render(); + + expect(screen.getByAltText(mockUsername)).toBeInTheDocument(); + expect(screen.getByAltText(mockUsername)).toHaveAttribute('src', mockAvatar); + }); + + it('should show default avatar when the user is logged in but have no custom avatar', () => { + const mockUsername = 'testuser'; + + act(() => { + useUserStore.setState({ isSignedIn: true, user: { id: 'bbb', username: mockUsername } }); + }); + + render(); + expect(screen.getByAltText('testuser')).toHaveAttribute('src', DEFAULT_USER_AVATAR_URL); + }); + + it('should show LobeChat and default avatar when the user is not logged in and enable auth', () => { + act(() => { + useUserStore.setState({ isSignedIn: false, user: undefined }); + }); + + render(); + expect(screen.getByAltText('LobeChat')).toBeInTheDocument(); + expect(screen.getByAltText('LobeChat')).toHaveAttribute('src', DEFAULT_USER_AVATAR_URL); + }); + }); + + describe('disable Auth', () => { + it('should show LobeChat and default avatar when the user is not logged in and disabled auth', () => { + enableAuth = false; + act(() => { + useUserStore.setState({ isSignedIn: false, user: undefined }); + }); + + render(); + expect(screen.getByAltText('LobeChat')).toBeInTheDocument(); + expect(screen.getByAltText('LobeChat')).toHaveAttribute('src', DEFAULT_USER_AVATAR_URL); + }); + }); +}); diff --git a/src/hooks/useGreeting/greetingTime.ts b/src/hooks/useGreeting/greetingTime.ts new file mode 100644 index 0000000000000..bf2697063253e --- /dev/null +++ b/src/hooks/useGreeting/greetingTime.ts @@ -0,0 +1,14 @@ +export const parseGreetingTime = () => { + const now = new Date(); + const hours = now.getHours(); + + if (hours >= 4 && hours < 11) { + return 'morning'; + } else if (hours >= 11 && hours < 14) { + return 'noon'; + } else if (hours >= 14 && hours < 18) { + return 'afternoon'; + } else { + return 'night'; + } +}; diff --git a/src/hooks/useGreeting/index.ts b/src/hooks/useGreeting/index.ts new file mode 100644 index 0000000000000..b536f0d661f75 --- /dev/null +++ b/src/hooks/useGreeting/index.ts @@ -0,0 +1,16 @@ +import { useEffect, useState } from 'react'; +import { useTranslation } from 'react-i18next'; + +import { parseGreetingTime } from './greetingTime'; + +export const useGreeting = () => { + const { t } = useTranslation('welcome'); + + const [greeting, setGreeting] = useState<'morning' | 'noon' | 'afternoon' | 'night'>(); + + useEffect(() => { + setGreeting(parseGreetingTime()); + }, []); + + return greeting && t(`guide.welcome.${greeting}`); +}; diff --git a/src/layout/AuthProvider/Clerk/UserUpdater.tsx b/src/layout/AuthProvider/Clerk/UserUpdater.tsx new file mode 100644 index 0000000000000..859bcf9ca80f1 --- /dev/null +++ b/src/layout/AuthProvider/Clerk/UserUpdater.tsx @@ -0,0 +1,41 @@ +'use client'; + +import { useClerk, useUser } from '@clerk/nextjs'; +import { memo } from 'react'; +import { createStoreUpdater } from 'zustand-utils'; + +import { useUserStore } from '@/store/user'; +import { LobeUser } from '@/types/user'; + +// update the user data into the context +const UserUpdater = memo(() => { + const { isLoaded, user, isSignedIn } = useUser(); + + const { session, openUserProfile, signOut, openSignIn } = useClerk(); + + const useStoreUpdater = createStoreUpdater(useUserStore); + + const lobeUser = { + avatar: user?.imageUrl, + firstName: user?.firstName, + fullName: user?.fullName, + id: user?.id, + latestName: user?.lastName, + username: user?.username, + } as LobeUser; + + useStoreUpdater('isLoaded', isLoaded); + useStoreUpdater('user', lobeUser); + useStoreUpdater('isSignedIn', isSignedIn); + useStoreUpdater('userId', user?.id); + + useStoreUpdater('clerkUser', user); + useStoreUpdater('clerkSession', session); + useStoreUpdater('clerkSignIn', openSignIn); + useStoreUpdater('clerkOpenUserProfile', openUserProfile); + useStoreUpdater('clerkSignOut', signOut); + + return null; +}); + +export default UserUpdater; diff --git a/src/layout/AuthProvider/Clerk/index.tsx b/src/layout/AuthProvider/Clerk/index.tsx new file mode 100644 index 0000000000000..05531ff4a1cfb --- /dev/null +++ b/src/layout/AuthProvider/Clerk/index.tsx @@ -0,0 +1,26 @@ +'use client'; + +import { ClerkProvider } from '@clerk/nextjs'; +import { PropsWithChildren, memo, useMemo } from 'react'; +import { useTranslation } from 'react-i18next'; + +import UserUpdater from './UserUpdater'; +import { useAppearance } from './useAppearance'; + +const Clerk = memo(({ children }: PropsWithChildren) => { + const appearance = useAppearance(); + const { + i18n: { language, getResourceBundle }, + } = useTranslation('clerk'); + + const localization = useMemo(() => getResourceBundle(language, 'clerk'), [language]); + + return ( + + {children} + + + ); +}); + +export default Clerk; diff --git a/src/layout/AuthProvider/Clerk/useAppearance.ts b/src/layout/AuthProvider/Clerk/useAppearance.ts new file mode 100644 index 0000000000000..9c21addf5d221 --- /dev/null +++ b/src/layout/AuthProvider/Clerk/useAppearance.ts @@ -0,0 +1,118 @@ +'use client'; + +import { dark } from '@clerk/themes'; +import { ElementsConfig, Theme } from '@clerk/types'; +import { createStyles, useThemeMode } from 'antd-style'; + +const prefixCls = 'cl'; + +export const useStyles = createStyles( + ({ css, token }) => + ({ + avatarBox: css` + width: 40px; + height: 40px; + `, + cardBox: css` + border-radius: ${token.borderRadiusLG}px; + box-shadow: 0 0 0 1px ${token.colorBorderSecondary}; + `, + header: css` + gap: 1em; + `, + logoBox: css` + height: 48px; + `, + modalBackdrop: css` + background: ${token.colorBgMask}; + backdrop-filter: blur(2px); + `, + modalContent: css` + &.${prefixCls}-modalContent { + .${prefixCls}-cardBox { + border: 1px solid ${token.colorSplit} !important; + border-radius: ${token.borderRadiusLG}px !important; + box-shadow: ${token.boxShadow} !important; + } + + .${prefixCls}-userProfile-root { + width: min(80vw, 55rem); + height: min(80vh, 44rem); + } + } + `, + navbar: css` + background: ${token.colorBgContainer}; + `, + navbarButton: css` + line-height: 2; + `, + pageScrollBox: css` + align-self: center; + width: 100%; + max-width: 1024px; + `, + rootBox: css` + &.${prefixCls}-userProfile-root { + width: 100%; + height: 100%; + + .${prefixCls}-cardBox { + width: 100%; + height: 100%; + + border: unset; + border-radius: unset; + box-shadow: unset; + } + } + `, + scrollBox: css` + background: ${token.colorBgLayout}; + border: unset; + border-radius: unset; + box-shadow: 0 1px 0 1px ${token.colorSplit}; + `, + socialButtons: css` + display: flex; + flex-direction: column; + `, + socialButtonsBlockButton__github: css` + order: 1; + `, + socialButtonsBlockButton__google: css` + order: -1; + `, + }) as Partial<{ + [k in keyof ElementsConfig]: any; + }>, +); + +export const useAppearance = () => { + const { isDarkMode } = useThemeMode(); + const { styles, theme } = useStyles(); + + return { + baseTheme: isDarkMode ? dark : undefined, + elements: styles, + layout: { + helpPageUrl: 'https://lobehub.com/docs', + privacyPageUrl: 'https://lobehub.com/privacy', + socialButtonsVariant: 'blockButton', + termsPageUrl: 'https://lobehub.com/terms', + }, + variables: { + borderRadius: `${theme.borderRadius}px`, + colorBackground: theme.colorBgContainer, + colorDanger: theme.colorError, + colorInputBackground: theme.colorFillTertiary, + colorNeutral: theme.colorText, + colorPrimary: theme.colorPrimary, + colorSuccess: theme.colorSuccess, + colorText: theme.colorText, + colorTextSecondary: theme.colorTextDescription, + colorWarning: theme.colorWarning, + fontSize: `${theme.fontSize}px`, + }, + } as Theme; +}; diff --git a/src/layout/AuthProvider/index.tsx b/src/layout/AuthProvider/index.tsx index 1bc64e6fad414..0d8435b219ac6 100644 --- a/src/layout/AuthProvider/index.tsx +++ b/src/layout/AuthProvider/index.tsx @@ -1,12 +1,16 @@ import { PropsWithChildren } from 'react'; -import { getServerConfig } from '@/config/server'; +import { authEnv } from '@/config/auth'; +import Clerk from './Clerk'; import NextAuth from './NextAuth'; -const { ENABLE_OAUTH_SSO = false } = getServerConfig(); +const AuthProvider = ({ children }: PropsWithChildren) => { + if (authEnv.NEXT_PUBLIC_ENABLE_CLERK_AUTH) return {children}; -const AuthProvider = ({ children }: PropsWithChildren) => - ENABLE_OAUTH_SSO ? {children} : children; + if (authEnv.NEXT_PUBLIC_ENABLE_NEXT_AUTH) return {children}; + + return children; +}; export default AuthProvider; diff --git a/src/libs/next-auth/index.ts b/src/libs/next-auth/index.ts index c994a586c4b4f..1fdfb2a8f11ac 100644 --- a/src/libs/next-auth/index.ts +++ b/src/libs/next-auth/index.ts @@ -1,14 +1,12 @@ import NextAuth from 'next-auth'; -import { getServerConfig } from '@/config/server'; +import { authEnv } from '@/config/auth'; import { ssoProviders } from './sso-providers'; -const { NEXTAUTH_SECRET, ENABLE_OAUTH_SSO, SSO_PROVIDERS } = getServerConfig(); - export const initSSOProviders = () => { - return ENABLE_OAUTH_SSO - ? SSO_PROVIDERS.split(/[,,]/).map((provider) => { + return authEnv.NEXT_PUBLIC_ENABLE_NEXT_AUTH + ? authEnv.NEXT_AUTH_SSO_PROVIDERS.split(/[,,]/).map((provider) => { const validProvider = ssoProviders.find((item) => item.id === provider); if (validProvider) return validProvider.provider; @@ -38,7 +36,7 @@ const nextAuth = NextAuth({ }, }, providers: initSSOProviders(), - secret: NEXTAUTH_SECRET, + secret: authEnv.NEXT_AUTH_SECRET, trustHost: true, }); diff --git a/src/libs/next-auth/sso-providers/auth0.ts b/src/libs/next-auth/sso-providers/auth0.ts index e6a4d46093db3..715594f225f1f 100644 --- a/src/libs/next-auth/sso-providers/auth0.ts +++ b/src/libs/next-auth/sso-providers/auth0.ts @@ -1,8 +1,6 @@ import Auth0 from 'next-auth/providers/auth0'; -import { getServerConfig } from '@/config/server'; - -const { AUTH0_CLIENT_ID, AUTH0_CLIENT_SECRET, AUTH0_ISSUER } = getServerConfig(); +import { authEnv } from '@/config/auth'; const provider = { id: 'auth0', @@ -10,9 +8,9 @@ const provider = { // Specify auth scope, at least include 'openid email' // all scopes in Auth0 ref: https://auth0.com/docs/get-started/apis/scopes/openid-connect-scopes#standard-claims authorization: { params: { scope: 'openid email profile' } }, - clientId: AUTH0_CLIENT_ID, - clientSecret: AUTH0_CLIENT_SECRET, - issuer: AUTH0_ISSUER, + clientId: authEnv.AUTH0_CLIENT_ID, + clientSecret: authEnv.AUTH0_CLIENT_SECRET, + issuer: authEnv.AUTH0_ISSUER, }), }; diff --git a/src/libs/next-auth/sso-providers/authentik.ts b/src/libs/next-auth/sso-providers/authentik.ts index a655241c3b1b2..b1d9322b503e6 100644 --- a/src/libs/next-auth/sso-providers/authentik.ts +++ b/src/libs/next-auth/sso-providers/authentik.ts @@ -1,8 +1,6 @@ import Authentik from 'next-auth/providers/authentik'; -import { getServerConfig } from '@/config/server'; - -const { AUTHENTIK_CLIENT_ID, AUTHENTIK_CLIENT_SECRET, AUTHENTIK_ISSUER } = getServerConfig(); +import { authEnv } from '@/config/auth'; const provider = { id: 'authentik', @@ -10,9 +8,9 @@ const provider = { // Specify auth scope, at least include 'openid email' // all scopes in Authentik ref: https://goauthentik.io/docs/providers/oauth2 authorization: { params: { scope: 'openid email profile' } }, - clientId: AUTHENTIK_CLIENT_ID, - clientSecret: AUTHENTIK_CLIENT_SECRET, - issuer: AUTHENTIK_ISSUER, + clientId: authEnv.AUTHENTIK_CLIENT_ID, + clientSecret: authEnv.AUTHENTIK_CLIENT_SECRET, + issuer: authEnv.AUTHENTIK_ISSUER, }), }; diff --git a/src/libs/next-auth/sso-providers/azure-ad.ts b/src/libs/next-auth/sso-providers/azure-ad.ts index 4552370b71363..b9bf07c3663ef 100644 --- a/src/libs/next-auth/sso-providers/azure-ad.ts +++ b/src/libs/next-auth/sso-providers/azure-ad.ts @@ -1,8 +1,6 @@ import AzureAD from 'next-auth/providers/azure-ad'; -import { getServerConfig } from '@/config/server'; - -const { AZURE_AD_CLIENT_ID, AZURE_AD_CLIENT_SECRET, AZURE_AD_TENANT_ID } = getServerConfig(); +import { authEnv } from '@/config/auth'; const provider = { id: 'azure-ad', @@ -10,9 +8,9 @@ const provider = { // Specify auth scope, at least include 'openid email' // all scopes in Azure AD ref: https://learn.microsoft.com/en-us/entra/identity-platform/scopes-oidc#openid-connect-scopes authorization: { params: { scope: 'openid email profile' } }, - clientId: AZURE_AD_CLIENT_ID, - clientSecret: AZURE_AD_CLIENT_SECRET, - tenantId: AZURE_AD_TENANT_ID, + clientId: authEnv.AZURE_AD_CLIENT_ID, + clientSecret: authEnv.AZURE_AD_CLIENT_SECRET, + tenantId: authEnv.AZURE_AD_TENANT_ID, }), }; diff --git a/src/libs/next-auth/sso-providers/github.ts b/src/libs/next-auth/sso-providers/github.ts index 86f3cba1b2f14..679776a47c771 100644 --- a/src/libs/next-auth/sso-providers/github.ts +++ b/src/libs/next-auth/sso-providers/github.ts @@ -1,16 +1,14 @@ import GitHub from 'next-auth/providers/github'; -import { getServerConfig } from '@/config/server'; - -const { GITHUB_CLIENT_ID, GITHUB_CLIENT_SECRET } = getServerConfig(); +import { authEnv } from '@/config/auth'; const provider = { id: 'github', provider: GitHub({ // Specify auth scope, at least include 'openid email' authorization: { params: { scope: 'read:user user:email' } }, - clientId: GITHUB_CLIENT_ID, - clientSecret: GITHUB_CLIENT_SECRET, + clientId: authEnv.GITHUB_CLIENT_ID, + clientSecret: authEnv.GITHUB_CLIENT_SECRET, }), }; diff --git a/src/libs/next-auth/sso-providers/zitadel.ts b/src/libs/next-auth/sso-providers/zitadel.ts index fef3e95177af8..4cf10701833fa 100644 --- a/src/libs/next-auth/sso-providers/zitadel.ts +++ b/src/libs/next-auth/sso-providers/zitadel.ts @@ -1,17 +1,15 @@ import Zitadel from 'next-auth/providers/zitadel'; -import { getServerConfig } from '@/config/server'; - -const { ZITADEL_CLIENT_ID, ZITADEL_CLIENT_SECRET, ZITADEL_ISSUER } = getServerConfig(); +import { authEnv } from '@/config/auth'; const provider = { id: 'zitadel', provider: Zitadel({ // Available scopes in ZITADEL: https://zitadel.com/docs/apis/openidoauth/scopes authorization: { params: { scope: 'openid email profile' } }, - clientId: ZITADEL_CLIENT_ID, - clientSecret: ZITADEL_CLIENT_SECRET, - issuer: ZITADEL_ISSUER, + clientId: authEnv.ZITADEL_CLIENT_ID, + clientSecret: authEnv.ZITADEL_CLIENT_SECRET, + issuer: authEnv.ZITADEL_ISSUER, }), }; diff --git a/src/locales/default/auth.ts b/src/locales/default/auth.ts new file mode 100644 index 0000000000000..bdd41836056ea --- /dev/null +++ b/src/locales/default/auth.ts @@ -0,0 +1,6 @@ +export default { + login: '登录', + loginOrSignup: '登录 / 注册', + signout: '退出登录', + signup: '注册', +}; diff --git a/src/locales/default/clerk.ts b/src/locales/default/clerk.ts new file mode 100644 index 0000000000000..eaf900d68bb71 --- /dev/null +++ b/src/locales/default/clerk.ts @@ -0,0 +1,782 @@ +export default { + backButton: '返回', + badge__default: '默认', + badge__otherImpersonatorDevice: '其他模拟器设备', + badge__primary: '主要', + badge__requiresAction: '需要采取行动', + badge__thisDevice: '此设备', + badge__unverified: '未验证', + badge__userDevice: '用户设备', + badge__you: '您', + createOrganization: { + formButtonSubmit: '创建组织', + invitePage: { + formButtonReset: '跳过', + }, + title: '创建组织', + }, + dates: { + lastDay: "昨天 {{ date | timeString('zh-CN') }}", + next6Days: "{{ date | weekday('zh-CN','long') }} {{ date | timeString('zh-CN') }}", + nextDay: "明天 {{ date | timeString('zh-CN') }}", + numeric: "{{ date | numeric('zh-CN') }}", + previous6Days: "上周{{ date | weekday('zh-CN','long') }} {{ date | timeString('zh-CN') }}", + sameDay: "今天 {{ date | timeString('zh-CN') }}", + }, + dividerText: '或者', + footerActionLink__useAnotherMethod: '使用另一种方法', + footerPageLink__help: '帮助', + footerPageLink__privacy: '隐私', + footerPageLink__terms: '条款', + formButtonPrimary: '继续', + formButtonPrimary__verify: '验证', + formFieldAction__forgotPassword: '忘记密码?', + formFieldError__matchingPasswords: '密码匹配。', + formFieldError__notMatchingPasswords: '密码不匹配。', + formFieldError__verificationLinkExpired: '验证链接已过期。请申请新的链接。', + formFieldHintText__optional: '选填', + formFieldHintText__slug: 'Slug 是一个人类可读的 ID,它必须是唯一的。它通常用于 URL 中。', + formFieldInputPlaceholder__backupCode: '', + formFieldInputPlaceholder__confirmDeletionUserAccount: '删除帐户', + formFieldInputPlaceholder__emailAddress: '', + formFieldInputPlaceholder__emailAddress_username: '', + formFieldInputPlaceholder__emailAddresses: '输入或粘贴一个或多个电子邮件地址,用空格或逗号分隔', + formFieldInputPlaceholder__firstName: '', + formFieldInputPlaceholder__lastName: '', + formFieldInputPlaceholder__organizationDomain: '', + formFieldInputPlaceholder__organizationDomainEmailAddress: '', + formFieldInputPlaceholder__organizationName: '', + formFieldInputPlaceholder__organizationSlug: 'my-org', + formFieldInputPlaceholder__password: '', + formFieldInputPlaceholder__phoneNumber: '', + formFieldInputPlaceholder__username: '', + formFieldLabel__automaticInvitations: '为此域名启用自动邀请', + formFieldLabel__backupCode: '备用代码', + formFieldLabel__confirmDeletion: '确认', + formFieldLabel__confirmPassword: '确认密码', + formFieldLabel__currentPassword: '当前密码', + formFieldLabel__emailAddress: '电子邮件地址', + formFieldLabel__emailAddress_username: '电子邮件地址或用户名', + formFieldLabel__emailAddresses: '电子邮件地址', + formFieldLabel__firstName: '名字', + formFieldLabel__lastName: '姓氏', + formFieldLabel__newPassword: '新密码', + formFieldLabel__organizationDomain: '域名', + formFieldLabel__organizationDomainDeletePending: '删除待处理的邀请和建议', + formFieldLabel__organizationDomainEmailAddress: '验证邮箱地址', + formFieldLabel__organizationDomainEmailAddressDescription: + '输入此域名下的一个邮箱地址以接收验证码并验证此域名。', + formFieldLabel__organizationName: '组织名称', + formFieldLabel__organizationSlug: 'URL 简称', + formFieldLabel__passkeyName: 'Passkey 名称', + formFieldLabel__password: '密码', + formFieldLabel__phoneNumber: '电话号码', + formFieldLabel__role: '角色', + formFieldLabel__signOutOfOtherSessions: '登出所有其他设备', + formFieldLabel__username: '用户名', + impersonationFab: { + action__signOut: '退出登录', + title: '以 {{identifier}} 的身份登录', + }, + locale: 'zh-CN', + maintenanceMode: '我们目前正在进行维护,但不用担心,不会超过几分钟。', + membershipRole__admin: '管理员', + membershipRole__basicMember: '成员', + membershipRole__guestMember: '访客', + organizationList: { + action__createOrganization: '创建组织', + action__invitationAccept: '加入', + action__suggestionsAccept: '请求加入', + createOrganization: '创建组织', + invitationAcceptedLabel: '已加入', + subtitle: '以继续使用 {{applicationName}}', + suggestionsAcceptedLabel: '等待批准', + title: '选择一个帐户', + titleWithoutPersonal: '选择一个组织', + }, + organizationProfile: { + badge__automaticInvitation: '自动邀请', + badge__automaticSuggestion: '自动建议', + badge__manualInvitation: '无自动注册', + badge__unverified: '未验证', + createDomainPage: { + subtitle: '添加域名以进行验证。具有此域名电子邮件地址的用户可以自动加入组织或请求加入。', + title: '添加域名', + }, + invitePage: { + detailsTitle__inviteFailed: + '邀请未发送。以下电子邮件地址已有待处理的邀请:{{email_addresses}}。', + formButtonPrimary__continue: '发送邀请', + selectDropdown__role: '选择角色', + subtitle: '输入或粘贴一个或多个电子邮件地址,用空格或逗号分隔。', + successMessage: '邀请已成功发送', + title: '邀请新成员', + }, + membersPage: { + action__invite: '邀请', + activeMembersTab: { + menuAction__remove: '移除成员', + tableHeader__actions: '', + tableHeader__joined: '加入时间', + tableHeader__role: '角色', + tableHeader__user: '用户', + }, + detailsTitle__emptyRow: '没有可显示的成员', + invitationsTab: { + autoInvitations: { + headerSubtitle: + '通过连接电子邮件域邀请用户加入组织。任何使用匹配电子邮件域注册的用户都可以随时加入组织。', + headerTitle: '自动邀请', + primaryButton: '管理已验证域名', + }, + table__emptyRow: '没有可显示的邀请', + }, + invitedMembersTab: { + menuAction__revoke: '撤销邀请', + tableHeader__invited: '已邀请', + }, + requestsTab: { + autoSuggestions: { + headerSubtitle: '使用匹配电子邮件域注册的用户可以看到请求加入组织的建议。', + headerTitle: '自动建议', + primaryButton: '管理已验证的域', + }, + menuAction__approve: '批准', + menuAction__reject: '拒绝', + tableHeader__requested: '请求访问', + table__emptyRow: '没有请求显示', + }, + start: { + headerTitle__invitations: '邀请', + headerTitle__members: '成员', + headerTitle__requests: '请求', + }, + }, + navbar: { + description: '管理您的组织', + general: '常规', + members: '成员', + title: '组织', + }, + profilePage: { + dangerSection: { + deleteOrganization: { + actionDescription: '在下方输入“{{organizationName}}”以继续。', + messageLine1: '您确定要删除此组织吗?', + messageLine2: '此操作是永久且不可逆转的。', + successMessage: '您已删除组织', + title: '删除组织', + }, + leaveOrganization: { + actionDescription: '在下方输入“{{organizationName}}”以继续。', + messageLine1: '您确定要离开此组织吗?您将失去对该组织及其应用程序的访问权限。', + messageLine2: '此操作是永久且不可逆转的。', + successMessage: '您已离开组织', + title: '离开组织', + }, + title: '危险', + }, + domainSection: { + menuAction__manage: '管理', + menuAction__remove: '删除', + menuAction__verify: '验证', + primaryButton: '添加域', + subtitle: '允许用户根据已验证的电子邮件域自动加入组织或请求加入。', + title: '已验证的域', + }, + successMessage: '组织已更新', + title: '更新配置文件', + }, + removeDomainPage: { + messageLine1: '电子邮件域 {{domain}} 将被移除。', + messageLine2: '此后用户将无法自动加入组织。', + successMessage: '{{domain}} 已移除', + title: '移除域', + }, + start: { + headerTitle__general: '常规', + headerTitle__members: '成员', + profileSection: { + primaryButton: '更新配置文件', + title: '组织配置文件', + uploadAction__title: '标识', + }, + }, + verifiedDomainPage: { + dangerTab: { + calloutInfoLabel: '移除此域将影响已邀请的用户。', + removeDomainActionLabel__remove: '移除域', + removeDomainSubtitle: '从已验证的域中移除此域', + removeDomainTitle: '移除域', + }, + enrollmentTab: { + automaticInvitationOption__description: '用户注册时将自动邀请加入组织,并随时可以加入。', + automaticInvitationOption__label: '自动邀请', + automaticSuggestionOption__description: + '用户将收到请求加入的建议,但必须由管理员批准后才能加入组织。', + automaticSuggestionOption__label: '自动建议', + calloutInfoLabel: '更改注册模式仅影响新用户。', + calloutInvitationCountLabel: '已发送给用户的待处理邀请:{{count}}', + calloutSuggestionCountLabel: '已发送给用户的待处理建议:{{count}}', + manualInvitationOption__description: '用户只能手动邀请加入组织。', + manualInvitationOption__label: '不自动加入', + subtitle: '选择来自此域的用户如何加入组织。', + }, + start: { + headerTitle__danger: '危险', + headerTitle__enrollment: '注册选项', + }, + subtitle: '域 {{domain}} 已验证。继续选择注册模式。', + title: '更新 {{domain}}', + }, + verifyDomainPage: { + formSubtitle: '输入发送到您电子邮件地址的验证代码', + formTitle: '验证代码', + resendButton: '没有收到验证码?重新发送', + subtitle: '需要通过电子邮件验证域 {{domainName}}。', + subtitleVerificationCodeScreen: '已发送验证码至 {{emailAddress}}。输入验证码以继续。', + title: '验证域', + }, + }, + organizationSwitcher: { + action__createOrganization: '创建组织', + action__invitationAccept: '加入', + action__manageOrganization: '管理', + action__suggestionsAccept: '请求加入', + notSelected: '未选择组织', + personalWorkspace: '个人账户', + suggestionsAcceptedLabel: '待批准', + }, + paginationButton__next: '下一页', + paginationButton__previous: '上一页', + paginationRowText__displaying: '显示', + paginationRowText__of: '共', + signIn: { + accountSwitcher: { + action__addAccount: '添加账户', + action__signOutAll: '退出所有账户', + subtitle: '选择要继续使用的账户。', + title: '选择一个账户', + }, + alternativeMethods: { + actionLink: '获取帮助', + actionText: '没有这些?', + blockButton__backupCode: '使用备用代码', + blockButton__emailCode: '将验证码发送至 {{identifier}}', + blockButton__emailLink: '将链接发送至 {{identifier}}', + blockButton__passkey: '使用您的密钥登录', + blockButton__password: '使用密码登录', + blockButton__phoneCode: '将短信验证码发送至 {{identifier}}', + blockButton__totp: '使用您的身份验证器应用程序', + getHelp: { + blockButton__emailSupport: '邮件支持', + content: + '如果您在登录您的帐户时遇到困难,请给我们发送电子邮件,我们将尽快与您合作恢复访问权限。', + title: '获取帮助', + }, + subtitle: '遇到问题?您可以使用以下任一方法登录。', + title: '使用其他方法', + }, + backupCodeMfa: { + subtitle: '您的备用代码是在设置两步验证时获得的。', + title: '输入备用代码', + }, + emailCode: { + formTitle: '验证码', + resendButton: '没有收到验证码?重新发送', + subtitle: '继续访问 {{applicationName}}', + title: '查看您的电子邮件', + }, + emailLink: { + expired: { + subtitle: '返回原始标签继续。', + title: '此验证链接已过期', + }, + failed: { + subtitle: '返回原始标签继续。', + title: '此验证链接无效', + }, + formSubtitle: '使用发送到您电子邮件的验证链接', + formTitle: '验证链接', + loading: { + subtitle: '您将很快被重定向', + title: '登录中...', + }, + resendButton: '没有收到链接?重新发送', + subtitle: '继续访问 {{applicationName}}', + title: '查看您的电子邮件', + unusedTab: { + title: '您可以关闭此标签', + }, + verified: { + subtitle: '您将很快被重定向', + title: '成功登录', + }, + verifiedSwitchTab: { + subtitle: '返回原始标签继续', + subtitleNewTab: '返回新打开的标签继续', + titleNewTab: '在其他标签上登录', + }, + }, + forgotPassword: { + formTitle: '重置密码代码', + resendButton: '没有收到验证码?重新发送', + subtitle: '重置您的密码', + subtitle_email: '首先,输入发送到您电子邮件地址的代码', + subtitle_phone: '首先,输入发送到您手机的代码', + title: '重置密码', + }, + forgotPasswordAlternativeMethods: { + blockButton__resetPassword: '重置您的密码', + label__alternativeMethods: '或者,使用其他方法登录', + title: '忘记密码?', + }, + noAvailableMethods: { + message: '无法继续登录。没有可用的身份验证因素。', + subtitle: '发生错误', + title: '无法登录', + }, + passkey: { + subtitle: '使用您的密钥确认是您本人。您的设备可能会要求您的指纹、面容或屏幕锁。', + title: '使用您的密钥', + }, + password: { + actionLink: '使用其他方法', + subtitle: '输入与您的帐户关联的密码', + title: '输入您的密码', + }, + passwordPwned: { + title: '密码已泄露', + }, + phoneCode: { + formTitle: '验证码', + resendButton: '没有收到验证码?重新发送', + subtitle: '继续访问 {{applicationName}}', + title: '检查您的手机', + }, + phoneCodeMfa: { + formTitle: '验证码', + resendButton: '没有收到验证码?重新发送', + subtitle: '请继续,输入发送到您手机的验证码', + title: '检查您的手机', + }, + resetPassword: { + formButtonPrimary: '重置密码', + requiredMessage: '出于安全原因,需要重置您的密码。', + successMessage: '您的密码已成功更改。正在登录,请稍候。', + title: '设置新密码', + }, + resetPasswordMfa: { + detailsLabel: '在重置密码之前,我们需要验证您的身份。', + }, + start: { + actionLink: '注册', + actionLink__use_email: '使用电子邮件', + actionLink__use_email_username: '使用电子邮件或用户名', + actionLink__use_passkey: '改用密钥', + actionLink__use_phone: '使用手机', + actionLink__use_username: '使用用户名', + actionText: '没有帐户?', + subtitle: '欢迎回来!请登录以继续', + title: '登录到 {{applicationName}}', + }, + totpMfa: { + formTitle: '验证码', + subtitle: '请继续,输入您的身份验证器应用程序生成的验证码', + title: '双重验证', + }, + }, + signInEnterPasswordTitle: '输入您的密码', + signUp: { + continue: { + actionLink: '登录', + actionText: '已有帐户?', + subtitle: '请填写剩余的细节以继续。', + title: '填写缺失的字段', + }, + emailCode: { + formSubtitle: '输入发送到您电子邮件地址的验证码', + formTitle: '验证码', + resendButton: '没有收到验证码?重新发送', + subtitle: '输入发送到您电子邮件的验证码', + title: '验证您的电子邮件', + }, + emailLink: { + formSubtitle: '使用发送到您电子邮件地址的验证链接', + formTitle: '验证链接', + loading: { + title: '注册中...', + }, + resendButton: '没有收到链接?重新发送', + subtitle: '继续访问 {{applicationName}}', + title: '验证您的电子邮件', + verified: { + title: '成功注册', + }, + verifiedSwitchTab: { + subtitle: '返回新打开的标签继续', + subtitleNewTab: '返回上一个标签继续', + title: '成功验证电子邮件', + }, + }, + phoneCode: { + formSubtitle: '输入发送到您电话号码的验证码', + formTitle: '验证码', + resendButton: '没有收到验证码?重新发送', + subtitle: '输入发送到您手机的验证码', + title: '验证您的手机', + }, + start: { + actionLink: '登录', + actionText: '已有帐户?', + subtitle: '欢迎!请填写详细信息开始。', + title: '创建您的帐户', + }, + }, + socialButtonsBlockButton: '继续使用 {{provider|titleize}}', + unstable__errors: { + captcha_invalid: '由于安全验证失败,注册失败。请刷新页面重试,或联系支持获取更多帮助。', + captcha_unavailable: '由于机器人验证失败,注册失败。请刷新页面重试,或联系支持获取更多帮助。', + form_code_incorrect: '', + form_identifier_exists: '', + form_identifier_exists__email_address: '此电子邮件地址已被使用。请尝试另一个。', + form_identifier_exists__phone_number: '此电话号码已被使用。请尝试另一个。', + form_identifier_exists__username: '此用户名已被使用。请尝试另一个。', + form_identifier_not_found: '', + form_param_format_invalid: '', + form_param_format_invalid__email_address: '电子邮件地址必须是有效的电子邮件地址。', + form_param_format_invalid__phone_number: '电话号码必须符合有效的国际格式。', + form_param_max_length_exceeded__first_name: '名字不应超过256个字符。', + form_param_max_length_exceeded__last_name: '姓氏不应超过256个字符。', + form_param_max_length_exceeded__name: '名称不应超过256个字符。', + form_param_nil: '', + form_password_incorrect: '', + form_password_length_too_short: '', + form_password_not_strong_enough: '您的密码不够强大。', + form_password_pwned: '此密码已经被发现为泄露的一部分,不能使用,请尝试其他密码。', + form_password_pwned__sign_in: '此密码已经被发现为泄露的一部分,不能使用,请重置您的密码。', + form_password_size_in_bytes_exceeded: + '您的密码已超过允许的最大字节数,请缩短或删除一些特殊字符。', + form_password_validation_failed: '密码不正确', + form_username_invalid_character: '', + form_username_invalid_length: '', + identification_deletion_failed: '您不能删除您的最后一个身份验证。', + not_allowed_access: '', + passkey_already_exists: '此设备已注册过通行密钥。', + passkey_not_supported: '此设备不支持通行密钥。', + passkey_pa_not_supported: '注册需要平台验证器,但设备不支持。', + passkey_registration_cancelled: '通行密钥注册已取消或超时。', + passkey_retrieval_cancelled: '通行密钥验证已取消或超时。', + passwordComplexity: { + maximumLength: '少于{{length}}个字符', + minimumLength: '{{length}}个或更多字符', + requireLowercase: '一个小写字母', + requireNumbers: '一个数字', + requireSpecialCharacter: '一个特殊字符', + requireUppercase: '一个大写字母', + sentencePrefix: '您的密码必须包含', + }, + phone_number_exists: '此电话号码已被使用。请尝试另一个。', + zxcvbn: { + couldBeStronger: '您的密码可以更强大。尝试添加更多字符。', + goodPassword: '您的密码符合所有必要要求。', + notEnough: '您的密码不够强大。', + suggestions: { + allUppercase: '将一些字母大写,但不是全部。', + anotherWord: '添加更少见的单词。', + associatedYears: '避免与您相关的年份。', + capitalization: '大写不止第一个字母。', + dates: '避免与您相关的日期和年份。', + l33t: "避免可预测的字母替换,如将'@'替换为'a'。", + longerKeyboardPattern: '使用更长的键盘模式,多次改变输入方向。', + noNeed: '您可以创建强大的密码,而无需使用符号、数字或大写字母。', + pwned: '如果您在其他地方使用此密码,应该更改它。', + recentYears: '避免最近的年份。', + repeated: '避免重复的单词和字符。', + reverseWords: '避免常见单词的反向拼写。', + sequences: '避免常见的字符序列。', + useWords: '使用多个单词,但避免常见短语。', + }, + warnings: { + common: '这是一个常用的密码。', + commonNames: '常见的名字和姓氏容易被猜到。', + dates: '日期容易被猜到。', + extendedRepeat: '重复的字符模式如“abcabcabc”容易被猜到。', + keyPattern: '简短的键盘模式容易被猜到。', + namesByThemselves: '单个名字或姓氏容易被猜到。', + pwned: '您的密码在互联网上的数据泄露中曝光。', + recentYears: '最近的年份容易被猜到。', + sequences: '常见的字符序列如“abc”容易被猜到。', + similarToCommon: '这与常用密码相似。', + simpleRepeat: '重复的字符如“aaa”容易被猜到。', + straightRow: '键盘上直线排列的键易被猜到。', + topHundred: '这是一个常用密码。', + topTen: '这是一个广泛使用的密码。', + userInputs: '密码中不应包含任何个人或页面相关数据。', + wordByItself: '单个单词容易被猜到。', + }, + }, + }, + userButton: { + action__addAccount: '添加账户', + action__manageAccount: '管理账户', + action__signOut: '登出', + action__signOutAll: '从所有账户登出', + }, + userProfile: { + backupCodePage: { + actionLabel__copied: '已复制!', + actionLabel__copy: '复制全部', + actionLabel__download: '下载 .txt', + actionLabel__print: '打印', + infoText1: '此帐户将启用备份代码。', + infoText2: '保持备份代码的机密性并安全存储。如果怀疑备份代码已泄露,可以重新生成备份代码。', + subtitle__codelist: '安全存储并保密备份代码。', + successMessage: + '备份代码现已启用。如果您无法访问您的身份验证设备,可以使用其中之一登录您的帐户。每个代码只能使用一次。', + successSubtitle: '如果您无法访问您的身份验证设备,您可以使用其中之一登录您的帐户。', + title: '添加备份代码验证', + title__codelist: '备份代码', + }, + connectedAccountPage: { + formHint: '选择要连接您的帐户的提供商。', + formHint__noAccounts: '没有可用的外部帐户提供商。', + removeResource: { + messageLine1: '{{identifier}} 将从此帐户中删除。', + messageLine2: '您将无法再使用此连接的帐户,并且任何依赖功能将不再起作用。', + successMessage: '{{connectedAccount}} 已从您的帐户中删除。', + title: '删除连接的帐户', + }, + socialButtonsBlockButton: '{{provider|titleize}}', + successMessage: '提供商已添加到您的帐户', + title: '添加连接的帐户', + }, + deletePage: { + actionDescription: '在下方输入“删除帐户”以继续。', + confirm: '删除帐户', + messageLine1: '您确定要删除您的帐户吗?', + messageLine2: '此操作是永久且不可逆转的。', + title: '删除帐户', + }, + emailAddressPage: { + emailCode: { + formHint: '将发送包含验证码的电子邮件至此电子邮件地址。', + formSubtitle: '输入发送至 {{identifier}} 的验证码。', + formTitle: '验证码', + resendButton: '没有收到验证码?重新发送', + successMessage: '电子邮件 {{identifier}} 已添加到您的帐户。', + }, + emailLink: { + formHint: '将发送包含验证链接的电子邮件至此电子邮件地址。', + formSubtitle: '点击发送至 {{identifier}} 的电子邮件中的验证链接。', + formTitle: '验证链接', + resendButton: '没有收到链接?重新发送', + successMessage: '电子邮件 {{identifier}} 已添加到您的帐户。', + }, + removeResource: { + messageLine1: '{{identifier}} 将从此帐户中删除。', + messageLine2: '您将无法再使用此电子邮件地址登录。', + successMessage: '{{emailAddress}} 已从您的帐户中删除。', + title: '删除电子邮件地址', + }, + title: '添加电子邮件地址', + verifyTitle: '验证电子邮件地址', + }, + formButtonPrimary__add: '添加', + formButtonPrimary__continue: '继续', + formButtonPrimary__finish: '完成', + formButtonPrimary__remove: '删除', + formButtonPrimary__save: '保存', + formButtonReset: '取消', + mfaPage: { + formHint: '选择要添加的方法。', + title: '添加双重验证', + }, + mfaPhoneCodePage: { + backButton: '使用现有号码', + primaryButton__addPhoneNumber: '添加电话号码', + removeResource: { + messageLine1: '{{identifier}} 在登录时将不再接收验证代码。', + messageLine2: '您的帐户可能不够安全。您确定要继续吗?', + successMessage: '{{mfaPhoneCode}} 的短信代码双重验证已移除。', + title: '移除双重验证', + }, + subtitle__availablePhoneNumbers: '选择现有电话号码注册短信代码双重验证,或添加新号码。', + subtitle__unavailablePhoneNumbers: + '没有可用的电话号码用于注册短信代码双重验证,请添加新号码。', + successMessage1: '登录时,您需要输入发送至此电话号码的验证代码作为额外步骤。', + successMessage2: + '保存这些备份代码并将其安全存储。如果无法访问您的身份验证设备,可以使用备份代码登录。', + successTitle: '短信代码验证已启用', + title: '添加短信代码验证', + }, + mfaTOTPPage: { + authenticatorApp: { + buttonAbleToScan__nonPrimary: '扫描 QR 码', + buttonUnableToScan__nonPrimary: '无法扫描 QR 码?', + infoText__ableToScan: + '在您的身份验证器应用中设置新的登录方法,并扫描以下 QR 码将其链接到您的帐户。', + infoText__unableToScan: '在您的身份验证器中设置新的登录方法,并输入下面提供的密钥。', + inputLabel__unableToScan1: '确保已启用基于时间或一次性密码,然后完成链接您的帐户。', + inputLabel__unableToScan2: + '或者,如果您的身份验证器支持 TOTP URI,您也可以复制完整的 URI。', + }, + removeResource: { + messageLine1: '登录时将不再需要此身份验证器的验证代码。', + messageLine2: '您的帐户可能不够安全。您确定要继续吗?', + successMessage: '通过身份验证器应用的双重验证已移除。', + title: '移除双重验证', + }, + successMessage: + '双重验证现已启用。登录时,您将需要输入此身份验证器生成的验证代码作为额外步骤。', + title: '添加身份验证器应用', + verifySubtitle: '输入您的身份验证器生成的验证代码', + verifyTitle: '验证代码', + }, + mobileButton__menu: '菜单', + navbar: { + account: '个人资料', + description: '管理您的帐户信息。', + security: '安全', + title: '帐户', + }, + passkeyScreen: { + removeResource: { + messageLine1: '{{name}} 将从此帐户中删除。', + title: '删除密码', + }, + subtitle__rename: '您可以更改密码名称以便更容易找到。', + title__rename: '重命名密码', + }, + passwordPage: { + checkboxInfoText__signOutOfOtherSessions: '建议注销所有可能使用旧密码的其他设备。', + readonly: '您当前无法编辑密码,因为只能通过企业连接登录。', + successMessage__set: '您的密码已设置。', + successMessage__signOutOfOtherSessions: '所有其他设备已注销。', + successMessage__update: '您的密码已更新。', + title__set: '设置密码', + title__update: '更新密码', + }, + phoneNumberPage: { + infoText: '将向此电话号码发送包含验证码的短信。可能会收取短信和数据费用。', + removeResource: { + messageLine1: '{{identifier}} 将从此帐户中删除。', + messageLine2: '您将无法再使用此电话号码登录。', + successMessage: '{{phoneNumber}} 已从您的帐户中删除。', + title: '删除电话号码', + }, + successMessage: '{{identifier}} 已添加到您的帐户。', + title: '添加电话号码', + verifySubtitle: '输入发送至 {{identifier}} 的验证码', + verifyTitle: '验证电话号码', + }, + profilePage: { + fileDropAreaHint: '推荐尺寸 1:1,最多 10MB。', + imageFormDestructiveActionSubtitle: '移除', + imageFormSubtitle: '上传', + imageFormTitle: '个人资料图片', + readonly: '您的个人资料信息由企业连接提供,无法编辑。', + successMessage: '您的个人资料已更新。', + title: '更新个人资料', + }, + start: { + activeDevicesSection: { + destructiveAction: '注销设备', + title: '活动设备', + }, + connectedAccountsSection: { + actionLabel__connectionFailed: '重试', + actionLabel__reauthorize: '立即授权', + destructiveActionTitle: '删除', + primaryButton: '连接帐户', + subtitle__reauthorize: + '所需的范围已更新,您可能体验到功能受限。请重新授权此应用以避免任何问题。', + title: '连接的帐户', + }, + dangerSection: { + deleteAccountButton: '删除帐户', + title: '删除帐户', + }, + emailAddressesSection: { + destructiveAction: '删除电子邮件', + detailsAction__nonPrimary: '设为主要', + detailsAction__primary: '完成验证', + detailsAction__unverified: '验证', + primaryButton: '添加电子邮件地址', + title: '电子邮件地址', + }, + enterpriseAccountsSection: { + title: '企业帐户', + }, + headerTitle__account: '个人资料详情', + headerTitle__security: '安全', + mfaSection: { + backupCodes: { + actionLabel__regenerate: '重新生成', + headerTitle: '备份代码', + subtitle__regenerate: '获取一组新的安全备份代码。之前的备份代码将被删除且无法使用。', + title__regenerate: '重新生成备份代码', + }, + phoneCode: { + actionLabel__setDefault: '设为默认', + destructiveActionLabel: '删除', + }, + primaryButton: '添加双重验证', + title: '双重验证', + totp: { + destructiveActionTitle: '删除', + headerTitle: '身份验证器应用', + }, + }, + passkeysSection: { + menuAction__destructive: '删除', + menuAction__rename: '重命名', + title: '密码', + }, + passwordSection: { + primaryButton__setPassword: '设置密码', + primaryButton__updatePassword: '更新密码', + title: '密码', + }, + phoneNumbersSection: { + destructiveAction: '删除电话号码', + detailsAction__nonPrimary: '设为主要', + detailsAction__primary: '完成验证', + detailsAction__unverified: '验证电话号码', + primaryButton: '添加电话号码', + title: '电话号码', + }, + profileSection: { + primaryButton: '更新个人资料', + title: '个人资料', + }, + usernameSection: { + primaryButton__setUsername: '设置用户名', + primaryButton__updateUsername: '更新用户名', + title: '用户名', + }, + web3WalletsSection: { + destructiveAction: '删除钱包', + primaryButton: 'Web3 钱包', + title: 'Web3 钱包', + }, + }, + usernamePage: { + successMessage: '您的用户名已更新。', + title__set: '设置用户名', + title__update: '更新用户名', + }, + web3WalletPage: { + removeResource: { + messageLine1: '{{identifier}} 将从此帐户中删除。', + messageLine2: '您将无法再使用此 Web3 钱包登录。', + successMessage: '{{web3Wallet}} 已从您的帐户中删除。', + title: '删除 Web3 钱包', + }, + subtitle__availableWallets: '选择要连接到您的帐户的 Web3 钱包。', + subtitle__unavailableWallets: '没有可用的 Web3 钱包。', + successMessage: '钱包已添加到您的帐户。', + title: '添加 Web3 钱包', + }, + }, +}; diff --git a/src/locales/default/common.ts b/src/locales/default/common.ts index eb2fd2d20ad74..9c4438fd85b2e 100644 --- a/src/locales/default/common.ts +++ b/src/locales/default/common.ts @@ -10,6 +10,7 @@ export default { close: '关闭', copy: '复制', copyFail: '复制失败', + copySuccess: '复制成功', defaultAgent: '自定义助手', defaultSession: '自定义助手', @@ -154,6 +155,7 @@ export default { newVersion: '有新版本可用:{{version}}', }, userPanel: { + anonymousNickName: '匿名用户', billing: '账单管理', defaultNickname: '社区版用户', discord: '社区支持', diff --git a/src/locales/default/error.ts b/src/locales/default/error.ts index d942f9e95f269..0c3d6114cc24e 100644 --- a/src/locales/default/error.ts +++ b/src/locales/default/error.ts @@ -1,4 +1,11 @@ export default { + clerkAuth: { + loginSuccess: { + action: '继续会话', + desc: '{{greeting}},很高兴能够继续为你服务。让我们接着刚刚的话题聊下去吧', + title: '欢迎回来, {{nickName}}', + }, + }, error: { backHome: '返回首页', desc: '待会来试试,或者回到已知的世界', @@ -63,6 +70,7 @@ export default { PluginOpenApiInitError: '很抱歉,OpenAPI 客户端初始化失败,请检查 OpenAPI 的配置信息是否正确', InvalidAccessCode: '密码不正确或为空,请输入正确的访问密码,或者添加自定义 API Key', + InvalidClerkUser: '很抱歉,你当前尚未登录,请先登录或注册账号后继续操作', LocationNotSupportError: '很抱歉,你的所在位置不支持此模型服务,可能是由于地区限制或服务未开通。请确认当前位置是否支持使用此服务,或尝试使用其他位置信息。', diff --git a/src/locales/default/index.ts b/src/locales/default/index.ts index 16ccb897ca394..dfccd3ddb82f7 100644 --- a/src/locales/default/index.ts +++ b/src/locales/default/index.ts @@ -1,5 +1,7 @@ import tool from '../default/tool'; +import auth from './auth'; import chat from './chat'; +import clerk from './clerk'; import common from './common'; import components from './components'; import error from './error'; @@ -11,7 +13,9 @@ import setting from './setting'; import welcome from './welcome'; const resources = { + auth, chat, + clerk, common, components, error, diff --git a/src/middleware.ts b/src/middleware.ts index 05c30eb380a91..a3036885fb1ed 100644 --- a/src/middleware.ts +++ b/src/middleware.ts @@ -1,16 +1,26 @@ +import { clerkMiddleware } from '@clerk/nextjs/server'; import { NextResponse } from 'next/server'; -import { getServerConfig } from '@/config/server'; +import { authEnv } from '@/config/auth'; import { auth } from '@/libs/next-auth'; import { OAUTH_AUTHORIZED } from './const/auth'; export const config = { - matcher: '/api/:path*', + matcher: [ + // include any files in the api or trpc folders that might have an extension + '/(api|trpc)(.*)', + // include the / + '/', + ], }; + const defaultMiddleware = () => NextResponse.next(); -const withAuthMiddleware = auth((req) => { +const nextAuthMiddleware = auth((req) => { + // skip the '/' route + if (req.nextUrl.pathname === '/') return NextResponse.next(); + // Just check if session exists const session = req.auth; @@ -22,6 +32,7 @@ const withAuthMiddleware = auth((req) => { const requestHeaders = new Headers(req.headers); requestHeaders.delete(OAUTH_AUTHORIZED); if (isLoggedIn) requestHeaders.set(OAUTH_AUTHORIZED, 'true'); + return NextResponse.next({ request: { headers: requestHeaders, @@ -29,6 +40,8 @@ const withAuthMiddleware = auth((req) => { }); }); -const { ENABLE_OAUTH_SSO } = getServerConfig(); - -export default !ENABLE_OAUTH_SSO ? defaultMiddleware : withAuthMiddleware; +export default authEnv.NEXT_PUBLIC_ENABLE_CLERK_AUTH + ? clerkMiddleware() + : authEnv.NEXT_PUBLIC_ENABLE_NEXT_AUTH + ? nextAuthMiddleware + : defaultMiddleware; diff --git a/src/server/globalConfig/index.ts b/src/server/globalConfig/index.ts index 96de74773cf75..f95d36f14654d 100644 --- a/src/server/globalConfig/index.ts +++ b/src/server/globalConfig/index.ts @@ -5,6 +5,7 @@ import { TogetherAIProviderCard, } from '@/config/modelProviders'; import { getServerConfig } from '@/config/server'; +import { enableNextAuth } from '@/const/auth'; import { GlobalServerConfig } from '@/types/serverConfig'; import { extractEnabledModels, transformToChatModelCards } from '@/utils/parseModels'; @@ -13,7 +14,6 @@ import { parseAgentConfig } from './parseDefaultAgent'; export const getServerGlobalConfig = () => { const { ENABLE_LANGFUSE, - ENABLE_OAUTH_SSO, DEFAULT_AGENT_CONFIG, OPENAI_MODEL_LIST, @@ -48,7 +48,7 @@ export const getServerGlobalConfig = () => { config: parseAgentConfig(DEFAULT_AGENT_CONFIG), }, - enabledOAuthSSO: ENABLE_OAUTH_SSO, + enabledOAuthSSO: enableNextAuth, languageModel: { anthropic: { enabled: ENABLED_ANTHROPIC, diff --git a/src/store/user/selectors.ts b/src/store/user/selectors.ts index 7be6758e5c92f..3f73ddaef4273 100644 --- a/src/store/user/selectors.ts +++ b/src/store/user/selectors.ts @@ -1,4 +1,4 @@ -export { userProfileSelectors } from './slices/auth/selectors'; +export { authSelectors, userProfileSelectors } from './slices/auth/selectors'; export { preferenceSelectors } from './slices/preference/selectors'; export { modelConfigSelectors, diff --git a/src/store/user/slices/auth/action.test.ts b/src/store/user/slices/auth/action.test.ts index 6e0add0cb3d5a..eaba91fa5b50c 100644 --- a/src/store/user/slices/auth/action.test.ts +++ b/src/store/user/slices/auth/action.test.ts @@ -21,8 +21,26 @@ vi.mock('swr', async (importOriginal) => { }; }); +// 定义一个变量来存储 enableAuth 的值 +let enableClerk = false; + +let enableNextAuth = false; + +// 模拟 @/const/auth 模块 +vi.mock('@/const/auth', () => ({ + get enableClerk() { + return enableClerk; + }, + get enableNextAuth() { + return enableNextAuth; + }, +})); + afterEach(() => { vi.restoreAllMocks(); + + enableNextAuth = false; + enableClerk = false; }); describe('createAuthSlice', () => { @@ -115,4 +133,91 @@ describe('createAuthSlice', () => { expect(useUserStore.getState().settings).toEqual({}); }); }); + + describe('logout', () => { + it('should call clerkSignOut when Clerk is enabled', async () => { + enableClerk = true; + + const clerkSignOutMock = vi.fn(); + useUserStore.setState({ clerkSignOut: clerkSignOutMock }); + + const { result } = renderHook(() => useUserStore()); + + await act(async () => { + await result.current.logout(); + }); + + expect(clerkSignOutMock).toHaveBeenCalled(); + }); + + it('should not call clerkSignOut when Clerk is disabled', async () => { + const clerkSignOutMock = vi.fn(); + useUserStore.setState({ clerkSignOut: clerkSignOutMock }); + + const { result } = renderHook(() => useUserStore()); + + await act(async () => { + await result.current.logout(); + }); + + expect(clerkSignOutMock).not.toHaveBeenCalled(); + }); + }); + + describe('openLogin', () => { + it('should call clerkSignIn when Clerk is enabled', async () => { + enableClerk = true; + const clerkSignInMock = vi.fn(); + useUserStore.setState({ clerkSignIn: clerkSignInMock }); + + const { result } = renderHook(() => useUserStore()); + + await act(async () => { + await result.current.openLogin(); + }); + + expect(clerkSignInMock).toHaveBeenCalled(); + }); + it('should not call clerkSignIn when Clerk is disabled', async () => { + const clerkSignInMock = vi.fn(); + useUserStore.setState({ clerkSignIn: clerkSignInMock }); + + const { result } = renderHook(() => useUserStore()); + + await act(async () => { + await result.current.openLogin(); + }); + + expect(clerkSignInMock).not.toHaveBeenCalled(); + }); + }); + + describe('openUserProfile', () => { + it('should call clerkOpenUserProfile when Clerk is enabled', async () => { + enableClerk = true; + + const clerkOpenUserProfileMock = vi.fn(); + useUserStore.setState({ clerkOpenUserProfile: clerkOpenUserProfileMock }); + + const { result } = renderHook(() => useUserStore()); + + await act(async () => { + await result.current.openUserProfile(); + }); + + expect(clerkOpenUserProfileMock).toHaveBeenCalled(); + }); + it('should not call clerkOpenUserProfile when Clerk is disabled', async () => { + const clerkOpenUserProfileMock = vi.fn(); + useUserStore.setState({ clerkOpenUserProfile: clerkOpenUserProfileMock }); + + const { result } = renderHook(() => useUserStore()); + + await act(async () => { + await result.current.openUserProfile(); + }); + + expect(clerkOpenUserProfileMock).not.toHaveBeenCalled(); + }); + }); }); diff --git a/src/store/user/slices/auth/action.ts b/src/store/user/slices/auth/action.ts index ebd458d442637..8caf2762749c3 100644 --- a/src/store/user/slices/auth/action.ts +++ b/src/store/user/slices/auth/action.ts @@ -1,6 +1,7 @@ import useSWR, { SWRResponse, mutate } from 'swr'; import { StateCreator } from 'zustand/vanilla'; +import { enableClerk, enableNextAuth } from '@/const/auth'; import { UserConfig, userService } from '@/services/user'; import { switchLang } from '@/utils/client/switchLang'; import { setNamespace } from '@/utils/storeDebug'; @@ -13,14 +14,16 @@ const USER_CONFIG_FETCH_KEY = 'fetchUserConfig'; export interface UserAuthAction { getUserConfig: () => void; - /** - * universal login method - */ login: () => Promise; /** * universal logout method */ logout: () => Promise; + /** + * universal login method + */ + openLogin: () => Promise; + openUserProfile: () => Promise; refreshUserConfig: () => Promise; useFetchUserConfig: (initServer: boolean) => SWRResponse; @@ -40,8 +43,40 @@ export const createAuthSlice: StateCreator< console.log(n('login')); }, logout: async () => { - // TODO: 针对开启 next-auth 的场景,需要在这里调用登录方法 - console.log(n('logout')); + if (enableClerk) { + get().clerkSignOut?.({ redirectUrl: location.toString() }); + + return; + } + + if (enableNextAuth) { + // TODO: 针对开启 next-auth 的场景,需要在这里调用登录方法 + console.log(n('logout')); + } + }, + openLogin: async () => { + if (enableClerk) { + console.log('fallbackRedirectUrl:', location.toString()); + + get().clerkSignIn?.({ fallbackRedirectUrl: location.toString() }); + + return; + } + + if (enableNextAuth) { + // TODO: 针对开启 next-auth 的场景,需要在这里调用登录方法 + } + }, + openUserProfile: async () => { + if (enableClerk) { + get().clerkOpenUserProfile?.(); + + return; + } + + if (enableNextAuth) { + // TODO: 针对开启 next-auth 的场景,需要在这里调用打开 profile 页 + } }, refreshUserConfig: async () => { await mutate([USER_CONFIG_FETCH_KEY, true]); diff --git a/src/store/user/slices/auth/initialState.ts b/src/store/user/slices/auth/initialState.ts index 373879ce587a3..94d2cedd817c1 100644 --- a/src/store/user/slices/auth/initialState.ts +++ b/src/store/user/slices/auth/initialState.ts @@ -1,12 +1,27 @@ import { Session, User } from '@auth/core/types'; +import { + ActiveSessionResource, + SignInProps, + SignOut, + UserProfileProps, + UserResource, +} from '@clerk/types'; import { LobeUser } from '@/types/user'; export interface UserAuthState { /** + * 未来收到 user.avatar 中 * @deprecated */ avatar?: string; + + clerkOpenUserProfile?: (props?: UserProfileProps) => void; + clerkSession?: ActiveSessionResource; + clerkSignIn?: (props?: SignInProps) => void; + clerkSignOut?: SignOut; + clerkUser?: UserResource; + isLoaded?: boolean; isSignedIn?: boolean; nextSession?: Session; diff --git a/src/store/user/slices/auth/selectors.test.ts b/src/store/user/slices/auth/selectors.test.ts new file mode 100644 index 0000000000000..b3b95de3f2e8e --- /dev/null +++ b/src/store/user/slices/auth/selectors.test.ts @@ -0,0 +1,127 @@ +import { t } from 'i18next'; +import { afterEach, describe, expect, it, vi } from 'vitest'; + +import { UserStore } from '@/store/user'; + +import { authSelectors, userProfileSelectors } from './selectors'; + +vi.mock('i18next', () => ({ + t: vi.fn((key) => key), +})); + +// 定义一个变量来存储 enableAuth 的值 +let enableAuth = true; + +// 模拟 @/const/auth 模块 +vi.mock('@/const/auth', () => ({ + get enableAuth() { + return enableAuth; + }, +})); + +afterEach(() => { + enableAuth = true; +}); + +describe('userProfileSelectors', () => { + describe('nickName', () => { + it('should return default nickname when auth is disabled', () => { + enableAuth = false; + + const store: UserStore = { + isSignedIn: false, + user: null, + } as unknown as UserStore; + + expect(userProfileSelectors.nickName(store)).toBe('userPanel.defaultNickname'); + expect(t).toHaveBeenCalledWith('userPanel.defaultNickname', { ns: 'common' }); + }); + + it('should return user fullName when signed in', () => { + enableAuth = true; + + const store: UserStore = { + isSignedIn: true, + user: { fullName: 'John Doe' }, + } as UserStore; + + expect(userProfileSelectors.nickName(store)).toBe('John Doe'); + }); + + it('should return user username when fullName is not available', () => { + const store: UserStore = { + isSignedIn: true, + user: { username: 'johndoe' }, + } as UserStore; + + expect(userProfileSelectors.nickName(store)).toBe('johndoe'); + }); + + it('should return anonymous nickname when not signed in', () => { + enableAuth = true; + + const store: UserStore = { isSignedIn: false, user: null } as unknown as UserStore; + + expect(userProfileSelectors.nickName(store)).toBe('userPanel.anonymousNickName'); + expect(t).toHaveBeenCalledWith('userPanel.anonymousNickName', { ns: 'common' }); + }); + }); + + describe('username', () => { + it('should return default username when auth is disabled', () => { + enableAuth = false; + + const store: UserStore = { + isSignedIn: false, + user: null, + } as unknown as UserStore; + + expect(userProfileSelectors.username(store)).toBe('LobeChat'); + }); + + it('should return user username when signed in', () => { + const store: UserStore = { + isSignedIn: true, + user: { username: 'johndoe' }, + } as UserStore; + + expect(userProfileSelectors.username(store)).toBe('johndoe'); + }); + + it('should return "anonymous" when not signed in', () => { + const store: UserStore = { isSignedIn: false, user: null } as unknown as UserStore; + + expect(userProfileSelectors.username(store)).toBe('anonymous'); + }); + }); +}); + +describe('authSelectors', () => { + describe('isLogin', () => { + it('should return true when auth is disabled', () => { + enableAuth = false; + + const store: UserStore = { + isSignedIn: false, + } as UserStore; + + expect(authSelectors.isLogin(store)).toBe(true); + }); + + it('should return true when signed in', () => { + const store: UserStore = { + isSignedIn: true, + } as UserStore; + + expect(authSelectors.isLogin(store)).toBe(true); + }); + + it('should return false when not signed in and auth is enabled', () => { + const store: UserStore = { + isSignedIn: false, + } as UserStore; + + expect(authSelectors.isLogin(store)).toBe(false); + }); + }); +}); diff --git a/src/store/user/slices/auth/selectors.ts b/src/store/user/slices/auth/selectors.ts index 3afe2e6654fbe..f550d4a86e827 100644 --- a/src/store/user/slices/auth/selectors.ts +++ b/src/store/user/slices/auth/selectors.ts @@ -1,9 +1,46 @@ +import { t } from 'i18next'; + +import { enableAuth } from '@/const/auth'; import { UserStore } from '@/store/user'; import { LobeUser } from '@/types/user'; +const DEFAULT_USERNAME = 'LobeChat'; + +const nickName = (s: UserStore) => { + if (!enableAuth) return t('userPanel.defaultNickname', { ns: 'common' }); + + if (s.isSignedIn) return s.user?.fullName || s.user?.username; + + return t('userPanel.anonymousNickName', { ns: 'common' }); +}; + +const username = (s: UserStore) => { + if (!enableAuth) return DEFAULT_USERNAME; + + if (s.isSignedIn) return s.user?.username; + + return 'anonymous'; +}; + export const userProfileSelectors = { + nickName, userAvatar: (s: UserStore): string => s.user?.avatar || s.avatar || '', userId: (s: UserStore) => s.userId, userProfile: (s: UserStore): LobeUser | null | undefined => s.user, - username: (s: UserStore): string | null | undefined => s.user?.username, + username, +}; + +/** + * 使用此方法可以兼容不需要登录鉴权的情况 + */ +const isLogin = (s: UserStore) => { + // 如果没有开启鉴权,说明不需要登录,默认是登录态 + if (!enableAuth) return true; + + return s.isSignedIn; +}; + +export const authSelectors = { + isLogin, + isLoginWithAuth: (s: UserStore) => s.isSignedIn, }; diff --git a/src/store/user/slices/settings/selectors/selectors.test.ts b/src/store/user/slices/settings/selectors/selectors.test.ts index 99b8bbd935a7d..e2ed1c19266f0 100644 --- a/src/store/user/slices/settings/selectors/selectors.test.ts +++ b/src/store/user/slices/settings/selectors/selectors.test.ts @@ -131,6 +131,31 @@ describe('settingsSelectors', () => { }); }); + describe('currentThemeMode', () => { + it('should return the correct theme', () => { + const s = { + settings: { + themeMode: 'light', + }, + } as unknown as UserStore; + + const result = settingsSelectors.currentThemeMode(s); + + expect(result).toBe('light'); + }); + it('should return the auto if not set the themeMode', () => { + const s = { + settings: { + themeMode: undefined, + }, + } as unknown as UserStore; + + const result = settingsSelectors.currentThemeMode(s); + + expect(result).toBe('auto'); + }); + }); + describe('dalleConfig', () => { it('should return the dalle configuration', () => { const s = { diff --git a/src/store/user/slices/settings/selectors/settings.ts b/src/store/user/slices/settings/selectors/settings.ts index cbb6f310f5b3b..5d67a1de7fbf6 100644 --- a/src/store/user/slices/settings/selectors/settings.ts +++ b/src/store/user/slices/settings/selectors/settings.ts @@ -45,6 +45,11 @@ const currentLanguage = (s: UserStore) => { return locale; }; +export const currentThemeMode = (s: UserStore) => { + const themeMode = currentSettings(s).themeMode; + return themeMode || 'auto'; +}; + const dalleConfig = (s: UserStore) => currentSettings(s).tool?.dalle || {}; const isDalleAutoGenerating = (s: UserStore) => currentSettings(s).tool?.dalle?.autoGenerate; @@ -52,6 +57,7 @@ export const settingsSelectors = { currentLanguage, currentSettings, currentTTS, + currentThemeMode, dalleConfig, defaultAgent, defaultAgentConfig, diff --git a/src/types/fetch.ts b/src/types/fetch.ts index 059be2248e672..f5f8725253ed2 100644 --- a/src/types/fetch.ts +++ b/src/types/fetch.ts @@ -5,6 +5,7 @@ export const ChatErrorType = { // ******* 业务错误语义 ******* // InvalidAccessCode: 'InvalidAccessCode', // 密码无效 + InvalidClerkUser: 'InvalidClerkUser', // is not Clerk User OpenAIBizError: 'OpenAIBizError', // OpenAI 返回的业务错误 NoOpenAIAPIKey: 'NoOpenAIAPIKey', OllamaServiceUnavailable: 'OllamaServiceUnavailable', // 未启动/检测到 Ollama 服务