Merge branch 'feat/attachments' into deploy/dev

This commit is contained in:
StyleZhang 2024-10-21 10:04:58 +08:00
commit aa96cb42b5
32 changed files with 853 additions and 41 deletions

2
.gitignore vendored
View File

@ -175,6 +175,8 @@ docker/volumes/pgvector/data/*
docker/volumes/pgvecto_rs/data/*
docker/nginx/conf.d/default.conf
docker/nginx/ssl/*
!docker/nginx/ssl/.gitkeep
docker/middleware.env
sdks/python-client/build

View File

@ -6,8 +6,9 @@ Dify is licensed under the Apache License 2.0, with the following additional con
a. Multi-tenant service: Unless explicitly authorized by Dify in writing, you may not use the Dify source code to operate a multi-tenant environment.
- Tenant Definition: Within the context of Dify, one tenant corresponds to one workspace. The workspace provides a separated area for each tenant's data and configurations.
b. LOGO and copyright information: In the process of using Dify's frontend components, you may not remove or modify the LOGO or copyright information in the Dify console or applications. This restriction is inapplicable to uses of Dify that do not involve its frontend components.
b. LOGO and copyright information: In the process of using Dify's frontend, you may not remove or modify the LOGO or copyright information in the Dify console or applications. This restriction is inapplicable to uses of Dify that do not involve its frontend.
- Frontend Definition: For the purposes of this license, the "frontend" of Dify includes all components located in the `web/` directory when running Dify from the raw source code, or the "web" image when running Dify with Docker.
Please contact business@dify.ai by email to inquire about licensing matters.

View File

@ -42,7 +42,7 @@ DB_DATABASE=dify
# Storage configuration
# use for store upload files, private keys...
# storage type: local, s3, azure-blob, google-storage, tencent-cos, huawei-obs, volcengine-tos, baidu-obs, supabase
# storage type: local, s3, aliyun-oss, azure-blob, baidu-obs, google-storage, huawei-obs, oci-storage, tencent-cos, volcengine-tos, supabase
STORAGE_TYPE=local
STORAGE_LOCAL_PATH=storage
S3_USE_AWS_MANAGED_IAM=false

View File

@ -36,7 +36,8 @@ from configs.middleware.vdb.weaviate_config import WeaviateConfig
class StorageConfig(BaseSettings):
STORAGE_TYPE: str = Field(
description="Type of storage to use."
" Options: 'local', 's3', 'azure-blob', 'aliyun-oss', 'google-storage'. Default is 'local'.",
" Options: 'local', 's3', 'aliyun-oss', 'azure-blob', 'baidu-obs', 'google-storage', 'huawei-obs', "
"'oci-storage', 'tencent-cos', 'volcengine-tos', 'supabase'. Default is 'local'.",
default="local",
)

View File

@ -8,6 +8,7 @@ supported_model_types:
- llm
- text-embedding
- speech2text
- rerank
configurate_methods:
- customizable-model
model_credential_schema:
@ -83,6 +84,19 @@ model_credential_schema:
placeholder:
zh_Hans: 在此输入您的模型上下文长度
en_US: Enter your Model context size
- variable: context_size
label:
zh_Hans: 模型上下文长度
en_US: Model context size
required: true
show_on:
- variable: __model_type
value: rerank
type: text-input
default: '4096'
placeholder:
zh_Hans: 在此输入您的模型上下文长度
en_US: Enter your Model context size
- variable: max_tokens_to_sample
label:
zh_Hans: 最大 token 上限

View File

@ -0,0 +1,159 @@
from json import dumps
from typing import Optional
import httpx
from requests import post
from yarl import URL
from core.model_runtime.entities.common_entities import I18nObject
from core.model_runtime.entities.model_entities import AIModelEntity, FetchFrom, ModelType
from core.model_runtime.entities.rerank_entities import RerankDocument, RerankResult
from core.model_runtime.errors.invoke import (
InvokeAuthorizationError,
InvokeBadRequestError,
InvokeConnectionError,
InvokeError,
InvokeRateLimitError,
InvokeServerUnavailableError,
)
from core.model_runtime.errors.validate import CredentialsValidateFailedError
from core.model_runtime.model_providers.__base.rerank_model import RerankModel
class OAICompatRerankModel(RerankModel):
"""
rerank model API is compatible with Jina rerank model API. So copy the JinaRerankModel class code here.
we need enhance for llama.cpp , which return raw score, not normalize score 0~1. It seems Dify need it
"""
def _invoke(
self,
model: str,
credentials: dict,
query: str,
docs: list[str],
score_threshold: Optional[float] = None,
top_n: Optional[int] = None,
user: Optional[str] = None,
) -> RerankResult:
"""
Invoke rerank model
:param model: model name
:param credentials: model credentials
:param query: search query
:param docs: docs for reranking
:param score_threshold: score threshold
:param top_n: top n documents to return
:param user: unique user id
:return: rerank result
"""
if len(docs) == 0:
return RerankResult(model=model, docs=[])
server_url = credentials["endpoint_url"]
model_name = model
if not server_url:
raise CredentialsValidateFailedError("server_url is required")
if not model_name:
raise CredentialsValidateFailedError("model_name is required")
url = server_url
headers = {"Authorization": f"Bearer {credentials.get('api_key')}", "Content-Type": "application/json"}
# TODO: Do we need truncate docs to avoid llama.cpp return error?
data = {"model": model_name, "query": query, "documents": docs, "top_n": top_n}
try:
response = post(str(URL(url) / "rerank"), headers=headers, data=dumps(data), timeout=60)
response.raise_for_status()
results = response.json()
rerank_documents = []
scores = [result["relevance_score"] for result in results["results"]]
# Min-Max Normalization: Normalize scores to 0 ~ 1.0 range
min_score = min(scores)
max_score = max(scores)
score_range = max_score - min_score if max_score != min_score else 1.0 # Avoid division by zero
for result in results["results"]:
index = result["index"]
# Retrieve document text (fallback if llama.cpp rerank doesn't return it)
text = result.get("document", {}).get("text", docs[index])
# Normalize the score
normalized_score = (result["relevance_score"] - min_score) / score_range
# Create RerankDocument object with normalized score
rerank_document = RerankDocument(
index=index,
text=text,
score=normalized_score,
)
# Apply threshold (if defined)
if score_threshold is None or normalized_score >= score_threshold:
rerank_documents.append(rerank_document)
# Sort rerank_documents by normalized score in descending order
rerank_documents.sort(key=lambda doc: doc.score, reverse=True)
return RerankResult(model=model, docs=rerank_documents)
except httpx.HTTPStatusError as e:
raise InvokeServerUnavailableError(str(e))
def validate_credentials(self, model: str, credentials: dict) -> None:
"""
Validate model credentials
:param model: model name
:param credentials: model credentials
:return:
"""
try:
self._invoke(
model=model,
credentials=credentials,
query="What is the capital of the United States?",
docs=[
"Carson City is the capital city of the American state of Nevada. At the 2010 United States "
"Census, Carson City had a population of 55,274.",
"The Commonwealth of the Northern Mariana Islands is a group of islands in the Pacific Ocean that "
"are a political division controlled by the United States. Its capital is Saipan.",
],
score_threshold=0.8,
)
except Exception as ex:
raise CredentialsValidateFailedError(str(ex))
@property
def _invoke_error_mapping(self) -> dict[type[InvokeError], list[type[Exception]]]:
"""
Map model invoke error to unified error
"""
return {
InvokeConnectionError: [httpx.ConnectError],
InvokeServerUnavailableError: [httpx.RemoteProtocolError],
InvokeRateLimitError: [],
InvokeAuthorizationError: [httpx.HTTPStatusError],
InvokeBadRequestError: [httpx.RequestError],
}
def get_customizable_model_schema(self, model: str, credentials: dict) -> AIModelEntity:
"""
generate custom model entities from credentials
"""
entity = AIModelEntity(
model=model,
label=I18nObject(en_US=model),
model_type=ModelType.RERANK,
fetch_from=FetchFrom.CUSTOMIZABLE_MODEL,
model_properties={},
)
return entity

View File

@ -2,20 +2,15 @@ from typing import Optional
import httpx
from core.model_runtime.entities.common_entities import I18nObject
from core.model_runtime.entities.model_entities import AIModelEntity, FetchFrom, ModelPropertyKey, ModelType
from core.model_runtime.entities.rerank_entities import RerankDocument, RerankResult
from core.model_runtime.errors.invoke import (
InvokeAuthorizationError,
InvokeBadRequestError,
InvokeConnectionError,
InvokeError,
InvokeRateLimitError,
InvokeServerUnavailableError,
)
from core.model_runtime.errors.invoke import InvokeError
from core.model_runtime.errors.validate import CredentialsValidateFailedError
from core.model_runtime.model_providers.__base.rerank_model import RerankModel
from core.model_runtime.model_providers.wenxin._common import _CommonWenxin
from core.model_runtime.model_providers.wenxin.wenxin_errors import (
InternalServerError,
invoke_error_mapping,
)
class WenxinRerank(_CommonWenxin):
@ -32,7 +27,7 @@ class WenxinRerank(_CommonWenxin):
response.raise_for_status()
return response.json()
except httpx.HTTPStatusError as e:
raise InvokeServerUnavailableError(str(e))
raise InternalServerError(str(e))
class WenxinRerankModel(RerankModel):
@ -93,7 +88,7 @@ class WenxinRerankModel(RerankModel):
return RerankResult(model=model, docs=rerank_documents)
except httpx.HTTPStatusError as e:
raise InvokeServerUnavailableError(str(e))
raise InternalServerError(str(e))
def validate_credentials(self, model: str, credentials: dict) -> None:
"""
@ -124,24 +119,4 @@ class WenxinRerankModel(RerankModel):
"""
Map model invoke error to unified error
"""
return {
InvokeConnectionError: [httpx.ConnectError],
InvokeServerUnavailableError: [httpx.RemoteProtocolError],
InvokeRateLimitError: [],
InvokeAuthorizationError: [httpx.HTTPStatusError],
InvokeBadRequestError: [httpx.RequestError],
}
def get_customizable_model_schema(self, model: str, credentials: dict) -> AIModelEntity:
"""
generate custom model entities from credentials
"""
entity = AIModelEntity(
model=model,
label=I18nObject(en_US=model),
model_type=ModelType.RERANK,
fetch_from=FetchFrom.CUSTOMIZABLE_MODEL,
model_properties={ModelPropertyKey.CONTEXT_SIZE: int(credentials.get("context_size"))},
)
return entity
return invoke_error_mapping()

View File

@ -21,7 +21,6 @@ class DiscordWebhookTool(BuiltinTool):
return self.create_text_message("Invalid parameter content")
webhook_url = tool_parameters.get("webhook_url", "")
if not webhook_url.startswith("https://discord.com/api/webhooks/"):
return self.create_text_message(
f"Invalid parameter webhook_url ${webhook_url}, \
@ -31,13 +30,14 @@ class DiscordWebhookTool(BuiltinTool):
headers = {
"Content-Type": "application/json",
}
params = {}
payload = {
"username": tool_parameters.get("username") or user_id,
"content": content,
"avatar_url": tool_parameters.get("avatar_url") or None,
}
try:
res = httpx.post(webhook_url, headers=headers, params=params, json=payload)
res = httpx.post(webhook_url, headers=headers, json=payload)
if res.is_success:
return self.create_text_message("Text message was sent successfully")
else:

View File

@ -38,3 +38,28 @@ parameters:
pt_BR: Content to sent to the channel or person.
llm_description: Content of the message
form: llm
- name: username
type: string
required: false
label:
en_US: Discord Webhook Username
zh_Hans: Discord Webhook用户名
pt_BR: Discord Webhook Username
human_description:
en_US: Discord Webhook Username
zh_Hans: Discord Webhook用户名
pt_BR: Discord Webhook Username
llm_description: Discord Webhook Username
form: llm
- name: avatar_url
type: string
required: false
label:
en_US: Discord Webhook Avatar
zh_Hans: Discord Webhook头像
pt_BR: Discord Webhook Avatar
human_description:
en_US: Discord Webhook Avatar URL
zh_Hans: Discord Webhook头像地址
pt_BR: Discord Webhook Avatar URL
form: form

View File

@ -288,7 +288,7 @@ class WorkflowEntry:
new_value.append(file)
if new_value:
value = new_value
input_value = new_value
# append variable and value to variable pool
variable_pool.add([variable_node_id] + variable_key_list, input_value)

View File

@ -0,0 +1,100 @@
import os
from typing import Union
from unittest.mock import MagicMock
import pytest
from _pytest.monkeypatch import MonkeyPatch
from tos import TosClientV2
from tos.clientv2 import DeleteObjectOutput, GetObjectOutput, HeadObjectOutput, PutObjectOutput
class AttrDict(dict):
def __getattr__(self, item):
return self.get(item)
def get_example_bucket() -> str:
return "dify"
def get_example_filename() -> str:
return "test.txt"
def get_example_data() -> bytes:
return b"test"
def get_example_filepath() -> str:
return "/test"
class MockVolcengineTosClass:
def __init__(self, ak="", sk="", endpoint="", region=""):
self.bucket_name = get_example_bucket()
self.key = get_example_filename()
self.content = get_example_data()
self.filepath = get_example_filepath()
self.resp = AttrDict(
{
"x-tos-server-side-encryption": "kms",
"x-tos-server-side-encryption-kms-key-id": "trn:kms:cn-beijing:****:keyrings/ring-test/keys/key-test",
"x-tos-server-side-encryption-customer-algorithm": "AES256",
"x-tos-version-id": "test",
"x-tos-hash-crc64ecma": 123456,
"request_id": "test",
"headers": {
"x-tos-id-2": "test",
"ETag": "123456",
},
"status": 200,
}
)
def put_object(self, bucket: str, key: str, content=None) -> PutObjectOutput:
assert bucket == self.bucket_name
assert key == self.key
assert content == self.content
return PutObjectOutput(self.resp)
def get_object(self, bucket: str, key: str) -> GetObjectOutput:
assert bucket == self.bucket_name
assert key == self.key
get_object_output = MagicMock(GetObjectOutput)
get_object_output.read.return_value = self.content
return get_object_output
def get_object_to_file(self, bucket: str, key: str, file_path: str):
assert bucket == self.bucket_name
assert key == self.key
assert file_path == self.filepath
def head_object(self, bucket: str, key: str) -> HeadObjectOutput:
assert bucket == self.bucket_name
assert key == self.key
return HeadObjectOutput(self.resp)
def delete_object(self, bucket: str, key: str):
assert bucket == self.bucket_name
assert key == self.key
return DeleteObjectOutput(self.resp)
MOCK = os.getenv("MOCK_SWITCH", "false").lower() == "true"
@pytest.fixture
def setup_volcengine_tos_mock(monkeypatch: MonkeyPatch):
if MOCK:
monkeypatch.setattr(TosClientV2, "__init__", MockVolcengineTosClass.__init__)
monkeypatch.setattr(TosClientV2, "put_object", MockVolcengineTosClass.put_object)
monkeypatch.setattr(TosClientV2, "get_object", MockVolcengineTosClass.get_object)
monkeypatch.setattr(TosClientV2, "get_object_to_file", MockVolcengineTosClass.get_object_to_file)
monkeypatch.setattr(TosClientV2, "head_object", MockVolcengineTosClass.head_object)
monkeypatch.setattr(TosClientV2, "delete_object", MockVolcengineTosClass.delete_object)
yield
if MOCK:
monkeypatch.undo()

View File

@ -0,0 +1,67 @@
from collections.abc import Generator
from flask import Flask
from tos import TosClientV2
from tos.clientv2 import GetObjectOutput, HeadObjectOutput, PutObjectOutput
from extensions.storage.volcengine_tos_storage import VolcengineTosStorage
from tests.unit_tests.oss.__mock.volcengine_tos import (
get_example_bucket,
get_example_data,
get_example_filename,
get_example_filepath,
setup_volcengine_tos_mock,
)
class VolcengineTosTest:
_instance = None
def __new__(cls):
if cls._instance == None:
cls._instance = object.__new__(cls)
return cls._instance
else:
return cls._instance
def __init__(self):
self.storage = VolcengineTosStorage(app=Flask(__name__))
self.storage.bucket_name = get_example_bucket()
self.storage.client = TosClientV2(
ak="dify",
sk="dify",
endpoint="https://xxx.volces.com",
region="cn-beijing",
)
def test_save(setup_volcengine_tos_mock):
volc_tos = VolcengineTosTest()
volc_tos.storage.save(get_example_filename(), get_example_data())
def test_load_once(setup_volcengine_tos_mock):
volc_tos = VolcengineTosTest()
assert volc_tos.storage.load_once(get_example_filename()) == get_example_data()
def test_load_stream(setup_volcengine_tos_mock):
volc_tos = VolcengineTosTest()
generator = volc_tos.storage.load_stream(get_example_filename())
assert isinstance(generator, Generator)
assert next(generator) == get_example_data()
def test_download(setup_volcengine_tos_mock):
volc_tos = VolcengineTosTest()
volc_tos.storage.download(get_example_filename(), get_example_filepath())
def test_exists(setup_volcengine_tos_mock):
volc_tos = VolcengineTosTest()
assert volc_tos.storage.exists(get_example_filename())
def test_delete(setup_volcengine_tos_mock):
volc_tos = VolcengineTosTest()
volc_tos.storage.delete(get_example_filename())

View File

@ -96,6 +96,10 @@ x-shared-env: &shared-api-worker-env
VOLCENGINE_TOS_ACCESS_KEY: ${VOLCENGINE_TOS_ACCESS_KEY:-}
VOLCENGINE_TOS_ENDPOINT: ${VOLCENGINE_TOS_ENDPOINT:-}
VOLCENGINE_TOS_REGION: ${VOLCENGINE_TOS_REGION:-}
BAIDU_OBS_BUCKET_NAME: ${BAIDU_OBS_BUCKET_NAME:-}
BAIDU_OBS_SECRET_KEY: ${BAIDU_OBS_SECRET_KEY:-}
BAIDU_OBS_ACCESS_KEY: ${BAIDU_OBS_ACCESS_KEY:-}
BAIDU_OBS_ENDPOINT: ${BAIDU_OBS_ENDPOINT:-}
VECTOR_STORE: ${VECTOR_STORE:-weaviate}
WEAVIATE_ENDPOINT: ${WEAVIATE_ENDPOINT:-http://weaviate:8080}
WEAVIATE_API_KEY: ${WEAVIATE_API_KEY:-WVF5YThaHlkYwhGUSmCRgsX3tD5ngdN8pkih}

View File

@ -54,6 +54,7 @@ const translation = {
passwordEmpty: 'Passwort wird benötigt',
passwordInvalid: 'Das Passwort muss Buchstaben und Zahlen enthalten und länger als 8 Zeichen sein',
passwordLengthInValid: 'Das Passwort muss mindestens 8 Zeichen lang sein',
registrationNotAllowed: 'Konto nicht gefunden. Bitte wenden Sie sich an den Systemadministrator, um sich zu registrieren.',
},
license: {
tip: 'Bevor du mit Dify Community Edition beginnst, lies die',
@ -70,6 +71,34 @@ const translation = {
adminInitPassword: 'Admin-Initialpasswort',
validate: 'Validieren',
sso: 'Mit SSO fortfahren',
checkCode: {
didNotReceiveCode: 'Sie haben den Code nicht erhalten?',
verificationCodePlaceholder: 'Geben Sie den 6-stelligen Code ein',
checkYourEmail: 'Überprüfen Sie Ihre E-Mails',
verify: 'Überprüfen',
verificationCode: 'Verifizierungscode',
useAnotherMethod: 'Verwenden Sie eine andere Methode',
validTime: 'Beachten Sie, dass der Code 5 Minuten lang gültig ist',
emptyCode: 'Code ist erforderlich',
tips: 'Wir senden einen Verifizierungscode an <strong>{{email}}</strong>',
invalidCode: 'Ungültiger Code',
resend: 'Wieder senden',
},
or: 'ODER',
back: 'Zurück',
changePasswordBtn: 'Festlegen eines Kennworts',
enterYourName: 'Bitte geben Sie Ihren Benutzernamen ein',
setYourAccount: 'Richten Sie Ihr Konto ein',
sendVerificationCode: 'Verifizierungscode senden',
useVerificationCode: 'Verifizierungscode verwenden',
withSSO: 'Mit SSO fortfahren',
resetPasswordDesc: 'Geben Sie die E-Mail-Adresse ein, mit der Sie sich bei Dify angemeldet haben, und wir senden Ihnen eine E-Mail zum Zurücksetzen des Passworts.',
continueWithCode: 'Fahren Sie mit dem Code fort',
resetPassword: 'Passwort zurücksetzen',
backToLogin: 'Zurück zum Login',
noLoginMethodTip: 'Wenden Sie sich an den Systemadministrator, um eine Authentifizierungsmethode hinzuzufügen.',
usePassword: 'Passwort verwenden',
noLoginMethod: 'Authentifizierungsmethode nicht konfiguriert',
}
export default translation

View File

@ -55,6 +55,7 @@ const translation = {
passwordEmpty: 'Se requiere una contraseña',
passwordLengthInValid: 'La contraseña debe tener al menos 8 caracteres',
passwordInvalid: 'La contraseña debe contener letras y números, y tener una longitud mayor a 8',
registrationNotAllowed: 'Cuenta no encontrada. Póngase en contacto con el administrador del sistema para registrarse.',
},
license: {
tip: 'Antes de comenzar con Dify Community Edition, lee la',
@ -70,6 +71,34 @@ const translation = {
activated: 'Inicia sesión ahora',
adminInitPassword: 'Contraseña de inicialización de administrador',
validate: 'Validar',
checkCode: {
verify: 'Verificar',
didNotReceiveCode: '¿No recibiste el código?',
verificationCodePlaceholder: 'Ingresa el código de 6 dígitos',
checkYourEmail: 'Revisa tu correo electrónico',
emptyCode: 'Se requiere código',
useAnotherMethod: 'Usar otro método',
resend: 'Reenviar',
tips: 'Enviamos un código de verificación a <strong>{{email}}</strong>',
verificationCode: 'Código de verificación',
validTime: 'Ten en cuenta que el código es válido durante 5 minutos',
invalidCode: 'Código no válido',
},
or: 'O',
back: 'Atrás',
continueWithCode: 'Continuar con el código',
usePassword: 'Usar contraseña',
changePasswordBtn: 'Establecer una contraseña',
withSSO: 'Continuar con SSO',
sendVerificationCode: 'Enviar código de verificación',
backToLogin: 'Volver al inicio de sesión',
resetPassword: 'Restablecer contraseña',
enterYourName: 'Por favor, introduzca su nombre de usuario',
useVerificationCode: 'Usar código de verificación',
resetPasswordDesc: 'Escriba el correo electrónico que utilizó para registrarse en Dify y le enviaremos un correo electrónico de restablecimiento de contraseña.',
noLoginMethod: 'Método de autenticación no configurado',
setYourAccount: 'Configura tu cuenta',
noLoginMethodTip: 'Póngase en contacto con el administrador del sistema para agregar un método de autenticación.',
}
export default translation

View File

@ -55,6 +55,7 @@ const translation = {
passwordEmpty: 'رمز عبور لازم است',
passwordLengthInValid: 'رمز عبور باید حداقل ۸ کاراکتر باشد',
passwordInvalid: 'رمز عبور باید شامل حروف و اعداد باشد و طول آن بیشتر از ۸ کاراکتر باشد',
registrationNotAllowed: 'حساب پیدا نشد. لطفا برای ثبت نام با مدیر سیستم تماس حاصل فرمایید.',
},
license: {
tip: 'قبل از شروع Dify Community Edition، GitHub را بخوانید',
@ -70,6 +71,34 @@ const translation = {
activated: 'اکنون وارد شوید',
adminInitPassword: 'رمز عبور اولیه مدیر',
validate: 'اعتبارسنجی',
checkCode: {
verify: 'تایید',
verificationCode: 'کد تأیید',
invalidCode: 'کد نامعتبر',
emptyCode: 'کد مورد نیاز است',
didNotReceiveCode: 'کد را دریافت نکردید؟',
verificationCodePlaceholder: 'کد 6 رقمی را وارد کنید',
useAnotherMethod: 'از روش دیگری استفاده کنید',
checkYourEmail: 'ایمیل خود را بررسی کنید',
validTime: 'به خاطر داشته باشید که کد 5 دقیقه اعتبار دارد',
tips: 'کد درستی سنجی را به <strong>{{email}}</strong> ارسال می کنیم',
resend: 'ارسال مجدد',
},
or: 'یا',
back: 'بازگشت',
backToLogin: 'بازگشت به ورود',
changePasswordBtn: 'تنظیم رمز عبور',
continueWithCode: 'با کد ادامه دهید',
withSSO: 'با SSO ادامه دهید',
resetPassword: 'بازنشانی رمز عبور',
usePassword: 'از رمز عبور استفاده کنید',
enterYourName: 'لطفا نام کاربری خود را وارد کنید',
useVerificationCode: 'از کد تأیید استفاده کنید',
sendVerificationCode: 'ارسال کد تأیید',
setYourAccount: 'حساب خود را تنظیم کنید',
noLoginMethod: 'روش احراز هویت پیکربندی نشده است',
noLoginMethodTip: 'لطفا برای افزودن روش احراز هویت با مدیر سیستم تماس بگیرید.',
resetPasswordDesc: 'ایمیلی را که برای ثبت نام در Dify استفاده کرده اید تایپ کنید و ما یک ایمیل بازنشانی رمز عبور برای شما ارسال خواهیم کرد.',
}
export default translation

View File

@ -54,6 +54,7 @@ const translation = {
passwordEmpty: 'Un mot de passe est requis',
passwordInvalid: 'Le mot de passe doit contenir des lettres et des chiffres, et la longueur doit être supérieure à 8.',
passwordLengthInValid: 'Le mot de passe doit comporter au moins 8 caractères.',
registrationNotAllowed: 'Compte introuvable. Veuillez contacter ladministrateur système pour vous inscrire.',
},
license: {
tip: 'Avant de commencer Dify Community Edition, lisez le GitHub',
@ -70,6 +71,34 @@ const translation = {
adminInitPassword: 'Mot de passe d\'initialisation de l\'administrateur',
validate: 'Valider',
sso: 'Poursuivre avec lauthentification unique',
checkCode: {
verificationCode: 'Code de vérification',
useAnotherMethod: 'Utiliser une autre méthode',
didNotReceiveCode: 'Vous navez pas reçu le code ?',
emptyCode: 'Le code est requis',
verify: 'Vérifier',
verificationCodePlaceholder: 'Entrez le code à 6 chiffres',
resend: 'Renvoyer',
invalidCode: 'Code non valide',
checkYourEmail: 'Vérifiez vos e-mails',
validTime: 'Gardez à lesprit que le code est valable 5 minutes',
tips: 'Nous envoyons un code de vérification à <strong>{{email}}</strong>',
},
sendVerificationCode: 'Envoyer le code de vérification',
or: 'OU',
continueWithCode: 'Continuer avec le code',
useVerificationCode: 'Utiliser le code de vérification',
noLoginMethod: 'Méthode dauthentification non configurée',
backToLogin: 'Retour à la connexion',
changePasswordBtn: 'Définir un mot de passe',
setYourAccount: 'Configurer votre compte',
withSSO: 'Poursuivre avec lauthentification unique',
resetPassword: 'Réinitialiser le mot de passe',
back: 'Précédent',
enterYourName: 'Veuillez entrer votre nom dutilisateur',
noLoginMethodTip: 'Veuillez contacter ladministrateur système pour ajouter une méthode dauthentification.',
resetPasswordDesc: 'Tapez ladresse e-mail que vous avez utilisée pour vous inscrire sur Dify et nous vous enverrons un e-mail de réinitialisation de mot de passe.',
usePassword: 'Utiliser le mot de passe',
}
export default translation

View File

@ -60,6 +60,7 @@ const translation = {
passwordLengthInValid: 'पासवर्ड कम से कम 8 वर्णों का होना चाहिए',
passwordInvalid:
'पासवर्ड में अक्षर और अंक होने चाहिए, और लंबाई 8 से अधिक होनी चाहिए',
registrationNotAllowed: 'खाता नहीं मिला. रजिस्टर करने के लिए कृपया सिस्टम एडमिन से संपर्क करें।',
},
license: {
tip: 'Dify Community Edition शुरू करने से पहले, GitHub पर',
@ -75,6 +76,34 @@ const translation = {
activated: 'अब साइन इन करें',
adminInitPassword: 'एडमिन प्रारंभिक पासवर्ड',
validate: 'सत्यापित करें',
checkCode: {
verify: 'जाँचना',
verificationCode: 'सत्यापन कोड',
invalidCode: 'अमान्य कोड',
useAnotherMethod: 'किसी अन्य विधि का उपयोग करें',
emptyCode: 'कोड आवश्यक है',
didNotReceiveCode: 'कोड प्राप्त नहीं हुआ?',
resend: 'भेजें',
checkYourEmail: 'अपना ईमेल जांचें',
validTime: 'ध्यान रखें कि कोड 5 मिनट के लिए वैध है',
tips: 'हम <strong>{{email}}</strong> को एक सत्यापन कोड भेजते हैं',
verificationCodePlaceholder: '6-अंक कोड दर्ज करें',
},
sendVerificationCode: 'पुष्टि कोड भेजें',
or: 'नहीं तो',
continueWithCode: 'कोड के साथ जारी रखें',
resetPassword: 'पासवर्ड रीसेट करें',
changePasswordBtn: 'पासवर्ड सेट करें',
setYourAccount: 'अपना खाता सेट करें',
useVerificationCode: 'सत्यापन कोड का उपयोग करें',
usePassword: 'पासवर्ड का उपयोग करें',
backToLogin: 'लॉगिन पर वापस जाएं',
noLoginMethod: 'प्रमाणीकरण विधि कॉन्फ़िगर नहीं की गई',
enterYourName: 'कृपया अपना उपयोगकर्ता नाम दर्ज करें',
noLoginMethodTip: 'प्रमाणीकरण विधि जोड़ने के लिए कृपया सिस्टम व्यवस्थापक से संपर्क करें.',
resetPasswordDesc: 'वह ईमेल टाइप करें जिसका उपयोग आपने Dify पर साइन अप करने के लिए किया था और हम आपको एक पासवर्ड रीसेट ईमेल भेजेंगे।',
withSSO: 'एसएसओ के साथ जारी रखें',
back: 'पीछे',
}
export default translation

View File

@ -65,6 +65,7 @@ const translation = {
passwordLengthInValid: 'La password deve essere di almeno 8 caratteri',
passwordInvalid:
'La password deve contenere lettere e numeri, e la lunghezza deve essere maggiore di 8',
registrationNotAllowed: 'Account non trovato. Si prega di contattare l\'amministratore di sistema per registrarsi.',
},
license: {
tip: 'Prima di avviare Dify Community Edition, leggi su GitHub',
@ -80,6 +81,34 @@ const translation = {
activated: 'Accedi ora',
adminInitPassword: 'Password di inizializzazione amministratore',
validate: 'Convalida',
checkCode: {
invalidCode: 'Codice non valido',
verificationCodePlaceholder: 'Inserisci il codice a 6 cifre',
verify: 'Verificare',
emptyCode: 'Il codice è obbligatorio',
resend: 'Inviare',
verificationCode: 'Codice di verifica',
validTime: 'Tieni presente che il codice è valido per 5 minuti',
didNotReceiveCode: 'Non hai ricevuto il codice?',
checkYourEmail: 'Controlla la tua email',
tips: 'Inviamo un codice di verifica a <strong>{{email}}</strong>',
useAnotherMethod: 'Usa un altro metodo',
},
or: 'O',
back: 'Indietro',
noLoginMethod: 'Metodo di autenticazione non configurato',
backToLogin: 'Torna al login',
changePasswordBtn: 'Imposta una password',
setYourAccount: 'Imposta il tuo account',
withSSO: 'Continua con SSO',
usePassword: 'Usa password',
resetPassword: 'Reimposta password',
continueWithCode: 'Continua con il codice',
sendVerificationCode: 'Invia codice di verifica',
useVerificationCode: 'Usa il codice di verifica',
resetPasswordDesc: 'Digita l\'e-mail che hai utilizzato per registrarti su Dify e ti invieremo un\'e-mail per reimpostare la password.',
noLoginMethodTip: 'Contatta l\'amministratore di sistema per aggiungere un metodo di autenticazione.',
enterYourName: 'Inserisci il tuo nome utente',
}
export default translation

View File

@ -55,6 +55,7 @@ const translation = {
passwordEmpty: 'パスワードは必須です',
passwordLengthInValid: 'パスワードは8文字以上でなければなりません',
passwordInvalid: 'パスワードは文字と数字を含み、長さは8以上である必要があります',
registrationNotAllowed: 'アカウントが見つかりません。登録するためにシステム管理者に連絡してください。',
},
license: {
tip: 'Dify Community Editionを開始する前に、GitHubの',
@ -70,6 +71,34 @@ const translation = {
activated: '今すぐサインイン',
adminInitPassword: '管理者初期化パスワード',
validate: '検証',
checkCode: {
invalidCode: '無効なコード',
verify: '確かめる',
verificationCodePlaceholder: '6桁のコードを入力してください',
useAnotherMethod: '別の方法を使用する',
didNotReceiveCode: 'コードが届きませんか?',
resend: '再送',
verificationCode: '認証コード',
tips: '<strong>確認コードを{{email}}に送信します。</strong>',
validTime: 'コードは5分間有効であることに注意してください',
emptyCode: 'コードが必要です',
checkYourEmail: 'メールをチェックしてください',
},
useVerificationCode: '確認コードを使用する',
or: '又は',
back: '戻る',
resetPassword: 'パスワードのリセット',
changePasswordBtn: 'パスワードを設定する',
setYourAccount: 'アカウントを設定する',
withSSO: 'SSOを続行する',
noLoginMethod: '認証方法が構成されていません',
backToLogin: 'ログインに戻る',
continueWithCode: 'コードで続行',
noLoginMethodTip: 'システム管理者に連絡して、認証方法を追加してください。',
usePassword: 'パスワードを使用',
sendVerificationCode: '確認コードの送信',
enterYourName: 'ユーザー名を入力してください',
resetPasswordDesc: 'Difyへのサインアップに使用したメールアドレスを入力すると、パスワードリセットメールが送信されます。',
}
export default translation

View File

@ -54,6 +54,7 @@ const translation = {
passwordEmpty: '비밀번호를 입력하세요.',
passwordInvalid: '비밀번호는 문자와 숫자를 포함하고 8자 이상이어야 합니다.',
passwordLengthInValid: '비밀번호는 8자 이상이어야 합니다.',
registrationNotAllowed: '계정을 찾을 수 없습니다. 등록하려면 시스템 관리자에게 문의하십시오.',
},
license: {
tip: 'Dify Community Edition을 시작하기 전에 GitHub의',
@ -70,6 +71,34 @@ const translation = {
adminInitPassword: '관리자 초기화 비밀번호',
validate: '확인',
sso: 'SSO로 계속하기',
checkCode: {
verify: '확인',
verificationCode: '인증 코드',
tips: '<strong>{{email}}</strong>로 인증 코드를 보내드립니다.',
validTime: '코드는 5분 동안 유효합니다',
checkYourEmail: '이메일 주소 확인',
invalidCode: '유효하지 않은 코드',
verificationCodePlaceholder: '6자리 코드 입력',
emptyCode: '코드가 필요합니다.',
useAnotherMethod: '다른 방법 사용',
didNotReceiveCode: '코드를 받지 못하셨나요?',
resend: '재전송',
},
back: '뒤로',
or: '또는',
useVerificationCode: '인증 코드 사용',
continueWithCode: '코드로 계속하기',
usePassword: '비밀번호 사용',
withSSO: 'SSO로 계속하기',
backToLogin: '로그인으로 돌아가기',
resetPassword: '비밀번호 재설정',
setYourAccount: '계정 설정',
noLoginMethod: '인증 방법이 구성되지 않음',
sendVerificationCode: '인증 코드 보내기',
changePasswordBtn: '비밀번호 설정',
enterYourName: '사용자 이름을 입력해 주세요',
noLoginMethodTip: '인증 방법을 추가하려면 시스템 관리자에게 문의하십시오.',
resetPasswordDesc: 'Dify에 가입할 때 사용한 이메일을 입력하면 비밀번호 재설정 이메일을 보내드립니다.',
}
export default translation

View File

@ -60,6 +60,7 @@ const translation = {
passwordInvalid:
'Hasło musi zawierać litery i cyfry, a jego długość musi być większa niż 8',
passwordLengthInValid: 'Hasło musi składać się z co najmniej 8 znaków',
registrationNotAllowed: 'Nie znaleziono konta. Skontaktuj się z administratorem systemu, aby się zarejestrować.',
},
license: {
tip: 'Przed rozpoczęciem wersji społecznościowej Dify, przeczytaj GitHub',
@ -75,6 +76,34 @@ const translation = {
activated: 'Zaloguj się teraz',
adminInitPassword: 'Hasło inicjalizacyjne administratora',
validate: 'Sprawdź',
checkCode: {
verify: 'Zweryfikować',
resend: 'Wysłać',
invalidCode: 'Nieprawidłowy kod',
verificationCodePlaceholder: 'Wprowadź 6-cyfrowy kod',
validTime: 'Pamiętaj, że kod jest ważny przez 5 minut',
checkYourEmail: 'Sprawdź swoją pocztę e-mail',
useAnotherMethod: 'Użyj innej metody',
didNotReceiveCode: 'Nie otrzymałeś kodu?',
verificationCode: 'Kod weryfikacyjny',
tips: 'Wysyłamy kod weryfikacyjny na <strong>adres {{email}}</strong>',
emptyCode: 'Kod jest wymagany',
},
continueWithCode: 'Kontynuuj z kodem',
setYourAccount: 'Ustaw swoje konto',
usePassword: 'Użyj hasła',
withSSO: 'Kontynuuj logowanie jednokrotne',
sendVerificationCode: 'Wyślij kod weryfikacyjny',
back: 'Wstecz',
resetPassword: 'Zresetuj hasło',
changePasswordBtn: 'Ustawianie hasła',
backToLogin: 'Powrót do logowania',
useVerificationCode: 'Użyj kodu weryfikacyjnego',
enterYourName: 'Podaj swoją nazwę użytkownika',
resetPasswordDesc: 'Wpisz adres e-mail, którego użyłeś do rejestracji w Dify, a my wyślemy Ci wiadomość e-mail z prośbą o zresetowanie hasła.',
or: 'LUB',
noLoginMethodTip: 'Skontaktuj się z administratorem systemu, aby dodać metodę uwierzytelniania.',
noLoginMethod: 'Nie skonfigurowano metody uwierzytelniania',
}
export default translation

View File

@ -54,6 +54,7 @@ const translation = {
passwordEmpty: 'A senha é obrigatória',
passwordInvalid: 'A senha deve conter letras e números e ter um comprimento maior que 8',
passwordLengthInValid: 'A senha deve ter pelo menos 8 caracteres',
registrationNotAllowed: 'Conta não encontrada. Entre em contato com o administrador do sistema para se registrar.',
},
license: {
tip: 'Antes de começar a usar a Edição Comunitária do Dify, leia a',
@ -70,6 +71,34 @@ const translation = {
adminInitPassword: 'Senha de inicialização do administrador',
validate: 'Validar',
sso: 'Continuar com SSO',
checkCode: {
useAnotherMethod: 'Use outro método',
invalidCode: 'Código inválido',
verificationCodePlaceholder: 'Digite o código de 6 dígitos',
checkYourEmail: 'Verifique seu e-mail',
tips: 'Enviamos um código de verificação para <strong>{{email}}</strong>',
emptyCode: 'O código é necessário',
verify: 'Verificar',
verificationCode: 'Código de verificação',
resend: 'Reenviar',
didNotReceiveCode: 'Não recebeu o código?',
validTime: 'Lembre-se de que o código é válido por 5 minutos',
},
resetPassword: 'Redefinir senha',
or: 'OU',
withSSO: 'Continuar com SSO',
setYourAccount: 'Defina sua conta',
backToLogin: 'Voltar ao login',
noLoginMethodTip: 'Entre em contato com o administrador do sistema para adicionar um método de autenticação.',
continueWithCode: 'Continuar com o código',
enterYourName: 'Por favor, digite seu nome de usuário',
noLoginMethod: 'Método de autenticação não configurado',
useVerificationCode: 'Usar código de verificação',
back: 'Voltar',
changePasswordBtn: 'Definir uma senha',
resetPasswordDesc: 'Digite o e-mail que você usou para se inscrever no Dify e enviaremos um e-mail de redefinição de senha.',
sendVerificationCode: 'Enviar código de verificação',
usePassword: 'Usar senha',
}
export default translation

View File

@ -55,6 +55,7 @@ const translation = {
passwordEmpty: 'Parola este obligatorie',
passwordInvalid: 'Parola trebuie să conțină litere și cifre, iar lungimea trebuie să fie mai mare de 8 caractere',
passwordLengthInValid: 'Parola trebuie să aibă cel puțin 8 caractere',
registrationNotAllowed: 'Contul nu a fost găsit. Vă rugăm să contactați administratorul de sistem pentru a vă înregistra.',
},
license: {
tip: 'Înainte de a începe Dify Community Edition, citește',
@ -70,6 +71,34 @@ const translation = {
activated: 'Autentifică-te acum',
adminInitPassword: 'Parola de inițializare a administratorului',
validate: 'Validează',
checkCode: {
verificationCode: 'Cod de verificare',
invalidCode: 'Cod nevalid',
checkYourEmail: 'Verifică-ți e-mailul',
validTime: 'Rețineți că codul este valabil timp de 5 minute',
didNotReceiveCode: 'Nu ați primit codul?',
verificationCodePlaceholder: 'Introduceți codul din 6 cifre',
emptyCode: 'Codul este necesar',
verify: 'Verifica',
tips: 'Trimitem un cod de verificare la <strong>{{email}}</strong>',
useAnotherMethod: 'Utilizați o altă metodă',
resend: 'Retrimite',
},
usePassword: 'Utilizați parola',
useVerificationCode: 'Utilizarea codului de verificare',
sendVerificationCode: 'Trimiteți codul de verificare',
resetPassword: 'Resetați parola',
withSSO: 'Continuați cu SSO',
setYourAccount: 'Setați-vă contul',
noLoginMethodTip: 'Vă rugăm să contactați administratorul de sistem pentru a adăuga o metodă de autentificare.',
back: 'Spate',
backToLogin: 'Înapoi la autentificare',
continueWithCode: 'Continuați cu codul',
noLoginMethod: 'Metoda de autentificare nu este configurată',
enterYourName: 'Vă rugăm să introduceți numele de utilizator',
or: 'SAU',
resetPasswordDesc: 'Tastați e-mailul pe care l-ați folosit pentru a vă înscrie pe Dify și vă vom trimite un e-mail de resetare a parolei.',
changePasswordBtn: 'Setați o parolă',
}
export default translation

View File

@ -55,6 +55,7 @@ const translation = {
passwordEmpty: 'Пароль обязателен',
passwordLengthInValid: 'Пароль должен содержать не менее 8 символов',
passwordInvalid: 'Пароль должен содержать буквы и цифры, а длина должна быть больше 8',
registrationNotAllowed: 'Аккаунт не найден. Пожалуйста, свяжитесь с системным администратором для регистрации.',
},
license: {
tip: 'Перед запуском Dify Community Edition ознакомьтесь с лицензией GitHub',
@ -70,6 +71,34 @@ const translation = {
activated: 'Войдите сейчас',
adminInitPassword: 'Пароль инициализации администратора',
validate: 'Проверить',
checkCode: {
verify: 'Проверять',
resend: 'Отправить',
invalidCode: 'Неверный код',
didNotReceiveCode: 'Не получили код?',
emptyCode: 'Код обязателен для заполнения',
verificationCode: 'Проверочный код',
checkYourEmail: 'Проверьте свою электронную почту',
tips: 'Мы отправляем код подтверждения на <strong>{{email}}</strong>',
validTime: 'Имейте в виду, что код действителен в течение 5 минут',
verificationCodePlaceholder: 'Введите 6-значный код',
useAnotherMethod: 'Используйте другой метод',
},
back: 'Назад',
changePasswordBtn: 'Установите пароль',
usePassword: 'Использовать пароль',
continueWithCode: 'Продолжить с кодом',
resetPassword: 'Сброс пароля',
withSSO: 'Продолжение работы с SSO',
noLoginMethod: 'Метод аутентификации не настроен',
useVerificationCode: 'Используйте код подтверждения',
sendVerificationCode: 'Отправить код подтверждения',
setYourAccount: 'Настройте свою учетную запись',
backToLogin: 'Вернуться к входу',
enterYourName: 'Пожалуйста, введите свое имя пользователя',
noLoginMethodTip: 'Обратитесь к системному администратору, чтобы добавить метод аутентификации.',
resetPasswordDesc: 'Введите адрес электронной почты, который вы использовали для регистрации в Dify, и мы отправим вам электронное письмо для сброса пароля.',
or: 'ИЛИ',
}
export default translation

View File

@ -55,6 +55,7 @@ const translation = {
passwordEmpty: 'Şifre gereklidir',
passwordLengthInValid: 'Şifre en az 8 karakterden oluşmalıdır',
passwordInvalid: 'Şifre harf ve rakamlardan oluşmalı ve uzunluğu 8 karakterden fazla olmalıdır',
registrationNotAllowed: 'Hesap bulunamadı. Kayıt olmak için lütfen sistem yöneticisi ile iletişime geçin.',
},
license: {
tip: 'Dify Community Edition\'ı başlatmadan önce GitHub\'daki',
@ -70,6 +71,34 @@ const translation = {
activated: 'Şimdi giriş yapın',
adminInitPassword: 'Yönetici başlangıç şifresi',
validate: 'Doğrula',
checkCode: {
emptyCode: 'Kod gereklidir',
verificationCode: 'Doğrulama kodu',
verify: 'Doğrulamak',
validTime: 'Kodun 5 dakika boyunca geçerli olduğunu unutmayın',
invalidCode: 'Geçersiz kod',
checkYourEmail: 'E-postanızı kontrol edin',
verificationCodePlaceholder: '6 haneli kodu girin',
useAnotherMethod: 'Başka bir yöntem kullanın',
didNotReceiveCode: 'Kodu almadınız mı?',
tips: '<strong>{{email}}</strong> adresine bir doğrulama kodu gönderiyoruz',
resend: 'Tekrar Gönder',
},
enterYourName: 'Lütfen kullanıcı adınızı giriniz',
resetPassword: 'Şifre Sıfırlama',
noLoginMethod: 'Kimlik doğrulama yöntemi yapılandırılmadı',
or: 'VEYA',
continueWithCode: 'Kodla Devam Et',
setYourAccount: 'Hesabınızı Ayarlayın',
changePasswordBtn: 'Bir şifre belirleyin',
withSSO: 'TOA ile devam etme',
usePassword: 'Şifre Kullan',
resetPasswordDesc: 'Dify\'a kaydolmak için kullandığınız e-postayı yazın, size bir şifre sıfırlama e-postası gönderelim.',
backToLogin: 'Girişe geri dön',
useVerificationCode: 'Doğrulama Kodunu Kullan',
noLoginMethodTip: 'Bir kimlik doğrulama yöntemi eklemek için lütfen sistem yöneticisine başvurun.',
sendVerificationCode: 'Doğrulama Kodu Gönder',
back: 'Geri',
}
export default translation

View File

@ -54,6 +54,7 @@ const translation = {
passwordEmpty: 'Пароль є обов’язковим',
passwordInvalid: 'Пароль повинен містити літери та цифри, а довжина повинна бути більшою за 8',
passwordLengthInValid: 'Пароль повинен бути не менше 8 символів',
registrationNotAllowed: 'Аккаунт не знайдено. Будь ласка, зверніться до адміністратора системи для реєстрації.',
},
license: {
tip: 'Перед запуском Dify Community Edition ознайомтеся з ліцензією з відкритим кодом на GitHub',
@ -70,6 +71,34 @@ const translation = {
adminInitPassword: 'Пароль ініціалізації адміністратора',
validate: 'Перевірити',
sso: 'Продовжуйте працювати з SSW',
checkCode: {
didNotReceiveCode: 'Не отримали код?',
invalidCode: 'Невірний код',
resend: 'Відправити',
verificationCodePlaceholder: 'Введіть 6-значний код',
emptyCode: 'Код обов\'язковий',
checkYourEmail: 'Перевірте свою електронну пошту',
verify: 'Перевірити',
verificationCode: 'Код підтвердження',
useAnotherMethod: 'Використовуйте інший спосіб',
tips: 'Ми надсилаємо код підтвердження на <strong>адресу {{email}}</strong>',
validTime: 'Майте на увазі, що код дійсний протягом 5 хвилин',
},
back: 'Задній',
backToLogin: 'Назад до входу',
or: 'АБО',
usePassword: 'Використовуйте пароль',
sendVerificationCode: 'Надішліть код підтвердження',
changePasswordBtn: 'Встановіть пароль',
noLoginMethod: 'Метод автентифікації не налаштовано',
withSSO: 'Продовжуйте працювати з SSW',
useVerificationCode: 'Використовуйте код підтвердження',
setYourAccount: 'Налаштуйте свій обліковий запис',
enterYourName: 'Будь ласка, введіть своє ім\'я користувача',
continueWithCode: 'Продовжити з кодом',
noLoginMethodTip: 'Будь ласка, зверніться до адміністратора системи, щоб додати метод автентифікації.',
resetPasswordDesc: 'Введіть адресу електронної пошти, яку ви використовували для реєстрації на Dify, і ми надішлемо вам електронний лист для скидання пароля.',
resetPassword: 'Скинути пароль',
}
export default translation

View File

@ -54,6 +54,7 @@ const translation = {
passwordEmpty: 'Vui lòng nhập mật khẩu',
passwordInvalid: 'Mật khẩu phải chứa cả chữ và số, và có độ dài ít nhất 8 ký tự',
passwordLengthInValid: 'Mật khẩu phải có ít nhất 8 ký tự',
registrationNotAllowed: 'Không tìm thấy tài khoản. Vui lòng liên hệ với quản trị viên hệ thống để đăng ký.',
},
license: {
tip: 'Trước khi bắt đầu sử dụng Phiên bản Cộng đồng của Dify, vui lòng đọc',
@ -70,6 +71,34 @@ const translation = {
adminInitPassword: 'Mật khẩu khởi tạo quản trị viên',
validate: 'Xác thực',
sso: 'Tiếp tục với SSO',
checkCode: {
checkYourEmail: 'Kiểm tra email của bạn',
verify: 'Xác minh',
resend: 'Gửi lại',
didNotReceiveCode: 'Bạn không nhận được mã?',
validTime: 'Lưu ý rằng mã có hiệu lực trong 5 phút',
invalidCode: 'Mã không hợp lệ',
verificationCode: 'Mã xác minh',
useAnotherMethod: 'Sử dụng phương pháp khác',
emptyCode: 'Mã là bắt buộc',
verificationCodePlaceholder: 'Nhập mã gồm 6 chữ số',
tips: 'Chúng tôi gửi mã xác minh đến <strong>{{email}}</strong>',
},
back: 'Lưng',
withSSO: 'Tiếp tục với SSO',
continueWithCode: 'Tiếp tục với mã',
changePasswordBtn: 'Đặt mật khẩu',
useVerificationCode: 'Sử dụng mã xác minh',
noLoginMethodTip: 'Vui lòng liên hệ với quản trị viên hệ thống để thêm phương thức xác thực.',
enterYourName: 'Vui lòng nhập tên người dùng của bạn',
setYourAccount: 'Đặt tài khoản của bạn',
backToLogin: 'Quay lại đăng nhập',
noLoginMethod: 'Phương thức xác thực không được cấu hình',
or: 'HOẶC',
resetPasswordDesc: 'Nhập email bạn đã sử dụng để đăng ký trên Dify và chúng tôi sẽ gửi cho bạn email đặt lại mật khẩu.',
usePassword: 'Sử dụng mật khẩu',
resetPassword: 'Đặt lại mật khẩu',
sendVerificationCode: 'Gửi mã xác minh',
}
export default translation

View File

@ -54,6 +54,7 @@ const translation = {
passwordEmpty: '密碼不能為空',
passwordInvalid: '密碼必須包含字母和數字且長度不小於8位',
passwordLengthInValid: '密碼必須至少為8個字元',
registrationNotAllowed: '找不到帳戶。請聯繫系統管理員進行註冊。',
},
license: {
tip: '啟動 Dify 社群版之前, 請閱讀 GitHub 上的',
@ -70,6 +71,34 @@ const translation = {
adminInitPassword: '管理員初始化密碼',
validate: '驗證',
sso: '繼續使用 SSO',
checkCode: {
verify: '驗證',
resend: '發送',
didNotReceiveCode: '沒有收到驗證碼?',
emptyCode: '驗證碼是必需的',
checkYourEmail: '檢查您的電子郵件',
tips: '我們將驗證碼發送到 <strong>{{email}}</strong>',
verificationCodePlaceholder: '輸入6位代碼',
useAnotherMethod: '使用其他方法',
validTime: '請記住,該代碼的有效期為 5 分鐘',
verificationCode: '驗證碼',
invalidCode: '無效代碼',
},
continueWithCode: 'Continue With Code',
or: '或',
sendVerificationCode: '發送驗證碼',
resetPassword: '重置密碼',
noLoginMethod: '未配置身份驗證方法',
setYourAccount: '設置您的帳戶',
useVerificationCode: '使用驗證碼',
changePasswordBtn: '設置密碼',
enterYourName: '請輸入您的使用者名',
backToLogin: '返回登錄',
noLoginMethodTip: '請聯繫系統管理員以添加身份驗證方法。',
withSSO: '繼續使用 SSO',
back: '返回',
resetPasswordDesc: '輸入您用於註冊 Dify 的電子郵件,我們將向您發送一封密碼重置電子郵件。',
usePassword: '使用密碼',
}
export default translation