perf: Optimize translation
Some checks are pending
sync2gitee / repo-sync (push) Waiting to run
Typos Check / Spell Check with Typos (push) Waiting to run

This commit is contained in:
wangdan-fit2cloud 2025-12-02 21:02:41 +08:00
parent d39a27f360
commit 39d4ebc49c
10 changed files with 123 additions and 103 deletions

View File

@ -1114,7 +1114,9 @@
</div> </div>
<div class="card-never border-r-6 mt-8"> <div class="card-never border-r-6 mt-8">
<h5 class="p-8-12"> <h5 class="p-8-12">
{{ $t('common.param.outputParam') }}{{ $t('chat.executionDetails.documentSplitTip') }} {{ $t('common.param.outputParam') }}{{
$t('chat.executionDetails.documentSplitTip')
}}
</h5> </h5>
<div class="p-8-12 border-t-dashed lighter"> <div class="p-8-12 border-t-dashed lighter">
<el-radio-group v-model="currentParagraph" class="app-radio-button-group mb-8"> <el-radio-group v-model="currentParagraph" class="app-radio-button-group mb-8">
@ -1150,12 +1152,14 @@
{{ $t('common.param.inputParam') }} {{ $t('common.param.inputParam') }}
</h5> </h5>
<div class="p-8-12 border-t-dashed lighter"> <div class="p-8-12 border-t-dashed lighter">
<span class="color-secondary">{{$t('chat.executionDetails.subBlockLength')}}:</span> <span class="color-secondary"
>{{ $t('views.workflow.nodes.documentSplitNode.chunk_length.label') }}:</span
>
{{ data.size }} {{ data.size }}
</div> </div>
</div> </div>
<div class="card-never border-r-6 mt-8"> <div class="card-never border-r-6 mt-8">
<h5 class="p-8-12">{{$t('chat.executionDetails.writeContent')}}</h5> <h5 class="p-8-12">{{ $t('chat.executionDetails.writeContent') }}</h5>
<div class="p-8-12 border-t-dashed lighter"> <div class="p-8-12 border-t-dashed lighter">
<el-radio-group v-model="currentWriteContent" class="app-radio-button-group mb-8"> <el-radio-group v-model="currentWriteContent" class="app-radio-button-group mb-8">
<template <template

View File

@ -108,7 +108,6 @@ export default {
knowedMessage: 'Known Information', knowedMessage: 'Known Information',
documentSplitTip: 'Each document can preview only the first five segments', documentSplitTip: 'Each document can preview only the first five segments',
paragraphRules: 'Segmentation Rules', paragraphRules: 'Segmentation Rules',
subBlockLength: 'Sub-block Length',
writeContent: 'Content Written', writeContent: 'Content Written',
}, },
KnowledgeSource: { KnowledgeSource: {

View File

@ -81,7 +81,6 @@ export default {
}, },
nodes: { nodes: {
knowledgeWriteNode: { knowledgeWriteNode: {
chunk_length: 'Chunk length',
text: 'Knowledge write', text: 'Knowledge write',
label: 'Knowledge write', label: 'Knowledge write',
}, },
@ -94,6 +93,16 @@ export default {
label: 'Local File', label: 'Local File',
text: 'Local File', text: 'Local File',
fileList: 'File List', fileList: 'File List',
fileFormat: {
label: 'Supported File Formats',
requiredMessage: 'Please select file formats',
},
maxFileNumber: {
label: 'Maximum Number of Files per Upload',
},
maxFileCountNumber: {
label: 'Maximum Size per File (MB)',
},
}, },
classify: { classify: {
aiCapability: 'AI capability', aiCapability: 'AI capability',
@ -265,6 +274,16 @@ You are a master of problem optimization, adept at accurately inferring user int
placeholder: 'Please select a splitting strategy', placeholder: 'Please select a splitting strategy',
requiredMessage: 'Please select a splitting strategy', requiredMessage: 'Please select a splitting strategy',
}, },
chunk_length: {
label: 'Chunk length',
tooltip1: 'Core objective is to balance retrieval precision and recall efficiency',
tooltip2:
'Avoid excessively short segmentation: A single segment <50 characters may lead to semantic fragmentation, potentially failing to match query intent during retrieval due to lack of context.',
tooltip3:
'Avoid excessive segmentation: A single block exceeding 500 characters increases redundant information, reduces retrieval accuracy, and consumes more storage and computing resources.',
},
title1: 'Segment title set as the associated question of the segment',
title2: 'Document name set as the associated question of the segment',
}, },
imageUnderstandNode: { imageUnderstandNode: {
label: 'Image Understanding', label: 'Image Understanding',
@ -410,7 +429,6 @@ You are a master of problem optimization, adept at accurately inferring user int
placeholder: 'Please choose a classification option', placeholder: 'Please choose a classification option',
classify: { classify: {
label: 'Intent classify', label: 'Intent classify',
placeholder: 'Please input',
}, },
input: { input: {
label: 'Input', label: 'Input',

View File

@ -106,7 +106,6 @@ export default {
knowedMessage: '已知信息', knowedMessage: '已知信息',
documentSplitTip: '每个文档仅能预览前五个分段', documentSplitTip: '每个文档仅能预览前五个分段',
paragraphRules: '分段规则', paragraphRules: '分段规则',
subBlockLength: '子分块长度',
writeContent: '写入内容', writeContent: '写入内容',
}, },
KnowledgeSource: { KnowledgeSource: {

View File

@ -1,3 +1,6 @@
import tool from '@/api/tool/tool'
import type { title } from 'process'
export default { export default {
node: '节点', node: '节点',
nodeName: '节点名称', nodeName: '节点名称',
@ -82,7 +85,6 @@ export default {
}, },
nodes: { nodes: {
knowledgeWriteNode: { knowledgeWriteNode: {
chunk_length: '子分块长度',
text: '知识库写入', text: '知识库写入',
label: '知识库写入', label: '知识库写入',
}, },
@ -95,6 +97,16 @@ export default {
label: '本地文件', label: '本地文件',
text: '本地文件', text: '本地文件',
fileList: '文件列表', fileList: '文件列表',
fileFormat: {
label: '支持的文件格式',
requiredMessage: '请选择文件格式',
},
maxFileNumber: {
label: '每次上传最大文件数',
},
maxFileCountNumber: {
label: '上传的每个文档最大(MB)',
},
}, },
classify: { classify: {
aiCapability: 'AI能力', aiCapability: 'AI能力',
@ -270,6 +282,16 @@ export default {
placeholder: '请选择分段策略', placeholder: '请选择分段策略',
requiredMessage: '请选择分段策略', requiredMessage: '请选择分段策略',
}, },
chunk_length: {
label: '子分块长度',
tooltip1: '核心目标是平衡检索精度与召回效率',
tooltip2:
'避免过短拆分单块50 字易导致语义碎片化,检索时可能因缺少上下文无法匹配查询意图',
tooltip3:
'避免过长拆分单块500 字会增加冗余信息,降低检索精准度,且占用更多存储和计算资源',
},
title1: '分段标题设置为分段的关联问题',
title2: '文档名称设置为分段的关联问题',
}, },
imageUnderstandNode: { imageUnderstandNode: {
label: '图片理解', label: '图片理解',
@ -421,7 +443,6 @@ export default {
placeholder: '请选择分类项', placeholder: '请选择分类项',
classify: { classify: {
label: '意图分类', label: '意图分类',
placeholder: '请输入',
}, },
input: { input: {
label: '输入', label: '输入',

View File

@ -106,7 +106,6 @@ export default {
knowedMessage: '已知資訊', knowedMessage: '已知資訊',
documentSplitTip: '每個文件僅能預覽前五個段落', documentSplitTip: '每個文件僅能預覽前五個段落',
paragraphRules: '分段規則', paragraphRules: '分段規則',
subBlockLength: '子分塊長度',
writeContent: '寫入內容', writeContent: '寫入內容',
}, },
KnowledgeSource: { KnowledgeSource: {

View File

@ -81,7 +81,6 @@ export default {
}, },
nodes: { nodes: {
knowledgeWriteNode: { knowledgeWriteNode: {
chunk_length: '子分塊長度',
text: '知識庫寫入', text: '知識庫寫入',
label: '知識庫寫入', label: '知識庫寫入',
}, },
@ -94,6 +93,16 @@ export default {
label: '本地文件', label: '本地文件',
text: '本地文件', text: '本地文件',
fileList: '文件列表', fileList: '文件列表',
fileFormat: {
label: '支持的文件格式',
requiredMessage: '請選擇文件格式',
},
maxFileNumber: {
label: '每次上傳最大文件數',
},
maxFileCountNumber: {
label: '上傳的每個文檔最大(MB)',
},
}, },
classify: { classify: {
aiCapability: 'AI能力', aiCapability: 'AI能力',
@ -264,6 +273,16 @@ export default {
placeholder: '請選擇分段策略', placeholder: '請選擇分段策略',
requiredMessage: '請選擇分段策略', requiredMessage: '請選擇分段策略',
}, },
chunk_length: {
label: '子分塊長度',
tooltip1: '核心目標是平衡檢索精度與召回效率',
tooltip2:
'避免過短拆分單塊50 字易導致語義碎片化,檢索時可能因缺少上下文無法匹配查詢意圖',
tooltip3:
'避免過長拆分單塊500 字會增加冗餘信息,降低檢索精准度,且佔用更多存儲和計算資源',
},
title1: '分段標題設置為分段的關聯問題',
title2: '文檔名稱設置為分段的關聯問題',
}, },
imageUnderstandNode: { imageUnderstandNode: {
label: '圖片理解', label: '圖片理解',
@ -402,7 +421,6 @@ export default {
placeholder: '請選擇分類項', placeholder: '請選擇分類項',
classify: { classify: {
label: '意圖分類', label: '意圖分類',
placeholder: '請輸入',
}, },
input: { input: {
label: '輸入', label: '輸入',
@ -438,13 +456,13 @@ export default {
loopIndex: '下標', loopIndex: '下標',
loopItem: '循環元素', loopItem: '循環元素',
}, },
loopBodyNode: {label: '循環體', text: '循環體'}, loopBodyNode: { label: '循環體', text: '循環體' },
loopContinueNode: { loopContinueNode: {
label: 'Continue', label: 'Continue',
text: '用於終止當前循環,執行下次循環', text: '用於終止當前循環,執行下次循環',
isContinue: 'Continue', isContinue: 'Continue',
}, },
loopBreakNode: {label: 'Break', text: '終止當前循環,跳出循環體', isBreak: 'Break'}, loopBreakNode: { label: 'Break', text: '終止當前循環,跳出循環體', isBreak: 'Break' },
variableSplittingNode: { variableSplittingNode: {
label: '變量拆分', label: '變量拆分',
text: '通過配置 JSON Path 表達式,對輸入的 JSON 格式變量進行解析和拆分', text: '通過配置 JSON Path 表達式,對輸入的 JSON 格式變量進行解析和拆分',

View File

@ -10,25 +10,17 @@
label-width="auto" label-width="auto"
> >
<el-form-item <el-form-item
:label="$t('views.workflow.nodes.dataSourceLocalNode.fileFormat.label', '支持的文件格式')" :label="$t('views.workflow.nodes.dataSourceLocalNode.fileFormat.label')"
:rules="{ :rules="{
type: 'array', type: 'array',
required: true, required: true,
message: $t( message: $t('views.workflow.nodes.dataSourceLocalNode.fileFormat.requiredMessage'),
'views.workflow.nodes.dataSourceLocalNode.fileFormat.message',
'请选择文件格式',
),
trigger: 'change', trigger: 'change',
}" }"
> >
<el-select <el-select
v-model="form_data.file_type_list" v-model="form_data.file_type_list"
:placeholder=" :placeholder="$t('views.workflow.nodes.dataSourceLocalNode.fileFormat.requiredMessage')"
$t(
'views.workflow.nodes.dataSourceLocalNode.fileFormat.placeholder',
'请选择文件格式',
)
"
class="w-240" class="w-240"
clearable clearable
multiple multiple
@ -48,16 +40,11 @@
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item <el-form-item
:label=" :label="$t('views.workflow.nodes.dataSourceLocalNode.maxFileNumber.label')"
$t('views.workflow.nodes.dataSourceLocalNode.maxFileNumber.label', '每次上传最大文件数')
"
:rules="{ :rules="{
type: 'array', type: 'array',
required: true, required: true,
message: $t( message: $t('common.inputPlaceholder'),
'views.workflow.nodes.dataSourceLocalNode.maxFileNumber.placeholder',
'请输入最大文件数',
),
trigger: 'change', trigger: 'change',
}" }"
> >
@ -73,19 +60,11 @@
/> />
</el-form-item> </el-form-item>
<el-form-item <el-form-item
:label=" :label="$t('views.workflow.nodes.dataSourceLocalNode.maxFileCountNumber.label')"
$t(
'views.workflow.nodes.dataSourceLocalNode.maxFileNumber.label',
'上传的每个文档最大(MB)',
)
"
:rules="{ :rules="{
type: 'array', type: 'array',
required: true, required: true,
message: $t( message: $t('common.inputPlaceholder'),
'views.workflow.nodes.dataSourceLocalNode.maxFileNumber.placeholder',
'上传的每个文档最大(MB) 必填',
),
trigger: 'change', trigger: 'change',
}" }"
> >

View File

@ -10,11 +10,13 @@
require-asterisk-position="right" require-asterisk-position="right"
label-width="auto" label-width="auto"
> >
<el-form-item :label="$t('views.problem.relateParagraph.selectDocument')" :rules="{ <el-form-item
:label="$t('views.problem.relateParagraph.selectDocument')"
:rules="{
type: 'array', type: 'array',
required: true, required: true,
message: $t('views.chatLog.documentPlaceholder'), message: $t('views.chatLog.documentPlaceholder'),
trigger: 'change' trigger: 'change',
}" }"
> >
<NodeCascader <NodeCascader
@ -30,39 +32,28 @@
:rules="{ :rules="{
required: true, required: true,
message: $t('views.workflow.nodes.documentSplitNode.splitStrategy.requiredMessage'), message: $t('views.workflow.nodes.documentSplitNode.splitStrategy.requiredMessage'),
trigger: 'change' trigger: 'change',
}" }"
> >
<el-select <el-select
v-model="form_data.split_strategy" v-model="form_data.split_strategy"
:placeholder="$t('views.workflow.nodes.documentSplitNode.splitStrategy.placeholder')"> :placeholder="$t('views.workflow.nodes.documentSplitNode.splitStrategy.placeholder')"
<el-option >
:label="$t('views.document.setRules.intelligent.label')" <el-option :label="$t('views.document.setRules.intelligent.label')" value="auto" />
value="auto" <el-option :label="$t('views.document.setRules.advanced.label')" value="custom" />
/> <el-option :label="$t('views.document.fileType.QA.label')" value="qa" />
<el-option
:label="$t('views.document.setRules.advanced.label')"
value="custom"
/>
<el-option
:label="$t('views.document.fileType.QA.label')"
value="qa"
/>
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item> <el-form-item>
<template #label> <template #label>
<div class="flex-between"> <div class="flex-between">
<span> <span class="flex align-center">
<span>子分块长度</span> <span>{{ $t('views.workflow.nodes.documentSplitNode.chunk_length.label') }}</span>
<el-tooltip <el-tooltip effect="dark" placement="right">
effect="dark"
placement="right"
>
<template #content> <template #content>
核心目标是平衡检索精度与召回效率 <br/> {{ $t('views.workflow.nodes.documentSplitNode.chunk_length.tooltip1') }}<br />
避免过短拆分单块50 字易导致语义碎片化检索时可能因缺少上下文无法匹配查询意图<br/> {{ $t('views.workflow.nodes.documentSplitNode.chunk_length.tooltip2') }}<br />
避免过长拆分单块500 字会增加冗余信息降低检索精准度且占用更多存储和计算资源 {{ $t('views.workflow.nodes.documentSplitNode.chunk_length.tooltip3') }}
</template> </template>
<AppIcon iconName="app-warning" class="app-warning-icon"></AppIcon> <AppIcon iconName="app-warning" class="app-warning-icon"></AppIcon>
</el-tooltip> </el-tooltip>
@ -72,10 +63,7 @@
:label="$t('views.workflow.nodes.searchDocumentNode.custom')" :label="$t('views.workflow.nodes.searchDocumentNode.custom')"
value="custom" value="custom"
/> />
<el-option <el-option :label="$t('views.workflow.variable.Referencing')" value="referencing" />
:label="$t('views.workflow.variable.Referencing')"
value="referencing"
/>
</el-select> </el-select>
</div> </div>
</template> </template>
@ -200,7 +188,11 @@
/> />
</el-select> </el-select>
</div> </div>
<el-switch v-if="form_data.with_filter_type === 'custom'" size="small" v-model="form_data.with_filter" /> <el-switch
v-if="form_data.with_filter_type === 'custom'"
size="small"
v-model="form_data.with_filter"
/>
<NodeCascader <NodeCascader
v-else v-else
ref="nodeCascaderRef7" ref="nodeCascaderRef7"
@ -212,8 +204,7 @@
<div style="margin-top: 4px"> <div style="margin-top: 4px">
<el-text type="info"> <el-text type="info">
{{ $t('views.document.setRules.with_filter.text') }} {{ $t('views.document.setRules.with_filter.text') }}
</el-text </el-text>
>
</div> </div>
</div> </div>
</div> </div>
@ -221,17 +212,17 @@
<el-form-item v-if="form_data.split_strategy !== 'qa'"> <el-form-item v-if="form_data.split_strategy !== 'qa'">
<template #label> <template #label>
<div class="flex-between"> <div class="flex-between">
<span>分段标题设置为分段的关联问题</span> <span> {{ $t('views.workflow.nodes.documentSplitNode.title1') }}</span>
<el-select v-model="form_data.paragraph_title_relate_problem_type" size="small" <el-select
style="width: 100px"> v-model="form_data.paragraph_title_relate_problem_type"
size="small"
style="width: 100px"
>
<el-option <el-option
:label="$t('views.workflow.nodes.searchDocumentNode.custom')" :label="$t('views.workflow.nodes.searchDocumentNode.custom')"
value="custom" value="custom"
/> />
<el-option <el-option :label="$t('views.workflow.variable.Referencing')" value="referencing" />
:label="$t('views.workflow.variable.Referencing')"
value="referencing"
/>
</el-select> </el-select>
</div> </div>
</template> </template>
@ -252,17 +243,17 @@
<el-form-item> <el-form-item>
<template #label> <template #label>
<div class="flex-between"> <div class="flex-between">
<span>文档名称设置为分段的关联问题</span> <span>{{ $t('views.workflow.nodes.documentSplitNode.title2') }}</span>
<el-select v-model="form_data.document_name_relate_problem_type" size="small" <el-select
style="width: 100px"> v-model="form_data.document_name_relate_problem_type"
size="small"
style="width: 100px"
>
<el-option <el-option
:label="$t('views.workflow.nodes.searchDocumentNode.custom')" :label="$t('views.workflow.nodes.searchDocumentNode.custom')"
value="custom" value="custom"
/> />
<el-option <el-option :label="$t('views.workflow.variable.Referencing')" value="referencing" />
:label="$t('views.workflow.variable.Referencing')"
value="referencing"
/>
</el-select> </el-select>
</div> </div>
</template> </template>
@ -297,7 +288,7 @@ import { useRoute } from 'vue-router'
const route = useRoute() const route = useRoute()
const { const {
query: { id } // idknowledgeID query: { id }, // idknowledgeID
} = route as any } = route as any
const apiType = computed(() => { const apiType = computed(() => {
@ -333,10 +324,9 @@ const form = {
patterns_reference: [], patterns_reference: [],
with_filter: false, with_filter: false,
with_filter_type: 'custom', with_filter_type: 'custom',
with_filter_reference: [] with_filter_reference: [],
} }
const form_data = computed({ const form_data = computed({
get: () => { get: () => {
if (props.nodeModel.properties.node_data) { if (props.nodeModel.properties.node_data) {
@ -348,10 +338,9 @@ const form_data = computed({
}, },
set: (value) => { set: (value) => {
set(props.nodeModel.properties, 'node_data', value) set(props.nodeModel.properties, 'node_data', value)
} },
}) })
const aiChatNodeFormRef = ref<FormInstance>() const aiChatNodeFormRef = ref<FormInstance>()
const nodeCascaderRef = ref() const nodeCascaderRef = ref()
const nodeCascaderRef2 = ref() const nodeCascaderRef2 = ref()
@ -362,7 +351,7 @@ const validate = () => {
nodeCascaderRef.value ? nodeCascaderRef.value.validate() : Promise.resolve(''), nodeCascaderRef.value ? nodeCascaderRef.value.validate() : Promise.resolve(''),
nodeCascaderRef2.value ? nodeCascaderRef2.value.validate() : Promise.resolve(''), nodeCascaderRef2.value ? nodeCascaderRef2.value.validate() : Promise.resolve(''),
nodeCascaderRef3.value ? nodeCascaderRef3.value.validate() : Promise.resolve(''), nodeCascaderRef3.value ? nodeCascaderRef3.value.validate() : Promise.resolve(''),
aiChatNodeFormRef.value?.validate() aiChatNodeFormRef.value?.validate(),
]).catch((err: any) => { ]).catch((err: any) => {
return Promise.reject({ node: props.nodeModel, errMessage: err }) return Promise.reject({ node: props.nodeModel, errMessage: err })
}) })
@ -377,15 +366,11 @@ const initSplitPatternList = () => {
}) })
} }
onMounted(() => { onMounted(() => {
initSplitPatternList() initSplitPatternList()
set(props.nodeModel, 'validate', validate) set(props.nodeModel, 'validate', validate)
}) })
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped></style>
</style>

View File

@ -108,7 +108,7 @@
<el-form-item <el-form-item
:prop="`branch.${index}.content`" :prop="`branch.${index}.content`"
:rules="{ :rules="{
message: $t('views.workflow.nodes.intentNode.classify.placeholder'), message: $t('common.inputPlaceholder'),
trigger: 'change', trigger: 'change',
required: true, required: true,
}" }"
@ -119,9 +119,7 @@
v-model="item.content" v-model="item.content"
style="width: 210px" style="width: 210px"
:disabled="item.isOther" :disabled="item.isOther"
:placeholder=" :placeholder="$t('common.inputPlaceholder')"
$t('views.workflow.nodes.intentNode.classify.placeholder')
"
/> />
</el-col> </el-col>
<el-col :span="3"> <el-col :span="3">