Compare commits

..

4 Commits

Author SHA1 Message Date
Benjamin
1fde2c7d0a
Merge 643fb5c4b1 into d05fee1182 2024-11-15 11:51:22 +00:00
github-actions[bot]
d05fee1182
chore: translate i18n files (#10754)
Some checks are pending
Build and Push API & Web / build (api, DIFY_API_IMAGE_NAME, linux/amd64, build-api-amd64) (push) Waiting to run
Build and Push API & Web / build (api, DIFY_API_IMAGE_NAME, linux/arm64, build-api-arm64) (push) Waiting to run
Build and Push API & Web / build (web, DIFY_WEB_IMAGE_NAME, linux/amd64, build-web-amd64) (push) Waiting to run
Build and Push API & Web / build (web, DIFY_WEB_IMAGE_NAME, linux/arm64, build-web-arm64) (push) Waiting to run
Build and Push API & Web / create-manifest (api, DIFY_API_IMAGE_NAME, merge-api-images) (push) Blocked by required conditions
Build and Push API & Web / create-manifest (web, DIFY_WEB_IMAGE_NAME, merge-web-images) (push) Blocked by required conditions
Co-authored-by: douxc <7553076+douxc@users.noreply.github.com>
Co-authored-by: crazywoola <100913391+crazywoola@users.noreply.github.com>
Co-authored-by: crazywoola <427733928@qq.com>
2024-11-15 19:31:15 +08:00
NFish
1f87676d52
Supports display license status (#10408)
Some checks are pending
Build and Push API & Web / build (api, DIFY_API_IMAGE_NAME, linux/amd64, build-api-amd64) (push) Waiting to run
Build and Push API & Web / build (api, DIFY_API_IMAGE_NAME, linux/arm64, build-api-arm64) (push) Waiting to run
Build and Push API & Web / build (web, DIFY_WEB_IMAGE_NAME, linux/amd64, build-web-amd64) (push) Waiting to run
Build and Push API & Web / build (web, DIFY_WEB_IMAGE_NAME, linux/arm64, build-web-arm64) (push) Waiting to run
Build and Push API & Web / create-manifest (api, DIFY_API_IMAGE_NAME, merge-api-images) (push) Blocked by required conditions
Build and Push API & Web / create-manifest (web, DIFY_WEB_IMAGE_NAME, merge-web-images) (push) Blocked by required conditions
Co-authored-by: Garfield Dai <dai.hai@foxmail.com>
2024-11-15 17:59:48 +08:00
Garfield Dai
c2ce2f88c7
feat: add license. (#10403) 2024-11-15 17:59:36 +08:00
70 changed files with 1198 additions and 58 deletions

View File

@ -9,6 +9,7 @@ from controllers.console.app.wraps import get_app_model
from controllers.console.wraps import ( from controllers.console.wraps import (
account_initialization_required, account_initialization_required,
cloud_edition_billing_resource_check, cloud_edition_billing_resource_check,
enterprise_license_required,
setup_required, setup_required,
) )
from core.ops.ops_trace_manager import OpsTraceManager from core.ops.ops_trace_manager import OpsTraceManager
@ -28,6 +29,7 @@ class AppListApi(Resource):
@setup_required @setup_required
@login_required @login_required
@account_initialization_required @account_initialization_required
@enterprise_license_required
def get(self): def get(self):
"""Get app list""" """Get app list"""
@ -149,6 +151,7 @@ class AppApi(Resource):
@setup_required @setup_required
@login_required @login_required
@account_initialization_required @account_initialization_required
@enterprise_license_required
@get_app_model @get_app_model
@marshal_with(app_detail_fields_with_site) @marshal_with(app_detail_fields_with_site)
def get(self, app_model): def get(self, app_model):

View File

@ -10,7 +10,7 @@ from controllers.console import api
from controllers.console.apikey import api_key_fields, api_key_list from controllers.console.apikey import api_key_fields, api_key_list
from controllers.console.app.error import ProviderNotInitializeError from controllers.console.app.error import ProviderNotInitializeError
from controllers.console.datasets.error import DatasetInUseError, DatasetNameDuplicateError, IndexingEstimateError from controllers.console.datasets.error import DatasetInUseError, DatasetNameDuplicateError, IndexingEstimateError
from controllers.console.wraps import account_initialization_required, setup_required from controllers.console.wraps import account_initialization_required, enterprise_license_required, setup_required
from core.errors.error import LLMBadRequestError, ProviderTokenNotInitError from core.errors.error import LLMBadRequestError, ProviderTokenNotInitError
from core.indexing_runner import IndexingRunner from core.indexing_runner import IndexingRunner
from core.model_runtime.entities.model_entities import ModelType from core.model_runtime.entities.model_entities import ModelType
@ -44,6 +44,7 @@ class DatasetListApi(Resource):
@setup_required @setup_required
@login_required @login_required
@account_initialization_required @account_initialization_required
@enterprise_license_required
def get(self): def get(self):
page = request.args.get("page", default=1, type=int) page = request.args.get("page", default=1, type=int)
limit = request.args.get("limit", default=20, type=int) limit = request.args.get("limit", default=20, type=int)

View File

@ -86,3 +86,9 @@ class NoFileUploadedError(BaseHTTPException):
error_code = "no_file_uploaded" error_code = "no_file_uploaded"
description = "Please upload your file." description = "Please upload your file."
code = 400 code = 400
class UnauthorizedAndForceLogout(BaseHTTPException):
error_code = "unauthorized_and_force_logout"
description = "Unauthorized and force logout."
code = 401

View File

@ -14,7 +14,7 @@ from controllers.console.workspace.error import (
InvalidInvitationCodeError, InvalidInvitationCodeError,
RepeatPasswordNotMatchError, RepeatPasswordNotMatchError,
) )
from controllers.console.wraps import account_initialization_required, setup_required from controllers.console.wraps import account_initialization_required, enterprise_license_required, setup_required
from extensions.ext_database import db from extensions.ext_database import db
from fields.member_fields import account_fields from fields.member_fields import account_fields
from libs.helper import TimestampField, timezone from libs.helper import TimestampField, timezone
@ -79,6 +79,7 @@ class AccountProfileApi(Resource):
@login_required @login_required
@account_initialization_required @account_initialization_required
@marshal_with(account_fields) @marshal_with(account_fields)
@enterprise_license_required
def get(self): def get(self):
return current_user return current_user

View File

@ -7,7 +7,7 @@ from werkzeug.exceptions import Forbidden
from configs import dify_config from configs import dify_config
from controllers.console import api from controllers.console import api
from controllers.console.wraps import account_initialization_required, setup_required from controllers.console.wraps import account_initialization_required, enterprise_license_required, setup_required
from core.model_runtime.utils.encoders import jsonable_encoder from core.model_runtime.utils.encoders import jsonable_encoder
from libs.helper import alphanumeric, uuid_value from libs.helper import alphanumeric, uuid_value
from libs.login import login_required from libs.login import login_required
@ -549,6 +549,7 @@ class ToolLabelsApi(Resource):
@setup_required @setup_required
@login_required @login_required
@account_initialization_required @account_initialization_required
@enterprise_license_required
def get(self): def get(self):
return jsonable_encoder(ToolLabelsService.list_tool_labels()) return jsonable_encoder(ToolLabelsService.list_tool_labels())

View File

@ -8,10 +8,10 @@ from flask_login import current_user
from configs import dify_config from configs import dify_config
from controllers.console.workspace.error import AccountNotInitializedError from controllers.console.workspace.error import AccountNotInitializedError
from models.model import DifySetup from models.model import DifySetup
from services.feature_service import FeatureService from services.feature_service import FeatureService, LicenseStatus
from services.operation_service import OperationService from services.operation_service import OperationService
from .error import NotInitValidateError, NotSetupError from .error import NotInitValidateError, NotSetupError, UnauthorizedAndForceLogout
def account_initialization_required(view): def account_initialization_required(view):
@ -142,3 +142,15 @@ def setup_required(view):
return view(*args, **kwargs) return view(*args, **kwargs)
return decorated return decorated
def enterprise_license_required(view):
@wraps(view)
def decorated(*args, **kwargs):
settings = FeatureService.get_system_features()
if settings.license.status in [LicenseStatus.INACTIVE, LicenseStatus.EXPIRED, LicenseStatus.LOST]:
raise UnauthorizedAndForceLogout("Your license is invalid. Please contact your administrator.")
return view(*args, **kwargs)
return decorated

View File

@ -1,3 +1,5 @@
from enum import Enum
from pydantic import BaseModel, ConfigDict from pydantic import BaseModel, ConfigDict
from configs import dify_config from configs import dify_config
@ -20,6 +22,20 @@ class LimitationModel(BaseModel):
limit: int = 0 limit: int = 0
class LicenseStatus(str, Enum):
NONE = "none"
INACTIVE = "inactive"
ACTIVE = "active"
EXPIRING = "expiring"
EXPIRED = "expired"
LOST = "lost"
class LicenseModel(BaseModel):
status: LicenseStatus = LicenseStatus.NONE
expired_at: str = ""
class FeatureModel(BaseModel): class FeatureModel(BaseModel):
billing: BillingModel = BillingModel() billing: BillingModel = BillingModel()
members: LimitationModel = LimitationModel(size=0, limit=1) members: LimitationModel = LimitationModel(size=0, limit=1)
@ -47,6 +63,7 @@ class SystemFeatureModel(BaseModel):
enable_social_oauth_login: bool = False enable_social_oauth_login: bool = False
is_allow_register: bool = False is_allow_register: bool = False
is_allow_create_workspace: bool = False is_allow_create_workspace: bool = False
license: LicenseModel = LicenseModel()
class FeatureService: class FeatureService:
@ -131,17 +148,31 @@ class FeatureService:
if "sso_enforced_for_signin" in enterprise_info: if "sso_enforced_for_signin" in enterprise_info:
features.sso_enforced_for_signin = enterprise_info["sso_enforced_for_signin"] features.sso_enforced_for_signin = enterprise_info["sso_enforced_for_signin"]
if "sso_enforced_for_signin_protocol" in enterprise_info: if "sso_enforced_for_signin_protocol" in enterprise_info:
features.sso_enforced_for_signin_protocol = enterprise_info["sso_enforced_for_signin_protocol"] features.sso_enforced_for_signin_protocol = enterprise_info["sso_enforced_for_signin_protocol"]
if "sso_enforced_for_web" in enterprise_info: if "sso_enforced_for_web" in enterprise_info:
features.sso_enforced_for_web = enterprise_info["sso_enforced_for_web"] features.sso_enforced_for_web = enterprise_info["sso_enforced_for_web"]
if "sso_enforced_for_web_protocol" in enterprise_info: if "sso_enforced_for_web_protocol" in enterprise_info:
features.sso_enforced_for_web_protocol = enterprise_info["sso_enforced_for_web_protocol"] features.sso_enforced_for_web_protocol = enterprise_info["sso_enforced_for_web_protocol"]
if "enable_email_code_login" in enterprise_info: if "enable_email_code_login" in enterprise_info:
features.enable_email_code_login = enterprise_info["enable_email_code_login"] features.enable_email_code_login = enterprise_info["enable_email_code_login"]
if "enable_email_password_login" in enterprise_info: if "enable_email_password_login" in enterprise_info:
features.enable_email_password_login = enterprise_info["enable_email_password_login"] features.enable_email_password_login = enterprise_info["enable_email_password_login"]
if "is_allow_register" in enterprise_info: if "is_allow_register" in enterprise_info:
features.is_allow_register = enterprise_info["is_allow_register"] features.is_allow_register = enterprise_info["is_allow_register"]
if "is_allow_create_workspace" in enterprise_info: if "is_allow_create_workspace" in enterprise_info:
features.is_allow_create_workspace = enterprise_info["is_allow_create_workspace"] features.is_allow_create_workspace = enterprise_info["is_allow_create_workspace"]
if "license" in enterprise_info:
if "status" in enterprise_info["license"]:
features.license.status = enterprise_info["license"]["status"]
if "expired_at" in enterprise_info["license"]:
features.license.expired_at = enterprise_info["license"]["expired_at"]

View File

@ -12,6 +12,7 @@ import EnvNav from './env-nav'
import ExploreNav from './explore-nav' import ExploreNav from './explore-nav'
import ToolsNav from './tools-nav' import ToolsNav from './tools-nav'
import GithubStar from './github-star' import GithubStar from './github-star'
import LicenseNav from './license-env'
import { WorkspaceProvider } from '@/context/workspace-context' import { WorkspaceProvider } from '@/context/workspace-context'
import { useAppContext } from '@/context/app-context' import { useAppContext } from '@/context/app-context'
import LogoSite from '@/app/components/base/logo/logo-site' import LogoSite from '@/app/components/base/logo/logo-site'
@ -79,6 +80,7 @@ const Header = () => {
</div> </div>
)} )}
<div className='flex items-center flex-shrink-0'> <div className='flex items-center flex-shrink-0'>
<LicenseNav />
<EnvNav /> <EnvNav />
{enableBilling && ( {enableBilling && (
<div className='mr-3 select-none'> <div className='mr-3 select-none'>

View File

@ -0,0 +1,29 @@
'use client'
import AppContext from '@/context/app-context'
import { LicenseStatus } from '@/types/feature'
import { useTranslation } from 'react-i18next'
import { useContextSelector } from 'use-context-selector'
import dayjs from 'dayjs'
const LicenseNav = () => {
const { t } = useTranslation()
const systemFeatures = useContextSelector(AppContext, s => s.systemFeatures)
if (systemFeatures.license?.status === LicenseStatus.EXPIRING) {
const expiredAt = systemFeatures.license?.expired_at
const count = dayjs(expiredAt).diff(dayjs(), 'days')
return <div className='px-2 py-1 mr-4 rounded-full bg-util-colors-orange-orange-50 border-util-colors-orange-orange-100 system-xs-medium text-util-colors-orange-orange-600'>
{count <= 1 && <span>{t('common.license.expiring', { count })}</span>}
{count > 1 && <span>{t('common.license.expiring_plural', { count })}</span>}
</div>
}
if (systemFeatures.license.status === LicenseStatus.ACTIVE) {
return <div className='px-2 py-1 mr-4 rounded-md bg-util-colors-indigo-indigo-50 border-util-colors-indigo-indigo-100 system-xs-medium text-util-colors-indigo-indigo-600'>
Enterprise
</div>
}
return null
}
export default LicenseNav

View File

@ -2,7 +2,7 @@ import React, { useCallback, useEffect, useState } from 'react'
import { useTranslation } from 'react-i18next' import { useTranslation } from 'react-i18next'
import Link from 'next/link' import Link from 'next/link'
import { useRouter, useSearchParams } from 'next/navigation' import { useRouter, useSearchParams } from 'next/navigation'
import { RiDoorLockLine } from '@remixicon/react' import { RiContractLine, RiDoorLockLine, RiErrorWarningFill } from '@remixicon/react'
import Loading from '../components/base/loading' import Loading from '../components/base/loading'
import MailAndCodeAuth from './components/mail-and-code-auth' import MailAndCodeAuth from './components/mail-and-code-auth'
import MailAndPasswordAuth from './components/mail-and-password-auth' import MailAndPasswordAuth from './components/mail-and-password-auth'
@ -10,7 +10,7 @@ import SocialAuth from './components/social-auth'
import SSOAuth from './components/sso-auth' import SSOAuth from './components/sso-auth'
import cn from '@/utils/classnames' import cn from '@/utils/classnames'
import { getSystemFeatures, invitationCheck } from '@/service/common' import { getSystemFeatures, invitationCheck } from '@/service/common'
import { defaultSystemFeatures } from '@/types/feature' import { LicenseStatus, defaultSystemFeatures } from '@/types/feature'
import Toast from '@/app/components/base/toast' import Toast from '@/app/components/base/toast'
import { IS_CE_EDITION } from '@/config' import { IS_CE_EDITION } from '@/config'
@ -83,6 +83,48 @@ const NormalForm = () => {
<Loading type='area' /> <Loading type='area' />
</div> </div>
} }
if (systemFeatures.license?.status === LicenseStatus.LOST) {
return <div className='w-full mx-auto mt-8'>
<div className='bg-white'>
<div className="p-4 rounded-lg bg-gradient-to-r from-workflow-workflow-progress-bg-1 to-workflow-workflow-progress-bg-2">
<div className='flex items-center justify-center w-10 h-10 rounded-xl bg-components-card-bg shadow shadows-shadow-lg mb-2 relative'>
<RiContractLine className='w-5 h-5' />
<RiErrorWarningFill className='absolute w-4 h-4 text-text-warning-secondary -top-1 -right-1' />
</div>
<p className='system-sm-medium text-text-primary'>{t('login.licenseLost')}</p>
<p className='system-xs-regular text-text-tertiary mt-1'>{t('login.licenseLostTip')}</p>
</div>
</div>
</div>
}
if (systemFeatures.license?.status === LicenseStatus.EXPIRED) {
return <div className='w-full mx-auto mt-8'>
<div className='bg-white'>
<div className="p-4 rounded-lg bg-gradient-to-r from-workflow-workflow-progress-bg-1 to-workflow-workflow-progress-bg-2">
<div className='flex items-center justify-center w-10 h-10 rounded-xl bg-components-card-bg shadow shadows-shadow-lg mb-2 relative'>
<RiContractLine className='w-5 h-5' />
<RiErrorWarningFill className='absolute w-4 h-4 text-text-warning-secondary -top-1 -right-1' />
</div>
<p className='system-sm-medium text-text-primary'>{t('login.licenseExpired')}</p>
<p className='system-xs-regular text-text-tertiary mt-1'>{t('login.licenseExpiredTip')}</p>
</div>
</div>
</div>
}
if (systemFeatures.license?.status === LicenseStatus.INACTIVE) {
return <div className='w-full mx-auto mt-8'>
<div className='bg-white'>
<div className="p-4 rounded-lg bg-gradient-to-r from-workflow-workflow-progress-bg-1 to-workflow-workflow-progress-bg-2">
<div className='flex items-center justify-center w-10 h-10 rounded-xl bg-components-card-bg shadow shadows-shadow-lg mb-2 relative'>
<RiContractLine className='w-5 h-5' />
<RiErrorWarningFill className='absolute w-4 h-4 text-text-warning-secondary -top-1 -right-1' />
</div>
<p className='system-sm-medium text-text-primary'>{t('login.licenseInactive')}</p>
<p className='system-xs-regular text-text-tertiary mt-1'>{t('login.licenseInactiveTip')}</p>
</div>
</div>
</div>
}
return ( return (
<> <>

View File

@ -144,7 +144,7 @@ export const AppContextProvider: FC<AppContextProviderProps> = ({ children }) =>
theme, theme,
setTheme: handleSetTheme, setTheme: handleSetTheme,
apps: appList.data, apps: appList.data,
systemFeatures, systemFeatures: { ...defaultSystemFeatures, ...systemFeatures },
mutateApps, mutateApps,
userProfile, userProfile,
mutateUserProfile, mutateUserProfile,

View File

@ -591,6 +591,10 @@ const translation = {
uploadFromComputerReadError: 'Lesen der Datei fehlgeschlagen, bitte versuchen Sie es erneut.', uploadFromComputerReadError: 'Lesen der Datei fehlgeschlagen, bitte versuchen Sie es erneut.',
fileExtensionNotSupport: 'Dateiendung nicht bedient', fileExtensionNotSupport: 'Dateiendung nicht bedient',
}, },
license: {
expiring: 'Läuft an einem Tag ab',
expiring_plural: 'Läuft in {{count}} Tagen ab',
},
} }
export default translation export default translation

View File

@ -99,6 +99,12 @@ const translation = {
noLoginMethodTip: 'Wenden Sie sich an den Systemadministrator, um eine Authentifizierungsmethode hinzuzufügen.', noLoginMethodTip: 'Wenden Sie sich an den Systemadministrator, um eine Authentifizierungsmethode hinzuzufügen.',
usePassword: 'Passwort verwenden', usePassword: 'Passwort verwenden',
noLoginMethod: 'Authentifizierungsmethode nicht konfiguriert', noLoginMethod: 'Authentifizierungsmethode nicht konfiguriert',
licenseExpired: 'Lizenz abgelaufen',
licenseLostTip: 'Fehler beim Verbinden des Dify-Lizenzservers. Wenden Sie sich an Ihren Administrator, um Dify weiterhin zu verwenden.',
licenseInactive: 'Lizenz inaktiv',
licenseInactiveTip: 'Die Dify Enterprise-Lizenz für Ihren Arbeitsbereich ist inaktiv. Wenden Sie sich an Ihren Administrator, um Dify weiterhin zu verwenden.',
licenseExpiredTip: 'Die Dify Enterprise-Lizenz für Ihren Arbeitsbereich ist abgelaufen. Wenden Sie sich an Ihren Administrator, um Dify weiterhin zu verwenden.',
licenseLost: 'Lizenz verloren',
} }
export default translation export default translation

View File

@ -407,6 +407,7 @@ const translation = {
}, },
type: 'Art', type: 'Art',
binaryFileVariable: 'Variable der Binärdatei', binaryFileVariable: 'Variable der Binärdatei',
extractListPlaceholder: 'Geben Sie den Index des Listeneintrags ein, geben Sie \'/\' ein, fügen Sie die Variable ein',
}, },
code: { code: {
inputVars: 'Eingabevariablen', inputVars: 'Eingabevariablen',
@ -618,6 +619,7 @@ const translation = {
filterConditionKey: 'Bedingungsschlüssel filtern', filterConditionKey: 'Bedingungsschlüssel filtern',
filterCondition: 'Filter-Bedingung', filterCondition: 'Filter-Bedingung',
selectVariableKeyPlaceholder: 'Untervariablenschlüssel auswählen', selectVariableKeyPlaceholder: 'Untervariablenschlüssel auswählen',
extractsCondition: 'Extrahieren des N-Elements',
}, },
}, },
tracing: { tracing: {

View File

@ -591,6 +591,10 @@ const translation = {
created: 'Tag created successfully', created: 'Tag created successfully',
failed: 'Tag creation failed', failed: 'Tag creation failed',
}, },
license: {
expiring: 'Expiring in one day',
expiring_plural: 'Expiring in {{count}} days',
},
} }
export default translation export default translation

View File

@ -98,6 +98,12 @@ const translation = {
back: 'Back', back: 'Back',
noLoginMethod: 'Authentication method not configured', noLoginMethod: 'Authentication method not configured',
noLoginMethodTip: 'Please contact the system admin to add an authentication method.', noLoginMethodTip: 'Please contact the system admin to add an authentication method.',
licenseExpired: 'License Expired',
licenseExpiredTip: 'The Dify Enterprise license for your workspace has expired. Please contact your administrator to continue using Dify.',
licenseLost: 'License Lost',
licenseLostTip: 'Failed to connect Dify license server. Please contact your administrator to continue using Dify.',
licenseInactive: 'License Inactive',
licenseInactiveTip: 'The Dify Enterprise license for your workspace is inactive. Please contact your administrator to continue using Dify.',
} }
export default translation export default translation

View File

@ -591,6 +591,10 @@ const translation = {
pasteFileLinkInputPlaceholder: 'Introduzca la URL...', pasteFileLinkInputPlaceholder: 'Introduzca la URL...',
uploadFromComputerLimit: 'El archivo de carga no puede exceder {{size}}', uploadFromComputerLimit: 'El archivo de carga no puede exceder {{size}}',
}, },
license: {
expiring: 'Caduca en un día',
expiring_plural: 'Caducando en {{count}} días',
},
} }
export default translation export default translation

View File

@ -99,6 +99,12 @@ const translation = {
noLoginMethod: 'Método de autenticación no configurado', noLoginMethod: 'Método de autenticación no configurado',
setYourAccount: 'Configura tu cuenta', setYourAccount: 'Configura tu cuenta',
noLoginMethodTip: 'Póngase en contacto con el administrador del sistema para agregar un método de autenticación.', noLoginMethodTip: 'Póngase en contacto con el administrador del sistema para agregar un método de autenticación.',
licenseInactive: 'Licencia inactiva',
licenseInactiveTip: 'La licencia de Dify Enterprise para su espacio de trabajo está inactiva. Póngase en contacto con su administrador para seguir utilizando Dify.',
licenseExpired: 'Licencia caducada',
licenseLost: 'Licencia perdida',
licenseExpiredTip: 'La licencia de Dify Enterprise para su espacio de trabajo ha caducado. Póngase en contacto con su administrador para seguir utilizando Dify.',
licenseLostTip: 'No se pudo conectar el servidor de licencias de Dife. Póngase en contacto con su administrador para seguir utilizando Dify.',
} }
export default translation export default translation

View File

@ -407,6 +407,7 @@ const translation = {
}, },
type: 'Tipo', type: 'Tipo',
binaryFileVariable: 'Variable de archivo binario', binaryFileVariable: 'Variable de archivo binario',
extractListPlaceholder: 'Introduzca el índice de elementos de la lista, escriba \'/\' insertar variable',
}, },
code: { code: {
inputVars: 'Variables de entrada', inputVars: 'Variables de entrada',
@ -621,6 +622,7 @@ const translation = {
filterConditionComparisonOperator: 'Operador de comparación de condiciones de filtro', filterConditionComparisonOperator: 'Operador de comparación de condiciones de filtro',
asc: 'ASC', asc: 'ASC',
selectVariableKeyPlaceholder: 'Seleccione la clave de subvariable', selectVariableKeyPlaceholder: 'Seleccione la clave de subvariable',
extractsCondition: 'Extraiga el elemento N',
}, },
}, },
tracing: { tracing: {

View File

@ -591,6 +591,10 @@ const translation = {
pasteFileLink: 'پیوند فایل را جایگذاری کنید', pasteFileLink: 'پیوند فایل را جایگذاری کنید',
uploadFromComputerLimit: 'آپلود فایل نمی تواند از {{size}} تجاوز کند', uploadFromComputerLimit: 'آپلود فایل نمی تواند از {{size}} تجاوز کند',
}, },
license: {
expiring_plural: 'انقضا در {{count}} روز',
expiring: 'انقضا در یک روز',
},
} }
export default translation export default translation

View File

@ -99,6 +99,12 @@ const translation = {
noLoginMethod: 'روش احراز هویت پیکربندی نشده است', noLoginMethod: 'روش احراز هویت پیکربندی نشده است',
noLoginMethodTip: 'لطفا برای افزودن روش احراز هویت با مدیر سیستم تماس بگیرید.', noLoginMethodTip: 'لطفا برای افزودن روش احراز هویت با مدیر سیستم تماس بگیرید.',
resetPasswordDesc: 'ایمیلی را که برای ثبت نام در Dify استفاده کرده اید تایپ کنید و ما یک ایمیل بازنشانی رمز عبور برای شما ارسال خواهیم کرد.', resetPasswordDesc: 'ایمیلی را که برای ثبت نام در Dify استفاده کرده اید تایپ کنید و ما یک ایمیل بازنشانی رمز عبور برای شما ارسال خواهیم کرد.',
licenseInactive: 'مجوز غیر فعال',
licenseLost: 'مجوز گم شده است',
licenseExpired: 'مجوز منقضی شده است',
licenseExpiredTip: 'مجوز Dify Enterprise برای فضای کاری شما منقضی شده است. لطفا برای ادامه استفاده از Dify با سرپرست خود تماس بگیرید.',
licenseInactiveTip: 'مجوز Dify Enterprise برای فضای کاری شما غیرفعال است. لطفا برای ادامه استفاده از Dify با سرپرست خود تماس بگیرید.',
licenseLostTip: 'اتصال سرور مجوز Dify انجام نشد. لطفا برای ادامه استفاده از Dify با سرپرست خود تماس بگیرید.',
} }
export default translation export default translation

View File

@ -407,6 +407,7 @@ const translation = {
}, },
binaryFileVariable: 'متغیر فایل باینری', binaryFileVariable: 'متغیر فایل باینری',
type: 'نوع', type: 'نوع',
extractListPlaceholder: 'فهرست آیتم لیست را وارد کنید، متغیر درج \'/\' را تایپ کنید',
}, },
code: { code: {
inputVars: 'متغیرهای ورودی', inputVars: 'متغیرهای ورودی',
@ -618,6 +619,7 @@ const translation = {
filterConditionComparisonValue: 'مقدار شرایط فیلتر', filterConditionComparisonValue: 'مقدار شرایط فیلتر',
selectVariableKeyPlaceholder: 'کلید متغیر فرعی را انتخاب کنید', selectVariableKeyPlaceholder: 'کلید متغیر فرعی را انتخاب کنید',
asc: 'صعودی', asc: 'صعودی',
extractsCondition: 'مورد N را استخراج کنید',
}, },
}, },
tracing: { tracing: {

View File

@ -591,6 +591,10 @@ const translation = {
pasteFileLinkInvalid: 'Lien de fichier non valide', pasteFileLinkInvalid: 'Lien de fichier non valide',
uploadFromComputerLimit: 'Le fichier de téléchargement ne peut pas dépasser {{size}}', uploadFromComputerLimit: 'Le fichier de téléchargement ne peut pas dépasser {{size}}',
}, },
license: {
expiring: 'Expirant dans un jour',
expiring_plural: 'Expirant dans {{count}} jours',
},
} }
export default translation export default translation

View File

@ -99,6 +99,12 @@ const translation = {
noLoginMethodTip: 'Veuillez contacter ladministrateur système pour ajouter une méthode dauthentification.', 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.', 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', usePassword: 'Utiliser le mot de passe',
licenseInactiveTip: 'La licence Dify Enterprise de votre espace de travail est inactive. Veuillez contacter votre administrateur pour continuer à utiliser Dify.',
licenseLostTip: 'Échec de la connexion au serveur de licences Dify. Veuillez contacter votre administrateur pour continuer à utiliser Dify.',
licenseExpired: 'Licence expirée',
licenseLost: 'Licence perdue',
licenseExpiredTip: 'La licence Dify Enterprise de votre espace de travail a expiré. Veuillez contacter votre administrateur pour continuer à utiliser Dify.',
licenseInactive: 'Licence inactive',
} }
export default translation export default translation

View File

@ -407,6 +407,7 @@ const translation = {
}, },
binaryFileVariable: 'Variable de fichier binaire', binaryFileVariable: 'Variable de fichier binaire',
type: 'Type', type: 'Type',
extractListPlaceholder: 'Entrez lindex de lélément de liste, tapez \'/\' insérer la variable',
}, },
code: { code: {
inputVars: 'Variables de saisie', inputVars: 'Variables de saisie',
@ -618,6 +619,7 @@ const translation = {
limit: 'Haut N', limit: 'Haut N',
orderBy: 'Trier par', orderBy: 'Trier par',
filterConditionKey: 'Clé de condition de filtre', filterConditionKey: 'Clé de condition de filtre',
extractsCondition: 'Extraire lélément N',
}, },
}, },
tracing: { tracing: {

View File

@ -613,6 +613,10 @@ const translation = {
fileExtensionNotSupport: 'फ़ाइल एक्सटेंशन समर्थित नहीं है', fileExtensionNotSupport: 'फ़ाइल एक्सटेंशन समर्थित नहीं है',
uploadFromComputer: 'स्थानीय अपलोड', uploadFromComputer: 'स्थानीय अपलोड',
}, },
license: {
expiring: 'एक दिन में समाप्त हो रहा है',
expiring_plural: '{{गिनती}} दिनों में समाप्त हो रहा है',
},
} }
export default translation export default translation

View File

@ -104,6 +104,12 @@ const translation = {
resetPasswordDesc: 'वह ईमेल टाइप करें जिसका उपयोग आपने Dify पर साइन अप करने के लिए किया था और हम आपको एक पासवर्ड रीसेट ईमेल भेजेंगे।', resetPasswordDesc: 'वह ईमेल टाइप करें जिसका उपयोग आपने Dify पर साइन अप करने के लिए किया था और हम आपको एक पासवर्ड रीसेट ईमेल भेजेंगे।',
withSSO: 'एसएसओ के साथ जारी रखें', withSSO: 'एसएसओ के साथ जारी रखें',
back: 'पीछे', back: 'पीछे',
licenseInactive: 'लाइसेंस निष्क्रिय',
licenseExpired: 'लाइसेंस की समय सीमा समाप्त हो गई',
licenseLost: 'लाइसेंस खो गया',
licenseLostTip: 'Dify लायसेंस सर्वर से कनेक्ट करने में विफल. Dify का उपयोग जारी रखने के लिए कृपया अपने व्यवस्थापक से संपर्क करें.',
licenseInactiveTip: 'आपके कार्यस्थल के लिए डिफाई एंटरप्राइज लाइसेंस निष्क्रिय है। कृपया डिफाई का उपयोग जारी रखने के लिए अपने प्रशासक से संपर्क करें।',
licenseExpiredTip: 'आपके कार्यस्थल के लिए डिफाई एंटरप्राइज लाइसेंस समाप्त हो गया है। कृपया डिफाई का उपयोग जारी रखने के लिए अपने प्रशासक से संपर्क करें।',
} }
export default translation export default translation

View File

@ -420,6 +420,7 @@ const translation = {
}, },
type: 'प्रकार', type: 'प्रकार',
binaryFileVariable: 'बाइनरी फ़ाइल चर', binaryFileVariable: 'बाइनरी फ़ाइल चर',
extractListPlaceholder: 'सूची आइटम इंडेक्स दर्ज करें, \'/\' इन्सर्ट वेरिएबल टाइप करें',
}, },
code: { code: {
inputVars: 'इनपुट वेरिएबल्स', inputVars: 'इनपुट वेरिएबल्स',
@ -638,6 +639,7 @@ const translation = {
filterConditionComparisonOperator: 'फ़िल्टर शर्त तुलन ऑपरेटर', filterConditionComparisonOperator: 'फ़िल्टर शर्त तुलन ऑपरेटर',
selectVariableKeyPlaceholder: 'उप चर कुंजी का चयन करें', selectVariableKeyPlaceholder: 'उप चर कुंजी का चयन करें',
inputVar: 'इनपुट वेरिएबल', inputVar: 'इनपुट वेरिएबल',
extractsCondition: 'N आइटम निकालें',
}, },
}, },
tracing: { tracing: {

View File

@ -622,6 +622,10 @@ const translation = {
pasteFileLink: 'Incolla il collegamento del file', pasteFileLink: 'Incolla il collegamento del file',
uploadFromComputerReadError: 'Lettura del file non riuscita, riprovare.', uploadFromComputerReadError: 'Lettura del file non riuscita, riprovare.',
}, },
license: {
expiring_plural: 'Scadenza tra {{count}} giorni',
expiring: 'Scadenza in un giorno',
},
} }
export default translation export default translation

View File

@ -109,6 +109,12 @@ const translation = {
resetPasswordDesc: 'Digita l\'e-mail che hai utilizzato per registrarti su Dify e ti invieremo un\'e-mail per reimpostare la password.', 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.', noLoginMethodTip: 'Contatta l\'amministratore di sistema per aggiungere un metodo di autenticazione.',
enterYourName: 'Inserisci il tuo nome utente', enterYourName: 'Inserisci il tuo nome utente',
licenseLostTip: 'Impossibile connettersi al server licenze Dify. Contatta il tuo amministratore per continuare a utilizzare Dify.',
licenseExpired: 'Licenza scaduta',
licenseLost: 'Licenza persa',
licenseExpiredTip: 'La licenza Dify Enterprise per la tua area di lavoro è scaduta. Contatta il tuo amministratore per continuare a utilizzare Dify.',
licenseInactiveTip: 'La licenza Dify Enterprise per la tua area di lavoro è inattiva. Contatta il tuo amministratore per continuare a utilizzare Dify.',
licenseInactive: 'Licenza inattiva',
} }
export default translation export default translation

View File

@ -424,6 +424,7 @@ const translation = {
}, },
binaryFileVariable: 'Variabile file binario', binaryFileVariable: 'Variabile file binario',
type: 'Digitare', type: 'Digitare',
extractListPlaceholder: 'Inserisci l\'indice delle voci dell\'elenco, digita \'/\' inserisci la variabile',
}, },
code: { code: {
inputVars: 'Variabili di Input', inputVars: 'Variabili di Input',
@ -645,6 +646,7 @@ const translation = {
desc: 'DESC', desc: 'DESC',
filterConditionComparisonValue: 'Valore della condizione di filtro', filterConditionComparisonValue: 'Valore della condizione di filtro',
orderBy: 'Ordina per', orderBy: 'Ordina per',
extractsCondition: 'Estrai l\'elemento N',
}, },
}, },
tracing: { tracing: {

View File

@ -591,6 +591,10 @@ const translation = {
fileExtensionNotSupport: 'ファイル拡張子はサポートされていません', fileExtensionNotSupport: 'ファイル拡張子はサポートされていません',
pasteFileLinkInvalid: '無効なファイルリンク', pasteFileLinkInvalid: '無効なファイルリンク',
}, },
license: {
expiring_plural: '有効期限 {{count}} 日',
expiring: '1日で有効期限が切れます',
},
} }
export default translation export default translation

View File

@ -99,6 +99,12 @@ const translation = {
sendVerificationCode: '確認コードの送信', sendVerificationCode: '確認コードの送信',
enterYourName: 'ユーザー名を入力してください', enterYourName: 'ユーザー名を入力してください',
resetPasswordDesc: 'Difyへのサインアップに使用したメールアドレスを入力すると、パスワードリセットメールが送信されます。', resetPasswordDesc: 'Difyへのサインアップに使用したメールアドレスを入力すると、パスワードリセットメールが送信されます。',
licenseLost: 'ライセンスを失った',
licenseExpiredTip: 'ワークスペースの Dify Enterprise ライセンスの有効期限が切れています。Difyを引き続き使用するには、管理者に連絡してください。',
licenseInactive: 'ライセンスが非アクティブです',
licenseInactiveTip: 'ワークスペースの Dify Enterprise ライセンスが非アクティブです。Difyを引き続き使用するには、管理者に連絡してください。',
licenseExpired: 'ライセンスの有効期限が切れています',
licenseLostTip: 'Difyライセンスサーバーへの接続に失敗しました。続けてDifyを使用するために管理者に連絡してください。',
} }
export default translation export default translation

View File

@ -407,6 +407,7 @@ const translation = {
}, },
type: 'タイプ', type: 'タイプ',
binaryFileVariable: 'バイナリファイル変数', binaryFileVariable: 'バイナリファイル変数',
extractListPlaceholder: 'リスト項目のインデックスを入力し、変数を挿入 \'/\' と入力します',
}, },
code: { code: {
inputVars: '入力変数', inputVars: '入力変数',
@ -619,6 +620,7 @@ const translation = {
filterConditionComparisonOperator: 'フィルター条件を比較オペレーター', filterConditionComparisonOperator: 'フィルター条件を比較オペレーター',
inputVar: '入力変数', inputVar: '入力変数',
desc: 'DESC', desc: 'DESC',
extractsCondition: 'N個のアイテムを抽出します',
}, },
}, },
tracing: { tracing: {

View File

@ -587,6 +587,10 @@ const translation = {
uploadFromComputerLimit: '업로드 파일은 {{size}}를 초과할 수 없습니다.', uploadFromComputerLimit: '업로드 파일은 {{size}}를 초과할 수 없습니다.',
uploadFromComputerUploadError: '파일 업로드에 실패했습니다. 다시 업로드하십시오.', uploadFromComputerUploadError: '파일 업로드에 실패했습니다. 다시 업로드하십시오.',
}, },
license: {
expiring_plural: '{{count}}일 후에 만료',
expiring: '하루 후에 만료',
},
} }
export default translation export default translation

View File

@ -99,6 +99,12 @@ const translation = {
enterYourName: '사용자 이름을 입력해 주세요', enterYourName: '사용자 이름을 입력해 주세요',
noLoginMethodTip: '인증 방법을 추가하려면 시스템 관리자에게 문의하십시오.', noLoginMethodTip: '인증 방법을 추가하려면 시스템 관리자에게 문의하십시오.',
resetPasswordDesc: 'Dify에 가입할 때 사용한 이메일을 입력하면 비밀번호 재설정 이메일을 보내드립니다.', resetPasswordDesc: 'Dify에 가입할 때 사용한 이메일을 입력하면 비밀번호 재설정 이메일을 보내드립니다.',
licenseInactiveTip: '작업 영역에 대한 Dify Enterprise 라이선스가 비활성 상태입니다. Dify를 계속 사용하려면 관리자에게 문의하십시오.',
licenseLost: '라이센스 분실',
licenseLostTip: 'Dify 라이선스 서버에 연결하지 못했습니다. Dify를 계속 사용하려면 관리자에게 문의하십시오.',
licenseInactive: 'License Inactive(라이선스 비활성)',
licenseExpired: '라이센스가 만료되었습니다.',
licenseExpiredTip: '작업 영역에 대한 Dify Enterprise 라이선스가 만료되었습니다. Dify를 계속 사용하려면 관리자에게 문의하십시오.',
} }
export default translation export default translation

View File

@ -407,6 +407,7 @@ const translation = {
}, },
type: '형', type: '형',
binaryFileVariable: '바이너리 파일 변수', binaryFileVariable: '바이너리 파일 변수',
extractListPlaceholder: '목록 항목 인덱스 입력, \'/\' 변수 삽입',
}, },
code: { code: {
inputVars: '입력 변수', inputVars: '입력 변수',
@ -618,6 +619,7 @@ const translation = {
orderBy: '정렬 기준', orderBy: '정렬 기준',
selectVariableKeyPlaceholder: '하위 변수 키 선택', selectVariableKeyPlaceholder: '하위 변수 키 선택',
filterConditionComparisonOperator: '필터 조건 비교 연산자', filterConditionComparisonOperator: '필터 조건 비교 연산자',
extractsCondition: 'N 항목을 추출합니다.',
}, },
}, },
tracing: { tracing: {

View File

@ -609,6 +609,10 @@ const translation = {
fileExtensionNotSupport: 'Rozszerzenie pliku nie jest obsługiwane', fileExtensionNotSupport: 'Rozszerzenie pliku nie jest obsługiwane',
uploadFromComputer: 'Przesyłanie lokalne', uploadFromComputer: 'Przesyłanie lokalne',
}, },
license: {
expiring_plural: 'Wygasa za {{count}} dni',
expiring: 'Wygasa w ciągu jednego dnia',
},
} }
export default translation export default translation

View File

@ -104,6 +104,12 @@ const translation = {
or: 'LUB', or: 'LUB',
noLoginMethodTip: 'Skontaktuj się z administratorem systemu, aby dodać metodę uwierzytelniania.', noLoginMethodTip: 'Skontaktuj się z administratorem systemu, aby dodać metodę uwierzytelniania.',
noLoginMethod: 'Nie skonfigurowano metody uwierzytelniania', noLoginMethod: 'Nie skonfigurowano metody uwierzytelniania',
licenseLost: 'Utrata licencji',
licenseExpired: 'Licencja wygasła',
licenseInactive: 'Licencja nieaktywna',
licenseExpiredTip: 'Licencja Dify Enterprise dla Twojego obszaru roboczego wygasła. Skontaktuj się z administratorem, aby kontynuować korzystanie z Dify.',
licenseLostTip: 'Nie udało się nawiązać połączenia z serwerem licencji Dify. Skontaktuj się z administratorem, aby kontynuować korzystanie z Dify.',
licenseInactiveTip: 'Licencja Dify Enterprise dla Twojego obszaru roboczego jest nieaktywna. Skontaktuj się z administratorem, aby kontynuować korzystanie z Dify.',
} }
export default translation export default translation

View File

@ -407,6 +407,7 @@ const translation = {
}, },
type: 'Typ', type: 'Typ',
binaryFileVariable: 'Binarna zmienna pliku', binaryFileVariable: 'Binarna zmienna pliku',
extractListPlaceholder: 'Wprowadź indeks elementu listy, wpisz "/" wstaw zmienną',
}, },
code: { code: {
inputVars: 'Zmienne wejściowe', inputVars: 'Zmienne wejściowe',
@ -618,6 +619,7 @@ const translation = {
filterCondition: 'Stan filtra', filterCondition: 'Stan filtra',
filterConditionComparisonValue: 'Wartość warunku filtru', filterConditionComparisonValue: 'Wartość warunku filtru',
selectVariableKeyPlaceholder: 'Wybierz klucz zmiennej podrzędnej', selectVariableKeyPlaceholder: 'Wybierz klucz zmiennej podrzędnej',
extractsCondition: 'Wyodrębnij element N',
}, },
}, },
tracing: { tracing: {

View File

@ -591,6 +591,10 @@ const translation = {
uploadFromComputerLimit: 'Carregar arquivo não pode exceder {{size}}', uploadFromComputerLimit: 'Carregar arquivo não pode exceder {{size}}',
uploadFromComputerUploadError: 'Falha no upload do arquivo, faça o upload novamente.', uploadFromComputerUploadError: 'Falha no upload do arquivo, faça o upload novamente.',
}, },
license: {
expiring: 'Expirando em um dia',
expiring_plural: 'Expirando em {{count}} dias',
},
} }
export default translation export default translation

View File

@ -99,6 +99,12 @@ const translation = {
resetPasswordDesc: 'Digite o e-mail que você usou para se inscrever no Dify e enviaremos um e-mail de redefinição de 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', sendVerificationCode: 'Enviar código de verificação',
usePassword: 'Usar senha', usePassword: 'Usar senha',
licenseInactiveTip: 'A licença do Dify Enterprise para seu espaço de trabalho está inativa. Entre em contato com o administrador para continuar usando o Dify.',
licenseLostTip: 'Falha ao conectar o servidor de licenças Dify. Entre em contato com o administrador para continuar usando o Dify.',
licenseExpired: 'Licença expirada',
licenseLost: 'Licença perdida',
licenseInactive: 'Licença inativa',
licenseExpiredTip: 'A licença do Dify Enterprise para seu espaço de trabalho expirou. Entre em contato com o administrador para continuar usando o Dify.',
} }
export default translation export default translation

View File

@ -407,6 +407,7 @@ const translation = {
}, },
type: 'Tipo', type: 'Tipo',
binaryFileVariable: 'Variável de arquivo binário', binaryFileVariable: 'Variável de arquivo binário',
extractListPlaceholder: 'Insira o índice do item da lista, digite \'/\' inserir variável',
}, },
code: { code: {
inputVars: 'Variáveis de entrada', inputVars: 'Variáveis de entrada',
@ -618,6 +619,7 @@ const translation = {
filterConditionKey: 'Chave de condição do filtro', filterConditionKey: 'Chave de condição do filtro',
filterConditionComparisonOperator: 'Operador de comparação de condição de filtro', filterConditionComparisonOperator: 'Operador de comparação de condição de filtro',
filterConditionComparisonValue: 'Valor da condição do filtro', filterConditionComparisonValue: 'Valor da condição do filtro',
extractsCondition: 'Extraia o item N',
}, },
}, },
tracing: { tracing: {

View File

@ -591,6 +591,10 @@ const translation = {
uploadFromComputerLimit: 'Încărcarea fișierului nu poate depăși {{size}}', uploadFromComputerLimit: 'Încărcarea fișierului nu poate depăși {{size}}',
pasteFileLink: 'Lipiți linkul fișierului', pasteFileLink: 'Lipiți linkul fișierului',
}, },
license: {
expiring: 'Expiră într-o zi',
expiring_plural: 'Expiră în {{count}} zile',
},
} }
export default translation export default translation

View File

@ -99,6 +99,12 @@ const translation = {
or: 'SAU', 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.', 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ă', changePasswordBtn: 'Setați o parolă',
licenseLostTip: 'Nu s-a reușit conectarea serverului de licențe Dify. Contactați administratorul pentru a continua să utilizați Dify.',
licenseInactive: 'Licență inactivă',
licenseInactiveTip: 'Licența Dify Enterprise pentru spațiul de lucru este inactivă. Contactați administratorul pentru a continua să utilizați Dify.',
licenseExpired: 'Licență expirată',
licenseLost: 'Licență pierdută',
licenseExpiredTip: 'Licența Dify Enterprise pentru spațiul de lucru a expirat. Contactați administratorul pentru a continua să utilizați Dify.',
} }
export default translation export default translation

View File

@ -407,6 +407,7 @@ const translation = {
}, },
type: 'Tip', type: 'Tip',
binaryFileVariable: 'Variabilă de fișier binar', binaryFileVariable: 'Variabilă de fișier binar',
extractListPlaceholder: 'Introduceți indexul elementelor din listă, tastați "/" inserați variabila',
}, },
code: { code: {
inputVars: 'Variabile de intrare', inputVars: 'Variabile de intrare',
@ -618,6 +619,7 @@ const translation = {
limit: 'N de sus', limit: 'N de sus',
filterConditionComparisonValue: 'Valoare Stare filtrare', filterConditionComparisonValue: 'Valoare Stare filtrare',
asc: 'ASC', asc: 'ASC',
extractsCondition: 'Extrageți elementul N',
}, },
}, },
tracing: { tracing: {

View File

@ -591,6 +591,10 @@ const translation = {
uploadFromComputerLimit: 'Файл загрузки не может превышать {{size}}', uploadFromComputerLimit: 'Файл загрузки не может превышать {{size}}',
uploadFromComputerUploadError: 'Загрузка файла не удалась, пожалуйста, загрузите еще раз.', uploadFromComputerUploadError: 'Загрузка файла не удалась, пожалуйста, загрузите еще раз.',
}, },
license: {
expiring: 'Срок действия истекает за один день',
expiring_plural: 'Срок действия истекает через {{count}} дней',
},
} }
export default translation export default translation

View File

@ -99,6 +99,12 @@ const translation = {
noLoginMethodTip: 'Обратитесь к системному администратору, чтобы добавить метод аутентификации.', noLoginMethodTip: 'Обратитесь к системному администратору, чтобы добавить метод аутентификации.',
resetPasswordDesc: 'Введите адрес электронной почты, который вы использовали для регистрации в Dify, и мы отправим вам электронное письмо для сброса пароля.', resetPasswordDesc: 'Введите адрес электронной почты, который вы использовали для регистрации в Dify, и мы отправим вам электронное письмо для сброса пароля.',
or: 'ИЛИ', or: 'ИЛИ',
licenseInactive: 'Лицензия неактивна',
licenseLostTip: 'Не удалось подключить сервер лицензий Dify. Обратитесь к своему администратору, чтобы продолжить использование Dify.',
licenseExpired: 'Срок действия лицензии истек',
licenseLost: 'Утеряна лицензия',
licenseInactiveTip: 'Лицензия Dify Enterprise для рабочего пространства неактивна. Обратитесь к своему администратору, чтобы продолжить использование Dify.',
licenseExpiredTip: 'Срок действия лицензии Dify Enterprise для рабочего пространства истек. Обратитесь к своему администратору, чтобы продолжить использование Dify.',
} }
export default translation export default translation

View File

@ -407,6 +407,7 @@ const translation = {
}, },
type: 'Тип', type: 'Тип',
binaryFileVariable: 'Переменная двоичного файла', binaryFileVariable: 'Переменная двоичного файла',
extractListPlaceholder: 'Введите индекс элемента списка, введите \'/\' вставьте переменную',
}, },
code: { code: {
inputVars: 'Входные переменные', inputVars: 'Входные переменные',
@ -618,6 +619,7 @@ const translation = {
filterConditionKey: 'Ключ условия фильтра', filterConditionKey: 'Ключ условия фильтра',
selectVariableKeyPlaceholder: 'Выбор ключа подпеременной', selectVariableKeyPlaceholder: 'Выбор ключа подпеременной',
filterConditionComparisonValue: 'Значение условия фильтра', filterConditionComparisonValue: 'Значение условия фильтра',
extractsCondition: 'Извлечение элемента N',
}, },
}, },
tracing: { tracing: {

View File

@ -38,6 +38,10 @@ const translation = {
duplicate: 'Podvoji', duplicate: 'Podvoji',
rename: 'Preimenuj', rename: 'Preimenuj',
audioSourceUnavailable: 'Zvočni vir ni na voljo', audioSourceUnavailable: 'Zvočni vir ni na voljo',
copyImage: 'Kopiraj sliko',
openInNewTab: 'Odpri v novem zavihku',
zoomOut: 'Pomanjšanje',
zoomIn: 'Povečava',
}, },
errorMsg: { errorMsg: {
fieldRequired: '{{field}} je obvezno', fieldRequired: '{{field}} je obvezno',
@ -576,5 +580,220 @@ const translation = {
failed: 'Ustvarjanje oznake ni uspelo', failed: 'Ustvarjanje oznake ni uspelo',
}, },
}, },
dataSource: {
notion: {
selector: {
pageSelected: 'Izbrane strani',
addPages: 'Dodajanje strani',
searchPages: 'Iskanje strani ...',
noSearchResult: 'Ni rezultatov iskanja',
preview: 'PREDOGLED',
},
connected: 'Povezani',
remove: 'Odstrani',
addWorkspace: 'Dodajanje delovnega prostora',
connectedWorkspace: 'Povezani delovni prostor',
description: 'Uporaba pojma kot vira podatkov za znanje.',
disconnected: 'Odklopi',
pagesAuthorized: 'Dovoljene strani',
title: 'Pojem',
changeAuthorizedPages: 'Spreminjanje pooblaščenih strani',
sync: 'Sinhroniziranje',
},
website: {
active: 'Dejaven',
configuredCrawlers: 'Konfigurirani pajki',
title: 'Spletna stran',
inactive: 'Neaktiven',
description: 'Uvozite vsebino s spletnih mest s spletnim pajkom.',
with: 'S',
},
add: 'Dodajanje vira podatkov',
connect: 'Povezati',
configure: 'Konfigurirati',
},
plugin: {
serpapi: {
apiKeyPlaceholder: 'Vnesite ključ API',
apiKey: 'API ključ',
keyFrom: 'Pridobite svoj ključ SerpAPI na strani računa SerpAPI',
},
},
apiBasedExtension: {
selector: {
placeholder: 'Prosimo, izberite razširitev API-ja',
manage: 'Upravljanje razširitve API',
title: 'Razširitev API-ja',
},
modal: {
name: {
placeholder: 'Prosimo, vnesite ime',
title: 'Ime',
},
apiEndpoint: {
title: 'Končna točka API-ja',
placeholder: 'Prosimo, vnesite končno točko API-ja',
},
apiKey: {
lengthError: 'Dolžina ključa API ne sme biti manjša od 5 znakov',
title: 'Ključ API-ja',
placeholder: 'Prosimo, vnesite API-ključ',
},
editTitle: 'Uredi razširitev API-ja',
title: 'Dodajanje razširitve API-ja',
},
type: 'Vrsta',
link: 'Preberite, kako razvijete lastno razširitev API-ja.',
title: 'Razširitve API zagotavljajo centralizirano upravljanje API, kar poenostavlja konfiguracijo za enostavno uporabo v aplikacijah Dify.',
linkUrl: 'https://docs.dify.ai/features/extension/api_based_extension',
add: 'Dodajanje razširitve API-ja',
},
about: {
updateNow: 'Posodobi zdaj',
nowAvailable: 'Dify {{version}} je zdaj na voljo.',
latestAvailable: 'Dify {{version}} je najnovejša različica, ki je na voljo.',
changeLog: 'Dnevnik sprememb',
},
appMenus: {
apiAccess: 'Dostop do API-ja',
logs: 'Dnevniki',
logAndAnn: 'Dnevniki & Ann.',
promptEng: 'Orkester',
overview: 'Spremljanje',
},
environment: {
development: 'RAZVOJ',
testing: 'PREIZKUŠANJE',
},
appModes: {
completionApp: 'Generator besedila',
chatApp: 'Aplikacija za klepet',
},
datasetMenus: {
documents: 'Dokumentov',
settings: 'Nastavitve',
hitTesting: 'Testiranje pridobivanja',
emptyTip: 'Znanje ni bilo povezano, prosimo, pojdite na aplikacijo ali vtičnik, da dokončate združenje.',
viewDoc: 'Oglejte si dokumentacijo',
relatedApp: 'Povezane aplikacije',
},
voiceInput: {
notAllow: 'Mikrofon ni pooblaščen',
speaking: 'Spregovorite zdaj ...',
converting: 'Pretvorba v besedilo ...',
},
modelName: {
'claude-2': 'Claude-2',
'gpt-4-32k': 'GPT-4-32K',
'text-embedding-ada-002': 'Vdelava besedila-Ada-002',
'gpt-4': 'GPT-4',
'whisper-1': 'Šepet-1',
'claude-instant-1': 'Claude-Instant',
'text-davinci-003': 'Besedilo-Davinci-003',
'gpt-3.5-turbo-16k': 'GPT-3.5-Turbo-16K',
'gpt-3.5-turbo': 'GPT-3.5-Turbo',
},
chat: {
citation: {
vectorHash: 'Vektorska razpršitev:',
hitScore: 'Rezultat pridobivanja:',
linkToDataset: 'Povezava do znanja',
hitCount: 'Število pridobivanja:',
characters: 'Znakov:',
title: 'CITATI',
},
conversationNameCanNotEmpty: 'Zahtevano ime pogovora',
inputPlaceholder: 'Pogovorite se z botom',
renameConversation: 'Preimenovanje pogovora',
conversationName: 'Ime pogovora',
conversationNamePlaceholder: 'Prosimo, vnesite ime pogovora',
},
promptEditor: {
context: {
item: {
desc: 'Vstavljanje predloge konteksta',
title: 'Kontekstu',
},
modal: {
footer: 'Kontekste lahko upravljate v spodnjem razdelku Kontekst.',
title: '{{num}} Znanje v kontekstu',
add: 'Dodajanje konteksta',
},
},
history: {
item: {
desc: 'Vstavljanje predloge zgodovinskega sporočila',
title: 'Zgodovina pogovorov',
},
modal: {
title: 'PRIMER',
edit: 'Urejanje imen vlog v pogovoru',
assistant: 'Zdravo! Kako vam lahko pomagam danes?',
user: 'Zdravo',
},
},
variable: {
item: {
desc: 'Vstavljanje spremenljivk in zunanjih orodij',
title: 'Spremenljivke in zunanja orodja',
},
outputToolDisabledItem: {
title: 'Spremenljivke',
desc: 'Vstavljanje spremenljivk',
},
modal: {
addTool: 'Novo orodje',
add: 'Nova spremenljivka',
},
},
query: {
item: {
title: 'Poizvedba',
desc: 'Vstavljanje predloge uporabniške poizvedbe',
},
},
existed: 'Že obstaja v pozivu',
placeholder: 'Tukaj vnesite svojo pozivno besedo, vnesite \'{\' za vstavljanje spremenljivke, vnesite \'/\', da vstavite blok vsebine',
},
imageUploader: {
pasteImageLinkInvalid: 'Neveljavna povezava do slike',
uploadFromComputerLimit: 'Nalaganje slik ne sme presegati {{size}} MB',
uploadFromComputerUploadError: 'Nalaganje slike ni uspelo, naložite ga znova.',
pasteImageLink: 'Prilepi povezavo do slike',
imageUpload: 'Nalaganje slik',
uploadFromComputer: 'Naloži iz računalnika',
pasteImageLinkInputPlaceholder: 'Tukaj prilepi povezavo do slike',
uploadFromComputerReadError: 'Branje slik ni uspelo, poskusite znova.',
},
fileUploader: {
fileExtensionNotSupport: 'Datotečna pripona ni podprta',
pasteFileLinkInvalid: 'Neveljavna povezava do datoteke',
pasteFileLink: 'Prilepi povezavo do datoteke',
pasteFileLinkInputPlaceholder: 'Vnesite URL ...',
uploadFromComputerUploadError: 'Nalaganje datoteke ni uspelo, naložite ga znova.',
uploadFromComputer: 'Lokalno nalaganje',
uploadFromComputerLimit: 'Nalaganje {{type}} ne sme presegati {{size}}',
uploadFromComputerReadError: 'Branje datoteke ni uspelo, poskusite znova.',
},
tag: {
addTag: 'Dodajanje oznak',
delete: 'Brisanje oznake',
manageTags: 'Upravljanje oznak',
addNew: 'Dodajanje nove oznake',
placeholder: 'Vse oznake',
failed: 'Ustvarjanje oznake ni uspelo',
editTag: 'Urejanje oznak',
created: 'Oznaka je bila uspešno ustvarjena',
noTagYet: 'Še ni oznak',
create: 'Ustvariti',
deleteTip: 'Oznaka se uporablja, jo izbrišite?',
noTag: 'Brez oznak',
selectorPlaceholder: 'Vnesite za iskanje ali ustvarjanje',
},
license: {
expiring_plural: 'Poteče v {{count}} dneh',
expiring: 'Poteče v enem dnevu',
},
} }
export default translation export default translation

View File

@ -152,6 +152,7 @@ const translation = {
indexSettingTip: 'Če želite spremeniti način indeksiranja in model vdelave, pojdite na ', indexSettingTip: 'Če želite spremeniti način indeksiranja in model vdelave, pojdite na ',
retrievalSettingTip: 'Če želite spremeniti nastavitve iskanja, pojdite na ', retrievalSettingTip: 'Če želite spremeniti nastavitve iskanja, pojdite na ',
datasetSettingLink: 'nastavitve Znanja.', datasetSettingLink: 'nastavitve Znanja.',
maxLengthCheck: 'Največja dolžina kosa mora biti manjša od 4000',
}, },
stepThree: { stepThree: {
creationTitle: '🎉 Znanje ustvarjeno', creationTitle: '🎉 Znanje ustvarjeno',

View File

@ -55,6 +55,7 @@ const translation = {
passwordEmpty: 'Geslo je obvezno', passwordEmpty: 'Geslo je obvezno',
passwordLengthInValid: 'Geslo mora vsebovati vsaj 8 znakov', passwordLengthInValid: 'Geslo mora vsebovati vsaj 8 znakov',
passwordInvalid: 'Geslo mora vsebovati črke in številke, dolžina pa mora biti več kot 8 znakov', passwordInvalid: 'Geslo mora vsebovati črke in številke, dolžina pa mora biti več kot 8 znakov',
registrationNotAllowed: 'Računa ni mogoče najti. Za registracijo se obrnite na skrbnika sistema.',
}, },
license: { license: {
tip: 'Preden začnete z Dify Community Edition, preberite GitHub', tip: 'Preden začnete z Dify Community Edition, preberite GitHub',
@ -70,6 +71,40 @@ const translation = {
activated: 'Prijavite se zdaj', activated: 'Prijavite se zdaj',
adminInitPassword: 'Geslo za inicializacijo administratorja', adminInitPassword: 'Geslo za inicializacijo administratorja',
validate: 'Potrdi', validate: 'Potrdi',
checkCode: {
emptyCode: 'Koda je obvezna',
verificationCodePlaceholder: 'Vnesite 6-mestno kodo',
resend: 'Poslati',
verificationCode: 'Koda za preverjanje',
tips: 'Kodo za preverjanje pošljemo na <strong>{{email}}</strong>',
verify: 'Preveriti',
validTime: 'Upoštevajte, da je koda veljavna 5 minut',
checkYourEmail: 'Preverjanje e-pošte',
didNotReceiveCode: 'Niste prejeli kode?',
invalidCode: 'Neveljavna koda',
useAnotherMethod: 'Uporabite drug način',
},
useVerificationCode: 'Uporaba kode za preverjanje',
licenseInactive: 'Licenca je neaktivna',
changePasswordBtn: 'Nastavitev gesla',
licenseExpired: 'Licenca je potekla',
resetPassword: 'Ponastavi geslo',
back: 'Hrbet',
backToLogin: 'Nazaj na prijavo',
enterYourName: 'Prosimo, vnesite svoje uporabniško ime',
licenseLost: 'Izgubljena licenca',
licenseExpiredTip: 'Licenca za Dify Enterprise za vaš delovni prostor je potekla. Če želite še naprej uporabljati Dify, se obrnite na skrbnika.',
usePassword: 'Uporaba gesla',
sendVerificationCode: 'Pošlji kodo za preverjanje',
resetPasswordDesc: 'Vnesite e-poštni naslov, ki ste ga uporabili za prijavo na Dify, in poslali vam bomo e-poštno sporočilo za ponastavitev gesla.',
setYourAccount: 'Nastavitev računa',
noLoginMethodTip: 'Obrnite se na skrbnika sistema, da dodate način preverjanja pristnosti.',
or: 'ALI',
noLoginMethod: 'Način preverjanja pristnosti ni konfiguriran',
continueWithCode: 'Nadaljujte s kodo',
withSSO: 'Nadaljujte z enotno prijavo',
licenseLostTip: 'Povezava z licenčnim strežnikom Dify ni uspela. Če želite še naprej uporabljati Dify, se obrnite na skrbnika.',
licenseInactiveTip: 'Licenca Dify Enterprise za vaš delovni prostor je neaktivna. Če želite še naprej uporabljati Dify, se obrnite na skrbnika.',
} }
export default translation export default translation

View File

@ -95,6 +95,10 @@ const translation = {
addParallelNode: 'Dodaj vzporedno vozlišče', addParallelNode: 'Dodaj vzporedno vozlišče',
parallel: 'VZPOREDNO', parallel: 'VZPOREDNO',
branch: 'VEJA', branch: 'VEJA',
fileUploadTip: 'Funkcije nalaganja slik so nadgrajene na nalaganje datotek.',
featuresDocLink: 'Izvedi več',
featuresDescription: 'Izboljšajte uporabniško izkušnjo spletne aplikacije',
ImageUploadLegacyTip: 'Zdaj lahko ustvarite spremenljivke vrste datoteke v začetnem obrazcu. V prihodnje ne bomo več podpirali funkcije nalaganja slik.',
}, },
env: { env: {
envPanelTitle: 'Spremenljivke okolja', envPanelTitle: 'Spremenljivke okolja',
@ -554,6 +558,506 @@ const translation = {
tracing: { tracing: {
stopBy: 'Ustavljeno s strani {{user}}', stopBy: 'Ustavljeno s strani {{user}}',
}, },
chatVariable: {
modal: {
type: 'Vrsta',
objectValue: 'Privzeta vrednost',
description: 'Opis',
editTitle: 'Urejanje spremenljivke pogovora',
namePlaceholder: 'Ime spremenljivke',
valuePlaceholder: 'Privzeta vrednost, pustite prazno, da ni nastavljeno',
title: 'Dodajanje spremenljivke pogovora',
editInJSON: 'Urejanje v JSON',
value: 'Privzeta vrednost',
oneByOne: 'Dodajanje enega za drugim',
objectKey: 'Ključ',
objectType: 'Vrsta',
arrayValue: 'Vrednost',
name: 'Ime',
descriptionPlaceholder: 'Opis spremenljivke',
editInForm: 'Uredi v obrazcu',
addArrayValue: 'Dodajanje vrednosti',
},
storedContent: 'Shranjena vsebina',
updatedAt: 'Posodobljeno na',
panelTitle: 'Spremenljivke pogovora',
button: 'Dodajanje spremenljivke',
panelDescription: 'Spremenljivke pogovora se uporabljajo za shranjevanje interaktivnih informacij, ki si jih mora LLM zapomniti, vključno z zgodovino pogovorov, naloženimi datotekami, uporabniškimi nastavitvami. So branje in pisanje.',
docLink: 'Če želite izvedeti več, obiščite naše dokumente.',
},
changeHistory: {
nodeChange: 'Blokiranje spremenjeno',
placeholder: 'Ničesar še niste spremenili',
nodeDescriptionChange: 'Opis bloka je bil spremenjen',
nodePaste: 'Blokiranje lepljenja',
noteDelete: 'Opomba izbrisana',
nodeDragStop: 'Blok premaknjen',
nodeConnect: 'Blok povezan',
sessionStart: 'Začetek seje',
nodeDelete: 'Blokiraj izbrisane',
stepBackward_other: '{{count}} stopi nazaj',
hint: 'Namig',
noteAdd: 'Opomba dodana',
clearHistory: 'Počisti zgodovino',
stepForward_one: '{{count}} korak naprej',
stepBackward_one: '{{count}} korak nazaj',
nodeAdd: 'Blokiranje dodano',
noteChange: 'Opomba spremenjena',
hintText: 'Dejanjem urejanja se sledi v zgodovini sprememb, ki je shranjena v napravi za čas trajanja te seje. Ta zgodovina bo izbrisana, ko zapustite urejevalnik.',
stepForward_other: '{{count}} koraki naprej',
edgeDelete: 'Blok je prekinjen.',
nodeTitleChange: 'Naslov bloka spremenjen',
nodeResize: 'Spremeni velikost bloka',
title: 'Zgodovina sprememb',
currentState: 'Trenutno stanje',
},
errorMsg: {
fields: {
code: 'Koda',
variableValue: 'Vrednost spremenljivke',
visionVariable: 'Spremenljivka vida',
model: 'Model',
rerankModel: 'Ponovno razvrsti model',
variable: 'Ime spremenljivke',
},
invalidJson: '{{field}} je neveljaven JSON',
invalidVariable: 'Neveljavna spremenljivka',
authRequired: 'Dovoljenje je potrebno',
fieldRequired: '{{field}} je obvezno',
rerankModelRequired: 'Preden vklopite Rerank Model, preverite, ali je bil model uspešno konfiguriran v nastavitvah.',
},
singleRun: {
startRun: 'Začni zagnati',
running: 'Tek',
testRunIteration: 'Ponovitev preskusnega zagona',
iteration: 'Ponovitev',
back: 'Hrbet',
testRun: 'Preskusni zagon',
},
tabs: {
'blocks': 'Bloki',
'workflowTool': 'Potek dela',
'transform': 'Preoblikovanje',
'question-understand': 'Vprašanje razumeti',
'builtInTool': 'Vgrajeno',
'allTool': 'Ves',
'tools': 'Orodja',
'logic': 'Logika',
'searchBlock': 'Iskalni blok',
'noResult': 'Ni najdenega ujemanja',
'customTool': 'Običaj',
'utilities': 'Utilities',
'searchTool': 'Orodje za iskanje',
},
blocks: {
'variable-aggregator': 'Spremenljivi agregator',
'code': 'Koda',
'parameter-extractor': 'Ekstraktor parametrov',
'llm': 'LLM',
'knowledge-retrieval': 'Pridobivanje znanja',
'answer': 'Odgovoriti',
'end': 'Konec',
'document-extractor': 'Ekstraktor dokumentov',
'assigner': 'Dodeljevalnik spremenljivke',
'iteration-start': 'Začetek ponovitve',
'template-transform': 'Predloga',
'iteration': 'Ponovitev',
'start': 'Začetek',
'if-else': 'IF/ELSE',
'list-operator': 'Operater seznama',
'http-request': 'Zahteva HTTP',
'variable-assigner': 'Spremenljivi agregator',
'question-classifier': 'Klasifikator vprašanj',
},
blocksAbout: {
'document-extractor': 'Uporablja se za razčlenjevanje naloženih dokumentov v besedilno vsebino, ki je zlahka razumljiva LLM.',
'list-operator': 'Uporablja se za filtriranje ali razvrščanje vsebine matrike.',
'template-transform': 'Pretvorite podatke v niz s sintakso predloge Jinja',
'question-classifier': 'Določite pogoje razvrščanja uporabniških vprašanj, LLM lahko določi, kako poteka pogovor na podlagi opisa klasifikacije',
'start': 'Določanje začetnih parametrov za zagon poteka dela',
'if-else': 'Omogoča razdelitev poteka dela na dve veji glede na pogoje if/else',
'knowledge-retrieval': 'Omogoča poizvedovanje po besedilni vsebini, ki je povezana z uporabniškimi vprašanji iz zbirke znanja',
'variable-assigner': 'Združite spremenljivke z več vejami v eno spremenljivko za poenoteno konfiguracijo nadaljnjih vozlišč.',
'code': 'Izvedite kodo Python ali NodeJS za izvajanje logike po meri',
'answer': 'Določanje vsebine odgovora v pogovoru v klepetu',
'iteration': 'Izvedite več korakov na predmetu seznama, dokler niso prikazani vsi rezultati.',
'http-request': 'Dovoli pošiljanje zahtev strežnika prek protokola HTTP',
'end': 'Določanje končne in končne vrste poteka dela',
'variable-aggregator': 'Združite spremenljivke z več vejami v eno spremenljivko za poenoteno konfiguracijo nadaljnjih vozlišč.',
'parameter-extractor': 'Uporabite LLM za pridobivanje strukturiranih parametrov iz naravnega jezika za klicanje orodij ali zahteve HTTP.',
'assigner': 'Vozlišče za dodeljevanje spremenljivk se uporablja za dodeljevanje vrednosti zapisljivim spremenljivkam (kot so spremenljivke pogovora).',
'llm': 'Sklicevanje na velike jezikovne modele za odgovarjanje na vprašanja ali obdelavo naravnega jezika',
},
operator: {
zoomOut: 'Pomanjšanje',
zoomTo100: 'Povečava na 100 %',
zoomToFit: 'Povečaj, da se prilega',
zoomIn: 'Povečava',
zoomTo50: 'Povečava na 50%',
},
panel: {
helpLink: 'Povezava za pomoč',
organizeBlocks: 'Organiziranje blokov',
optional: '(neobvezno)',
nextStep: 'Naslednji korak',
checklist: 'Kontrolni seznam',
runThisStep: 'Zaženite ta korak',
about: 'Približno',
selectNextStep: 'Izberite Naslednji blok',
changeBlock: 'Spremeni blok',
createdBy: 'Ustvaril',
checklistTip: 'Pred objavo se prepričajte, da so vse težave odpravljene',
userInputField: 'Uporabniško polje za vnos',
checklistResolved: 'Vse težave so odpravljene',
addNextStep: 'Dodajanje naslednjega bloka v ta potek dela',
change: 'Spremeniti',
},
nodes: {
common: {
memory: {
conversationRoleName: 'Ime vloge pogovora',
memoryTip: 'Nastavitve pomnilnika klepeta',
assistant: 'Predpona pomočnika',
user: 'Uporabniška predpona',
memory: 'Spomin',
windowSize: 'Velikost okna',
},
memories: {
tip: 'Pomnilnik klepeta',
title: 'Spomine',
builtIn: 'Vgrajeno',
},
outputVars: 'Izhodne spremenljivke',
insertVarTip: 'Vstavi spremenljivko',
},
start: {
outputVars: {
memories: {
content: 'Vsebina sporočila',
des: 'Zgodovina pogovorov',
type: 'Vrsta sporočila',
},
query: 'Uporabniški vnos',
files: 'Seznam datotek',
},
required: 'Zahteva',
inputField: 'Vnosno polje',
noVarTip: 'Nastavitev vhodov, ki jih je mogoče uporabiti v poteku dela',
builtInVar: 'Vgrajene spremenljivke',
},
end: {
output: {
variable: 'izhodna spremenljivka',
type: 'Vrsta izhoda',
},
type: {
'structured': 'Strukturiran',
'plain-text': 'Navadno besedilo',
'none': 'Nobena',
},
outputs: 'Izhodov',
},
answer: {
answer: 'Odgovoriti',
outputVars: 'Izhodne spremenljivke',
},
llm: {
roleDescription: {
assistant: 'Odgovori modela na podlagi sporočil uporabnikov',
system: 'Podajte navodila na visoki ravni za pogovor',
user: 'Navedite navodila, poizvedbe ali kakršen koli besedilni vnos v model',
},
resolution: {
low: 'Nizek',
high: 'Visok',
name: 'Resolucija',
},
outputVars: {
usage: 'Informacije o uporabi modela',
output: 'Ustvarjanje vsebine',
},
singleRun: {
variable: 'Spremenljivka',
},
notSetContextInPromptTip: 'Če želite omogočiti funkcijo konteksta, izpolnite kontekstno spremenljivko v PROMPT.',
sysQueryInUser: 'sys.query v sporočilu uporabnika je obvezen',
model: 'model',
files: 'Datoteke',
addMessage: 'Dodaj sporočilo',
context: 'Kontekstu',
variables: 'Spremenljivke',
prompt: 'Uren',
vision: 'vid',
contextTooltip: 'Znanje lahko uvozite kot kontekst',
},
knowledgeRetrieval: {
outputVars: {
title: 'Segmentirani naslov',
url: 'Segmentirani URL',
output: 'Pridobivanje segmentiranih podatkov',
icon: 'Segmentirana ikona',
metadata: 'Drugi metapodatki',
content: 'Segmentirana vsebina',
},
queryVariable: 'Spremenljivka poizvedbe',
knowledge: 'Znanje',
},
http: {
outputVars: {
headers: 'JSON seznama glav odgovorov',
body: 'Vsebina odgovora',
files: 'Seznam datotek',
statusCode: 'Koda stanja odgovora',
},
authorization: {
'authorization': 'Dovoljenje',
'header': 'Glava',
'bearer': 'Nosilec',
'api-key-title': 'API ključ',
'basic': 'Osnoven',
'no-auth': 'Nobena',
'custom': 'Običaj',
'authorizationType': 'Vrsta dovoljenja',
'auth-type': 'Vrsta preverjanja pristnosti',
'api-key': 'Ključ API-ja',
},
timeout: {
readPlaceholder: 'Vnos časovne omejitve branja v sekundah',
writePlaceholder: 'Vnesite časovno omejitev pisanja v sekundah',
writeLabel: 'Časovna omejitev pisanja',
connectLabel: 'Časovna omejitev povezave',
title: 'Timeout',
readLabel: 'Časovna omejitev branja',
connectPlaceholder: 'Vnos časovne omejitve povezave v sekundah',
},
value: 'Vrednost',
key: 'Ključ',
notStartWithHttp: 'API se mora začeti z http:// ali https://',
body: 'Telo',
type: 'Vrsta',
inputVars: 'Vhodne spremenljivke',
bulkEdit: 'Urejanje v velikem obsegu',
insertVarPlaceholder: 'vnesite "/" za vstavljanje spremenljivke',
api: 'API',
keyValueEdit: 'Urejanje ključ-vrednost',
binaryFileVariable: 'Spremenljivka binarne datoteke',
headers: 'Glave',
apiPlaceholder: 'Vnesite URL, vnesite \'/\' vstavi spremenljivko',
extractListPlaceholder: 'Vnesite indeks elementa seznama, vnesite \'/\' vstavi spremenljivko',
params: 'Params',
},
code: {
inputVars: 'Vhodne spremenljivke',
outputVars: 'Izhodne spremenljivke',
searchDependencies: 'Odvisnosti iskanja',
advancedDependenciesTip: 'Tukaj dodajte nekaj vnaprej naloženih odvisnosti, ki trajajo dlje časa ali niso privzeto vgrajene',
advancedDependencies: 'Napredne odvisnosti',
},
templateTransform: {
outputVars: {
output: 'Preoblikovana vsebina',
},
code: 'Koda',
inputVars: 'Vhodne spremenljivke',
codeSupportTip: 'Podpira samo Jinja2',
},
ifElse: {
comparisonOperator: {
'all of': 'vse',
'is not': 'ni',
'not empty': 'ni prazen',
'start with': 'Začnite z',
'is': 'Je',
'null': 'je nična',
'not exists': 'ne obstaja',
'contains': 'Vsebuje',
'empty': 'je prazen',
'exists': 'Obstaja',
'in': 'v',
'not contains': 'ne vsebuje',
'end with': 'Končaj z',
'not in': 'ni v',
'not null': 'ni nična',
},
optionName: {
video: 'Video',
doc: 'Doc',
audio: 'Avdio',
image: 'Podoba',
url: 'Spletni naslov',
localUpload: 'Lokalno nalaganje',
},
and: 'in',
else: 'Drugega',
enterValue: 'Vnesite vrednost',
elseDescription: 'Uporablja se za določanje logike, ki jo je treba izvesti, ko pogoj if ni izpolnjen.',
addCondition: 'Dodajanje pogoja',
if: 'Če',
select: 'Izbrati',
selectVariable: 'Izberite spremenljivko ...',
conditionNotSetup: 'Pogoj NI nastavljen',
addSubVariable: 'Podspremenljivka',
notSetVariable: 'Prosimo, najprej nastavite spremenljivko',
operator: 'Operaterja',
or: 'ali',
},
variableAssigner: {
type: {
string: 'Niz',
object: 'Predmet',
array: 'Matrika',
number: 'Številka',
},
outputVars: {
varDescribe: '{{groupName}} izhod',
},
addGroup: 'Dodajanje skupine',
outputType: 'Vrsta izhoda',
title: 'Dodeljevanje spremenljivk',
noVarTip: 'Seštevanje spremenljivk, ki jih je treba dodeliti',
aggregationGroupTip: 'Če omogočite to funkcijo, lahko združevalnik spremenljivk združi več naborov spremenljivk.',
aggregationGroup: 'Združevalna skupina',
varNotSet: 'Spremenljivka ni nastavljena',
setAssignVariable: 'Nastavitev spremenljivke dodelitve',
},
assigner: {
'writeMode': 'Način pisanja',
'plus': 'Plus',
'variable': 'Spremenljivka',
'clear': 'Jasen',
'append': 'Dodaj',
'assignedVariable': 'Dodeljena spremenljivka',
'setVariable': 'Nastavi spremenljivko',
'over-write': 'Prepisati',
'writeModeTip': 'Način dodajanja: Na voljo samo za spremenljivke polja.',
},
tool: {
outputVars: {
files: {
transfer_method: 'Način prenosa. Vrednost je remote_url ali local_file',
upload_file_id: 'Naloži ID datoteke',
type: 'Vrsta podpore. Zdaj podpiramo samo sliko',
url: 'URL slike',
title: 'Datoteke, ustvarjene z orodjem',
},
json: 'JSON, ustvarjen z orodjem',
text: 'Vsebina, ustvarjena z orodjem',
},
inputVars: 'Vhodne spremenljivke',
toAuthorize: 'Za odobritev',
},
questionClassifiers: {
outputVars: {
className: 'Ime razreda',
},
instruction: 'Navodilo',
classNamePlaceholder: 'Napišite ime svojega razreda',
addClass: 'Dodajanje razreda',
instructionPlaceholder: 'Napišite navodila',
topicName: 'Ime teme',
topicPlaceholder: 'Napišite ime teme',
class: 'Razred',
advancedSetting: 'Napredne nastavitve',
model: 'model',
inputVars: 'Vhodne spremenljivke',
instructionTip: 'Vnesite dodatna navodila, ki bodo klasifikatorju vprašanj pomagala bolje razumeti, kako kategorizirati vprašanja.',
},
parameterExtractor: {
addExtractParameterContent: {
description: 'Opis',
typePlaceholder: 'Vrsta parametra izvlečka',
requiredContent: 'Zahtevano se uporablja samo kot referenca za sklepanje modela in ne za obvezno validacijo izhodnega parametra.',
required: 'Zahteva',
type: 'Vrsta',
namePlaceholder: 'Izvleček imena parametra',
descriptionPlaceholder: 'Opis parametra izvlečka',
name: 'Ime',
},
isSuccess: 'Je uspeh.Pri uspehu je vrednost 1, pri neuspehu je vrednost 0.',
addExtractParameter: 'Dodajanje parametra izvlečka',
importFromTool: 'Uvoz iz orodij',
reasoningModeTip: 'Izberete lahko ustrezen način sklepanja glede na sposobnost modela, da se odzove na navodila za klicanje funkcij ali pozive.',
inputVar: 'Vhodna spremenljivka',
advancedSetting: 'Napredne nastavitve',
errorReason: 'Razlog za napako',
reasoningMode: 'Način sklepanja',
instruction: 'Navodilo',
instructionTip: 'Vnesite dodatna navodila, ki bodo ekstraktorju parametrov pomagala razumeti, kako izvleči parametre.',
extractParametersNotSet: 'Izvleček parametrov ni nastavljen',
extractParameters: 'Izvleček parametrov',
},
iteration: {
ErrorMethod: {
continueOnError: 'Nadaljuj ob napaki',
removeAbnormalOutput: 'Odstranite nenormalen izhod',
operationTerminated: 'Prekinjena',
},
output: 'Izhodne spremenljivke',
parallelMode: 'Vzporedni način',
MaxParallelismTitle: 'Največji vzporednost',
errorResponseMethod: 'Način odziva na napako',
parallelModeEnableDesc: 'V vzporednem načinu opravila v iteracijah podpirajo vzporedno izvajanje. To lahko konfigurirate na plošči z lastnostmi na desni.',
error_one: '{{štetje}} Napaka',
comma: ',',
parallelModeUpper: 'VZPOREDNI NAČIN',
parallelModeEnableTitle: 'Vzporedni način omogočen',
currentIteration: 'Trenutna ponovitev',
error_other: '{{štetje}} Napake',
input: 'Vhodni',
deleteTitle: 'Izbrisati iteracijsko vozlišče?',
parallelPanelDesc: 'V vzporednem načinu opravila v iteraciji podpirajo vzporedno izvajanje.',
deleteDesc: 'Če izbrišete iteracijsko vozlišče, boste izbrisali vsa podrejena vozlišča',
iteration_other: '{{štetje}} Ponovitev',
answerNodeWarningDesc: 'Opozorilo vzporednega načina: Vozlišča za odgovore, dodelitve spremenljivk pogovora in trajne operacije branja / pisanja v iteracijah lahko povzročijo izjeme.',
MaxParallelismDesc: 'Največja vzporednost se uporablja za nadzor števila nalog, ki se izvajajo hkrati v eni ponovitvi.',
iteration_one: '{{štetje}} Ponovitev',
},
note: {
editor: {
medium: 'Srednja',
openLink: 'Odprt',
showAuthor: 'Pokaži avtorja',
bold: 'Smel',
strikethrough: 'Prečrtano',
large: 'Velik',
link: 'Povezava',
enterUrl: 'Vnesite URL ...',
small: 'Majhen',
italic: 'Ležeče',
invalidUrl: 'Neveljaven URL',
unlink: 'Prekini povezavo',
placeholder: 'Napišite svojo opombo ...',
bulletList: 'Seznam oznak',
},
addNote: 'Dodaj opombo',
},
docExtractor: {
outputVars: {
text: 'Izvlečeno besedilo',
},
inputVar: 'Vhodna spremenljivka',
learnMore: 'Izvedi več',
supportFileTypes: 'Podporne vrste datotek: {{types}}.',
},
listFilter: {
outputVars: {
result: 'Rezultat filtriranja',
first_record: 'Prvi zapis',
last_record: 'Zadnji zapis',
},
extractsCondition: 'Ekstrahiranje elementa N',
selectVariableKeyPlaceholder: 'Izberite ključ podspremenljivke',
asc: 'ASC',
orderBy: 'Naročite po',
filterCondition: 'Pogoj filtra',
filterConditionKey: 'Ključ pogoja filtra',
desc: 'DESC',
limit: 'Vrh N',
filterConditionComparisonOperator: 'Operator za primerjavo pogojev filtra',
inputVar: 'Vhodna spremenljivka',
filterConditionComparisonValue: 'Vrednost pogoja filtra',
},
},
} }
export default translation export default translation

View File

@ -591,6 +591,10 @@ const translation = {
pasteFileLinkInvalid: 'Geçersiz dosya bağlantısı', pasteFileLinkInvalid: 'Geçersiz dosya bağlantısı',
fileExtensionNotSupport: 'Dosya uzantısı desteklenmiyor', fileExtensionNotSupport: 'Dosya uzantısı desteklenmiyor',
}, },
license: {
expiring_plural: '{{count}} gün içinde sona eriyor',
expiring: 'Bir günde sona eriyor',
},
} }
export default translation export default translation

View File

@ -99,6 +99,12 @@ const translation = {
noLoginMethodTip: 'Bir kimlik doğrulama yöntemi eklemek için lütfen sistem yöneticisine başvurun.', noLoginMethodTip: 'Bir kimlik doğrulama yöntemi eklemek için lütfen sistem yöneticisine başvurun.',
sendVerificationCode: 'Doğrulama Kodu Gönder', sendVerificationCode: 'Doğrulama Kodu Gönder',
back: 'Geri', back: 'Geri',
licenseExpiredTip: 'Çalışma alanınız için Dify Enterprise lisansının süresi doldu. Dify\'ı kullanmaya devam etmek için lütfen yöneticinizle iletişime geçin.',
licenseLostTip: 'Dify lisans sunucusuna bağlanılamadı. Dify\'ı kullanmaya devam etmek için lütfen yöneticinizle iletişime geçin.',
licenseInactiveTip: 'Çalışma alanınız için Dify Enterprise lisansı etkin değil. Dify\'ı kullanmaya devam etmek için lütfen yöneticinizle iletişime geçin.',
licenseExpired: 'Lisansın Süresi Doldu',
licenseLost: 'Lisans Kaybedildi',
licenseInactive: 'Lisans Etkin Değil',
} }
export default translation export default translation

View File

@ -408,6 +408,7 @@ const translation = {
}, },
type: 'Tür', type: 'Tür',
binaryFileVariable: 'İkili Dosya Değişkeni', binaryFileVariable: 'İkili Dosya Değişkeni',
extractListPlaceholder: 'Liste öğesi dizinini girin, \'/\' yazın değişken ekle',
}, },
code: { code: {
inputVars: 'Giriş Değişkenleri', inputVars: 'Giriş Değişkenleri',
@ -619,6 +620,7 @@ const translation = {
filterConditionComparisonValue: 'Filtre Koşulu değeri', filterConditionComparisonValue: 'Filtre Koşulu değeri',
selectVariableKeyPlaceholder: 'Alt değişken anahtarını seçin', selectVariableKeyPlaceholder: 'Alt değişken anahtarını seçin',
desc: 'DESC', desc: 'DESC',
extractsCondition: 'N öğesini ayıklayın',
}, },
}, },
tracing: { tracing: {

View File

@ -592,6 +592,10 @@ const translation = {
uploadFromComputerReadError: 'Не вдалося прочитати файл, будь ласка, спробуйте ще раз.', uploadFromComputerReadError: 'Не вдалося прочитати файл, будь ласка, спробуйте ще раз.',
uploadFromComputerUploadError: 'Не вдалося завантажити файл, будь ласка, завантажте ще раз.', uploadFromComputerUploadError: 'Не вдалося завантажити файл, будь ласка, завантажте ще раз.',
}, },
license: {
expiring: 'Термін дії закінчується за один день',
expiring_plural: 'Термін дії закінчується за {{count}} днів',
},
} }
export default translation export default translation

View File

@ -99,6 +99,12 @@ const translation = {
noLoginMethodTip: 'Будь ласка, зверніться до адміністратора системи, щоб додати метод автентифікації.', noLoginMethodTip: 'Будь ласка, зверніться до адміністратора системи, щоб додати метод автентифікації.',
resetPasswordDesc: 'Введіть адресу електронної пошти, яку ви використовували для реєстрації на Dify, і ми надішлемо вам електронний лист для скидання пароля.', resetPasswordDesc: 'Введіть адресу електронної пошти, яку ви використовували для реєстрації на Dify, і ми надішлемо вам електронний лист для скидання пароля.',
resetPassword: 'Скинути пароль', resetPassword: 'Скинути пароль',
licenseLostTip: 'Не вдалося підключити сервер ліцензій Dify. Будь ласка, зверніться до свого адміністратора, щоб продовжити користуватися Dify.',
licenseExpired: 'Термін дії ліцензії минув',
licenseInactive: 'Ліцензія неактивна',
licenseLost: 'Ліцензію втрачено',
licenseInactiveTip: 'Ліцензія Dify Enterprise для вашої робочої області неактивна. Будь ласка, зверніться до свого адміністратора, щоб продовжити користуватися Dify.',
licenseExpiredTip: 'Термін дії ліцензії Dify Enterprise для вашого робочого простору закінчився. Будь ласка, зверніться до свого адміністратора, щоб продовжити користуватися Dify.',
} }
export default translation export default translation

View File

@ -407,6 +407,7 @@ const translation = {
}, },
type: 'Тип', type: 'Тип',
binaryFileVariable: 'Змінна двійкового файлу', binaryFileVariable: 'Змінна двійкового файлу',
extractListPlaceholder: 'Введіть індекс елемента списку, введіть \'/\' вставити змінну',
}, },
code: { code: {
inputVars: 'Вхідні змінні', inputVars: 'Вхідні змінні',
@ -618,6 +619,7 @@ const translation = {
orderBy: 'Замовити по', orderBy: 'Замовити по',
filterConditionComparisonOperator: 'Оператор порівняння умов фільтра', filterConditionComparisonOperator: 'Оператор порівняння умов фільтра',
filterConditionComparisonValue: 'Значення умови фільтра', filterConditionComparisonValue: 'Значення умови фільтра',
extractsCondition: 'Витягніть елемент N',
}, },
}, },
tracing: { tracing: {

View File

@ -591,6 +591,10 @@ const translation = {
uploadFromComputerUploadError: 'Tải lên tệp không thành công, vui lòng tải lên lại.', uploadFromComputerUploadError: 'Tải lên tệp không thành công, vui lòng tải lên lại.',
uploadFromComputerReadError: 'Đọc tệp không thành công, vui lòng thử lại.', uploadFromComputerReadError: 'Đọc tệp không thành công, vui lòng thử lại.',
}, },
license: {
expiring_plural: 'Hết hạn sau {{count}} ngày',
expiring: 'Hết hạn trong một ngày',
},
} }
export default translation export default translation

View File

@ -99,6 +99,12 @@ const translation = {
usePassword: 'Sử dụng mật khẩu', usePassword: 'Sử dụng mật khẩu',
resetPassword: 'Đặt lại mật khẩu', resetPassword: 'Đặt lại mật khẩu',
sendVerificationCode: 'Gửi mã xác minh', sendVerificationCode: 'Gửi mã xác minh',
licenseInactive: 'Giấy phép không hoạt động',
licenseLost: 'Mất giấy phép',
licenseInactiveTip: 'Giấy phép Dify Enterprise cho không gian làm việc của bạn không hoạt động. Vui lòng liên hệ với quản trị viên của bạn để tiếp tục sử dụng Dify.',
licenseExpired: 'Giấy phép đã hết hạn',
licenseExpiredTip: 'Giấy phép Dify Enterprise cho không gian làm việc của bạn đã hết hạn. Vui lòng liên hệ với quản trị viên của bạn để tiếp tục sử dụng Dify.',
licenseLostTip: 'Không thể kết nối máy chủ cấp phép Dify. Vui lòng liên hệ với quản trị viên của bạn để tiếp tục sử dụng Dify.',
} }
export default translation export default translation

View File

@ -407,6 +407,7 @@ const translation = {
}, },
binaryFileVariable: 'Biến tệp nhị phân', binaryFileVariable: 'Biến tệp nhị phân',
type: 'Kiểu', type: 'Kiểu',
extractListPlaceholder: 'Nhập chỉ mục mục danh sách, nhập \'/\' chèn biến',
}, },
code: { code: {
inputVars: 'Biến đầu vào', inputVars: 'Biến đầu vào',
@ -618,6 +619,7 @@ const translation = {
filterCondition: 'Điều kiện lọc', filterCondition: 'Điều kiện lọc',
asc: 'ASC', asc: 'ASC',
filterConditionComparisonOperator: 'Toán tử so sánh điều kiện bộ lọc', filterConditionComparisonOperator: 'Toán tử so sánh điều kiện bộ lọc',
extractsCondition: 'Giải nén mục N',
}, },
}, },
tracing: { tracing: {

View File

@ -591,6 +591,10 @@ const translation = {
created: '标签创建成功', created: '标签创建成功',
failed: '标签创建失败', failed: '标签创建失败',
}, },
license: {
expiring: '许可证还有 1 天到期',
expiring_plural: '许可证还有 {{count}} 天到期',
},
} }
export default translation export default translation

View File

@ -99,6 +99,12 @@ const translation = {
back: '返回', back: '返回',
noLoginMethod: '未配置身份认证方式', noLoginMethod: '未配置身份认证方式',
noLoginMethodTip: '请联系系统管理员添加身份认证方式', noLoginMethodTip: '请联系系统管理员添加身份认证方式',
licenseExpired: '许可证已过期',
licenseExpiredTip: '您所在空间的 Dify Enterprise 许可证已过期,请联系管理员以继续使用 Dify。',
licenseLost: '许可证丢失',
licenseLostTip: '无法连接 Dify 许可证服务器,请联系管理员以继续使用 Dify。',
licenseInactive: '许可证未激活',
licenseInactiveTip: '您所在空间的 Dify Enterprise 许可证尚未激活,请联系管理员以继续使用 Dify。',
} }
export default translation export default translation

View File

@ -591,6 +591,10 @@ const translation = {
fileExtensionNotSupport: '不支援檔擴展名', fileExtensionNotSupport: '不支援檔擴展名',
uploadFromComputerLimit: '上傳文件不能超過 {{size}}', uploadFromComputerLimit: '上傳文件不能超過 {{size}}',
}, },
license: {
expiring: '將在1天內過期',
expiring_plural: '將在 {{count}} 天后過期',
},
} }
export default translation export default translation

View File

@ -99,6 +99,12 @@ const translation = {
back: '返回', back: '返回',
resetPasswordDesc: '輸入您用於註冊 Dify 的電子郵件,我們將向您發送一封密碼重置電子郵件。', resetPasswordDesc: '輸入您用於註冊 Dify 的電子郵件,我們將向您發送一封密碼重置電子郵件。',
usePassword: '使用密碼', usePassword: '使用密碼',
licenseExpiredTip: '您的工作區的 Dify Enterprise 許可證已過期。請聯繫您的管理員以繼續使用 Dify。',
licenseExpired: '許可證已過期',
licenseLost: '許可證丟失',
licenseInactive: '許可證處於非活動狀態',
licenseInactiveTip: '您的工作區的 Dify Enterprise 許可證處於非活動狀態。請聯繫您的管理員以繼續使用 Dify。',
licenseLostTip: '無法連接 Dify 許可證伺服器。請聯繫您的管理員以繼續使用 Dify。',
} }
export default translation export default translation

View File

@ -407,6 +407,7 @@ const translation = {
}, },
type: '類型', type: '類型',
binaryFileVariable: '二進位檔變數', binaryFileVariable: '二進位檔變數',
extractListPlaceholder: '輸入清單項索引,鍵入 『/』 插入變數',
}, },
code: { code: {
inputVars: '輸入變量', inputVars: '輸入變量',
@ -618,6 +619,7 @@ const translation = {
selectVariableKeyPlaceholder: 'Select sub variable key (選擇子變數鍵)', selectVariableKeyPlaceholder: 'Select sub variable key (選擇子變數鍵)',
filterConditionComparisonOperator: 'Filter Condition Comparison 運算符', filterConditionComparisonOperator: 'Filter Condition Comparison 運算符',
filterConditionKey: '篩選條件鍵', filterConditionKey: '篩選條件鍵',
extractsCondition: '提取第 N 項',
}, },
}, },
tracing: { tracing: {

View File

@ -17,6 +17,7 @@ import type {
WorkflowStartedResponse, WorkflowStartedResponse,
} from '@/types/workflow' } from '@/types/workflow'
import { removeAccessToken } from '@/app/components/share/utils' import { removeAccessToken } from '@/app/components/share/utils'
import { asyncRunSafe } from '@/utils'
const TIME_OUT = 100000 const TIME_OUT = 100000
const ContentType = { const ContentType = {
@ -550,55 +551,78 @@ export const ssePost = (
} }
// base request // base request
export const request = <T>(url: string, options = {}, otherOptions?: IOtherOptions) => { export const request = async<T>(url: string, options = {}, otherOptions?: IOtherOptions) => {
return new Promise<T>((resolve, reject) => { try {
const otherOptionsForBaseFetch = otherOptions || {} const otherOptionsForBaseFetch = otherOptions || {}
baseFetch<T>(url, options, otherOptionsForBaseFetch).then(resolve).catch((errResp) => { const [err, resp] = await asyncRunSafe<T>(baseFetch(url, options, otherOptionsForBaseFetch))
if (errResp?.status === 401) { if (err === null)
return refreshAccessTokenOrRelogin(TIME_OUT).then(() => { return resp
baseFetch<T>(url, options, otherOptionsForBaseFetch).then(resolve).catch(reject) const errResp: Response = err as any
}).catch(() => { if (errResp.status === 401) {
const { const [parseErr, errRespData] = await asyncRunSafe<ResponseError>(errResp.json())
isPublicAPI = false, const loginUrl = `${globalThis.location.origin}/signin`
silent, if (parseErr) {
} = otherOptionsForBaseFetch globalThis.location.href = loginUrl
const bodyJson = errResp.json() return Promise.reject(err)
if (isPublicAPI) {
return bodyJson.then((data: ResponseError) => {
if (data.code === 'web_sso_auth_required')
requiredWebSSOLogin()
if (data.code === 'unauthorized') {
removeAccessToken()
globalThis.location.reload()
}
return Promise.reject(data)
})
}
const loginUrl = `${globalThis.location.origin}/signin`
bodyJson.then((data: ResponseError) => {
if (data.code === 'init_validate_failed' && IS_CE_EDITION && !silent)
Toast.notify({ type: 'error', message: data.message, duration: 4000 })
else if (data.code === 'not_init_validated' && IS_CE_EDITION)
globalThis.location.href = `${globalThis.location.origin}/init`
else if (data.code === 'not_setup' && IS_CE_EDITION)
globalThis.location.href = `${globalThis.location.origin}/install`
else if (location.pathname !== '/signin' || !IS_CE_EDITION)
globalThis.location.href = loginUrl
else if (!silent)
Toast.notify({ type: 'error', message: data.message })
}).catch(() => {
// Handle any other errors
globalThis.location.href = loginUrl
})
})
} }
else { // special code
reject(errResp) const { code, message } = errRespData
// webapp sso
if (code === 'web_sso_auth_required') {
requiredWebSSOLogin()
return Promise.reject(err)
} }
}) if (code === 'unauthorized_and_force_logout') {
}) localStorage.removeItem('console_token')
localStorage.removeItem('refresh_token')
globalThis.location.reload()
return Promise.reject(err)
}
const {
isPublicAPI = false,
silent,
} = otherOptionsForBaseFetch
if (isPublicAPI && code === 'unauthorized') {
removeAccessToken()
globalThis.location.reload()
return Promise.reject(err)
}
if (code === 'init_validate_failed' && IS_CE_EDITION && !silent) {
Toast.notify({ type: 'error', message, duration: 4000 })
return Promise.reject(err)
}
if (code === 'not_init_validated' && IS_CE_EDITION) {
globalThis.location.href = `${globalThis.location.origin}/init`
return Promise.reject(err)
}
if (code === 'not_setup' && IS_CE_EDITION) {
globalThis.location.href = `${globalThis.location.origin}/install`
return Promise.reject(err)
}
// refresh token
const [refreshErr] = await asyncRunSafe(refreshAccessTokenOrRelogin(TIME_OUT))
if (refreshErr === null)
return baseFetch<T>(url, options, otherOptionsForBaseFetch)
if (location.pathname !== '/signin' || !IS_CE_EDITION) {
globalThis.location.href = loginUrl
return Promise.reject(err)
}
if (!silent) {
Toast.notify({ type: 'error', message })
return Promise.reject(err)
}
globalThis.location.href = loginUrl
return Promise.reject(err)
}
else {
return Promise.reject(err)
}
}
catch (error) {
console.error(error)
return Promise.reject(error)
}
} }
// request methods // request methods

View File

@ -4,6 +4,20 @@ export enum SSOProtocol {
OAuth2 = 'oauth2', OAuth2 = 'oauth2',
} }
export enum LicenseStatus {
NONE = 'none',
INACTIVE = 'inactive',
ACTIVE = 'active',
EXPIRING = 'expiring',
EXPIRED = 'expired',
LOST = 'lost',
}
type License = {
status: LicenseStatus
expired_at: string | null
}
export type SystemFeatures = { export type SystemFeatures = {
sso_enforced_for_signin: boolean sso_enforced_for_signin: boolean
sso_enforced_for_signin_protocol: SSOProtocol | '' sso_enforced_for_signin_protocol: SSOProtocol | ''
@ -15,6 +29,7 @@ export type SystemFeatures = {
enable_social_oauth_login: boolean enable_social_oauth_login: boolean
is_allow_create_workspace: boolean is_allow_create_workspace: boolean
is_allow_register: boolean is_allow_register: boolean
license: License
} }
export const defaultSystemFeatures: SystemFeatures = { export const defaultSystemFeatures: SystemFeatures = {
@ -28,4 +43,8 @@ export const defaultSystemFeatures: SystemFeatures = {
enable_social_oauth_login: false, enable_social_oauth_login: false,
is_allow_create_workspace: false, is_allow_create_workspace: false,
is_allow_register: false, is_allow_register: false,
license: {
status: LicenseStatus.NONE,
expired_at: '',
},
} }

View File

@ -8,10 +8,8 @@ export async function asyncRunSafe<T = any>(fn: Promise<T>): Promise<[Error] | [
try { try {
return [null, await fn] return [null, await fn]
} }
catch (e) { catch (e: any) {
if (e instanceof Error) return [e || new Error('unknown error')]
return [e]
return [new Error('unknown error')]
} }
} }