You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
1 lines
13 KiB
1 lines
13 KiB
import{g as oe,j as ie,c as a,l as p,a as e,k as d,p as m,F as r,r as u,v as F,t as i,q as G,n as N,d as de,s as c,x as ce,A as re,o,D as $,_ as ue}from"./CfpW9SkI.js";import{u as ve}from"./DSu8q42f.js";import{u as be}from"./CMwGY1Mu.js";import"./DL330dAC.js";const me={key:0,class:"mb-4 rounded-lg px-4 py-3 text-sm",style:{background:"#fffbeb",border:"1px solid #fde68a",color:"#92400e"}},xe={class:"flex items-center justify-between mb-5"},pe={class:"flex items-center gap-3"},fe=["value"],_e={class:"editor-panel"},ge={class:"flex items-center justify-between mb-4"},ye={class:"font-semibold text-slate-800 text-sm"},ke={class:"grid grid-cols-3 gap-4 mb-4"},he={class:"form-control"},Se=["value"],Te={class:"form-control"},Ce=["value"],we={class:"form-control"},Ae={class:"flex gap-3 mb-4"},Ve={key:0,class:"grid grid-cols-3 gap-4"},Me={class:"form-control"},je={key:0,value:""},Re=["value"],Ue={class:"form-control"},Ne={key:0,value:""},$e=["value"],Oe={class:"form-control"},Pe={key:0,value:""},ze=["value"],Be={key:1,class:"form-control max-w-xs"},De={key:0,value:""},Ee=["value"],Le={class:"flex items-center justify-between pt-4 border-t border-slate-100 mt-4"},Ie={class:"flex items-center gap-2 text-sm"},Fe={class:"grid grid-cols-1 gap-4",style:{"grid-template-columns":"repeat(auto-fill,minmax(360px,1fr))"}},Ge={key:0,class:"col-span-full text-center py-20 text-slate-300"},qe=["onClick"],He={class:"flex items-center justify-between"},Je={class:"flex items-center gap-2"},Ke={class:"lang-badge"},Qe={class:"text-slate-400 font-bold text-lg"},We={class:"lang-badge"},Xe={class:"flex items-center gap-2"},Ye={key:0,class:"mode-badge mode-pipeline"},Ze={key:1,class:"mode-badge mode-e2e"},et={key:2,class:"badge badge-success badge-xs"},tt={key:3,class:"badge badge-ghost badge-xs"},st=["onClick"],lt={key:0,class:"flex flex-wrap items-center gap-2 mt-3"},nt={class:"svc-pill",style:{background:"#1664ff"}},at={class:"svc-pill",style:{background:"#059669"}},ot={class:"svc-pill",style:{background:"#7c3aed"}},it={key:1,class:"flex items-center gap-2 mt-3"},dt={class:"svc-pill",style:{background:"#f97316"}},ct={class:"sync-overlay"},rt={class:"sync-box"},ut={class:"flex items-start gap-3 mb-4"},vt={style:{width:"42px",height:"42px",background:"linear-gradient(135deg,#4f46e5,#7c3aed)","border-radius":"13px",display:"flex","align-items":"center","justify-content":"center","flex-shrink":"0"}},bt={style:{width:"20px",height:"20px",color:"#fff"},fill:"none",viewBox:"0 0 24 24",stroke:"currentColor"},mt={class:"text-xs text-slate-400 mt-1"},xt={class:"flex items-center justify-between mb-1"},pt={class:"flex gap-2"},ft={class:"sync-region-grid"},_t=["onClick"],gt=["checked","onClick"],q=1,H=2,J=3,K=4,yt=oe({__name:"calltranslate",setup(kt){const j=[{c:"zh",n:"中文"},{c:"en",n:"英文"},{c:"ja",n:"日语"},{c:"ko",n:"韩语"},{c:"fr",n:"法语"},{c:"de",n:"德语"},{c:"es",n:"西班牙语"},{c:"pt",n:"葡萄牙语"},{c:"ru",n:"俄语"},{c:"ar",n:"阿拉伯语"},{c:"th",n:"泰语"},{c:"vi",n:"越南语"},{c:"id",n:"印尼语"},{c:"ms",n:"马来语"},{c:"hi",n:"印地语"}];function h(l){const t=j.find(s=>s.c===l);return t?t.n:l||""}const f=[{value:1,label:"中国"},{value:2,label:"美国"},{value:3,label:"东亚"},{value:4,label:"东南亚"},{value:5,label:"南亚"},{value:6,label:"中东"},{value:7,label:"欧洲"},{value:8,label:"俄罗斯"},{value:9,label:"非洲"},{value:10,label:"南美"},{value:11,label:"北美"},{value:12,label:"大洋洲"},{value:13,label:"巴西"},{value:14,label:"印度"}];function Q(l){const t=f.find(s=>s.value===l);return t?t.label:"区域"+l}const{webApi:_}=ve(),{success:S,error:T}=be(),R=c(!0),C=c([]),g=c([]),y=c(f.length?f[0].value:1),w=c(!1),x=c(null),O=c(0),n=ce({src:"zh",dst:"en",bidir:!1,mode:0,asr:"",mt:"",tts:"",ast:"",enable:!0});async function W(){try{const l=await _("getsvcconfigs",{});C.value=l?.items??[]}catch{R.value=!1,C.value=[]}}async function A(){try{const l=await _("getcalltranslatepairs",{region:y.value});g.value=l?.items??[]}catch{R.value=!1,g.value=[]}}function v(l){return C.value.filter(t=>t.enable&&(t.categories||"").split(",").map(Number).indexOf(l)>=0)}function V(l){const t=C.value.find(s=>s.id===l);return t?t.name:l||"未配置"}function P(l){n.src=l?.src_lang||"zh",n.dst=l?.dst_lang||"en",n.bidir=!!l?.bidir,n.mode=l?.mode!=null?l.mode:0,n.asr=l?.asr_svc_id||"",n.mt=l?.mt_svc_id||"",n.tts=l?.tts_svc_id||"",n.ast=l?.ast_svc_id||"",n.enable=l?l.enable!==!1:!0}function X(){x.value=null,P(null),w.value=!0}function Y(l){const t=g.value.find(s=>s.id===l)||null;x.value=t,P(t),w.value=!0}function M(){w.value=!1,x.value=null}function Z(){const l=n.mode;return{id:x.value?x.value.id:0,region:y.value,src_lang:n.src,dst_lang:n.dst,bidir:n.bidir,mode:l,asr_svc_id:l===0&&n.asr||"",mt_svc_id:l===0&&n.mt||"",tts_svc_id:l===0&&n.tts||"",ast_svc_id:l===1&&n.ast||"",enable:n.enable}}async function z(){const l=Z();if(!l.src_lang||!l.dst_lang)return T("源语言和目标语言必填"),!1;try{const t=await _("savecalltranslatepair",l);return O.value=t?.id??0,await A(),!0}catch(t){return T(t?.message??"保存失败"),!1}}function ee(l){window.confirm("确定删除这条语言对配置?")&&_("delcalltranslatepair",{ids:[l]}).then(()=>{S("已删除"),A()}).catch(t=>T(t?.message??"删除失败"))}const U=c(!1),B=c(""),b=c([]),D=re(()=>f.filter(l=>l.value!==y.value));function te(){const l=n.mode===0?"三段式拼接":"端到端 AST";B.value="将「"+h(n.src)+" → "+h(n.dst)+"」("+l+(n.bidir?",双向":"")+" )的服务编排同步到其他区域。",b.value=[],U.value=!0}function E(l){const t=b.value.indexOf(l);t>=0?b.value.splice(t,1):b.value.push(l)}function L(l){b.value=l?D.value.map(t=>t.value):[]}function I(){U.value=!1}async function se(){I(),await z()&&(M(),S("保存成功"))}async function le(){const l=[...b.value];if(I(),!!await z()){if(M(),!l.length){S("保存成功");return}try{const k=(await _("synccalltranslatepairs",{pair_ids:[O.value],target_regions:l}))?.synced??0,ne=l.map(ae=>Q(ae));S("已保存并同步到:"+ne.join("、")+"("+k+" 个)")}catch(s){T(s?.message??"同步失败")}}}return ie(async()=>{await Promise.all([W(),A()])}),(l,t)=>(o(),a("div",null,[R.value?p("",!0):(o(),a("div",me," ⚠ 「通话翻译配置」的后端接口尚未迁移到当前 console 服务,功能暂不可用。 ")),e("div",xe,[t[14]||(t[14]=e("div",null,[e("h2",{class:"text-lg font-semibold text-slate-800"},"通话翻译配置"),e("p",{class:"text-xs text-slate-400 mt-1"},"按区域和语言对配置翻译服务。支持三段式(ASR→MT→TTS)和端到端 AST 两种模式。")],-1)),e("div",pe,[t[13]||(t[13]=e("span",{class:"text-sm text-slate-500"},"区域",-1)),d(e("select",{"onUpdate:modelValue":t[0]||(t[0]=s=>y.value=s),class:"select select-bordered select-sm",onChange:A},[(o(),a(r,null,u(f,s=>e("option",{key:s.value,value:s.value},i(s.label),9,fe)),64))],544),[[m,y.value,void 0,{number:!0}]]),e("button",{class:"btn btn-primary btn-sm text-white",onClick:X},"+ 新增语言对")])]),d(e("div",_e,[e("div",ge,[e("h3",ye,i(x.value?"编辑语言对":"新增语言对"),1),e("button",{class:"btn btn-ghost btn-xs",onClick:M},"✕ 关闭")]),e("div",ke,[e("div",he,[t[15]||(t[15]=e("label",{class:"label py-1"},[e("span",{class:"label-text text-xs"},"源语言 *")],-1)),d(e("select",{"onUpdate:modelValue":t[1]||(t[1]=s=>n.src=s),class:"select select-bordered select-sm"},[(o(),a(r,null,u(j,s=>e("option",{key:s.c,value:s.c},i(s.n),9,Se)),64))],512),[[m,n.src]])]),e("div",Te,[t[16]||(t[16]=e("label",{class:"label py-1"},[e("span",{class:"label-text text-xs"},"目标语言 *")],-1)),d(e("select",{"onUpdate:modelValue":t[2]||(t[2]=s=>n.dst=s),class:"select select-bordered select-sm"},[(o(),a(r,null,u(j,s=>e("option",{key:s.c,value:s.c},i(s.n),9,Ce)),64))],512),[[m,n.dst]])]),e("div",we,[t[17]||(t[17]=e("label",{class:"label py-1"},[e("span",{class:"label-text text-xs"},"双向")],-1)),d(e("input",{"onUpdate:modelValue":t[3]||(t[3]=s=>n.bidir=s),type:"checkbox",class:"toggle toggle-primary mt-1"},null,512),[[G,n.bidir]])])]),e("div",Ae,[e("div",{class:N(["mtab",{on:n.mode===0}]),onClick:t[4]||(t[4]=s=>n.mode=0)},[...t[18]||(t[18]=[e("div",null,[e("div",{class:"font-bold text-sm"},"🧩 三段式拼接"),e("div",{class:"text-xs text-slate-400 mt-0.5"},"ASR → MT → TTS")],-1)])],2),e("div",{class:N(["mtab",{on:n.mode===1}]),onClick:t[5]||(t[5]=s=>n.mode=1)},[...t[19]||(t[19]=[e("div",null,[e("div",{class:"font-bold text-sm"},"⚡ 端到端 AST"),e("div",{class:"text-xs text-slate-400 mt-0.5"},"单服务直接完成语音翻译")],-1)])],2)]),e("div",null,[n.mode===0?(o(),a("div",Ve,[e("div",Me,[t[20]||(t[20]=e("label",{class:"label py-1"},[e("span",{class:"label-text text-xs"},"语音识别(ASR)")],-1)),d(e("select",{"onUpdate:modelValue":t[6]||(t[6]=s=>n.asr=s),class:"select select-bordered select-sm"},[v(q).length?p("",!0):(o(),a("option",je,"(无可用服务)")),(o(!0),a(r,null,u(v(q),s=>(o(),a("option",{key:s.id,value:s.id},i(s.name),9,Re))),128))],512),[[m,n.asr]])]),e("div",Ue,[t[21]||(t[21]=e("label",{class:"label py-1"},[e("span",{class:"label-text text-xs"},"机器翻译(MT)")],-1)),d(e("select",{"onUpdate:modelValue":t[7]||(t[7]=s=>n.mt=s),class:"select select-bordered select-sm"},[v(J).length?p("",!0):(o(),a("option",Ne,"(无可用服务)")),(o(!0),a(r,null,u(v(J),s=>(o(),a("option",{key:s.id,value:s.id},i(s.name),9,$e))),128))],512),[[m,n.mt]])]),e("div",Oe,[t[22]||(t[22]=e("label",{class:"label py-1"},[e("span",{class:"label-text text-xs"},"语音合成(TTS)")],-1)),d(e("select",{"onUpdate:modelValue":t[8]||(t[8]=s=>n.tts=s),class:"select select-bordered select-sm"},[v(H).length?p("",!0):(o(),a("option",Pe,"(无可用服务)")),(o(!0),a(r,null,u(v(H),s=>(o(),a("option",{key:s.id,value:s.id},i(s.name),9,ze))),128))],512),[[m,n.tts]])])])):(o(),a("div",Be,[t[23]||(t[23]=e("label",{class:"label py-1"},[e("span",{class:"label-text text-xs"},"端到端语音翻译服务(AST)")],-1)),d(e("select",{"onUpdate:modelValue":t[9]||(t[9]=s=>n.ast=s),class:"select select-bordered select-sm"},[v(K).length?p("",!0):(o(),a("option",De,"(无可用服务)")),(o(!0),a(r,null,u(v(K),s=>(o(),a("option",{key:s.id,value:s.id},i(s.name),9,Ee))),128))],512),[[m,n.ast]])]))]),e("div",Le,[e("label",Ie,[d(e("input",{"onUpdate:modelValue":t[10]||(t[10]=s=>n.enable=s),type:"checkbox",class:"checkbox checkbox-sm checkbox-primary"},null,512),[[G,n.enable]]),t[24]||(t[24]=de(" 启用 ",-1))]),e("div",{class:"flex gap-2"},[e("button",{class:"btn btn-ghost btn-sm",onClick:M},"取消"),e("button",{class:"btn btn-primary btn-sm text-white",onClick:te},"保存")])])],512),[[F,w.value]]),e("div",Fe,[g.value.length?p("",!0):(o(),a("div",Ge,[...t[25]||(t[25]=[e("div",{class:"text-5xl mb-3"},"🌐",-1),e("p",{class:"text-sm"},"当前区域暂无语言对配置",-1)])])),(o(!0),a(r,null,u(g.value,s=>(o(),a("div",{key:s.id,class:"pair-card",onClick:k=>Y(s.id)},[e("div",He,[e("div",Je,[e("span",Ke,i(h(s.src_lang)),1),e("span",Qe,i(s.bidir?"⇄":"→"),1),e("span",We,i(h(s.dst_lang)),1)]),e("div",Xe,[s.mode===0?(o(),a("span",Ye,"三段式拼接")):(o(),a("span",Ze,"端到端 AST")),s.enable?(o(),a("span",et,"启用")):(o(),a("span",tt,"停用")),e("button",{class:"btn btn-ghost btn-xs text-error",onClick:$(k=>ee(s.id),["stop"])},"删除",8,st)])]),s.mode===0?(o(),a("div",lt,[e("span",nt,"ASR: "+i(V(s.asr_svc_id)),1),t[26]||(t[26]=e("span",{class:"text-slate-300 text-sm"},"→",-1)),e("span",at,"MT: "+i(V(s.mt_svc_id)),1),t[27]||(t[27]=e("span",{class:"text-slate-300 text-sm"},"→",-1)),e("span",ot,"TTS: "+i(V(s.tts_svc_id)),1)])):(o(),a("div",it,[e("span",dt,"AST: "+i(V(s.ast_svc_id)),1)]))],8,qe))),128))]),d(e("div",ct,[e("div",rt,[e("div",ut,[e("div",vt,[(o(),a("svg",bt,[...t[28]||(t[28]=[e("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M8 16H6a2 2 0 01-2-2V6a2 2 0 012-2h8a2 2 0 012 2v2m-6 12h8a2 2 0 002-2v-8a2 2 0 00-2-2h-8a2 2 0 00-2 2v8a2 2 0 002 2z"},null,-1)])]))]),e("div",null,[t[29]||(t[29]=e("h3",{class:"text-base font-semibold text-slate-800"},"同步到其他区域",-1)),e("p",mt,i(B.value),1)])]),t[31]||(t[31]=e("div",{class:"text-xs px-3 py-2 rounded-lg mb-3",style:{background:"#f0fdf4",border:"1px solid #bbf7d0",color:"#15803d"}}," ✦ 同步内容:服务组合(模式 + 各段服务)将被复制到目标区域。 ",-1)),e("div",xt,[t[30]||(t[30]=e("span",{class:"text-xs font-semibold text-slate-500"},"选择目标区域",-1)),e("div",pt,[e("button",{class:"btn btn-ghost btn-xs",onClick:t[11]||(t[11]=s=>L(!0))},"全选"),e("button",{class:"btn btn-ghost btn-xs",onClick:t[12]||(t[12]=s=>L(!1))},"清空")])]),e("div",ft,[(o(!0),a(r,null,u(D.value,s=>(o(),a("label",{key:s.value,class:N(["sync-region-item",{checked:b.value.includes(s.value)}]),onClick:$(k=>E(s.value),["prevent"])},[e("input",{type:"checkbox",class:"checkbox checkbox-xs checkbox-primary",checked:b.value.includes(s.value),onClick:$(k=>E(s.value),["stop"])},null,8,gt),e("span",null,i(s.label),1)],10,_t))),128))]),t[32]||(t[32]=e("p",{class:"text-[11px] text-slate-400 mb-5"},"⚠ 目标区域相同语言对已存在则覆盖,否则新建。",-1)),e("div",{class:"flex gap-3 justify-end"},[e("button",{class:"btn btn-ghost",onClick:se},"仅保存当前区域"),e("button",{class:"btn btn-primary text-white",onClick:le},"保存并同步")])])],512),[[F,U.value]])]))}}),wt=ue(yt,[["__scopeId","data-v-51f11136"]]);export{wt as default};
|
|
|