Merged latest locale from main

This commit is contained in:
Donald Zou 2025-04-20 02:37:54 +08:00
parent 6681303450
commit 149a8e910d
78 changed files with 2206 additions and 162 deletions

View File

@ -1 +1 @@
import{_ as r,c as i,d as o,w as e,k as l,a as t,j as _,i as a,l as d,S as u}from"./index-BhuLDFPZ.js";const m={name:"configuration"},p={class:"mt-md-5 mt-3 text-body"};function f(k,x,h,w,$,v){const n=l("RouterView");return t(),i("div",p,[o(n,null,{default:e(({Component:s,route:c})=>[o(_,{name:"fade2",mode:"out-in"},{default:e(()=>[(t(),a(u,null,{default:e(()=>[(t(),a(d(s),{key:c.path}))]),_:2},1024))]),_:2},1024)]),_:1})])}const B=r(m,[["render",f]]);export{B as default};
import{_ as r,c as i,d as o,w as e,k as l,a as t,j as _,i as a,l as d,S as u}from"./index-yyrQoDaj.js";const m={name:"configuration"},p={class:"mt-md-5 mt-3 text-body"};function f(k,x,h,w,$,v){const n=l("RouterView");return t(),i("div",p,[o(n,null,{default:e(({Component:s,route:c})=>[o(_,{name:"fade2",mode:"out-in"},{default:e(()=>[(t(),a(u,null,{default:e(()=>[(t(),a(d(s),{key:c.path}))]),_:2},1024))]),_:2},1024)]),_:1})])}const B=r(m,[["render",f]]);export{B as default};

View File

@ -1 +1 @@
.fade-enter-active[data-v-6451623a]{transition-delay:var(--d75b06ae)!important}.progress-bar[data-v-c7f6d1a1]{width:0;transition:all 1s cubic-bezier(.42,0,.22,1)}.filter a[data-v-0ac2bdcc]{text-decoration:none}
.fade-enter-active[data-v-6451623a]{transition-delay:var(--d75b06ae)!important}.progress-bar[data-v-c7f6d1a1]{width:0;transition:all 1s cubic-bezier(.42,0,.22,1)}.filter a[data-v-ea61b607]{text-decoration:none}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -1,4 +1,4 @@
import{P as Ws,Q as Vs,R as Ue,U as Hn,r as Wn,o as Vn,V as Nn,H as jn,X as Xe,Y as $n,Z as Ns}from"./index-BhuLDFPZ.js";/*!
import{P as Ws,Q as Vs,R as Ue,U as Hn,r as Wn,o as Vn,V as Nn,H as jn,X as Xe,Y as $n,Z as Ns}from"./index-yyrQoDaj.js";/*!
* @kurkle/color v0.3.2
* https://github.com/kurkle/color#readme
* (c) 2023 Jukka Kurkela

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -1 +1 @@
import{_ as e,G as t,a as o,c as a,t as c}from"./index-BhuLDFPZ.js";const s={name:"localeText",props:{t:""},computed:{getLocaleText(){return t(this.t)}}};function n(r,p,l,_,i,x){return o(),a("span",null,c(this.getLocaleText),1)}const u=e(s,[["render",n]]);export{u as L};
import{_ as e,G as t,a as o,c as a,t as c}from"./index-yyrQoDaj.js";const s={name:"localeText",props:{t:""},computed:{getLocaleText(){return t(this.t)}}};function n(r,p,l,_,i,x){return o(),a("span",null,c(this.getLocaleText),1)}const u=e(s,[["render",n]]);export{u as L};

View File

@ -1 +1 @@
import{L as l}from"./localeText-CboImmci.js";import{d as c}from"./dayjs.min-KZ0VlFnQ.js";import{_ as h,a as o,c as a,b as e,d as i,w as u,f as p,t as n,j as g,n as f,k as _}from"./index-BhuLDFPZ.js";const x={name:"message",methods:{dayjs:c,hide(){this.ct(),this.message.show=!1},show(){this.timeout=setTimeout(()=>{this.message.show=!1},5e3)},ct(){clearTimeout(this.timeout)}},components:{LocaleText:l},props:{message:Object},mounted(){this.show()},data(){return{dismiss:!1,timeout:null}}},v=["id"],b={key:0,class:"d-flex"},w={class:"fw-bold d-block",style:{"text-transform":"uppercase"}},y={class:"ms-auto"},k={key:1},T={class:"card-body d-flex align-items-center gap-3"};function M(j,s,C,L,t,m){const d=_("LocaleText");return o(),a("div",{onMouseenter:s[1]||(s[1]=r=>{t.dismiss=!0,this.ct()}),onMouseleave:s[2]||(s[2]=r=>{t.dismiss=!1,this.show()}),class:"card shadow rounded-3 position-relative message ms-auto",id:this.message.id},[e("div",{class:f([{"text-bg-danger":this.message.type==="danger","text-bg-success":this.message.type==="success","text-bg-warning":this.message.type==="warning"},"card-header pos"])},[i(g,{name:"zoom",mode:"out-in"},{default:u(()=>[t.dismiss?(o(),a("div",k,[e("small",{onClick:s[0]||(s[0]=r=>m.hide()),class:"d-block mx-auto w-100 text-center",style:{cursor:"pointer"}},[s[3]||(s[3]=e("i",{class:"bi bi-x-lg me-2"},null,-1)),i(d,{t:"Dismiss"})])])):(o(),a("div",b,[e("small",w,[i(d,{t:"FROM "}),p(" "+n(this.message.from),1)]),e("small",y,n(m.dayjs().format("hh:mm A")),1)]))]),_:1})],2),e("div",T,[e("div",null,n(this.message.content),1)])],40,v)}const z=h(x,[["render",M],["__scopeId","data-v-94c76b54"]]);export{z as M};
import{L as l}from"./localeText-DHIWqoQC.js";import{d as c}from"./dayjs.min-DJEnruGQ.js";import{_ as h,a as o,c as a,b as e,d as i,w as u,f as p,t as n,j as g,n as f,k as _}from"./index-yyrQoDaj.js";const x={name:"message",methods:{dayjs:c,hide(){this.ct(),this.message.show=!1},show(){this.timeout=setTimeout(()=>{this.message.show=!1},5e3)},ct(){clearTimeout(this.timeout)}},components:{LocaleText:l},props:{message:Object},mounted(){this.show()},data(){return{dismiss:!1,timeout:null}}},v=["id"],b={key:0,class:"d-flex"},w={class:"fw-bold d-block",style:{"text-transform":"uppercase"}},y={class:"ms-auto"},k={key:1},T={class:"card-body d-flex align-items-center gap-3"};function M(j,s,C,L,t,m){const d=_("LocaleText");return o(),a("div",{onMouseenter:s[1]||(s[1]=r=>{t.dismiss=!0,this.ct()}),onMouseleave:s[2]||(s[2]=r=>{t.dismiss=!1,this.show()}),class:"card shadow rounded-3 position-relative message ms-auto",id:this.message.id},[e("div",{class:f([{"text-bg-danger":this.message.type==="danger","text-bg-success":this.message.type==="success","text-bg-warning":this.message.type==="warning"},"card-header pos"])},[i(g,{name:"zoom",mode:"out-in"},{default:u(()=>[t.dismiss?(o(),a("div",k,[e("small",{onClick:s[0]||(s[0]=r=>m.hide()),class:"d-block mx-auto w-100 text-center",style:{cursor:"pointer"}},[s[3]||(s[3]=e("i",{class:"bi bi-x-lg me-2"},null,-1)),i(d,{t:"Dismiss"})])])):(o(),a("div",b,[e("small",w,[i(d,{t:"FROM "}),p(" "+n(this.message.from),1)]),e("small",y,n(m.dayjs().format("hh:mm A")),1)]))]),_:1})],2),e("div",T,[e("div",null,n(this.message.content),1)])],40,v)}const z=h(x,[["render",M],["__scopeId","data-v-94c76b54"]]);export{z as M};

View File

@ -1 +0,0 @@
.protocolBtnGroup a[data-v-141f725f]{transition:all .2s ease-in-out}

View File

@ -0,0 +1 @@
.protocolBtnGroup a[data-v-b4bbbc2b]{transition:all .2s ease-in-out}

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1 @@
import{_ as v,D as g,r as o,o as h,J as x,g as y,a as i,c as n,b as s,d as c,n as w,e as C,w as k,j as F}from"./index-yyrQoDaj.js";import{L as T}from"./localeText-DHIWqoQC.js";import"./browser-CjSdxGTc.js";const M={class:"peerSettingContainer w-100 h-100 position-absolute top-0 start-0"},S={class:"container d-flex h-100 w-100"},D={class:"m-auto modal-dialog-centered dashboardModal justify-content-center"},P={class:"card rounded-3 shadow w-100"},j={class:"card-header bg-transparent d-flex align-items-center gap-2 border-0 p-4 pb-0"},B={class:"mb-0"},G={class:"card-body p-4 d-flex flex-column gap-3"},L={style:{height:"300px"},class:"d-flex"},N=["value"],V={key:0,class:"spinner-border m-auto",role:"status"},I={class:"d-flex"},W=["disabled"],$={key:0,class:"d-block"},q={key:1,class:"d-block",id:"check"},z={__name:"peerConfigurationFile",props:{selectedPeer:Object},emits:["close"],setup(u,{emit:p}){const m=p,f=u,r=g(),t=o(!1),l=o(""),a=o(!0);o({error:!1,message:void 0}),h(()=>{const d=x();y("/api/downloadPeer/"+d.params.id,{id:f.selectedPeer.id},e=>{e.status?(l.value=e.data.file,a.value=!1):this.dashboardStore.newMessage("Server",e.message,"danger")})});const b=async()=>{navigator.clipboard&&navigator.clipboard.writeText?navigator.clipboard.writeText(l.value).then(()=>{t.value=!0,setTimeout(()=>{t.value=!1},3e3)}).catch(()=>{r.newMessage("WGDashboard","Failed to copy","danger")}):(document.querySelector("#peerConfigurationFile").select(),document.execCommand("copy")?(t.value=!0,setTimeout(()=>{t.value=!1},3e3)):r.newMessage("WGDashboard","Failed to copy","danger"))};return(d,e)=>(i(),n("div",M,[s("div",S,[s("div",D,[s("div",P,[s("div",j,[s("h4",B,[c(T,{t:"Peer Configuration File"})]),s("button",{type:"button",class:"btn-close ms-auto",onClick:e[0]||(e[0]=_=>m("close"))})]),s("div",G,[s("div",L,[s("textarea",{style:{height:"300px"},class:w(["form-control w-100 rounded-3 animate__fadeIn animate__faster animate__animated",{"d-none":a.value}]),id:"peerConfigurationFile",value:l.value},null,10,N),a.value?(i(),n("div",V,e[2]||(e[2]=[s("span",{class:"visually-hidden"},"Loading...",-1)]))):C("",!0)]),s("div",I,[s("button",{onClick:e[1]||(e[1]=_=>b()),disabled:t.value||a.value,class:"ms-auto btn bg-primary-subtle border-primary-subtle text-primary-emphasis rounded-3 position-relative"},[c(F,{name:"slide-up",mode:"out-in"},{default:k(()=>[t.value?(i(),n("span",q,e[4]||(e[4]=[s("i",{class:"bi bi-check-circle-fill"},null,-1)]))):(i(),n("span",$,e[3]||(e[3]=[s("i",{class:"bi bi-clipboard-fill"},null,-1)])))]),_:1})],8,W)])])])])])]))}},R=v(z,[["__scopeId","data-v-b0ea2d46"]]);export{R as default};

View File

@ -0,0 +1 @@
.slide-up-enter-active[data-v-b0ea2d46],.slide-up-leave-active[data-v-b0ea2d46]{transition:all .2s cubic-bezier(.42,0,.22,1)}.slide-up-enter-from[data-v-b0ea2d46],.slide-up-leave-to[data-v-b0ea2d46]{opacity:0;transform:scale(.9)}@keyframes spin-b0ea2d46{0%{transform:rotate(0)}to{transform:rotate(360deg)}}#check[data-v-b0ea2d46]{animation:cubic-bezier(.42,0,.22,1.3) .7s spin-b0ea2d46}

View File

@ -1 +0,0 @@
import{_ as v,D as g,r as o,o as h,J as y,g as x,a as i,c as n,b as s,d as c,w,j as C,n as k,e as F}from"./index-BhuLDFPZ.js";import{L as T}from"./localeText-CboImmci.js";import"./browser-CjSdxGTc.js";const M={class:"peerSettingContainer w-100 h-100 position-absolute top-0 start-0"},S={class:"container d-flex h-100 w-100"},D={class:"m-auto modal-dialog-centered dashboardModal justify-content-center"},P={class:"card rounded-3 shadow w-100"},j={class:"card-header bg-transparent d-flex align-items-center gap-2 border-0 p-4 pb-0"},B={class:"mb-0"},G={class:"card-body p-4"},L={class:"d-flex"},N=["disabled"],V={key:0,class:"d-block"},I={key:1,class:"d-block",id:"check"},W={style:{height:"300px"},class:"d-flex"},$=["value"],q={key:0,class:"spinner-border m-auto",role:"status"},z={__name:"peerConfigurationFile",props:{selectedPeer:Object},emits:["close"],setup(u,{emit:p}){const m=p,f=u,r=g(),t=o(!1),l=o(""),a=o(!0);o({error:!1,message:void 0}),h(()=>{const d=y();x("/api/downloadPeer/"+d.params.id,{id:f.selectedPeer.id},e=>{e.status?(l.value=e.data.file,a.value=!1):this.dashboardStore.newMessage("Server",e.message,"danger")})});const _=async()=>{navigator.clipboard&&navigator.clipboard.writeText?navigator.clipboard.writeText(l.value).then(()=>{t.value=!0,setTimeout(()=>{t.value=!1},3e3)}).catch(()=>{r.newMessage("WGDashboard","Failed to copy","danger")}):(document.querySelector("#peerConfigurationFile").select(),document.execCommand("copy")?(t.value=!0,setTimeout(()=>{t.value=!1},3e3)):r.newMessage("WGDashboard","Failed to copy","danger"))};return(d,e)=>(i(),n("div",M,[s("div",S,[s("div",D,[s("div",P,[s("div",j,[s("h4",B,[c(T,{t:"Peer Configuration File"})]),s("button",{type:"button",class:"btn-close ms-auto",onClick:e[0]||(e[0]=b=>m("close"))})]),s("div",G,[s("div",L,[s("button",{onClick:e[1]||(e[1]=b=>_()),disabled:t.value||a.value,class:"ms-auto btn bg-primary-subtle border-primary-subtle text-primary-emphasis rounded-3 position-relative"},[c(C,{name:"slide-up",mode:"out-in"},{default:w(()=>[t.value?(i(),n("span",I,e[3]||(e[3]=[s("i",{class:"bi bi-check-circle-fill"},null,-1)]))):(i(),n("span",V,e[2]||(e[2]=[s("i",{class:"bi bi-clipboard-fill"},null,-1)])))]),_:1})],8,N)]),s("div",W,[s("textarea",{style:{height:"300px"},class:k(["form-control w-100 rounded-3 mt-2 animate__fadeIn animate__faster animate__animated",{"d-none":a.value}]),id:"peerConfigurationFile",value:l.value},null,10,$),a.value?(i(),n("div",q,e[4]||(e[4]=[s("span",{class:"visually-hidden"},"Loading...",-1)]))):F("",!0)])])])])])]))}},R=v(z,[["__scopeId","data-v-9dd98f87"]]);export{R as default};

View File

@ -1 +0,0 @@
.slide-up-enter-active[data-v-9dd98f87],.slide-up-leave-active[data-v-9dd98f87]{transition:all .2s cubic-bezier(.42,0,.22,1)}.slide-up-enter-from[data-v-9dd98f87],.slide-up-leave-to[data-v-9dd98f87]{opacity:0;transform:scale(.9)}@keyframes spin-9dd98f87{0%{transform:rotate(0)}to{transform:rotate(360deg)}}#check[data-v-9dd98f87]{animation:cubic-bezier(.42,0,.22,1.3) .7s spin-9dd98f87}

View File

@ -1 +1 @@
import{S as p,a as b}from"./schedulePeerJob-j3-qqoKu.js";import{_ as h,W as u,z as m,k as i,a as o,c as a,b as e,d as r,w as _,F as v,h as f,i as J,e as x,T as g}from"./index-BhuLDFPZ.js";import{L as w}from"./localeText-CboImmci.js";import"./vue-datepicker-BHE6PN59.js";import"./dayjs.min-KZ0VlFnQ.js";const P={name:"peerJobs",setup(){return{store:u()}},props:{selectedPeer:Object},components:{LocaleText:w,SchedulePeerJob:p,ScheduleDropdown:b},data(){return{}},methods:{deleteJob(d){this.selectedPeer.jobs=this.selectedPeer.jobs.filter(t=>t.JobID!==d.JobID)},addJob(){this.selectedPeer.jobs.unshift(JSON.parse(JSON.stringify({JobID:m().toString(),Configuration:this.selectedPeer.configuration.Name,Peer:this.selectedPeer.id,Field:this.store.PeerScheduleJobs.dropdowns.Field[0].value,Operator:this.store.PeerScheduleJobs.dropdowns.Operator[0].value,Value:"",CreationDate:"",ExpireDate:"",Action:this.store.PeerScheduleJobs.dropdowns.Action[0].value})))}}},S={class:"peerSettingContainer w-100 h-100 position-absolute top-0 start-0 overflow-y-scroll"},y={class:"container d-flex h-100 w-100"},$={class:"m-auto modal-dialog-centered dashboardModal"},C={class:"card rounded-3 shadow",style:{width:"700px"}},D={class:"card-header bg-transparent d-flex align-items-center gap-2 border-0 p-4 pb-2"},k={class:"mb-0 fw-normal"},j={class:"card-body px-4 pb-4 pt-2 position-relative"},T={class:"d-flex align-items-center mb-3"},N={class:"card shadow-sm",key:"none",style:{height:"153px"}},I={class:"card-body text-muted text-center d-flex"},L={class:"m-auto"};function O(d,t,B,F,V,A){const n=i("LocaleText"),l=i("SchedulePeerJob");return o(),a("div",S,[e("div",y,[e("div",$,[e("div",C,[e("div",D,[e("h4",k,[r(n,{t:"Schedule Jobs"})]),e("button",{type:"button",class:"btn-close ms-auto",onClick:t[0]||(t[0]=s=>this.$emit("close"))})]),e("div",j,[e("div",T,[e("button",{class:"btn bg-primary-subtle border-1 border-primary-subtle text-primary-emphasis rounded-3 shadow",onClick:t[1]||(t[1]=s=>this.addJob())},[t[3]||(t[3]=e("i",{class:"bi bi-plus-lg me-2"},null,-1)),r(n,{t:"Job"})])]),r(g,{name:"schedulePeerJobTransition",tag:"div",class:"position-relative"},{default:_(()=>[(o(!0),a(v,null,f(this.selectedPeer.jobs,(s,E)=>(o(),J(l,{onRefresh:t[2]||(t[2]=c=>this.$emit("refresh")),onDelete:c=>this.deleteJob(s),dropdowns:this.store.PeerScheduleJobs.dropdowns,key:s.JobID,pjob:s},null,8,["onDelete","dropdowns","pjob"]))),128)),this.selectedPeer.jobs.length===0?(o(),a("div",N,[e("div",I,[e("h6",L,[r(n,{t:"This peer does not have any job yet."})])])])):x("",!0)]),_:1})])])])])])}const q=h(P,[["render",O],["__scopeId","data-v-5bbdd42b"]]);export{q as default};
import{S as p,a as b}from"./schedulePeerJob-BC1EhzEd.js";import{_ as h,W as u,z as m,k as i,a as o,c as a,b as e,d as r,w as _,F as v,h as f,i as J,e as x,T as g}from"./index-yyrQoDaj.js";import{L as w}from"./localeText-DHIWqoQC.js";import"./vue-datepicker-CX2TuEbC.js";import"./dayjs.min-DJEnruGQ.js";const P={name:"peerJobs",setup(){return{store:u()}},props:{selectedPeer:Object},components:{LocaleText:w,SchedulePeerJob:p,ScheduleDropdown:b},data(){return{}},methods:{deleteJob(d){this.selectedPeer.jobs=this.selectedPeer.jobs.filter(t=>t.JobID!==d.JobID)},addJob(){this.selectedPeer.jobs.unshift(JSON.parse(JSON.stringify({JobID:m().toString(),Configuration:this.selectedPeer.configuration.Name,Peer:this.selectedPeer.id,Field:this.store.PeerScheduleJobs.dropdowns.Field[0].value,Operator:this.store.PeerScheduleJobs.dropdowns.Operator[0].value,Value:"",CreationDate:"",ExpireDate:"",Action:this.store.PeerScheduleJobs.dropdowns.Action[0].value})))}}},S={class:"peerSettingContainer w-100 h-100 position-absolute top-0 start-0 overflow-y-scroll"},y={class:"container d-flex h-100 w-100"},$={class:"m-auto modal-dialog-centered dashboardModal"},C={class:"card rounded-3 shadow",style:{width:"700px"}},D={class:"card-header bg-transparent d-flex align-items-center gap-2 border-0 p-4 pb-2"},k={class:"mb-0 fw-normal"},j={class:"card-body px-4 pb-4 pt-2 position-relative"},T={class:"d-flex align-items-center mb-3"},N={class:"card shadow-sm",key:"none",style:{height:"153px"}},I={class:"card-body text-muted text-center d-flex"},L={class:"m-auto"};function O(d,t,B,F,V,A){const n=i("LocaleText"),l=i("SchedulePeerJob");return o(),a("div",S,[e("div",y,[e("div",$,[e("div",C,[e("div",D,[e("h4",k,[r(n,{t:"Schedule Jobs"})]),e("button",{type:"button",class:"btn-close ms-auto",onClick:t[0]||(t[0]=s=>this.$emit("close"))})]),e("div",j,[e("div",T,[e("button",{class:"btn bg-primary-subtle border-1 border-primary-subtle text-primary-emphasis rounded-3 shadow",onClick:t[1]||(t[1]=s=>this.addJob())},[t[3]||(t[3]=e("i",{class:"bi bi-plus-lg me-2"},null,-1)),r(n,{t:"Job"})])]),r(g,{name:"schedulePeerJobTransition",tag:"div",class:"position-relative"},{default:_(()=>[(o(!0),a(v,null,f(this.selectedPeer.jobs,(s,E)=>(o(),J(l,{onRefresh:t[2]||(t[2]=c=>this.$emit("refresh")),onDelete:c=>this.deleteJob(s),dropdowns:this.store.PeerScheduleJobs.dropdowns,key:s.JobID,pjob:s},null,8,["onDelete","dropdowns","pjob"]))),128)),this.selectedPeer.jobs.length===0?(o(),a("div",N,[e("div",I,[e("h6",L,[r(n,{t:"This peer does not have any job yet."})])])])):x("",!0)]),_:1})])])])])])}const q=h(P,[["render",O],["__scopeId","data-v-5bbdd42b"]]);export{q as default};

View File

@ -1 +1 @@
import{S as _}from"./schedulePeerJob-j3-qqoKu.js";import{_ as g,W as v,k as c,a as t,c as r,b as e,d as l,F as p,h as b,t as m,e as f,i as y}from"./index-BhuLDFPZ.js";import{L as x}from"./localeText-CboImmci.js";import"./vue-datepicker-BHE6PN59.js";import"./dayjs.min-KZ0VlFnQ.js";const J={name:"peerJobsAllModal",setup(){return{store:v()}},components:{LocaleText:x,SchedulePeerJob:_},props:{configurationPeers:Array[Object]},computed:{getAllJobs(){return this.configurationPeers.filter(a=>a.jobs.length>0)}}},k={class:"peerSettingContainer w-100 h-100 position-absolute top-0 start-0 overflow-y-scroll"},w={class:"container d-flex h-100 w-100"},$={class:"m-auto modal-dialog-centered dashboardModal"},A={class:"card rounded-3 shadow",style:{width:"900px"}},L={class:"card-header bg-transparent d-flex align-items-center gap-2 border-0 p-4 pb-2"},S={class:"mb-0 fw-normal"},C={class:"card-body px-4 pb-4 pt-2"},P={key:0,class:"accordion",id:"peerJobsLogsModalAccordion"},j={class:"accordion-header"},M=["data-bs-target"],B={key:0},N={class:"text-muted"},D=["id"],T={class:"accordion-body"},V={key:1,class:"card shadow-sm",style:{height:"153px"}},F={class:"card-body text-muted text-center d-flex"},O={class:"m-auto"};function W(a,o,E,I,R,q){const n=c("LocaleText"),u=c("SchedulePeerJob");return t(),r("div",k,[e("div",w,[e("div",$,[e("div",A,[e("div",L,[e("h4",S,[l(n,{t:"All Active Jobs"})]),e("button",{type:"button",class:"btn-close ms-auto",onClick:o[0]||(o[0]=s=>this.$emit("close"))})]),e("div",C,[e("button",{class:"btn bg-primary-subtle border-1 border-primary-subtle text-primary-emphasis rounded-3 shadow mb-2",onClick:o[1]||(o[1]=s=>this.$emit("allLogs"))},[o[4]||(o[4]=e("i",{class:"bi bi-clock me-2"},null,-1)),l(n,{t:"Logs"})]),this.getAllJobs.length>0?(t(),r("div",P,[(t(!0),r(p,null,b(this.getAllJobs,(s,d)=>(t(),r("div",{class:"accordion-item",key:s.id},[e("h2",j,[e("button",{class:"accordion-button collapsed",type:"button","data-bs-toggle":"collapse","data-bs-target":"#collapse_"+d},[e("small",null,[e("strong",null,[s.name?(t(),r("span",B,m(s.name)+" • ",1)):f("",!0),e("samp",N,m(s.id),1)])])],8,M)]),e("div",{id:"collapse_"+d,class:"accordion-collapse collapse","data-bs-parent":"#peerJobsLogsModalAccordion"},[e("div",T,[(t(!0),r(p,null,b(s.jobs,i=>(t(),y(u,{onDelete:o[2]||(o[2]=h=>this.$emit("refresh")),onRefresh:o[3]||(o[3]=h=>this.$emit("refresh")),dropdowns:this.store.PeerScheduleJobs.dropdowns,viewOnly:!0,key:i.JobID,pjob:i},null,8,["dropdowns","pjob"]))),128))])],8,D)]))),128))])):(t(),r("div",V,[e("div",F,[e("span",O,[l(n,{t:"No active job at the moment."})])])]))])])])])])}const U=g(J,[["render",W]]);export{U as default};
import{S as _}from"./schedulePeerJob-BC1EhzEd.js";import{_ as g,W as v,k as c,a as t,c as r,b as e,d as l,F as p,h as b,t as m,e as f,i as y}from"./index-yyrQoDaj.js";import{L as x}from"./localeText-DHIWqoQC.js";import"./vue-datepicker-CX2TuEbC.js";import"./dayjs.min-DJEnruGQ.js";const J={name:"peerJobsAllModal",setup(){return{store:v()}},components:{LocaleText:x,SchedulePeerJob:_},props:{configurationPeers:Array[Object]},computed:{getAllJobs(){return this.configurationPeers.filter(a=>a.jobs.length>0)}}},k={class:"peerSettingContainer w-100 h-100 position-absolute top-0 start-0 overflow-y-scroll"},w={class:"container d-flex h-100 w-100"},$={class:"m-auto modal-dialog-centered dashboardModal"},A={class:"card rounded-3 shadow",style:{width:"900px"}},L={class:"card-header bg-transparent d-flex align-items-center gap-2 border-0 p-4 pb-2"},S={class:"mb-0 fw-normal"},C={class:"card-body px-4 pb-4 pt-2"},P={key:0,class:"accordion",id:"peerJobsLogsModalAccordion"},j={class:"accordion-header"},M=["data-bs-target"],B={key:0},N={class:"text-muted"},D=["id"],T={class:"accordion-body"},V={key:1,class:"card shadow-sm",style:{height:"153px"}},F={class:"card-body text-muted text-center d-flex"},O={class:"m-auto"};function W(a,o,E,I,R,q){const n=c("LocaleText"),u=c("SchedulePeerJob");return t(),r("div",k,[e("div",w,[e("div",$,[e("div",A,[e("div",L,[e("h4",S,[l(n,{t:"All Active Jobs"})]),e("button",{type:"button",class:"btn-close ms-auto",onClick:o[0]||(o[0]=s=>this.$emit("close"))})]),e("div",C,[e("button",{class:"btn bg-primary-subtle border-1 border-primary-subtle text-primary-emphasis rounded-3 shadow mb-2",onClick:o[1]||(o[1]=s=>this.$emit("allLogs"))},[o[4]||(o[4]=e("i",{class:"bi bi-clock me-2"},null,-1)),l(n,{t:"Logs"})]),this.getAllJobs.length>0?(t(),r("div",P,[(t(!0),r(p,null,b(this.getAllJobs,(s,d)=>(t(),r("div",{class:"accordion-item",key:s.id},[e("h2",j,[e("button",{class:"accordion-button collapsed",type:"button","data-bs-toggle":"collapse","data-bs-target":"#collapse_"+d},[e("small",null,[e("strong",null,[s.name?(t(),r("span",B,m(s.name)+" • ",1)):f("",!0),e("samp",N,m(s.id),1)])])],8,M)]),e("div",{id:"collapse_"+d,class:"accordion-collapse collapse","data-bs-parent":"#peerJobsLogsModalAccordion"},[e("div",T,[(t(!0),r(p,null,b(s.jobs,i=>(t(),y(u,{onDelete:o[2]||(o[2]=h=>this.$emit("refresh")),onRefresh:o[3]||(o[3]=h=>this.$emit("refresh")),dropdowns:this.store.PeerScheduleJobs.dropdowns,viewOnly:!0,key:i.JobID,pjob:i},null,8,["dropdowns","pjob"]))),128))])],8,D)]))),128))])):(t(),r("div",V,[e("div",F,[e("span",O,[l(n,{t:"No active job at the moment."})])])]))])])])])])}const U=g(J,[["render",W]]);export{U as default};

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -1 +1 @@
import{b as r}from"./browser-CjSdxGTc.js";import{L as i}from"./localeText-CboImmci.js";import{_ as c,D as l,g as p,k as _,a,c as n,b as e,d as m,n as h,e as u}from"./index-BhuLDFPZ.js";const f={name:"peerQRCode",components:{LocaleText:i},props:{selectedPeer:Object},setup(){return{dashboardStore:l()}},data(){return{loading:!0}},mounted(){p("/api/downloadPeer/"+this.$route.params.id,{id:this.selectedPeer.id},t=>{this.loading=!1,t.status?r.toCanvas(document.querySelector("#qrcode"),t.data.file,s=>{s&&console.error(s)}):this.dashboardStore.newMessage("Server",t.message,"danger")})}},b={class:"peerSettingContainer w-100 h-100 position-absolute top-0 start-0"},g={class:"container d-flex h-100 w-100"},v={class:"m-auto modal-dialog-centered dashboardModal justify-content-center"},x={class:"card rounded-3 shadow"},C={class:"card-header bg-transparent d-flex align-items-center gap-2 border-0 p-4 pb-0"},w={class:"mb-0"},y={class:"card-body p-4"},S={style:{width:"292px",height:"292px"},class:"d-flex"},k={key:0,class:"spinner-border m-auto",role:"status"};function L(t,s,$,q,o,B){const d=_("LocaleText");return a(),n("div",b,[e("div",g,[e("div",v,[e("div",x,[e("div",C,[e("h4",w,[m(d,{t:"QR Code"})]),e("button",{type:"button",class:"btn-close ms-auto",onClick:s[0]||(s[0]=N=>this.$emit("close"))})]),e("div",y,[e("div",S,[e("canvas",{id:"qrcode",class:h(["rounded-3 shadow animate__animated animate__fadeIn animate__faster",{"d-none":o.loading}])},null,2),o.loading?(a(),n("div",k,s[1]||(s[1]=[e("span",{class:"visually-hidden"},"Loading...",-1)]))):u("",!0)])])])])])])}const T=c(f,[["render",L]]);export{T as default};
import{b as r}from"./browser-CjSdxGTc.js";import{L as i}from"./localeText-DHIWqoQC.js";import{_ as c,D as l,g as p,k as _,a,c as n,b as e,d as m,n as h,e as u}from"./index-yyrQoDaj.js";const f={name:"peerQRCode",components:{LocaleText:i},props:{selectedPeer:Object},setup(){return{dashboardStore:l()}},data(){return{loading:!0}},mounted(){p("/api/downloadPeer/"+this.$route.params.id,{id:this.selectedPeer.id},t=>{this.loading=!1,t.status?r.toCanvas(document.querySelector("#qrcode"),t.data.file,s=>{s&&console.error(s)}):this.dashboardStore.newMessage("Server",t.message,"danger")})}},b={class:"peerSettingContainer w-100 h-100 position-absolute top-0 start-0"},g={class:"container d-flex h-100 w-100"},v={class:"m-auto modal-dialog-centered dashboardModal justify-content-center"},x={class:"card rounded-3 shadow"},C={class:"card-header bg-transparent d-flex align-items-center gap-2 border-0 p-4 pb-0"},w={class:"mb-0"},y={class:"card-body p-4"},S={style:{width:"292px",height:"292px"},class:"d-flex"},k={key:0,class:"spinner-border m-auto",role:"status"};function L(t,s,$,q,o,B){const d=_("LocaleText");return a(),n("div",b,[e("div",g,[e("div",v,[e("div",x,[e("div",C,[e("h4",w,[m(d,{t:"QR Code"})]),e("button",{type:"button",class:"btn-close ms-auto",onClick:s[0]||(s[0]=N=>this.$emit("close"))})]),e("div",y,[e("div",S,[e("canvas",{id:"qrcode",class:h(["rounded-3 shadow animate__animated animate__fadeIn animate__faster",{"d-none":o.loading}])},null,2),o.loading?(a(),n("div",k,s[1]||(s[1]=[e("span",{class:"visually-hidden"},"Loading...",-1)]))):u("",!0)])])])])])])}const T=c(f,[["render",L]]);export{T as default};

View File

@ -1 +0,0 @@
.searchPeersContainer[data-v-21d93f94]{width:100%}

View File

@ -0,0 +1 @@
import{_ as u,q as m,G as p,r as b,W as f,a2 as h,o as g,a as v,i as y,w as _,b as e,m as x,y as w,d as S,j as B}from"./index-yyrQoDaj.js";import{L as T}from"./localeText-DHIWqoQC.js";const C={class:"fixed-bottom w-100 bottom-0 z-2",style:{"z-index":"1"}},P={class:"container-fluid"},k={class:"row g-0"},L={class:"col-md-9 col-lg-10 d-flex justify-content-center py-2"},V={class:"rounded-3 p-2 border shadow searchPeersContainer bg-body-tertiary"},j={class:"d-flex gap-1 align-items-center px-2"},z=["placeholder"],D={__name:"peerSearchBar",emits:["close"],setup(G,{emit:n}){const l=m(()=>p("Search Peers..."));let t;const o=b(""),r=f(),i=()=>{t?(clearTimeout(t),t=setTimeout(()=>{r.searchString=o.value},300)):t=setTimeout(()=>{r.searchString=o.value},300)},d=n,c=h("searchBar");return g(()=>{c.value.focus()}),(M,s)=>(v(),y(B,{name:"slideUp",appear:"",type:"animation",style:{"animation-delay":"1s"}},{default:_(()=>[e("div",C,[e("div",P,[e("div",k,[s[5]||(s[5]=e("div",{class:"col-md-3 col-lg-2"},null,-1)),e("div",L,[e("div",V,[e("div",j,[s[4]||(s[4]=e("h6",{class:"mb-0 me-2"},[e("label",{for:"searchPeers"},[e("i",{class:"bi bi-search"})])],-1)),x(e("input",{ref:"searchBar",class:"flex-grow-1 form-control rounded-3 bg-secondary-subtle border-1 border-secondary-subtle",placeholder:l.value,id:"searchPeers",onKeyup:s[0]||(s[0]=a=>i()),"onUpdate:modelValue":s[1]||(s[1]=a=>o.value=a)},null,40,z),[[w,o.value]]),e("button",{onClick:s[2]||(s[2]=a=>d("close")),style:{"white-space":"nowrap"},class:"btn bg-secondary-subtle text-secondary-emphasis border-secondary-subtle rounded-3 d-flex align-items-center"},[e("span",null,[s[3]||(s[3]=e("i",{class:"bi bi-x-circle-fill me-2"},null,-1)),S(T,{t:"Done"})])])])])])])])])]),_:1}))}},W=u(D,[["__scopeId","data-v-b741afe7"]]);export{W as default};

View File

@ -0,0 +1 @@
.searchPeersContainer[data-v-b741afe7]{width:100%}

View File

@ -1 +0,0 @@
import{_ as u,q as m,G as p,r as b,W as f,a2 as h,o as v,a as g,i as _,w as y,b as e,m as x,y as S,d as B,j as T}from"./index-BhuLDFPZ.js";import{L as w}from"./localeText-CboImmci.js";const C={class:"fixed-bottom w-100 bottom-0 z-2",style:{"z-index":"1"}},P={class:"container-fluid"},k={class:"row g-0"},L={class:"col-md-9 col-lg-10 d-flex justify-content-center py-2"},V={class:"rounded-3 p-2 border shadow searchPeersContainer bg-body-tertiary"},j={class:"d-flex gap-1 align-items-center px-2"},z=["placeholder"],D={__name:"peerSearchBar",emits:["close"],setup(G,{emit:n}){const i=m(()=>p("Search Peers..."));let t;const o=b(""),r=f(),l=()=>{t?(clearTimeout(t),t=setTimeout(()=>{r.searchString=o.value},300)):t=setTimeout(()=>{r.searchString=o.value},300)},d=n,c=h("searchBar");return v(()=>{c.value.focus()}),(M,s)=>(g(),_(T,{name:"slideUp",appear:"",type:"animation",style:{"animation-delay":"1s"}},{default:y(()=>[e("div",C,[e("div",P,[e("div",k,[s[5]||(s[5]=e("div",{class:"col-md-3 col-lg-2"},null,-1)),e("div",L,[e("div",V,[e("div",j,[s[4]||(s[4]=e("h6",{class:"mb-0 me-2"},[e("label",{for:"searchPeers"},[e("i",{class:"bi bi-search"})])],-1)),x(e("input",{ref:"searchBar",class:"form-control rounded-3 bg-secondary-subtle border-1 border-secondary-subtle",placeholder:i.value,id:"searchPeers",onKeyup:s[0]||(s[0]=a=>l()),"onUpdate:modelValue":s[1]||(s[1]=a=>o.value=a)},null,40,z),[[S,o.value]]),e("button",{onClick:s[2]||(s[2]=a=>d("close")),class:"btn bg-secondary-subtle text-secondary-emphasis border-secondary-subtle rounded-3 d-flex align-items-center"},[s[3]||(s[3]=e("i",{class:"bi bi-x-circle-fill me-2"},null,-1)),B(w,{t:"Done"})])])])])])])])]),_:1}))}},W=u(D,[["__scopeId","data-v-21d93f94"]]);export{W as default};

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -1 +1 @@
.card[data-v-8cfb4d4d]{border-color:var(--bs-border-color)!important}textarea[data-v-f7bbc420]:focus,input[data-v-f7bbc420]:focus{box-shadow:none;border-color:var(--bs-border-color)!important}textarea[data-v-f7bbc420]{padding:var(--bs-card-spacer-y) var(--bs-card-spacer-x)}
.card[data-v-8cfb4d4d]{border-color:var(--bs-border-color)!important}textarea[data-v-6e705c87]:focus,input[data-v-6e705c87]:focus{box-shadow:none;border-color:var(--bs-border-color)!important}textarea[data-v-6e705c87]{padding:var(--bs-card-spacer-y) var(--bs-card-spacer-x)}

File diff suppressed because one or more lines are too long

View File

@ -1 +1 @@
import{L as r}from"./localeText-CboImmci.js";import{a as t,c as n,f as i,i as s,e as a}from"./index-BhuLDFPZ.js";const d={key:0,class:"badge wireguardBg rounded-3 shadow"},c={key:1,class:"badge amneziawgBg rounded-3 shadow"},u={__name:"protocolBadge",props:{protocol:String,mini:!1},setup(e){return(m,o)=>e.protocol==="wg"?(t(),n("span",d,[o[0]||(o[0]=i(" WireGuard ")),e.mini?a("",!0):(t(),s(r,{key:0,t:"Configuration"}))])):e.protocol==="awg"?(t(),n("span",c,[o[1]||(o[1]=i(" AmneziaWG ")),e.mini?a("",!0):(t(),s(r,{key:0,t:"Configuration"}))])):a("",!0)}};export{u as _};
import{L as r}from"./localeText-DHIWqoQC.js";import{a as t,c as n,f as i,i as s,e as a}from"./index-yyrQoDaj.js";const d={key:0,class:"badge wireguardBg rounded-3 shadow"},c={key:1,class:"badge amneziawgBg rounded-3 shadow"},u={__name:"protocolBadge",props:{protocol:String,mini:!1},setup(e){return(m,o)=>e.protocol==="wg"?(t(),n("span",d,[o[0]||(o[0]=i(" WireGuard ")),e.mini?a("",!0):(t(),s(r,{key:0,t:"Configuration"}))])):e.protocol==="awg"?(t(),n("span",c,[o[1]||(o[1]=i(" AmneziaWG ")),e.mini?a("",!0):(t(),s(r,{key:0,t:"Configuration"}))])):a("",!0)}};export{u as _};

File diff suppressed because one or more lines are too long

View File

@ -1 +1 @@
import{_ as u,D as m,A as p,c as r,b as e,d as o,f as c,t as h,e as f,m as l,y as d,a as i,k as w}from"./index-BhuLDFPZ.js";import{L as g}from"./localeText-CboImmci.js";const b={name:"setup",components:{LocaleText:g},setup(){return{store:m()}},data(){return{setup:{username:"",newPassword:"",repeatNewPassword:"",enable_totp:!0},loading:!1,errorMessage:"",done:!1}},computed:{goodToSubmit(){return this.setup.username&&this.setup.newPassword.length>=8&&this.setup.repeatNewPassword.length>=8&&this.setup.newPassword===this.setup.repeatNewPassword}},methods:{submit(){this.loading=!0,p("/api/Welcome_Finish",this.setup,n=>{n.status?(this.done=!0,this.$router.push("/2FASetup")):(document.querySelectorAll("#createAccount input").forEach(s=>s.classList.add("is-invalid")),this.errorMessage=n.message,document.querySelector(".login-container-fluid").scrollTo({top:0,left:0,behavior:"smooth"})),this.loading=!1})}}},_=["data-bs-theme"],x={class:"m-auto text-body",style:{width:"500px"}},v={class:"dashboardLogo display-4"},y={class:"mb-5"},P={key:0,class:"alert alert-danger"},N={class:"d-flex flex-column gap-3"},k={id:"createAccount",class:"d-flex flex-column gap-2"},S={class:"form-group text-body"},T={for:"username",class:"mb-1 text-muted"},C={class:"form-group text-body"},L={for:"password",class:"mb-1 text-muted"},V={class:"form-group text-body"},A={for:"confirmPassword",class:"mb-1 text-muted"},$=["disabled"],q={key:0,class:"d-flex align-items-center w-100"},M={key:1,class:"d-flex align-items-center w-100"};function B(n,s,D,E,U,F){const t=w("LocaleText");return i(),r("div",{class:"container-fluid login-container-fluid d-flex main pt-5 overflow-scroll","data-bs-theme":this.store.Configuration.Server.dashboard_theme},[e("div",x,[e("span",v,[o(t,{t:"Nice to meet you!"})]),e("p",y,[o(t,{t:"Please fill in the following fields to finish setup"}),s[4]||(s[4]=c(" 😊"))]),e("div",null,[e("h3",null,[o(t,{t:"Create an account"})]),this.errorMessage?(i(),r("div",P,h(this.errorMessage),1)):f("",!0),e("div",N,[e("form",k,[e("div",S,[e("label",T,[e("small",null,[o(t,{t:"Enter an username you like"})])]),l(e("input",{type:"text",autocomplete:"username","onUpdate:modelValue":s[0]||(s[0]=a=>this.setup.username=a),class:"form-control",id:"username",name:"username",required:""},null,512),[[d,this.setup.username]])]),e("div",C,[e("label",L,[e("small",null,[o(t,{t:"Enter a password"}),e("code",null,[o(t,{t:"(At least 8 characters and make sure is strong enough!)"})])])]),l(e("input",{type:"password",autocomplete:"new-password","onUpdate:modelValue":s[1]||(s[1]=a=>this.setup.newPassword=a),class:"form-control",id:"password",name:"password",required:""},null,512),[[d,this.setup.newPassword]])]),e("div",V,[e("label",A,[e("small",null,[o(t,{t:"Confirm password"})])]),l(e("input",{type:"password",autocomplete:"confirm-new-password","onUpdate:modelValue":s[2]||(s[2]=a=>this.setup.repeatNewPassword=a),class:"form-control",id:"confirmPassword",name:"confirmPassword",required:""},null,512),[[d,this.setup.repeatNewPassword]])])]),e("button",{class:"btn btn-dark btn-lg mb-5 d-flex btn-brand shadow align-items-center",ref:"signInBtn",disabled:!this.goodToSubmit||this.loading||this.done,onClick:s[3]||(s[3]=a=>this.submit())},[!this.loading&&!this.done?(i(),r("span",q,[o(t,{t:"Next"}),s[5]||(s[5]=e("i",{class:"bi bi-chevron-right ms-auto"},null,-1))])):(i(),r("span",M,[o(t,{t:"Saving..."}),s[6]||(s[6]=e("span",{class:"spinner-border ms-auto spinner-border-sm",role:"status"},[e("span",{class:"visually-hidden"},"Loading...")],-1))]))],8,$)])])])],8,_)}const j=u(b,[["render",B]]);export{j as default};
import{_ as u,D as m,A as p,c as r,b as e,d as o,f as c,t as h,e as f,m as l,y as d,a as i,k as w}from"./index-yyrQoDaj.js";import{L as g}from"./localeText-DHIWqoQC.js";const b={name:"setup",components:{LocaleText:g},setup(){return{store:m()}},data(){return{setup:{username:"",newPassword:"",repeatNewPassword:"",enable_totp:!0},loading:!1,errorMessage:"",done:!1}},computed:{goodToSubmit(){return this.setup.username&&this.setup.newPassword.length>=8&&this.setup.repeatNewPassword.length>=8&&this.setup.newPassword===this.setup.repeatNewPassword}},methods:{submit(){this.loading=!0,p("/api/Welcome_Finish",this.setup,n=>{n.status?(this.done=!0,this.$router.push("/2FASetup")):(document.querySelectorAll("#createAccount input").forEach(s=>s.classList.add("is-invalid")),this.errorMessage=n.message,document.querySelector(".login-container-fluid").scrollTo({top:0,left:0,behavior:"smooth"})),this.loading=!1})}}},_=["data-bs-theme"],x={class:"m-auto text-body",style:{width:"500px"}},v={class:"dashboardLogo display-4"},y={class:"mb-5"},P={key:0,class:"alert alert-danger"},N={class:"d-flex flex-column gap-3"},k={id:"createAccount",class:"d-flex flex-column gap-2"},S={class:"form-group text-body"},T={for:"username",class:"mb-1 text-muted"},C={class:"form-group text-body"},L={for:"password",class:"mb-1 text-muted"},V={class:"form-group text-body"},A={for:"confirmPassword",class:"mb-1 text-muted"},$=["disabled"],q={key:0,class:"d-flex align-items-center w-100"},M={key:1,class:"d-flex align-items-center w-100"};function B(n,s,D,E,U,F){const t=w("LocaleText");return i(),r("div",{class:"container-fluid login-container-fluid d-flex main pt-5 overflow-scroll","data-bs-theme":this.store.Configuration.Server.dashboard_theme},[e("div",x,[e("span",v,[o(t,{t:"Nice to meet you!"})]),e("p",y,[o(t,{t:"Please fill in the following fields to finish setup"}),s[4]||(s[4]=c(" 😊"))]),e("div",null,[e("h3",null,[o(t,{t:"Create an account"})]),this.errorMessage?(i(),r("div",P,h(this.errorMessage),1)):f("",!0),e("div",N,[e("form",k,[e("div",S,[e("label",T,[e("small",null,[o(t,{t:"Enter an username you like"})])]),l(e("input",{type:"text",autocomplete:"username","onUpdate:modelValue":s[0]||(s[0]=a=>this.setup.username=a),class:"form-control",id:"username",name:"username",required:""},null,512),[[d,this.setup.username]])]),e("div",C,[e("label",L,[e("small",null,[o(t,{t:"Enter a password"}),e("code",null,[o(t,{t:"(At least 8 characters and make sure is strong enough!)"})])])]),l(e("input",{type:"password",autocomplete:"new-password","onUpdate:modelValue":s[1]||(s[1]=a=>this.setup.newPassword=a),class:"form-control",id:"password",name:"password",required:""},null,512),[[d,this.setup.newPassword]])]),e("div",V,[e("label",A,[e("small",null,[o(t,{t:"Confirm password"})])]),l(e("input",{type:"password",autocomplete:"confirm-new-password","onUpdate:modelValue":s[2]||(s[2]=a=>this.setup.repeatNewPassword=a),class:"form-control",id:"confirmPassword",name:"confirmPassword",required:""},null,512),[[d,this.setup.repeatNewPassword]])])]),e("button",{class:"btn btn-dark btn-lg mb-5 d-flex btn-brand shadow align-items-center",ref:"signInBtn",disabled:!this.goodToSubmit||this.loading||this.done,onClick:s[3]||(s[3]=a=>this.submit())},[!this.loading&&!this.done?(i(),r("span",q,[o(t,{t:"Next"}),s[5]||(s[5]=e("i",{class:"bi bi-chevron-right ms-auto"},null,-1))])):(i(),r("span",M,[o(t,{t:"Saving..."}),s[6]||(s[6]=e("span",{class:"spinner-border ms-auto spinner-border-sm",role:"status"},[e("span",{class:"visually-hidden"},"Loading...")],-1))]))],8,$)])])])],8,_)}const j=u(b,[["render",B]]);export{j as default};

View File

@ -1 +1 @@
import{_,r,D as p,g as u,c as m,b as t,d as c,J as h,a as f,k as b}from"./index-BhuLDFPZ.js";import{b as v}from"./browser-CjSdxGTc.js";import{L as y}from"./localeText-CboImmci.js";const g={name:"share",components:{LocaleText:y},async setup(){const o=h(),e=r(!1),i=p(),n=r(""),s=r(void 0),l=r(new Blob);await u("/api/getDashboardTheme",{},d=>{n.value=d.data});const a=o.query.ShareID;return a===void 0||a.length===0?(s.value=void 0,e.value=!0):await u("/api/sharePeer/get",{ShareID:a},d=>{d.status?(s.value=d.data,l.value=new Blob([s.value.file],{type:"text/plain"})):s.value=void 0,e.value=!0}),{store:i,theme:n,peerConfiguration:s,blob:l}},mounted(){this.peerConfiguration&&v.toCanvas(document.querySelector("#qrcode"),this.peerConfiguration.file,o=>{o&&console.error(o)})},methods:{download(){const o=new Blob([this.peerConfiguration.file],{type:"text/plain"}),e=URL.createObjectURL(o),i=`${this.peerConfiguration.fileName}.conf`,n=document.createElement("a");n.href=e,n.download=i,n.click()}},computed:{getBlob(){return URL.createObjectURL(this.blob)}}},w=["data-bs-theme"],x={class:"m-auto text-body",style:{width:"500px"}},C={key:0,class:"text-center position-relative",style:{}},U={class:"position-absolute w-100 h-100 top-0 start-0 d-flex animate__animated animate__fadeInUp",style:{"animation-delay":"0.1s"}},I={class:"m-auto"},L={key:1,class:"d-flex align-items-center flex-column gap-3"},k={class:"h1 dashboardLogo text-center animate__animated animate__fadeInUp"},B={id:"qrcode",class:"rounded-3 shadow animate__animated animate__fadeInUp mb-3",ref:"qrcode"},D={class:"text-muted animate__animated animate__fadeInUp mb-1",style:{"animation-delay":"0.2s"}},R=["download","href"];function q(o,e,i,n,s,l){const a=b("LocaleText");return f(),m("div",{class:"container-fluid login-container-fluid d-flex main pt-5 overflow-scroll","data-bs-theme":this.theme},[t("div",x,[this.peerConfiguration?(f(),m("div",L,[t("div",k,[e[1]||(e[1]=t("h6",null,"WGDashboard",-1)),c(a,{t:"Scan QR Code with the WireGuard App to add peer"})]),t("canvas",B,null,512),t("p",D,[c(a,{t:"or click the button below to download the "}),e[2]||(e[2]=t("samp",null,".conf",-1)),c(a,{t:" file"})]),t("a",{download:this.peerConfiguration.fileName+".conf",href:l.getBlob,class:"btn btn-lg bg-primary-subtle text-primary-emphasis border-1 border-primary-subtle animate__animated animate__fadeInUp shadow-sm",style:{"animation-delay":"0.25s"}},e[3]||(e[3]=[t("i",{class:"bi bi-download"},null,-1)]),8,R)])):(f(),m("div",C,[e[0]||(e[0]=t("div",{class:"animate__animated animate__fadeInUp"},[t("h1",{style:{"font-size":"20rem",filter:"blur(1rem)","animation-duration":"7s"},class:"animate__animated animate__flash animate__infinite"},[t("i",{class:"bi bi-file-binary"})])],-1)),t("div",U,[t("h3",I,[c(a,{t:"Oh no... This link is either expired or invalid."})])])]))])],8,w)}const N=_(g,[["render",q],["__scopeId","data-v-1b44aacd"]]);export{N as default};
import{_,r,D as p,g as u,c as m,b as t,d as c,J as h,a as f,k as b}from"./index-yyrQoDaj.js";import{b as v}from"./browser-CjSdxGTc.js";import{L as y}from"./localeText-DHIWqoQC.js";const g={name:"share",components:{LocaleText:y},async setup(){const o=h(),e=r(!1),i=p(),n=r(""),s=r(void 0),l=r(new Blob);await u("/api/getDashboardTheme",{},d=>{n.value=d.data});const a=o.query.ShareID;return a===void 0||a.length===0?(s.value=void 0,e.value=!0):await u("/api/sharePeer/get",{ShareID:a},d=>{d.status?(s.value=d.data,l.value=new Blob([s.value.file],{type:"text/plain"})):s.value=void 0,e.value=!0}),{store:i,theme:n,peerConfiguration:s,blob:l}},mounted(){this.peerConfiguration&&v.toCanvas(document.querySelector("#qrcode"),this.peerConfiguration.file,o=>{o&&console.error(o)})},methods:{download(){const o=new Blob([this.peerConfiguration.file],{type:"text/plain"}),e=URL.createObjectURL(o),i=`${this.peerConfiguration.fileName}.conf`,n=document.createElement("a");n.href=e,n.download=i,n.click()}},computed:{getBlob(){return URL.createObjectURL(this.blob)}}},w=["data-bs-theme"],x={class:"m-auto text-body",style:{width:"500px"}},C={key:0,class:"text-center position-relative",style:{}},U={class:"position-absolute w-100 h-100 top-0 start-0 d-flex animate__animated animate__fadeInUp",style:{"animation-delay":"0.1s"}},I={class:"m-auto"},L={key:1,class:"d-flex align-items-center flex-column gap-3"},k={class:"h1 dashboardLogo text-center animate__animated animate__fadeInUp"},B={id:"qrcode",class:"rounded-3 shadow animate__animated animate__fadeInUp mb-3",ref:"qrcode"},D={class:"text-muted animate__animated animate__fadeInUp mb-1",style:{"animation-delay":"0.2s"}},R=["download","href"];function q(o,e,i,n,s,l){const a=b("LocaleText");return f(),m("div",{class:"container-fluid login-container-fluid d-flex main pt-5 overflow-scroll","data-bs-theme":this.theme},[t("div",x,[this.peerConfiguration?(f(),m("div",L,[t("div",k,[e[1]||(e[1]=t("h6",null,"WGDashboard",-1)),c(a,{t:"Scan QR Code with the WireGuard App to add peer"})]),t("canvas",B,null,512),t("p",D,[c(a,{t:"or click the button below to download the "}),e[2]||(e[2]=t("samp",null,".conf",-1)),c(a,{t:" file"})]),t("a",{download:this.peerConfiguration.fileName+".conf",href:l.getBlob,class:"btn btn-lg bg-primary-subtle text-primary-emphasis border-1 border-primary-subtle animate__animated animate__fadeInUp shadow-sm",style:{"animation-delay":"0.25s"}},e[3]||(e[3]=[t("i",{class:"bi bi-download"},null,-1)]),8,R)])):(f(),m("div",C,[e[0]||(e[0]=t("div",{class:"animate__animated animate__fadeInUp"},[t("h1",{style:{"font-size":"20rem",filter:"blur(1rem)","animation-duration":"7s"},class:"animate__animated animate__flash animate__infinite"},[t("i",{class:"bi bi-file-binary"})])],-1)),t("div",U,[t("h3",I,[c(a,{t:"Oh no... This link is either expired or invalid."})])])]))])],8,w)}const N=_(g,[["render",q],["__scopeId","data-v-1b44aacd"]]);export{N as default};

File diff suppressed because one or more lines are too long

View File

@ -1 +1 @@
import{_ as i,p as m,r as p,q as b,a as o,c as t,d as g,w as v,n as x,b as r,t as n,e as f,j as C,s as w}from"./index-BhuLDFPZ.js";const y={class:"text-muted me-2"},_={class:"fw-bold"},k={__name:"cpuCore",props:{core_number:Number,percentage:Number,align:Boolean,square:Boolean},setup(e){m(c=>({e901480c:u.value}));const l=e,a=p(!1),u=b(()=>l.square?"40px":"25px");return(c,s)=>(o(),t("div",{class:"flex-grow-1 square rounded-3 border position-relative p-2",onMouseenter:s[0]||(s[0]=d=>a.value=!0),onMouseleave:s[1]||(s[1]=d=>a.value=!1),style:w({"background-color":`rgb(13 110 253 / ${e.percentage*10}%)`})},[g(C,{name:"zoomReversed"},{default:v(()=>[a.value?(o(),t("div",{key:0,style:{"white-space":"nowrap"},class:x(["floatingLabel z-3 border position-absolute d-block p-1 px-2 bg-body text-body rounded-3 border shadow d-flex",[e.align?"end-0":"start-0"]])},[r("small",y," Core #"+n(e.core_number+1),1),r("small",_,n(e.percentage)+"% ",1)],2)):f("",!0)]),_:1})],36))}},B=i(k,[["__scopeId","data-v-70102637"]]);export{B as C};
import{_ as i,p as m,r as p,q as b,a as o,c as t,d as g,w as v,n as x,b as r,t as n,e as f,j as C,s as w}from"./index-yyrQoDaj.js";const y={class:"text-muted me-2"},_={class:"fw-bold"},k={__name:"cpuCore",props:{core_number:Number,percentage:Number,align:Boolean,square:Boolean},setup(e){m(c=>({e901480c:u.value}));const l=e,a=p(!1),u=b(()=>l.square?"40px":"25px");return(c,s)=>(o(),t("div",{class:"flex-grow-1 square rounded-3 border position-relative p-2",onMouseenter:s[0]||(s[0]=d=>a.value=!0),onMouseleave:s[1]||(s[1]=d=>a.value=!1),style:w({"background-color":`rgb(13 110 253 / ${e.percentage*10}%)`})},[g(C,{name:"zoomReversed"},{default:v(()=>[a.value?(o(),t("div",{key:0,style:{"white-space":"nowrap"},class:x(["floatingLabel z-3 border position-absolute d-block p-1 px-2 bg-body text-body rounded-3 border shadow d-flex",[e.align?"end-0":"start-0"]])},[r("small",y," Core #"+n(e.core_number+1),1),r("small",_,n(e.percentage)+"% ",1)],2)):f("",!0)]),_:1})],36))}},B=i(k,[["__scopeId","data-v-70102637"]]);export{B as C};

View File

@ -1 +0,0 @@
.title[data-v-ffe5ad8f]{height:18px;text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.process-move[data-v-727ce0e8],.process-enter-active[data-v-727ce0e8],.process-leave-active[data-v-727ce0e8]{transition:all .5s cubic-bezier(.42,0,.22,1)}.process-enter-from[data-v-727ce0e8],.process-leave-to[data-v-727ce0e8]{opacity:0;transform:scale(.9)}.process-leave-active[data-v-727ce0e8]{position:absolute;width:100%}.progress-bar[data-v-727ce0e8]{width:0;transition:all 1s cubic-bezier(.42,0,.22,1)}.fadeIn[data-v-727ce0e8]{opacity:0;animation:fadeIn-727ce0e8 .5s forwards cubic-bezier(.42,0,.22,1)}@keyframes fadeIn-727ce0e8{0%{opacity:0;transform:translateY(30px)}to{opacity:1;transform:translateY(0)}}

View File

@ -0,0 +1 @@
.title[data-v-ffe5ad8f]{height:18px;text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.process-move[data-v-977dc46d],.process-enter-active[data-v-977dc46d],.process-leave-active[data-v-977dc46d]{transition:all .5s cubic-bezier(.42,0,.22,1)}.process-enter-from[data-v-977dc46d],.process-leave-to[data-v-977dc46d]{opacity:0;transform:scale(.9)}.process-leave-active[data-v-977dc46d]{position:absolute;width:100%}.progress-bar[data-v-977dc46d]{width:0;transition:all 1s cubic-bezier(.42,0,.22,1)}.fadeIn[data-v-977dc46d]{opacity:0;animation:fadeIn-977dc46d .5s forwards cubic-bezier(.42,0,.22,1)}@keyframes fadeIn-977dc46d{0%{opacity:0;transform:translateY(30px)}to{opacity:1;transform:translateY(0)}}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -1 +1 @@
import{_ as h,D as m,g as p,A as f,c as b,b as t,d as i,t as _,m as v,y as g,i as d,w as r,k as c,a as n}from"./index-BhuLDFPZ.js";import{b as x}from"./browser-CjSdxGTc.js";import{L as y}from"./localeText-CboImmci.js";const T={name:"totp",components:{LocaleText:y},async setup(){const s=m();let e="";return await p("/api/Welcome_GetTotpLink",{},a=>{a.status&&(e=a.data)}),{l:e,store:s}},mounted(){this.l&&x.toCanvas(document.getElementById("qrcode"),this.l,function(s){})},data(){return{totp:"",totpInvalidMessage:"",verified:!1}},methods:{validateTotp(){}},watch:{totp(s){const e=document.querySelector("#totp");e.classList.remove("is-invalid","is-valid"),s.length===6&&(console.log(s),/[0-9]{6}/.test(s)?f("/api/Welcome_VerifyTotpLink",{totp:s},a=>{a.status?(this.verified=!0,e.classList.add("is-valid"),this.$emit("verified")):(e.classList.add("is-invalid"),this.totpInvalidMessage="TOTP does not match.")}):(e.classList.add("is-invalid"),this.totpInvalidMessage="TOTP can only contain numbers"))}}},k=["data-bs-theme"],w={class:"m-auto text-body",style:{width:"500px"}},L={class:"d-flex flex-column"},M={class:"dashboardLogo display-4"},C={class:"mb-2"},P={class:"text-muted"},I={class:"p-3 bg-body-secondary rounded-3 border mb-3"},O={class:"text-muted mb-0"},B=["href"],$={style:{"line-break":"anywhere"}},A={for:"totp",class:"mb-2"},D={class:"text-muted"},S={class:"form-group mb-2"},q=["disabled"],E={class:"invalid-feedback"},F={class:"valid-feedback"},R={class:"d-flex gap-3 mt-5 flex-column"};function G(s,e,a,N,W,Q){const o=c("LocaleText"),l=c("RouterLink");return n(),b("div",{class:"container-fluid login-container-fluid d-flex main pt-5 overflow-scroll","data-bs-theme":this.store.Configuration.Server.dashboard_theme},[t("div",w,[t("div",L,[t("div",null,[t("h1",M,[i(o,{t:"Multi-Factor Authentication (MFA)"})]),t("p",C,[t("small",P,[i(o,{t:"1. Please scan the following QR Code to generate TOTP with your choice of authenticator"})])]),e[1]||(e[1]=t("canvas",{id:"qrcode",class:"rounded-3 mb-2"},null,-1)),t("div",I,[t("p",O,[t("small",null,[i(o,{t:"Or you can click the link below:"})])]),t("a",{href:this.l},[t("code",$,_(this.l),1)],8,B)]),t("label",A,[t("small",D,[i(o,{t:"2. Enter the TOTP generated by your authenticator to verify"})])]),t("div",S,[v(t("input",{class:"form-control text-center totp",id:"totp",maxlength:"6",type:"text",inputmode:"numeric",autocomplete:"one-time-code","onUpdate:modelValue":e[0]||(e[0]=u=>this.totp=u),disabled:this.verified},null,8,q),[[g,this.totp]]),t("div",E,[i(o,{t:this.totpInvalidMessage},null,8,["t"])]),t("div",F,[i(o,{t:"TOTP verified!"})])])]),e[4]||(e[4]=t("hr",null,null,-1)),t("div",R,[this.verified?(n(),d(l,{key:1,to:"/",class:"btn btn-dark btn-lg d-flex btn-brand shadow align-items-center flex-grow-1 rounded-3"},{default:r(()=>[i(o,{t:"Complete"}),e[3]||(e[3]=t("i",{class:"bi bi-chevron-right ms-auto"},null,-1))]),_:1})):(n(),d(l,{key:0,to:"/",class:"btn bg-secondary-subtle text-secondary-emphasis rounded-3 flex-grow-1 btn-lg border-1 border-secondary-subtle shadow d-flex"},{default:r(()=>[i(o,{t:"I don't need MFA"}),e[2]||(e[2]=t("i",{class:"bi bi-chevron-right ms-auto"},null,-1))]),_:1}))])])])],8,k)}const z=h(T,[["render",G]]);export{z as default};
import{_ as h,D as m,g as p,A as f,c as b,b as t,d as i,t as _,m as v,y as g,i as d,w as r,k as c,a as n}from"./index-yyrQoDaj.js";import{b as x}from"./browser-CjSdxGTc.js";import{L as y}from"./localeText-DHIWqoQC.js";const T={name:"totp",components:{LocaleText:y},async setup(){const s=m();let e="";return await p("/api/Welcome_GetTotpLink",{},a=>{a.status&&(e=a.data)}),{l:e,store:s}},mounted(){this.l&&x.toCanvas(document.getElementById("qrcode"),this.l,function(s){})},data(){return{totp:"",totpInvalidMessage:"",verified:!1}},methods:{validateTotp(){}},watch:{totp(s){const e=document.querySelector("#totp");e.classList.remove("is-invalid","is-valid"),s.length===6&&(console.log(s),/[0-9]{6}/.test(s)?f("/api/Welcome_VerifyTotpLink",{totp:s},a=>{a.status?(this.verified=!0,e.classList.add("is-valid"),this.$emit("verified")):(e.classList.add("is-invalid"),this.totpInvalidMessage="TOTP does not match.")}):(e.classList.add("is-invalid"),this.totpInvalidMessage="TOTP can only contain numbers"))}}},k=["data-bs-theme"],w={class:"m-auto text-body",style:{width:"500px"}},L={class:"d-flex flex-column"},M={class:"dashboardLogo display-4"},C={class:"mb-2"},P={class:"text-muted"},I={class:"p-3 bg-body-secondary rounded-3 border mb-3"},O={class:"text-muted mb-0"},B=["href"],$={style:{"line-break":"anywhere"}},A={for:"totp",class:"mb-2"},D={class:"text-muted"},S={class:"form-group mb-2"},q=["disabled"],E={class:"invalid-feedback"},F={class:"valid-feedback"},R={class:"d-flex gap-3 mt-5 flex-column"};function G(s,e,a,N,W,Q){const o=c("LocaleText"),l=c("RouterLink");return n(),b("div",{class:"container-fluid login-container-fluid d-flex main pt-5 overflow-scroll","data-bs-theme":this.store.Configuration.Server.dashboard_theme},[t("div",w,[t("div",L,[t("div",null,[t("h1",M,[i(o,{t:"Multi-Factor Authentication (MFA)"})]),t("p",C,[t("small",P,[i(o,{t:"1. Please scan the following QR Code to generate TOTP with your choice of authenticator"})])]),e[1]||(e[1]=t("canvas",{id:"qrcode",class:"rounded-3 mb-2"},null,-1)),t("div",I,[t("p",O,[t("small",null,[i(o,{t:"Or you can click the link below:"})])]),t("a",{href:this.l},[t("code",$,_(this.l),1)],8,B)]),t("label",A,[t("small",D,[i(o,{t:"2. Enter the TOTP generated by your authenticator to verify"})])]),t("div",S,[v(t("input",{class:"form-control text-center totp",id:"totp",maxlength:"6",type:"text",inputmode:"numeric",autocomplete:"one-time-code","onUpdate:modelValue":e[0]||(e[0]=u=>this.totp=u),disabled:this.verified},null,8,q),[[g,this.totp]]),t("div",E,[i(o,{t:this.totpInvalidMessage},null,8,["t"])]),t("div",F,[i(o,{t:"TOTP verified!"})])])]),e[4]||(e[4]=t("hr",null,null,-1)),t("div",R,[this.verified?(n(),d(l,{key:1,to:"/",class:"btn btn-dark btn-lg d-flex btn-brand shadow align-items-center flex-grow-1 rounded-3"},{default:r(()=>[i(o,{t:"Complete"}),e[3]||(e[3]=t("i",{class:"bi bi-chevron-right ms-auto"},null,-1))]),_:1})):(n(),d(l,{key:0,to:"/",class:"btn bg-secondary-subtle text-secondary-emphasis rounded-3 flex-grow-1 btn-lg border-1 border-secondary-subtle shadow d-flex"},{default:r(()=>[i(o,{t:"I don't need MFA"}),e[2]||(e[2]=t("i",{class:"bi bi-chevron-right ms-auto"},null,-1))]),_:1}))])])])],8,k)}const z=h(T,[["render",G]]);export{z as default};

View File

@ -1 +1 @@
import{_ as h,W as g,g as b,c as o,b as t,d as n,m as y,y as f,C as x,w as r,j as c,a as l,f as v,F as u,h as m,n as k,s as T,t as i,k as _}from"./index-BhuLDFPZ.js";import{O as A}from"./osmap-BjjFjZbF.js";import{L as w}from"./localeText-CboImmci.js";const R={name:"traceroute",components:{LocaleText:w,OSMap:A},data(){return{tracing:!1,ipAddress:void 0,tracerouteResult:void 0}},setup(){return{store:g()}},methods:{execute(){this.ipAddress&&(this.tracing=!0,this.tracerouteResult=void 0,b("/api/traceroute/execute",{ipAddress:this.ipAddress},d=>{d.status?this.tracerouteResult=d.data:this.store.newMessage("Server",d.message,"danger"),this.tracing=!1}))}}},M={class:"mt-md-5 mt-3 text-body"},S={class:"container-md"},$={class:"mb-3 text-body"},C={class:"d-flex gap-2 mb-3 flex-column"},L={class:"flex-grow-1"},P={class:"mb-1 text-muted",for:"ipAddress"},O=["disabled"],V=["disabled"],B={key:0,class:"d-block"},I={key:1,class:"d-block"},N={class:"position-relative"},z={key:"pingPlaceholder"},D={key:1},E={key:"table",class:"w-100 mt-2"},F={class:"table table-sm rounded-3 w-100"},G={scope:"col"},H={scope:"col"},K={scope:"col"},W={scope:"col"},j={scope:"col"},U={scope:"col"},q={key:0},J={key:1};function Q(d,s,X,Y,Z,tt){const a=_("LocaleText"),p=_("OSMap");return l(),o("div",M,[t("div",S,[t("h3",$,[n(a,{t:"Traceroute"})]),t("div",C,[t("div",L,[t("label",P,[t("small",null,[n(a,{t:"Enter IP Address / Hostname"})])]),y(t("input",{disabled:this.tracing,id:"ipAddress",class:"form-control rounded-3","onUpdate:modelValue":s[0]||(s[0]=e=>this.ipAddress=e),onKeyup:s[1]||(s[1]=x(e=>this.execute(),["enter"])),type:"text"},null,40,O),[[f,this.ipAddress]])]),t("button",{class:"btn btn-primary rounded-3 position-relative flex-grow-1",disabled:this.tracing||!this.ipAddress,onClick:s[2]||(s[2]=e=>this.execute())},[n(c,{name:"slide"},{default:r(()=>[this.tracing?(l(),o("span",I,s[4]||(s[4]=[t("span",{class:"spinner-border spinner-border-sm","aria-hidden":"true"},null,-1),t("span",{class:"visually-hidden",role:"status"},"Loading...",-1)]))):(l(),o("span",B,s[3]||(s[3]=[t("i",{class:"bi bi-person-walking me-2"},null,-1),v("Trace! ")])))]),_:1})],8,V)]),t("div",N,[n(c,{name:"ping"},{default:r(()=>[this.tracerouteResult?(l(),o("div",D,[n(p,{d:this.tracerouteResult,type:"traceroute"},null,8,["d"]),t("div",E,[t("table",F,[t("thead",null,[t("tr",null,[t("th",G,[n(a,{t:"Hop"})]),t("th",H,[n(a,{t:"IP Address"})]),t("th",K,[n(a,{t:"Average RTT (ms)"})]),t("th",W,[n(a,{t:"Min RTT (ms)"})]),t("th",j,[n(a,{t:"Max RTT (ms)"})]),t("th",U,[n(a,{t:"Geolocation"})])])]),t("tbody",null,[(l(!0),o(u,null,m(this.tracerouteResult,(e,et)=>(l(),o("tr",null,[t("td",null,[t("small",null,i(e.hop),1)]),t("td",null,[t("small",null,[t("samp",null,i(e.ip),1)])]),t("td",null,[t("small",null,[t("samp",null,i(e.avg_rtt),1)])]),t("td",null,[t("small",null,[t("samp",null,i(e.min_rtt),1)])]),t("td",null,[t("small",null,[t("samp",null,i(e.max_rtt),1)])]),t("td",null,[e.geo.city&&e.geo.country?(l(),o("span",q,[t("small",null,i(e.geo.city)+", "+i(e.geo.country),1)])):(l(),o("span",J," - "))])]))),256))])])])])):(l(),o("div",z,[s[5]||(s[5]=t("div",{class:"pingPlaceholder bg-body-secondary rounded-3 mb-3",style:{height:"300px !important"}},null,-1)),(l(),o(u,null,m(5,e=>t("div",{class:k(["pingPlaceholder bg-body-secondary rounded-3 mb-3",{"animate__animated animate__flash animate__slower animate__infinite":this.tracing}]),style:T({"animation-delay":`${e*.05}s`})},null,6)),64))]))]),_:1})])])])}const lt=h(R,[["render",Q],["__scopeId","data-v-3e75b4d4"]]);export{lt as default};
import{_ as h,W as g,g as b,c as o,b as t,d as n,m as y,y as f,C as x,w as r,j as c,a as l,f as v,F as u,h as m,n as k,s as T,t as i,k as _}from"./index-yyrQoDaj.js";import{O as A}from"./osmap-DuNGwvCt.js";import{L as w}from"./localeText-DHIWqoQC.js";const R={name:"traceroute",components:{LocaleText:w,OSMap:A},data(){return{tracing:!1,ipAddress:void 0,tracerouteResult:void 0}},setup(){return{store:g()}},methods:{execute(){this.ipAddress&&(this.tracing=!0,this.tracerouteResult=void 0,b("/api/traceroute/execute",{ipAddress:this.ipAddress},d=>{d.status?this.tracerouteResult=d.data:this.store.newMessage("Server",d.message,"danger"),this.tracing=!1}))}}},M={class:"mt-md-5 mt-3 text-body"},S={class:"container-md"},$={class:"mb-3 text-body"},C={class:"d-flex gap-2 mb-3 flex-column"},L={class:"flex-grow-1"},P={class:"mb-1 text-muted",for:"ipAddress"},O=["disabled"],V=["disabled"],B={key:0,class:"d-block"},I={key:1,class:"d-block"},N={class:"position-relative"},z={key:"pingPlaceholder"},D={key:1},E={key:"table",class:"w-100 mt-2"},F={class:"table table-sm rounded-3 w-100"},G={scope:"col"},H={scope:"col"},K={scope:"col"},W={scope:"col"},j={scope:"col"},U={scope:"col"},q={key:0},J={key:1};function Q(d,s,X,Y,Z,tt){const a=_("LocaleText"),p=_("OSMap");return l(),o("div",M,[t("div",S,[t("h3",$,[n(a,{t:"Traceroute"})]),t("div",C,[t("div",L,[t("label",P,[t("small",null,[n(a,{t:"Enter IP Address / Hostname"})])]),y(t("input",{disabled:this.tracing,id:"ipAddress",class:"form-control rounded-3","onUpdate:modelValue":s[0]||(s[0]=e=>this.ipAddress=e),onKeyup:s[1]||(s[1]=x(e=>this.execute(),["enter"])),type:"text"},null,40,O),[[f,this.ipAddress]])]),t("button",{class:"btn btn-primary rounded-3 position-relative flex-grow-1",disabled:this.tracing||!this.ipAddress,onClick:s[2]||(s[2]=e=>this.execute())},[n(c,{name:"slide"},{default:r(()=>[this.tracing?(l(),o("span",I,s[4]||(s[4]=[t("span",{class:"spinner-border spinner-border-sm","aria-hidden":"true"},null,-1),t("span",{class:"visually-hidden",role:"status"},"Loading...",-1)]))):(l(),o("span",B,s[3]||(s[3]=[t("i",{class:"bi bi-person-walking me-2"},null,-1),v("Trace! ")])))]),_:1})],8,V)]),t("div",N,[n(c,{name:"ping"},{default:r(()=>[this.tracerouteResult?(l(),o("div",D,[n(p,{d:this.tracerouteResult,type:"traceroute"},null,8,["d"]),t("div",E,[t("table",F,[t("thead",null,[t("tr",null,[t("th",G,[n(a,{t:"Hop"})]),t("th",H,[n(a,{t:"IP Address"})]),t("th",K,[n(a,{t:"Average RTT (ms)"})]),t("th",W,[n(a,{t:"Min RTT (ms)"})]),t("th",j,[n(a,{t:"Max RTT (ms)"})]),t("th",U,[n(a,{t:"Geolocation"})])])]),t("tbody",null,[(l(!0),o(u,null,m(this.tracerouteResult,(e,et)=>(l(),o("tr",null,[t("td",null,[t("small",null,i(e.hop),1)]),t("td",null,[t("small",null,[t("samp",null,i(e.ip),1)])]),t("td",null,[t("small",null,[t("samp",null,i(e.avg_rtt),1)])]),t("td",null,[t("small",null,[t("samp",null,i(e.min_rtt),1)])]),t("td",null,[t("small",null,[t("samp",null,i(e.max_rtt),1)])]),t("td",null,[e.geo.city&&e.geo.country?(l(),o("span",q,[t("small",null,i(e.geo.city)+", "+i(e.geo.country),1)])):(l(),o("span",J," - "))])]))),256))])])])])):(l(),o("div",z,[s[5]||(s[5]=t("div",{class:"pingPlaceholder bg-body-secondary rounded-3 mb-3",style:{height:"300px !important"}},null,-1)),(l(),o(u,null,m(5,e=>t("div",{class:k(["pingPlaceholder bg-body-secondary rounded-3 mb-3",{"animate__animated animate__flash animate__slower animate__infinite":this.tracing}]),style:T({"animation-delay":`${e*.05}s`})},null,6)),64))]))]),_:1})])])])}const lt=h(R,[["render",Q],["__scopeId","data-v-3e75b4d4"]]);export{lt as default};

View File

@ -10,7 +10,7 @@
<link rel="icon" href="/static/app/dist/favicon.png">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>WGDashboard</title>
<script type="module" crossorigin src="/static/app/dist/assets/index-BhuLDFPZ.js"></script>
<script type="module" crossorigin src="/static/app/dist/assets/index-yyrQoDaj.js"></script>
<link rel="stylesheet" crossorigin href="/static/app/dist/assets/index-DjJVGzEF.css">
</head>
<body>

View File

@ -105,7 +105,7 @@ const deleteConfigurationModal = ref(false)
<button
@click="updateConfigurationName = true"
class="btn btn-sm bg-danger-subtle border-danger-subtle text-danger-emphasis rounded-3 ms-auto">
Update Name
<LocaleText t="Update Name"></LocaleText>
</button>
</div>
<UpdateConfigurationName
@ -210,7 +210,9 @@ const deleteConfigurationModal = ref(false)
</button>
</div>
<hr>
<h5 class="mb-3">Danger Zone</h5>
<h5 class="mb-3">
<LocaleText t="Danger Zone"></LocaleText>
</h5>
<div class="d-flex gap-2 flex-column">
<button
@click="backupRestoreModal = true"

View File

@ -56,10 +56,6 @@ const saveRaw = async () => {
<button type="button" class="btn-close ms-auto" @click="emits('close')"></button>
</div>
<div class="card-body px-4 d-flex flex-column gap-3">
<div class="alert alert-warning rounded-3 mb-0">
<i class="bi-exclamation-triangle-fill me-2"></i>
<LocaleText t="Please be careful when editing the raw file"></LocaleText>
</div>
<div class="alert alert-danger rounded-3 mb-0" v-if="error">
<div class="mb-2">
<strong>

View File

@ -73,7 +73,7 @@ const rename = async () => {
<LocaleText t="Configuration name is invalid. Possible reasons:"></LocaleText>
<ul class="mb-0">
<li>
<LocaleText t="Configuration name already exist."></LocaleText>
<LocaleText t="Configuration name already exist"></LocaleText>
</li>
<li>
<LocaleText t="Configuration name can only contain 15 lower/uppercase alphabet, numbers, underscore, equal sign, plus sign, period and hyphen."></LocaleText>

View File

@ -5,8 +5,10 @@ import "animate.css"
import PeerSettingsDropdown from "@/components/configurationComponents/peerSettingsDropdown.vue";
import LocaleText from "@/components/text/localeText.vue";
import {DashboardConfigurationStore} from "@/stores/DashboardConfigurationStore.js";
import {GetLocale} from "../../utilities/locale.js";
export default {
name: "peer",
methods: {GetLocale},
components: {LocaleText, PeerSettingsDropdown},
props: {
Peer: Object
@ -76,7 +78,7 @@ export default {
</div>
<div class="card-body pt-1" style="font-size: 0.9rem">
<h6>
{{Peer.name ? Peer.name : 'Untitled Peer'}}
{{Peer.name ? Peer.name : GetLocale('Untitled Peer')}}
</h6>
<div class="d-flex"
:class="[dashboardStore.Configuration.Server.dashboard_peer_list_display === 'grid' ? 'gap-1 flex-column' : 'flex-row gap-3']">

View File

@ -70,7 +70,18 @@ const copy = async () => {
<button type="button" class="btn-close ms-auto"
@click="emit('close')"></button>
</div>
<div class="card-body p-4">
<div class="card-body p-4 d-flex flex-column gap-3">
<div style="height: 300px" class="d-flex">
<textarea
style="height: 300px"
class="form-control w-100 rounded-3 animate__fadeIn animate__faster animate__animated"
id="peerConfigurationFile"
:class="{'d-none': loading}"
:value="configurationFile"></textarea>
<div class="spinner-border m-auto" role="status" v-if="loading">
<span class="visually-hidden">Loading...</span>
</div>
</div>
<div class="d-flex">
<button
@click="copy()"
@ -86,18 +97,6 @@ const copy = async () => {
</Transition>
</button>
</div>
<div style="height: 300px" class="d-flex">
<textarea
style="height: 300px"
class="form-control w-100 rounded-3 mt-2 animate__fadeIn animate__faster animate__animated"
id="peerConfigurationFile"
:class="{'d-none': loading}"
:value="configurationFile"></textarea>
<div class="spinner-border m-auto" role="status" v-if="loading">
<span class="visually-hidden">Loading...</span>
</div>
</div>
</div>
</div>
</div>

View File

@ -49,16 +49,18 @@ onMounted(() => {
</h6>
<input
ref="searchBar"
class="form-control rounded-3 bg-secondary-subtle border-1 border-secondary-subtle "
class="flex-grow-1 form-control rounded-3 bg-secondary-subtle border-1 border-secondary-subtle "
:placeholder="searchBarPlaceholder"
id="searchPeers"
@keyup="debounce()"
v-model="searchString">
<button
@click="emits('close')"
style="white-space: nowrap"
class="btn bg-secondary-subtle text-secondary-emphasis border-secondary-subtle rounded-3 d-flex align-items-center">
<i class="bi bi-x-circle-fill me-2"></i>
<LocaleText t="Done"></LocaleText>
<span>
<i class="bi bi-x-circle-fill me-2"></i><LocaleText t="Done"></LocaleText>
</span>
</button>
</div>
</div>

View File

@ -127,7 +127,7 @@ export default {
title="Configuration File"
@click="this.$emit('configurationFile')"></PeerSettingsDropdownTool>
<PeerSettingsDropdownTool icon="bi-share"
title="Share"
title="Share Peer"
@click="this.$emit('share')"></PeerSettingsDropdownTool>
</div>
</li>

View File

@ -1,5 +1,6 @@
<script setup>
import {ref} from "vue";
import LocaleText from "@/components/text/localeText.vue";
const props = defineProps({
icon: String,
@ -22,7 +23,7 @@ const show = ref(false)
v-if="show"
class="position-absolute d-block p-1 px-2 bg-body text-body rounded-3 border shadow">
<small>
{{title}}
<LocaleText :t="title"></LocaleText>
</small>
</span>
</Transition>

View File

@ -37,9 +37,7 @@ const sendEmail = async () => {
})
}
const placeholderTranslate = (key) => {
return GetLocale(key)
}
const emits = defineEmits(['fullscreen'])
watch(livePreview, () => {
emits('fullscreen', livePreview.value)
@ -62,7 +60,7 @@ watch(livePreview, () => {
style="padding-left: calc( 0.75rem + 24px )"
v-model="email.Receiver"
:disabled="sending"
:placeholder="placeholderTranslate('Send to who?')"
:placeholder="GetLocale('Who are you sending to?')"
required
id="email_receiver" aria-describedby="emailHelp">
</div>
@ -70,7 +68,7 @@ watch(livePreview, () => {
<i class="bi bi-hash" style="position: absolute; top: 0.4rem; left: 0.75rem;"></i>
<input type="text" class="form-control rounded-0 border-top-0 border-bottom-0"
style="padding-left: calc( 0.75rem + 24px )"
:placeholder="placeholderTranslate('Subject')"
:placeholder="GetLocale('What\'s the subject?')"
:disabled="sending"
v-model="email.Subject"
id="email_subject" aria-describedby="emailHelp">
@ -80,7 +78,7 @@ watch(livePreview, () => {
<textarea class="form-control rounded-top-0 rounded-bottom-0 font-monospace border-bottom-0"
v-model="email.Body"
:disabled="sending"
:placeholder="placeholderTranslate('Body')"
:placeholder="GetLocale('What\'s the body?')"
style="height: 400px; max-height: 400px;"></textarea>
</div>
<div class="col-6" v-if="livePreview">

View File

@ -142,7 +142,7 @@ export default {
:class="{'bg-primary-subtle text-primary-emphasis': this.currentDisplay === x.name}"
class="px-2 py-1 rounded-3">
<small>
<i class="bi me-2" :class="'bi-' + x.key"></i> {{x.name}}
<i class="bi me-2" :class="'bi-' + x.key"></i> <LocaleText :t="x.name"></LocaleText>
</small>
</a>

View File

@ -159,10 +159,8 @@ const sendTestEmail = async () => {
</small>
</label>
<form
@submit="(e) => {e.preventDefault(); sendTestEmail()}"
class="input-group">
<input type="email" class="form-control rounded-start-3"
id="test_email"
placeholder="john@example.com"
@ -174,7 +172,6 @@ const sendTestEmail = async () => {
id="button-addon2">
<i class="bi bi-send me-2" v-if="!testing"></i>
<span class="spinner-border spinner-border-sm me-2" v-else>
<span class="visually-hidden">Loading...</span>
</span>
<LocaleText :t="!testing ? 'Send':'Sending...'"></LocaleText>
</button>

View File

@ -325,7 +325,7 @@ export default {
<div class="card rounded-3 shadow">
<div class="card-header d-flex align-items-center">
<LocaleText t="IP Address/CIDR"></LocaleText>
<span class="badge rounded-pill text-bg-success ms-auto">{{ numberOfAvailableIPs }} Available IPs</span>
<span class="badge rounded-pill text-bg-success ms-auto"><LocaleText :t="numberOfAvailableIPs + ' Available IP Address'"></LocaleText></span>
</div>
<div class="card-body">
<input type="text" class="form-control"

View File

@ -326,7 +326,9 @@ const networkSpeedHistoricalChartData = computed(() => {
<div class="progress-bar bg-info" :style="{width: `${data?.Memory.VirtualMemory.percent}%` }"></div>
</div>
<div class="d-flex align-items-center">
<h6 class="mb-0">Swap Memory</h6>
<h6 class="mb-0">
<LocaleText t="Swap Memory"></LocaleText>
</h6>
<h6 class="mb-0 ms-auto">{{data?.Memory.SwapMemory.percent}}%</h6>
</div>
<div class="progress" role="progressbar" style="height: 10px">
@ -451,7 +453,7 @@ const networkSpeedHistoricalChartData = computed(() => {
</h6>
<h6 class="mb-0 ms-auto d-flex gap-2">
<span class="text-success">
{{ Math.round((disk.used / 1024000000 + Number.EPSILON) * 100) / 100}} / {{ Math.round((disk.total / 1024000000 + Number.EPSILON) * 100) / 100}} GB Used
<LocaleText :t="Math.round((disk.used / 1024000000 + Number.EPSILON) * 100) / 100 + ' / ' + Math.round((disk.total / 1024000000 + Number.EPSILON) * 100) / 100 + ' GB Used'"></LocaleText>
</span>
</h6>
</div>

View File

@ -1,67 +1,97 @@
[
{
"lang_id": "cs",
"lang_name": "Czech",
"lang_name_localized": "Česky"
},
{
"lang_id": "de-de",
"lang_name": "German",
"lang_name_localized": "Deutsch"
},
{
"lang_id": "en",
"lang_name": "English",
"lang_name_localized": "English"
},
{
"lang_id": "es-es",
"lang_name": "Spanish",
"lang_name_localized": "Español"
},
{
"lang_id": "it-it",
"lang_name": "Italian",
"lang_name_localized": "Italiano"
},
{
"lang_id": "nl-nl",
"lang_name": "Dutch",
"lang_name_localized": "Nederlands"
},
{
"lang_id": "ru",
"lang_name": "Russian",
"lang_name_localized": "Русский"
},
{
"lang_id": "tr-tr",
"lang_name": "Turkish",
"lang_name_localized": "Türkçe"
},
{
"lang_id": "uk",
"lang_name": "Ukrainian",
"lang_name_localized": "Українська"
},
{
"lang_id": "zh-cn",
"lang_name": "Chinese (Simplified)",
"lang_name_localized": "中文(简体)"
},
{
"lang_id": "zh-hk",
"lang_name": "Chinese (Traditional)",
"lang_name_localized": "中文(繁體)"
},
{
{
"lang_id": "ar-sa",
"lang_name": "Arabic",
"lang_name_localized": "العربية"
},
{
"lang_id": "zh-cn",
"lang_name": "Chinese (Simplified)",
"lang_name_localized": "中文(简体)"
},
{
"lang_id": "zh-hk",
"lang_name": "Chinese (Traditional)",
"lang_name_localized": "中文(繁體)"
},
{
"lang_id": "cs",
"lang_name": "Czech",
"lang_name_localized": "Česky"
},
{
"lang_id": "nl-nl",
"lang_name": "Dutch",
"lang_name_localized": "Nederlands"
},
{
"lang_id": "en",
"lang_name": "English",
"lang_name_localized": "English"
},
{
"lang_id": "fa",
"lang_name": "Farsi",
"lang_name_localized": "فارسی"
},
{
"lang_id": "fr-ca",
"lang_name": "French (Quebec)",
"lang_name_localized": "Français (Québec)"
},
{
"lang_id": "de-de",
"lang_name": "German",
"lang_name_localized": "Deutsch"
},
{
"lang_id": "it-it",
"lang_name": "Italian",
"lang_name_localized": "Italiano"
},
{
"lang_id": "ja-jp",
"lang_name": "Japanese",
"lang_name_localized": "日本語"
},
{
"lang_id": "ko",
"lang_name": "Korean",
"lang_name_localized": "한국어"
},
{
"lang_id": "pl",
"lang_name": "Polish",
"lang_name_localized": "Polski"
},
{
"lang_id": "ru",
"lang_name": "Russian",
"lang_name_localized": "Русский"
},
{
"lang_id": "es-es",
"lang_name": "Spanish",
"lang_name_localized": "Español"
},
{
"lang_id": "sv-se",
"lang_name": "Swedish",
"lang_name_localized": "Svenska"
},
{
"lang_id": "pl",
"lang_name": "Polish",
"lang_name_localized": "Polski"
}
},
{
"lang_id": "th",
"lang_name": "Thai",
"lang_name_localized": "ภาษาไทย"
},
{
"lang_id": "tr-tr",
"lang_name": "Turkish",
"lang_name_localized": "Türkçe"
},
{
"lang_id": "uk",
"lang_name": "Ukrainian",
"lang_name_localized": "Українська"
}
]

View File

@ -0,0 +1,312 @@
{
"Welcome to": "مرحبا بك في ",
"Username": "اسم المستخدم",
"Password": "كلمة المرور",
"OTP from your authenticator": "كلمة المرور لمرة واحدة من المصادق الخاص بك",
"Sign In": "تسجيل الدخول",
"Signing In\\.\\.\\.": "جاري تسجيل الدخول ...",
"Access Remote Server": "الوصول الي الخادم البعيد",
"Server": "الخادم",
"Click": "انقر",
"Pinging...": " .جاري فحص الاتصال ...",
"to add your server": "لاضافة خادمك",
"Server List": "قائمة الخوادم",
"Sorry, your username or password is incorrect.": "عذرا ، اسم المستخدم او كلمة المرور غير صحيحة",
"Home": "الصفحة الرئيسية",
"Settings": "الإعدادات",
"Tools": "الادوات",
"Sign Out": "تسجيل الخروج",
"Checking for update...": "جاري تسجيل الخروج",
"You're on the latest version": "انت تستخدم احدث اصدار",
"WireGuard Configurations": "تكوينات WireGuard",
"You don't have any WireGuard configurations yet. Please check the configuration folder or change it in Settings. By default the folder is /etc/wireguard.": "ليس لديك أي تكوينات WireGuard بعد. يرجى التحقق من مجلد التكوين أو تغييره في الإعدادات. المجلد الافتراضي هو /etc/wireguard.",
"Configuration": "التكوين",
"Configurations": "التكوينات",
"Peers Default Settings": "إعدادات النظراء الافتراضية",
"Dashboard Theme": "سمة لوحة التحكم",
"Light": "فاتح",
"Dark": "داكن",
"This will be changed globally, and will be apply to all peer's QR code and configuration file.": "سيتم تغيير هذا في كل الاعدادات وسيطبق على جميع رموز الاستجابة السريعة الخاصة بالنظراء وملفات التكوين.",
"WireGuard Configurations Settings": "إعدادات تكوينات WireGuard",
"Configurations Directory": "مسار التكوينات",
"Remember to remove / at the end of your path. e.g /etc/wireguard": "تذكر إزالة / في نهاية المسار الخاص بك. مثال: /etc/wireguard",
"WGDashboard Account Settings": "إعدادات حساب WGDashboard",
"Current Password": "كلمة المرور الحالية",
"New Password": "كلمة المرور الجديدة",
"Repeat New Password": "كرر كلمة المرور الجديدة",
"Update Password": "تحديث كلمة المرور",
"Multi-Factor Authentication \\(MFA\\)": "المصادقة متعددة العوامل (MFA)",
"Reset": "إعادة ضبط",
"Setup": "إعداد",
"API Keys": "مفاتيح API",
"API Key": "مفتاح API",
"Key": "مفتاح",
"Enabled": "مفعل",
"Disabled": "معطل",
"No WGDashboard API Key": "لا يوجد مفتاح API لـ WGDashboard",
"Expire At": "ينتهي في",
"Are you sure to delete this API key\\?": "هل انت متاكد ان تحذف هذا المفتاح للـAPI ",
"Create API Key": "إنشاء مفتاح API",
"When should this API Key expire\\?": "متي يجب ان ينتهي هذا المفتاح للـ API",
"Never Expire": "لا ينتهي أبدًا",
"Don't think that's a good idea": "لا أعتقد أن هذه فكرة جيدة",
"Creating\\.\\.\\.": "جاري الانشاء",
"Create": "إنشاء",
"Status": "الحالة",
"On": "مشغل",
"Off": "متوقف",
"Turning On\\.\\.\\.": "تشغيل",
"Turning Off\\.\\.\\.": "إيقاف",
"Address": "العنوان",
"Listen Port": "منفذ الاستماع",
"Public Key": "المفتاح العام",
"Connected Peers": "النظراء المتصلون",
"Total Usage": "الاستخدام الكلي",
"Total Received": "الإجمالي المستلم",
"Total Sent": "الإجمالي المرسل",
"Peers Data Usage": "استهلاك بيانات النظراء",
"Real Time Received Data Usage": "استهلاك البيانات المستلمة في الوقت الفعلي",
"Real Time Sent Data Usage": "استهلاك البيانات المرسلة في الوقت الفعلي",
"Peer": "نظير",
"Peers": "النظراء",
"Peer Settings": "إعدادات النظير",
"Download All": "تنزيل الكل",
"Search Peers\\.\\.\\.": "بحث في النظراء",
"Display": "عرض",
"Sort By": "فرز حسب",
"Refresh Interval": "فترة التحديث",
"Name": "الاسم",
"Allowed IPs": "عناوين IP المسموح بها",
"Restricted": "مقيد",
"(.*) Seconds": "$1 ثانية",
"(.*) Minutes": "$1 دقيقة",
"Configuration Settings": "إعدادات التكوين",
"Peer Jobs": "وظائف النظير",
"Active Jobs": "الوظائف النشطة",
"All Active Jobs": "جميع الوظائف النشطة",
"Logs": "السجلات",
"Private Key": "المفتاح الخاص",
"\\(Required for QR Code and Download\\)": " الزامي لرمز الاستجابة السريعة والتحميل",
"\\(Required\\)": "الزامي",
"Endpoint Allowed IPs": "عناوين IP المسموح بها لنقطة النهاية",
"DNS": "DNS",
"Optional Settings": "إعدادات اختيارية",
"Pre-Shared Key": "المفتاح المشترك مسبقًا",
"MTU": "MTU",
"Persistent Keepalive": "الاستمرار في الإبقاء على الاتصال",
"Reset Data Usage": "إعادة ضبط استهلاك البيانات",
"Total": "الإجمالي",
"Sent": "تم الإرسال",
"Received": "تم الاستلام",
"Revert": "إعادة",
"Save Peer": "حفظ النظير",
"QR Code": "رمز الاستجابة السريع",
"Schedule Jobs": "جدولة الوظائف",
"Job": "وظيفة",
"Job ID": "معرف الوظيفة",
"Unsaved Job": "وظيفة غير محفوظة",
"This peer does not have any job yet\\.": "هذا النظير ليس لدية وظيفة نشطة بعد",
"if": "إذا",
"is": "هو",
"then": "ثم",
"larger than": "أكبر من",
"Date": "التاريخ",
"Restrict Peer": "تقييد النظير",
"Delete Peer": "حذف النظير",
"Edit": "تعديل",
"Delete": "حذف",
"Deleting...": "جارٍ الحذف...",
"Cancel": "إلغاء",
"Save": "حفظ",
"No active job at the moment\\.": "لايوجد وظائف نشطة في الوقت الحالي",
"Jobs Logs": "سجلات الوظائف",
"Updated at": "تم التحديث في",
"Refresh": "تحديث",
"Filter": "تصفية",
"Success": "نجاح",
"Failed": "فشل",
"Log ID": "معرف السجل",
"Message": "رسالة",
"Share Peer": "مشاركة النظير",
"Currently the peer is not sharing": "النظير لا يشارك حاليًا",
"Sharing\\.\\.\\.": "جاري المشاركة",
"Start Sharing": "بدء المشاركة",
"Stop Sharing\\.\\.\\.": "جاري ايقاف المشاركة",
"Stop Sharing": "إيقاف المشاركة",
"Access Restricted": "الوصول مقيد",
"Restrict Access": "تقيد الوصول",
"Restricting\\.\\.\\.": "جاري التقيد ...",
"Allow Access": "السماح بالوصول",
"Allowing Access\\.\\.\\.": "جاري السماح بالوصول ...",
"Download \\& QR Code is not available due to no private key set for this peer": "التنزيل ورمز الاستجابة السريعة غير متاحين نظرًا لعدم تعيين مفتاح خاص لهذا القرين",
"Add Peers": "إضافة نظراء",
"Bulk Add": "إضافة بالجملة",
"By adding peers by bulk, each peer's name will be auto generated, and Allowed IP will be assign to the next available IP\\.": "عند إضافة الأقران بشكل جماعي، سيتم إنشاء اسم كل قرين تلقائيًا، وسيتم تخصيص عنوان IP المسموح به إلى عنوان IP التالي المتاح",
"How many peers you want to add\\?": "كم عدد النظراء التي تريد اضافتها",
"You can add up to (.*) peers": "يمكنك إضافة ما يصل إلى $1 نظير",
"Use your own Private and Public Key": "استخدم المفتاح الخاص والعام الخاص بك",
"Enter IP Address/CIDR": "أدخل عنوان IP/CIDR",
"IP Address/CIDR": "عنوان IP/CIDR",
"or": "أو",
"Pick Available IP": "اختر عنوان IP متاحًا",
"No available IP containing": "لا يوجد عنوان IP متاح يحتوي على",
"Add": "إضافة",
"Adding\\.\\.\\.": "جاري الاضافة",
"Failed to check available update": "فشل في التحقق من التحديث المتاح",
"Nice to meet you!": "تشرفت بلقائك!",
"Please fill in the following fields to finish setup": "يرجى ملء الحقول التالية لإكمال الإعداد",
"Create an account": "إنشاء حساب",
"Enter an username you like": "أدخل اسم مستخدم يعجبك",
"Enter a password": "أدخل كلمة مرور",
"\\(At least 8 characters and make sure is strong enough!\\)": "(يجب أن تكون 8 أحرف على الأقل وتأكد من قوتها!)",
"Confirm password": "تأكيد كلمة المرور",
"Next": "التالي",
"Saving\\.\\.\\.": "جارٍ الحفظ...",
"1\\. Please scan the following QR Code to generate TOTP with your choice of authenticator": "1\\. يرجى مسح رمز الاستجابة السريعة التالي لإنشاء كلمة مرور لمرة واحدة (TOTP) باستخدام تطبيق المصادقة الذي تختاره",
"Or you can click the link below:": "أو يمكنك النقر على الرابط أدناه:",
"2\\. Enter the TOTP generated by your authenticator to verify": "2\\. أدخل كلمة المرور لمرة واحدة (TOTP) التي تم إنشاؤها بواسطة تطبيق المصادقة للتحقق",
"TOTP verified!": "تم التحقق من كلمة المرور لمرة واحدة (TOTP) بنجاح!",
"I don't need MFA": "لا أحتاج إلى المصادقة متعددة العوامل (MFA).",
"Complete": "اكتمل",
"(v[0-9.]{1,}) is now available for update!": "$1 متاح الآن للتحديث!",
"Current Version:": "الإصدار الحالي:",
"Oh no\\.\\.\\. This link is either expired or invalid\\.": "عذرًا... هذا الرابط إما منتهي الصلاحية أو غير صالح",
"Scan QR Code with the WireGuard App to add peer": "قم بمسح رمز الاستجابة السريعة باستخدام تطبيق WireGuard لإضافة قرين",
"or click the button below to download the ": "أو انقر على الزر أدناه لتحميل ",
" file": " الملف",
"FROM ": "من ",
"(.*) is on": "(.*) قيد التشغيل",
"(.*) is off": "(.*) متوقف",
"Allowed IPs is invalid": "عناوين IP المسموح بها غير صالحة",
"Peer created successfully": "تم إنشاء القرين بنجاح",
"Please fill in all required box": "يرجى ملء جميع الحقول المطلوبة",
"Please specify amount of peers you want to add": "يرجى تحديد عدد الأقران الذين ترغب في إضافتهم",
"No more available IP can assign": "لا توجد عناوين IP متاحة للتخصيص.",
"The maximum number of peers can add is (.*)": "الحد الأقصى لعدد الأقران الذين يمكن إضافتهم هو $1",
"Generating key pairs by bulk failed": "فشل إنشاء أزواج المفاتيح بشكل جماعي.",
"Failed to add peers in bulk": "فشل في إضافة الأقران بشكل جماعي.",
"This peer already exist": "هذا القرين موجود بالفعل.",
"This IP is not available: (.*)": "عنوان IP هذا غير متاح: $1",
"Configuration does not exist": "الإعداد غير موجود",
"Peer does not exist": "القرين غير موجود",
"Please provide a valid configuration name": "يرجى تقديم اسم إعداد صالح",
"Peer saved": "تم حفظ القرين.",
"Allowed IPs already taken by another peer": "عناوين IP المسموح بها مستخدمة بالفعل بواسطة قرين آخر",
"Endpoint Allowed IPs format is incorrect": "تنسيق عناوين IP المسموح بها للنقطة النهائية غير صحيح",
"DNS format is incorrect": "تنسيق DNS غير صحيح",
"MTU format is not correct": "تنسيق MTU غير صحيح",
"Persistent Keepalive format is not correct": "تنسيق الإبقاء النشط (Keepalive) غير صحيح",
"Private key does not match with the public key": "المفتاح الخاص لا يتطابق مع المفتاح العام",
"Update peer failed when updating Pre-Shared Key": "فشل تحديث القرين عند تحديث المفتاح المشترك مسبقًا",
"Update peer failed when updating Allowed IPs": "فشل تحديث القرين عند تحديث عناوين IP المسموح بها",
"Update peer failed when saving the configuration": "فشل تحديث القرين عند حفظ الإعداد",
"Peer data usage reset successfully": "تمت إعادة تعيين استخدام بيانات القرين بنجاح",
"Peer download started": "بدأ تنزيل القرين",
"Please specify one or more peers": "يرجى تحديد قرين واحد أو أكثر",
"Share link failed to create. Reason: (.*)": "فشل إنشاء رابط المشاركة. السبب: $1",
"Link expire date updated": "تم تحديث تاريخ انتهاء صلاحية الرابط.",
"Link expire date failed to update. Reason: (.*)": "فشل تحديث تاريخ انتهاء صلاحية الرابط. السبب: $1",
"Peer job saved": "تم حفظ وظيفة القرين",
"Please specify job": "يرجى تحديد الوظيفة.",
"Please specify peer and configuration": "يرجى تحديد القرين والإعداد",
"Peer job deleted": "تم حذف وظيفة القرين",
"API Keys function is successfully enabled": "تم تفعيل وظيفة مفاتيح API بنجاح",
"API Keys function is successfully disabled": "تم تعطيل وظيفة مفاتيح API بنجاح",
"API Keys function is failed to enable": "فشل تفعيل وظيفة مفاتيح API",
"API Keys function is failed to disable": "فشل تعطيل وظيفة مفاتيح API",
"WGDashboard API Keys function is disabled": "تم تعطيل وظيفة مفاتيح API في لوحة WGDashboard",
"WireGuard configuration path saved": "تم حفظ مسار إعداد WireGuard",
"API Key deleted": "تم حذف مفتاح API",
"API Key created": "تم إنشاء مفتاح API",
"Sign in session ended, please sign in again": "انتهت جلسة تسجيل الدخول، يرجى تسجيل الدخول مرة أخرى",
"Please specify an IP Address (v4/v6)": "يرجى تحديد عنوان IP (v4/v6)",
"Please provide ipAddress and count": "يرجى تقديم عنوان IP والعدد",
"Please provide ipAddress": "يرجى تقديم عنوان IP",
"Dashboard Language": "لغة لوحة التحكم",
"Dashboard language update failed": "فشل تحديث لغة لوحة التحكم",
"Peer Remote Endpoint": "النقطة الطرفية البعيدة للقرين",
"New Configuration": "إعداد جديد",
"Configuration Name": "اسم الإعداد",
"Configuration name is invalid. Possible reasons:": "اسم الإعداد غير صالح. الأسباب المحتملة:",
"Configuration name already exist\\.": "اسم الإعداد موجود بالفعل",
"Configuration name can only contain 15 lower/uppercase alphabet, numbers, underscore, equal sign, plus sign, period and hyphen\\.": "يمكن أن يحتوي اسم الإعداد على 15 حرفًا فقط، بما في ذلك الحروف الكبيرة/الصغيرة، الأرقام، الشرطة السفلية، علامة التساوي، علامة الزائد، النقطة والشرطة",
"Invalid Port": "المنفذ غير صالح",
"Save Configuration": "حفظ الإعداد",
"IP Address/CIDR is invalid": "عنوان IP/CIDR غير صالح",
"IP Address": "عنوان IP",
"Enter IP Address / Hostname": "أدخل عنوان IP / اسم المضيف",
"IP Address / Hostname": "عنوان IP / اسم المضيف",
"Dashboard IP Address \\& Listen Port": "عنوان IP لوحة التحكم ومنفذ الاستماع",
"Count": "العدد",
"Geolocation": "الموقع الجغرافي",
"Is Alive": "نشط",
"Average / Min / Max Round Trip Time": "متوسط / أدنى / أقصى وقت للرحلة الكاملة",
"Sent / Received / Lost Package": "الحزم المرسلة / المستلمة / المفقودة",
"Manual restart of WGDashboard is needed to apply changes on IP Address and Listen Port": "يتطلب إعادة تشغيل يدوي للوحة WGDashboard لتطبيق التغييرات على عنوان IP ومنفذ الاستماع",
"Restore Configuration": "استعادة الإعداد",
"Step (.*)": "الخطوة $1",
"Select a backup you want to restore": "حدد النسخة الاحتياطية التي تريد استعادتها",
"Click to change a backup": "انقر لتغيير النسخة الاحتياطية",
"Selected Backup": "النسخة الاحتياطية المحددة",
"You don't have any configuration to restore": "ليس لديك أي إعداد لاستعادته",
"Help": "مساعدة",
"Backup": "نسخة احتياطية",
"([0-9].*) Backups?": "$1 نسخة احتياطية؟",
"Yes": "نعم",
"No": "لا",
"Backup not selected": "لم يتم تحديد النسخة الاحتياطية",
"Confirm \\& edit restore information": "تأكيد وتحرير معلومات الاستعادة",
"(.*) Available IP Address": "عنوان IP متاح $1",
"Database File": "ملف قاعدة البيانات",
"Contain": "يحتوي على",
"Restricted Peers?": "الأقران المقيدون؟",
"Restore": "استعادة",
"Restoring": "جاري الاستعادة",
"WGDashboard Settings": "إعدادات WGDashboard",
"Peers Settings": "إعدادات الأقران",
"WireGuard Configuration Settings": "إعدادات تكوين WireGuard",
"Appearance": "المظهر",
"Theme": "السمة",
"Language": "اللغة",
"Account Settings": "إعدادات الحساب",
"Peer Default Settings": "الإعدادات الافتراضية للأقران",
"Toggle When Start Up": "التبديل عند بدء التشغيل",
"Other Settings": "إعدادات أخرى",
"Select Peers": "اختر الأقران",
"Backup & Restore": "النسخ الاحتياطي والاستعادة",
"Delete Configuration": "حذف الإعداد",
"Create Backup": "إنشاء نسخة احتياطية",
"No backup yet, click the button above to create backup\\.": "لا توجد نسخة احتياطية حتى الآن، انقر على الزر أعلاه لإنشاء نسخة احتياطية",
"Are you sure to delete this backup\\?": "هل أنت متأكد من حذف هذه النسخة الاحتياطية؟",
"Are you sure to restore this backup?\\": "هل أنت متأكد من استعادة هذه النسخة الاحتياطية؟",
"Backup Date": "تاريخ النسخة الاحتياطية",
"File": "الملف",
"Are you sure to delete this configuration\\?": "هل أنت متأكد من حذف هذا الإعداد؟",
"Once you deleted this configuration\\:": "بمجرد حذف هذا الإعداد:",
"All connected peers will get disconnected": "سيتم فصل جميع الأقران المتصلين",
"Both configuration file \\(\\.conf\\) and database table related to this configuration will get deleted": "سيتم حذف كل من ملف التكوين (.conf) وجدول قاعدة البيانات المرتبط بهذا التكوين",
"Checking backups...": "جارٍ التحقق من النسخ الاحتياطية...",
"This configuration have ([0-9].*) backups": "يحتوي هذا التكوين على $1 نسخة احتياطية",
"This configuration have no backup": "لا يحتوي هذا التكوين على نسخ احتياطية",
"If you're sure, please type in the configuration name below and click Delete": "إذا كنت متأكدًا، يرجى كتابة اسم الإعداد أدناه والنقر على حذف",
"Select All": "تحديد الكل",
"Clear Selection": "مسح التحديد",
"([0-9].*) Peers?": "$1 قرين؟",
"Downloading": "جاري التنزيل",
"Download Finished": "اكتمل التنزيل",
"Done": "تم",
"Are you sure to delete": "هل أنت متأكد من الحذف",
"Are you sure to delete this peer\\?": "هل أنت متأكد من حذف هذا القرين؟",
"Configuration deleted": "تم حذف الإعداد",
"Configuration saved": "تم حفظ الإعداد",
"WGDashboard language update failed": "فشل تحديث لغة لوحة WGDashboard",
"Configuration restored": "تم استعادة الإعداد",
"Allowed IP already taken by another peer": "عنوان IP المسموح به مستخدم بالفعل بواسطة قرين آخر",
"Failed to allow access of peer (.*)": "فشل السماح بوصول القرين $1",
"Failed to save configuration through WireGuard": "فشل حفظ الإعداد من خلال WireGuard",
"Allow access successfully": "تم السماح بالوصول بنجاح",
"Deleted ([0-9]{1,}) peer\\(s\\)": "تم حذف $1 قرين(قرين)",
"Deleted ([0-9]{1,}) peer\\(s\\) successfully. Failed to delete ([0-9]{1,}) peer\\(s\\)": "تم حذف $1 قرين(قرين) بنجاح. فشل في حذف $2 قرين(قرين)",
"Restricted ([0-9]{1,}) peer\\(s\\)": "تم تقييد $1 قرين(قرين).",
"Restricted ([0-9]{1,}) peer\\(s\\) successfully. Failed to restrict ([0-9]{1,}) peer\\(s\\)": "تم تقييد $1 قرين(قرين) بنجاح. فشل في تقييد $2 قرين(قرين)."
}

View File

@ -308,5 +308,5 @@
"By adding peers by bulk, each peer's name will be auto generated, and Allowed IP will be assign to the next available IP\\.": "Při hromadném importu bude jméno každého peera vygenerované automaticky, a povolená IP adresa bude nastavena na další v pořadí",
"How many peers you want to add\\?": "Kolik peerů chcete přidat?",
"Adding\\.\\.\\.": "Přidávám...",
"Dashboard IP Address \\& Listen Port": ""
"Dashboard IP Address \\& Listen Port": "Dashboard IP adresa a otevřený port"
}

312
src/static/locale/fa.json Normal file
View File

@ -0,0 +1,312 @@
{
"Welcome to": "خوش آمدید",
"Username": "نام کاربری",
"Password": "رمز عبور",
"OTP from your authenticator": "رمز یک‌بارمصرف از برنامه احراز هویت شما",
"Sign In": "ورود",
"Signing In\\.\\.\\.": "ورود به سیستم...",
"Access Remote Server": "دسترسی به سرور از راه دور",
"Server": "سرور",
"Click": "کلیک",
"Pinging...": "در حال پینگ کردن...",
"to add your server": "برای افزودن سرور شما",
"Server List": "لیست سرور ها",
"Sorry, your username or password is incorrect.": "متأسفیم، نام کاربری یا رمز عبور شما نادرست است.",
"Home": "خانه",
"Settings": "تنظیمات",
"Tools": "ابزار ها",
"Sign Out": "خروج",
"Checking for update...": "در حال بررسی به‌روزرسانی...",
"You're on the latest version": "شما از آخرین نسخه استفاده می‌کنید",
"WireGuard Configurations": "پیکربندی‌های وایرگارد",
"You don't have any WireGuard configurations yet. Please check the configuration folder or change it in Settings. By default the folder is /etc/wireguard.": "شما هنوز هیچ پیکربندی وایرگاردی ندارید. لطفاً پوشه پیکربندی را بررسی کنید یا آن را در تنظیمات تغییر دهید. به‌طور پیش‌فرض، پوشه /etc/wireguard است.",
"Configuration": "پیکربندی",
"Configurations": "تنظیمات",
"Peers Default Settings": "تنظیمات پیش فرض Peers",
"Dashboard Theme": "تم داشبورد",
"Light": "روشن",
"Dark": "تاریک",
"This will be changed globally, and will be apply to all peer's QR code and configuration file.": "این تغییر به‌صورت سراسری اعمال خواهد شد و برای کد QR و فایل پیکربندی همه Peer`s اعمال می‌شود.",
"WireGuard Configurations Settings": "تنظیمات پیکربندی‌های وایرگارد",
"Configurations Directory": "پوشه پیکربندی‌ها",
"Remember to remove / at the end of your path. e.g /etc/wireguard": "به یاد داشته باشید که / را در انتهای مسیر خود حذف کنید. به عنوان مثال: /etc/wireguard",
"WGDashboard Account Settings": "تنظیمات حساب WGDashboard",
"رمز عبور فعلی": "",
"رمز عبور جدید": "",
"تکرار رمز عبور جدید": "",
"بروزرسانی رمز عبور": "",
"Multi-Factor Authentication \\(MFA\\)": "احراز هویت چند عاملی (MFA)",
"Reset": "بازنشانی",
"Setup": "نصب",
"API Keys": "API Keys",
"API Key": "API Key",
"Key": "کلید",
"Enabled": "فعال شد",
"Disabled": "غیرفعال شد",
"No WGDashboard API Key": "کلید API WGDashboard وجود ندارد",
"Expire At": "انقضا در",
"Are you sure to delete this API key\\?": "آیا مطمئن هستید که این کلید API را حذف می کنید؟",
"Create API Key": "ایجاد کلید API",
"When should this API Key expire\\?": "چه زمانی باید این کلید API منقضی شود؟",
"Never Expire": "نامحدود",
"Don't think that's a good idea": "پیشنهاد نمی شود",
"Creating\\.\\.\\.": "در ساختن...",
"Create": "ایجاد",
"Status": "وضعیت",
"On": "روشن",
"Off": "خاموش",
"Turning On\\.\\.\\.": "در حال روشن شدن...",
"Turning Off\\.\\.\\.": "در حال خاموش شدن ...",
"Address": "آدرس",
"Listen Port": "پورت گوش‌دادن",
"Public Key": "کلید عمومی",
"Connected Peers": "Peer`s متصل",
"Total Usage": "مصرف کل",
"Total Received": "مجموع دریافت شده",
"Total Sent": "مجموع ارسال شده",
"Peers Data Usage": "داده های مصرفی Peer`s",
"Real Time Received Data Usage": "داده های مصرفی دریافت شده در زمان واقعی",
"Real Time Sent Data Usage": "داده های مصرفی ارسال شده در زمان واقعی",
"Peer": "Peer",
"Peers": "Peers",
"Peer Settings": "تنظیمات Peer",
"Download All": "دانلود همه",
"Search Peers\\.\\.\\.": "جستجو Peer",
"Display": "نمایش",
"Sort By": "مرتب سازی براساس",
"Refresh Interval": "فاصله بازخوانی",
"Name": "نام",
"Allowed IPs": "IP های مجاز",
"Restricted": "محدود شده",
"(.*) Seconds": "1$ ثانیه",
"(.*) Minutes": "$1 دقیقه",
"Configuration Settings": "تنظیمات پیکربندی",
"Peer Jobs": "جاب peer",
"Active Jobs": "جاب های فعال",
"All Active Jobs": "همه جاب های فعال",
"Logs": "گزارش ها",
"Private Key": "کلید خصوصی",
"\\(Required for QR Code and Download\\)": "(برای کد QR و دانلود لازم است)",
"\\(Required\\)": "(الزامی)",
"Endpoint Allowed IPs": "IP های مجاز نقطه پایانی",
"DNS": "DNS",
"Optional Settings": "تنظیمات اختیاری",
"Pre-Shared Key": "کلید از قبل به اشتراک گذاشته شده",
"MTU": "MTU",
"Persistent Keepalive": " نگه‌داری پایدار اتصال",
"Reset Data Usage": "بازنشانی مصرف داده",
"Total": "مجموع",
"Sent": "ارسال",
"Received": "دریافت",
"Revert": "برگرداندن تغییرات",
"Save Peer": "ذخیره peer",
"QR Code": "QR Code",
"Schedule Jobs": "برنامه ریزی جاب ها",
"Job": "جاب",
"Job ID": "شناسه جاب",
"Unsaved Job": "جاب ذخیره نشده",
"This peer does not have any job yet\\.": "این peer هیچ جاب فعالی ندارد",
"if": "اگر",
"is": "هست",
"then": "سپس",
"larger than": "بزرگتر از",
"Date": "تاریخ",
"Restrict Peer": "محدود کردن peer",
"Delete Peer": "حذف peer",
"Edit": "ویرایش",
"Delete": "حذف",
"Deleting...": "درحال حذف ...",
"Cancel": "لغو",
"Save": "ذخیره",
"No active job at the moment\\.": " در حال حاضر هیچ جابی فعال نیست .",
"Jobs Logs": "گزارش جاب ها",
"Updated at": "بروزرسانی شده در",
"Refresh": "تازه کردن",
"Filter": "فیلتر",
"Success": "موفق",
"Failed": "ناموفق",
"Log ID": "شناسه گزارش",
"Message": "پیام",
"Share Peer": "به اشتراک گذاشتن peer",
"Currently the peer is not sharing": "این peer را نمی توان به اشتراک گذاشت",
"Sharing\\.\\.\\.": "اشتراک گذاری...",
"Start Sharing": "شروع اشتراک گذاری",
"Stop Sharing\\.\\.\\.": "توقف اشتراک گذاری...",
"Stop Sharing": "توقف اشتراک گذاری",
"Access Restricted": "دسترسی محدود شده",
"Restrict Access": "محدود کردن دسترسی",
"Restricting\\.\\.\\.": "محدود کردن...",
"Allow Access": "اجازه دسترسی",
"Allowing Access\\.\\.\\.": "اجازه دسترسی...",
"Download \\& QR Code is not available due to no private key set for this peer": "دانلود و کد QR در دسترس نیست چون کلید خصوصی برای این peer تنظیم نشده است.",
"Add Peers": "اضافه کردن peers",
"Bulk Add": "افزودن انبوه",
"By adding peers by bulk, each peer's name will be auto generated, and Allowed IP will be assign to the next available IP\\.": "با افزودن گروهی Peers، نام هر peer به‌صورت خودکار تولید می‌شود و IP مجاز (Allowed IP) به اولین IP آزاد بعدی اختصاص داده خواهد شد.",
"How many peers you want to add\\?": "چند peer می خواهید اضافه کنید؟",
"You can add up to (.*) peers": "شما می‌توانید تا حداکثر $1 Peer اضافه کنید.",
"Use your own Private and Public Key": "از کلید خصوصی و عمومی خود استفاده کنید",
"Enter IP Address/CIDR": "نشانی IP یا محدوده CIDR را وارد کنید.",
"IP Address/CIDR": "IP Address/CIDR",
"or": "یا",
"Pick Available IP": "انتخاب IP موجود",
"No available IP containing": "هیچ IP قابل استفاده‌ای شامل این مقدار یافت نشد.",
"Add": "اضافه کردن",
"Adding\\.\\.\\.": "درحال اضافه کردن...",
"Failed to check available update": "عدم موفقیت در بررسی آپدیت‌های در دسترس.",
"Nice to meet you!": "!از آشنایی با شما خوشوقتم 😊",
"Please fill in the following fields to finish setup": "لطفاً فیلدهای زیر را برای تکمیل تنظیمات پر کنید.",
"Create an account": "ایجاد حساب کاربری",
"Enter an username you like": "یک نام کاربری دلخواه وارد کنید",
"Enter a password": "رمز عبور وارد کنید",
"\\(At least 8 characters and make sure is strong enough!\\)": "(حداقل ۸ کاراکتر و مطمئن شوید که رمز عبور به‌اندازه کافی قوی باشد!)",
"Confirm password": "تأیید رمز عبور",
"Next": "بعدی",
"Saving\\.\\.\\.": "درحال ذخیره کردن...",
"1\\. Please scan the following QR Code to generate TOTP with your choice of authenticator": "۱. لطفاً کد QR زیر را اسکن کنید تا کد یک‌بار مصرف زمان‌دار (TOTP) را با برنامه احراز هویت دلخواه خود تولید کنید.",
"Or you can click the link below:": "یا می‌توانید روی لینک زیر کلیک کنید:",
"2\\. Enter the TOTP generated by your authenticator to verify": "۲. کد یک‌بار مصرف زمان‌دار (TOTP) تولیدشده توسط برنامه احراز هویت خود را وارد کنید تا تأیید انجام شود.",
"TOTP verified!": "کد TOTP با موفقیت تأیید شد!",
"I don't need MFA": "من به احراز هویت چندمرحله‌ای (MFA) نیاز ندارم.",
"Complete": "تکمیل شد",
"(v[0-9.]{1,}) is now available for update!": "نسخه$1 اکنون برای به‌روزرسانی در دسترس است!",
"Current Version:": "ورژن فعلی :",
"Oh no\\.\\.\\. This link is either expired or invalid\\.": "اوه نه... این لینک یا منقضی شده یا نامعتبر است.",
"Scan QR Code with the WireGuard App to add peer": "کد QR را با اپلیکیشن WireGuard اسکن کنید تا Peer اضافه شود.",
"or click the button below to download the ": "یا روی دکمه زیر کلیک کنید تا فایل را دانلود کنید",
" file": " فایل",
"FROM ": "از ",
"(.*) is on": "$1 فعال است",
"(.*) is off": "$1 غیرفعال است",
"Allowed IPs is invalid": "مقدار Allowed IPs نامعتبر است",
"Peer created successfully": "peer با موفقیت ساخته شد",
"Please fill in all required box": "لطفاً تمام فیلدهای الزامی را پر کنید.",
"Please specify amount of peers you want to add": "لطفاً تعداد Peers که می‌خواهید اضافه کنید را مشخص کنید.",
"No more available IP can assign": "IP آزادی برای اختصاص دادن باقی نمانده است.",
"The maximum number of peers can add is (.*)": "حداکثر تعداد peer که می‌توان اضافه کرد عبارت است از: $1",
"Generating key pairs by bulk failed": "تولید گروهی کلیدهای جفتی (Key Pairs) با شکست مواجه شد.",
"Failed to add peers in bulk": "افزودن گروهی Peers با شکست مواجه شد.",
"This peer already exist": "این Peer از قبل وجود دارد.",
"This IP is not available: (.*)": " IP $1 در دسترس نیست:",
"Configuration does not exist": "پیکربندی وجود ندارد.",
"Peer does not exist": "peer وجود ندارد",
"Please provide a valid configuration name": "لطفاً یک نام پیکربندی معتبر وارد کنید.",
"Peer saved": "peer ذخیره شد",
"Allowed IPs already taken by another peer": "این IPها قبلاً به peer دیگری اختصاص داده شده‌اند.",
"Endpoint Allowed IPs format is incorrect": "فرمت IPهای مجاز در Endpoint نادرست است.",
"DNS format is incorrect": "فرمت DNS نادرست است.",
"MTU format is not correct": "فرمت MTU نادرست است.",
"Persistent Keepalive format is not correct": "فرمت Persistent Keepalive نادرست است.",
"Private key does not match with the public key": "کلید خصوصی با کلید عمومی مطابقت ندارد.",
"Update peer failed when updating Pre-Shared Key": "به‌روزرسانی کلید مشترک (Pre-Shared Key) برای peer با شکست مواجه شد.",
"Update peer failed when updating Allowed IPs": "به‌روزرسانی IPهای مجاز برای peer با شکست مواجه شد.",
"Update peer failed when saving the configuration": "ذخیره پیکربندی پس از به‌روزرسانی peer با شکست مواجه شد.",
"Peer data usage reset successfully": "میزان مصرف داده peer با موفقیت بازنشانی شد.",
"Peer download started": "دانلود peer آغاز شد.",
"Please specify one or more peers": "لطفاً یک یا چند peer را مشخص کنید.",
"Share link failed to create. Reason: (.*)": "ایجاد لینک اشتراک‌گذاری با شکست مواجه شد. دلیل: $1",
"Link expire date updated": "تاریخ انقضای لینک با موفقیت به‌روزرسانی شد.",
"Link expire date failed to update. Reason: (.*)": "به‌روزرسانی تاریخ انقضای لینک با شکست مواجه شد. دلیل: $1",
"Peer job saved": "جاب peer با موفقیت ذخیره شد.",
"Please specify job": "لطفاً یک جاب مشخص کنید.",
"Please specify peer and configuration": "لطفاً peer و پیکربندی را مشخص کنید.",
"Peer job deleted": "جاب peer حذف شد.",
"API Keys function is successfully enabled": "قابلیت کلیدهای API با موفقیت فعال شد.",
"API Keys function is successfully disabled": "قابلیت کلیدهای API با موفقیت غیرفعال شد.",
"API Keys function is failed to enable": "فعال‌سازی قابلیت کلیدهای API با شکست مواجه شد.",
"API Keys function is failed to disable": "غیرفعال‌سازی قابلیت کلیدهای API با شکست مواجه شد.",
"WGDashboard API Keys function is disabled": "قابلیت کلیدهای API در WGDashboard غیرفعال است.",
"WireGuard configuration path saved": "مسیر پیکربندی WireGuard ذخیره شد.",
"API Key deleted": "کلید API حذف شد.",
"API Key created": "کلید API ایجاد شد.",
"Sign in session ended, please sign in again": "نشست ورود به پایان رسیده است، لطفاً دوباره وارد شوید.",
"Please specify an IP Address (v4/v6)": "لطفاً یک آدرس IP نسخه ۴ یا ۶ مشخص کنید.",
"Please provide ipAddress and count": "لطفاً آدرس IP و تعداد را وارد کنید.",
"Please provide ipAddress": "لطفاً آدرس IP را وارد کنید.",
"Dashboard Language": "زبان داشبورد",
"Dashboard language update failed": "به‌روزرسانی زبان داشبورد با شکست مواجه شد.",
"Peer Remote Endpoint": "نقطه پایانی راه دور peer",
"New Configuration": "پیکربندی جدید",
"Configuration Name": "نام پیکربندی",
"Configuration name is invalid. Possible reasons:": "نام پیکربندی نامعتبر است. دلایل احتمالی:",
"Configuration name already exist.": "این نام پیکربندی از قبل وجود دارد.",
"Configuration name can only contain 15 lower/uppercase alphabet, numbers, underscore, equal sign, plus sign, period and hyphen.": "نام پیکربندی فقط می‌تواند حداکثر شامل ۱۵ حرف کوچک/بزرگ، عدد، زیرخط، مساوی، علامت مثبت، نقطه و خط تیره باشد.",
"Invalid Port": "پورت نامعتبر است.",
"Save Configuration": "ذخیره پیکربندی",
"IP Address/CIDR is invalid": "آدرس IP یا CIDR نامعتبر است.",
"IP Address": "آدرس IP",
"Enter IP Address / Hostname": "آدرس IP یا نام میزبان را وارد کنید",
"IP Address / Hostname": "آدرس IP / نام میزبان",
"Dashboard IP Address & Listen Port": "آدرس IP و پورت شنود داشبورد",
"Count": "تعداد",
"Geolocation": "موقعیت جغرافیایی",
"Is Alive": "در دسترس است",
"Average / Min / Max Round Trip Time": "میانگین / کمترین / بیشترین زمان رفت‌وبرگشت",
"Sent / Received / Lost Package": "بسته‌های ارسال‌شده / دریافت‌شده / گم‌شده",
"Manual restart of WGDashboard is needed to apply changes on IP Address and Listen Port": "برای اعمال تغییرات آدرس IP و پورت شنود، باید WGDashboard را دستی راه‌اندازی مجدد کنید.",
"Restore Configuration": "بازیابی پیکربندی",
"Step (.*)": "مرحله $1",
"Select a backup you want to restore": "یک نسخه پشتیبان برای بازیابی انتخاب کنید.",
"Click to change a backup": "برای تغییر نسخه پشتیبان کلیک کنید.",
"Selected Backup": "نسخه پشتیبان انتخاب‌ شده",
"You don't have any configuration to restore": "هیچ پیکربندی برای بازیابی وجود ندارد.",
"Help": "راهنما",
"Backup": "پشتیبان‌گیری",
"([0-9].*) Backups?": "$1 نسخه پشتیبان",
"Yes": "بله",
"No": "خیر",
"Backup not selected": "نسخه پشتیبان انتخاب نشده است.",
"Confirm & edit restore information": "تأیید و ویرایش اطلاعات بازیابی",
"(.*) Available IP Address": "$1 آدرس IP در دسترس",
"Database File": "فایل پایگاه داده",
"Contain": "شامل",
"Restricted Peers?": "peerهای محدودشده؟",
"Restore": "بازیابی",
"Restoring": "در حال بازیابی",
"WGDashboard Settings": "تنظیمات WGDashboard",
"Peers Settings": "تنظیمات peerها",
"WireGuard Configuration Settings": "تنظیمات پیکربندی WireGuard",
"Appearance": "ظاهر",
"Theme": "قالب",
"Language": "زبان",
"Account Settings": "تنظیمات حساب کاربری",
"Peer Default Settings": "تنظیمات پیش‌فرض peer",
"Toggle When Start Up": "فعال‌سازی هنگام راه‌اندازی",
"Other Settings": "تنظیمات دیگر",
"Select Peers": "انتخاب peerها",
"Backup & Restore": "پشتیبان‌گیری و بازیابی",
"Delete Configuration": "حذف پیکربندی",
"Create Backup": "ایجاد نسخه پشتیبان",
"No backup yet, click the button above to create backup.": "هنوز نسخه پشتیبانی وجود ندارد، برای ایجاد نسخه پشتیبان روی دکمه بالا کلیک کنید.",
"Are you sure to delete this backup?": "آیا از حذف این نسخه پشتیبان مطمئن هستید؟",
"Are you sure to restore this backup?": "آیا از بازیابی این نسخه پشتیبان مطمئن هستید؟",
"Backup Date": "تاریخ پشتیبان‌گیری",
"File": "فایل",
"Are you sure to delete this configuration?": "آیا از حذف این پیکربندی مطمئن هستید؟",
"Once you deleted this configuration:": "پس از حذف این پیکربندی:",
"All connected peers will get disconnected": "تمام peerهای متصل قطع خواهند شد.",
"Both configuration file (.conf) and database table related to this configuration will get deleted": "هم فایل پیکربندی (.conf) و هم جدول پایگاه داده مرتبط با این پیکربندی حذف خواهند شد.",
"Checking backups...": "در حال بررسی نسخه‌های پشتیبان...",
"This configuration have ([0-9].*) backups": "این پیکربندی $1 نسخه پشتیبان دارد.",
"This configuration have no backup": "این پیکربندی هیچ نسخه پشتیبانی ندارد.",
"If you're sure, please type in the configuration name below and click Delete": "اگر مطمئن هستید، نام پیکربندی را در کادر زیر وارد کرده و روی حذف کلیک کنید.",
"Select All": "انتخاب همه",
"Clear Selection": "پاک کردن انتخاب",
"([0-9].*) Peers?": "$1 peer",
"Downloading": "در حال دانلود",
"Download Finished": "دانلود به پایان رسید",
"Done": "انجام شد",
"Are you sure to delete": "آیا از حذف مطمئن هستید؟",
"Are you sure to delete this peer?": "آیا از حذف این peer مطمئن هستید؟",
"Configuration deleted": "پیکربندی حذف شد.",
"Configuration saved": "پیکربندی ذخیره شد.",
"WGDashboard language update failed": "به‌روزرسانی زبان WGDashboard با شکست مواجه شد.",
"Configuration restored": "پیکربندی بازیابی شد.",
"Allowed IP already taken by another peer": "IP مجاز قبلاً توسط peerی دیگری استفاده شده است.",
"Failed to allow access of peer (.*)": "اجازه دسترسی به peer ($1) با شکست مواجه شد.",
"Failed to save configuration through WireGuard": "ذخیره پیکربندی از طریق WireGuard با شکست مواجه شد.",
"Allow access successfully": "دسترسی با موفقیت فعال شد.",
"Deleted ([0-9]{1,}) peer(s)": "$1 peer حذف شد.",
"Deleted ([0-9]{1,}) peer(s) successfully. Failed to delete ([0-9]{1,}) peer(s)": "$1 peer با موفقیت حذف شد. حذف $2 peer با شکست مواجه شد.",
"Restricted ([0-9]{1,}) peer(s)": "$1 peer محدود شد.",
"Restricted ([0-9]{1,}) peer(s) successfully. Failed to restrict ([0-9]{1,}) peer(s)": "$1 peer با موفقیت محدود شد. محدودسازی $2 peer با شکست مواجه شد."
}

View File

@ -0,0 +1,312 @@
{
"Welcome to": "Bienvenue",
"Username": "Utilisateur",
"Password": "Mot de passe",
"OTP from your authenticator": "OTP de l'authenticateur",
"Sign In": "Se connecter",
"Signing In\\.\\.\\.": "Connexion en cours...",
"Access Remote Server": "Accéder à distance au serveur",
"Server": "Serveur",
"Click": "Clique",
"Pinging...": "Pinging...",
"to add your server": "pour ajouter votre serveur",
"Server List": "Liste des serveurs",
"Sorry, your username or password is incorrect.": "Désolé, l'utilisateur ou le mot de passe est incorrect",
"Home": "Accueil",
"Settings": "Paramètres",
"Tools": "Outils",
"Sign Out": "Se déconnecter",
"Checking for update...": "Recherche des mises à jour",
"You're on the latest version": "Vous êtes sur la dernière version",
"WireGuard Configurations": "Configurations WireGuard",
"You don't have any WireGuard configurations yet. Please check the configuration folder or change it in Settings. By default the folder is /etc/wireguard.": "Vous n'avez pas encore de configurations WireGuard. Veuillez vérifier le dossier de configuration ou faire un changement dans les paramètres. Par défaut, le dossier est /etc/wireguard.",
"Configuration": "Configuration",
"Configurations": "Configurations",
"Peers Default Settings": "Paramètres par défaut des pairs",
"Dashboard Theme": "Thème du tableau de bord",
"Light": "Clair",
"Dark": "Sombre",
"This will be changed globally, and will be apply to all peer's QR code and configuration file.": "C'est un changement global, qui s'appliquera sur tout les codes QR des pairs ainsi que leur fichier de configuration",
"WireGuard Configurations Settings": "Paramètre des configurations WireGuard",
"Configurations Directory": "Dossier des configurations",
"Remember to remove / at the end of your path. e.g /etc/wireguard": "N'oubliez pas de retirer la / à la fin du chemin vers le dossier. ex: /etc/wireguard",
"WGDashboard Account Settings": "Paramètres du compte WGDashboard",
"Current Password": "Mot de passe actuel",
"New Password": "Nouveau mot de passe",
"Repeat New Password": "Répétez le nouveau mot de passe",
"Update Password": "Mettre à jour le mot de passe",
"Multi-Factor Authentication \\(MFA\\)": "Authentification à deux facteurs",
"Reset": "Réinitialiser",
"Setup": "Configurer",
"API Keys": "Clés d'API",
"API Key": "Clé d'API",
"Key": "Clé",
"Enabled": "Activé",
"Disabled": "Désactivé",
"No WGDashboard API Key": "Pas de clé d'API WGDashboard",
"Expire At": "Expire à",
"Are you sure to delete this API key\\?": "Êtes-vous sur de supprimer cette clé d'API",
"Create API Key": "Créer une clé d'API",
"When should this API Key expire\\?": "Quand est-ce que cette clé devrait expirer?",
"Never Expire": "N'expire jamais",
"Don't think that's a good idea": "Ce n'est probablement pas une bonne idée",
"Creating\\.\\.\\.": "Création en cours...",
"Create": "Créer",
"Status": "Statut",
"On": "Marche",
"Off": "Arrêt",
"Turning On\\.\\.\\.": "Activation",
"Turning Off\\.\\.\\.": "Désactivation",
"Address": "adresse",
"Listen Port": "Port d'écoute",
"Public Key": "Clé publique",
"Connected Peers": "Pairs connectés",
"Total Usage": "Utilisation totale",
"Total Received": "Total reçu",
"Total Sent": "Total envoyé",
"Peers Data Usage": "Utilisation de données des pairs",
"Real Time Received Data Usage": "Réception de données en temps réel",
"Real Time Sent Data Usage": "Envoie de données en temps réel",
"Peer": "Pair",
"Peers": "Pairs",
"Peer Settings": "Paramètres des pairs",
"Download All": "Télécharger tout",
"Search Peers\\.\\.\\.": "Rechercher les pairs...",
"Display": "Affichage",
"Sort By": "Trier par",
"Refresh Interval": "Intervalle d'actualisation",
"Name": "Nom",
"Allowed IPs": "IPs autorisées",
"Restricted": "Limité",
"(.*) Seconds": "$1 secondes",
"(.*) Minutes": "$1 minutes",
"Configuration Settings": "Paramètres des configurations",
"Peer Jobs": "Tâches des pairs",
"Active Jobs": "Tâches actives",
"All Active Jobs": "Toutes les tâches actives",
"Logs": "Logs",
"Private Key": "Clé privée",
"\\(Required for QR Code and Download\\)": "(Nécessaire pour code QR et téléchargement",
"\\(Required\\)": "Nécessaire",
"Endpoint Allowed IPs": "adresses autorisées au Endpoint",
"DNS": "DNS",
"Optional Settings": "Paramètres optionnels",
"Pre-Shared Key": "Clé prépartagée",
"MTU": "MTU",
"Persistent Keepalive": "Keepalive permanent",
"Reset Data Usage": "Réinitialiser l'utilisation des données",
"Total": "Total",
"Sent": "Envoyé",
"Received": "Reçu",
"Revert": "Revenir",
"Save Peer": "Enregistrer le pair",
"QR Code": "Code QR",
"Schedule Jobs": "Panifier les tâches",
"Job": "Tâche",
"Job ID": "ID de la tâche",
"Unsaved Job": "Tâche non-enregistrée",
"This peer does not have any job yet\\.": "Ce pair n'a pas encore de tâche",
"if": "si",
"is": "est",
"then": "alors",
"larger than": "plus grand que",
"Date": "Date",
"Restrict Peer": "Limiter le pair",
"Delete Peer": "Supprimer le pair",
"Edit": "Modifier",
"Delete": "Supprimer",
"Deleting...": "Suppression...",
"Cancel": "Annuler",
"Save": "Enregistrer",
"No active job at the moment\\.": "Pas de tâche active",
"Jobs Logs": "Journaux des tâches",
"Updated at": "Mis à jour le",
"Refresh": "Rafraîchir",
"Filter": "Filtrer",
"Success": "Succès",
"Failed": "Échec",
"Log ID": "ID du journal",
"Message": "Message",
"Share Peer": "Partager le pair",
"Currently the peer is not sharing": "Le pair ne partage pas présentement",
"Sharing\\.\\.\\.": "Partage en cours...",
"Start Sharing": "Commencer le partage",
"Stop Sharing\\.\\.\\.": "Arrêt du partage...",
"Stop Sharing": "Le partage est arrêté",
"Access Restricted": "Accès limité",
"Restrict Access": "Limiter l'accès",
"Restricting\\.\\.\\.": "Restriction en cours...",
"Allow Access": "Autoriser l'accès",
"Allowing Access\\.\\.\\.": "Autorisation de l'accès",
"Download \\& QR Code is not available due to no private key set for this peer": "Le téléchargement et le code QR ne sont pas disponible car il n'y a pas de clé privée associée à ce pair",
"Add Peers": "Ajouter des pairs",
"Bulk Add": "Ajout en groupe",
"By adding peers by bulk, each peer's name will be auto generated, and Allowed IP will be assign to the next available IP\\.": "En ajoutant des pairs en groups, le nom de chaque pair sera généré, et l'adresse autorisée sera attribuée selon la prochaine adresse disponible",
"How many peers you want to add\\?": "Combien de pairs voulez-vous ajouter?",
"You can add up to (.*) peers": "Vous pouvez ajouter jusqu'à $1 pairs",
"Use your own Private and Public Key": "Utiliser vos proprés clés privée/publique",
"Enter IP Address/CIDR": "Entrer l'IP en format /CIDR",
"IP Address/CIDR": "adresse IP/CIDR",
"or": "ou",
"Pick Available IP": "Choisir l'IP disponible",
"No available IP containing": "Aucune IP disponible contient",
"Add": "Ajouter",
"Adding\\.\\.\\.": "Ajout...",
"Failed to check available update": "Échec de la vérification des mises à jour",
"Nice to meet you!": "Content de vous rencontrer",
"Please fill in the following fields to finish setup": "Veuillez remplir les cases suivants pour terminer la configuration",
"Create an account": "Créer un compte",
"Enter an username you like": "Entrez le nom d'utilisateur voulu",
"Enter a password": "Entrez un mot de passe",
"\\(At least 8 characters and make sure is strong enough!\\)": "(assurez vous d'avoir un mot de passe fort, d'au moins 8 charactères",
"Confirm password": "Confirmer le mot de passe",
"Next": "Suivant",
"Saving\\.\\.\\.": "Enregistrement...",
"1\\. Please scan the following QR Code to generate TOTP with your choice of authenticator": "1. Veuillez balayer le code QR pour générer un TOTP avec l'authenticateur de votre choix",
"Or you can click the link below:": "Ou vous pouvez cliquer sur le lien ci-dessous",
"2\\. Enter the TOTP generated by your authenticator to verify": "2. Entrez le code TOTP généré par votre authenticateur",
"TOTP verified!": "TOTP vérifié",
"I don't need MFA": "Je n'ai pas besoin de l'authentification à double facteurs",
"Complete": "Complet",
"(v[0-9.]{1,}) is now available for update!": "$1 est disponible pour mise à jour",
"Current Version:": "Version actuelle",
"Oh no\\.\\.\\. This link is either expired or invalid\\.": "Oh oh, il semble que ce lien est expiré ou invalide",
"Scan QR Code with the WireGuard App to add peer": "Balayez le code QR avec l'application WireGuard pour ajouter le pair",
"or click the button below to download the ": "ou cliquez sur le boutton ci-dessous pour télécharger le",
" file": " fichier",
"FROM ": "DE",
"(.*) is on": "$1 est activé",
"(.*) is off": "$1 est désactivé",
"Allowed IPs is invalid": "Les IPs autorisées sont invalides",
"Peer created successfully": "Pair créé avec succès",
"Please fill in all required box": "Veuillez remplir toutes les cases",
"Please specify amount of peers you want to add": "Veuillez préciser le nombre de pair à ajouter",
"No more available IP can assign": "Il n'y a plus d'adresses disponible",
"The maximum number of peers can add is (.*)": "Le maximum de pair qu'il est possible d'ajouter est $1",
"Generating key pairs by bulk failed": "La génération des clés en groupe a échouée",
"Failed to add peers in bulk": "L'ajout de pairs en groupe a échoué",
"This peer already exist": "Ce pair existe déja",
"This IP is not available: (.*)": "Cette IP n'est pas disponible: $1",
"Configuration does not exist": "La configuration n'existe pas",
"Peer does not exist": "Le pair n'existe pas",
"Please provide a valid configuration name": "Veuillez entrer un nom de configuration valide",
"Peer saved": "Pair enregistré",
"Allowed IPs already taken by another peer": "Les IP autorisées sont déja prises par un autre pair",
"Endpoint Allowed IPs format is incorrect": "Le format des IPs autorisées est incorrect",
"DNS format is incorrect": "Le format du DNS est incorrect",
"MTU format is not correct": "Le format du MTU est incorrect",
"Persistent Keepalive format is not correct": "Le format du Keepalive permanent est incorrect",
"Private key does not match with the public key": "La clé privée ne correspond pas à la clé publique",
"Update peer failed when updating Pre-Shared Key": "La modification du pair a échouée en changeant la clé prépartagée",
"Update peer failed when updating Allowed IPs": "La modification du pair a échouée en changeant les IPs autorisées",
"Update peer failed when saving the configuration": "La modification du pair a échouée en enregistrant la configuration",
"Peer data usage reset successfully": "L'utilisation des données du pairs a été réinitialisée",
"Peer download started": "Téléchargement du pair en cours",
"Please specify one or more peers": "Veuillez spécifier un ou plusieurs pairs",
"Share link failed to create. Reason: (.*)": "Échec de la création du lien: $1",
"Link expire date updated": "Date d'expiration du lien changée",
"Link expire date failed to update. Reason: (.*)": "Échec de la modification de la date d'expiration: $1",
"Peer job saved": "Tâche du pair enregistré",
"Please specify job": "Veuillez spécifier une tâche",
"Please specify peer and configuration": "Veuillez spécifier un pair et une configuration",
"Peer job deleted": "Tâche du pair supprimée",
"API Keys function is successfully enabled": "La clé d'API est activée",
"API Keys function is successfully disabled": "La clé d'API est désactivé",
"API Keys function is failed to enable": "Échec de l'activation de la clé",
"API Keys function is failed to disable": "Échec de la désactivation de la clé",
"WGDashboard API Keys function is disabled": "Les clés d'API WGDashboard sont désactivées",
"WireGuard configuration path saved": "Chemin de la configuration WireGuard enregistré",
"API Key deleted": "Clé d'API supprimée",
"API Key created": "Clé d'API créée",
"Sign in session ended, please sign in again": "La session est terminée, veuillez vous reconnecter",
"Please specify an IP Address (v4/v6)": "Veuillez préciser une adresse (IPv4/IPv6)",
"Please provide ipAddress and count": "Veuillez fournir l'adresse IP et le compte",
"Please provide ipAddress": "Veuillez fournir l'adresse IP",
"Dashboard Language": "Langage du tableau de bord",
"Dashboard language update failed": "Échec du changement de langage",
"Peer Remote Endpoint": "Endpoint externe du pair",
"New Configuration": "Nouvelle configuration",
"Configuration Name": "Nom de la configuration",
"Configuration name is invalid. Possible reasons:": "Le nom est invalide, raisons possuibles:",
"Configuration name already exist\\.": "Le nom est déja utilisé",
"Configuration name can only contain 15 lower/uppercase alphabet, numbers, underscore, equal sign, plus sign, period and hyphen\\.": "Le nom ne peut contenir que 15 charactère. Lettres minuscules/majuscules, nombres,tirer, tiret bas, égal, plus et point",
"Invalid Port": "Port invalide",
"Save Configuration": "Enregistrer la configuration",
"IP Address/CIDR is invalid": "L'adresse IP/CIDR est incorrecte",
"IP Address": "adresse IP",
"Enter IP Address / Hostname": "Entrez l'adresse",
"IP Address / Hostname": "Adresse IP / Nom d'hôte",
"Dashboard IP Address \\& Listen Port": "IP et port du tableau de bord",
"Count": "Compte:",
"Geolocation": "Géolocalisation",
"Is Alive": "est actif",
"Average / Min / Max Round Trip Time": "Moyen / Min / Max latence allez-retour",
"Sent / Received / Lost Package": "Paquets Envoyés / Reçus / Perdus",
"Manual restart of WGDashboard is needed to apply changes on IP Address and Listen Port": "Un redémarrage de WGDashboard est nécessaire pour appliquer le changement d'IP/port",
"Restore Configuration": "Rétablir la configuration",
"Step (.*)": "Étape $1",
"Select a backup you want to restore": "Sélectionnez la sauvegarde à Rétablir",
"Click to change a backup": "Cliquez pour changer la sauvegarde",
"Selected Backup": "Sauvegarde sélectionnée",
"You don't have any configuration to restore": "Vous n'avez pas de configruations à Rétablir",
"Help": "Assistance",
"Backup": "Sauvegarde",
"([0-9].*) Backups?": "$1 sauvegardes?",
"Yes": "Oui",
"No": "Non",
"Backup not selected": "Aucune sauvegarde sélectionnée",
"Confirm \\& edit restore information": "Valider et modifier les information à Rétablir",
"(.*) Available IP Address": "$1 adresses IP disponible",
"Database File": "Fichier de base de donnée",
"Contain": "Contiens",
"Restricted Peers?": "Pairs limités?",
"Restore": "Rétablir",
"Restoring": "Rétablissement",
"WGDashboard Settings": "Paramètres de WGDashboard",
"Peers Settings": "Paramètres des pairs",
"WireGuard Configuration Settings": "Paramètre des configurations WireGuard",
"Appearance": "Apparence",
"Theme": "Thème",
"Language": "Langage",
"Account Settings": "Paramètres du compte",
"Peer Default Settings": "Paramètres par défaut des pairs",
"Toggle When Start Up": "Activer au démarrage",
"Other Settings": "Autre paramètres",
"Select Peers": "Sélectionnez les pairs",
"Backup & Restore": "Sauvegarde et rétablissement",
"Delete Configuration": "Supprimer la configuration",
"Create Backup": "Créer une sauvegarde",
"No backup yet, click the button above to create backup\\.": "Aucune sauvegarde, appuyez sur le bouton ci-dessus pour en créer une.",
"Are you sure to delete this backup\\?": "Êtes-vous certains de supprimer cette sauvegarde?",
"Are you sure to restore this backup?\\": "Êtes-vous certains de rétablir cette sauvegarde?",
"Backup Date": "Date de la sauvegarde",
"File": "Fichier",
"Are you sure to delete this configuration\\?": "Êtes-vous certains de supprimer cette configuration",
"Once you deleted this configuration\\:": "Quand vous aurez supprimer cette configuration:",
"All connected peers will get disconnected": "Tout les pairs seront déconnectés",
"Both configuration file \\(\\.conf\\) and database table related to this configuration will get deleted": "Tous les fichiers de configurations ainsi que le tableau de la base de donnée relié à cette configuration seront supprimés",
"Checking backups...": "Vérification des sauvegardes...",
"This configuration have ([0-9].*) backups": "Cette configuration a $1 sauvegardes",
"This configuration have no backup": "Cette configuration n'a pas de sauvegarde",
"If you're sure, please type in the configuration name below and click Delete": "Si vous êtez certains, veuillez entrer le nom de la configuration, puis appuyez sur Supprimer",
"Select All": "Tout sélectionner",
"Clear Selection": "Vider la sélection",
"([0-9].*) Peers?": "$1 pairs?",
"Downloading": "Téléchargement",
"Download Finished": "Téléchargement complété",
"Done": "Terminé",
"Are you sure to delete": "Êtes-vous certains de supprimer",
"Are you sure to delete this peer\\?": "Êtes-vous certains de supprimer ce pair",
"Configuration deleted": "Configuration supprimée",
"Configuration saved": "Configuration enregistrée",
"WGDashboard language update failed": "Échec de la modification de la langue de WGDashboard",
"Configuration restored": "Configuration rétablie",
"Allowed IP already taken by another peer": "L'IP autorisée est déja prise par un autre pair",
"Failed to allow access of peer (.*)": "Échec de l'autorisation d'accès au pair",
"Failed to save configuration through WireGuard": "Échec de l'enregistrement de la configuration sur WireGuard",
"Allow access successfully": "Accès autorisé avec succès",
"Deleted ([0-9]{1,}) peer\\(s\\)": "Pair(s) $1 supprimé(s)",
"Deleted ([0-9]{1,}) peer\\(s\\) successfully. Failed to delete ([0-9]{1,}) peer\\(s\\)": "Pair(s) $1 supprimé(s). Échec de la suppression du(des) pair(s) $2",
"Restricted ([0-9]{1,}) peer\\(s\\)": "Pair(s) $1 limités",
"Restricted ([0-9]{1,}) peer\\(s\\) successfully. Failed to restrict ([0-9]{1,}) peer\\(s\\)": "Pair(s) $1 limité(s). Échec de la limitation du(des) pair(s) $2"
}

View File

@ -0,0 +1,312 @@
{
"Welcome to": "ようこそ",
"Username": "ユーザー名",
"Password": "パスワード",
"OTP from your authenticator": "認証アプリで生成されたワンタイムパスワード",
"Sign In": "サインイン",
"Signing In\\.\\.\\.": "サインイン...",
"Access Remote Server": "リモートサーバーにアクセス",
"Server": "サーバー",
"Click": "クリック",
"Pinging...": "応答待機中...",
"to add your server": "してサーバーを追加",
"Server List": "サーバーリスト",
"Sorry, your username or password is incorrect.": "ユーザー名またはパスワードが間違っています",
"Home": "ホーム",
"Settings": "設定",
"Tools": "ツール",
"Sign Out": "サインアウト",
"Checking for update...": "アップデートを確認中...",
"You're on the latest version": "最新版利用しています",
"WireGuard Configurations": "WireGuard 構成",
"You don't have any WireGuard configurations yet. Please check the configuration folder or change it in Settings. By default the folder is /etc/wireguard.": "WireGuardの構成が見つかりません 構成ファイルの保存場所を確認するか、設定タブから構成ファイルの保存場所を変更してください デフォルトの構成ファイルの保存場所は /etc/wireguard です",
"Configuration": "構成",
"Configurations": "構成",
"Peers Default Settings": "デフォルトピア設定",
"Dashboard Theme": "ダッシュボードテーマ",
"Light": "ライトモード",
"Dark": "ダークモード",
"This will be changed globally, and will be apply to all peer's QR code and configuration file.": "これは全てのピアやQRコード、コンフィグファイルに変更が適用されます",
"WireGuard Configurations Settings": "WireGuard構成設定",
"Configurations Directory": "コンフィグ保存場所",
"Remember to remove / at the end of your path. e.g /etc/wireguard": "パスの最後の\"/\"は不要です。 例:/etc/wireguard",
"WGDashboard Account Settings": "WGDashboardアカウント設定",
"Current Password": "現在のパスワード",
"New Password": "新しいパスワード",
"Repeat New Password": "再度、新しいパスワードを入力してください",
"Update Password": "パスワードを更新",
"Multi-Factor Authentication \\(MFA\\)": "多要素認証",
"Reset": "リセット",
"Setup": "設定",
"API Keys": "APIキー",
"API Key": "APIキー",
"Key": "Key",
"Enabled": "有効",
"Disabled": "無効",
"No WGDashboard API Key": "APIキーがありません",
"Expire At": "有効期限",
"Are you sure to delete this API key\\?": "このAPIキーを削除してもよろしいですか",
"Create API Key": "APIキーを作成",
"When should this API Key expire\\?": "APIキーの有効期限を設定してください",
"Never Expire": "無期限",
"Don't think that's a good idea": "あまりおすすめはしません...",
"Creating\\.\\.\\.": "作成中...",
"Create": "作成",
"Status": "ステータス",
"On": "ON",
"Off": "OFF",
"Turning On\\.\\.\\.": "ONにしています...",
"Turning Off\\.\\.\\.": "OFFにしています...",
"Address": "アドレス",
"Listen Port": "待ち受けポート",
"Public Key": "公開鍵",
"Connected Peers": "接続しているピア",
"Total Usage": "総通信量",
"Total Received": "総受信量",
"Total Sent": "総送信量",
"Peers Data Usage": "ピア別データ使用量",
"Real Time Received Data Usage": "リアルタイム受信量",
"Real Time Sent Data Usage": "リアルタイム送信量",
"Peer": "ピア",
"Peers": "ピア",
"Peer Settings": "ピア設定",
"Download All": "全てダウンロード",
"Search Peers\\.\\.\\.": "ピアを検索",
"Display": "表示設定",
"Sort By": "並び替え",
"Refresh Interval": "更新間隔",
"Name": "名前",
"Allowed IPs": "Allowed IPs",
"Restricted": "制限",
"(.*) Seconds": "$1 秒",
"(.*) Minutes": "$1 分",
"Configuration Settings": "構成設定",
"Peer Jobs": "ピアジョブ",
"Active Jobs": "有効なジョブ",
"All Active Jobs": "全ての有効なジョブ",
"Logs": "ログ",
"Private Key": "秘密鍵",
"\\(Required for QR Code and Download\\)": "(QRコードかダウンロードが必要です)",
"\\(Required\\)": "(必須)",
"Endpoint Allowed IPs": "Endpoint Allowed IPs",
"DNS": "DNS",
"Optional Settings": "追加設定",
"Pre-Shared Key": "事前共有鍵",
"MTU": "MTU",
"Persistent Keepalive": "Persistent Keepalive",
"Reset Data Usage": "データ使用量をリセット",
"Total": "合計",
"Sent": "送信",
"Received": "受信",
"Revert": "反転",
"Save Peer": "ピアを保存",
"QR Code": "QRコード",
"Schedule Jobs": "スケジュールジョブ",
"Job": "ジョブ",
"Job ID": "ジョブID",
"Unsaved Job": "保存されていないジョブ",
"This peer does not have any job yet\\.": "このピアにはジョブがありません",
"if": "もし",
"is": "が",
"then": "だったら",
"larger than": "右記以降",
"Date": "日付",
"Restrict Peer": "ピアを制限",
"Delete Peer": "ピアを削除",
"Edit": "編集",
"Delete": "削除",
"Deleting...": "削除中...",
"Cancel": "キャンセル",
"Save": "保存",
"No active job at the moment\\.": "有効なジョブがありません",
"Jobs Logs": "ジョブログ",
"Updated at": "更新日",
"Refresh": "更新",
"Filter": "フィルター",
"Success": "成功",
"Failed": "失敗",
"Log ID": "ログID",
"Message": "メッセージ",
"Share Peer": "ピアを共有",
"Currently the peer is not sharing": "このピアは現在共有されていません",
"Sharing\\.\\.\\.": "共有中...",
"Start Sharing": "共有を開始",
"Stop Sharing\\.\\.\\.": "共有を停止中...",
"Stop Sharing": "共有を停止",
"Access Restricted": "アクセスを制限しました",
"Restrict Access": "アクセスを制限",
"Restricting\\.\\.\\.": "制限中...",
"Allow Access": "アクセス許可",
"Allowing Access\\.\\.\\.": "アクセスを許可しています...",
"Download \\& QR Code is not available due to no private key set for this peer": "このピアは秘密鍵が設定されていないため、ダウンロード・QRコードの利用が出来ません",
"Add Peers": "ピアを追加",
"Bulk Add": "複数追加",
"By adding peers by bulk, each peer's name will be auto generated, and Allowed IP will be assign to the next available IP\\.": "一括でピアを追加すると、各ピアの名前は自動生成され、Allowed IPは利用可能なIPが割り当てられます",
"How many peers you want to add\\?": "いくつピアを追加しますか?",
"You can add up to (.*) peers": "最大で $1 個追加できます",
"Use your own Private and Public Key": "既存の秘密鍵・公開鍵を利用する",
"Enter IP Address/CIDR": "IPアドレス/CIDRを入力してください",
"IP Address/CIDR": "IPアドレス/CIDR",
"or": "または",
"Pick Available IP": "利用可能なIPアドレスを選択する",
"No available IP containing": "利用可能なIPアドレスがありません",
"Add": "追加",
"Adding\\.\\.\\.": "追加中...",
"Failed to check available update": "アップデートの確認に失敗しました",
"Nice to meet you!": "はじめまして!",
"Please fill in the following fields to finish setup": "以下のフィールドを入力して、セットアップを完了してください",
"Create an account": "アカウントの作成",
"Enter an username you like": "ユーザー名を入力してください",
"Enter a password": "パスワードを入力してください",
"\\(At least 8 characters and make sure is strong enough!\\)": "(最低8文字以上の強力なものになってることを確認してください!)",
"Confirm password": "再度パスワードを入力してください",
"Next": "次へ",
"Saving\\.\\.\\.": "保存中...",
"1\\. Please scan the following QR Code to generate TOTP with your choice of authenticator": "1.QRコードを認証アプリでスキャンして、ワンタイムパスワードを生成してください",
"Or you can click the link below:": "または、以下のリンクをクリックしてください",
"2\\. Enter the TOTP generated by your authenticator to verify": "2.認証アプリで生成されたワンタイムパスワードを入力してください",
"TOTP verified!": "ワンタイムパスワードが認証出来ました!",
"I don't need MFA": "多要素認証は不要です",
"Complete": "完了",
"(v[0-9.]{1,}) is now available for update!": "$1 が利用可能です!",
"Current Version:": "現在のバージョン:",
"Oh no\\.\\.\\. This link is either expired or invalid\\.": "おっと...このリンクは有効期限が切れているか無効です",
"Scan QR Code with the WireGuard App to add peer": "WireGuardアプリでQRコードをスキャンしてピアを追加",
"or click the button below to download the ": "または、ボタンをクリックしてファイルをダウンロード",
" file": " ファイル",
"FROM ": "FROM",
"(.*) is on": "$1 がONになりました",
"(.*) is off": "$1 がOFFになりました",
"Allowed IPs is invalid": "無効なAllowed IPsです",
"Peer created successfully": "ピアの作成に成功しました",
"Please fill in all required box": "必須項目を全て入力してください",
"Please specify amount of peers you want to add": "追加したいピアの数を入力してください",
"No more available IP can assign": "割り当て可能なIPがありません",
"The maximum number of peers can add is (.*)": "最大で $1 個のピアを追加出来ます",
"Generating key pairs by bulk failed": "キーペアの一括生成に失敗しました",
"Failed to add peers in bulk": "ピアの一括作成に失敗しました",
"This peer already exist": "このピアは既に存在します",
"This IP is not available: (.*)": "このIPは利用できません $1",
"Configuration does not exist": "構成が存在しません",
"Peer does not exist": "ピアが存在しません",
"Please provide a valid configuration name": "有効な構成名を入力してください",
"Peer saved": "ピアを保存しました",
"Allowed IPs already taken by another peer": "このAllowed IPsは他のピアで使用されています",
"Endpoint Allowed IPs format is incorrect": "Endpoint Allowed IPsの形式が正しくありません",
"DNS format is incorrect": "DNSの形式が正しくありません",
"MTU format is not correct": "MTUの形式が正しくありません",
"Persistent Keepalive format is not correct": "Persistent Keepaliveの形式が正しくありません",
"Private key does not match with the public key": "秘密鍵が公開鍵と合致しません",
"Update peer failed when updating Pre-Shared Key": "ピアの更新が事前共有鍵の更新中に失敗しました",
"Update peer failed when updating Allowed IPs": "ピアの更新がAllowed IPsの更新中に失敗しました",
"Update peer failed when saving the configuration": "ピアの更新が構成の保存中に失敗しました",
"Peer data usage reset successfully": "ピアのデータ使用量をリセットしました",
"Peer download started": "ピアのダウンロードを開始しました",
"Please specify one or more peers": "1つまたは複数のピアを指定してください",
"Share link failed to create. Reason: (.*)": "共有リンクの作成に失敗しました 理由: $1",
"Link expire date updated": "リンクの有効期限を更新しました",
"Link expire date failed to update. Reason: (.*)": "リンクの有効期限の更新に失敗しました 理由: $1",
"Peer job saved": "ピアジョブを保存しました",
"Please specify job": "ジョブを指定してください",
"Please specify peer and configuration": "ピアまたは構成を指定してください",
"Peer job deleted": "ピアジョブを削除しました",
"API Keys function is successfully enabled": "APIキー機能を有効にしました",
"API Keys function is successfully disabled": "APIキー機能を無効にしました",
"API Keys function is failed to enable": "APIキー機能の有効化に失敗しました",
"API Keys function is failed to disable": "APIキー機能の無効化に失敗しました",
"WGDashboard API Keys function is disabled": "WGDashboard APIキー機能は無効になっています",
"WireGuard configuration path saved": "WireGuard構成の場所を保存しました",
"API Key deleted": "APIキーを削除しました",
"API Key created": "APIキーを作成しました",
"Sign in session ended, please sign in again": "セッションが終了しました 再度サインインしてください",
"Please specify an IP Address (v4/v6)": "IPアドレスを指定してください (v4/v6)",
"Please provide ipAddress and count": "IPアドレスと回数を入力してください",
"Please provide ipAddress": "IPアドレスを入力してください",
"Dashboard Language": "ダッシュボードの言語",
"Dashboard language update failed": "ダッシュボードの言語の更新に失敗しました",
"Peer Remote Endpoint": "Endpoint",
"New Configuration": "新規構成",
"Configuration Name": "構成名",
"Configuration name is invalid. Possible reasons:": "構成名が無効です 考えられる原因:",
"Configuration name already exist\\.": "構成名が既に存在します",
"Configuration name can only contain 15 lower/uppercase alphabet, numbers, underscore, equal sign, plus sign, period and hyphen\\.": "構成名には、小文字/大文字のアルファベット15文字、数字、アンダースコア、イコール、プラス、ピリオド、ハイフンのみを使用できます",
"Invalid Port": "無効なポート",
"Save Configuration": "構成を保存",
"IP Address/CIDR is invalid": "無効なIPアドレス/CIDR",
"IP Address": "IPアドレス",
"Enter IP Address / Hostname": "IPアドレス / ホスト名 を入力してください",
"IP Address / Hostname": "IPアドレス / ホスト名",
"Dashboard IP Address \\& Listen Port": "ダッシュボードIPアドレス & 待ち受けポート",
"Count": "回数",
"Geolocation": "場所",
"Is Alive": "ステータス",
"Average / Min / Max Round Trip Time": "平均 / 最小 / 最大 往復時間",
"Sent / Received / Lost Package": "送信 / 受信 / 損失 パッケージ",
"Manual restart of WGDashboard is needed to apply changes on IP Address and Listen Port": "IPアドレスと待ち受けポートの変更を反映するにはWGDashboardを手動で再起動する必要があります",
"Restore Configuration": "構成を復元",
"Step (.*)": "ステップ $1",
"Select a backup you want to restore": "復元したいバックアップを選択してください",
"Click to change a backup": "クリックしてバックアップを変更する",
"Selected Backup": "選択したバックアップ",
"You don't have any configuration to restore": "復元可能な構成がありません",
"Help": "ヘルプ",
"Backup": "バックアップ",
"([0-9].*) Backups?": "$1 バックアップ?",
"Yes": "はい",
"No": "いいえ",
"Backup not selected": "バックアップが選択されていません",
"Confirm \\& edit restore information": "確定 & 復元情報を編集",
"(.*) Available IP Address": "$1 有効なIPアドレス",
"Database File": "データベースファイル",
"Contain": "含まれる",
"Restricted Peers?": "ピアを制限しますか?",
"Restore": "復元",
"Restoring": "復元中",
"WGDashboard Settings": "WGDashboard設定",
"Peers Settings": "ピア設定",
"WireGuard Configuration Settings": "WireGuard構成設定",
"Appearance": "外観",
"Theme": "テーマ",
"Language": "言語",
"Account Settings": "アカウント設定",
"Peer Default Settings": "ピアデフォルト設定",
"Toggle When Start Up": "起動時に有効化",
"Other Settings": "その他の設定",
"Select Peers": "ピアを選択",
"Backup & Restore": "バックアップ & 復元",
"Delete Configuration": "構成を削除",
"Create Backup": "バックアップを作成",
"No backup yet, click the button above to create backup\\.": "バックアップがありません ボタンをクリックしてバックアップを作成",
"Are you sure to delete this backup\\?": "バックアップを削除しますか?",
"Are you sure to restore this backup?\\": "バックアップから復元しますか?",
"Backup Date": "バックアップ日時",
"File": "ファイル",
"Are you sure to delete this configuration\\?": "この構成を本当に削除しますか?",
"Once you deleted this configuration\\:": "この構成を削除すると:",
"All connected peers will get disconnected": "全てのピアとの接続を失います",
"Both configuration file \\(\\.conf\\) and database table related to this configuration will get deleted": "この構成に関連する構成ファイル(.conf)とデータベーステーブルが削除されます",
"Checking backups...": "バックアップを確認中...",
"This configuration have ([0-9].*) backups": "この構成には $1 のバックアップがあります",
"This configuration have no backup": "この構成にはバックアップがありません",
"If you're sure, please type in the configuration name below and click Delete": "本当に削除して良いのであれば、以下に構成名を入力し、「削除」をクリックしてください",
"Select All": "全て選択",
"Clear Selection": "選択を解除",
"([0-9].*) Peers?": "$1 ピア?",
"Downloading": "ダウンロード中...",
"Download Finished": "ダウンロード完了",
"Done": "完了",
"Are you sure to delete": "本当に削除しますか",
"Are you sure to delete this peer\\?": "このピアを本当に削除してもよろしいですか?",
"Configuration deleted": "構成を削除しました",
"Configuration saved": "構成を保存しました",
"WGDashboard language update failed": "WGDashboardの言語の更新に失敗しました",
"Configuration restored": "構成を復元しました",
"Allowed IP already taken by another peer": "このAllowed IPは他のピアで使用されています",
"Failed to allow access of peer (.*)": "ピアのアクセス許可に失敗しました $1",
"Failed to save configuration through WireGuard": "WireGuardによる設定の保存に失敗しました。",
"Allow access successfully": "アクセス許可に成功しました",
"Deleted ([0-9]{1,}) peer\\(s\\)": "$1 個のピアを削除しました ",
"Deleted ([0-9]{1,}) peer\\(s\\) successfully. Failed to delete ([0-9]{1,}) peer\\(s\\)": "$1 個のピアの削除に成功し、 $2 個のピアの削除に失敗しました",
"Restricted ([0-9]{1,}) peer\\(s\\)": "$1 個のピアを制限しました",
"Restricted ([0-9]{1,}) peer\\(s\\) successfully. Failed to restrict ([0-9]{1,}) peer\\(s\\)": "$1 個のピアの制限に成功し、 $2 個のピアの制限に失敗しました"
}

312
src/static/locale/ko.json Normal file
View File

@ -0,0 +1,312 @@
{
"Welcome to": "환영합니다",
"Username": "사용자 이름",
"Password": "비밀번호",
"OTP from your authenticator": "인증기에서 생성된 OTP",
"Sign In": "로그인",
"Signing In\\.\\.\\.": "로그인하는 중...",
"Access Remote Server": "원격 서버 접속",
"Server": "서버",
"Click": "클릭",
"Pinging...": "핑 테스트 중...",
"to add your server": "서버를 추가하려면",
"Server List": "서버 목록",
"Sorry, your username or password is incorrect.": "죄송합니다. 사용자 이름 또는 비밀번호가 올바르지 않습니다.",
"Home": "홈",
"Settings": "설정",
"Tools": "도구",
"Sign Out": "로그아웃",
"Checking for update...": "업데이트 확인 중...",
"You're on the latest version": "최신 버전을 사용 중입니다",
"WireGuard Configurations": "WireGuard 구성",
"You don't have any WireGuard configurations yet. Please check the configuration folder or change it in Settings. By default the folder is /etc/wireguard.": "아직 WireGuard 구성이 없습니다. 구성 폴더를 확인하거나 설정에서 변경하세요. 기본 폴더는 /etc/wireguard 입니다.",
"Configuration": "구성",
"Configurations": "구성들",
"Peers Default Settings": "기본 피어 설정",
"Dashboard Theme": "대시보드 테마",
"Light": "밝은 테마",
"Dark": "어두운 테마",
"This will be changed globally, and will be apply to all peer's QR code and configuration file.": "이 설정은 전역적으로 변경되며, 모든 피어의 QR 코드 및 구성 파일에 적용됩니다.",
"WireGuard Configurations Settings": "WireGuard 구성 설정",
"Configurations Directory": "구성 디렉토리",
"Remember to remove / at the end of your path. e.g /etc/wireguard": "경로 끝의 '/'를 제거하세요. 예: /etc/wireguard",
"WGDashboard Account Settings": "WGDashboard 계정 설정",
"Current Password": "현재 비밀번호",
"New Password": "새 비밀번호",
"Repeat New Password": "새 비밀번호 확인",
"Update Password": "비밀번호 변경",
"Multi-Factor Authentication \\(MFA\\)": "다중 인증 (MFA)",
"Reset": "재설정",
"Setup": "설정",
"API Keys": "API 키",
"API Key": "API 키",
"Key": "키",
"Enabled": "활성화됨",
"Disabled": "비활성화됨",
"No WGDashboard API Key": "WGDashboard API 키가 없습니다",
"Expire At": "만료일",
"Are you sure to delete this API key\\?": "이 API 키를 삭제하시겠습니까?",
"Create API Key": "API 키 생성",
"When should this API Key expire\\?": "이 API 키는 언제 만료되나요?",
"Never Expire": "만료 없음",
"Don't think that's a good idea": "별로 좋은 생각이 아닌 것 같습니다",
"Creating\\.\\.\\.": "생성 중...",
"Create": "생성",
"Status": "상태",
"On": "켜짐",
"Off": "꺼짐",
"Turning On\\.\\.\\.": "켜는 중...",
"Turning Off\\.\\.\\.": "끄는 중...",
"Address": "주소",
"Listen Port": "수신 포트",
"Public Key": "공개 키",
"Connected Peers": "연결된 피어",
"Total Usage": "총 사용량",
"Total Received": "총 수신량",
"Total Sent": "총 송신량",
"Peers Data Usage": "피어 데이터 사용량",
"Real Time Received Data Usage": "실시간 수신 데이터 사용량",
"Real Time Sent Data Usage": "실시간 송신 데이터 사용량",
"Peer": "피어",
"Peers": "피어들",
"Peer Settings": "피어 설정",
"Download All": "전체 다운로드",
"Search Peers\\.\\.\\.": "피어 검색...",
"Display": "표시",
"Sort By": "정렬 기준",
"Refresh Interval": "새로고침 간격",
"Name": "이름",
"Allowed IPs": "허용된 IP",
"Restricted": "제한됨",
"(.*) Seconds": "$1 초",
"(.*) Minutes": "$1 분",
"Configuration Settings": "구성 설정",
"Peer Jobs": "피어 작업",
"Active Jobs": "활성 작업",
"All Active Jobs": "모든 활성 작업",
"Logs": "로그",
"Private Key": "개인 키",
"\\(Required for QR Code and Download\\)": "(QR 코드 및 다운로드에 필요)",
"\\(Required\\)": "(필수)",
"Endpoint Allowed IPs": "엔드포인트 허용된 IP",
"DNS": "DNS",
"Optional Settings": "선택적 설정",
"Pre-Shared Key": "사전 공유 키",
"MTU": "MTU",
"Persistent Keepalive": "Keepalive 지속 유지",
"Reset Data Usage": "데이터 사용량 초기화",
"Total": "총합",
"Sent": "전송됨",
"Received": "수신됨",
"Revert": "되돌리기",
"Save Peer": "피어 저장",
"QR Code": "QR 코드",
"Schedule Jobs": "작업 예약",
"Job": "작업",
"Job ID": "작업 ID",
"Unsaved Job": "저장되지 않은 작업",
"This peer does not have any job yet\\.": "이 피어에는 아직 작업이 없습니다.",
"if": "만약",
"is": "이다",
"then": "그러면",
"larger than": "보다 큼",
"Date": "날짜",
"Restrict Peer": "피어 제한",
"Delete Peer": "피어 삭제",
"Edit": "수정",
"Delete": "삭제",
"Deleting...": "삭제 중...",
"Cancel": "취소",
"Save": "저장",
"No active job at the moment\\.": "현재 활성 작업이 없습니다.",
"Jobs Logs": "작업 로그",
"Updated at": "업데이트된 날짜",
"Refresh": "새로고침",
"Filter": "필터",
"Success": "성공",
"Failed": "실패",
"Log ID": "로그 ID",
"Message": "메시지",
"Share Peer": "피어 공유",
"Currently the peer is not sharing": "현재 이 피어는 공유 중이 아닙니다",
"Sharing\\.\\.\\.": "공유 중...",
"Stop Sharing\\.\\.\\.": "공유 중지 중...",
"Start Sharing": "공유 시작",
"Stop Sharing": "공유 중지",
"Access Restricted": "접근 제한됨",
"Restrict Access": "접근 제한",
"Restricting\\.\\.\\.": "제한 중...",
"Allow Access": "접근 허용",
"Allowing Access\\.\\.\\.": "접근 허용 중...",
"Download \\& QR Code is not available due to no private key set for this peer": "이 피어에 대해 설정된 개인 키가 없기 때문에 다운로드 & QR 코드를 사용할 수 없습니다.",
"By adding peers by bulk, each peer's name will be auto generated, and Allowed IP will be assign to the next available IP\\.": "피어를 일괄로 추가하면 각 피어의 이름이 자동으로 생성되고 허용된 IP는 사용 가능한 다음 IP에 할당됩니다.",
"Add Peers": "피어 추가",
"Bulk Add": "일괄 추가",
"How many peers you want to add\\?": "몇 개의 피어를 추가하시겠습니까?",
"You can add up to (.*) peers": "$1 개의 피어까지 추가할 수 있습니다",
"Use your own Private and Public Key": "자체 개인 및 공개 키 사용",
"Enter IP Address/CIDR": "IP 주소/CIDR 입력",
"IP Address/CIDR": "IP 주소/CIDR",
"or": "또는",
"Pick Available IP": "사용 가능한 IP 선택",
"No available IP containing": "포함된 사용 가능한 IP가 없습니다",
"Add": "추가",
"Adding\\.\\.\\.": "추가 중...",
"Failed to check available update": "사용 가능한 업데이트 확인 실패",
"Nice to meet you!": "만나서 반가워요!",
"Please fill in the following fields to finish setup": "설정을 완료하려면 아래 필드를 작성하세요",
"Create an account": "계정 생성",
"Enter an username you like": "원하는 사용자 이름 입력",
"Enter a password": "비밀번호 입력",
"\\(At least 8 characters and make sure is strong enough!\\)": "(최소 8자 이상이고 강력한 비밀번호여야 합니다!)",
"Confirm password": "비밀번호 확인",
"Next": "다음",
"Saving\\.\\.\\.": "저장 중...",
"1\\. Please scan the following QR Code to generate TOTP with your choice of authenticator": "1. 다음 QR 코드를 스캔하여 선택한 인증기로 TOTP를 생성하세요",
"Or you can click the link below:": "또는 아래 링크를 클릭하세요",
"2\\. Enter the TOTP generated by your authenticator to verify": "2. 인증기에서 생성된 TOTP를 입력하여 확인하세요",
"TOTP verified!": "TOTP가 확인되었습니다!",
"I don't need MFA": "MFA가 필요 없습니다",
"Complete": "완료",
"(v[0-9.]{1,}) is now available for update!": "$1 업데이트가 가능합니다!",
"Current Version:": "현재 버전:",
"Oh no\\.\\.\\. This link is either expired or invalid\\.": "앗... 이 링크는 만료되었거나 잘못되었습니다.",
"Scan QR Code with the WireGuard App to add peer": "WireGuard 앱으로 QR 코드를 스캔하여 피어를 추가하세요",
"or click the button below to download the ": "또는 아래 버튼을 클릭하여 다운로드하세요 ",
" file": " 파일",
"FROM ": "FROM ",
"(.*) is on": "$1 켜짐",
"(.*) is off": "$1 꺼짐",
"Allowed IPs is invalid": "허용된 IP가 올바르지 않습니다",
"Peer created successfully": "피어가 성공적으로 생성되었습니다",
"Please fill in all required box": "모든 필수 항목을 입력하세요",
"Please specify amount of peers you want to add": "추가할 피어의 수를 지정하세요",
"No more available IP can assign": "더 이상 할당 가능한 IP가 없습니다",
"The maximum number of peers can add is (.*)": "추가할 수 있는 피어의 최대 수는 $1 개입니다",
"Generating key pairs by bulk failed": "일괄 키 쌍 생성 실패",
"Failed to add peers in bulk": "일괄 피어 추가 실패",
"This peer already exist": "이 피어는 이미 존재합니다",
"This IP is not available: (.*)": "이 IP는 사용할 수 없습니다: $1",
"Configuration does not exist": "구성이 존재하지 않습니다",
"Peer does not exist": "피어가 존재하지 않습니다",
"Please provide a valid configuration name": "유효한 구성 이름을 입력하세요",
"Peer saved": "피어가 저장되었습니다",
"Allowed IPs already taken by another peer": "허용된 IP가 다른 피어에 의해 이미 사용 중입니다",
"Endpoint Allowed IPs format is incorrect": "엔드포인트 허용된 IP 형식이 올바르지 않습니다",
"DNS format is incorrect": "DNS 형식이 올바르지 않습니다",
"MTU format is not correct": "MTU 형식이 올바르지 않습니다",
"Persistent Keepalive format is not correct": "지속적 Keepalive 형식이 올바르지 않습니다",
"Private key does not match with the public key": "개인 키가 공개 키와 일치하지 않습니다",
"Update peer failed when updating Pre-Shared Key": "사전 공유 키 업데이트 중 피어 업데이트 실패",
"Update peer failed when updating Allowed IPs": "허용된 IP 업데이트 중 피어 업데이트 실패",
"Update peer failed when saving the configuration": "구성 저장 중 피어 업데이트 실패",
"Peer data usage reset successfully": "피어 데이터 사용량이 성공적으로 초기화되었습니다",
"Peer download started": "피어 다운로드가 시작되었습니다",
"Please specify one or more peers": "하나 이상의 피어를 지정하세요",
"Share link failed to create. Reason: (.*)": "공유 링크 생성에 실패했습니다. 이유: $1",
"Link expire date updated": "링크 만료 날짜가 업데이트되었습니다",
"Link expire date failed to update. Reason: (.*)": "링크 만료 날짜 업데이트에 실패했습니다. 이유: $1",
"Peer job saved": "피어 작업이 저장되었습니다",
"Please specify job": "작업을 지정하세요",
"Please specify peer and configuration": "피어와 구성을 지정하세요",
"Peer job deleted": "피어 작업이 삭제되었습니다",
"API Keys function is successfully enabled": "API 키 기능이 성공적으로 활성화되었습니다",
"API Keys function is successfully disabled": "API 키 기능이 성공적으로 비활성화되었습니다",
"API Keys function is failed to enable": "API 키 기능 활성화에 실패했습니다",
"API Keys function is failed to disable": "API 키 기능 비활성화에 실패했습니다",
"WGDashboard API Keys function is disabled": "WGDashboard API 키 기능이 비활성화되었습니다",
"WireGuard configuration path saved": "WireGuard 구성 경로가 저장되었습니다",
"API Key deleted": "API 키가 삭제되었습니다",
"API Key created": "API 키가 생성되었습니다",
"Sign in session ended, please sign in again": "로그인 세션이 종료되었습니다. 다시 로그인해주세요",
"Please specify an IP Address (v4/v6)": "IP 주소 (v4/v6)를 지정하세요",
"Please provide ipAddress and count": "ipAddress와 개수를 제공하세요",
"Please provide ipAddress": "ipAddress를 제공하세요",
"Dashboard Language": "대시보드 언어",
"Dashboard language update failed": "대시보드 언어 업데이트 실패",
"Peer Remote Endpoint": "피어 원격 엔드포인트",
"New Configuration": "새 구성",
"Configuration Name": "구성 이름",
"Configuration name is invalid. Possible reasons:": "구성 이름이 올바르지 않습니다. 가능한 원인:",
"Configuration name already exist\\.": "구성 이름이 이미 존재합니다.",
"Configuration name can only contain 15 lower/uppercase alphabet, numbers, underscore, equal sign, plus sign, period and hyphen\\.": "구성 이름은 15자 이하의 소문자/대문자 알파벳, 숫자, 밑줄, 등호, 더하기 기호, 마침표 및 하이픈만 포함할 수 있습니다.",
"Invalid Port": "유효하지 않은 포트",
"Save Configuration": "구성 저장",
"IP Address/CIDR is invalid": "IP 주소/CIDR이 올바르지 않습니다",
"IP Address": "IP 주소",
"Enter IP Address / Hostname": "IP 주소 / 호스트명 입력",
"IP Address / Hostname": "IP 주소 / 호스트명",
"Dashboard IP Address \\& Listen Port": "대시보드 IP 주소 & 수신 포트",
"Count": "개수",
"Geolocation": "위치",
"Is Alive": "활성 상태",
"Average / Min / Max Round Trip Time": "평균 / 최소 / 최대 왕복 시간",
"Sent / Received / Lost Package": "전송 / 수신 / 손실 패킷",
"Manual restart of WGDashboard is needed to apply changes on IP Address and Listen Port": "IP 주소 및 수신 포트 변경 사항을 적용하려면 WGDashboard를 수동으로 재시작해야 합니다",
"Restore Configuration": "구성 복원",
"Step (.*)": "단계 $1",
"Select a backup you want to restore": "복원할 백업을 선택하세요",
"Click to change a backup": "백업을 변경하려면 클릭하세요",
"Selected Backup": "선택된 백업",
"You don't have any configuration to restore": "복원할 구성이 없습니다",
"Help": "도움말",
"Backup": "백업",
"([0-9].*) Backups?": "$1 백업",
"Yes": "예",
"No": "아니오",
"Backup not selected": "백업이 선택되지 않았습니다",
"Confirm \\& edit restore information": "복원 정보 확인 & 편집",
"(.*) Available IP Address": "$1 사용 가능한 IP 주소",
"Database File": "데이터베이스 파일",
"Contain": "포함",
"Restricted Peers?": "제한된 피어?",
"Restore": "복원",
"Restoring": "복원 중...",
"WGDashboard Settings": "WGDashboard 설정",
"Peers Settings": "피어 설정",
"WireGuard Configuration Settings": "WireGuard 구성 설정",
"Appearance": "외관",
"Theme": "테마",
"Language": "언어",
"Account Settings": "계정 설정",
"Peer Default Settings": "피어 기본 설정",
"Toggle When Start Up": "시작 시 실행",
"Other Settings": "기타 설정",
"Select Peers": "피어 선택",
"Backup & Restore": "백업 & 복원",
"Delete Configuration": "구성 삭제",
"Create Backup": "백업 생성",
"No backup yet, click the button above to create backup\\.": "아직 백업이 없습니다. 위의 버튼을 클릭하여 백업을 생성하세요.",
"Are you sure to delete this backup\\?": "이 백업을 삭제하시겠습니까?",
"Are you sure to restore this backup?\\": "이 백업을 복원하시겠습니까?",
"Backup Date": "백업 날짜",
"File": "파일",
"Are you sure to delete this configuration\\?": "이 구성을 삭제하시겠습니까?",
"Once you deleted this configuration\\:": "이 구성을 삭제하면:",
"All connected peers will get disconnected": "연결된 모든 피어의 연결이 끊깁니다",
"Both configuration file \\(\\.conf\\) and database table related to this configuration will get deleted": "이 구성과 관련된 구성 파일 (.conf) 및 데이터베이스 테이블이 삭제됩니다",
"Checking backups...": "백업 확인 중...",
"This configuration have ([0-9].*) backups": "이 구성에는 $1 개의 백업이 있습니다",
"This configuration have no backup": "이 구성에는 백업이 없습니다",
"If you're sure, please type in the configuration name below and click Delete": "확실하다면, 아래에 구성 이름을 입력하고 삭제를 클릭하세요",
"Select All": "전체 선택",
"Clear Selection": "선택 해제",
"([0-9].*) Peers?": "$1 피어",
"Downloading": "다운로드 중",
"Download Finished": "다운로드 완료",
"Done": "완료",
"Are you sure to delete": "정말로 삭제하시겠습니까",
"Are you sure to delete this peer\\?": "정말로 이 피어를 삭제하시겠습니까",
"Configuration deleted": "구성이 삭제되었습니다",
"Configuration saved": "구성이 저장되었습니다",
"WGDashboard language update failed": "WGDashboard 언어 업데이트 실패",
"Configuration restored": "구성이 복원되었습니다",
"Allowed IP already taken by another peer": "허용된 IP가 다른 피어에 의해 이미 사용 중입니다",
"Failed to allow access of peer (.*)": "피어 (.*)의 접근 허용에 실패했습니다",
"Failed to save configuration through WireGuard": "WireGuard를 통한 구성 저장에 실패했습니다",
"Allow access successfully": "접근 허용에 성공했습니다",
"Deleted ([0-9]{1,}) peer\\(s\\)": "$1 피어가 삭제되었습니다",
"Deleted ([0-9]{1,}) peer\\(s\\) successfully. Failed to delete ([0-9]{1,}) peer\\(s\\)": "$1 피어가 성공적으로 삭제되었습니다. $2 피어 삭제에 실패했습니다",
"Restricted ([0-9]{1,}) peer\\(s\\)": "$1 피어가 제한되었습니다",
"Restricted ([0-9]{1,}) peer\\(s\\) successfully. Failed to restrict ([0-9]{1,}) peer\\(s\\)": "$1 피어가 성공적으로 제한되었습니다. $2 피어 제한에 실패했습니다"
}

View File

@ -71,6 +71,7 @@
"Peers": "",
"Peer Settings": "",
"Download All": "",
"Search": "",
"Search Peers\\.\\.\\.": "",
"Display": "",
"Sort By": "",
@ -292,6 +293,7 @@
"Select All": "",
"Clear Selection": "",
"([0-9].*) Peers?": "",
"Download": "",
"Downloading": "",
"Download Finished": "",
"Done": "",
@ -309,6 +311,51 @@
"Deleted ([0-9]{1,}) peer\\(s\\) successfully. Failed to delete ([0-9]{1,}) peer\\(s\\)": "",
"Restricted ([0-9]{1,}) peer\\(s\\)": "",
"Restricted ([0-9]{1,}) peer\\(s\\) successfully. Failed to restrict ([0-9]{1,}) peer\\(s\\)": "",
"Hi! How can I help you today\\?": "",
"What do you want to ask\\?": ""
"Display As": "",
"List": "",
"Grid": "",
"Protocol": "",
"Open File": "",
"Advanced Options": "",
"Allowed IPs Validation": "",
"Update Name": "",
"To update this configuration's name, WGDashboard will execute the following operations:": "",
"Duplicate current configuration's database table and \\.conf file with the new name": "",
"Delete current configuration's database table and \\.conf file": "",
"Danger Zone": "",
"Configuration File": "",
"Edit Raw Configuration File": "",
"Peer Configuration File": "",
"Share with Email": "",
"Who are you sending to?": "",
"What's the subject?": "",
"What's the body?": "",
"Email Account": "",
"Ready": "",
"Port": "",
"Encryption": "",
"No Encryption": "",
"Send From": "",
"Send Test Email": "",
"Email Body Template": "",
"Live Preview": "",
"Include configuration file as an attachment": "",
"Send": "",
"Sending\\.\\.\\.": "",
"Email sent successfully!": "",
"AmneziaWG Peer Setting": "",
"System Status": "",
"CPU": "",
"Memory": "",
"Swap Memory": "",
"Processes": "",
"CPU Usage": "",
"Memory Usage": "",
"Swap Memory Usage": "",
"Network": "",
"([0-9]{1,}) Interfaces": "",
"Storage": "",
"([0-9]{1,}) Partitions": "",
"(.*) Used": "",
"Untitled Peer": ""
}

312
src/static/locale/th.json Normal file
View File

@ -0,0 +1,312 @@
{
"Welcome to": "ยินดีต้อนรับสู่",
"Username": "ชื่อผู้ใช้",
"Password": "รหัสผ่าน",
"OTP from your authenticator": "OTP จากแอปยืนยันตัวตนของคุณ",
"Sign In": "เข้าสู่ระบบ",
"Signing In\\.\\.\\.": "กำลังเข้าสู่ระบบ\\.\\.\\.",
"Access Remote Server": "เข้าถึงเซิร์ฟเวอร์ระยะไกล",
"Server": "เซิร์ฟเวอร์",
"Click": "คลิก",
"Pinging...": "กำลังปิง...",
"to add your server": "เพื่อเพิ่มเซิร์ฟเวอร์ของคุณ",
"Server List": "รายการเซิร์ฟเวอร์",
"Sorry, your username or password is incorrect.": "ขออภัย ชื่อผู้ใช้หรือรหัสผ่านของคุณไม่ถูกต้อง",
"Home": "หน้าหลัก",
"Settings": "การตั้งค่า",
"Tools": "เครื่องมือ",
"Sign Out": "ออกจากระบบ",
"Checking for update...": "กำลังตรวจสอบการอัปเดต...",
"You're on the latest version": "คุณกำลังใช้งานเวอร์ชั่นใหม่ล่าสุด",
"WireGuard Configurations": "การกำหนดค่า WireGuard",
"You don't have any WireGuard configurations yet. Please check the configuration folder or change it in Settings. By default the folder is /etc/wireguard.": "คุณยังไม่มีการกำหนดค่า WireGuard โปรดตรวจสอบโฟลเดอร์การกำหนดค่าหรือเปลี่ยนในการตั้งค่า โดยค่าเริ่มต้นโฟลเดอร์คือ /etc/wireguard",
"Configuration": "การกำหนดค่า",
"Configurations": "การกำหนดค่า",
"Peers Default Settings": "การตั้งค่าเริ่มต้นของ Peer",
"Dashboard Theme": "ธีมของแดชบอร์ด",
"Light": "โหมดสว่าง",
"Dark": "โหมดมืด",
"This will be changed globally, and will be apply to all peer's QR code and configuration file.": "นี่จะถูกเปลี่ยนแปลงทั่วโลก และจะถูกนำมาใช้กับ QR code และไฟล์การกำหนดค่าของทุก Peer",
"WireGuard Configurations Settings": "ตั้งค่าการกำหนดค่า WireGuard",
"Configurations Directory": "ไดเร็กทอรีของการกำหนดค่า",
"Remember to remove / at the end of your path. e.g /etc/wireguard": "โปรดจำว่าให้นำ / ที่ท้ายเส้นทางออก เช่น /etc/wireguard",
"WGDashboard Account Settings": "ตั้งค่าบัญชี WGDashboard",
"Current Password": "รหัสผ่านปัจจุบัน",
"New Password": "รหัสผ่านใหม่",
"Repeat New Password": "ใส่รหัสผ่านใหม่อีกครั้ง",
"Update Password": "อัปเดตรหัสผ่าน",
"Multi-Factor Authentication \\(MFA\\)": "การยืนยันตัวตนแบบหลายชั้น \\(MFA\\)",
"Reset": "รีเซ็ต",
"Setup": "การตั้งค่า",
"API Keys": "คีย์ API",
"API Key": "คีย์ API",
"Key": "คีย์",
"Enabled": "เปิดใช้งาน",
"Disabled": "ปิดใช้งาน",
"No WGDashboard API Key": "ไม่มีคีย์ API ของ WGDashboard",
"Expire At": "หมดอายุที่",
"Are you sure to delete this API key\\?": "คุณแน่ใจหรือไม่ที่จะลบคีย์ API นี้\\?",
"Create API Key": "สร้างคีย์ API",
"When should this API Key expire\\?": "คีย์ API นี้ควรหมดอายุเมื่อไหร่\\?",
"Never Expire": "ไม่เคยหมดอายุ",
"Don't think that's a good idea": "ไม่น่าจะเป็นความคิดที่ดี",
"Creating\\.\\.\\.": "กำลังสร้าง\\.\\.\\.",
"Create": "สร้าง",
"Status": "สถานะ",
"On": "เปิด",
"Off": "ปิด",
"Turning On\\.\\.\\.": "กำลังเปิด\\.\\.\\.",
"Turning Off\\.\\.\\.": "กำลังปิด\\.\\.\\.",
"Address": "ที่อยู่",
"Listen Port": "พอร์ตการฟัง",
"Public Key": "คีย์สาธารณะ",
"Connected Peers": "Peer ที่เชื่อมต่อ",
"Total Usage": "การใช้งานทั้งหมด",
"Total Received": "รับทั้งหมด",
"Total Sent": "ส่งทั้งหมด",
"Peers Data Usage": "การใช้ข้อมูลของ Peer",
"Real Time Received Data Usage": "การใช้งานข้อมูลที่ได้รับแบบเรียลไทม์",
"Real Time Sent Data Usage": "การใช้งานข้อมูลที่ส่งแบบเรียลไทม์",
"Peer": " Peer",
"Peers": " Peers",
"Peer Settings": "การตั้งค่า Peer",
"Download All": "ดาวน์โหลดทั้งหมด",
"Search Peers\\.\\.\\.": "ค้นหา Peer\\.\\.\\.",
"Display": "แสดง",
"Sort By": "จัดเรียงตาม",
"Refresh Interval": "ช่วงเวลารีเฟรช",
"Name": "ชื่อ",
"Allowed IPs": "อนุญาต IP",
"Restricted": "ถูกจำกัด",
"(.*) Seconds": "(.*) วินาที",
"(.*) Minutes": "(.*) นาที",
"Configuration Settings": "การตั้งค่าการกำหนดค่า",
"Peer Jobs": "งานของ Peer ",
"Active Jobs": "งานที่กำลังทำ",
"All Active Jobs": "งานที่กำลังทำทั้งหมด",
"Logs": "บันทึก",
"Private Key": "คีย์ส่วนตัว",
"\\(Required for QR Code and Download\\)": "\\(จำเป็นสำหรับ QR Code และดาวน์โหลด\\)",
"\\(Required\\)": "\\(จำเป็น\\)",
"Endpoint Allowed IPs": "จุดสิ้นสุดที่อนุญาต IP",
"DNS": "DNS",
"Optional Settings": "การตั้งค่าเพิ่มเติม",
"Pre-Shared Key": "คีย์ที่ใช้ร่วมกันล่วงหน้า",
"MTU": "MTU",
"Persistent Keepalive": "การคงอยู่ของการเชื่อมต่อ",
"Reset Data Usage": "รีเซ็ตการใช้งานข้อมูล",
"Total": "ทั้งหมด",
"Sent": "ส่ง",
"Received": "รับ",
"Revert": "ย้อนกลับ",
"Save Peer": "บันทึก Peer ",
"QR Code": "QR Code",
"Schedule Jobs": "จัดตารางงาน",
"Job": "งาน",
"Job ID": "รหัสงาน",
"Unsaved Job": "งานที่ยังไม่ได้บันทึก",
"This peer does not have any job yet\\.": " Peer คนนี้ยังไม่มีงานใดๆ",
"if": "ถ้า",
"is": "เป็น",
"then": "แล้ว",
"larger than": "มากกว่า",
"Date": "วันที่",
"Restrict Peer": "จำกัด Peer ",
"Delete Peer": "ลบ Peer ",
"Edit": "แก้ไข",
"Delete": "ลบ",
"Deleting...": "กำลังลบ...",
"Cancel": "ยกเลิก",
"Save": "บันทึก",
"No active job at the moment\\.": "ไม่มีงานที่กำลังทำอยู่ในขณะนี้",
"Jobs Logs": "บันทึกงาน",
"Updated at": "อัปเดตเมื่อ",
"Refresh": "รีเฟรช",
"Filter": "กรอง",
"Success": "สำเร็จ",
"Failed": "ล้มเหลว",
"Log ID": "รหัสบันทึก",
"Message": "ข้อความ",
"Share Peer": "แชร์ Peer ",
"Currently the peer is not sharing": "ปัจจุบัน Peer ยังไม่ได้แชร์",
"Sharing\\.\\.\\.": "กำลังแชร์\\.\\.\\.",
"Start Sharing": "เริ่มแชร์",
"Stop Sharing\\.\\.\\.": "หยุดแชร์\\.\\.\\.",
"Stop Sharing": "หยุดแชร์",
"Access Restricted": "เข้าถึงถูกจำกัด",
"Restrict Access": "จำกัดการเข้าถึง",
"Restricting\\.\\.\\.": "กำลังจำกัด\\.\\.\\.",
"Allow Access": "อนุญาตการเข้าถึง",
"Allowing Access\\.\\.\\.": "กำลังอนุญาตการเข้าถึง\\.\\.\\.",
"Download \\& QR Code is not available due to no private key set for this peer": "ดาวน์โหลด & QR Code ไม่สามารถใช้งานได้ เนื่องจากไม่มีการตั้งค่าคีย์ส่วนตัวสำหรับ Peer นี้",
"Add Peers": "เพิ่ม Peer",
"Bulk Add": "เพิ่มเป็นกลุ่ม",
"By adding peers by bulk, each peer's name will be auto generated, and Allowed IP will be assign to the next available IP\\.": "โดยการเพิ่ม Peer เป็นกลุ่ม ชื่อของ Peer แต่ละคนจะถูกสร้างอัตโนมัติ และการอนุญาต IP จะถูกกำหนดให้กับ IP ที่ว่างอยู่ถัดไป",
"How many peers you want to add\\?": "คุณต้องการเพิ่ม Peer กี่คน?",
"You can add up to (.*) peers": "คุณสามารถเพิ่มได้สูงสุด (.*) Peers",
"Use your own Private and Public Key": "ใช้คีย์ส่วนตัวและสาธารณะของคุณเอง",
"Enter IP Address/CIDR": "ใส่ที่อยู่ IP/CIDR",
"IP Address/CIDR": "ที่อยู่ IP/CIDR",
"or": "หรือ",
"Pick Available IP": "เลือก IP ที่ว่างอยู่",
"No available IP containing": "ไม่มี IP ที่ว่างอยู่ซึ่งมี",
"Add": "เพิ่ม",
"Adding\\.\\.\\.": "กำลังเพิ่ม\\.\\.\\.",
"Failed to check available update": "ล้มเหลวในการตรวจสอบการอัปเดตที่ว่างอยู่",
"Nice to meet you!": "ยินดีที่ได้รู้จัก!",
"Please fill in the following fields to finish setup": "โปรดกรอกข้อมูลในช่องต่อไปนี้เพื่อจบการตั้งค่า",
"Create an account": "สร้างบัญชี",
"Enter an username you like": "ใส่ชื่อผู้ใช้ที่คุณชอบ",
"Enter a password": "ใส่รหัสผ่าน",
"\\(At least 8 characters and make sure is strong enough!\\)": "\\(อย่างน้อย 8 ตัวอักษร และตรวจสอบให้แน่ใจว่าแข็งแรงพอ!\\)",
"Confirm password": "ยืนยันรหัสผ่าน",
"Next": "ถัดไป",
"Saving\\.\\.\\.": "กำลังบันทึก\\.\\.\\.",
"1\\. Please scan the following QR Code to generate TOTP with your choice of authenticator": "1\\. โปรดสแกน QR Code ต่อไปนี้เพื่อสร้าง TOTP ด้วยแอปยืนยันตัวตนที่คุณเลือก",
"Or you can click the link below:": "หรือคุณสามารถคลิกที่ลิงค์ด้านล่าง:",
"2\\. Enter the TOTP generated by your authenticator to verify": "2\\. ใส่ TOTP ที่สร้างโดยแอปยืนยันตัวตนของคุณเพื่อยืนยัน",
"TOTP verified!": "ยืนยัน TOTP เรียบร้อยแล้ว!",
"I don't need MFA": "ไม่ต้องการ MFA",
"Complete": "เสร็จสมบูรณ์",
"(v[0-9.]{1,}) is now available for update!": "(v[0-9.]{1,}) พร้อมสำหรับการอัปเดต!",
"Current Version:": "เวอร์ชั่นปัจจุบัน:",
"Oh no\\.\\.\\. This link is either expired or invalid\\.": "โอ้ไม่\\.\\.\\. ลิงค์นี้หมดอายุหรือไม่ถูกต้อง",
"Scan QR Code with the WireGuard App to add peer": "สแกน QR Code ด้วยแอป WireGuard เพื่อเพิ่ม Peer ",
"or click the button below to download the ": "หรือคลิกปุ่มด้านล่างเพื่อดาวน์โหลด",
" file": "ไฟล์",
"FROM ": "จาก",
"(.*) is on": "(.*) เปิดอยู่",
"(.*) is off": "(.*) ปิดอยู่",
"Allowed IPs is invalid": "การอนุญาต IP ไม่ถูกต้อง",
"Peer created successfully": "สร้าง Peer เรียบร้อยแล้ว",
"Please fill in all required box": "โปรดกรอกข้อมูลในทุกช่องที่จำเป็น",
"Please specify amount of peers you want to add": "โปรดระบุจำนวน Peer ที่คุณต้องการเพิ่ม",
"No more available IP can assign": "ไม่มี IP ว่างที่จะสามารถกำหนดได้",
"The maximum number of peers can add is (.*)": "จำนวนสูงสุดของ Peer ที่สามารถเพิ่มได้คือ (.*)",
"Generating key pairs by bulk failed": "สร้างคู่คีย์เป็นกลุ่มล้มเหลว",
"Failed to add peers in bulk": "ล้มเหลวในการเพิ่ม Peer เป็นกลุ่ม",
"This peer already exist": " Peer นี้มีอยู่แล้ว",
"This IP is not available: (.*)": "IP นี้ไม่ว่าง: (.*)",
"Configuration does not exist": "การกำหนดค่าไม่มีอยู่",
"Peer does not exist": " Peer ไม่มีอยู่",
"Please provide a valid configuration name": "โปรดระบุชื่อการกำหนดค่าที่ถูกต้อง",
"Peer saved": "บันทึก Peer เรียบร้อยแล้ว",
"Allowed IPs already taken by another peer": "การอนุญาต IP ถูกใช้งานโดย Peer คนอื่นแล้ว",
"Endpoint Allowed IPs format is incorrect": "รูปแบบการอนุญาต IP ของจุดสิ้นสุดไม่ถูกต้อง",
"DNS format is incorrect": "รูปแบบ DNS ไม่ถูกต้อง",
"MTU format is not correct": "รูปแบบ MTU ไม่ถูกต้อง",
"Persistent Keepalive format is not correct": "รูปแบบการคงอยู่ของการเชื่อมต่อไม่ถูกต้อง",
"Private key does not match with the public key": "คีย์ส่วนตัวไม่ตรงกับคีย์สาธารณะ",
"Update peer failed when updating Pre-Shared Key": "อัปเดต Peer ล้มเหลวเมื่ออัปเดตคีย์ที่ใช้ร่วมกันล่วงหน้า",
"Update peer failed when updating Allowed IPs": "อัปเดต Peer ล้มเหลวเมื่ออัปเดตการอนุญาต IP",
"Update peer failed when saving the configuration": "อัปเดต Peer ล้มเหลวเมื่อบันทึกการกำหนดค่า",
"Peer data usage reset successfully": "รีเซ็ตการใช้งานข้อมูลของ Peer เรียบร้อยแล้ว",
"Peer download started": "เริ่มการดาวน์โหลด Peer แล้ว",
"Please specify one or more peers": "โปรดระบุ Peer อย่างน้อยหนึ่งคน",
"Share link failed to create. Reason: (.*)": "ล้มเหลวในการสร้างลิงค์แชร์ เหตุผล: (.*)",
"Link expire date updated": "อัปเดตวันที่หมดอายุของลิงค์แล้ว",
"Link expire date failed to update. Reason: (.*)": "ล้มเหลวในการอัปเดตวันที่หมดอายุของลิงค์ เหตุผล: (.*)",
"Peer job saved": "บันทึกงานของ Peer เรียบร้อยแล้ว",
"Please specify job": "โปรดระบุงาน",
"Please specify peer and configuration": "โปรดระบุ Peer และการกำหนดค่า",
"Peer job deleted": "ลบงานของ Peer เรียบร้อยแล้ว",
"API Keys function is successfully enabled": "เปิดใช้งานฟังก์ชั่นคีย์ API เรียบร้อยแล้ว",
"API Keys function is successfully disabled": "ปิดใช้งานฟังก์ชั่นคีย์ API เรียบร้อยแล้ว",
"API Keys function is failed to enable": "ล้มเหลวในการเปิดใช้งานฟังก์ชั่นคีย์ API",
"API Keys function is failed to disable": "ล้มเหลวในการปิดใช้งานฟังก์ชั่นคีย์ API",
"WGDashboard API Keys function is disabled": "ฟังก์ชั่นคีย์ API ของ WGDashboard ถูกปิดใช้งาน",
"WireGuard configuration path saved": "บันทึกเส้นทางการกำหนดค่า WireGuard แล้ว",
"API Key deleted": "ลบคีย์ API เรียบร้อยแล้ว",
"API Key created": "สร้างคีย์ API เรียบร้อยแล้ว",
"Sign in session ended, please sign in again": "สิ้นสุดเซสชันการลงชื่อเข้าใช้ โปรดลงชื่อเข้าใช้อีกครั้ง",
"Please specify an IP Address (v4/v6)": "โปรดระบุที่อยู่ IP (v4/v6)",
"Please provide ipAddress and count": "โปรดระบุที่อยู่ ipAddress และจำนวน",
"Please provide ipAddress": "โปรดระบุ ipAddress",
"Dashboard Language": "ภาษาของแดชบอร์ด",
"Dashboard language update failed": "ล้มเหลวในการอัปเดตภาษาของแดชบอร์ด",
"Peer Remote Endpoint": "จุดสิ้นสุดระยะไกลของ Peer ",
"New Configuration": "การกำหนดค่าใหม่",
"Configuration Name": "ชื่อการกำหนดค่า",
"Configuration name is invalid. Possible reasons:": "ชื่อการกำหนดค่าไม่ถูกต้อง เหตุผลที่เป็นไปได้:",
"Configuration name already exist\\.": "ชื่อการกำหนดค่ามีอยู่แล้ว",
"Configuration name can only contain 15 lower/uppercase alphabet, numbers, underscore, equal sign, plus sign, period and hyphen\\.": "ชื่อการกำหนดค่าประกอบด้วยได้เพียง 15 ตัวอักษรตัวพิมพ์เล็ก/ใหญ่ ตัวเลข ขีดล่าง ไม่เท่ากับ บวก จุด และ ขีดกลาง",
"Invalid Port": "พอร์ตไม่ถูกต้อง",
"Save Configuration": "บันทึกการกำหนดค่า",
"IP Address/CIDR is invalid": "ที่อยู่ IP/CIDR ไม่ถูกต้อง",
"IP Address": "ที่อยู่ IP",
"Enter IP Address / Hostname": "ใส่ที่อยู่ IP / ชื่อโฮสต์",
"IP Address / Hostname": "ที่อยู่ IP / ชื่อโฮสต์",
"Dashboard IP Address \\& Listen Port": "ที่อยู่ IP ของแดชบอร์ด & พอร์ตการฟัง",
"Count": "นับ",
"Geolocation": "ตำแหน่งทางภูมิศาสตร์",
"Is Alive": "ยังคงทำงาน",
"Average / Min / Max Round Trip Time": "เวลาไปกลับเฉลี่ย / ต่ำสุด / สูงสุด",
"Sent / Received / Lost Package": "ส่ง / รับ / แพ็คเกจที่หายไป",
"Manual restart of WGDashboard is needed to apply changes on IP Address and Listen Port": "ต้องมีการเริ่มต้นใหม่ของแดชบอร์ด WG ด้วยตนเองเพื่อใช้การเปลี่ยนแปลงกับที่อยู่ IP และพอร์ตการฟัง",
"Restore Configuration": "คืนค่าการกำหนดค่า",
"Step (.*)": "ขั้นตอน (.*)",
"Select a backup you want to restore": "เลือกการสำรองข้อมูลที่คุณต้องการคืนค่า",
"Click to change a backup": "คลิกเพื่อเปลี่ยนการสำรองข้อมูล",
"Selected Backup": "การสำรองข้อมูลที่เลือก",
"You don't have any configuration to restore": "คุณไม่มีการกำหนดค่าใด ๆ ที่จะคืนค่า",
"Help": "ช่วยเหลือ",
"Backup": "สำรองข้อมูล",
"([0-9].*) Backups?": "การสำรองข้อมูล ([0-9].*)",
"Yes": "ใช่",
"No": "ไม่",
"Backup not selected": "ไม่ได้เลือกการสำรองข้อมูล",
"Confirm \\& edit restore information": "ยืนยัน \\& แก้ไขข้อมูลการคืนค่า",
"(.*) Available IP Address": "(.*) ที่อยู่ IP ที่ใช้ได้",
"Database File": "ไฟล์ฐานข้อมูล",
"Contain": "มี",
"Restricted Peers?": "Peer ที่ถูกจำกัด?",
"Restore": "คืนค่า",
"Restoring": "กำลังคืนค่า",
"WGDashboard Settings": "การตั้งค่า WGDashboard",
"Peers Settings": "การตั้งค่า Peer",
"WireGuard Configuration Settings": "การตั้งค่าการกำหนดค่า WireGuard",
"Appearance": "ลักษณะที่ปรากฏ",
"Theme": "ธีม",
"Language": "ภาษา",
"Account Settings": "การตั้งค่าบัญชี",
"Peer Default Settings": "การตั้งค่าเริ่มต้นของ Peer",
"Toggle When Start Up": "สลับเมื่อเริ่มต้น",
"Other Settings": "การตั้งค่าอื่น",
"Select Peers": "เลือก Peer ",
"Backup & Restore": "สำรองข้อมูล & คืนค่า",
"Delete Configuration": "ลบการกำหนดค่า",
"Create Backup": "สร้างการสำรองข้อมูล",
"No backup yet, click the button above to create backup\\.": "ยังไม่มีการสำรองข้อมูล คลิกปุ่มด้านบนเพื่อสร้างการสำรองข้อมูล",
"Are you sure to delete this backup\\?": "คุณแน่ใจหรือไม่ที่จะลบการสำรองข้อมูลนี้\\?",
"Are you sure to restore this backup?\\": "คุณแน่ใจหรือไม่ที่จะคืนค่าการสำรองข้อมูลนี้\\?",
"Backup Date": "วันที่สำรองข้อมูล",
"File": "ไฟล์",
"Are you sure to delete this configuration\\?": "คุณแน่ใจหรือไม่ที่จะลบการกำหนดค่านี้\\?",
"Once you deleted this configuration\\:": "เมื่อคุณลบการกำหนดค่านี้:",
"All connected peers will get disconnected": " Peer ทั้งหมดที่เชื่อมต่อจะถูกตัดการเชื่อมต่อ",
"Both configuration file \\(\\.conf\\) and database table related to this configuration will get deleted": "ทั้งไฟล์การกำหนดค่า \\(\\.conf\\) และตารางฐานข้อมูลที่เกี่ยวข้องกับการกำหนดค่านี้จะถูกลบ",
"Checking backups...": "กำลังตรวจสอบการสำรองข้อมูล...",
"This configuration have ([0-9].*) backups": "การกำหนดค่านี้มีการสำรองข้อมูล ([0-9].*)",
"This configuration have no backup": "การกำหนดค่านี้ไม่มีการสำรองข้อมูล",
"If you're sure, please type in the configuration name below and click Delete": "หากคุณแน่ใจ โปรดพิมพ์ชื่อการกำหนดค่าด้านล่างแล้วคลิก ลบ",
"Select All": "เลือกทั้งหมด",
"Clear Selection": "ล้างการเลือก",
"([0-9].*) Peers?": " Peer ([0-9].*)",
"Downloading": "กำลังดาวน์โหลด",
"Download Finished": "ดาวน์โหลดเสร็จสิ้น",
"Done": "เสร็จสิ้น",
"Are you sure to delete": "คุณแน่ใจหรือไม่ที่จะลบ",
"Are you sure to delete this peer\\?": "คุณแน่ใจหรือไม่ที่จะลบ Peer นี้\\?",
"Configuration deleted": "การกำหนดค่าถูกลบ",
"Configuration saved": "การกำหนดค่าถูกบันทึก",
"WGDashboard language update failed": "การอัปเดตภาษาของ WGDashboard ล้มเหลว",
"Configuration restored": "การกำหนดค่าถูกคืนค่า",
"Allowed IP already taken by another peer": "การอนุญาต IP ถูกใช้งานโดย Peer คนอื่นแล้ว",
"Failed to allow access of peer (.*)": "ล้มเหลวในการอนุญาตการเข้าถึงของ Peer (.*)",
"Failed to save configuration through WireGuard": "ล้มเหลวในการบันทึกการกำหนดค่าผ่าน WireGuard",
"Allow access successfully": "อนุญาตการเข้าถึงสำเร็จ",
"Deleted ([0-9]{1,}) peer\\(s\\)": "ลบ Peer ([0-9]{1,}) คน",
"Deleted ([0-9]{1,}) peer\\(s\\) successfully. Failed to delete ([0-9]{1,}) peer\\(s\\)": "ลบ Peer ([0-9]{1,}) คนสำเร็จ ล้มเหลวในการลบ Peer ([0-9]{1,}) คน",
"Restricted ([0-9]{1,}) peer\\(s\\)": " Peer ที่ถูกจำกัด ([0-9]{1,}) คน",
"Restricted ([0-9]{1,}) peer\\(s\\) successfully. Failed to restrict ([0-9]{1,}) peer\\(s\\)": "จำกัด Peer ([0-9]{1,}) คน สำเร็จ ล้มเหลวในการจำกัด Peer ([0-9]{1,}) คน"
}

View File

@ -309,6 +309,53 @@
"Deleted ([0-9]{1,}) peer\\(s\\) successfully. Failed to delete ([0-9]{1,}) peer\\(s\\)": "成功删除了$1个端点失败删除了$2个端点",
"Restricted ([0-9]{1,}) peer\\(s\\)": "限制访问了$1个端点",
"Restricted ([0-9]{1,}) peer\\(s\\) successfully. Failed to restrict ([0-9]{1,}) peer\\(s\\)": "成功限制访问了$1个端点失败限制访问了$2个端点",
"Hi! How can I help you today\\?": "您好!有什么可以帮到您的吗?",
"What do you want to ask\\?": "您想问些什么?"
"Display As": "显示为",
"List": "列表",
"Grid": "网格",
"Sending\\.\\.\\.": "发送中...",
"Search": "搜索",
"Download": "下载",
"Protocol": "协议",
"Open File": "打开文件",
"Advanced Options": "高级选项",
"Allowed IPs Validation": "验证允许的 IP 地址",
"Update Name": "更新名称",
"To update this configuration's name, WGDashboard will execute the following operations:": "如果更新这个配置名称WGDashboard会执行以下操作",
"Duplicate current configuration's database table and \\.conf file with the new name": "使用新名称克隆当前配置的数据库表以及.conf文件",
"Delete current configuration's database table and \\.conf file": "删除当前配置的数据库表以及.conf文件",
"Danger Zone": "危险区域",
"Configuration File": "配置文件",
"Edit Raw Configuration File": "编辑配置源文件",
"Peer Configuration File": "端点配置文件",
"Share with Email": "使用邮件分享",
"Who are you sending to\\?": "您想发送给谁?",
"What\\'s the subject\\?": "主题是什么?",
"What\\'s the body\\?": "正文是什么?",
"Email Account": "邮箱账号",
"Ready": "准备就绪",
"Port": "端口",
"Encryption": "加密方式",
"No Encryption": "无加密",
"Send From": "发送自",
"Send Test Email": "发送测试邮件",
"Email Body Template": "邮件正文模板",
"Live Preview": "实时预览",
"Include configuration file as an attachment": "添加配置文件为附件",
"Send": "发送",
"Email sent successfully!": "邮件发送成功!",
"AmneziaWG Peer Setting": "AmneziaWG 端点设置",
"System Status": "系统状态",
"CPU": "中央处理器",
"Memory": "内存",
"Swap Memory": "交换区内存",
"Swap Memory Usage": "交换区内存用量",
"Processes": "进程",
"CPU Usage": "中央处理器用量",
"Memory Usage": "内存用量",
"Network": "网络",
"([0-9]{1,}) Interfaces": "$1 个网络接口",
"Storage": "储存",
"([0-9]{1,}) Partitions": "$1 个分区",
"(.*) Used": "已使用 $1",
"Untitled Peer": "未命名端点"
}

View File

@ -308,5 +308,54 @@
"Deleted ([0-9]{1,}) peer\\(s\\)": "刪除了$1個端點",
"Deleted ([0-9]{1,}) peer\\(s\\) successfully. Failed to delete ([0-9]{1,}) peer\\(s\\)": "成功刪除了$1個端點失敗刪除了$2個端點",
"Restricted ([0-9]{1,}) peer\\(s\\)": "限制訪問了$1個端點",
"Restricted ([0-9]{1,}) peer\\(s\\) successfully. Failed to restrict ([0-9]{1,}) peer\\(s\\)": "成功限制訪問了$1個端點失敗限制訪問了$2個端點"
"Restricted ([0-9]{1,}) peer\\(s\\) successfully. Failed to restrict ([0-9]{1,}) peer\\(s\\)": "成功限制訪問了$1個端點失敗限制訪問了$2個端點",
"Display As": "顯示為",
"List": "列表",
"Grid": "網格",
"Sending\\.\\.\\.": "傳送中...",
"Search": "搜尋",
"Download": "下載",
"Protocol": "協議",
"Open File": "打開檔案",
"Advanced Options": "進階選項",
"Allowed IPs Validation": "驗證允許的 IP 位址",
"Update Name": "更新名稱",
"To update this configuration's name, WGDashboard will execute the following operations:": "如果更新這個配置名稱WGDashboard會執行以下操作",
"Duplicate current configuration's database table and \\.conf file with the new name": "使用新名稱複製目前配置的資料庫資料表以及.conf檔案",
"Delete current configuration's database table and \\.conf file": "刪除目前配置的資料庫資料表以及.conf檔案",
"Danger Zone": "危險區域",
"Configuration File": "配置檔案",
"Edit Raw Configuration File": "編輯原始配置檔案",
"Peer Configuration File": "端點配置檔案",
"Share with Email": "使用電子郵件分享",
"Who are you sending to\\?": "您想傳送給誰?",
"What\\'s the subject\\?": "主題是什麼?",
"What\\'s the body\\?": "內文是什麼?",
"Email Account": "電子郵件帳號",
"Ready": "準備就緒",
"Port": "埠口",
"Encryption": "加密方式",
"No Encryption": "無加密",
"Send From": "寄件人",
"Send Test Email": "傳送測試郵件",
"Email Body Template": "郵件內文模板",
"Live Preview": "即時預覽",
"Include configuration file as an attachment": "附加配置檔案為附件",
"Send": "傳送",
"Email sent successfully!": "郵件傳送成功!",
"AmneziaWG Peer Setting": "AmneziaWG 端點設定",
"System Status": "系統狀態",
"CPU": "中央處理器",
"Memory": "記憶體",
"Swap Memory": "交換記憶體",
"Swap Memory Usage": "交換記憶體用量",
"Processes": "程序",
"CPU Usage": "中央處理器用量",
"Memory Usage": "記憶體用量",
"Network": "網路",
"([0-9]{1,}) Interfaces": "$1 個網路介面",
"Storage": "儲存",
"([0-9]{1,}) Partitions": "$1 個分割區",
"(.*) Used": "已使用 $1",
"Untitled Peer": "未命名端點"
}