feat: i18n

This commit is contained in:
wangdan-fit2cloud 2025-01-21 15:25:21 +08:00
parent 27a8faccd1
commit 1389c581b7
78 changed files with 648 additions and 663 deletions

View File

@ -1,7 +1,7 @@
<template>
<el-dialog
class="execution-details-dialog"
:title="$t('components.chat.executionDetails.title')"
:title="$t('chat.executionDetails.title')"
v-model="dialogVisible"
destroy-on-close
append-to-body
@ -57,11 +57,13 @@
>
<div class="card-never border-r-4">
<h5 class="p-8-12">
{{ $t('components.chat.executionDetails.paramInput') }}
{{ $t('chat.executionDetails.paramInput') }}
</h5>
<div class="p-8-12 border-t-dashed lighter">
<div class="mb-8">
<span class="color-secondary">用户问题:</span>
<span class="color-secondary">
{{ $t('chat.paragraphSource.question') }}:</span
>
{{ item.question || '-' }}
</div>
<div v-for="(f, i) in item.global_fields" :key="i" class="mb-8">
@ -105,7 +107,9 @@
</el-space>
</div>
<div v-if="item.audio_list?.length > 0">
<p class="mb-8 color-secondary">语音文件:</p>
<p class="mb-8 color-secondary">
{{ $t('chat.executionDetails.audioFile') }}:
</p>
<el-space wrap>
<template v-for="(f, i) in item.audio_list" :key="i">
@ -124,11 +128,15 @@
<!-- 知识库检索 -->
<template v-if="item.type == WorkflowType.SearchDataset">
<div class="card-never border-r-4">
<h5 class="p-8-12">检索内容</h5>
<h5 class="p-8-12">
{{ $t('chat.executionDetails.searchContent') }}
</h5>
<div class="p-8-12 border-t-dashed lighter">{{ item.question || '-' }}</div>
</div>
<div class="card-never border-r-4 mt-8">
<h5 class="p-8-12">检索结果</h5>
<h5 class="p-8-12">
{{ $t('chat.executionDetails.searchResult') }}
</h5>
<div class="p-8-12 border-t-dashed lighter">
<template v-if="item.paragraph_list?.length > 0">
<template
@ -149,7 +157,9 @@
<!-- 判断器 -->
<template v-if="item.type == WorkflowType.Condition">
<div class="card-never border-r-4">
<h5 class="p-8-12">判断结果</h5>
<h5 class="p-8-12">
{{ $t('chat.executionDetails.conditionResult') }}
</h5>
<div class="p-8-12 border-t-dashed lighter">
{{ item.branch_name || '-' }}
</div>
@ -179,7 +189,7 @@
class="card-never border-r-4 mt-8"
v-if="item.type !== WorkflowType.Application"
>
<h5 class="p-8-12">{{ $t('components.chat.history') }}</h5>
<h5 class="p-8-12">{{ $t('chat.history') }}</h5>
<div class="p-8-12 border-t-dashed lighter">
<template v-if="item.history_message?.length > 0">
<p
@ -198,7 +208,9 @@
class="card-never border-r-4 mt-8"
v-if="item.type !== WorkflowType.Application"
>
<h5 class="p-8-12">本次对话</h5>
<h5 class="p-8-12">
{{ $t('chat.executionDetails.currentChat') }}
</h5>
<div class="p-8-12 border-t-dashed lighter pre-wrap">
{{ item.question || '-' }}
</div>
@ -207,8 +219,8 @@
<h5 class="p-8-12">
{{
item.type == WorkflowType.Application
? $t('components.chat.executionDetails.paramOutput')
: 'AI 回答'
? $t('chat.executionDetails.paramOutput')
: $t('chat.executionDetails.answer')
}}
</h5>
<div class="p-8-12 border-t-dashed lighter">
@ -227,7 +239,9 @@
<!-- 指定回复 -->
<template v-if="item.type === WorkflowType.Reply">
<div class="card-never border-r-4">
<h5 class="p-8-12">回复内容</h5>
<h5 class="p-8-12">
{{ $t('chat.executionDetails.replyContent') }}
</h5>
<div class="p-8-12 border-t-dashed lighter">
<el-scrollbar height="150">
<MdPreview
@ -248,12 +262,12 @@
<div class="card-never border-r-4">
<h5 class="p-8-12 flex align-center">
<span class="mr-4">{{
$t('components.chat.executionDetails.paramOutput')
$t('chat.executionDetails.paramOutput')
}}</span>
<el-tooltip
effect="dark"
content="每个文档仅支持预览500字"
:content="$t('chat.executionDetails.paramOutputTooltip')"
placement="right"
>
<AppIcon iconName="app-warning" class="app-warning-icon"></AppIcon>
@ -283,11 +297,15 @@
</template>
<template v-if="item.type === WorkflowType.SpeechToTextNode">
<div class="card-never border-r-4">
<h5 class="p-8-12"> {{ $t('components.chat.executionDetails.paramInput') }}</h5>
<h5 class="p-8-12">
{{ $t('chat.executionDetails.paramInput') }}
</h5>
<div class="p-8-12 border-t-dashed lighter">
<div class="mb-8">
<div v-if="item.audio_list?.length > 0">
<p class="mb-8 color-secondary">语音文件:</p>
<p class="mb-8 color-secondary">
{{ $t('chat.executionDetails.audioFile') }}:
</p>
<el-space wrap>
<template v-for="(f, i) in item.audio_list" :key="i">
@ -305,7 +323,7 @@
</div>
<div class="card-never border-r-4">
<h5 class="p-8-12">
{{ $t('components.chat.executionDetails.paramOutput') }}
{{ $t('chat.executionDetails.paramOutput') }}
</h5>
<div class="p-8-12 border-t-dashed lighter">
<el-card
@ -330,10 +348,14 @@
<template v-if="item.type === WorkflowType.TextToSpeechNode">
<div class="card-never border-r-4">
<h5 class="p-8-12"> {{ $t('components.chat.executionDetails.paramInput') }}</h5>
<h5 class="p-8-12">
{{ $t('chat.executionDetails.paramInput') }}
</h5>
<div class="p-8-12 border-t-dashed lighter">
<div class="p-8-12 border-t-dashed lighter">
<p class="mb-8 color-secondary">文本内容:</p>
<p class="mb-8 color-secondary">
{{ $t('chat.executionDetails.textContent') }}:
</p>
<div v-if="item.content">
<MdPreview
ref="editorRef"
@ -347,10 +369,12 @@
</div>
<div class="card-never border-r-4">
<h5 class="p-8-12">
{{ $t('components.chat.executionDetails.paramOutput') }}
{{ $t('chat.executionDetails.paramOutput') }}
</h5>
<div class="p-8-12 border-t-dashed lighter">
<p class="mb-8 color-secondary">语音文件:</p>
<p class="mb-8 color-secondary">
{{ $t('chat.executionDetails.audioFile') }}:
</p>
<div v-if="item.answer" v-html="item.answer"></div>
</div>
</div>
@ -364,13 +388,13 @@
"
>
<div class="card-never border-r-4 mt-8">
<h5 class="p-8-12">输入</h5>
<h5 class="p-8-12">{{ $t('chat.executionDetails.input') }}</h5>
<div class="p-8-12 border-t-dashed lighter pre-wrap">
{{ item.params || '-' }}
</div>
</div>
<div class="card-never border-r-4 mt-8">
<h5 class="p-8-12">输出</h5>
<h5 class="p-8-12">{{ $t('chat.executionDetails.output') }}</h5>
<div class="p-8-12 border-t-dashed lighter pre-wrap">
{{ item.result || '-' }}
</div>
@ -379,11 +403,15 @@
<!-- 多路召回 -->
<template v-if="item.type == WorkflowType.RrerankerNode">
<div class="card-never border-r-4">
<h5 class="p-8-12">检索内容</h5>
<h5 class="p-8-12">
{{ $t('chat.executionDetails.searchContent') }}
</h5>
<div class="p-8-12 border-t-dashed lighter">{{ item.question || '-' }}</div>
</div>
<div class="card-never border-r-4 mt-8">
<h5 class="p-8-12">重排内容</h5>
<h5 class="p-8-12">
{{ $t('chat.executionDetails.rerankerContent') }}
</h5>
<div class="p-8-12 border-t-dashed lighter">
<template v-if="item.document_list?.length > 0">
<template
@ -407,7 +435,9 @@
</div>
</div>
<div class="card-never border-r-4 mt-8">
<h5 class="p-8-12">重排结果</h5>
<h5 class="p-8-12">
{{ $t('chat.executionDetails.rerankerResult') }}
</h5>
<div class="p-8-12 border-t-dashed lighter">
<template v-if="item.result_list?.length > 0">
<template
@ -416,7 +446,7 @@
>
<CardBox
shadow="never"
:title="`分段${paragraphIndex + 1}`"
:title="`${$t('chat.executionDetails.paragraph')}${paragraphIndex + 1}`"
class="paragraph-source-card cursor mb-8 paragraph-source-card-height"
:showIcon="false"
>
@ -446,9 +476,11 @@
<template v-if="item.type === WorkflowType.FormNode">
<div class="card-never border-r-4">
<h5 class="p-8-12">
{{ $t('components.chat.executionDetails.paramOutput')
{{ $t('chat.executionDetails.paramOutput')
}}<span style="color: #f54a45">{{
item.is_submit ? '' : '(用户未提交)'
item.is_submit
? ''
: `(${$t('chat.executionDetails.noSubmit')})`
}}</span>
</h5>
@ -473,9 +505,7 @@
v-if="item.type !== WorkflowType.Application"
>
<h5 class="p-8-12">
{{
$t('views.application.applicationForm.form.roleSettings.label')
}}
{{ $t('views.application.applicationForm.form.roleSettings.label') }}
(System)
</h5>
<div class="p-8-12 border-t-dashed lighter">
@ -486,7 +516,7 @@
class="card-never border-r-4 mt-8"
v-if="item.type !== WorkflowType.Application"
>
<h5 class="p-8-12">{{ $t('components.chat.history') }}</h5>
<h5 class="p-8-12">{{ $t('chat.history') }}</h5>
<div class="p-8-12 border-t-dashed lighter">
<template v-if="item.history_message?.length > 0">
<p
@ -518,7 +548,9 @@
</div>
</div>
<div class="card-never border-r-4 mt-8">
<h5 class="p-8-12">本次对话</h5>
<h5 class="p-8-12">
{{ $t('chat.executionDetails.currentChat') }}
</h5>
<div class="p-8-12 border-t-dashed lighter pre-wrap">
<div v-if="item.image_list?.length > 0">
<el-space wrap>
@ -542,8 +574,8 @@
<h5 class="p-8-12">
{{
item.type == WorkflowType.Application
? $t('components.chat.executionDetails.paramOutput')
: 'AI 回答'
? $t('chat.executionDetails.paramOutput')
: $t('chat.executionDetails.answer')
}}
</h5>
<div class="p-8-12 border-t-dashed lighter">
@ -561,7 +593,9 @@
<!-- 图片生成 -->
<template v-if="item.type == WorkflowType.ImageGenerateNode">
<div class="card-never border-r-4 mt-8">
<h5 class="p-8-12">本次对话</h5>
<h5 class="p-8-12">
{{ $t('chat.executionDetails.currentChat') }}
</h5>
<div class="p-8-12 border-t-dashed lighter pre-wrap">
{{ item.question || '-' }}
</div>
@ -570,8 +604,8 @@
<h5 class="p-8-12">
{{
item.type == WorkflowType.Application
? $t('components.chat.executionDetails.paramOutput')
: 'AI 回答'
? $t('chat.executionDetails.paramOutput')
: $t('chat.executionDetails.answer')
}}
</h5>
<div class="p-8-12 border-t-dashed lighter">
@ -589,7 +623,7 @@
</template>
<template v-else>
<div class="card-never border-r-4">
<h5 class="p-8-12">错误日志</h5>
<h5 class="p-8-12">{{ $t('chat.executionDetails.errMessage') }}</h5>
<div class="p-8-12 border-t-dashed lighter">{{ item.err_message || '-' }}</div>
</div>
</template>

View File

@ -1,10 +1,10 @@
<template>
<div class="flex align-center mt-16" v-if="!isWorkFlow(props.type)">
<span class="mr-4 color-secondary">{{ $t('components.chat.KnowledgeSource.title') }}</span>
<span class="mr-4 color-secondary">{{ $t('chat.KnowledgeSource.title') }}</span>
<el-divider direction="vertical" />
<el-button type="primary" class="mr-8" link @click="openParagraph(data)">
<AppIcon iconName="app-reference-outlined" class="mr-4"></AppIcon>
{{ $t('components.chat.KnowledgeSource.referenceParagraph') }}
{{ $t('chat.KnowledgeSource.referenceParagraph') }}
{{ data.paragraph_list?.length || 0 }}</el-button
>
</div>
@ -43,8 +43,8 @@
<div class="border-t color-secondary flex-between mt-12" style="padding-top: 12px">
<div>
<span class="mr-8"> {{ $t('components.chat.KnowledgeSource.consume') }} tokens: {{ data?.message_tokens + data?.answer_tokens }} </span>
<span> {{ $t('components.chat.KnowledgeSource.consumeTime') }}: {{ data?.run_time?.toFixed(2) }} s</span>
<span class="mr-8"> {{ $t('chat.KnowledgeSource.consume') }} tokens: {{ data?.message_tokens + data?.answer_tokens }} </span>
<span> {{ $t('chat.KnowledgeSource.consumeTime') }}: {{ data?.run_time?.toFixed(2) }} s</span>
</div>
<el-button
v-if="isWorkFlow(props.type)"
@ -53,7 +53,7 @@
@click="openExecutionDetail(data.execution_details)"
>
<el-icon class="mr-4"><Document /></el-icon>
{{ $t('components.chat.executionDetails.title') }}</el-button
{{ $t('chat.executionDetails.title') }}</el-button
>
</div>
<!-- 知识库引用 dialog -->

View File

@ -1,7 +1,7 @@
<template>
<el-dialog
class="paragraph-source"
title="知识库引用"
:title="$t('chat.paragraphSource.title')"
v-model="dialogVisible"
destroy-on-close
append-to-body
@ -13,13 +13,13 @@
<el-scrollbar>
<div class="paragraph-source-height p-16 pb-0">
<el-form label-position="top">
<el-form-item label="用户问题">
<el-form-item :label="$t('chat.paragraphSource.question')">
<el-input v-model="detail.problem_text" disabled />
</el-form-item>
<el-form-item label="优化后问题">
<el-form-item :label="$t('chat.paragraphSource.optimizationQuestion')">
<el-input v-model="detail.padding_problem_text" disabled />
</el-form-item>
<el-form-item :label="$t('components.chat.KnowledgeSource.referenceParagraph')">
<el-form-item :label="$t('chat.KnowledgeSource.referenceParagraph')">
<div v-if="detail.paragraph_list.length > 0" class="w-full">
<template v-for="(item, index) in detail.paragraph_list" :key="index">
<ParagraphCard :data="item" :index="index" />

View File

@ -12,7 +12,7 @@
(chatRecord.write_ed === undefined || chatRecord.write_ed === true) &&
!answer_text.content
"
source=" 抱歉,没有查找到相关内容,请重新描述您的问题或提供更多信息。"
:source="$t('chat.tip.answerMessage')"
></MdRenderer>
<MdRenderer
:chat_record_id="answer_text.chat_record_id"
@ -24,10 +24,10 @@
:send-message="chatMessage"
></MdRenderer>
<span v-else-if="chatRecord.is_stop" shadow="always" class="dialog-card">
已停止回答
{{ $t('chat.tip.stopAnswer') }}
</span>
<span v-else shadow="always" class="dialog-card">
回答中 <span class="dotting"></span>
{{ $t('chat.tip.answerLoading') }} <span class="dotting"></span>
</span>
<!-- 知识来源 -->
<div v-if="showSource(chatRecord) && index === chatRecord.answer_text_list.length - 1">

View File

@ -95,10 +95,10 @@
v-model="inputValue"
:placeholder="
startRecorderTime
? '说话中...'
? `${$t('chat.inputPlaceholder.speaking')}...`
: recorderLoading
? '转文字中...'
: '请输入问题Ctrl+Enter 换行Enter发送'
? `${$t('chat.inputPlaceholder.recorderLoading')}...`
: $t('chat.inputPlaceholder.default')
"
:autosize="{ minRows: 1, maxRows: isMobile ? 4 : 10 }"
type="textarea"
@ -119,12 +119,13 @@
<el-tooltip effect="dark" placement="top" popper-class="upload-tooltip-width">
<template #content>
<div class="break-all pre-wrap">
上传文件最多{{
props.applicationDetails.file_upload_setting.maxFiles
}}每个文件限制
{{ props.applicationDetails.file_upload_setting.fileLimit }}MB<br />文件类型{{
getAcceptList().replace(/\./g, '').replace(/,/g, '、').toUpperCase()
}}
{{ $t('chat.uploadFile.label') }}{{
$t('chat.uploadFile.most')
}}{{ props.applicationDetails.file_upload_setting.maxFiles
}}{{ $t('chat.uploadFile.limit') }}
{{ props.applicationDetails.file_upload_setting.fileLimit }}MB<br />{{
$t('chat.uploadFile.fileType')
}}{{ getAcceptList().replace(/\./g, '').replace(/,/g, '、').toUpperCase() }}
</div>
</template>
<el-button text :disabled="checkMaxFilesLimit()" class="mt-4">
@ -186,14 +187,11 @@ import bus from '@/bus'
import 'recorder-core/src/engine/mp3'
import 'recorder-core/src/engine/mp3-engine'
import { MsgWarning } from '@/utils/message'
import useStore from '@/stores'
import { t } from '@/locales'
const router = useRouter()
const route = useRoute()
const { application } = useStore()
const {
query: { mode, question },
params: { accessToken }
} = route as any
const quickInputRef = ref()
const props = withDefaults(
@ -257,7 +255,7 @@ const getAcceptList = () => {
}
if (accepts.length === 0) {
return '.请在文件上传配置中选择文件类型'
return `.${t('chat.uploadFile.tipMessage')}`
}
return accepts.map((ext: any) => '.' + ext).join(',')
}
@ -281,13 +279,13 @@ const uploadFile = async (file: any, fileList: any) => {
uploadAudioList.value.length +
uploadVideoList.value.length
if (file_limit_once >= maxFiles) {
MsgWarning('最多上传' + maxFiles + '个文件')
MsgWarning(t('chat.uploadFile.limitMessage1') + maxFiles + t('chat.uploadFile.limitMessage2'))
fileList.splice(0, fileList.length)
return
}
if (fileList.filter((f: any) => f.size > fileLimit * 1024 * 1024).length > 0) {
// MB
MsgWarning('单个文件大小不能超过' + fileLimit + 'MB')
MsgWarning(t('chat.uploadFile.sizeLimit') + fileLimit + 'MB')
fileList.splice(0, fileList.length)
return
}
@ -356,7 +354,7 @@ const uploadFile = async (file: any, fileList: any) => {
}
})
if (!inputValue.value && uploadImageList.value.length > 0) {
inputValue.value = '请解析图片内容'
inputValue.value = t('chat.uploadFile.imageMessage')
}
})
}
@ -397,14 +395,10 @@ const startRecording = async () => {
(err: any) => {
MsgAlert(
t('common.tip'),
`<p>该功能需要使用麦克风,浏览器禁止不安全页面录音,解决方案如下:<br/>
1可开启 https 解决<br/>
2若无 https 配置则需要修改浏览器安全配置Chrome 设置如下<br/>
(1) 地址栏输入chrome://flags/#unsafely-treat-insecure-origin-as-secure<br/>
(2) http 站点配置在文本框中例如: http://127.0.0.1:8080</p>
`${t('chat.tip.recorderTip')}
<img src="${new URL(`@/assets/tipIMG.jpg`, import.meta.url).href}" style="width: 100%;" />`,
{
confirmButtonText: '我知道了',
confirmButtonText: t('chat.tip.confirm'),
dangerouslyUseHTMLString: true,
customClass: 'record-tip-confirm'
}
@ -414,14 +408,10 @@ const startRecording = async () => {
} catch (error) {
MsgAlert(
t('common.tip'),
`<p>该功能需要使用麦克风,浏览器禁止不安全页面录音,解决方案如下:<br/>
1可开启 https 解决<br/>
2若无 https 配置则需要修改浏览器安全配置Chrome 设置如下<br/>
(1) 地址栏输入chrome://flags/#unsafely-treat-insecure-origin-as-secure<br/>
(2) http 站点配置在文本框中例如: http://127.0.0.1:8080</p>
`${t('chat.tip.recorderTip')}
<img src="${new URL(`@/assets/tipIMG.jpg`, import.meta.url).href}" style="width: 100%;" />`,
{
confirmButtonText: '我知道了',
confirmButtonText: t('chat.tip.confirm'),
dangerouslyUseHTMLString: true,
customClass: 'record-tip-confirm'
}
@ -445,7 +435,7 @@ const stopRecording = () => {
uploadRecording(blob) //
},
(err: any) => {
console.error('录音失败:', err)
console.error(`${t('chat.tip.recorderError')}:`, err)
}
)
}
@ -472,7 +462,7 @@ const uploadRecording = async (audioBlob: Blob) => {
})
} catch (error) {
recorderLoading.value = false
console.error('上传失败:', error)
console.error(`${t('chat.uploadFile.errorMessage')}:`, error)
}
}
const handleTimeChange = () => {

View File

@ -56,7 +56,7 @@ const menus = ref([
}
},
{
label: '引用',
label: t('chat.quote'),
icon: 'app-quote',
click: () => {
bus.emit('chat-input', getSelection())

View File

@ -7,12 +7,12 @@
<div>
<!-- 语音播放 -->
<span v-if="tts">
<el-tooltip effect="dark" content="点击播放" placement="top" v-if="!audioPlayerStatus">
<el-tooltip effect="dark" :content="$t('chat.operation.play')" placement="top" v-if="!audioPlayerStatus">
<el-button text :disabled="!data?.write_ed" @click="playAnswerText(data?.answer_text)">
<AppIcon iconName="app-video-play"></AppIcon>
</el-button>
</el-tooltip>
<el-tooltip v-else effect="dark" content="停止" placement="top">
<el-tooltip v-else effect="dark" :content="$t('chat.operation.pause')" placement="top">
<el-button type="primary" text :disabled="!data?.write_ed" @click="pausePlayAnswerText()">
<AppIcon iconName="app-video-pause"></AppIcon>
</el-button>
@ -20,13 +20,13 @@
<el-divider direction="vertical" />
</span>
<span v-if="type == 'ai-chat' || type == 'log'">
<el-tooltip effect="dark" content="换个答案" placement="top">
<el-tooltip effect="dark" :content="$t('chat.operation.regeneration')" placement="top">
<el-button :disabled="chat_loading" text @click="regeneration">
<el-icon><RefreshRight /></el-icon>
</el-button>
</el-tooltip>
<el-divider direction="vertical" />
<el-tooltip effect="dark" content="复制" placement="top">
<el-tooltip effect="dark" :content="$t('common.copy')" placement="top">
<el-button text @click="copyClick(data?.answer_text)">
<AppIcon iconName="app-copy"></AppIcon>
</el-button>
@ -34,7 +34,7 @@
<el-divider direction="vertical" />
<el-tooltip
effect="dark"
content="赞同"
:content="$t('chat.operation.like')"
placement="top"
v-if="buttonData?.vote_status === '-1'"
>
@ -44,7 +44,7 @@
</el-tooltip>
<el-tooltip
effect="dark"
content="取消赞同"
:content="$t('chat.operation.cancelLike')"
placement="top"
v-if="buttonData?.vote_status === '0'"
>
@ -55,7 +55,7 @@
<el-divider direction="vertical" v-if="buttonData?.vote_status === '-1'" />
<el-tooltip
effect="dark"
content="反对"
:content="$t('chat.operation.oppose')"
placement="top"
v-if="buttonData?.vote_status === '-1'"
>
@ -65,7 +65,7 @@
</el-tooltip>
<el-tooltip
effect="dark"
content="取消反对"
:content="$t('chat.operation.cancelOppose')"
placement="top"
v-if="buttonData?.vote_status === '1'"
>
@ -85,7 +85,7 @@ import { copyClick } from '@/utils/clipboard'
import applicationApi from '@/api/application'
import { datetimeFormat } from '@/utils/time'
import { MsgError } from '@/utils/message'
import { t } from '@/locales'
const route = useRoute()
const {
params: { id }
@ -164,7 +164,7 @@ function removeFormRander(text: string) {
const playAnswerText = (text: string) => {
if (!text) {
text = '抱歉,没有查找到相关内容,请重新描述您的问题或提供更多信息。'
text = t('chat.tip.answerMessage')
}
//
text = removeFormRander(text)

View File

@ -8,19 +8,19 @@
<div>
<!-- 语音播放 -->
<span v-if="tts">
<el-tooltip effect="dark" content="点击播放" placement="top" v-if="!audioPlayerStatus">
<el-tooltip effect="dark" :content="$t('chat.operation.play')" placement="top" v-if="!audioPlayerStatus">
<el-button text @click="playAnswerText(data?.answer_text)">
<AppIcon iconName="app-video-play"></AppIcon>
</el-button>
</el-tooltip>
<el-tooltip v-else effect="dark" content="停止" placement="top">
<el-tooltip v-else effect="dark" :content="$t('chat.operation.pause')" placement="top">
<el-button type="primary" text @click="pausePlayAnswerText()">
<AppIcon iconName="app-video-pause"></AppIcon>
</el-button>
</el-tooltip>
<el-divider direction="vertical" />
</span>
<el-tooltip effect="dark" content="复制" placement="top">
<el-tooltip effect="dark" :content="$t('common.copy')" placement="top">
<el-button text @click="copyClick(data?.answer_text)">
<AppIcon iconName="app-copy"></AppIcon>
</el-button>
@ -29,7 +29,7 @@
<el-tooltip
v-if="buttonData.improve_paragraph_id_list.length === 0"
effect="dark"
content="修改内容"
:content="$t('views.log.editContent')"
placement="top"
>
<el-button text @click="editContent(data)">
@ -37,7 +37,7 @@
</el-button>
</el-tooltip>
<el-tooltip v-else effect="dark" content="修改标注" placement="top">
<el-tooltip v-else effect="dark" :content="$t('views.log.editMark')" placement="top">
<el-button text @click="editMark(data)">
<AppIcon iconName="app-document-active" class="primary"></AppIcon>
</el-button>
@ -67,7 +67,7 @@ import { datetimeFormat } from '@/utils/time'
import applicationApi from '@/api/application'
import { useRoute } from 'vue-router'
import { MsgError } from '@/utils/message'
import { t } from '@/locales'
const route = useRoute()
const {
params: { id }
@ -143,7 +143,7 @@ function removeFormRander(text: string) {
const playAnswerText = (text: string) => {
if (!text) {
text = '抱歉,没有查找到相关内容,请重新描述您的问题或提供更多信息。'
text = t('chat.tip.answerMessage')
}
//
text = removeFormRander(text)

View File

@ -17,14 +17,14 @@
v-if="chatRecord.is_stop && !chatRecord.write_ed"
@click="startChat(chatRecord)"
link
>继续
>{{ $t('chat.operation.continue') }}
</el-button>
<el-button
type="primary"
v-else-if="!chatRecord.write_ed"
@click="stopChat(chatRecord)"
link
>停止回答
>{{ $t('chat.operation.stopChat') }}
</el-button>
</div>
</div>

View File

@ -16,6 +16,7 @@
import { type chatType } from '@/api/type/application'
import { computed } from 'vue'
import MdRenderer from '@/components/markdown/MdRenderer.vue'
import { t } from '@/locales'
const props = defineProps<{
application: any
available: boolean
@ -28,7 +29,7 @@ const toQuickQuestion = (match: string, offset: number, input: string) => {
const prologue = computed(() => {
const temp = props.available
? props.application?.prologue
: '抱歉,当前正在维护,无法提供服务,请稍后再试!'
: t('chat.tip.prologueMessage')
return temp?.replace(/-\s.+/g, toQuickQuestion)
})
</script>

View File

@ -23,7 +23,7 @@
<el-icon class="mr-4">
<Download />
</el-icon>
点击下载文件
{{ $t('chat.download') }}
</div>
<div class="show flex align-center">
<img :src="getImgUrl(item && item?.name)" alt="" width="24" />

View File

@ -8,15 +8,19 @@
style="padding: 0 24px"
>
<el-card shadow="always" class="dialog-card" style="--el-card-padding: 16px 8px">
<div class="flex align-center cursor w-full" style="padding: 0 8px;" @click="showUserInput = !showUserInput">
<div
class="flex align-center cursor w-full"
style="padding: 0 8px"
@click="showUserInput = !showUserInput"
>
<el-icon class="mr-8 arrow-icon" :class="showUserInput ? 'rotate-90' : ''"
><CaretRight
/></el-icon>
用户输入
{{ $t('chat.userInput') }}
</div>
<el-scrollbar max-height="160">
<el-collapse-transition>
<div v-show="showUserInput" class="mt-16" style="padding: 0 8px;">
<div v-show="showUserInput" class="mt-16" style="padding: 0 8px">
<DynamicsForm
:key="dynamicsFormRefresh"
v-model="form_data_context"
@ -47,6 +51,7 @@ import DynamicsForm from '@/components/dynamics-form/index.vue'
import type { FormField } from '@/components/dynamics-form/type'
import { useRoute } from 'vue-router'
import { MsgWarning } from '@/utils/message'
import { t } from '@/locales'
const route = useRoute()
const props = defineProps<{
application: any
@ -267,7 +272,7 @@ const checkInputParam = () => {
inputFieldList.value[i].required &&
!form_data_context.value[inputFieldList.value[i].field]
) {
MsgWarning('请填写所有必填字段')
MsgWarning(t('chat.tip.requiredMessage'))
return false
}
}
@ -282,7 +287,7 @@ const checkInputParam = () => {
}
}
if (msg.length > 0) {
MsgWarning(`请在URL中填写参数 ${msg.join('、')}的值`)
MsgWarning(`${t('chat.tip.inputParamMessage1')} ${msg.join('、')}${t('chat.tip.inputParamMessage2')}`)
return false
}
return true

View File

@ -271,7 +271,7 @@ const getWrite = (chat: any, reader: any, stream: boolean) => {
const errorWrite = (chat: any, message?: string) => {
ChatManagement.addChatRecord(chat, 50, loading)
ChatManagement.write(chat.id)
ChatManagement.append(chat.id, message || t('components.chat.tip.error500Message'))
ChatManagement.append(chat.id, message || t('chat.tip.error500Message'))
ChatManagement.updateStatus(chat.id, 500)
ChatManagement.close(chat.id)
}
@ -344,9 +344,9 @@ function chatMessage(chat?: any, problem?: string, re_chat?: boolean, other_para
errorWrite(chat)
})
} else if (response.status === 460) {
return Promise.reject(t('components.chat.tip.errorIdentifyMessage'))
return Promise.reject(t('chat.tip.errorIdentifyMessage'))
} else if (response.status === 461) {
return Promise.reject('components.chat.tip.errorLimitMessage')
return Promise.reject('chat.tip.errorLimitMessage')
} else {
nextTick(() => {
//

View File

@ -103,7 +103,7 @@ function submitHandle() {
loading.value = false
}, 200)
} else {
MsgError(`${props.quickCreateName}${t('components.dynamicsForm.tip.requiredMessage')}`)
MsgError(`${props.quickCreateName}${t('dynamicsForm.tip.requiredMessage')}`)
}
}

View File

@ -105,8 +105,8 @@ const errMsg = computed(() => {
return props_info.value.err_msg
? props_info.value.err_msg
: isString(props.formfield.label)
? props.formfield.label + t('components.dynamicsForm.tip.requiredMessage')
: props.formfield.label.label + t('components.dynamicsForm.tip.requiredMessage')
? props.formfield.label + t('dynamicsForm.tip.requiredMessage')
: props.formfield.label.label + t('dynamicsForm.tip.requiredMessage')
})
/**
* 反序列化

View File

@ -1,39 +1,39 @@
import { t } from '@/locales'
const input_type_list = [
{
label: t('components.dynamicsForm.input_type_list.TextInput'),
label: t('dynamicsForm.input_type_list.TextInput'),
value: 'TextInput'
},
{
label: t('components.dynamicsForm.input_type_list.Slider'),
label: t('dynamicsForm.input_type_list.Slider'),
value: 'Slider'
},
{
label: t('components.dynamicsForm.input_type_list.SwitchInput'),
label: t('dynamicsForm.input_type_list.SwitchInput'),
value: 'SwitchInput'
},
{
label: t('components.dynamicsForm.input_type_list.SingleSelect'),
label: t('dynamicsForm.input_type_list.SingleSelect'),
value: 'SingleSelect'
},
{
label: t('components.dynamicsForm.input_type_list.MultiSelect'),
label: t('dynamicsForm.input_type_list.MultiSelect'),
value: 'MultiSelect'
},
{
label: t('components.dynamicsForm.input_type_list.DatePicker'),
label: t('dynamicsForm.input_type_list.DatePicker'),
value: 'DatePicker'
},
{
label: t('components.dynamicsForm.input_type_list.JsonInput'),
label: t('dynamicsForm.input_type_list.JsonInput'),
value: 'JsonInput'
},
{
label: t('components.dynamicsForm.input_type_list.RadioCard'),
label: t('dynamicsForm.input_type_list.RadioCard'),
value: 'RadioCard'
},
{
label: t('components.dynamicsForm.input_type_list.RadioRow'),
label: t('dynamicsForm.input_type_list.RadioRow'),
value: 'RadioRow'
}
]

View File

@ -7,35 +7,35 @@
:model="form_data"
v-bind="$attrs"
>
<el-form-item :label="$t('components.dynamicsForm.paramForm.field.label')" :required="true" prop="field" :rules="rules.field">
<el-form-item :label="$t('dynamicsForm.paramForm.field.label')" :required="true" prop="field" :rules="rules.field">
<el-input
v-model="form_data.field"
:maxlength="64"
:placeholder="$t('components.dynamicsForm.paramForm.field.placeholder')"
:placeholder="$t('dynamicsForm.paramForm.field.placeholder')"
show-word-limit
/>
</el-form-item>
<el-form-item :label="$t('components.dynamicsForm.paramForm.name.label')" :required="true" prop="label" :rules="rules.label">
<el-form-item :label="$t('dynamicsForm.paramForm.name.label')" :required="true" prop="label" :rules="rules.label">
<el-input
v-model="form_data.label"
:maxlength="64"
show-word-limit
:placeholder="$t('components.dynamicsForm.paramForm.name.placeholder')"
:placeholder="$t('dynamicsForm.paramForm.name.placeholder')"
/>
</el-form-item>
<el-form-item :label="$t('components.dynamicsForm.paramForm.tooltip.label')">
<el-form-item :label="$t('dynamicsForm.paramForm.tooltip.label')">
<el-input
v-model="form_data.tooltip"
:maxlength="128"
show-word-limit
:placeholder="$t('components.dynamicsForm.paramForm.tooltip.placeholder')"
:placeholder="$t('dynamicsForm.paramForm.tooltip.placeholder')"
/>
</el-form-item>
<el-form-item :label="$t('components.dynamicsForm.paramForm.required.label')" :required="true" prop="required" :rules="rules.required">
<el-form-item :label="$t('dynamicsForm.paramForm.required.label')" :required="true" prop="required" :rules="rules.required">
<el-switch v-model="form_data.required" :active-value="true" :inactive-value="false" />
</el-form-item>
<el-form-item :label="$t('components.dynamicsForm.paramForm.input_type.label')" :required="true" prop="input_type" :rules="rules.input_type">
<el-select v-model="form_data.input_type" :placeholder="$t('components.dynamicsForm.paramForm.input_type.placeholder')">
<el-form-item :label="$t('dynamicsForm.paramForm.input_type.label')" :required="true" prop="input_type" :rules="rules.input_type">
<el-select v-model="form_data.input_type" :placeholder="$t('dynamicsForm.paramForm.input_type.placeholder')">
<el-option
v-for="input_type in input_type_list"
:key="input_type.value"
@ -81,10 +81,10 @@ const form_data = ref<any>({
input_type: ''
})
const rules = {
label: [{ required: true, message: t('components.dynamicsForm.paramForm.name.requiredMessage') }],
field: [{ required: true, message: t('components.dynamicsForm.paramForm.field.requiredMessage') }],
required: [{ required: true, message: t('components.dynamicsForm.paramForm.required.requiredMessage') }],
input_type: [{ required: true, message: t('components.dynamicsForm.paramForm.input_type.requiredMessage') }]
label: [{ required: true, message: t('dynamicsForm.paramForm.name.requiredMessage') }],
field: [{ required: true, message: t('dynamicsForm.paramForm.field.requiredMessage') }],
required: [{ required: true, message: t('dynamicsForm.paramForm.required.requiredMessage') }],
input_type: [{ required: true, message: t('dynamicsForm.paramForm.input_type.requiredMessage') }]
}
const getData = () => {
let label: string | any = form_data.value.label

View File

@ -1,9 +1,9 @@
<template>
<el-form-item :label="$t('components.dynamicsForm.DatePicker.dataType.label')" required>
<el-form-item :label="$t('dynamicsForm.DatePicker.dataType.label')" required>
<el-select
@change="type_change"
v-model="formValue.type"
:placeholder="$t('components.dynamicsForm.DatePicker.dataType.placeholder')"
:placeholder="$t('dynamicsForm.DatePicker.dataType.placeholder')"
>
<el-option
v-for="input_type in type_list"
@ -13,13 +13,13 @@
/>
</el-select>
</el-form-item>
<el-form-item :label="$t('components.dynamicsForm.DatePicker.format.label')" required>
<el-form-item :label="$t('dynamicsForm.DatePicker.format.label')" required>
<el-select
v-model="formValue.format"
filterable
default-first-option
allow-create
:placeholder="$t('components.dynamicsForm.DatePicker.format.placeholder')"
:placeholder="$t('dynamicsForm.DatePicker.format.placeholder')"
>
<el-option
v-for="input_type in type_dict[formValue.type]"
@ -33,23 +33,23 @@
class="defaultValueItem"
:required="formValue.required"
prop="default_value"
:label="$t('components.dynamicsForm.default.label')"
:label="$t('dynamicsForm.default.label')"
:rules="
formValue.required
? [{ required: true, message: `${$t('components.dynamicsForm.default.label')}${$t('components.dynamicsForm.default.requiredMessage')}` }]
? [{ required: true, message: `${$t('dynamicsForm.default.label')}${$t('dynamicsForm.default.requiredMessage')}` }]
: []
"
>
<div class="defaultValueCheckbox">
<el-checkbox
v-model="formValue.show_default_value"
:label="$t('components.dynamicsForm.default.show')"
:label="$t('dynamicsForm.default.show')"
/>
</div>
<el-date-picker
v-model="formValue.default_value"
:type="formValue.type"
:placeholder="$t('components.dynamicsForm.DatePicker.placeholder')"
:placeholder="$t('dynamicsForm.DatePicker.placeholder')"
:format="formValue.format"
:value-format="formValue.format"
/>
@ -60,19 +60,19 @@ import { computed, onBeforeMount } from 'vue'
import { t } from '@/locales'
const type_list = [
{
label: t('components.dynamicsForm.DatePicker.year'),
label: t('dynamicsForm.DatePicker.year'),
value: 'year'
},
{
label: t('components.dynamicsForm.DatePicker.month'),
label: t('dynamicsForm.DatePicker.month'),
value: 'month'
},
{
label: t('components.dynamicsForm.DatePicker.date'),
label: t('dynamicsForm.DatePicker.date'),
value: 'date'
},
{
label: t('components.dynamicsForm.DatePicker.datetime'),
label: t('dynamicsForm.DatePicker.datetime'),
value: 'datetime'
}
]

View File

@ -1,7 +1,7 @@
<template>
<el-form-item
class="defaultValueItem"
:label="$t('components.dynamicsForm.default.label')"
:label="$t('dynamicsForm.default.label')"
:required="formValue.required"
prop="default_value"
:rules="[default_value_rule]"
@ -9,7 +9,7 @@
<div class="defaultValueCheckbox">
<el-checkbox
v-model="formValue.show_default_value"
:label="$t('components.dynamicsForm.default.show')"
:label="$t('dynamicsForm.default.show')"
/>
</div>
<JsonInput ref="jsonInputRef" v-model="formValue.default_value"> </JsonInput>

View File

@ -2,7 +2,7 @@
<el-form-item>
<template #label>
<div class="flex-between">
{{ $t('components.dynamicsForm.Select.label') }}
{{ $t('dynamicsForm.Select.label') }}
<el-button link type="primary" @click.stop="addOption()">
<el-icon class="mr-4">
<Plus />
@ -14,11 +14,11 @@
<el-row style="width: 100%" :gutter="10">
<el-col :span="10">
<div class="grid-content ep-bg-purple" />
{{ $t('components.dynamicsForm.tag.label') }}
{{ $t('dynamicsForm.tag.label') }}
</el-col>
<el-col :span="12"
><div class="grid-content ep-bg-purple" />
{{ $t('components.dynamicsForm.Select.label') }}</el-col
{{ $t('dynamicsForm.Select.label') }}</el-col
>
</el-row>
<el-row
@ -30,13 +30,13 @@
>
<el-col :span="10"
><div class="grid-content ep-bg-purple" />
<el-input v-model="formValue.option_list[$index].label" :placeholder="$t('components.dynamicsForm.tag.placeholder')"
<el-input v-model="formValue.option_list[$index].label" :placeholder="$t('dynamicsForm.tag.placeholder')"
/></el-col>
<el-col :span="12"
><div class="grid-content ep-bg-purple" />
<el-input
v-model="formValue.option_list[$index].value"
:placeholder="$t('components.dynamicsForm.Select.label')"
:placeholder="$t('dynamicsForm.Select.label')"
/></el-col>
<el-col :span="1"
><div class="grid-content ep-bg-purple" />
@ -49,19 +49,19 @@
</el-form-item>
<el-form-item
class="defaultValueItem"
:label="$t('components.dynamicsForm.default.label')"
:label="$t('dynamicsForm.default.label')"
:required="formValue.required"
prop="default_value"
:rules="
formValue.required
? [{ required: true, message: `${$t('components.dynamicsForm.default.label')}${$t('components.dynamicsForm.default.requiredMessage')}` }]
? [{ required: true, message: `${$t('dynamicsForm.default.label')}${$t('dynamicsForm.default.requiredMessage')}` }]
: []
"
>
<div class="defaultValueCheckbox">
<el-checkbox
v-model="formValue.show_default_value"
:label="$t('components.dynamicsForm.default.show')"
:label="$t('dynamicsForm.default.show')"
/>
</div>
<el-select

View File

@ -2,7 +2,7 @@
<el-form-item>
<template #label>
<div class="flex-between">
{{ $t('components.dynamicsForm.Select.label') }}
{{ $t('dynamicsForm.Select.label') }}
<el-button link type="primary" @click.stop="addOption()">
<el-icon class="mr-4">
<Plus />
@ -15,11 +15,11 @@
<el-row style="width: 100%" :gutter="10">
<el-col :span="10">
<div class="grid-content ep-bg-purple" />
{{ $t('components.dynamicsForm.tag.label') }}
{{ $t('dynamicsForm.tag.label') }}
</el-col>
<el-col :span="12"
><div class="grid-content ep-bg-purple" />
{{ $t('components.dynamicsForm.Select.label') }}</el-col
{{ $t('dynamicsForm.Select.label') }}</el-col
>
</el-row>
<el-row
@ -31,13 +31,13 @@
>
<el-col :span="10"
><div class="grid-content ep-bg-purple" />
<el-input v-model="formValue.option_list[$index].label" :placeholder="$t('components.dynamicsForm.tag.placeholder')"
<el-input v-model="formValue.option_list[$index].label" :placeholder="$t('dynamicsForm.tag.placeholder')"
/></el-col>
<el-col :span="12"
><div class="grid-content ep-bg-purple" />
<el-input
v-model="formValue.option_list[$index].value"
:placeholder="$t('components.dynamicsForm.Select.label')"
:placeholder="$t('dynamicsForm.Select.label')"
/></el-col>
<el-col :span="1"
><div class="grid-content ep-bg-purple" />
@ -50,19 +50,19 @@
</el-form-item>
<el-form-item
class="defaultValueItem"
:label="$t('components.dynamicsForm.default.label')"
:label="$t('dynamicsForm.default.label')"
:required="formValue.required"
prop="default_value"
:rules="
formValue.required
? [{ required: true, message: `${$t('components.dynamicsForm.default.label')}${$t('components.dynamicsForm.default.requiredMessage')}` }]
? [{ required: true, message: `${$t('dynamicsForm.default.label')}${$t('dynamicsForm.default.requiredMessage')}` }]
: []
"
>
<div class="defaultValueCheckbox">
<el-checkbox
v-model="formValue.show_default_value"
:label="$t('components.dynamicsForm.default.show')"
:label="$t('dynamicsForm.default.show')"
/>
</div>
<RadioCard

View File

@ -2,7 +2,7 @@
<el-form-item>
<template #label>
<div class="flex-between">
{{ $t('components.dynamicsForm.Select.label') }}
{{ $t('dynamicsForm.Select.label') }}
<el-button link type="primary" @click.stop="addOption()">
<el-icon class="mr-4">
<Plus />
@ -15,11 +15,11 @@
<el-row style="width: 100%" :gutter="10">
<el-col :span="10">
<div class="grid-content ep-bg-purple" />
{{ $t('components.dynamicsForm.tag.label') }}
{{ $t('dynamicsForm.tag.label') }}
</el-col>
<el-col :span="12">
<div class="grid-content ep-bg-purple" />
{{ $t('components.dynamicsForm.Select.label') }}
{{ $t('dynamicsForm.Select.label') }}
</el-col>
</el-row>
<el-row
@ -33,13 +33,13 @@
><div class="grid-content ep-bg-purple" />
<el-input
v-model="formValue.option_list[$index].label"
:placeholder="$t('components.dynamicsForm.tag.placeholder')"
:placeholder="$t('dynamicsForm.tag.placeholder')"
/></el-col>
<el-col :span="12"
><div class="grid-content ep-bg-purple" />
<el-input
v-model="formValue.option_list[$index].value"
:placeholder="$t('components.dynamicsForm.Select.label')"
:placeholder="$t('dynamicsForm.Select.label')"
/></el-col>
<el-col :span="1"
><div class="grid-content ep-bg-purple" />
@ -52,19 +52,19 @@
</el-form-item>
<el-form-item
class="defaultValueItem"
:label="$t('components.dynamicsForm.default.label')"
:label="$t('dynamicsForm.default.label')"
:required="formValue.required"
prop="default_value"
:rules="
formValue.required
? [{ required: true, message:`${$t('components.dynamicsForm.default.label')}${$t('components.dynamicsForm.default.requiredMessage')}` }]
? [{ required: true, message:`${$t('dynamicsForm.default.label')}${$t('dynamicsForm.default.requiredMessage')}` }]
: []
"
>
<div class="defaultValueCheckbox">
<el-checkbox
v-model="formValue.show_default_value"
:label="$t('components.dynamicsForm.default.show')"
:label="$t('dynamicsForm.default.show')"
/>
</div>
<RadioRow

View File

@ -2,7 +2,7 @@
<el-form-item>
<template #label>
<div class="flex-between">
{{ $t('components.dynamicsForm.Select.label') }}
{{ $t('dynamicsForm.Select.label') }}
<el-button link type="primary" @click.stop="addOption()">
<el-icon class="mr-4">
<Plus />
@ -15,11 +15,11 @@
<el-row style="width: 100%" :gutter="10">
<el-col :span="10"
><div class="grid-content ep-bg-purple" />
{{ $t('components.dynamicsForm.tag.label') }}</el-col
{{ $t('dynamicsForm.tag.label') }}</el-col
>
<el-col :span="12">
<div class="grid-content ep-bg-purple" />
{{ $t('components.dynamicsForm.Select.label') }}
{{ $t('dynamicsForm.Select.label') }}
</el-col>
</el-row>
<el-row
@ -31,13 +31,13 @@
>
<el-col :span="10"
><div class="grid-content ep-bg-purple" />
<el-input v-model="formValue.option_list[$index].label" :placeholder="$t('components.dynamicsForm.tag.placeholder')"
<el-input v-model="formValue.option_list[$index].label" :placeholder="$t('dynamicsForm.tag.placeholder')"
/></el-col>
<el-col :span="12"
><div class="grid-content ep-bg-purple" />
<el-input
v-model="formValue.option_list[$index].value"
:placeholder="$t('components.dynamicsForm.Select.label')"
:placeholder="$t('dynamicsForm.Select.label')"
/></el-col>
<el-col :span="1"
><div class="grid-content ep-bg-purple" />
@ -52,17 +52,17 @@
class="defaultValueItem"
:required="formValue.required"
prop="default_value"
:label="$t('components.dynamicsForm.default.label')"
:label="$t('dynamicsForm.default.label')"
:rules="
formValue.required
? [{ required: true, message: `${$t('components.dynamicsForm.default.label')}${$t('components.dynamicsForm.default.requiredMessage')}` }]
? [{ required: true, message: `${$t('dynamicsForm.default.label')}${$t('dynamicsForm.default.requiredMessage')}` }]
: []
"
>
<div class="defaultValueCheckbox">
<el-checkbox
v-model="formValue.show_default_value"
:label="$t('components.dynamicsForm.default.show')"
:label="$t('dynamicsForm.default.show')"
/>
</div>

View File

@ -1,14 +1,14 @@
<template>
<el-form-item :label="$t('components.dynamicsForm.Slider.showInput.label')" required prop="showInput">
<el-form-item :label="$t('dynamicsForm.Slider.showInput.label')" required prop="showInput">
<el-switch v-model="formValue.showInput" />
</el-form-item>
<el-form-item :label="$t('components.dynamicsForm.Slider.valueRange.label')" required>
<el-form-item :label="$t('dynamicsForm.Slider.valueRange.label')" required>
<el-col :span="11" style="padding-left: 0">
<el-form-item
:rules="[
{
required: true,
message: $t('components.dynamicsForm.Slider.valueRange.minRequired'),
message: $t('dynamicsForm.Slider.valueRange.minRequired'),
trigger: 'change'
}
]"
@ -25,7 +25,7 @@
:rules="[
{
required: true,
message: $t('components.dynamicsForm.Slider.valueRange.maxRequired'),
message: $t('dynamicsForm.Slider.valueRange.maxRequired'),
trigger: 'change'
}
]"
@ -40,7 +40,7 @@
</el-col>
</el-form-item>
<el-col :span="11" style="padding-left: 0">
<el-form-item :label="$t('components.dynamicsForm.Slider.step.label')" required prop="step" :rules="step_rules">
<el-form-item :label="$t('dynamicsForm.Slider.step.label')" required prop="step" :rules="step_rules">
<el-input-number
style="width: 100%"
v-model="formValue.step"
@ -51,12 +51,12 @@
</el-col>
<el-form-item
:label="$t('components.dynamicsForm.default.label')"
:label="$t('dynamicsForm.default.label')"
:required="formValue.required"
prop="default_value"
:rules="
formValue.required
? [{ required: true, message: $t('components.dynamicsForm.default.requiredMessage') }]
? [{ required: true, message: $t('dynamicsForm.default.requiredMessage') }]
: []
"
>
@ -101,7 +101,7 @@ const getData = () => {
props_info: {
rules: [
{
message: formValue.value.label + t('components.dynamicsForm.tip.requiredMessage'),
message: formValue.value.label + t('dynamicsForm.tip.requiredMessage'),
trigger: 'blur',
required: formValue.value.required
}
@ -133,11 +133,11 @@ const step_rules = [
required: true,
validator: (rule: any, value: any, callback: any) => {
if (!value) {
callback(new Error(t('components.dynamicsForm.Slider.step.requiredMessage1')))
callback(new Error(t('dynamicsForm.Slider.step.requiredMessage1')))
return false
}
if (value === 0) {
callback(new Error(t('components.dynamicsForm.Slider.step.requiredMessage2')))
callback(new Error(t('dynamicsForm.Slider.step.requiredMessage2')))
return false
}
return true

View File

@ -1,11 +1,11 @@
<template>
<el-form-item
:label="$t('components.dynamicsForm.default.label')"
:label="$t('dynamicsForm.default.label')"
:required="formValue.required"
prop="default_value"
:rules="
formValue.required
? [{ required: true, message: `${$t('components.dynamicsForm.default.label')}${$t('components.dynamicsForm.default.requiredMessage')}` }]
? [{ required: true, message: `${$t('dynamicsForm.default.label')}${$t('dynamicsForm.default.requiredMessage')}` }]
: []
"
>

View File

@ -1,12 +1,12 @@
<template>
<el-form-item :label="$t('components.dynamicsForm.TextInput.length.label')" required>
<el-form-item :label="$t('dynamicsForm.TextInput.length.label')" required>
<el-row class="w-full">
<el-col :span="11">
<el-form-item
:rules="[
{
required: true,
message: $t('components.dynamicsForm.TextInput.length.minRequired'),
message: $t('dynamicsForm.TextInput.length.minRequired'),
trigger: 'change'
}
]"
@ -30,7 +30,7 @@
:rules="[
{
required: true,
message: $t('components.dynamicsForm.TextInput.length.maxRequired'),
message: $t('dynamicsForm.TextInput.length.maxRequired'),
trigger: 'change'
}
]"
@ -52,15 +52,15 @@
class="defaultValueItem"
:required="formValue.required"
prop="default_value"
:label="$t('components.dynamicsForm.default.label')"
:label="$t('dynamicsForm.default.label')"
:rules="
formValue.required ? [{ required: true, message: `${$t('components.dynamicsForm.default.label')}${$t('components.dynamicsForm.default.requiredMessage')}` }, ...rules] : rules
formValue.required ? [{ required: true, message: `${$t('dynamicsForm.default.label')}${$t('dynamicsForm.default.requiredMessage')}` }, ...rules] : rules
"
>
<div class="defaultValueCheckbox">
<el-checkbox
v-model="formValue.show_default_value"
:label="$t('components.dynamicsForm.default.show')"
:label="$t('dynamicsForm.default.show')"
/>
</div>
@ -68,7 +68,7 @@
v-model="formValue.default_value"
:maxlength="formValue.maxlength"
:minlength="formValue.minlength"
:placeholder="$t('components.dynamicsForm.paramForm.default.placeholder')"
:placeholder="$t('dynamicsForm.paramForm.default.placeholder')"
show-word-limit
type="text"
/>
@ -110,11 +110,11 @@ const getData = () => {
props_info: {
rules: formValue.value.required
? [
{ required: true, message: `${formValue.value.label} ${t('components.dynamicsForm.default.requiredMessage')}` },
{ required: true, message: `${formValue.value.label} ${t('dynamicsForm.default.requiredMessage')}` },
{
min: formValue.value.minlength,
max: formValue.value.maxlength,
message: `${formValue.value.label}${t('components.dynamicsForm.TextInput.length.requiredMessage1')} ${formValue.value.minlength} ${t('components.dynamicsForm.TextInput.length.requiredMessage2')} ${formValue.value.maxlength} ${t('components.dynamicsForm.TextInput.length.requiredMessage3')}`,
message: `${formValue.value.label}${t('dynamicsForm.TextInput.length.requiredMessage1')} ${formValue.value.minlength} ${t('dynamicsForm.TextInput.length.requiredMessage2')} ${formValue.value.maxlength} ${t('dynamicsForm.TextInput.length.requiredMessage3')}`,
trigger: 'blur'
}
]
@ -122,7 +122,7 @@ const getData = () => {
{
min: formValue.value.minlength,
max: formValue.value.maxlength,
message: `${formValue.value.label}${t('components.dynamicsForm.TextInput.length.requiredMessage1')} ${formValue.value.minlength} ${t('components.dynamicsForm.TextInput.length.requiredMessage2')} ${formValue.value.maxlength} ${t('components.dynamicsForm.TextInput.length.requiredMessage3')}`,
message: `${formValue.value.label}${t('dynamicsForm.TextInput.length.requiredMessage1')} ${formValue.value.minlength} ${t('dynamicsForm.TextInput.length.requiredMessage2')} ${formValue.value.maxlength} ${t('dynamicsForm.TextInput.length.requiredMessage3')}`,
trigger: 'blur'
}
]
@ -141,21 +141,21 @@ const rangeRules = [
required: true,
validator: (rule: any, value: any, callback: any) => {
if (!formValue.value.minlength) {
callback(new Error(t('components.dynamicsForm.TextInput.length.requiredMessage4')))
callback(new Error(t('dynamicsForm.TextInput.length.requiredMessage4')))
}
if (!formValue.value.maxlength) {
callback(new Error(t('components.dynamicsForm.TextInput.length.requiredMessage4')))
callback(new Error(t('dynamicsForm.TextInput.length.requiredMessage4')))
}
return true
},
message: `${formValue.value.label} ${t('components.dynamicsForm.default.requiredMessage')}`
message: `${formValue.value.label} ${t('dynamicsForm.default.requiredMessage')}`
}
]
const rules = computed(() => [
{
min: formValue.value.minlength,
max: formValue.value.maxlength,
message: `${t('components.dynamicsForm.TextInput.length.requiredMessage1')} ${formValue.value.minlength} ${t('components.dynamicsForm.TextInput.length.requiredMessage2')} ${formValue.value.maxlength} ${t('components.dynamicsForm.TextInput.length.requiredMessage3')}`,
message: `${t('dynamicsForm.TextInput.length.requiredMessage1')} ${formValue.value.minlength} ${t('dynamicsForm.TextInput.length.requiredMessage2')} ${formValue.value.maxlength} ${t('dynamicsForm.TextInput.length.requiredMessage3')}`,
trigger: 'blur'
}
])

View File

@ -117,7 +117,7 @@ const validate_rules = (rule: any, value: any, callback: any) => {
try {
JSON.parse(model_value.value)
} catch (e) {
callback(new Error(t('components.dynamicsForm.tip.requiredMessage')))
callback(new Error(t('dynamicsForm.tip.requiredMessage')))
return false
}
}

View File

@ -6,7 +6,7 @@
<el-input
v-model="filterText"
:validate-event="false"
:placeholder="$t('components.dynamicsForm.searchBar.placeholder')"
:placeholder="$t('dynamicsForm.searchBar.placeholder')"
class="input-with-select"
style="--el-color-danger: #c0c4cc"
clearable

View File

@ -6,7 +6,7 @@
<el-input
v-model="filterText"
:validate-event="false"
:placeholder="$t('components.dynamicsForm.searchBar.placeholder')"
:placeholder="$t('dynamicsForm.searchBar.placeholder')"
class="input-with-select"
style="--el-color-danger: #c0c4cc"
clearable

View File

@ -66,7 +66,7 @@ const querySearchAsync = (queryString: string, cb: (arg: any) => void) => {
UserApi.getUserList(queryString).then((res) => {
if (res.data.length === 0) {
noData.value = true
matchResults = [{ default: t('components.noData') }]
matchResults = [{ default: t('common.noData') }]
} else {
noData.value = false
matchResults = res.data

View File

@ -11,13 +11,13 @@
:model="resetPasswordForm"
:rules="rules1"
>
<p class="mb-8 lighter">{{ $t('layout.avatar.dialog.newPassword') }}</p>
<p class="mb-8 lighter">{{ $t('views.login.newPassword') }}</p>
<el-form-item prop="password" style="margin-bottom: 8px">
<el-input
type="password"
class="input-item"
v-model="resetPasswordForm.password"
:placeholder="$t('layout.avatar.dialog.enterPassword')"
:placeholder="$t('views.login.enterPassword')"
show-password
>
</el-input>
@ -27,7 +27,7 @@
type="password"
class="input-item"
v-model="resetPasswordForm.re_password"
:placeholder="$t('layout.avatar.dialog.confirmPassword')"
:placeholder="$t('views.user.userForm.form.re_password.label')"
show-password
>
</el-input>
@ -39,13 +39,13 @@
:model="resetPasswordForm"
:rules="rules2"
>
<p class="mb-8 lighter">{{ $t('layout.avatar.dialog.useEmail') }}</p>
<p class="mb-8 lighter">{{ $t('views.login.useEmail') }}</p>
<el-form-item style="margin-bottom: 8px">
<el-input
class="input-item"
:disabled="true"
v-bind:modelValue="user.userInfo?.email"
:placeholder="$t('layout.avatar.dialog.enterEmail')"
:placeholder="t('views.user.userForm.form.email.placeholder')"
>
</el-input>
</el-form-item>
@ -54,7 +54,7 @@
<el-input
class="code-input"
v-model="resetPasswordForm.code"
:placeholder="$t('layout.avatar.dialog.enterVerificationCode')"
:placeholder="$t('views.login.verificationCode.placeholder')"
>
</el-input>
<el-button
@ -65,8 +65,8 @@
>
{{
isDisabled
? $t('layout.avatar.dialog.resend', { time })
: $t('layout.avatar.dialog.getVerificationCode')
? `${$t('views.login.verificationCode.resend')}${time}s`
: $t('views.login.verificationCode.getVerificationCode')
}}
</el-button>
</div>
@ -74,9 +74,7 @@
</el-form>
<template #footer>
<div class="dialog-footer">
<el-button @click="resetPasswordDialog = false">{{
$t('common.cancel')
}}</el-button>
<el-button @click="resetPasswordDialog = false">{{ $t('common.cancel') }}</el-button>
<el-button type="primary" @click="resetPassword">
{{ $t('common.save') }}
</el-button>
@ -115,32 +113,32 @@ const rules1 = ref<FormRules<ResetCurrentUserPasswordRequest>>({
password: [
{
required: true,
message: t('layout.avatar.dialog.enterPassword'),
message: t('views.login.enterPassword'),
trigger: 'blur'
},
{
min: 6,
max: 20,
message: t('layout.avatar.dialog.passwordLength'),
message: t('views.user.userForm.form.password.lengthMessage'),
trigger: 'blur'
}
],
re_password: [
{
required: true,
message: t('layout.avatar.dialog.confirmPassword'),
message: t('views.user.userForm.form.re_password.requiredMessage'),
trigger: 'blur'
},
{
min: 6,
max: 20,
message: t('layout.avatar.dialog.passwordLength'),
message: t('views.user.userForm.form.password.lengthMessage'),
trigger: 'blur'
},
{
validator: (rule, value, callback) => {
if (resetPasswordForm.value.password != resetPasswordForm.value.re_password) {
callback(new Error(t('layout.avatar.dialog.passwordMismatch')))
callback(new Error(t('views.user.userForm.form.password.validatorMessage')))
} else {
callback()
}
@ -154,7 +152,7 @@ const rules2 = ref<FormRules<ResetCurrentUserPasswordRequest>>({
code: [
{
required: true,
message: t('layout.avatar.dialog.enterVerificationCode'),
message: t('views.login.verificationCode.placeholder'),
trigger: 'blur'
}
]
@ -165,7 +163,7 @@ const rules2 = ref<FormRules<ResetCurrentUserPasswordRequest>>({
const sendEmail = () => {
resetPasswordFormRef1.value?.validate().then(() => {
UserApi.sendEmailToCurrent(loading).then(() => {
MsgSuccess(t('layout.avatar.dialog.verificationCodeSentSuccess'))
MsgSuccess(t('views.login.verificationCode.successMessage'))
isDisabled.value = true
handleTimeChange()
})

View File

@ -21,7 +21,7 @@
</p>
</div>
<el-dropdown-item class="border-t p-8" @click="openResetPassword">
{{ $t('layout.avatar.resetPassword') }}
{{ $t('views.login.resetPassword') }}
</el-dropdown-item>
<div v-hasPermission="new ComplexPermission([], ['x-pack'], 'OR')">
<el-dropdown-item class="border-t p-8" @click="openAPIKeyDialog">

View File

@ -0,0 +1,5 @@
export default {
quickCreatePlaceholder: 'Quickly create blank documents',
quickCreateName: 'Document name',
noData: 'No Data'
}

View File

@ -1,78 +0,0 @@
export default {
input_type_list: {
TextInput: 'Text Input',
Slider: 'Slider',
SwitchInput: 'Switch',
SingleSelect: 'Single Select',
MultiSelect: 'Multi Select',
DatePicker: 'Date Picker',
JsonInput: 'JSON Text Input',
RadioCard: 'Radio Card',
RadioRow: 'Radio Row'
},
default: {
label: 'Default Value',
placeholder: 'Please enter a default value',
requiredMessage: ' is a required property',
show: 'Show Default Value'
},
tip: {
requiredMessage: 'Cannot be empty',
jsonMessage: 'Incorrect JSON format'
},
searchBar: {
placeholder: 'Please enter keywords to search'
},
paramForm: {
field: {
label: 'Parameter',
placeholder: 'Please enter a parameter',
requiredMessage: 'Parameter is a required property',
requiredMessage2: 'Only letters, numbers, and underscores are allowed'
},
name: {
label: 'Display Name',
placeholder: 'Please enter a display name',
requiredMessage: 'Display Name is a required property'
},
tooltip: {
label: 'Parameter Tooltip',
placeholder: 'Please enter a parameter tooltip'
},
required: {
label: 'Is Required',
requiredMessage: 'Is Required is a required property'
},
input_type: {
label: 'Component Type',
placeholder: 'Please select a component type',
requiredMessage: 'Component Type is a required property'
}
},
DatePicker: {
placeholder: 'Select Date',
year: 'Year',
month: 'Month',
date: 'Date',
datetime: 'Date Time',
dataType: {
label: 'Date Type',
placeholder: 'Please select a date type'
},
format: {
label: 'Format',
placeholder: 'Please select a format'
}
},
Select: {
label: 'Option Value',
placeholder: 'Please enter an option value'
},
tag: {
label: 'Tag',
placeholder: 'Please enter an option label'
},
Slider: {
showInput: ''
}
}

View File

@ -1,7 +0,0 @@
import dynamicsForm from './dynamics-form'
import chat from './ai-chat'
export default {
dynamicsForm,
chat,
noData: 'No Data'
}

View File

@ -0,0 +1,101 @@
export default {
input_type_list: {
TextInput: 'Text Input',
Slider: 'Slider',
SwitchInput: 'Switch',
SingleSelect: 'Single Select',
MultiSelect: 'Multi Select',
DatePicker: 'Date Picker',
JsonInput: 'JSON Text Input',
RadioCard: 'Radio Card',
RadioRow: 'Radio Row'
},
default: {
label: 'Default Value',
placeholder: 'Please enter a default value',
requiredMessage: ' is a required property',
show: 'Show Default Value'
},
tip: {
requiredMessage: 'Cannot be empty',
jsonMessage: 'Incorrect JSON format'
},
searchBar: {
placeholder: 'Please enter keywords to search'
},
paramForm: {
field: {
label: 'Parameter',
placeholder: 'Please enter a parameter',
requiredMessage: 'Parameter is a required property',
requiredMessage2: 'Only letters, numbers, and underscores are allowed'
},
name: {
label: 'Display Name',
placeholder: 'Please enter a display name',
requiredMessage: 'Display Name is a required property'
},
tooltip: {
label: 'Parameter Tooltip',
placeholder: 'Please enter a parameter tooltip'
},
required: {
label: 'Is Required',
requiredMessage: 'Is Required is a required property'
},
input_type: {
label: 'Component Type',
placeholder: 'Please select a component type',
requiredMessage: 'Component Type is a required property'
}
},
DatePicker: {
placeholder: 'Select Date',
year: 'Year',
month: 'Month',
date: 'Date',
datetime: 'Date Time',
dataType: {
label: 'Date Type',
placeholder: 'Please select a date type'
},
format: {
label: 'Format',
placeholder: 'Please select a format'
}
},
Select: {
label: 'Option Value',
placeholder: 'Please enter an option value'
},
tag: {
label: 'Tag',
placeholder: 'Please enter an option label'
},
Slider: {
showInput: {
label: '是否带输入框'
},
valueRange: {
label: '取值范围',
minRequired: '最小值必填',
maxRequired: '最大值必填'
},
step: {
label: '步长值',
requiredMessage1: '步长值必填',
requiredMessage2: '步长不能为0'
}
},
TextInput: {
length: {
label: '文本长度',
minRequired: '最小长度必填',
maxRequired: '最大长度必填',
requiredMessage1: '长度在',
requiredMessage2: '到',
requiredMessage3: '个字符',
requiredMessage4: '文本长度为必填参数'
}
}
}

View File

@ -3,11 +3,15 @@ import components from './components'
import layout from './layout'
import views from './views'
import common from './common'
import dynamicsForm from './dynamics-form'
import chat from './ai-chat'
export default {
lang: 'English',
layout,
views,
components,
en,
common
common,
dynamicsForm,
chat
}

View File

@ -9,25 +9,11 @@ export default {
function_lib: 'function library'
},
avatar: {
resetPassword: 'Change password',
about: 'About',
logout: 'Logout',
version: 'Version',
apiKey: 'API Key',
apiServiceAddress: 'API Service Address',
dialog: {
newPassword: 'New password',
enterPassword: 'Please enter new password',
confirmPassword: 'Confirm password',
passwordLength: 'Password length should be between 6 and 20 characters',
passwordMismatch: 'Passwords do not match',
useEmail: 'Use email',
enterEmail: 'Please enter email',
enterVerificationCode: 'Please enter verification code',
getVerificationCode: 'Get verification code',
verificationCodeSentSuccess: 'Verification code sent successfully',
resend: 'Resend'
}
},
language: 'Language'
}

View File

@ -9,7 +9,6 @@ export default {
bindDN: 'Bind DN',
bindDNPlaceholder: 'Please enter Bind DN',
password: 'Password',
passwordPlaceholder: 'Please enter password',
ou: 'User OU',
ouPlaceholder: 'Please enter User OU',
ldap_filter: 'User Filter',

View File

@ -0,0 +1,97 @@
export default {
noHistory: '暂无历史记录',
createChat: '新建对话',
history: '历史记录',
only20history: '仅显示最近 20 条对话',
question_count: '条提问',
exportRecords: '导出聊天记录',
chatId: '对话id',
userInput: '用户输入',
quote: '引用',
download: '点击下载文件',
passwordValidator: {
title: '请输入密码打开链接',
errorMessage1: '密码不能为空',
errorMessage2: '密码错误'
},
operation: {
play: '点击播放',
pause: '停止',
regeneration: '换个答案',
like: '赞同',
cancelLike: '取消赞同',
oppose: '反对',
cancelOppose: '取消反对',
continue: '继续',
stopChat: '停止回答'
},
tip: {
error500Message: '抱歉,当前正在维护,无法提供服务,请稍后再试!',
errorIdentifyMessage: '无法识别用户身份',
errorLimitMessage: '抱歉,您的提问已达到最大限制,请明天再来吧!',
answerMessage: '抱歉,没有查找到相关内容,请重新描述您的问题或提供更多信息。',
stopAnswer: '已停止回答',
answerLoading: '回答中',
recorderTip: `<p>该功能需要使用麦克风,浏览器禁止不安全页面录音,解决方案如下:<br/>
1 https <br/>
2 https Chrome <br/>
(1) chrome://flags/#unsafely-treat-insecure-origin-as-secure<br/>
(2) http 例如: http://127.0.0.1:8080。</p>`,
recorderError: '录音失败',
confirm: '我知道了',
requiredMessage: '请填写所有必填字段',
inputParamMessage1: '请在URL中填写参数',
inputParamMessage2: '的值',
prologueMessage: '抱歉,当前正在维护,无法提供服务,请稍后再试!'
},
inputPlaceholder: {
speaking: '说话中',
recorderLoading: '转文字中',
default: '请输入问题Ctrl+Enter 换行Enter发送'
},
uploadFile: {
label: '上传文件',
most: '最多',
limit: '个,每个文件限制',
fileType: '文件类型',
tipMessage: '请在文件上传配置中选择文件类型',
limitMessage1: '最多上传',
limitMessage2: '个文件',
sizeLimit: '单个文件大小不能超过',
imageMessage: '请解析图片内容',
errorMessage: '上传失败'
},
executionDetails: {
title: '执行详情',
paramInput: '参数输入',
paramOutput: '参数输出',
paramOutputTooltip: '每个文档仅支持预览500字',
audioFile: '语音文件',
searchContent: '检索内容',
searchResult: '检索结果',
conditionResult: '判断结果',
currentChat: '本次对话',
answer: 'AI 回答',
replyContent: '回复内容',
textContent: '文本内容',
input: '输入',
output: '输出',
rerankerContent: '重排内容',
rerankerResult: '重排结果',
paragraph: '分段',
noSubmit: '用户未提交',
errMessage: '错误日志'
},
KnowledgeSource: {
title: '知识来源',
referenceParagraph: '引用分段',
consume: '消耗',
consumeTime: '耗时'
},
paragraphSource: {
title: '知识库引用',
question: '用户问题',
optimizationQuestion: '优化后问题'
}
}

View File

@ -0,0 +1,5 @@
export default {
quickCreatePlaceholder: '快速创建空白文档',
quickCreateName: '文档名称',
noData: '无匹配数据'
}

View File

@ -1,31 +0,0 @@
export default {
noHistory: '暂无历史记录',
createChat: '新建对话',
history: '历史记录',
only20history: '仅显示最近 20 条对话',
question_count: '条提问',
exportRecords: '导出聊天记录',
chatId: '对话id',
userInput: '用户输入',
passwordValidator: {
title: '请输入密码打开链接',
errorMessage1: '密码不能为空',
errorMessage2: '密码错误'
},
tip: {
error500Message: '抱歉,当前正在维护,无法提供服务,请稍后再试!',
errorIdentifyMessage: '无法识别用户身份',
errorLimitMessage: '抱歉,您的提问已达到最大限制,请明天再来吧!'
},
executionDetails: {
title: '执行详情',
paramInput: '参数输入',
paramOutput: '参数输出'
},
KnowledgeSource: {
title: '知识来源',
referenceParagraph: '引用分段',
consume: '消耗',
consumeTime: '耗时'
}
}

View File

@ -1,7 +0,0 @@
import dynamicsForm from './dynamics-form'
import chat from './ai-chat'
export default {
dynamicsForm,
chat,
noData: '无匹配数据'
}

View File

@ -3,11 +3,15 @@ import components from './components'
import layout from './layout'
import views from './views'
import common from './common'
import dynamicsForm from './dynamics-form'
import chat from './ai-chat'
export default {
lang: '简体中文',
layout,
views,
components,
zhCn,
common
common,
dynamicsForm,
chat
}

View File

@ -9,25 +9,11 @@ export default {
function_lib: '函数库'
},
avatar: {
resetPassword: '修改密码',
about: '关于',
logout: '退出',
version: '版本号',
apiKey: 'API Key 管理',
apiServiceAddress: 'API 服务地址',
dialog: {
newPassword: '新密码',
enterPassword: '请输入修改密码',
confirmPassword: '确认密码',
passwordLength: '密码长度在 6 到 20 个字符',
passwordMismatch: '两次密码输入不一致',
useEmail: '使用邮箱',
enterEmail: '请输入邮箱',
enterVerificationCode: '请输入验证码',
getVerificationCode: '获取验证码',
verificationCodeSentSuccess: '验证码发送成功',
resend: '重新发送'
}
},
language: '语言'
}

View File

@ -1,4 +1,24 @@
export default {
title: '普通登录',
jump_tip: '即将跳转至认证源页面进行认证',
jump: '跳转'
jump: '跳转',
resetPassword: '修改密码',
forgotPassword: '忘记密码',
userRegister: '用户注册',
buttons: {
login: '登录',
register: '注册',
backLogin: '返回登录',
checkCode: '立即验证'
},
newPassword: '新密码',
enterPassword: '请输入修改密码',
useEmail: '使用邮箱',
moreMethod: '更多登录方式',
verificationCode: {
placeholder: '请输入验证码',
getVerificationCode: '获取验证码',
successMessage: '验证码发送成功',
resend: '重新发送'
}
}

View File

@ -9,7 +9,6 @@ export default {
bindDN: '绑定DN',
bindDNPlaceholder: '请输入绑定 DN',
password: '密码',
passwordPlaceholder: '请输入密码',
ou: '用户OU',
ouPlaceholder: '请输入用户 OU',
ldap_filter: '用户过滤器',

View File

@ -32,7 +32,8 @@ export default {
email: {
label: '邮箱',
placeholder: '请输入邮箱',
requiredMessage: '请输入邮箱'
requiredMessage: '请输入邮箱',
validatorEmail: '请输入有效邮箱格式!',
},
phone: {
label: '手机号',

View File

@ -0,0 +1,5 @@
export default {
quickCreatePlaceholder: '快速創建空白文檔',
quickCreateName: '文檔名稱',
noData: '無匹配数据'
}

View File

@ -1,7 +0,0 @@
import dynamicsForm from './dynamics-form'
import chat from './ai-chat'
export default {
dynamicsForm,
chat,
noData: '無匹配資料'
}

View File

@ -3,12 +3,15 @@ import components from './components'
import layout from './layout'
import views from './views'
import common from './common'
import dynamicsForm from './dynamics-form'
import chat from './ai-chat'
export default {
lang: '繁體中文',
layout,
common,
views,
components,
zhTw
zhTw,
dynamicsForm,
chat
}

View File

@ -9,25 +9,11 @@ export default {
function_lib: '函數庫'
},
avatar: {
resetPassword: '修改密碼',
about: '關於',
logout: '退出',
version: '版本號',
apiKey: 'API Key 管理',
apiServiceAddress: 'API 服務地址',
dialog: {
newPassword: '新密碼',
enterPassword: '請輸入修改密碼',
confirmPassword: '確認密碼',
passwordLength: '密碼長度在 6 到 20 個字元',
passwordMismatch: '兩次密碼輸入不一致',
useEmail: '使用郵箱',
enterEmail: '請輸入郵箱',
enterVerificationCode: '請輸入驗證碼',
getVerificationCode: '獲取驗證碼',
verificationCodeSentSuccess: '驗證碼發送成功',
resend: '重新發送'
}
},
language: '語言'
}

View File

@ -9,7 +9,6 @@ export default {
bindDN: '綁定DN',
bindDNPlaceholder: '請輸入綁定 DN',
password: '密碼',
passwordPlaceholder: '請輸入密碼',
ou: '使用者OU',
ouPlaceholder: '請輸入使用者 OU',
ldap_filter: '使用者過濾器',

View File

@ -41,11 +41,6 @@ export const routes: Array<RouteRecordRaw> = [
name: 'forgot_password',
component: () => import('@/views/login/forgot-password/index.vue')
},
{
path: '/reset_password/:code/:email',
name: 'reset_password',
component: () => import('@/views/login/reset-password/index.vue')
},
{
path: '/:pathMatch(.*)',
name: '404',

View File

@ -59,7 +59,7 @@
<template #empty>
<div class="text-center">
<el-text type="info"> {{ $t('components.chat.noHistory') }}</el-text>
<el-text type="info"> {{ $t('chat.noHistory') }}</el-text>
</div>
</template>
</common-list>

View File

@ -33,7 +33,7 @@
>
<el-input
v-model="form.config_data.password"
:placeholder="$t('views.system.authentication.ldap.passwordPlaceholder')"
:placeholder="$t('views.user.userForm.form.password.placeholder')"
show-password
/>
</el-form-item>
@ -123,7 +123,7 @@ const rules = reactive<FormRules<any>>({
'config_data.password': [
{
required: true,
message: t('views.system.authentication.ldap.passwordPlaceholder'),
message: t('views.user.userForm.form.password.requiredMessage'),
trigger: 'blur'
}
],

View File

@ -3,7 +3,7 @@
:modelValue="show"
modal-class="positioned-mask"
width="300"
:title="$t('components.chat.passwordValidator.title')"
:title="$t('chat.passwordValidator.title')"
custom-class="no-close-button"
:close-on-click-modal="false"
:close-on-press-escape="false"
@ -52,10 +52,10 @@ const auth = () => {
}
const validator_auth = (rule: any, value: string, callback: any) => {
if (value === '') {
callback(new Error(t('components.chat.passwordValidator.errorMessage1')))
callback(new Error(t('chat.passwordValidator.errorMessage1')))
} else {
auth().catch(() => {
callback(new Error(t('components.chat.passwordValidator.errorMessage2')))
callback(new Error(t('chat.passwordValidator.errorMessage2')))
})
}
}

View File

@ -48,7 +48,7 @@
<div class="chat-width">
<el-button type="primary" link class="new-chat-button mb-8" @click="newChat">
<el-icon><Plus /></el-icon
><span class="ml-4">{{ $t('components.chat.createChat') }}</span>
><span class="ml-4">{{ $t('chat.createChat') }}</span>
</el-button>
</div>
</template>
@ -72,7 +72,7 @@
<el-collapse-transition>
<div v-show="show" class="chat-popover w-full" v-click-outside="clickoutside">
<div class="border-b p-16-24">
<span>{{ $t('components.chat.history') }}</span>
<span>{{ $t('chat.history') }}</span>
</div>
<el-scrollbar max-height="300">
@ -100,13 +100,13 @@
</template>
<template #empty>
<div class="text-center mt-24">
<el-text type="info">{{ $t('components.chat.noHistory') }}</el-text>
<el-text type="info">{{ $t('chat.noHistory') }}</el-text>
</div>
</template>
</common-list>
</div>
<div v-if="chatLogData.length" class="gradient-divider lighter mt-8">
<span>{{ $t('components.chat.only20history') }}</span>
<span>{{ $t('chat.only20history') }}</span>
</div>
</el-scrollbar>
</div>

View File

@ -38,9 +38,9 @@
<el-icon>
<Plus />
</el-icon>
<span class="ml-4">{{ $t('components.chat.createChat') }}</span>
<span class="ml-4">{{ $t('chat.createChat') }}</span>
</el-button>
<p class="mt-20 mb-8">{{ $t('components.chat.history') }}</p>
<p class="mt-20 mb-8">{{ $t('chat.history') }}</p>
</div>
<div class="left-height pt-0">
<el-scrollbar>
@ -76,13 +76,13 @@
<template #empty>
<div class="text-center">
<el-text type="info">{{ $t('components.chat.noHistory') }}</el-text>
<el-text type="info">{{ $t('chat.noHistory') }}</el-text>
</div>
</template>
</common-list>
</div>
<div v-if="chatLogData?.length" class="gradient-divider lighter mt-8">
<span>{{ $t('components.chat.only20history') }}</span>
<span>{{ $t('chat.only20history') }}</span>
</div>
</el-scrollbar>
</div>
@ -101,13 +101,13 @@
style="font-size: 16px"
></AppIcon>
<span v-if="paginationConfig.total" class="lighter">
{{ paginationConfig.total }} {{ $t('components.chat.question_count') }}
{{ paginationConfig.total }} {{ $t('chat.question_count') }}
</span>
<el-dropdown class="ml-8">
<AppIcon
iconName="app-export"
class="cursor"
:title="$t('components.chat.exportRecords')"
:title="$t('chat.exportRecords')"
></AppIcon>
<template #dropdown>
<el-dropdown-menu>
@ -183,7 +183,7 @@ const classObj = computed(() => {
const newObj = {
id: 'new',
abstract: t('components.chat.createChat')
abstract: t('chat.createChat')
}
const props = defineProps<{
application_profile: any
@ -210,7 +210,7 @@ const paginationConfig = ref({
const currentRecordList = ref<any>([])
const currentChatId = ref('new') // Id 'new'
const currentChatName = ref(t('components.chat.createChat'))
const currentChatName = ref(t('chat.createChat'))
const mouseId = ref('')
function mouseenter(row: any) {
@ -220,7 +220,7 @@ function deleteLog(row: any) {
log.asyncDelChatClientLog(applicationDetail.value.id, row.id, left_loading).then(() => {
if (currentChatId.value === row.id) {
currentChatId.value = 'new'
currentChatName.value = t('components.chat.createChat')
currentChatName.value = t('chat.createChat')
paginationConfig.value.current_page = 1
paginationConfig.value.total = 0
currentRecordList.value = []
@ -255,7 +255,7 @@ function newChat() {
currentRecordList.value = []
}
currentChatId.value = 'new'
currentChatName.value = t('components.chat.createChat')
currentChatName.value = t('chat.createChat')
if (common.isMobile()) {
isCollapse.value = false
}

View File

@ -1,7 +1,7 @@
<template>
<login-layout>
<LoginContainer subTitle="欢迎使用 MaxKB 智能知识库问答系统">
<h2 class="mb-24">忘记密码</h2>
<LoginContainer :subTitle="$t('views.system.theme.defaultSlogan')">
<h2 class="mb-24">{{ $t('views.login.forgotPassword') }}</h2>
<el-form
class="register-form"
ref="resetPasswordFormRef"
@ -14,7 +14,7 @@
size="large"
class="input-item"
v-model="CheckEmailForm.email"
placeholder="请输入邮箱"
:placeholder="$t('views.user.userForm.form.email.placeholder')"
>
</el-input>
</el-form-item>
@ -26,7 +26,7 @@
size="large"
class="code-input"
v-model="CheckEmailForm.code"
placeholder="请输入验证码"
:placeholder="$t('views.login.verificationCode.placeholder')"
>
</el-input>
@ -37,13 +37,19 @@
@click="sendEmail"
:loading="loading"
>
{{ isDisabled ? `重新发送(${time}s` : '获取验证码' }}</el-button
{{
isDisabled
? `${$t('views.login.verificationCode.resend')}${time}s`
: $t('views.login.verificationCode.getVerificationCode')
}}</el-button
>
</div>
</el-form-item>
</div>
</el-form>
<el-button size="large" type="primary" class="w-full" @click="checkCode">立即验证</el-button>
<el-button size="large" type="primary" class="w-full" @click="checkCode">{{
$t('views.login.buttons.checkCode')
}}</el-button>
<div class="operate-container mt-12">
<el-button
class="register"
@ -52,7 +58,7 @@
type="primary"
icon="ArrowLeft"
>
返回登录
{{ $t('views.login.buttons.backLogin') }}
</el-button>
</div>
</LoginContainer>
@ -65,7 +71,7 @@ import { useRouter } from 'vue-router'
import type { FormInstance, FormRules } from 'element-plus'
import UserApi from '@/api/user'
import { MsgSuccess } from '@/utils/message'
import { t } from '@/locales'
const router = useRouter()
const CheckEmailForm = ref<CheckCodeRequest>({
email: '',
@ -76,12 +82,16 @@ const CheckEmailForm = ref<CheckCodeRequest>({
const resetPasswordFormRef = ref<FormInstance>()
const rules = ref<FormRules<CheckCodeRequest>>({
email: [
{ required: true, message: '请输入邮箱', trigger: 'blur' },
{
required: true,
message: t('views.user.userForm.form.email.requiredMessage'),
trigger: 'blur'
},
{
validator: (rule, value, callback) => {
const emailRegExp = /^[a-zA-Z0-9_.-]+@[a-zA-Z0-9-]+(\.[a-zA-Z0-9-]+)*\.[a-zA-Z0-9]{2,6}$/
if (!emailRegExp.test(value) && value != '') {
callback(new Error('请输入有效邮箱格式!'))
callback(new Error(t('views.user.userForm.form.email.validatorEmail')))
} else {
callback()
}
@ -89,7 +99,7 @@ const rules = ref<FormRules<CheckCodeRequest>>({
trigger: 'blur'
}
],
code: [{ required: true, message: '请输入验证码' }]
code: [{ required: true, message: t('views.login.verificationCode.placeholder') }]
})
const loading = ref<boolean>(false)
const isDisabled = ref<boolean>(false)
@ -108,7 +118,7 @@ const sendEmail = () => {
resetPasswordFormRef.value?.validateField('email', (v: boolean) => {
if (v) {
UserApi.sendEmit(CheckEmailForm.value.email, 'reset_password', loading).then(() => {
MsgSuccess('发送验证码成功')
MsgSuccess(t('views.login.verificationCode.successMessage'))
isDisabled.value = true
handleTimeChange()
})

View File

@ -1,7 +1,7 @@
<template>
<login-layout v-if="user.isEnterprise() ? user.themeInfo : true" v-loading="loading">
<LoginContainer :subTitle="user.themeInfo?.slogan || '欢迎使用 MaxKB 智能知识库问答系统'">
<h2 class="mb-24" v-if="!showQrCodeTab">{{ loginMode || '普通登录' }}</h2>
<LoginContainer :subTitle="user.themeInfo?.slogan || $t('views.system.theme.defaultSlogan')">
<h2 class="mb-24" v-if="!showQrCodeTab">{{ loginMode || $t('views.login.title') }}</h2>
<div v-if="!showQrCodeTab">
<el-form
class="login-form"
@ -16,7 +16,7 @@
size="large"
class="input-item"
v-model="loginForm.username"
placeholder="请输入用户名"
:placeholder="$t('views.user.userForm.form.username.placeholder')"
>
</el-input>
</el-form-item>
@ -28,7 +28,7 @@
size="large"
class="input-item"
v-model="loginForm.password"
placeholder="请输入密码"
:placeholder="$t('views.user.userForm.form.password.placeholder')"
show-password
>
</el-input>
@ -36,7 +36,9 @@
</div>
</el-form>
<el-button size="large" type="primary" class="w-full" @click="login">登录</el-button>
<el-button size="large" type="primary" class="w-full" @click="login">{{
$t('views.login.buttons.login')
}}</el-button>
<div class="operate-container flex-between mt-12">
<!-- <el-button class="register" @click="router.push('/register')" link type="primary">
注册
@ -47,7 +49,7 @@
link
type="primary"
>
忘记密码?
{{ $t('views.login.forgotPassword') }}?
</el-button>
</div>
</div>
@ -56,7 +58,7 @@
</div>
<div class="login-gradient-divider lighter mt-24" v-if="modeList.length > 1">
<span>更多登录方式</span>
<span>{{ $t('views.login.moreMethod') }}</span>
</div>
<div class="text-center mt-16">
<template v-for="item in modeList">
@ -123,14 +125,14 @@ const rules = ref<FormRules<LoginRequest>>({
username: [
{
required: true,
message: '请输入用户名',
message: t('views.user.userForm.form.username.requiredMessage'),
trigger: 'blur'
}
],
password: [
{
required: true,
message: '请输入密码',
message: t('views.user.userForm.form.password.requiredMessage'),
trigger: 'blur'
}
]
@ -154,7 +156,7 @@ function redirectAuth(authType: string) {
if (!res.data) {
return
}
MsgConfirm(`${t('login.jump_tip')}`, t(''), {
MsgConfirm(t('login.jump_tip'), '', {
confirmButtonText: t('login.jump'),
cancelButtonText: t('common.cancel'),
confirmButtonClass: ''

View File

@ -1,7 +1,7 @@
<template>
<login-layout>
<LoginContainer subTitle="欢迎使用 MaxKB 智能知识库问答系统">
<h2 class="mb-24">用户注册</h2>
<LoginContainer :subTitle="$t('views.system.theme.defaultSlogan')">
<h2 class="mb-24">{{ $t('views.login.userRegister') }}</h2>
<el-form class="register-form" :model="registerForm" :rules="rules" ref="registerFormRef">
<div class="mb-24">
<el-form-item prop="username">
@ -9,7 +9,7 @@
size="large"
class="input-item"
v-model="registerForm.username"
placeholder="请输入用户名"
:placeholder="$t('views.user.userForm.form.username.placeholder')"
>
</el-input>
</el-form-item>
@ -21,7 +21,7 @@
size="large"
class="input-item"
v-model="registerForm.password"
placeholder="请输入密码"
:placeholder="$t('views.user.userForm.form.password.placeholder')"
show-password
>
</el-input>
@ -34,7 +34,7 @@
size="large"
class="input-item"
v-model="registerForm.re_password"
placeholder="请输入确认密码"
:placeholder="$t('views.user.userForm.form.re_password.placeholder')"
show-password
>
</el-input>
@ -46,7 +46,7 @@
size="large"
class="input-item"
v-model="registerForm.email"
placeholder="请输入邮箱"
:placeholder="$t('views.user.userForm.form.email.placeholder')"
>
</el-input>
</el-form-item>
@ -58,7 +58,7 @@
size="large"
class="code-input"
v-model="registerForm.code"
placeholder="请输入验证码"
:placeholder="$t('views.login.verificationCode.placeholder')"
>
</el-input>
<el-button
@ -68,13 +68,19 @@
@click="sendEmail"
:loading="sendEmailLoading"
>
{{ isDisabled ? `重新发送(${time}s` : '获取验证码' }}</el-button
{{
isDisabled
? `${$t('views.login.verificationCode.resend')}${time}s`
: $t('views.login.verificationCode.getVerificationCode')
}}</el-button
>
</div>
</el-form-item>
</div>
</el-form>
<el-button size="large" type="primary" class="w-full" @click="register">注册</el-button>
<el-button size="large" type="primary" class="w-full" @click="register">{{
$t('views.login.buttons.register')
}}</el-button>
<div class="operate-container mt-12">
<el-button
class="register"
@ -83,7 +89,7 @@
type="primary"
icon="ArrowLeft"
>
返回登录
{{ $t('views.login.buttons.backLogin') }}
</el-button>
</div>
</LoginContainer>
@ -96,7 +102,7 @@ import { useRouter } from 'vue-router'
import UserApi from '@/api/user'
import { MsgSuccess } from '@/utils/message'
import type { FormInstance, FormRules } from 'element-plus'
import { t } from '@/locales'
const router = useRouter()
const registerForm = ref<RegisterRequest>({
username: '',
@ -110,45 +116,45 @@ const rules = ref<FormRules<RegisterRequest>>({
username: [
{
required: true,
message: '请输入用户名',
message: t('views.user.userForm.form.username.placeholder'),
trigger: 'blur'
},
{
min: 6,
max: 20,
message: '长度在 6 到 20 个字符',
message: t('views.user.userForm.form.username.lengthMessage'),
trigger: 'blur'
}
],
password: [
{
required: true,
message: '请输入密码',
message: t('views.user.userForm.form.password.requiredMessage'),
trigger: 'blur'
},
{
min: 6,
max: 20,
message: '长度在 6 到 20 个字符',
message: t('views.user.userForm.form.password.lengthMessage'),
trigger: 'blur'
}
],
re_password: [
{
required: true,
message: '请输入确认密码',
message: t('views.user.userForm.form.re_password.requiredMessage'),
trigger: 'blur'
},
{
min: 6,
max: 20,
message: '长度在 6 到 20 个字符',
message: t('views.user.userForm.form.password.lengthMessage'),
trigger: 'blur'
},
{
validator: (rule, value, callback) => {
if (registerForm.value.password != registerForm.value.re_password) {
callback(new Error('密码不一致'))
callback(new Error(t('views.user.userForm.form.password.validatorMessage')))
} else {
callback()
}
@ -157,12 +163,16 @@ const rules = ref<FormRules<RegisterRequest>>({
}
],
email: [
{ required: true, message: '请输入邮箱', trigger: 'blur' },
{
required: true,
message: t('views.user.userForm.form.email.requiredMessage'),
trigger: 'blur'
},
{
validator: (rule, value, callback) => {
const emailRegExp = /^[a-zA-Z0-9_.-]+@[a-zA-Z0-9-]+(\.[a-zA-Z0-9-]+)*\.[a-zA-Z0-9]{2,6}$/
if (!emailRegExp.test(value) && value != '') {
callback(new Error('请输入有效邮箱格式!'))
callback(new Error(t('views.user.userForm.form.email.validatorEmail')))
} else {
callback()
}
@ -170,7 +180,7 @@ const rules = ref<FormRules<RegisterRequest>>({
trigger: 'blur'
}
],
code: [{ required: true, message: '请输入验证码' }]
code: [{ required: true, message: t('views.login.verificationCode.placeholder') }]
})
const registerFormRef = ref<FormInstance>()
@ -194,7 +204,7 @@ const sendEmail = () => {
registerFormRef.value?.validateField('email', (v: boolean) => {
if (v) {
UserApi.sendEmit(registerForm.value.email, 'register', sendEmailLoading).then(() => {
MsgSuccess('发送验证码成功')
MsgSuccess(t('views.login.verificationCode.successMessage'))
isDisabled.value = true
handleTimeChange()
})

View File

@ -1,134 +0,0 @@
<template>
<login-layout>
<LoginContainer subTitle="欢迎使用 MaxKB 智能知识库问答系统">
<h2 class="mb-24">修改密码</h2>
<el-form
class="reset-password-form"
ref="resetPasswordFormRef"
:model="resetPasswordForm"
:rules="rules"
>
<div class="mb-24">
<el-form-item prop="password">
<el-input
type="password"
size="large"
class="input-item"
v-model="resetPasswordForm.password"
placeholder="请输入密码"
show-password
>
</el-input>
</el-form-item>
</div>
<div class="mb-24">
<el-form-item prop="re_password">
<el-input
type="password"
size="large"
class="input-item"
v-model="resetPasswordForm.re_password"
placeholder="请输入确认密码"
show-password
>
</el-input>
</el-form-item>
</div>
</el-form>
<el-button size="large" type="primary" class="w-full" @click="resetPassword"
>确认修改</el-button
>
<div class="operate-container mt-12">
<el-button
size="large"
class="register"
@click="router.push('/login')"
link
type="primary"
icon="ArrowLeft"
>
返回登录
</el-button>
</div>
</LoginContainer>
</login-layout>
</template>
<script setup lang="ts">
import { ref, onMounted } from 'vue'
import type { ResetPasswordRequest } from '@/api/type/user'
import { useRouter, useRoute } from 'vue-router'
import { MsgSuccess } from '@/utils/message'
import type { FormInstance, FormRules } from 'element-plus'
import UserApi from '@/api/user'
const router = useRouter()
const route = useRoute()
const {
params: { code, email }
} = route
const resetPasswordForm = ref<ResetPasswordRequest>({
password: '',
re_password: '',
email: '',
code: ''
})
onMounted(() => {
if (code && email) {
resetPasswordForm.value.code = code as string
resetPasswordForm.value.email = email as string
} else {
router.push('forgot_password')
}
})
const rules = ref<FormRules<ResetPasswordRequest>>({
password: [
{
required: true,
message: '请输入密码',
trigger: 'blur'
},
{
min: 6,
max: 20,
message: '长度在 6 到 20 个字符',
trigger: 'blur'
}
],
re_password: [
{
required: true,
message: '请输入确认密码',
trigger: 'blur'
},
{
min: 6,
max: 20,
message: '长度在 6 到 20 个字符',
trigger: 'blur'
},
{
validator: (rule, value, callback) => {
if (resetPasswordForm.value.password != resetPasswordForm.value.re_password) {
callback(new Error('密码不一致'))
} else {
callback()
}
},
trigger: 'blur'
}
]
})
const resetPasswordFormRef = ref<FormInstance>()
const loading = ref<boolean>(false)
const resetPassword = () => {
resetPasswordFormRef.value
?.validate()
.then(() => UserApi.resetPassword(resetPasswordForm.value, loading))
.then(() => {
MsgSuccess('修改密码成功')
router.push({ name: 'login' })
})
}
</script>
<style lang="scss" scope></style>

View File

@ -196,7 +196,7 @@
>
<el-table-column
prop="label"
:label="$t('components.dynamicsForm.paramForm.name.label')"
:label="$t('dynamicsForm.paramForm.name.label')"
show-overflow-tooltip
>
<template #default="{ row }">
@ -208,11 +208,11 @@
</el-table-column>
<el-table-column
prop="field"
:label="$t('components.dynamicsForm.paramForm.field.label')"
:label="$t('dynamicsForm.paramForm.field.label')"
show-overflow-tooltip
/>
<el-table-column
:label="$t('components.dynamicsForm.paramForm.input_type.label')"
:label="$t('dynamicsForm.paramForm.input_type.label')"
width="110px"
>
<template #default="{ row }">
@ -223,7 +223,7 @@
</el-table-column>
<el-table-column
prop="default_value"
:label="$t('components.dynamicsForm.default.label')"
:label="$t('dynamicsForm.default.label')"
show-overflow-tooltip
/>
<el-table-column :label="$t('common.required')">

View File

@ -12,7 +12,7 @@
{{ $t('views.template.templateForm.title.addParam') }}
</el-button>
<el-table :data="modelParamsForm" class="mb-16">
<el-table-column prop="label" :label="$t('components.dynamicsForm.paramForm.name.label')" show-overflow-tooltip>
<el-table-column prop="label" :label="$t('dynamicsForm.paramForm.name.label')" show-overflow-tooltip>
<template #default="{ row }">
<span v-if="row.label && row.label.input_type === 'TooltipLabel'">{{
row.label.label
@ -20,8 +20,8 @@
<span v-else>{{ row.label }}</span>
</template>
</el-table-column>
<el-table-column prop="field" :label="$t('components.dynamicsForm.paramForm.field.label')" show-overflow-tooltip />
<el-table-column :label="$t('components.dynamicsForm.paramForm.input_type.label')" width="110px">
<el-table-column prop="field" :label="$t('dynamicsForm.paramForm.field.label')" show-overflow-tooltip />
<el-table-column :label="$t('dynamicsForm.paramForm.input_type.label')" width="110px">
<template #default="{ row }">
<el-tag type="info" class="info-tag">{{
input_type_list.find((item) => item.value === row.input_type)?.label
@ -30,7 +30,7 @@
</el-table-column>
<el-table-column
prop="default_value"
:label="$t('components.dynamicsForm.default.label')"
:label="$t('dynamicsForm.default.label')"
show-overflow-tooltip
/>
<el-table-column :label="$t('common.required')">

View File

@ -17,7 +17,7 @@
<el-form class="login-form">
<div class="mb-24">
<el-form-item>
<el-input size="large" class="input-item" placeholder="请输入用户名"> </el-input>
<el-input size="large" class="input-item" :placeholder="$t('views.user.userForm.form.username.placeholder')"> </el-input>
</el-form-item>
</div>
<div class="mb-24">
@ -26,16 +26,20 @@
type="password"
size="large"
class="input-item"
placeholder="请输入密码"
:placeholder="$t('views.user.userForm.form.password.placeholder')"
show-password
>
</el-input>
</el-form-item>
</div>
</el-form>
<el-button size="large" type="primary" class="w-full">登录</el-button>
<el-button size="large" type="primary" class="w-full">{{
$t('views.login.buttons.login')
}}</el-button>
<div class="operate-container flex-between mt-12">
<el-button class="forgot-password" link type="primary"> 忘记密码? </el-button>
<el-button class="forgot-password" link type="primary">
{{ $t('views.login.forgotPassword') }}?
</el-button>
</div>
</LoginContainer>
</login-layout>

View File

@ -98,7 +98,7 @@
<slot></slot>
<template v-if="nodeFields.length > 0">
<h5 class="title-decoration-1 mb-8 mt-8">
{{ $t('components.chat.executionDetails.paramOutput') }}
{{ $t('chat.executionDetails.paramOutput') }}
</h5>
<template v-for="(item, index) in nodeFields" :key="index">
<div

View File

@ -19,31 +19,31 @@
:model="form"
require-asterisk-position="right"
>
<el-form-item :label="$t('components.dynamicsForm.paramForm.field.label')" prop="variable">
<el-form-item :label="$t('dynamicsForm.paramForm.field.label')" prop="variable">
<el-input
v-model="form.variable"
:placeholder="$t('components.dynamicsForm.paramForm.field.placeholder')"
:placeholder="$t('dynamicsForm.paramForm.field.placeholder')"
maxlength="64"
show-word-limit
@blur="form.variable = form.variable.trim()"
/>
</el-form-item>
<el-form-item :label="$t('components.dynamicsForm.paramForm.required.label')" @click.prevent>
<el-form-item :label="$t('dynamicsForm.paramForm.required.label')" @click.prevent>
<el-switch size="small" v-model="form.is_required"></el-switch>
</el-form-item>
<el-form-item
:label="$t('components.dynamicsForm.default.label')"
:label="$t('dynamicsForm.default.label')"
prop="default_value"
:rules="{
required: form.is_required,
message: $t('components.dynamicsForm.paramForm.default.placeholder'),
message: $t('dynamicsForm.paramForm.default.placeholder'),
trigger: 'blur'
}"
>
<el-input
v-model="form.default_value"
:placeholder="$t('components.dynamicsForm.paramForm.default.placeholder')"
:placeholder="$t('dynamicsForm.paramForm.default.placeholder')"
@blur="form.name = form.name.trim()"
/>
</el-form-item>
@ -80,10 +80,10 @@ const form = ref<any>({
})
const rules = reactive({
name: [{ required: true, message: t('components.dynamicsForm.paramForm.name.requiredMessage'), trigger: 'blur' }],
name: [{ required: true, message: t('dynamicsForm.paramForm.name.requiredMessage'), trigger: 'blur' }],
variable: [
{ required: true, message: t('components.dynamicsForm.paramForm.field.requiredMessage'), trigger: 'blur' },
{ pattern: /^[a-zA-Z0-9_]+$/, message: t('components.dynamicsForm.paramForm.field.requiredMessage2'), trigger: 'blur' }
{ required: true, message: t('dynamicsForm.paramForm.field.requiredMessage'), trigger: 'blur' },
{ pattern: /^[a-zA-Z0-9_]+$/, message: t('dynamicsForm.paramForm.field.requiredMessage2'), trigger: 'blur' }
]
})

View File

@ -13,8 +13,8 @@
:data="props.nodeModel.properties.api_input_field_list"
class="mb-16"
>
<el-table-column prop="variable" :label="$t('components.dynamicsForm.paramForm.field.label')" />
<el-table-column prop="default_value" :label="$t('components.dynamicsForm.default.label')" />
<el-table-column prop="variable" :label="$t('dynamicsForm.paramForm.field.label')" />
<el-table-column prop="default_value" :label="$t('dynamicsForm.default.label')" />
<el-table-column :label="$t('common.required')">
<template #default="{ row }">
<div @click.stop>

View File

@ -122,11 +122,11 @@ const currentRow = computed(() => {
})
const currentIndex = ref(null)
const inputTypeList = ref([
{ label: t('components.dynamicsForm.input_type_list.TextInput'), value: 'TextInputConstructor' },
{ label: t('components.dynamicsForm.input_type_list.SingleSelect'), value: 'SingleSelectConstructor' },
{ label: t('components.dynamicsForm.input_type_list.MultiSelect'), value: 'MultiSelectConstructor' },
{ label: t('components.dynamicsForm.input_type_list.RadioCard'), value: 'RadioCardConstructor' },
{ label: t('components.dynamicsForm.input_type_list.DatePicker'), value: 'DatePickerConstructor' }
{ label: t('dynamicsForm.input_type_list.TextInput'), value: 'TextInputConstructor' },
{ label: t('dynamicsForm.input_type_list.SingleSelect'), value: 'SingleSelectConstructor' },
{ label: t('dynamicsForm.input_type_list.MultiSelect'), value: 'MultiSelectConstructor' },
{ label: t('dynamicsForm.input_type_list.RadioCard'), value: 'RadioCardConstructor' },
{ label: t('dynamicsForm.input_type_list.DatePicker'), value: 'DatePickerConstructor' }
])
const dialogVisible = ref<boolean>(false)

View File

@ -1,6 +1,6 @@
<template>
<div class="flex-between mb-16">
<h5 class="lighter">{{ $t('components.chat.userInput') }}</h5>
<h5 class="lighter">{{ $t('chat.userInput') }}</h5>
<el-button link type="primary" @click="openAddDialog()">
<el-icon class="mr-4">
<Plus />
@ -13,13 +13,13 @@
:data="props.nodeModel.properties.user_input_field_list"
class="mb-16"
>
<el-table-column prop="field" :label="$t('components.dynamicsForm.paramForm.field.label')">
<el-table-column prop="field" :label="$t('dynamicsForm.paramForm.field.label')">
<template #default="{ row }">
<span :title="row.field" class="ellipsis-1">{{ row.field }}</span>
</template>
</el-table-column>
<el-table-column prop="label" :label="$t('components.dynamicsForm.paramForm.name.label')">
<el-table-column prop="label" :label="$t('dynamicsForm.paramForm.name.label')">
<template #default="{ row }">
<span v-if="row.label && row.label.input_type === 'TooltipLabel'">
<span :title="row.label.label" class="ellipsis-1">
@ -33,33 +33,33 @@
>
</template>
</el-table-column>
<el-table-column :label="$t('components.dynamicsForm.paramForm.input_type.label')">
<el-table-column :label="$t('dynamicsForm.paramForm.input_type.label')">
<template #default="{ row }">
<el-tag type="info" class="info-tag" v-if="row.input_type === 'TextInput'">{{
$t('components.dynamicsForm.input_type_list.TextInput')
$t('dynamicsForm.input_type_list.TextInput')
}}</el-tag>
<el-tag type="info" class="info-tag" v-if="row.input_type === 'Slider'">{{
$t('components.dynamicsForm.input_type_list.Slider')
$t('dynamicsForm.input_type_list.Slider')
}}</el-tag>
<el-tag type="info" class="info-tag" v-if="row.input_type === 'SwitchInput'">{{
$t('components.dynamicsForm.input_type_list.SwitchInput')
$t('dynamicsForm.input_type_list.SwitchInput')
}}</el-tag>
<el-tag type="info" class="info-tag" v-if="row.input_type === 'SingleSelect'">{{
$t('components.dynamicsForm.input_type_list.SingleSelect')
$t('dynamicsForm.input_type_list.SingleSelect')
}}</el-tag>
<el-tag type="info" class="info-tag" v-if="row.input_type === 'MultiSelect'">{{
$t('components.dynamicsForm.input_type_list.MultiSelect')
$t('dynamicsForm.input_type_list.MultiSelect')
}}</el-tag>
<el-tag type="info" class="info-tag" v-if="row.input_type === 'RadioCard'">{{
$t('components.dynamicsForm.input_type_list.RadioCard')
$t('dynamicsForm.input_type_list.RadioCard')
}}</el-tag>
<el-tag type="info" class="info-tag" v-if="row.input_type === 'DatePicker'">{{
$t('components.dynamicsForm.input_type_list.DatePicker')
$t('dynamicsForm.input_type_list.DatePicker')
}}</el-tag>
</template>
</el-table-column>
<el-table-column prop="default_value" :label="$t('components.dynamicsForm.default.label')">
<el-table-column prop="default_value" :label="$t('dynamicsForm.default.label')">
<template #default="{ row }">
<span :title="row.default_value" class="ellipsis-1">{{ getDefaultValue(row) }}</span>
</template>

View File

@ -72,7 +72,7 @@
>
<el-table-column
prop="field"
:label="$t('components.dynamicsForm.paramForm.field.label')"
:label="$t('dynamicsForm.paramForm.field.label')"
>
<template #default="{ row }">
<span :title="row.field" class="ellipsis-1">{{ row.field }}</span>
@ -80,7 +80,7 @@
</el-table-column>
<el-table-column
prop="label"
:label="$t('components.dynamicsForm.paramForm.name.label')"
:label="$t('dynamicsForm.paramForm.name.label')"
>
<template #default="{ row }">
<span v-if="row.label && row.label.input_type === 'TooltipLabel'">
@ -97,7 +97,7 @@
</el-table-column>
<el-table-column
:label="$t('components.dynamicsForm.paramForm.input_type.label')"
:label="$t('dynamicsForm.paramForm.input_type.label')"
width="110px"
>
<template #default="{ row }">
@ -109,7 +109,7 @@
<el-table-column
prop="default_value"
:label="$t('components.dynamicsForm.default.label')"
:label="$t('dynamicsForm.default.label')"
>
<template #default="{ row }">
<span :title="row.default_value" class="ellipsis-1">{{

View File

@ -88,7 +88,7 @@
{{ form_data.reranker_setting.similarity?.toFixed(3) }}</el-col
>
<el-col :span="12" class="color-secondary lighter">
{{ $t('components.chat.KnowledgeSource.referenceParagraph') }} Top</el-col
{{ $t('chat.KnowledgeSource.referenceParagraph') }} Top</el-col
>
<el-col :span="12" class="lighter"> {{ form_data.reranker_setting.top_n }}</el-col>
<el-col :span="12" class="color-secondary lighter">

View File

@ -38,7 +38,7 @@ const showicon = ref(false)
const globalFields = [
{ label: t('views.applicationWorkflow.nodes.startNode.currentTime'), value: 'time' },
{ label: t('views.application.applicationForm.form.historyRecord.label'), value: 'history_context' },
{ label: t('components.chat.chatId'), value: 'chat_id' }
{ label: t('chat.chatId'), value: 'chat_id' }
]
const getRefreshFieldList = () => {