Bläddra i källkod

fix: 全局提示词语音列表接入

王晓东 1 vecka sedan
förälder
incheckning
417b45c289
4 ändrade filer med 194 tillägg och 17 borttagningar
  1. 9 6
      src/api/modules/model.ts
  2. 62 0
      src/components/LangSelector.vue
  3. 108 0
      src/constant/i118.ts
  4. 15 11
      src/views/model/global-prompt/index.vue

+ 9 - 6
src/api/modules/model.ts

@@ -39,13 +39,16 @@ export async function fetchModelDetail(params: {id: string}){
   return res.data
 }
 
-export async function selectGlobalPrompt(){
-  return await request<string>(`/anycall/admin/selectGlobalPrompt`)
+export async function selectGlobalPrompt(params: {
+  i18nKey: string,
+}){
+  return await request<string>(`/anycall/admin/selectGlobalPrompt`,params)
 }
-export async function updateGlobalPrompt(globalPrompt: string){
-  return await request<string>(`/anycall/admin/updateGlobalPrompt`, {}, {
-    params: {'globalPrompt': globalPrompt}
-  })
+export async function updateGlobalPrompt(params: {
+  i18nKey: string,
+  text: string,
+}){
+  return await request<string>(`/anycall/admin/updateGlobalPrompt`, params)
 
 }
 

+ 62 - 0
src/components/LangSelector.vue

@@ -0,0 +1,62 @@
+<script setup lang="ts">
+import { languageList } from '@/constant/i118'
+
+
+// 定义组件属性
+interface Props {
+  modelValue?: string
+  disabled?: boolean
+  placeholder?: string
+  style?: string | object
+  className?: string
+}
+
+// 定义组件事件
+interface Emits {
+  (e: 'update:modelValue', value: string | undefined): void
+}
+
+// 设置默认属性
+const props = withDefaults(defineProps<Props>(), {
+  disabled: false,
+  placeholder: '请选择',
+  style: 'width: 140px;',
+})
+
+// 定义事件触发器
+const emit = defineEmits<Emits>()
+
+// 创建本地响应式变量用于v-model绑定
+const localValue = ref(props.modelValue)
+
+// 监听props中的modelValue变化,同步到本地变量
+watch(
+  () => props.modelValue,
+  (newValue) => {
+    localValue.value = newValue
+  },
+  { immediate: true }
+)
+
+
+const options = ref<Array<{value: string, name: string}>>(languageList.map(item => ({
+  value: item.countryCode,
+  name: item.chineseName
+})))
+
+</script>
+
+<template>
+  <el-select
+    v-model="localValue"
+    :placeholder="placeholder"
+    :style="style"
+    :disabled="disabled"
+    :class="className"
+    clearable
+    filterable
+    @update:model-value="(value) => emit('update:modelValue', value)"
+  >
+    <el-option v-for="item in options" :key="item.value" :label="item.name" :value="item.value" />
+  </el-select>
+</template>

+ 108 - 0
src/constant/i118.ts

@@ -0,0 +1,108 @@
+export const languageList = [
+  { localName: "العربية", languageName: "Arabic (Israel)", chineseName: "阿拉伯语(以色列)", countryCode: "ar_IL" },
+  { localName: "العربية", languageName: "Arabic (Egypt)", chineseName: "阿拉伯语(埃及)", countryCode: "ar_EG" },
+  { localName: "中文", languageName: "Chinese Simplified", chineseName: "中文简体", countryCode: "zh_CN" },
+  { localName: "中文", languageName: "Chinese Tradition", chineseName: "中文繁体", countryCode: "zh_TW" },
+  { localName: "中文", languageName: "Chinese", chineseName: "中文(香港)", countryCode: "zh_HK" },
+  { localName: "Nederlands", languageName: "Dutch (Netherlands)", chineseName: "荷兰语", countryCode: "nl_NL" },
+  { localName: "Nederlands", languageName: "Dutch (Belgium)", chineseName: "荷兰语(比利时)", countryCode: "nl_BE" },
+  { localName: "English", languageName: "English (United States)", chineseName: "英语(美国)", countryCode: "en_US" },
+  { localName: "English", languageName: "English (Australia)", chineseName: "英语(澳大利亚)", countryCode: "en_AU" },
+  { localName: "English", languageName: "English (Canada)", chineseName: "英语(加拿大)", countryCode: "en_CA" },
+  { localName: "English", languageName: "English (India)", chineseName: "英语(印度)", countryCode: "en_IN" },
+  { localName: "English", languageName: "English (Ireland)", chineseName: "英语(爱尔兰)", countryCode: "en_IE" },
+  { localName: "English", languageName: "English (New Zealand)", chineseName: "英语(新西兰)", countryCode: "en_NZ" },
+  { localName: "English", languageName: "English (Singapore)", chineseName: "英语(新加坡)", countryCode: "en_SG" },
+  { localName: "English", languageName: "English (South Africa)", chineseName: "英语(南非)", countryCode: "en_ZA" },
+  { localName: "English", languageName: "English (United Kingdom)", chineseName: "英语(英国)", countryCode: "en_GB" },
+  { localName: "Français", languageName: "French", chineseName: "法语", countryCode: "fr_FR" },
+  { localName: "Français", languageName: "French (Belgium)", chineseName: "法语(比利时)", countryCode: "fr_BE" },
+  { localName: "Français", languageName: "French (Canada)", chineseName: "法语(加拿大)", countryCode: "fr_CA" },
+  { localName: "Français", languageName: "French (Switzerland)", chineseName: "法语(瑞士)", countryCode: "fr_CH" },
+  { localName: "Deutsch", languageName: "German", chineseName: "德语", countryCode: "de_DE" },
+  { localName: "Deutsch", languageName: "German (Liechtenstein)", chineseName: "德语(列支敦士登)", countryCode: "de_LI" },
+  { localName: "Deutsch", languageName: "German (Austria)", chineseName: "德语(奥地利)", countryCode: "de_AT" },
+  { localName: "Deutsch", languageName: "German (Switzerland)", chineseName: "德语(瑞士)", countryCode: "de_CH" },
+  { localName: "Italiano", languageName: "Italian", chineseName: "意大利语", countryCode: "it_IT" },
+  { localName: "Italiano", languageName: "Italian (Switzerland)", chineseName: "意大利语(瑞士)", countryCode: "it_CH" },
+  { localName: "Português", languageName: "Portuguese (Brazil)", chineseName: "葡萄牙语(巴西)", countryCode: "pt_BR" },
+  { localName: "Português", languageName: "Portuguese", chineseName: "葡萄牙语", countryCode: "pt_PT" },
+  { localName: "Español", languageName: "Spanish", chineseName: "西班牙语", countryCode: "es_ES" },
+  { localName: "Español", languageName: "Spanish (United States)", chineseName: "西班牙语(美国)", countryCode: "es_US" },
+  { localName: "বাংলা", languageName: "Bengali", chineseName: "孟加拉语", countryCode: "bn_BD" },
+  { localName: "বাংলা", languageName: "Bengali (India)", chineseName: "孟加拉语(印度)", countryCode: "bn_IN" },
+  { localName: "hrvatski", languageName: "Croatian", chineseName: "克罗地亚语", countryCode: "hr_HR" },
+  { localName: "čeština", languageName: "Czech", chineseName: "捷克语", countryCode: "cs_CZ" },
+  { localName: "Dansk", languageName: "Danish", chineseName: "丹麦语", countryCode: "da_DK" },
+  { localName: "ελληνικά", languageName: "Greek", chineseName: "希腊语", countryCode: "el_GR" },
+  { localName: "עברית", languageName: "Hebrew (Israel)", chineseName: "希伯来语(以色列)", countryCode: "he_IL" },
+  { localName: "עברית", languageName: "Hebrew (Israel)", chineseName: "希伯来语(以色列)", countryCode: "iw_IL" },
+  { localName: "हिंदी", languageName: "Hindi", chineseName: "印度语", countryCode: "hi_IN" },
+  { localName: "Magyar", languageName: "Hungarian", chineseName: "匈牙利语", countryCode: "hu_HU" },
+  { localName: "", languageName: "Indonesian", chineseName: "印度尼西亚语", countryCode: "in_ID" },
+  { localName: "日本語", languageName: "Japanese", chineseName: "日语", countryCode: "ja_JP" },
+  { localName: "한국어", languageName: "Korean", chineseName: "韩语(朝鲜语)", countryCode: "ko_KR" },
+  { localName: "Bahasa Melayu", languageName: "Malay", chineseName: "马来语", countryCode: "ms_MY" },
+  { localName: "فارسی", languageName: "Persian", chineseName: "波斯语", countryCode: "fa_IR" },
+  { localName: "Polski", languageName: "Polish", chineseName: "波兰语", countryCode: "pl_PL" },
+  { localName: "româna", languageName: "Romanian", chineseName: "罗马尼亚语", countryCode: "ro_RO" },
+  { localName: "Русский", languageName: "Russian", chineseName: "俄罗斯语", countryCode: "ru_RU" },
+  { localName: "српски", languageName: "Serbian", chineseName: "塞尔维亚语", countryCode: "sr_RS" },
+  { localName: "Svenska", languageName: "Swedish", chineseName: "瑞典语", countryCode: "sv_SE" },
+  { localName: "ไทย", languageName: "Thai", chineseName: "泰语", countryCode: "th_TH" },
+  { localName: "Türkçe", languageName: "Turkish", chineseName: "土耳其语", countryCode: "tr_TR" },
+  { localName: "اردو", languageName: "Urdu", chineseName: "乌尔都语", countryCode: "ur_PK" },
+  { localName: "tiếng việt", languageName: "Vietnamese", chineseName: "越南语", countryCode: "vi_VN" },
+  { localName: "català", languageName: "Catalan", chineseName: "加泰隆语(西班牙)", countryCode: "ca_ES" },
+  { localName: "latviešu", languageName: "Latvian", chineseName: "拉脱维亚语", countryCode: "lv_LV" },
+  { localName: "Lietuvių", languageName: "Lithuanian", chineseName: "立陶宛语", countryCode: "lt_LT" },
+  { localName: "Norsk bokmål", languageName: "Norwegian", chineseName: "挪威语", countryCode: "nb_NO" },
+  { localName: "Slovenčina", languageName: "Slovak", chineseName: "斯洛伐克语", countryCode: "sk_SK" },
+  { localName: "Slovenščina", languageName: "Slovenian", chineseName: "斯洛文尼亚语", countryCode: "sl_SI" },
+  { localName: "български", languageName: "Bulgarian", chineseName: "保加利亚语", countryCode: "bg_BG" },
+  { localName: "українська", languageName: "Ukrainian", chineseName: "乌克兰语", countryCode: "uk_UA" },
+  { localName: "Tagalog", languageName: "Filipino", chineseName: "菲律宾语", countryCode: "tl_PH" },
+  { localName: "Suomi", languageName: "Finnish", chineseName: "芬兰语", countryCode: "fi_FI" },
+  { localName: "Afrikaans", languageName: "Afrikaans", chineseName: "南非语", countryCode: "af_ZA" },
+  { localName: "Rumantsch", languageName: "Romansh", chineseName: "罗曼什语(瑞士)", countryCode: "rm_CH" },
+  { localName: "ဗမာ", languageName: "Burmese (Zawgyi)", chineseName: "缅甸语(民间)", countryCode: "my_ZG" },
+  { localName: "ဗမာ", languageName: "Burmese (Padauk)", chineseName: "缅甸语(官方)", countryCode: "my_MM" },
+  { localName: "ខ្មែរ", languageName: "Khmer", chineseName: "柬埔寨语", countryCode: "km_KH" },
+  { localName: "አማርኛ", languageName: "Amharic", chineseName: "阿姆哈拉语(埃塞俄比亚)", countryCode: "am_ET" },
+  { localName: "беларуская", languageName: "Belarusian", chineseName: "白俄罗斯语", countryCode: "be_BY" },
+  { localName: "eesti", languageName: "Estonian", chineseName: "爱沙尼亚语", countryCode: "et_EE" },
+  { localName: "Kiswahili", languageName: "Swahili", chineseName: "斯瓦希里语(坦桑尼亚)", countryCode: "sw_TZ" },
+  { localName: "isiZulu", languageName: "Zulu", chineseName: "祖鲁语(南非)", countryCode: "zu_ZA" },
+  { localName: "azərbaycanca", languageName: "Azerbaijani", chineseName: "阿塞拜疆语", countryCode: "az_AZ" },
+  { localName: "Հայերէն", languageName: "Armenian", chineseName: "亚美尼亚语(亚美尼亚)", countryCode: "hy_AM" },
+  { localName: "ქართული", languageName: "Georgian", chineseName: "格鲁吉亚语(格鲁吉亚)", countryCode: "ka_GE" },
+  { localName: "ລາວ", languageName: "Laotian", chineseName: "老挝语(老挝)", countryCode: "lo_LA" },
+  { localName: "Монгол", languageName: "Mongolian", chineseName: "蒙古语", countryCode: "mn_MN" },
+  { localName: "नेपाली", languageName: "Nepali", chineseName: "尼泊尔语", countryCode: "ne_NP" },
+  { localName: "қазақ тілі", languageName: "Kazakh", chineseName: "哈萨克语", countryCode: "kk_KZ" },
+  { localName: "Galego", languageName: "Galician", chineseName: "加利西亚语", countryCode: "gl_ES" },
+  { localName: "íslenska", languageName: "Icelandic", chineseName: "冰岛语", countryCode: "is_IS" },
+  { localName: "ಕನ್ನಡ", languageName: "Kannada", chineseName: "坎纳达语", countryCode: "kn_IN" },
+  { localName: "кыргыз тили", languageName: "Kyrgyz", chineseName: "吉尔吉斯语", countryCode: "ky_KG" },
+  { localName: "മലയാളം", languageName: "Malayalam", chineseName: "马拉亚拉姆语", countryCode: "ml_IN" },
+  { localName: "मराठी", languageName: "Marathi", chineseName: "马拉提语", countryCode: "mr_IN" },
+  { localName: "தமிழ்", languageName: "Tamil", chineseName: "泰米尔语", countryCode: "ta_IN" },
+  { localName: "македонски јазик", languageName: "Macedonian", chineseName: "马其顿语", countryCode: "mk_MK" },
+  { localName: "తెలుగు", languageName: "Telugu", chineseName: "泰卢固语", countryCode: "te_IN" },
+  { localName: "Ўзбек тили", languageName: "Uzbek", chineseName: "乌兹别克语", countryCode: "uz_UZ" },
+  { localName: "Euskara", languageName: "Basque", chineseName: "巴斯克语", countryCode: "eu_ES" },
+  { localName: "සිංහල", languageName: "Sinhala", chineseName: "僧加罗语(斯里兰卡)", countryCode: "si_LK" }
+];
+
+// 使用示例:
+// 1. 获取所有国家码数组
+export const countryCodes = languageList.map(item => item.countryCode);
+
+// 2. 根据国家码查找语言信息
+export const getLanguageInfo = (code: string) => languageList.find(item => item.countryCode === code);
+
+// 3. 获取中文语言名称映射
+// export const chineseLanguageMap: Record<string, string> = {};
+// languageList.forEach(item => {
+//   chineseLanguageMap[item.countryCode] = item.chineseName;
+// });

+ 15 - 11
src/views/model/global-prompt/index.vue

@@ -4,14 +4,17 @@ import { ElButton, ElDialog, ElEmpty, ElInput, ElMessage, ElOption, ElPagination
 
 import { selectGlobalPrompt, updateGlobalPrompt } from '@/api/modules/model'
 import { toast } from 'vue-sonner'
+import LangSelector from '@/components/LangSelector.vue'
 
 const loading = ref(false)
 const input = ref<string>('')
+const lang = ref<string>('zh_CN')
+
 
 
 async function fetchData() {
   loading.value = true
-  const {code, data} = await selectGlobalPrompt()
+  const {code, data} = await selectGlobalPrompt({i18nKey: lang.value})
   if(code === 0){
     input.value = data
   }
@@ -20,7 +23,7 @@ async function fetchData() {
 
 
 async function handleSave () {
-  const {code, data} = await updateGlobalPrompt(input.value)
+  const {code, data} = await updateGlobalPrompt({i18nKey: lang.value, text: input.value})
   if(code === 0){
     toast.success('保存成功')
   }
@@ -38,15 +41,16 @@ onMounted(async () => {
 <template>
   <div class="absolute-container">
     <FaPageHeader title="全局提示词" />
-    <FaPageMain class="flex-1 overflow-auto" main-class="flex-1 flex flex-col overflow-auto">
-      <el-input
-        v-model="input"
-        style="width: 100%;"
-        :autosize="{ minRows: 2, maxRows: 4 }"
-        type="textarea"
-        placeholder="Please input"
-        class="mb-4"
-      />
+    <FaPageMain class="flex-1 overflow-auto" main-class="flex-1 flex flex-col overflow-auto gap-4">
+      <LangSelector v-model="lang"></LangSelector>
+        <el-input
+          v-model="input"
+          style="width: 100%;"
+          :autosize="{ minRows: 4, maxRows: 10 }"
+          type="textarea"
+          placeholder="Please input"
+          class="mb-4"
+        />
       <ElSpace>
         <ElButton type="primary" @click="handleSave">保存</ElButton>
       </ElSpace>