Skip to content

Commit 8cb9350

Browse files
feat: 前端i18n
1 parent c8735cb commit 8cb9350

File tree

40 files changed

+431
-1442
lines changed

40 files changed

+431
-1442
lines changed

ui/src/components/generate-related-dialog/index.vue

Lines changed: 3 additions & 73 deletions
Original file line numberDiff line numberDiff line change
@@ -28,64 +28,11 @@
2828
</div>
2929
</div>
3030
<el-form-item label="AI 模型" prop="model_id">
31-
<el-select
31+
<ModelSelect
3232
v-model="form.model_id"
3333
:placeholder="$t('views.application.applicationForm.form.aiModel.placeholder')"
34-
class="w-full"
35-
popper-class="select-model"
36-
:clearable="true"
37-
>
38-
<el-option-group
39-
v-for="(value, label) in modelOptions"
40-
:key="value"
41-
:label="relatedObject(providerOptions, label, 'provider')?.name"
42-
>
43-
<el-option
44-
v-for="item in value.filter((v: any) => v.status === 'SUCCESS')"
45-
:key="item.id"
46-
:label="item.name"
47-
:value="item.id"
48-
class="flex-between"
49-
>
50-
<div class="flex align-center">
51-
<span
52-
v-html="relatedObject(providerOptions, label, 'provider')?.icon"
53-
class="model-icon mr-8"
54-
></span>
55-
<span>{{ item.name }}</span>
56-
<el-tag v-if="item.permission_type === 'PUBLIC'" type="info" class="info-tag ml-8"
57-
>公用
58-
</el-tag>
59-
</div>
60-
<el-icon class="check-icon" v-if="item.id === form.model_id">
61-
<Check />
62-
</el-icon>
63-
</el-option>
64-
<!-- 不可用 -->
65-
<el-option
66-
v-for="item in value.filter((v: any) => v.status !== 'SUCCESS')"
67-
:key="item.id"
68-
:label="item.name"
69-
:value="item.id"
70-
class="flex-between"
71-
disabled
72-
>
73-
<div class="flex">
74-
<span
75-
v-html="relatedObject(providerOptions, label, 'provider')?.icon"
76-
class="model-icon mr-8"
77-
></span>
78-
<span>{{ item.name }}</span>
79-
<span class="danger">{{
80-
$t('views.application.applicationForm.form.aiModel.unavailable')
81-
}}</span>
82-
</div>
83-
<el-icon class="check-icon" v-if="item.id === form.model_id">
84-
<Check />
85-
</el-icon>
86-
</el-option>
87-
</el-option-group>
88-
</el-select>
34+
:options="modelOptions"
35+
></ModelSelect>
8936
</el-form-item>
9037
<el-form-item label="提示词" prop="prompt">
9138
<el-input v-model="form.prompt" placeholder="请输入提示词" :rows="7" type="textarea" />
@@ -109,8 +56,6 @@ import documentApi from '@/api/document'
10956
import paragraphApi from '@/api/paragraph'
11057
import datasetApi from '@/api/dataset'
11158
import useStore from '@/stores'
112-
import { relatedObject } from '@/utils/utils'
113-
import type { Provider } from '@/api/type/model'
11459
import { groupBy } from 'lodash'
11560
import { MsgSuccess } from '@/utils/message'
11661
import { t } from '@/locales'
@@ -129,7 +74,6 @@ const loading = ref<boolean>(false)
12974
13075
const dialogVisible = ref<boolean>(false)
13176
const modelOptions = ref<any>(null)
132-
const providerOptions = ref<Array<Provider>>([])
13377
const idList = ref<string[]>([])
13478
const apiType = ref('') // 文档document或段落paragraph
13579
@@ -143,7 +87,6 @@ const rules = reactive({
14387
})
14488
14589
const open = (ids: string[], type: string) => {
146-
getProvider()
14790
getModel()
14891
idList.value = ids
14992
apiType.value = type
@@ -190,19 +133,6 @@ function getModel() {
190133
})
191134
}
192135
193-
function getProvider() {
194-
loading.value = true
195-
model
196-
.asyncGetProvider()
197-
.then((res: any) => {
198-
providerOptions.value = res?.data
199-
loading.value = false
200-
})
201-
.catch(() => {
202-
loading.value = false
203-
})
204-
}
205-
206136
defineExpose({ open })
207137
</script>
208138
<style lang="scss" scope>

ui/src/components/index.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ import LogoFull from './logo/LogoFull.vue'
2424
import LogoIcon from './logo/LogoIcon.vue'
2525
import SendIcon from './logo/SendIcon.vue'
2626
import CodemirrorEditor from './codemirror-editor/index.vue'
27+
import ModelSelect from './model-select/index.vue'
2728

2829
export default {
2930
install(app: App) {
@@ -52,5 +53,6 @@ export default {
5253
app.component(SendIcon.name, SendIcon)
5354
app.component(CodemirrorEditor.name, CodemirrorEditor)
5455
app.component(MdEditorMagnify.name, MdEditorMagnify)
56+
app.component(ModelSelect.name, ModelSelect)
5557
}
5658
}
Lines changed: 156 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,156 @@
1+
<template>
2+
<div class="w-full">
3+
<el-select v-model="modelValue" popper-class="select-model" :clearable="true" v-bind="$attrs">
4+
<el-option-group
5+
v-for="(value, label) in options"
6+
:key="value"
7+
:label="relatedObject(providerOptions, label, 'provider')?.name"
8+
>
9+
<el-option
10+
v-for="item in value.filter((v: any) => v.status === 'SUCCESS')"
11+
:key="item.id"
12+
:label="item.name"
13+
:value="item.id"
14+
class="flex-between"
15+
>
16+
<div class="flex">
17+
<span
18+
v-html="relatedObject(providerOptions, label, 'provider')?.icon"
19+
class="model-icon mr-8"
20+
></span>
21+
<span>{{ item.name }}</span>
22+
<el-tag v-if="item.permission_type === 'PUBLIC'" type="info" class="info-tag ml-8 mt-4">
23+
{{ $t('common.public') }}
24+
</el-tag>
25+
</div>
26+
<el-icon class="check-icon" v-if="item.id === modelValue">
27+
<Check />
28+
</el-icon>
29+
</el-option>
30+
<!-- 不可用 -->
31+
<el-option
32+
v-for="item in value.filter((v: any) => v.status !== 'SUCCESS')"
33+
:key="item.id"
34+
:label="item.name"
35+
:value="item.id"
36+
class="flex-between"
37+
disabled
38+
>
39+
<div class="flex">
40+
<span
41+
v-html="relatedObject(providerOptions, label, 'provider')?.icon"
42+
class="model-icon mr-8"
43+
></span>
44+
<span>{{ item.name }}</span>
45+
<span class="danger">{{ $t('common.unavailable') }}</span>
46+
</div>
47+
<el-icon class="check-icon" v-if="item.id === modelValue">
48+
<Check />
49+
</el-icon>
50+
</el-option>
51+
</el-option-group>
52+
<template #footer v-if="showFooter">
53+
<slot name="footer">
54+
<div class="w-full text-left cursor" @click="openCreateModel()">
55+
<el-button type="primary" link>
56+
<el-icon class="mr-4">
57+
<Plus />
58+
</el-icon>
59+
{{ $t('views.application.applicationForm.buttons.addModel') }}
60+
</el-button>
61+
</div>
62+
</slot>
63+
</template>
64+
</el-select>
65+
<!-- 添加模版 -->
66+
<CreateModelDialog
67+
v-if="showFooter"
68+
ref="createModelRef"
69+
@submit="submitModel"
70+
@change="openCreateModel($event)"
71+
></CreateModelDialog>
72+
<SelectProviderDialog
73+
v-if="showFooter"
74+
ref="selectProviderRef"
75+
@change="openCreateModel($event)"
76+
/>
77+
</div>
78+
</template>
79+
<script setup lang="ts">
80+
import { computed, ref, onMounted } from 'vue'
81+
import type { Provider } from '@/api/type/model'
82+
import { relatedObject } from '@/utils/utils'
83+
import CreateModelDialog from '@/views/template/component/CreateModelDialog.vue'
84+
import SelectProviderDialog from '@/views/template/component/SelectProviderDialog.vue'
85+
86+
import { t } from '@/locales'
87+
import useStore from '@/stores'
88+
defineOptions({ name: 'ModelSelect' })
89+
const props = defineProps<{
90+
modelValue: any
91+
options: any
92+
showFooter?: false
93+
}>()
94+
95+
const emit = defineEmits(['update:modelValue', 'change', 'submitModel'])
96+
const modelValue = computed({
97+
set: (item) => {
98+
emit('update:modelValue', item)
99+
},
100+
get: () => {
101+
return props.modelValue
102+
}
103+
})
104+
const { model } = useStore()
105+
106+
const createModelRef = ref<InstanceType<typeof CreateModelDialog>>()
107+
const selectProviderRef = ref<InstanceType<typeof SelectProviderDialog>>()
108+
const providerOptions = ref<Array<Provider>>([])
109+
const loading = ref(false)
110+
111+
function getProvider() {
112+
loading.value = true
113+
model
114+
.asyncGetProvider()
115+
.then((res: any) => {
116+
providerOptions.value = res?.data
117+
loading.value = false
118+
})
119+
.catch(() => {
120+
loading.value = false
121+
})
122+
}
123+
124+
const openCreateModel = (provider?: Provider) => {
125+
if (provider && provider.provider) {
126+
createModelRef.value?.open(provider)
127+
} else {
128+
selectProviderRef.value?.open()
129+
}
130+
}
131+
132+
function submitModel() {
133+
emit('submitModel')
134+
}
135+
136+
onMounted(() => {
137+
getProvider()
138+
})
139+
</script>
140+
<style lang="scss" scoped>
141+
// AI模型选择:添加模型hover样式
142+
.select-model {
143+
.el-select-dropdown__footer {
144+
&:hover {
145+
background-color: var(--el-fill-color-light);
146+
}
147+
}
148+
.model-icon {
149+
width: 20px;
150+
}
151+
.check-icon {
152+
position: absolute;
153+
right: 10px;
154+
}
155+
}
156+
</style>

ui/src/locales/lang/en_US/index.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,10 @@ export default {
3737
document: 'Documentation',
3838
character: 'characters',
3939
export: 'Export',
40-
exportSuccess: 'Export successful'
40+
exportSuccess: 'Export successful',
41+
unavailable: '(Unavailable)',
42+
public: 'Public',
43+
paramSetting: 'Parameter Settings'
4144
},
4245
login: {
4346
authentication: 'Login Authentication',

ui/src/locales/lang/en_US/views/application.ts

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -47,9 +47,7 @@ export default {
4747
},
4848
aiModel: {
4949
label: 'AI Model',
50-
placeholder: 'Please select an AI model',
51-
unavailable: '(Unavailable)',
52-
public: 'Public'
50+
placeholder: 'Please select an AI model'
5351
},
5452
roleSettings: {
5553
label: 'Role settings',
@@ -108,7 +106,6 @@ export default {
108106
},
109107
buttons: {
110108
publish: 'Save&Publish',
111-
paramSetting: 'Parameter Settings',
112109
addModel: 'Add Model'
113110
},
114111
dialog: {

ui/src/locales/lang/zh_CN/index.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,10 @@ export default {
3737
document: '文档',
3838
character: '字符',
3939
export: '导出',
40-
exportSuccess: '导出成功'
40+
exportSuccess: '导出成功',
41+
unavailable: '(不可用)',
42+
public: '公用',
43+
paramSetting: '参数设置'
4144
},
4245
login: {
4346
authentication: '登录认证',

0 commit comments

Comments
 (0)