Merge pull request #520 from donaldzou/main

Merging latest v4.1.1 changes into v4.2.0 branch
This commit is contained in:
Donald Zou 2024-11-23 18:10:00 +08:00 committed by GitHub
commit 8ddee03338
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
54 changed files with 2854 additions and 1517 deletions

View File

@ -21,6 +21,11 @@ jobs:
- name: Checkout repository
uses: actions/checkout@v4
- name: Set up QEMU
uses: docker/setup-qemu-action@v3
with:
platforms: linux/amd64,linux/arm64,linux/arm/v6,linux/arm/v7
- name: Log in to Docker Hub
uses: docker/login-action@v3
with:
@ -30,10 +35,10 @@ jobs:
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
- name: Build and export (linux/amd64, linux/arm64, linux/arm/v7)
- name: Build and export (multi-arch)
uses: docker/build-push-action@v6
with:
context: .
push: true
tags: ${{ env.DOCKER_IMAGE }}:latest
platforms: linux/amd64,linux/arm64,linux/arm/v7
platforms: linux/amd64,linux/arm64,linux/arm/v6,linux/arm/v7

View File

@ -29,7 +29,7 @@
Join our Discord Server for quick help, or you wanna chat about this project!
</p>
<p align="center">
<a align="center" href="https://discord.gg/MXDBpuRB"><img src="https://img.shields.io/discord/1276818723637956628?labelColor=ffffff&style=for-the-badge&logo=discord&label=Discord"></a>
<a align="center" href="https://discord.gg/72TwzjeuWm"><img src="https://img.shields.io/discord/1276818723637956628?labelColor=ffffff&style=for-the-badge&logo=discord&label=Discord"></a>
</p>

View File

@ -27,7 +27,7 @@ import threading
from flask.json.provider import DefaultJSONProvider
DASHBOARD_VERSION = 'v4.1.0'
DASHBOARD_VERSION = 'v4.1.1'
CONFIGURATION_PATH = os.getenv('CONFIGURATION_PATH', '.')
DB_PATH = os.path.join(CONFIGURATION_PATH, 'db')
if not os.path.isdir(DB_PATH):
@ -753,8 +753,17 @@ class WireguardConfiguration:
""" % self.Name
, newPeer)
for p in peers:
subprocess.check_output(f"wg set {self.Name} peer {p['id']} allowed-ips {p['allowed_ip']}",
presharedKeyExist = len(p['preshared_key']) > 0
rd = random.Random()
uid = str(uuid.UUID(int=rd.getrandbits(128), version=4))
if presharedKeyExist:
with open(uid, "w+") as f:
f.write(p['preshared_key'])
subprocess.check_output(f"wg set {self.Name} peer {p['id']} allowed-ips {p['allowed_ip'].replace(' ', '')}{f' preshared-key {uid}' if presharedKeyExist else ''}",
shell=True, stderr=subprocess.STDOUT)
if presharedKeyExist:
os.remove(uid)
subprocess.check_output(
f"wg-quick save {self.Name}", shell=True, stderr=subprocess.STDOUT)
self.getPeersList()
@ -783,14 +792,14 @@ class WireguardConfiguration:
presharedKeyExist = len(p['preshared_key']) > 0
rd = random.Random()
uid = uuid.UUID(int=rd.getrandbits(128), version=4)
uid = str(uuid.UUID(int=rd.getrandbits(128), version=4))
if presharedKeyExist:
with open(f"{uid}", "w+") as f:
with open(uid, "w+") as f:
f.write(p['preshared_key'])
subprocess.check_output(f"wg set {self.Name} peer {p['id']} allowed-ips {p['allowed_ip'].replace(' ', '')}{f' preshared-key {uid}' if presharedKeyExist else ''}",
shell=True, stderr=subprocess.STDOUT)
if presharedKeyExist: os.remove(str(uid))
if presharedKeyExist: os.remove(uid)
else:
return ResponseObject(False, "Failed to allow access of peer " + i)
if not self.__wgSave():
@ -1206,18 +1215,18 @@ class Peer:
return ResponseObject(False, "Private key does not match with the public key")
try:
rd = random.Random()
uid = uuid.UUID(int=rd.getrandbits(128), version=4)
uid = str(uuid.UUID(int=rd.getrandbits(128), version=4))
pskExist = len(preshared_key) > 0
if pskExist:
with open(f"{uid}", "w+") as f:
with open(uid, "w+") as f:
f.write(preshared_key)
newAllowedIPs = allowed_ip.replace(" ", "")
updateAllowedIp = subprocess.check_output(
f"wg set {self.configuration.Name} peer {self.id} allowed-ips {newAllowedIPs}{f' preshared-key {uid}' if pskExist else ''}",
shell=True, stderr=subprocess.STDOUT)
if pskExist: os.remove(str(uid))
if pskExist: os.remove(uid)
if len(updateAllowedIp.decode().strip("\n")) != 0:
return ResponseObject(False,

View File

@ -1 +1 @@
import{_ as r,c as i,d as o,w as e,j as l,a as t,T as _,i as a,l as d,S as u}from"./index-glbWjskj.js";const m={name:"configuration"},p={class:"mt-md-5 mt-3 text-body"};function f(x,h,k,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,j as l,a as t,T as _,i as a,l as d,S as u}from"./index-DeLT-ag4.js";const m={name:"configuration"},p={class:"mt-md-5 mt-3 text-body"};function f(x,h,k,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};

File diff suppressed because one or more lines are too long

View File

@ -1 +1 @@
import{$ as w,r as c,H as x,D as B,o as _,a as l,c as b,b as t,d as o,n as D,m as $,s as N,B as m,i as v,q as M,g as T}from"./index-glbWjskj.js";import{L as s}from"./localeText-CS3fF34S.js";const I={class:"peerSettingContainer w-100 h-100 position-absolute top-0 start-0 overflow-y-scroll"},R={class:"container d-flex h-100 w-100"},S={class:"m-auto modal-dialog-centered dashboardModal",style:{width:"700px"}},V={class:"card rounded-3 shadow flex-grow-1 bg-danger-subtle border-danger-subtle",id:"deleteConfigurationContainer"},A={class:"card-header bg-transparent d-flex align-items-center gap-2 border-0 p-4 pb-0"},L={class:"mb-0"},P={class:"card-body px-4 text-muted"},W={class:"mb-0"},q={key:0},z={key:1},E={key:2,class:"d-flex align-items-center gap-2"},G=["placeholder"],H=["disabled"],J={__name:"deleteConfiguration",emits:["backup"],setup(O,{emit:k}){const i=w().params.id,g=c(""),h=x(),p=B(),r=c(!1),y=()=>{clearInterval(p.Peers.RefreshInterval),r.value=!0,M("/api/deleteWireguardConfiguration",{Name:i},n=>{n.status?(h.push("/"),p.newMessage("Server","Configuration deleted","success")):r.value=!1})},u=c(!0),d=c([]),f=()=>{u.value=!0,T("/api/getWireguardConfigurationBackup",{configurationName:i},n=>{d.value=n.data,u.value=!1})};_(()=>{f()});const C=k;return(n,e)=>(l(),b("div",I,[t("div",R,[t("div",S,[t("div",V,[t("div",A,[t("h5",L,[o(s,{t:"Are you sure to delete this configuration?"})]),t("button",{type:"button",class:"btn-close ms-auto",onClick:e[0]||(e[0]=a=>n.$emit("close"))})]),t("div",P,[t("p",W,[o(s,{t:"Once you deleted this configuration:"})]),t("ul",null,[t("li",null,[o(s,{t:"All connected peers will get disconnected"})]),t("li",null,[o(s,{t:"Both configuration file (.conf) and database table related to this configuration will get deleted"})])]),t("div",{class:D(["alert",[u.value?"alert-secondary":d.value.length>0?"alert-success":"alert-danger"]])},[u.value?(l(),b("div",q,[e[5]||(e[5]=t("i",{class:"bi bi-search me-2"},null,-1)),o(s,{t:"Checking backups..."})])):d.value.length>0?(l(),b("div",z,[e[6]||(e[6]=t("i",{class:"bi bi-check-circle-fill me-2"},null,-1)),o(s,{t:"This configuration have "+d.value.length+" backups"},null,8,["t"])])):(l(),b("div",E,[e[9]||(e[9]=t("i",{class:"bi bi-x-circle-fill me-2"},null,-1)),o(s,{t:"This configuration have no backup"}),t("a",{role:"button",onClick:e[1]||(e[1]=a=>C("backup")),class:"ms-auto btn btn-sm btn-primary rounded-3"},[e[7]||(e[7]=t("i",{class:"bi bi-clock-history me-2"},null,-1)),o(s,{t:"Backup"})]),t("a",{role:"button",onClick:e[2]||(e[2]=a=>f()),class:"btn btn-sm btn-primary rounded-3"},e[8]||(e[8]=[t("i",{class:"bi bi-arrow-clockwise"},null,-1)]))]))],2),e[11]||(e[11]=t("hr",null,null,-1)),t("p",null,[o(s,{t:"If you're sure, please type in the configuration name below and click Delete"})]),$(t("input",{class:"form-control rounded-3 mb-3",placeholder:m(i),"onUpdate:modelValue":e[3]||(e[3]=a=>g.value=a),type:"text"},null,8,G),[[N,g.value]]),t("button",{class:"btn btn-danger w-100",onClick:e[4]||(e[4]=a=>y()),disabled:g.value!==m(i)||r.value},[e[10]||(e[10]=t("i",{class:"bi bi-trash-fill me-2 rounded-3"},null,-1)),r.value?(l(),v(s,{key:1,t:"Deleting..."})):(l(),v(s,{key:0,t:"Delete"}))],8,H)])])])])]))}};export{J as default};
import{$ as w,r as c,H as x,D as B,o as _,a as l,c as b,b as t,d as o,n as D,m as $,s as N,B as m,i as v,q as M,g as T}from"./index-DeLT-ag4.js";import{L as s}from"./localeText-Bm68I_nB.js";const I={class:"peerSettingContainer w-100 h-100 position-absolute top-0 start-0 overflow-y-scroll"},R={class:"container d-flex h-100 w-100"},S={class:"m-auto modal-dialog-centered dashboardModal",style:{width:"700px"}},V={class:"card rounded-3 shadow flex-grow-1 bg-danger-subtle border-danger-subtle",id:"deleteConfigurationContainer"},A={class:"card-header bg-transparent d-flex align-items-center gap-2 border-0 p-4 pb-0"},L={class:"mb-0"},P={class:"card-body px-4 text-muted"},W={class:"mb-0"},q={key:0},z={key:1},E={key:2,class:"d-flex align-items-center gap-2"},G=["placeholder"],H=["disabled"],J={__name:"deleteConfiguration",emits:["backup"],setup(O,{emit:k}){const i=w().params.id,g=c(""),h=x(),p=B(),r=c(!1),y=()=>{clearInterval(p.Peers.RefreshInterval),r.value=!0,M("/api/deleteWireguardConfiguration",{Name:i},n=>{n.status?(h.push("/"),p.newMessage("Server","Configuration deleted","success")):r.value=!1})},u=c(!0),d=c([]),f=()=>{u.value=!0,T("/api/getWireguardConfigurationBackup",{configurationName:i},n=>{d.value=n.data,u.value=!1})};_(()=>{f()});const C=k;return(n,e)=>(l(),b("div",I,[t("div",R,[t("div",S,[t("div",V,[t("div",A,[t("h5",L,[o(s,{t:"Are you sure to delete this configuration?"})]),t("button",{type:"button",class:"btn-close ms-auto",onClick:e[0]||(e[0]=a=>n.$emit("close"))})]),t("div",P,[t("p",W,[o(s,{t:"Once you deleted this configuration:"})]),t("ul",null,[t("li",null,[o(s,{t:"All connected peers will get disconnected"})]),t("li",null,[o(s,{t:"Both configuration file (.conf) and database table related to this configuration will get deleted"})])]),t("div",{class:D(["alert",[u.value?"alert-secondary":d.value.length>0?"alert-success":"alert-danger"]])},[u.value?(l(),b("div",q,[e[5]||(e[5]=t("i",{class:"bi bi-search me-2"},null,-1)),o(s,{t:"Checking backups..."})])):d.value.length>0?(l(),b("div",z,[e[6]||(e[6]=t("i",{class:"bi bi-check-circle-fill me-2"},null,-1)),o(s,{t:"This configuration have "+d.value.length+" backups"},null,8,["t"])])):(l(),b("div",E,[e[9]||(e[9]=t("i",{class:"bi bi-x-circle-fill me-2"},null,-1)),o(s,{t:"This configuration have no backup"}),t("a",{role:"button",onClick:e[1]||(e[1]=a=>C("backup")),class:"ms-auto btn btn-sm btn-primary rounded-3"},[e[7]||(e[7]=t("i",{class:"bi bi-clock-history me-2"},null,-1)),o(s,{t:"Backup"})]),t("a",{role:"button",onClick:e[2]||(e[2]=a=>f()),class:"btn btn-sm btn-primary rounded-3"},e[8]||(e[8]=[t("i",{class:"bi bi-arrow-clockwise"},null,-1)]))]))],2),e[11]||(e[11]=t("hr",null,null,-1)),t("p",null,[o(s,{t:"If you're sure, please type in the configuration name below and click Delete"})]),$(t("input",{class:"form-control rounded-3 mb-3",placeholder:m(i),"onUpdate:modelValue":e[3]||(e[3]=a=>g.value=a),type:"text"},null,8,G),[[N,g.value]]),t("button",{class:"btn btn-danger w-100",onClick:e[4]||(e[4]=a=>y()),disabled:g.value!==m(i)||r.value},[e[10]||(e[10]=t("i",{class:"bi bi-trash-fill me-2 rounded-3"},null,-1)),r.value?(l(),v(s,{key:1,t:"Deleting..."})):(l(),v(s,{key:0,t:"Delete"}))],8,H)])])])])]))}};export{J 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 @@
import{_ as t,G as e,t as o}from"./index-glbWjskj.js";const s={name:"localeText",props:{t:""},computed:{getLocaleText(){return e(this.t)}}};function a(c,r,n,p,_,i){return o(this.getLocaleText)}const x=t(s,[["render",a]]);export{x as L};
import{_ as t,G as e,t as o}from"./index-DeLT-ag4.js";const s={name:"localeText",props:{t:""},computed:{getLocaleText(){return e(this.t)}}};function a(c,r,n,p,_,i){return o(this.getLocaleText)}const x=t(s,[["render",a]]);export{x as L};

View File

@ -1 +1 @@
import{L as c}from"./localeText-CS3fF34S.js";import{d as n}from"./dayjs.min-DTCutzON.js";import{_ as d,a as r,c as m,b as s,d as i,f as t,t as e,n as l,j as _}from"./index-glbWjskj.js";const p={name:"message",methods:{dayjs:n},components:{LocaleText:c},props:{message:Object},mounted(){setTimeout(()=>{this.message.show=!1},5e3)}},g=["id"],h={class:"card-body"},f={class:"d-flex"},x={class:"fw-bold d-block",style:{"text-transform":"uppercase"}},u={class:"ms-auto"};function b(y,v,w,T,j,a){const o=_("LocaleText");return r(),m("div",{class:l(["card shadow rounded-3 position-relative message ms-auto",{"text-bg-danger":this.message.type==="danger","text-bg-success":this.message.type==="success","text-bg-warning":this.message.type==="warning"}]),id:this.message.id},[s("div",h,[s("div",f,[s("small",x,[i(o,{t:"FROM "}),t(" "+e(this.message.from),1)]),s("small",u,e(a.dayjs().format("hh:mm A")),1)]),t(" "+e(this.message.content),1)])],10,g)}const M=d(p,[["render",b],["__scopeId","data-v-f50b8f0c"]]);export{M};
import{L as c}from"./localeText-Bm68I_nB.js";import{d as n}from"./dayjs.min-BXJG8oxU.js";import{_ as d,a as r,c as m,b as s,d as i,f as t,t as e,n as l,j as _}from"./index-DeLT-ag4.js";const p={name:"message",methods:{dayjs:n},components:{LocaleText:c},props:{message:Object},mounted(){setTimeout(()=>{this.message.show=!1},5e3)}},g=["id"],h={class:"card-body"},f={class:"d-flex"},x={class:"fw-bold d-block",style:{"text-transform":"uppercase"}},u={class:"ms-auto"};function b(y,v,w,T,j,a){const o=_("LocaleText");return r(),m("div",{class:l(["card shadow rounded-3 position-relative message ms-auto",{"text-bg-danger":this.message.type==="danger","text-bg-success":this.message.type==="success","text-bg-warning":this.message.type==="warning"}]),id:this.message.id},[s("div",h,[s("div",f,[s("small",x,[i(o,{t:"FROM "}),t(" "+e(this.message.from),1)]),s("small",u,e(a.dayjs().format("hh:mm A")),1)]),t(" "+e(this.message.content),1)])],10,g)}const M=d(p,[["render",b],["__scopeId","data-v-f50b8f0c"]]);export{M};

File diff suppressed because one or more lines are too long

View File

@ -1 +1 @@
import{_ as f,D as m,r as _,a as s,c as a,b as e,d as l,w as g,T as h}from"./index-glbWjskj.js";import{L as v}from"./localeText-CS3fF34S.js";const y={class:"peerSettingContainer w-100 h-100 position-absolute top-0 start-0"},x={class:"container d-flex h-100 w-100"},w={class:"m-auto modal-dialog-centered dashboardModal justify-content-center"},C={class:"card rounded-3 shadow w-100"},k={class:"card-header bg-transparent d-flex align-items-center gap-2 border-0 p-4 pb-0"},F={class:"mb-0"},T={class:"card-body p-4"},D={class:"d-flex"},S=["disabled"],B={key:0,class:"d-block"},M={key:1,class:"d-block",id:"check"},G=["value"],L={__name:"peerConfigurationFile",props:{configurationFile:String},emits:["close"],setup(i,{emit:r}){const c=r,d=i,n=m(),o=_(!1),u=async()=>{navigator.clipboard&&navigator.clipboard.writeText?navigator.clipboard.writeText(d.configurationFile).then(()=>{o.value=!0,setTimeout(()=>{o.value=!1},3e3)}).catch(()=>{n.newMessage("WGDashboard","Failed to copy","danger")}):(document.querySelector("#peerConfigurationFile").select(),document.execCommand("copy")?(o.value=!0,setTimeout(()=>{o.value=!1},3e3)):n.newMessage("WGDashboard","Failed to copy","danger"))};return(p,t)=>(s(),a("div",y,[e("div",x,[e("div",w,[e("div",C,[e("div",k,[e("h4",F,[l(v,{t:"Peer Configuration File"})]),e("button",{type:"button",class:"btn-close ms-auto",onClick:t[0]||(t[0]=b=>c("close"))})]),e("div",T,[e("div",D,[e("button",{onClick:t[1]||(t[1]=b=>u()),disabled:o.value,class:"ms-auto btn bg-primary-subtle border-primary-subtle text-primary-emphasis rounded-3 position-relative"},[l(h,{name:"slide-up",mode:"out-in"},{default:g(()=>[o.value?(s(),a("span",M,t[3]||(t[3]=[e("i",{class:"bi bi-check-circle-fill"},null,-1)]))):(s(),a("span",B,t[2]||(t[2]=[e("i",{class:"bi bi-clipboard-fill"},null,-1)])))]),_:1})],8,S)]),e("textarea",{style:{height:"300px"},class:"form-control w-100 rounded-3 mt-2",id:"peerConfigurationFile",value:i.configurationFile},null,8,G)])])])])]))}},W=f(L,[["__scopeId","data-v-fcd3ae95"]]);export{W as default};
import{_ as f,D as m,r as _,a as s,c as a,b as e,d as l,w as g,T as h}from"./index-DeLT-ag4.js";import{L as v}from"./localeText-Bm68I_nB.js";const y={class:"peerSettingContainer w-100 h-100 position-absolute top-0 start-0"},x={class:"container d-flex h-100 w-100"},w={class:"m-auto modal-dialog-centered dashboardModal justify-content-center"},C={class:"card rounded-3 shadow w-100"},k={class:"card-header bg-transparent d-flex align-items-center gap-2 border-0 p-4 pb-0"},F={class:"mb-0"},T={class:"card-body p-4"},D={class:"d-flex"},S=["disabled"],B={key:0,class:"d-block"},M={key:1,class:"d-block",id:"check"},G=["value"],L={__name:"peerConfigurationFile",props:{configurationFile:String},emits:["close"],setup(i,{emit:r}){const c=r,d=i,n=m(),o=_(!1),u=async()=>{navigator.clipboard&&navigator.clipboard.writeText?navigator.clipboard.writeText(d.configurationFile).then(()=>{o.value=!0,setTimeout(()=>{o.value=!1},3e3)}).catch(()=>{n.newMessage("WGDashboard","Failed to copy","danger")}):(document.querySelector("#peerConfigurationFile").select(),document.execCommand("copy")?(o.value=!0,setTimeout(()=>{o.value=!1},3e3)):n.newMessage("WGDashboard","Failed to copy","danger"))};return(p,t)=>(s(),a("div",y,[e("div",x,[e("div",w,[e("div",C,[e("div",k,[e("h4",F,[l(v,{t:"Peer Configuration File"})]),e("button",{type:"button",class:"btn-close ms-auto",onClick:t[0]||(t[0]=b=>c("close"))})]),e("div",T,[e("div",D,[e("button",{onClick:t[1]||(t[1]=b=>u()),disabled:o.value,class:"ms-auto btn bg-primary-subtle border-primary-subtle text-primary-emphasis rounded-3 position-relative"},[l(h,{name:"slide-up",mode:"out-in"},{default:g(()=>[o.value?(s(),a("span",M,t[3]||(t[3]=[e("i",{class:"bi bi-check-circle-fill"},null,-1)]))):(s(),a("span",B,t[2]||(t[2]=[e("i",{class:"bi bi-clipboard-fill"},null,-1)])))]),_:1})],8,S)]),e("textarea",{style:{height:"300px"},class:"form-control w-100 rounded-3 mt-2",id:"peerConfigurationFile",value:i.configurationFile},null,8,G)])])])])]))}},W=f(L,[["__scopeId","data-v-fcd3ae95"]]);export{W as default};

View File

@ -1 +1 @@
.list-move[data-v-6d5fc831],.list-enter-active[data-v-6d5fc831],.list-leave-active[data-v-6d5fc831]{transition:all .3s ease}.list-enter-from[data-v-6d5fc831],.list-leave-to[data-v-6d5fc831]{opacity:0;transform:translateY(10px)}.list-leave-active[data-v-6d5fc831]{position:absolute}.peerSettingContainer[data-v-17eb547c]{background-color:#00000060;z-index:9998}div[data-v-17eb547c]{transition:.2s ease-in-out}.inactiveField[data-v-17eb547c]{opacity:.4}.card[data-v-17eb547c]{max-height:100%}
.list-move[data-v-6d5fc831],.list-enter-active[data-v-6d5fc831],.list-leave-active[data-v-6d5fc831]{transition:all .3s ease}.list-enter-from[data-v-6d5fc831],.list-leave-to[data-v-6d5fc831]{opacity:0;transform:translateY(10px)}.list-leave-active[data-v-6d5fc831]{position:absolute}.peerSettingContainer[data-v-ddffd6ec]{background-color:#00000060;z-index:9998}div[data-v-ddffd6ec]{transition:.2s ease-in-out}.inactiveField[data-v-ddffd6ec]{opacity:.4}.card[data-v-ddffd6ec]{max-height:100%}

View File

@ -1 +1 @@
import{S as p,a as b}from"./schedulePeerJob-BAfYRNYt.js";import{_ as h,W as u,p as m,j 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,k as g}from"./index-glbWjskj.js";import{L as w}from"./localeText-CS3fF34S.js";import"./vue-datepicker-5oBLmVre.js";import"./dayjs.min-DTCutzON.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"},j={class:"mb-0 fw-normal"},k={class:"card-body px-4 pb-4 pt-2 position-relative"},N={class:"d-flex align-items-center mb-3"},T={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",j,[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",k,[e("div",N,[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",T,[e("div",I,[e("h6",L,[r(n,{t:"This peer does not have any job yet."})])])])):x("",!0)]),_:1})])])])])])}const z=h(P,[["render",O],["__scopeId","data-v-5bbdd42b"]]);export{z as default};
import{S as p,a as b}from"./schedulePeerJob-B4AuR_O4.js";import{_ as h,W as u,p as m,j 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,k as g}from"./index-DeLT-ag4.js";import{L as w}from"./localeText-Bm68I_nB.js";import"./vue-datepicker-BYU1fpEw.js";import"./dayjs.min-BXJG8oxU.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"},j={class:"mb-0 fw-normal"},k={class:"card-body px-4 pb-4 pt-2 position-relative"},N={class:"d-flex align-items-center mb-3"},T={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",j,[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",k,[e("div",N,[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",T,[e("div",I,[e("h6",L,[r(n,{t:"This peer does not have any job yet."})])])])):x("",!0)]),_:1})])])])])])}const z=h(P,[["render",O],["__scopeId","data-v-5bbdd42b"]]);export{z as default};

View File

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

File diff suppressed because one or more lines are too long

View File

@ -1 +1 @@
import{b as a}from"./browser-CjSdxGTc.js";import{L as n}from"./localeText-CS3fF34S.js";import{_ as c,j as r,a as d,c as i,b as e,d as l}from"./index-glbWjskj.js";const p={name:"peerQRCode",components:{LocaleText:n},props:{peerConfigData:String},mounted(){a.toCanvas(document.querySelector("#qrcode"),this.peerConfigData,o=>{o&&console.error(o)})}},_={class:"peerSettingContainer w-100 h-100 position-absolute top-0 start-0"},m={class:"container d-flex h-100 w-100"},h={class:"m-auto modal-dialog-centered dashboardModal justify-content-center"},u={class:"card rounded-3 shadow"},f={class:"card-header bg-transparent d-flex align-items-center gap-2 border-0 p-4 pb-0"},b={class:"mb-0"},v={class:"card-body"},C={id:"qrcode",class:"rounded-3 shadow",ref:"qrcode"};function g(o,t,x,$,w,q){const s=r("LocaleText");return d(),i("div",_,[e("div",m,[e("div",h,[e("div",u,[e("div",f,[e("h4",b,[l(s,{t:"QR Code"})]),e("button",{type:"button",class:"btn-close ms-auto",onClick:t[0]||(t[0]=y=>this.$emit("close"))})]),e("div",v,[e("canvas",C,null,512)])])])])])}const Q=c(p,[["render",g]]);export{Q as default};
import{b as a}from"./browser-CjSdxGTc.js";import{L as n}from"./localeText-Bm68I_nB.js";import{_ as c,j as r,a as d,c as i,b as e,d as l}from"./index-DeLT-ag4.js";const p={name:"peerQRCode",components:{LocaleText:n},props:{peerConfigData:String},mounted(){a.toCanvas(document.querySelector("#qrcode"),this.peerConfigData,o=>{o&&console.error(o)})}},_={class:"peerSettingContainer w-100 h-100 position-absolute top-0 start-0"},m={class:"container d-flex h-100 w-100"},h={class:"m-auto modal-dialog-centered dashboardModal justify-content-center"},u={class:"card rounded-3 shadow"},f={class:"card-header bg-transparent d-flex align-items-center gap-2 border-0 p-4 pb-0"},b={class:"mb-0"},v={class:"card-body"},C={id:"qrcode",class:"rounded-3 shadow",ref:"qrcode"};function g(o,t,x,$,w,q){const s=r("LocaleText");return d(),i("div",_,[e("div",m,[e("div",h,[e("div",u,[e("div",f,[e("h4",b,[l(s,{t:"QR Code"})]),e("button",{type:"button",class:"btn-close ms-auto",onClick:t[0]||(t[0]=y=>this.$emit("close"))})]),e("div",v,[e("canvas",C,null,512)])])])])])}const Q=c(p,[["render",g]]);export{Q as default};

View File

@ -1 +1 @@
import{_ as g,D as f,q as h,j as p,a as s,c as r,b as t,d as o,n as m,i as n,t as _,e as b}from"./index-glbWjskj.js";import{d}from"./dayjs.min-DTCutzON.js";import{V as y}from"./vue-datepicker-5oBLmVre.js";import{L as S}from"./localeText-CS3fF34S.js";const k={name:"peerShareLinkModal",props:{peer:Object},components:{LocaleText:S,VueDatePicker:y},data(){return{dataCopy:void 0,loading:!1}},setup(){return{store:f()}},mounted(){this.dataCopy=JSON.parse(JSON.stringify(this.peer.ShareLink)).at(0)},watch:{"peer.ShareLink":{deep:!0,handler(e,a){a.length!==e.length&&(this.dataCopy=JSON.parse(JSON.stringify(this.peer.ShareLink)).at(0))}}},methods:{startSharing(){this.loading=!0,h("/api/sharePeer/create",{Configuration:this.peer.configuration.Name,Peer:this.peer.id,ExpireDate:d().add(7,"d").format("YYYY-MM-DD HH:mm:ss")},e=>{e.status?(this.peer.ShareLink=e.data,this.dataCopy=e.data.at(0)):this.store.newMessage("Server","Share link failed to create. Reason: "+e.message,"danger"),this.loading=!1})},updateLinkExpireDate(){h("/api/sharePeer/update",this.dataCopy,e=>{e.status?(this.dataCopy=e.data.at(0),this.peer.ShareLink=e.data,this.store.newMessage("Server","Link expire date updated","success")):this.store.newMessage("Server","Link expire date failed to update. Reason: "+e.message,"danger"),this.loading=!1})},stopSharing(){this.loading=!0,this.dataCopy.ExpireDate=d().format("YYYY-MM-DD HH:mm:ss"),this.updateLinkExpireDate()},parseTime(e){e?this.dataCopy.ExpireDate=d(e).format("YYYY-MM-DD HH:mm:ss"):this.dataCopy.ExpireDate=void 0,this.updateLinkExpireDate()}},computed:{getUrl(){const e=this.store.getActiveCrossServer();return e?`${e.host}/${this.$router.resolve({path:"/share",query:{ShareID:this.dataCopy.ShareID}}).href}`:window.location.origin+window.location.pathname+this.$router.resolve({path:"/share",query:{ShareID:this.dataCopy.ShareID}}).href}}},x={class:"peerSettingContainer w-100 h-100 position-absolute top-0 start-0 overflow-y-scroll"},v={class:"container d-flex h-100 w-100"},C={class:"m-auto modal-dialog-centered dashboardModal",style:{width:"500px"}},D={class:"card rounded-3 shadow flex-grow-1"},w={class:"card-header bg-transparent d-flex align-items-center gap-2 border-0 p-4"},L={class:"mb-0"},M={key:0,class:"card-body px-4 pb-4"},Y={key:0},$={class:"mb-3 text-muted"},E=["disabled"],H={key:1},V={class:"d-flex gap-2 mb-4"},N=["href"],P={class:"d-flex flex-column gap-2 mb-3"},O=["disabled"];function T(e,a,U,B,I,c){const i=p("LocaleText"),u=p("VueDatePicker");return s(),r("div",x,[t("div",v,[t("div",C,[t("div",D,[t("div",w,[t("h4",L,[o(i,{t:"Share Peer"})]),t("button",{type:"button",class:"btn-close ms-auto",onClick:a[0]||(a[0]=l=>this.$emit("close"))})]),this.peer.ShareLink?(s(),r("div",M,[this.dataCopy?(s(),r("div",H,[t("div",V,[a[4]||(a[4]=t("i",{class:"bi bi-link-45deg"},null,-1)),t("a",{href:this.getUrl,class:"text-decoration-none",target:"_blank"},_(c.getUrl),9,N)]),t("div",P,[t("small",null,[a[5]||(a[5]=t("i",{class:"bi bi-calendar me-2"},null,-1)),o(i,{t:"Expire At"})]),o(u,{is24:!0,"min-date":new Date,"model-value":this.dataCopy.ExpireDate,"onUpdate:modelValue":this.parseTime,"time-picker-inline":"",format:"yyyy-MM-dd HH:mm:ss","preview-format":"yyyy-MM-dd HH:mm:ss",dark:this.store.Configuration.Server.dashboard_theme==="dark"},null,8,["min-date","model-value","onUpdate:modelValue","dark"])]),t("button",{onClick:a[2]||(a[2]=l=>this.stopSharing()),disabled:this.loading,class:"w-100 btn bg-danger-subtle text-danger-emphasis border-1 border-danger-subtle rounded-3 shadow-sm"},[t("span",{class:m({"animate__animated animate__flash animate__infinite animate__slower":this.loading})},a[6]||(a[6]=[t("i",{class:"bi bi-send-slash-fill me-2"},null,-1)]),2),this.loading?(s(),n(i,{key:0,t:"Stop Sharing..."})):(s(),n(i,{key:1,t:"Stop Sharing"}))],8,O)])):(s(),r("div",Y,[t("h6",$,[o(i,{t:"Currently the peer is not sharing"})]),t("button",{onClick:a[1]||(a[1]=l=>this.startSharing()),disabled:this.loading,class:"w-100 btn bg-success-subtle text-success-emphasis border-1 border-success-subtle rounded-3 shadow-sm"},[t("span",{class:m({"animate__animated animate__flash animate__infinite animate__slower":this.loading})},a[3]||(a[3]=[t("i",{class:"bi bi-send-fill me-2"},null,-1)]),2),this.loading?(s(),n(i,{key:0,t:"Sharing..."})):(s(),n(i,{key:1,t:"Start Sharing"}))],8,E)]))])):b("",!0)])])])])}const R=g(k,[["render",T]]);export{R as default};
import{_ as g,D as f,q as h,j as p,a as s,c as r,b as t,d as o,n as m,i as n,t as _,e as b}from"./index-DeLT-ag4.js";import{d}from"./dayjs.min-BXJG8oxU.js";import{V as y}from"./vue-datepicker-BYU1fpEw.js";import{L as S}from"./localeText-Bm68I_nB.js";const k={name:"peerShareLinkModal",props:{peer:Object},components:{LocaleText:S,VueDatePicker:y},data(){return{dataCopy:void 0,loading:!1}},setup(){return{store:f()}},mounted(){this.dataCopy=JSON.parse(JSON.stringify(this.peer.ShareLink)).at(0)},watch:{"peer.ShareLink":{deep:!0,handler(e,a){a.length!==e.length&&(this.dataCopy=JSON.parse(JSON.stringify(this.peer.ShareLink)).at(0))}}},methods:{startSharing(){this.loading=!0,h("/api/sharePeer/create",{Configuration:this.peer.configuration.Name,Peer:this.peer.id,ExpireDate:d().add(7,"d").format("YYYY-MM-DD HH:mm:ss")},e=>{e.status?(this.peer.ShareLink=e.data,this.dataCopy=e.data.at(0)):this.store.newMessage("Server","Share link failed to create. Reason: "+e.message,"danger"),this.loading=!1})},updateLinkExpireDate(){h("/api/sharePeer/update",this.dataCopy,e=>{e.status?(this.dataCopy=e.data.at(0),this.peer.ShareLink=e.data,this.store.newMessage("Server","Link expire date updated","success")):this.store.newMessage("Server","Link expire date failed to update. Reason: "+e.message,"danger"),this.loading=!1})},stopSharing(){this.loading=!0,this.dataCopy.ExpireDate=d().format("YYYY-MM-DD HH:mm:ss"),this.updateLinkExpireDate()},parseTime(e){e?this.dataCopy.ExpireDate=d(e).format("YYYY-MM-DD HH:mm:ss"):this.dataCopy.ExpireDate=void 0,this.updateLinkExpireDate()}},computed:{getUrl(){const e=this.store.getActiveCrossServer();return e?`${e.host}/${this.$router.resolve({path:"/share",query:{ShareID:this.dataCopy.ShareID}}).href}`:window.location.origin+window.location.pathname+this.$router.resolve({path:"/share",query:{ShareID:this.dataCopy.ShareID}}).href}}},x={class:"peerSettingContainer w-100 h-100 position-absolute top-0 start-0 overflow-y-scroll"},v={class:"container d-flex h-100 w-100"},C={class:"m-auto modal-dialog-centered dashboardModal",style:{width:"500px"}},D={class:"card rounded-3 shadow flex-grow-1"},w={class:"card-header bg-transparent d-flex align-items-center gap-2 border-0 p-4"},L={class:"mb-0"},M={key:0,class:"card-body px-4 pb-4"},Y={key:0},$={class:"mb-3 text-muted"},E=["disabled"],H={key:1},V={class:"d-flex gap-2 mb-4"},N=["href"],P={class:"d-flex flex-column gap-2 mb-3"},O=["disabled"];function T(e,a,U,B,I,c){const i=p("LocaleText"),u=p("VueDatePicker");return s(),r("div",x,[t("div",v,[t("div",C,[t("div",D,[t("div",w,[t("h4",L,[o(i,{t:"Share Peer"})]),t("button",{type:"button",class:"btn-close ms-auto",onClick:a[0]||(a[0]=l=>this.$emit("close"))})]),this.peer.ShareLink?(s(),r("div",M,[this.dataCopy?(s(),r("div",H,[t("div",V,[a[4]||(a[4]=t("i",{class:"bi bi-link-45deg"},null,-1)),t("a",{href:this.getUrl,class:"text-decoration-none",target:"_blank"},_(c.getUrl),9,N)]),t("div",P,[t("small",null,[a[5]||(a[5]=t("i",{class:"bi bi-calendar me-2"},null,-1)),o(i,{t:"Expire At"})]),o(u,{is24:!0,"min-date":new Date,"model-value":this.dataCopy.ExpireDate,"onUpdate:modelValue":this.parseTime,"time-picker-inline":"",format:"yyyy-MM-dd HH:mm:ss","preview-format":"yyyy-MM-dd HH:mm:ss",dark:this.store.Configuration.Server.dashboard_theme==="dark"},null,8,["min-date","model-value","onUpdate:modelValue","dark"])]),t("button",{onClick:a[2]||(a[2]=l=>this.stopSharing()),disabled:this.loading,class:"w-100 btn bg-danger-subtle text-danger-emphasis border-1 border-danger-subtle rounded-3 shadow-sm"},[t("span",{class:m({"animate__animated animate__flash animate__infinite animate__slower":this.loading})},a[6]||(a[6]=[t("i",{class:"bi bi-send-slash-fill me-2"},null,-1)]),2),this.loading?(s(),n(i,{key:0,t:"Stop Sharing..."})):(s(),n(i,{key:1,t:"Stop Sharing"}))],8,O)])):(s(),r("div",Y,[t("h6",$,[o(i,{t:"Currently the peer is not sharing"})]),t("button",{onClick:a[1]||(a[1]=l=>this.startSharing()),disabled:this.loading,class:"w-100 btn bg-success-subtle text-success-emphasis border-1 border-success-subtle rounded-3 shadow-sm"},[t("span",{class:m({"animate__animated animate__flash animate__infinite animate__slower":this.loading})},a[3]||(a[3]=[t("i",{class:"bi bi-send-fill me-2"},null,-1)]),2),this.loading?(s(),n(i,{key:0,t:"Sharing..."})):(s(),n(i,{key:1,t:"Start Sharing"}))],8,E)]))])):b("",!0)])])])])}const R=g(k,[["render",T]]);export{R 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 @@
import{_ as u,D as m,q as p,c as r,b as e,d as o,f as c,t as h,e as f,m as l,s as d,a as i,j as w}from"./index-glbWjskj.js";import{L as g}from"./localeText-CS3fF34S.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"},q={for:"confirmPassword",class:"mb-1 text-muted"},$=["disabled"],A={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",q,[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",A,[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 W=u(b,[["render",B]]);export{W as default};
import{_ as u,D as m,q as p,c as r,b as e,d as o,f as c,t as h,e as f,m as l,s as d,a as i,j as w}from"./index-DeLT-ag4.js";import{L as g}from"./localeText-Bm68I_nB.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"},q={for:"confirmPassword",class:"mb-1 text-muted"},$=["disabled"],A={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",q,[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",A,[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 W=u(b,[["render",B]]);export{W as default};

View File

@ -1 +1 @@
import{_,r,D as p,g as u,c as m,b as t,d as c,$ as h,a as f,j as b}from"./index-glbWjskj.js";import{b as v}from"./browser-CjSdxGTc.js";import{L as y}from"./localeText-CS3fF34S.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"},B={class:"h1 dashboardLogo text-center animate__animated animate__fadeInUp"},k={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 j(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",B,[e[1]||(e[1]=t("h6",null,"WGDashboard",-1)),c(a,{t:"Scan QR Code with the WireGuard App to add peer"})]),t("canvas",k,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 $=_(g,[["render",j],["__scopeId","data-v-1b44aacd"]]);export{$ as default};
import{_,r,D as p,g as u,c as m,b as t,d as c,$ as h,a as f,j as b}from"./index-DeLT-ag4.js";import{b as v}from"./browser-CjSdxGTc.js";import{L as y}from"./localeText-Bm68I_nB.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"},B={class:"h1 dashboardLogo text-center animate__animated animate__fadeInUp"},k={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 j(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",B,[e[1]||(e[1]=t("h6",null,"WGDashboard",-1)),c(a,{t:"Scan QR Code with the WireGuard App to add peer"})]),t("canvas",k,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 $=_(g,[["render",j],["__scopeId","data-v-1b44aacd"]]);export{$ as default};

File diff suppressed because one or more lines are too long

View File

@ -1 +1 @@
import{_ as h,D as m,g as p,q as f,c as b,b as t,d as i,t as _,m as v,s as g,i as d,w as r,j as c,a as n}from"./index-glbWjskj.js";import{b as x}from"./browser-CjSdxGTc.js";import{L as y}from"./localeText-CS3fF34S.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"}},q={for:"totp",class:"mb-2"},D={class:"text-muted"},S={class:"form-group mb-2"},A=["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,j){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",q,[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,A),[[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,q as f,c as b,b as t,d as i,t as _,m as v,s as g,i as d,w as r,j as c,a as n}from"./index-DeLT-ag4.js";import{b as x}from"./browser-CjSdxGTc.js";import{L as y}from"./localeText-Bm68I_nB.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"}},q={for:"totp",class:"mb-2"},D={class:"text-muted"},S={class:"form-group mb-2"},A=["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,j){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",q,[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,A),[[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 b,g,c as o,b as t,d as n,m as y,s as f,A as v,w as r,T as c,a,f as x,F as u,h as m,n as T,z as k,t as i,e as A,j as _}from"./index-glbWjskj.js";import{O as w}from"./osmap-BjMGYJcF.js";import{L as R}from"./localeText-CS3fF34S.js";const M={name:"traceroute",components:{LocaleText:R,OSMap:w},data(){return{tracing:!1,ipAddress:void 0,tracerouteResult:void 0}},setup(){return{store:b()}},methods:{execute(){this.ipAddress&&(this.tracing=!0,this.tracerouteResult=void 0,g("/api/traceroute/execute",{ipAddress:this.ipAddress},d=>{d.status?this.tracerouteResult=d.data:this.store.newMessage("Server",d.message,"danger"),this.tracing=!1}))}}},S={class:"mt-md-5 mt-3 text-body"},$={class:"container-md"},C={class:"mb-3 text-body"},L={class:"d-flex gap-2 flex-column mb-5"},P={class:"mb-1 text-muted",for:"ipAddress"},V=["disabled"],N=["disabled"],O={key:0,class:"d-block"},z={key:1,class:"d-block"},B={class:"position-relative"},I={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};function J(d,s,Q,X,Y,Z){const l=_("LocaleText"),p=_("OSMap");return a(),o("div",S,[t("div",$,[t("h3",C,[n(l,{t:"Traceroute"})]),t("div",L,[t("div",null,[t("label",P,[t("small",null,[n(l,{t:"Enter IP Address / Hostname"})])]),y(t("input",{disabled:this.tracing,id:"ipAddress",class:"form-control","onUpdate:modelValue":s[0]||(s[0]=e=>this.ipAddress=e),onKeyup:s[1]||(s[1]=v(e=>this.execute(),["enter"])),type:"text"},null,40,V),[[f,this.ipAddress]])]),t("button",{class:"btn btn-primary rounded-3 mt-3 position-relative",disabled:this.tracing||!this.ipAddress,onClick:s[2]||(s[2]=e=>this.execute())},[n(c,{name:"slide"},{default:r(()=>[this.tracing?(a(),o("span",z,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)]))):(a(),o("span",O,s[3]||(s[3]=[t("i",{class:"bi bi-person-walking me-2"},null,-1),x("Trace! ")])))]),_:1})],8,N)]),t("div",B,[n(c,{name:"ping"},{default:r(()=>[this.tracerouteResult?(a(),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(l,{t:"Hop"})]),t("th",H,[n(l,{t:"IP Address"})]),t("th",K,[n(l,{t:"Average RTT (ms)"})]),t("th",W,[n(l,{t:"Min RTT (ms)"})]),t("th",j,[n(l,{t:"Max RTT (ms)"})]),t("th",U,[n(l,{t:"Geolocation"})])])]),t("tbody",null,[(a(!0),o(u,null,m(this.tracerouteResult,(e,tt)=>(a(),o("tr",null,[t("td",null,[t("small",null,i(e.hop),1)]),t("td",null,[t("small",null,i(e.ip),1)]),t("td",null,[t("small",null,i(e.avg_rtt),1)]),t("td",null,[t("small",null,i(e.min_rtt),1)]),t("td",null,[t("small",null,i(e.max_rtt),1)]),t("td",null,[e.geo.city&&e.geo.country?(a(),o("span",q,[t("small",null,i(e.geo.city)+", "+i(e.geo.country),1)])):A("",!0)])]))),256))])])])])):(a(),o("div",I,[s[5]||(s[5]=t("div",{class:"pingPlaceholder bg-body-secondary rounded-3 mb-3",style:{height:"300px !important"}},null,-1)),(a(),o(u,null,m(5,e=>t("div",{class:T(["pingPlaceholder bg-body-secondary rounded-3 mb-3",{"animate__animated animate__flash animate__slower animate__infinite":this.tracing}]),style:k({"animation-delay":`${e*.05}s`})},null,6)),64))]))]),_:1})])])])}const ot=h(M,[["render",J],["__scopeId","data-v-549eb223"]]);export{ot as default};
import{_ as h,W as b,g,c as o,b as t,d as n,m as y,s as f,A as v,w as r,T as c,a,f as x,F as u,h as m,n as T,z as k,t as i,e as A,j as _}from"./index-DeLT-ag4.js";import{O as w}from"./osmap-BpsUKiQ8.js";import{L as R}from"./localeText-Bm68I_nB.js";const M={name:"traceroute",components:{LocaleText:R,OSMap:w},data(){return{tracing:!1,ipAddress:void 0,tracerouteResult:void 0}},setup(){return{store:b()}},methods:{execute(){this.ipAddress&&(this.tracing=!0,this.tracerouteResult=void 0,g("/api/traceroute/execute",{ipAddress:this.ipAddress},d=>{d.status?this.tracerouteResult=d.data:this.store.newMessage("Server",d.message,"danger"),this.tracing=!1}))}}},S={class:"mt-md-5 mt-3 text-body"},$={class:"container-md"},C={class:"mb-3 text-body"},L={class:"d-flex gap-2 flex-column mb-5"},P={class:"mb-1 text-muted",for:"ipAddress"},V=["disabled"],N=["disabled"],O={key:0,class:"d-block"},z={key:1,class:"d-block"},B={class:"position-relative"},I={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};function J(d,s,Q,X,Y,Z){const l=_("LocaleText"),p=_("OSMap");return a(),o("div",S,[t("div",$,[t("h3",C,[n(l,{t:"Traceroute"})]),t("div",L,[t("div",null,[t("label",P,[t("small",null,[n(l,{t:"Enter IP Address / Hostname"})])]),y(t("input",{disabled:this.tracing,id:"ipAddress",class:"form-control","onUpdate:modelValue":s[0]||(s[0]=e=>this.ipAddress=e),onKeyup:s[1]||(s[1]=v(e=>this.execute(),["enter"])),type:"text"},null,40,V),[[f,this.ipAddress]])]),t("button",{class:"btn btn-primary rounded-3 mt-3 position-relative",disabled:this.tracing||!this.ipAddress,onClick:s[2]||(s[2]=e=>this.execute())},[n(c,{name:"slide"},{default:r(()=>[this.tracing?(a(),o("span",z,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)]))):(a(),o("span",O,s[3]||(s[3]=[t("i",{class:"bi bi-person-walking me-2"},null,-1),x("Trace! ")])))]),_:1})],8,N)]),t("div",B,[n(c,{name:"ping"},{default:r(()=>[this.tracerouteResult?(a(),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(l,{t:"Hop"})]),t("th",H,[n(l,{t:"IP Address"})]),t("th",K,[n(l,{t:"Average RTT (ms)"})]),t("th",W,[n(l,{t:"Min RTT (ms)"})]),t("th",j,[n(l,{t:"Max RTT (ms)"})]),t("th",U,[n(l,{t:"Geolocation"})])])]),t("tbody",null,[(a(!0),o(u,null,m(this.tracerouteResult,(e,tt)=>(a(),o("tr",null,[t("td",null,[t("small",null,i(e.hop),1)]),t("td",null,[t("small",null,i(e.ip),1)]),t("td",null,[t("small",null,i(e.avg_rtt),1)]),t("td",null,[t("small",null,i(e.min_rtt),1)]),t("td",null,[t("small",null,i(e.max_rtt),1)]),t("td",null,[e.geo.city&&e.geo.country?(a(),o("span",q,[t("small",null,i(e.geo.city)+", "+i(e.geo.country),1)])):A("",!0)])]))),256))])])])])):(a(),o("div",I,[s[5]||(s[5]=t("div",{class:"pingPlaceholder bg-body-secondary rounded-3 mb-3",style:{height:"300px !important"}},null,-1)),(a(),o(u,null,m(5,e=>t("div",{class:T(["pingPlaceholder bg-body-secondary rounded-3 mb-3",{"animate__animated animate__flash animate__slower animate__infinite":this.tracing}]),style:k({"animation-delay":`${e*.05}s`})},null,6)),64))]))]),_:1})])])])}const ot=h(M,[["render",J],["__scopeId","data-v-549eb223"]]);export{ot 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-glbWjskj.js"></script>
<script type="module" crossorigin src="/static/app/dist/assets/index-DeLT-ag4.js"></script>
<link rel="stylesheet" crossorigin href="/static/app/dist/assets/index-D2eeEsuX.css">
</head>
<body>

View File

@ -1,6 +1,6 @@
{
"name": "app",
"version": "4.1.0",
"version": "4.1.1",
"private": true,
"type": "module",
"scripts": {

View File

@ -146,9 +146,7 @@ export default {
id="bullAdd_PresharedKey_Switch" checked>
<label class="form-check-label" for="bullAdd_PresharedKey_Switch">
<small class="fw-bold">
<LocaleText t="Pre-Shared Key"></LocaleText>
<LocaleText t="Enabled" v-if="this.data.preshared_key_bulkAdd"></LocaleText>
<LocaleText t="Disabled" v-else></LocaleText>
<LocaleText t="Pre-Shared Key"></LocaleText> <LocaleText t="Enabled" v-if="this.data.preshared_key_bulkAdd"></LocaleText><LocaleText t="Disabled" v-else></LocaleText>
</small>
</label>
</div>

View File

@ -14,6 +14,11 @@
"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",
@ -48,5 +53,15 @@
"lang_id": "zh-hk",
"lang_name": "Chinese (Traditional)",
"lang_name_localized": "中文(繁體)"
},
{
"lang_id": "sv-se",
"lang_name": "Swedish",
"lang_name_localized": "Svenska"
},
{
"lang_id": "pl",
"lang_name": "Polish",
"lang_name_localized": "Polski"
}
]

View File

@ -4,7 +4,6 @@
"Password": "Heslo",
"OTP from your authenticator": "Jednorázové heslo (OTP) z vašeho autentizátoru",
"Sign In": "Přihlásit",
"Signing In...": "Přihlašování...",
"Access Remote Server": "Připojit k vzdálenému serveru",
"Server": "Server",
"Click": "Klikněte",
@ -35,7 +34,6 @@
"New Password": "Nové heslo",
"Repeat New Password": "Zopakujte nové heslo",
"Update Password": "Aktualizace hesla",
"Multi-Factor Authentication (MFA)": "Vícefaktorové ověření (MFA)",
"Reset": "Resetovat",
"Setup": "Nastavení",
"API Keys": "API klíče",
@ -45,18 +43,13 @@
"Disabled": "Zakázáno",
"No WGDashboard API Key": "Žádný WGDashboard API klíč",
"Expire At": "Vyprší",
"Are you sure to delete this API key?": "Určitě chcete smazat tento API klíč?",
"Create API Key": "Vytvořit API klíč",
"When should this API Key expire?": "Kdy má tento API klíč vypršet?",
"Never Expire": "Bez expirace",
"Don't think that's a good idea": "To není dobrý nápad",
"Creating...": "Tvořím...",
"Create": "Vytvořit",
"Status": "Stav",
"On": "Zapnuto",
"Off": "Vypnuto",
"Turning On...": "Zapínám...",
"Turning Off...": "Vypínám...",
"Address": "Adresa",
"Listen Port": "Otevřený port",
"Public Key": "Veřejný klíč",
@ -71,7 +64,6 @@
"Peers": "Peers",
"Peer Settings": "Nastavení peers",
"Download All": "Stáhnout vše",
"Search Peers...": "Hledat peers...",
"Display": "Zobrazit",
"Sort By": "Seřadit dle",
"Refresh Interval": "Aktualizační interval",
@ -86,8 +78,6 @@
"All Active Jobs": "Všechny aktivní úkoly",
"Logs": "Logy",
"Private Key": "Soukromý klíč",
"(Required for QR Code and Download)": "(Nutné pro QR kód a stažení)",
"(Required)": "(Povinné)",
"Endpoint Allowed IPs": "Povolené IP adresy koncového bodu",
"DNS": "DNS",
"Optional Settings": "Volitelná nastavení",
@ -105,7 +95,6 @@
"Job": "Úkol",
"Job ID": "ID úkolu",
"Unsaved Job": "Neuložený úkol",
"This peer does not have any job yet.": "Tento peer ještě nemá žádný úkol.",
"if": "pokud",
"is": "je",
"then": "pak",
@ -118,7 +107,6 @@
"Deleting...": "Mažu...",
"Cancel": "Zrušit",
"Save": "Uložit",
"No active job at the moment.": "Žádný úkol v současnosti neprobíhá.",
"Jobs Logs": "Logy úkolů",
"Updated at": "Aktualizováno",
"Refresh": "Aktualizovat",
@ -129,20 +117,13 @@
"Message": "Zpráva",
"Share Peer": "Sdílet peera",
"Currently the peer is not sharing": "Peer momentálně nesdílí",
"Sharing...": "Sdílím...",
"Start Sharing": "Zahájit sdílení",
"Stop Sharing...": "Ukončit sdílení...",
"Stop Sharing": "Ukončit sdílení",
"Access Restricted": "Přístup omezen",
"Restrict Access": "Omezit přístup",
"Restricting...": "Omezuji...",
"Allow Access": "Povolit přístup",
"Allowing Access...": "Povoluji přístup...",
"Download & QR Code is not available due to no private key set for this peer": "Stažení a QR kód nejsou k dispozici, peer nemá nastavený soukromý klíč.",
"Add Peers": "Přidat peery",
"Bulk Add": "Hromadný import",
"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?",
"You can add up to (.*) peers": "Můžete přidat nanejvýš $1 peerů",
"Use your own Private and Public Key": "Použít vlastní soukromý a veřejný klíč",
"Enter IP Address/CIDR": "Zadejte IP adresu/CIDR",
@ -151,7 +132,6 @@
"Pick Available IP": "Vyberte dostupnou IP",
"No available IP containing": "Žádná dostupná IP obsahující",
"Add": "Přidat",
"Adding...": "Přidávám...",
"Failed to check available update": "Nepodařilo se zkontrolovat dostupnost aktualizací",
"Nice to meet you!": "Rádi vás poznáváme!",
"Please fill in the following fields to finish setup": "Prosím, vyplňte následující pole pro dokončení nastavení",
@ -307,5 +287,26 @@
"Deleted ([0-9]{1,}) peer\\(s\\)": "Smazáno $1 peer/-ů",
"Deleted ([0-9]{1,}) peer\\(s\\) successfully. Failed to delete ([0-9]{1,}) peer\\(s\\)": "Smazáno $1 peer/-ů. Nezdařilo se smazat $2 peer/-ů",
"Restricted ([0-9]{1,}) peer\\(s\\)": "Omezeno $1 peer/-ů",
"Restricted ([0-9]{1,}) peer\\(s\\) successfully. Failed to restrict ([0-9]{1,}) peer\\(s\\)": "Omezeno $1 peer/-ů. Nezdařilo se omezit $2 peer/-ů"
"Restricted ([0-9]{1,}) peer\\(s\\) successfully. Failed to restrict ([0-9]{1,}) peer\\(s\\)": "Omezeno $1 peer/-ů. Nezdařilo se omezit $2 peer/-ů",
"Signing In\\.\\.\\.": "Přihlašování...",
"Multi-Factor Authentication \\(MFA\\)": "Vícefaktorové ověření (MFA)",
"Are you sure to delete this API key\\?": "Určitě chcete smazat tento API klíč?",
"When should this API Key expire\\?": "Kdy má tento API klíč vypršet?",
"Creating\\.\\.\\.": "Tvořím...",
"Turning On\\.\\.\\.": "Zapínám...",
"Turning Off\\.\\.\\.": "Vypínám...",
"Search Peers\\.\\.\\.": "Hledat peers...",
"\\(Required for QR Code and Download\\)": "(Nutné pro QR kód a stažení)",
"\\(Required\\)": "(Povinné)",
"This peer does not have any job yet\\.": "Tento peer ještě nemá žádný úkol.",
"No active job at the moment\\.": "Žádný úkol v současnosti neprobíhá.",
"Sharing\\.\\.\\.": "Sdílím...",
"Stop Sharing\\.\\.\\.": "Ukončit sdílení...",
"Restricting\\.\\.\\.": "Omezuji...",
"Allowing Access\\.\\.\\.": "Povoluji přístup...",
"Download \\& QR Code is not available due to no private key set for this peer": "Stažení a QR kód nejsou k dispozici, peer nemá nastavený soukromý klíč.",
"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": ""
}

View File

@ -4,7 +4,6 @@
"Password": "Passwort",
"OTP from your authenticator": "OTP von deinem Authentifikator",
"Sign In": "Anmelden",
"Signing In...": "Anmeldung...",
"Access Remote Server": "Zugriff auf Remote-Server",
"Server": "Server",
"Click": "Klicken",
@ -35,7 +34,6 @@
"New Password": "Neues Passwort",
"Repeat New Password": "Neues Passwort wiederholen",
"Update Password": "Passwort aktualisieren",
"Multi-Factor Authentication (MFA)": "Multi-Faktor-Authentifizierung (MFA)",
"Reset": "Zurücksetzen",
"Setup": "Einrichten",
"API Keys": "API-Schlüssel",
@ -45,18 +43,13 @@
"Disabled": "Deaktiviert",
"No WGDashboard API Key": "Kein WGDashboard API-Schlüssel",
"Expire At": "Ablaufdatum",
"Are you sure to delete this API key?": "Bist du sicher, dass du diesen API-Schlüssel löschen möchtest?",
"Create API Key": "API-Schlüssel erstellen",
"When should this API Key expire?": "Wann soll dieser API-Schlüssel ablaufen?",
"Never Expire": "Kein Ablaufdatum",
"Don't think that's a good idea": "Das ist wohl keine gute Idee",
"Creating...": "Erstelle...",
"Create": "Erstellen",
"Status": "Status",
"On": "An",
"Off": "Aus",
"Turning On...": "Schalte ein...",
"Turning Off...": "Schalte aus...",
"Address": "Adresse",
"Listen Port": "Empfangsport",
"Public Key": "Öffentlicher Schlüssel",
@ -71,7 +64,6 @@
"Peers": "Peers",
"Peer Settings": "Peers Einstellungen",
"Download All": "Alle herunterladen",
"Search Peers...": "Suche Peers...",
"Display": "Anzeigen",
"Sort By": "Sortieren nach",
"Refresh Interval": "Aktualisierungsintervall",
@ -86,8 +78,6 @@
"All Active Jobs": "Alle aktiven Aufgaben",
"Logs": "Protokolle",
"Private Key": "Privater Schlüssel",
"(Required for QR Code and Download)": "(Erforderlich für QR-Code und Download)",
"(Required)": "(Erforderlich)",
"Endpoint Allowed IPs": "Erlaubte IPs für Endpunkt",
"DNS": "DNS",
"Optional Settings": "Optionale Einstellungen",
@ -105,7 +95,6 @@
"Job": "Aufgabe",
"Job ID": "Aufgaben-ID",
"Unsaved Job": "Nicht gespeicherte Aufgabe",
"This peer does not have any job yet.": "Dieser Peer hat noch keine Aufgabe.",
"if": "wenn",
"is": "ist",
"then": "dann",
@ -118,7 +107,6 @@
"Deleting...": "Lösche...",
"Cancel": "Abbrechen",
"Save": "Speichern",
"No active job at the moment.": "Zurzeit keine aktive Aufgabe.",
"Jobs Logs": "Aufgabenprotokolle",
"Updated at": "Aktualisiert am",
"Refresh": "Aktualisieren",
@ -129,20 +117,13 @@
"Message": "Nachricht",
"Share Peer": "Peer teilen",
"Currently the peer is not sharing": "Der Peer wird derzeit nicht freigegeben",
"Sharing...": "Teile...",
"Start Sharing": "Teilen starten",
"Stop Sharing...": "Teilen beenden...",
"Stop Sharing": "Teilen beenden",
"Access Restricted": "Zugriff eingeschränkt",
"Restrict Access": "Zugriff einschränken",
"Restricting...": "Einschränken...",
"Allow Access": "Zugriff erlauben",
"Allowing Access...": "Erlaube Zugriff...",
"Download & QR Code is not available due to no private key set for this peer": "Download & QR-Code sind nicht verfügbar, da kein privater Schlüssel für diesen Peer festgelegt wurde",
"Add Peers": "Peers hinzufügen",
"Bulk Add": "Massenerstellung",
"By adding peers by bulk, each peer's name will be auto generated, and Allowed IP will be assign to the next available IP.": "Bei der Massenerstellung wird der Name jedes Peers automatisch generiert, und die erlaubte IP wird der nächsten verfügbaren IP zugewiesen.",
"How many peers you want to add?": "Wie viele Peers möchtest du hinzufügen?",
"You can add up to (.*) peers": "Du kannst bis zu $1 Peers hinzufügen",
"Use your own Private and Public Key": "Verwende deinen eigenen privaten und öffentlichen Schlüssel",
"Enter IP Address/CIDR": "Gib IP-Adresse/CIDR ein",
@ -151,7 +132,6 @@
"Pick Available IP": "Verfügbare IP auswählen",
"No available IP containing": "Keine verfügbare IP enthält",
"Add": "Hinzufügen",
"Adding...": "Füge hinzu...",
"Failed to check available update": "Überprüfung auf verfügbares Update fehlgeschlagen",
"Nice to meet you!": "Schön, dich kennenzulernen!",
"Please fill in the following fields to finish setup": "Bitte fülle die folgenden Felder aus, um die Einrichtung abzuschließen",
@ -237,75 +217,96 @@
"Enter IP Address / Hostname": "IP-Adresse/Hostnamen eingeben",
"IP Address / Hostname": "IP-Adresse/Hostnamen",
"Count": "Zählen",
"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": "",
"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?": "",
"Yes": "",
"No": "",
"Backup not selected": "",
"Confirm \\& edit restore information": "",
"(.*) Available IP Address": "",
"Database File": "",
"Contain": "",
"Restricted Peers?": "",
"Restore": "",
"Restoring": "",
"WGDashboard Settings": "",
"Peers Settings": "",
"WireGuard Configuration Settings": "",
"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": "",
"Checking backups...": "",
"This configuration have ([0-9].*) backups": "",
"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?": "",
"Downloading": "",
"Download Finished": "",
"Done": "",
"Are you sure to delete": "",
"Are you sure to delete this peer\\?": "",
"Configuration deleted": "",
"Configuration saved": "",
"WGDashboard language update failed": "",
"Configuration restored": "",
"Allowed IP already taken by another peer": "",
"Failed to allow access of peer (.*)": "",
"Failed to save configuration through WireGuard": "",
"Allow access successfully": "",
"Deleted ([0-9]{1,}) peer\\(s\\)": "",
"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\\)": ""
"Geolocation": "Geostandort",
"Is Alive": "Ist erreichbar",
"Average / Min / Max Round Trip Time": "Durchschnittliche / Minimale / Maximale Antwortzeit",
"Sent / Received / Lost Package": "Gesendete / Empfangene / Verlorene Pakete",
"Manual restart of WGDashboard is needed to apply changes on IP Address and Listen Port": "Manueller Neustart des WGDashboards erforderlich, um Änderungen an der IP-Adresse und dem Listen-Port anzuwenden",
"Restore Configuration": "Konfiguration wiederherstellen",
"Step (.*)": "Schritt $1",
"Select a backup you want to restore": "Wählen Sie ein Backup aus, das Sie wiederherstellen möchten",
"Click to change a backup": "Klicken, um ein Backup zu ändern",
"Selected Backup": "Ausgewähltes Backup",
"You don't have any configuration to restore": "Es gibt keine Konfiguration, die wiederhergestellt werden kann",
"Help": "Hilfe",
"Backup": "Backup",
"([0-9].*) Backups?": "$1 Backups",
"Yes": "Ja",
"No": "Nein",
"Backup not selected": "Kein Backup ausgewählt",
"Confirm \\& edit restore information": "Wiederherstellungsinformationen bestätigen & bearbeiten",
"(.*) Available IP Address": "$1 verfügbare IP-Adresse",
"Database File": "Datenbankdatei",
"Contain": "Enthält",
"Restricted Peers?": "Eingeschränkte Peers?",
"Restore": "Wiederherstellen",
"Restoring": "Wiederherstellung läuft",
"WGDashboard Settings": "WGDashboard-Einstellungen",
"Peers Settings": "Peer-Einstellungen",
"WireGuard Configuration Settings": "WireGuard-Konfigurationseinstellungen",
"Appearance": "Aussehen",
"Theme": "Design",
"Language": "Sprache",
"Account Settings": "Kontoeinstellungen",
"Peer Default Settings": "Standard-Peer-Einstellungen",
"Toggle When Start Up": "Beim Start umschalten",
"Other Settings": "Weitere Einstellungen",
"Select Peers": "Peers auswählen",
"Backup & Restore": "Backup & Wiederherstellung",
"Delete Configuration": "Konfiguration löschen",
"Create Backup": "Backup erstellen",
"No backup yet, click the button above to create backup\\.": "Noch kein Backup vorhanden. Klicken Sie oben auf die Schaltfläche, um ein Backup zu erstellen.",
"Are you sure to delete this backup\\?": "Sind Sie sicher, dass Sie dieses Backup löschen möchten?",
"Backup Date": "Backup-Datum",
"File": "Datei",
"Are you sure to delete this configuration\\?": "Sind Sie sicher, dass Sie diese Konfiguration löschen möchten?",
"Once you deleted this configuration\\:": "Wenn Sie diese Konfiguration löschen:",
"All connected peers will get disconnected": "Alle verbundenen Peers werden getrennt",
"Both configuration file \\(\\.conf\\) and database table related to this configuration will get deleted": "Sowohl die Konfigurationsdatei (.conf) als auch die zugehörige Datenbanktabelle werden gelöscht",
"Checking backups...": "Backups werden überprüft...",
"This configuration have ([0-9].*) backups": "Diese Konfiguration hat $1 Backups",
"This configuration have no backup": "Diese Konfiguration hat kein Backup",
"If you're sure, please type in the configuration name below and click Delete": "Wenn Sie sicher sind, geben Sie unten den Namen der Konfiguration ein und klicken Sie auf Löschen",
"Select All": "Alle auswählen",
"Clear Selection": "Auswahl löschen",
"([0-9].*) Peers?": "$1 Peers?",
"Downloading": "Herunterladen",
"Download Finished": "Download abgeschlossen",
"Done": "Fertig",
"Are you sure to delete": "Sind Sie sicher, dass Sie löschen möchten",
"Are you sure to delete this peer\\?": "Sind Sie sicher, dass Sie diesen Peer löschen möchten?",
"Configuration deleted": "Konfiguration gelöscht",
"Configuration saved": "Konfiguration gespeichert",
"WGDashboard language update failed": "WGDashboard-Sprachaktualisierung fehlgeschlagen",
"Configuration restored": "Konfiguration wiederhergestellt",
"Allowed IP already taken by another peer": "Zugelassene IP bereits von einem anderen Peer belegt",
"Failed to allow access of peer (.*)": "Fehler beim Zulassen des Zugriffs für Peer $1",
"Failed to save configuration through WireGuard": "Fehler beim Speichern der Konfiguration über WireGuard",
"Allow access successfully": "Zugriff erfolgreich erlaubt",
"Deleted ([0-9]{1,}) peer\\(s\\)": "$1 Peer(s) gelöscht",
"Deleted ([0-9]{1,}) peer\\(s\\) successfully. Failed to delete ([0-9]{1,}) peer\\(s\\)": "$1 Peer(s) erfolgreich gelöscht. Fehler beim Löschen von $2 Peer(s)",
"Restricted ([0-9]{1,}) peer\\(s\\)": "$1 Peer(s) eingeschränkt",
"Restricted ([0-9]{1,}) peer\\(s\\) successfully. Failed to restrict ([0-9]{1,}) peer\\(s\\)": "$1 Peer(s) erfolgreich eingeschränkt. Fehler beim Einschränken von $2 Peer(s)",
"Signing In\\.\\.\\.": "Anmeldung...",
"Multi-Factor Authentication \\(MFA\\)": "Multi-Faktor-Authentifizierung (MFA)",
"Are you sure to delete this API key\\?": "Bist du sicher, dass du diesen API-Schlüssel löschen möchtest?",
"When should this API Key expire\\?": "Wann soll dieser API-Schlüssel ablaufen?",
"Creating\\.\\.\\.": "Erstelle...",
"Turning On\\.\\.\\.": "Schalte ein...",
"Turning Off\\.\\.\\.": "Schalte aus...",
"Search Peers\\.\\.\\.": "Suche Peers...",
"\\(Required for QR Code and Download\\)": "(Erforderlich für QR-Code und Download)",
"\\(Required\\)": "(Erforderlich)",
"This peer does not have any job yet\\.": "Dieser Peer hat noch keine Aufgabe.",
"No active job at the moment\\.": "Zurzeit keine aktive Aufgabe.",
"Sharing\\.\\.\\.": "Teile...",
"Stop Sharing\\.\\.\\.": "Teilen beenden...",
"Restricting\\.\\.\\.": "Einschränken...",
"Allowing Access\\.\\.\\.": "Erlaube Zugriff...",
"Download \\& QR Code is not available due to no private key set for this peer": " \"Download & QR Code is not available due to no private key set for this peer\": \"Download & QR-Code sind nicht verfügbar, da kein privater Schlüssel für diesen Peer festgelegt wurde",
"By adding peers by bulk, each peer's name will be auto generated, and Allowed IP will be assign to the next available IP\\.": "Bei der Massenerstellung wird der Name jedes Peers automatisch generiert, und die erlaubte IP wird der nächsten verfügbaren IP zugewiesen.",
"How many peers you want to add\\?": "Wie viele Peers möchtest du hinzufügen?",
"Adding\\.\\.\\.": "Füge hinzu...",
"Dashboard IP Address \\& Listen Port": "",
"Are you sure to restore this backup?\\": "Sind Sie sicher, dass Sie dieses Backup wiederherstellen möchten?"
}

View File

@ -0,0 +1,312 @@
{
"Welcome to": "Bienvenido",
"Username": "Usuario",
"Password": "Contraseña",
"OTP from your authenticator": "OTP de tu autentificador",
"Sign In": "Iniciar sesión",
"Signing In\\.\\.\\.": "Iniciando sesión...",
"Access Remote Server": "Acceder a servidor remoto",
"Server": "Servidor",
"Click": "Click",
"Pinging...": "Ping...",
"to add your server": "para agregar tu servidor",
"Server List": "Lista de Servidores",
"Sorry, your username or password is incorrect.": "Lo siento, tu usuario o contraseña no son correctos.",
"Home": "Home",
"Settings": "Ajustes",
"Tools": "Herramientas",
"Sign Out": "Salir",
"Checking for update...": "Buscando actualizaciones...",
"You're on the latest version": "Estás utilizando la última versión",
"WireGuard Configurations": "Configuraciones de 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.": "Todavía no tienes configuraciones de WireGuard. Por favor, comprueba la carpeta de configuraciones o cámbiala en Ajustes. Por defecto, la carpeta es /etc/wireguard.",
"Configuration": "Configuración",
"Configurations": "Configuraciones",
"Peers Default Settings": "Ajustes por defecto de Peers",
"Dashboard Theme": "Tema del dashboard",
"Light": "Claro",
"Dark": "Oscuro",
"This will be changed globally, and will be apply to all peer's QR code and configuration file.": "Esto se va a cambiar de forma global, y se aplicará a todos los QRs y archivos de configuración de todos los Peers.",
"WireGuard Configurations Settings": "Ajustes de Configuración de Wireguard",
"Configurations Directory": "Carpeta de configuraciones",
"Remember to remove / at the end of your path. e.g /etc/wireguard": "Recuerda eliminar '/' al final de tu directorio. Por ejemplo, '/etc/wireguard'",
"WGDashboard Account Settings": "Ajustes de la cuenta de WGDashboard",
"Current Password": "Contraseña actual",
"New Password": "Nueva contraseña",
"Repeat New Password": "Repite la nueva contraseña",
"Update Password": "Actualizar contraseña",
"Multi-Factor Authentication \\(MFA\\)": "Autentificación de doble factor (MFA)",
"Reset": "Reset",
"Setup": "Setup",
"API Keys": "Clave API",
"API Key": "Clave API",
"Key": "Clave",
"Enabled": "Habilitado",
"Disabled": "Deshabilitado",
"No WGDashboard API Key": "Ninguna clave API WGDashboard",
"Expire At": "Expira en",
"Are you sure to delete this API key\\?": "¿Estás seguro de eliminar esta clave API?",
"Create API Key": "Crear una nueva clave API",
"When should this API Key expire\\?": "¿Cuándo debería expirar esta clave API?",
"Never Expire": "Nunca expira",
"Don't think that's a good idea": "No creo que esta sea una buena idea",
"Creating\\.\\.\\.": "Creando...",
"Create": "Crear",
"Status": "Estado",
"On": "Activo",
"Off": "Inactivo",
"Turning On\\.\\.\\.": "Activando...",
"Turning Off\\.\\.\\.": "Desactivando...",
"Address": "Dirección",
"Listen Port": "Puerto de escucha",
"Public Key": "Clave pública",
"Connected Peers": "Peer conectado",
"Total Usage": "Uso Total",
"Total Received": "Total Recibido",
"Total Sent": "Total Enviado",
"Peers Data Usage": "Uso de datos de Peers",
"Real Time Received Data Usage": "Datos recibidos en tiempo real",
"Real Time Sent Data Usage": "Datos enviados en tiempo real",
"Peer": "Peer",
"Peers": "Peers",
"Peer Settings": "Ajustes de Peers",
"Download All": "Descargar todo",
"Search Peers\\.\\.\\.": "Buscar Peers...",
"Display": "Mostrar",
"Sort By": "Ordenar por",
"Refresh Interval": "Intervalo de refresco",
"Name": "Nombre",
"Allowed IPs": "IPs permitidas",
"Restricted": "Restringido",
"(.*) Seconds": "$1 Segundos/i",
"(.*) Minutes": "$1 Minutos/i",
"Configuration Settings": "Configuración",
"Peer Jobs": "Jobs del Peer",
"Active Jobs": "Jobs Activos",
"All Active Jobs": "Todos los Jobs Activos",
"Logs": "Logs",
"Private Key": "Clave privada",
"\\(Required for QR Code and Download\\)": "(Requerido para el código QR y Descarga)",
"\\(Required\\)": "(Requerido)",
"Endpoint Allowed IPs": "Direcciones IP del endpoint permitidas",
"DNS": "DNS",
"Optional Settings": "Ajustes opcionales",
"Pre-Shared Key": "Clave pre-compartida",
"MTU": "MTU",
"Persistent Keepalive": "Keepalive persistente",
"Reset Data Usage": "Resetear los datos de uso",
"Total": "Total",
"Sent": "Enviado",
"Received": "Recibido",
"Revert": "Revertir",
"Save Peer": "Guardar el Peer",
"QR Code": "Código QR",
"Schedule Jobs": "Planificar Job",
"Job": "Job",
"Job ID": "ID del Job",
"Unsaved Job": "Job sin guardar",
"This peer does not have any job yet\\.": "Este Peer no tiene jobs todavía.",
"if": "si",
"is": "es",
"then": "entonces",
"larger than": "mayor que",
"Date": "Fecha",
"Restrict Peer": "Limitar el Peer",
"Delete Peer": "Eliminar el Peer",
"Edit": "Modificar",
"Delete": "Eliminar",
"Deleting...": "Eliminando...",
"Cancel": "Cancelar",
"Save": "Guardar",
"No active job at the moment\\.": "No hay jobs activos en este momento.",
"Jobs Logs": "Logs del Job",
"Updated at": "Actualizado el",
"Refresh": "Refrescar",
"Filter": "Filtrar",
"Success": "Éxito",
"Failed": "Fallido",
"Log ID": "ID del log",
"Message": "Mensaje",
"Share Peer": "Compartir Peer",
"Currently the peer is not sharing": "Actualmente el Peer no está compartiendo",
"Sharing\\.\\.\\.": "Compartiendo...",
"Start Sharing": "Empezar intercambio",
"Stop Sharing\\.\\.\\.": "Interrumpir intercambio...",
"Stop Sharing": "Interrumpir intercambio",
"Access Restricted": "Accesso Restringido",
"Restrict Access": "Restringir Acceso",
"Restricting\\.\\.\\.": "Restringiendo...",
"Allow Access": "Habilitar Acceso",
"Allowing Access\\.\\.\\.": "Habilitando el acceso...",
"Download \\& QR Code is not available due to no private key set for this peer": "La descarga y el código QR no están disponibles porque no se ha configurado una clave privada para este peer",
"Add Peers": "Agregar un Peer",
"Bulk Add": "Agregar múltiple",
"By adding peers by bulk, each peer's name will be auto generated, and Allowed IP will be assign to the next available IP\\.": "Agregando Peers de forma múltiple, los nombres de los peers se generarán de forma automática, y la IP permitida se asignará en función de la siguiente IP disponible.",
"How many peers you want to add\\?": "¿Cuántos peers quieres añadir?",
"You can add up to (.*) peers": "Puedes añadir hasta $1 peers",
"Use your own Private and Public Key": "Usa tu propia clave pública y privada",
"Enter IP Address/CIDR": "ntroduce la dirección IP/CIDR",
"IP Address/CIDR": "Dirección IP/CIDR",
"or": "o",
"Pick Available IP": "Selecciona una IP disponible",
"No available IP containing": "Ninguna IP disponible que contenga",
"Add": "añadir",
"Adding\\.\\.\\.": "Añadiendo...",
"Failed to check available update": "Error al buscar actualizaciones disponibles",
"Nice to meet you!": "Encantado de conocerte",
"Please fill in the following fields to finish setup": "Por favor rellena los siguientes campos para finalizar el setup",
"Create an account": "Crea una cuenta",
"Enter an username you like": "Introduce un nombre de usuario",
"Enter a password": "Introduce una contraseña",
"\\(At least 8 characters and make sure is strong enough!\\)": "(Al menos 8 caracteres y asegúrate de que sea suficientemente fuerte)",
"Confirm password": "Confirma la contraseña",
"Next": "Siguiente",
"Saving\\.\\.\\.": "Guardando...",
"1\\. Please scan the following QR Code to generate TOTP with your choice of authenticator": "1. Por favor escanea el siguiente código QR para generar un código TOTP con el autentificador que prefieras",
"Or you can click the link below:": "O puedes hacer click en el siguiente enlace:",
"2\\. Enter the TOTP generated by your authenticator to verify": "2. Inserta el código TOTP generado por tu autentificador para verificar",
"TOTP verified!": "¡TOTP Verificado!",
"I don't need MFA": "No necesito MFA",
"Complete": "Completado",
"(v[0-9.]{1,}) is now available for update!": "$1 está disponible para actualizar!",
"Current Version:": "Versión actual:",
"Oh no\\.\\.\\. This link is either expired or invalid\\.": "Oh no... Este link ha expirado o es inválido.",
"Scan QR Code with the WireGuard App to add peer": "Escanea el código QR con la App Wireguard para añadir el peer",
"or click the button below to download the ": "o haz click en el botón de abajo para descargar el ",
" file": " archivo",
"FROM ": "DE ",
"(.*) is on": "$1 está activo",
"(.*) is off": "$1 está desactivado",
"Allowed IPs is invalid": "Las IPs Permitidas son inválidas",
"Peer created successfully": "Peer creado con éxito",
"Please fill in all required box": "Por favor, rellena las casillas requeridas",
"Please specify amount of peers you want to add": "Por favor, especifica la cantidad de peers que quieres añadir",
"No more available IP can assign": "No hay más IPs disponibles que asignar",
"The maximum number of peers can add is (.*)": "El número máximo de peers que se pueden añadir es $1",
"Generating key pairs by bulk failed": "Generación de key pairs por Añadir Múltiples falló",
"Failed to add peers in bulk": "Error al añadir múltiples peers",
"This peer already exist": "Este peer ya existe",
"This IP is not available: (.*)": "Esta IP no está disponible: $1",
"Configuration does not exist": "La configuración no existe",
"Peer does not exist": "El peer no existe",
"Please provide a valid configuration name": "Por favor, introduce un nombre de configuración válido",
"Peer saved": "Peer guardado",
"Allowed IPs already taken by another peer": "IPs disponibles ya han sido seleccionadas por otro peer",
"Endpoint Allowed IPs format is incorrect": "El formato de las IPs disponibles no es correcto",
"DNS format is incorrect": "El formato del DNS no es correcto",
"MTU format is not correct": "El formato del MTU no es correcto",
"Persistent Keepalive format is not correct": "El formato de Keepalive persistente no es correcto",
"Private key does not match with the public key": "La clave privada no corresponde con la clave pública",
"Update peer failed when updating Pre-Shared Key": "Actualización del peer falló cuando se actualizó la clave pre-compartida",
"Update peer failed when updating Allowed IPs": "Actualización del peer falló cuando se actualizó las IPs Permitidas",
"Update peer failed when saving the configuration": "Actualización del peer falló cuando se guardaba la configuración",
"Peer data usage reset successfully": "Los datos del uso del peer se restablecieron con éxito",
"Peer download started": "Descarga del peer comenzada",
"Please specify one or more peers": "Por favor, especifica uno o más peers",
"Share link failed to create. Reason: (.*)": "Creación del link para compartir fallida. Motivo: $1",
"Link expire date updated": "Actualizada la fecha de expiración del link",
"Link expire date failed to update. Reason: (.*)": "Actualización de la fecha de expiración fallida. Motivo: $1",
"Peer job saved": "Job del Peer guardado",
"Please specify job": "Por favor, especifica un job",
"Please specify peer and configuration": "Por favor, especifica peer y configuración",
"Peer job deleted": "Job del Peer eliminado",
"API Keys function is successfully enabled": "La funcionalidad de clave API se ha habilitado con éxito",
"API Keys function is successfully disabled": "La funcionalidad de clave API se ha deshabilitado con éxito",
"API Keys function is failed to enable": "La funcionalidad de clave API no se ha habilitado",
"API Keys function is failed to disable": "La funcionalidad de clave API no se ha habilitado",
"WGDashboard API Keys function is disabled": "La funcionalidad de clave API de WGDashboard está deshabilitada",
"WireGuard configuration path saved": "Guardado el destino de la configuración de Wireguard",
"API Key deleted": "Clave API eliminada",
"API Key created": "Clave API creada",
"Sign in session ended, please sign in again": "La sesión actual ha caducado, por favor, accede de nuevo",
"Please specify an IP Address (v4/v6)": "Por favor, especificado dirección IP (v4/v6)",
"Please provide ipAddress and count": "Por favor, especifica dirección IP y cuenta",
"Please provide ipAddress": "Por favor, especifica dirección IP",
"Dashboard Language": "Idioma del Dashboard",
"Dashboard language update failed": "Imposible actualizar el idioma del Dashboard",
"Peer Remote Endpoint": "Endpoint remoto del Peer",
"New Configuration": "Nueva configuración",
"Configuration Name": "Nombre de la configuración",
"Configuration name is invalid. Possible reasons:": "El nombre de la configuración es inválido. Motivo:",
"Configuration name already exist\\.": "El nombre de la configuración ya existe.",
"Configuration name can only contain 15 lower/uppercase alphabet, numbers, underscore, equal sign, plus sign, period and hyphen\\.": "El nombre de la configuración solo puede contener 15 letras mayúsculas o minúsculas, números, barrabaja, símbolos de igual, suma, puntos y guiones.",
"Invalid Port": "Puerto inválido",
"Save Configuration": "Guardar la configuración",
"IP Address/CIDR is invalid": "La IP/CIDR no es válida",
"IP Address": "Dirección IP",
"Enter IP Address / Hostname": "Introduce una dirección IP / Hostname",
"IP Address / Hostname": "Dirección IP / Hostname",
"Dashboard IP Address \\& Listen Port": "Dirección IP del dashboard y puerto",
"Count": "Cuenta",
"Geolocation": "Geolocalización",
"Is Alive": "Está Activo",
"Average / Min / Max Round Trip Time": "Media / Min / Max Redondeo Viaje Tiempo",
"Sent / Received / Lost Package": "Enviado / Recibido / Paquetes perdidos",
"Manual restart of WGDashboard is needed to apply changes on IP Address and Listen Port": "Un reset manual de WGDashboard es necesario para aplicar los cambios en la dirección IP y el puerto",
"Restore Configuration": "Restablecer configuración",
"Step (.*)": "Paso $1",
"Select a backup you want to restore": "Selecciona el backup que quieres restaurar",
"Click to change a backup": "click para cambiar el backup",
"Selected Backup": "Backup seleccionado",
"You don't have any configuration to restore": "No tienes ninguna configuración que restaurar",
"Help": "Ayuda",
"Backup": "Backup",
"([0-9].*) Backups?": "$1 Backups?",
"Yes": "Sí",
"No": "No",
"Backup not selected": "Backup no seleccionado",
"Confirm \\& edit restore information": "Confirmar y editar la información de restauración",
"(.*) Available IP Address": "$1 Dirección IP disponible",
"Database File": "Fichero de base de datos",
"Contain": "Contiene",
"Restricted Peers?": "¿Peers restringidos?",
"Restore": "Restaurar",
"Restoring": "Restaurando",
"WGDashboard Settings": "Ajustes de WGDashboard",
"Peers Settings": "Ajustes de Peers",
"WireGuard Configuration Settings": "Ajustes de Configuraciones de Wireguard",
"Appearance": "apariencia",
"Theme": "Tema",
"Language": "Idioma",
"Account Settings": "Ajustes de la cuenta",
"Peer Default Settings": "Ajustes por defecto del peer",
"Toggle When Start Up": "Activar en Start Up",
"Other Settings": "Otros ajustes",
"Select Peers": "Seleccionar peers",
"Backup & Restore": "Backups y Restaurar",
"Delete Configuration": "Eliminar Configuración",
"Create Backup": "Crear Backup",
"No backup yet, click the button above to create backup\\.": "No hay backups todavía, presiona el botón de arriba para crear un backup.",
"Are you sure to delete this backup\\?": "¿Estás seguro de que quieres borrar este backup?",
"Are you sure to restore this backup?\\": "¿Estás seguro de que quieres restaurar este backup?",
"Backup Date": "Fecha del backup",
"File": "Archivo",
"Are you sure to delete this configuration\\?": "¿Estás seguro de eliminar esta configuración?",
"Once you deleted this configuration\\:": "Una vez eliminada esta configuración:",
"All connected peers will get disconnected": "Todos los peers conectados se desconectarán",
"Both configuration file \\(\\.conf\\) and database table related to this configuration will get deleted": "Ambos ficheros de configuración (.conf) y de la tabla de la base de datos relacionados con esta configuración serán eliminados",
"Checking backups...": "Comprobando backups...",
"This configuration have ([0-9].*) backups": "Esta configuración tiene $1 backups",
"This configuration have no backup": "Esta configuración no tiene backups",
"If you're sure, please type in the configuration name below and click Delete": "Si estás seguro, introduce el nombre de la configuración y presiona eliminar",
"Select All": "Seleccionar todo",
"Clear Selection": "Deseleccionar",
"([0-9].*) Peers?": "¿$1 Peers?",
"Downloading": "Descargando",
"Download Finished": "Descarga finalizada",
"Done": "Hecho",
"Are you sure to delete": "¿Estás seguro de eliminar?",
"Are you sure to delete this peer\\?": "¿Estás seguro de eliminar este peer?",
"Configuration deleted": "Configuración eliminada",
"Configuration saved": "Configuración guardada",
"WGDashboard language update failed": "La actualización de idioma de WGDashboard falló",
"Configuration restored": "Configuración restaurada",
"Allowed IP already taken by another peer": "IP Permitida ya ha sido seleccionada por otro peer",
"Failed to allow access of peer (.*)": "Fallo de habilitar acceso del peer $1",
"Failed to save configuration through WireGuard": "Fallo de salvar configuración a través de WireGuard",
"Allow access successfully": "Acceso permitido con éxito",
"Deleted ([0-9]{1,}) peer\\(s\\)": "Eliminados $1 peer(s)",
"Deleted ([0-9]{1,}) peer\\(s\\) successfully. Failed to delete ([0-9]{1,}) peer\\(s\\)": "Eliminados $1 peer(s) con éxito. Fallo al eliminar $2 peer(s)",
"Restricted ([0-9]{1,}) peer\\(s\\)": "Restringidos $1 peer(s)",
"Restricted ([0-9]{1,}) peer\\(s\\) successfully. Failed to restrict ([0-9]{1,}) peer\\(s\\)": "Restringidos $1 peer(s) con éxito. Fallo al restringir $2 peer(s)"
}

View File

@ -233,8 +233,8 @@
"Invalid Port": "Porta non valida",
"Save Configuration": "Salva la configurazione",
"IP Address/CIDR is invalid": "L'indirizzo IP/CIDR non è valido",
"IP Address": "",
"Enter IP Address / Hostname": "",
"IP Address": "Indirizzo IP",
"Enter IP Address / Hostname": "Inserisici l'indirizzo IP/CIDR",
"IP Address / Hostname": "",
"Dashboard IP Address \\& Listen Port": "",
"Count": "",

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.": "",
"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": "",
"Configurations Directory": "",
"Remember to remove / at the end of your path. e.g /etc/wireguard": "",
"WGDashboard Account Settings": "",
"Current Password": "",
"New Password": "",
"Repeat New Password": "",
"Update Password": "",
"Multi-Factor Authentication \\(MFA\\)": "",
"Reset": "",
"Setup": "",
"API Keys": "",
"API Key": "",
"Key": "",
"Enabled": "",
"Disabled": "",
"No WGDashboard API Key": "",
"Expire At": "",
"Are you sure to delete this API key\\?": "",
"Create API Key": "",
"When should this API Key expire\\?": "",
"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": "",
"Restricted": "",
"(.*) Seconds": "",
"(.*) Minutes": "",
"Configuration Settings": "",
"Peer Jobs": "",
"Active Jobs": "",
"All Active Jobs": "",
"Logs": "",
"Private Key": "",
"\\(Required for QR Code and Download\\)": "",
"\\(Required\\)": "",
"Endpoint Allowed IPs": "",
"DNS": "",
"Optional Settings": "",
"Pre-Shared Key": "",
"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\\.": "",
"How many peers you want to add\\?": "",
"You can add up to (.*) peers": "",
"Use your own Private and Public Key": "",
"Enter IP Address/CIDR": "",
"IP Address/CIDR": "",
"or": "",
"Pick Available IP": "",
"No available IP containing": "",
"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": "",
"Or you can click the link below:": "",
"2\\. Enter the TOTP generated by your authenticator to verify": "",
"TOTP verified!": "",
"I don't need MFA": "",
"Complete": "",
"(v[0-9.]{1,}) is now available for update!": "",
"Current Version:": "",
"Oh no\\.\\.\\. This link is either expired or invalid\\.": "",
"Scan QR Code with the WireGuard App to add peer": "",
"or click the button below to download the ": "",
" file": "",
"FROM ": "",
"(.*) is on": "",
"(.*) is off": "",
"Allowed IPs is invalid": "",
"Peer created successfully": "",
"Please fill in all required box": "",
"Please specify amount of peers you want to add": "",
"No more available IP can assign": "",
"The maximum number of peers can add is (.*)": "",
"Generating key pairs by bulk failed": "",
"Failed to add peers in bulk": "",
"This peer already exist": "",
"This IP is not available: (.*)": "",
"Configuration does not exist": "",
"Peer does not exist": "",
"Please provide a valid configuration name": "",
"Peer saved": "",
"Allowed IPs already taken by another peer": "",
"Endpoint Allowed IPs format is incorrect": "",
"DNS format is incorrect": "",
"MTU format is not correct": "",
"Persistent Keepalive format is not correct": "",
"Private key does not match with the public key": "",
"Update peer failed when updating Pre-Shared Key": "",
"Update peer failed when updating Allowed IPs": "",
"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: (.*)": "",
"Link expire date updated": "",
"Link expire date failed to update. Reason: (.*)": "",
"Peer job saved": "",
"Please specify job": "",
"Please specify peer and configuration": "",
"Peer job deleted": "",
"API Keys function is successfully enabled": "",
"API Keys function is successfully disabled": "",
"API Keys function is failed to enable": "",
"API Keys function is failed to disable": "",
"WGDashboard API Keys function is disabled": "",
"WireGuard configuration path saved": "",
"API Key deleted": "",
"API Key created": "",
"Sign in session ended, please sign in again": "",
"Please specify an IP Address (v4/v6)": "",
"Please provide ipAddress and count": "",
"Please provide 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\\.": "",
"Invalid Port": "",
"Save Configuration": "",
"IP Address/CIDR is invalid": "",
"IP Address": "",
"Enter IP Address / Hostname": "",
"IP Address / Hostname": "",
"Dashboard IP Address \\& Listen Port": "",
"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": "",
"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?": "",
"Yes": "",
"No": "",
"Backup not selected": "",
"Confirm \\& edit restore information": "",
"(.*) Available IP Address": "",
"Database File": "",
"Contain": "",
"Restricted Peers?": "",
"Restore": "",
"Restoring": "",
"WGDashboard Settings": "",
"Peers Settings": "",
"WireGuard Configuration Settings": "",
"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": "",
"Checking backups...": "",
"This configuration have ([0-9].*) backups": "",
"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?": "",
"Downloading": "",
"Download Finished": "",
"Done": "",
"Are you sure to delete": "",
"Are you sure to delete this peer\\?": "",
"Configuration deleted": "",
"Configuration saved": "",
"WGDashboard language update failed": "",
"Configuration restored": "",
"Allowed IP already taken by another peer": "",
"Failed to allow access of peer (.*)": "",
"Failed to save configuration through WireGuard": "",
"Allow access successfully": "",
"Deleted ([0-9]{1,}) peer\\(s\\)": "",
"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\\)": ""
}

View File

@ -4,7 +4,7 @@
"Password": "Wachtwoord",
"OTP from your authenticator": "OTP van uw authenticator",
"Sign In": "Inloggen",
"Signing In...": "Inloggen...",
"Signing In\\.\\.\\.": "Inloggen...",
"Access Remote Server": "Toegang tot Remote Server",
"Server": "Server",
"Click": "Klik",
@ -35,7 +35,6 @@
"New Password": "Nieuw Wachtwoord",
"Repeat New Password": "Herhaal Nieuw Wachtwoord",
"Update Password": "Wachtwoord bijwerken",
"Multi-Factor Authentication (MFA)": "Multi-Factor Authenticatie (MFA)",
"Reset": "Resetten",
"Setup": "Instellen",
"API Keys": "API-sleutels",
@ -45,18 +44,13 @@
"Disabled": "Uitgeschakeld",
"No WGDashboard API Key": "Geen WGDashboard API-sleutel",
"Expire At": "Vervalt Op",
"Are you sure to delete this API key?": "Weet u zeker dat u deze API-sleutel wilt verwijderen?",
"Create API Key": "API-sleutel maken",
"When should this API Key expire?": "Wanneer moet deze API-sleutel vervallen?",
"Never Expire": "Nooit vervallen",
"Don't think that's a good idea": "Dit is geen goed idee, denk ik",
"Creating...": "Maken...",
"Create": "Maken",
"Status": "Status",
"On": "Aan",
"Off": "Uit",
"Turning On...": "Aanzetten...",
"Turning Off...": "Uitzetten...",
"Address": "Adres",
"Listen Port": "Luisterpoort",
"Public Key": "Publieke Sleutel",
@ -71,7 +65,6 @@
"Peers": "Peers",
"Peer Settings": "Peer Instellingen",
"Download All": "Alles Downloaden",
"Search Peers...": "Zoek Peers...",
"Display": "Weergave",
"Sort By": "Sorteren op",
"Refresh Interval": "Vernieuwingsinterval",
@ -86,8 +79,6 @@
"All Active Jobs": "Alle Actieve Taken",
"Logs": "Logboeken",
"Private Key": "Privé Sleutel",
"(Required for QR Code and Download)": "(Vereist voor QR-code en Download)",
"(Required)": "(Vereist)",
"Endpoint Allowed IPs": "Allowed-IPs voor Eindpunt",
"DNS": "DNS",
"Optional Settings": "Optionele Instellingen",
@ -105,7 +96,6 @@
"Job": "Taak",
"Job ID": "Taak ID",
"Unsaved Job": "Niet Opgeslagen Taak",
"This peer does not have any job yet.": "Deze peer heeft nog geen taak.",
"if": "als",
"is": "is",
"then": "dan",
@ -118,7 +108,6 @@
"Deleting...": "Aan het verwijderen",
"Cancel": "Annuleren",
"Save": "Opslaan",
"No active job at the moment.": "Momenteel geen actieve taak.",
"Jobs Logs": "Taaklogboeken",
"Updated at": "Bijgewerkt op",
"Refresh": "Vernieuwen",
@ -129,20 +118,13 @@
"Message": "Bericht",
"Share Peer": "Deel Peer",
"Currently the peer is not sharing": "De peer deelt momenteel niet",
"Sharing...": "Delen aan het starten...",
"Start Sharing": "Start delen",
"Stop Sharing...": "Delen aan het stoppen...",
"Stop Sharing": "Stop met delen",
"Access Restricted": "Toegang Beperkt",
"Restrict Access": "Beperk toegang",
"Restricting...": "Aan het beperken...",
"Allow Access": "Toegang toestaan",
"Allowing Access...": "Toegang toe aan het staan...",
"Download & QR Code is not available due to no private key set for this peer": "Download & QR-code zijn niet beschikbaar omdat er geen privésleutel voor deze peer is ingesteld",
"Add Peers": "Peers toevoegen",
"Bulk Add": "Bulk toevoegen",
"By adding peers by bulk, each peer's name will be auto generated, and Allowed IP will be assign to the next available IP.": "Bij het bulk toevoegen wordt de naam van elke peer automatisch gegenereerd en wordt de Allowed-IPs aan het volgende beschikbare IP toegewezen.",
"How many peers you want to add?": "Hoeveel peers wil je toevoegen?",
"You can add up to (.*) peers": "Je kunt tot $1 peers toevoegen",
"Use your own Private and Public Key": "Gebruik je eigen Privé- en Publieke Sleutel",
"Enter IP Address/CIDR": "Voer IP-adres/CIDR in",
@ -151,7 +133,6 @@
"Pick Available IP": "Kies beschikbare IP",
"No available IP containing": "Geen beschikbare IP bevat",
"Add": "Toevoegen",
"Adding...": "Toevoegen...",
"Failed to check available update": "Controlen van beschikbare updates mislukt",
"Nice to meet you!": "Leuk je te ontmoeten!",
"Please fill in the following fields to finish setup": "Vul de volgende velden in om de installatie te voltooien",
@ -228,8 +209,6 @@
"New Configuration": "Nieuwe configuratie",
"Configuration Name": "Configuratienaam",
"Configuration name is invalid. Possible reasons:": "Configuratienaam is ongeldig. Mogelijke redenen:",
"Configuration name already exist.": "Configuratienaam bestaat al.",
"Configuration name can only contain 15 lower/uppercase alphabet, numbers, underscore, equal sign, plus sign, period and hyphen.": "De configuratienaam mag alleen uit 15 tekens bestaan, inclusief hoofd-/kleine letters, cijfers, onderstrepingsteken, gelijkteken, plusteken, punt en koppelteken.",
"Invalid Port": "Ongeldige poort",
"Save Configuration": "Configuratie opslaan",
"IP Address/CIDR is invalid": "IP-adres/CIDR is ongeldig",
@ -254,7 +233,6 @@
"Yes": "Ja",
"No": "Nee",
"Backup not selected": "Geen back-up geselecteerd",
"Confirm & edit restore information": "Bevestigen & herstelinformatie bewerken",
"(.*) Available IP Address": "$1 Beschikbaar IP-adres",
"Database File": "Databestand",
"Contain": "Bevat",
@ -275,15 +253,9 @@
"Backup & Restore": "Back-up & Herstellen",
"Delete Configuration": "Configuratie Verwijderen",
"Create Backup": "Maak een Back-up",
"No backup yet, click the button above to create backup.": "Nog geen back-up, klik op de knop hierboven om een back-up te maken.",
"Are you sure to delete this backup?": "Weet je zeker dat je deze back-up wilt verwijderen?",
"Are you sure to restore this backup?": "Weet je zeker dat je deze back-up wilt herstellen?",
"Backup Date": "Back-up Datum",
"File": "Bestand",
"Are you sure to delete this configuration?": "Weet je zeker dat je deze configuratie wilt verwijderen?",
"Once you deleted this configuration:": "Zodra je deze configuratie hebt verwijderd:",
"All connected peers will get disconnected": "Alle verbonden peers worden losgekoppeld",
"Both configuration file (.conf) and database table related to this configuration will get deleted": "Zowel het configuratiebestand (.conf) als de databasetabel die aan deze configuratie is gekoppeld, worden verwijderd",
"Checking backups...": "Back-ups worden gecontroleerd...",
"This configuration have ([0-9].*) backups": "Deze configuratie heeft $1 back-ups",
"This configuration have no backup": "Deze configuratie heeft geen back-up",
@ -295,7 +267,6 @@
"Download Finished": "Download voltooid",
"Done": "Klaar",
"Are you sure to delete": "Weet je zeker dat je wilt verwijderen?",
"Are you sure to delete this peer?": "Weet je zeker dat je deze peer wilt verwijderen?",
"Configuration deleted": "Configuratie verwijderd",
"Configuration saved": "Configuratie opgeslagen",
"WGDashboard language update failed": "Bijwerken van de WGDashboard-taal mislukt",
@ -304,8 +275,38 @@
"Failed to allow access of peer (.*)": "Toegang voor peer $1 niet toegestaan",
"Failed to save configuration through WireGuard": "Configuratie opslaan via WireGuard mislukt",
"Allow access successfully": "Toegang succesvol toegestaan",
"Deleted ([0-9]{1,}) peer(s)": "$1 peer(s) verwijderd",
"Deleted ([0-9]{1,}) peer(s) successfully. Failed to delete ([0-9]{1,}) peer(s)": "$1 peer(s) succesvol verwijderd. Het verwijderen van $2 peer(s) is mislukt",
"Restricted ([0-9]{1,}) peer(s)": "$1 peer(s) beperkt",
"Restricted ([0-9]{1,}) peer(s) successfully. Failed to restrict ([0-9]{1,}) peer(s)": "$1 peer(s) succesvol beperkt. Het beperken van $2 peer(s) is mislukt"
"Multi-Factor Authentication \\(MFA\\)": "Multi-Factor Authenticatie (MFA)",
"Are you sure to delete this API key\\?": "Weet u zeker dat u deze API-sleutel wilt verwijderen?",
"When should this API Key expire\\?": "Wanneer moet deze API-sleutel vervallen?",
"Creating\\.\\.\\.": "Maken",
"Turning On\\.\\.\\.": "Aanzetten...",
"Turning Off\\.\\.\\.": "Uitzetten...",
"Search Peers\\.\\.\\.": "Zoek Peers...",
"\\(Required for QR Code and Download\\)": "(Vereist voor QR-code en Download)",
"\\(Required\\)": "(Vereist)",
"This peer does not have any job yet\\.": "Deze peer heeft nog geen taak.",
"No active job at the moment\\.": "Momenteel geen actieve taak.",
"Sharing\\.\\.\\.": "Delen aan het starten...",
"Stop Sharing\\.\\.\\.": "Delen aan het stoppen...",
"Restricting\\.\\.\\.": "Aan het beperken...",
"Allowing Access\\.\\.\\.": "Toegang toe aan het staan...",
"Download \\& QR Code is not available due to no private key set for this peer": "Download & QR-code zijn niet beschikbaar omdat er geen privésleutel voor deze peer is ingesteld",
"By adding peers by bulk, each peer's name will be auto generated, and Allowed IP will be assign to the next available IP\\.": " \"By adding peers by bulk, each peer's name will be auto generated, and Allowed IP will be assign to the next available IP.\": \"Bij het bulk toevoegen wordt de naam van elke peer automatisch gegenereerd en wordt de Allowed-IPs aan het volgende beschikbare IP toegewezen.",
"How many peers you want to add\\?": "Hoeveel peers wil je toevoegen?",
"Adding\\.\\.\\.": "Toevoegen...",
"Configuration name already exist\\.": "Configuratienaam bestaat al.",
"Configuration name can only contain 15 lower/uppercase alphabet, numbers, underscore, equal sign, plus sign, period and hyphen\\.": "De configuratienaam mag alleen uit 15 tekens bestaan, inclusief hoofd-/kleine letters, cijfers, onderstrepingsteken, gelijkteken, plusteken, punt en koppelteken.",
"Dashboard IP Address \\& Listen Port": "",
"Confirm \\& edit restore information": "Bevestigen & herstelinformatie bewerken",
"No backup yet, click the button above to create backup\\.": "Nog geen back-up, klik op de knop hierboven om een back-up te maken.",
"Are you sure to delete this backup\\?": "Weet je zeker dat je deze back-up wilt verwijderen?",
"Are you sure to restore this backup?\\": "Weet je zeker dat je deze back-up wilt herstellen?",
"Are you sure to delete this configuration\\?": "Weet je zeker dat je deze configuratie wilt verwijderen?",
"Once you deleted this configuration\\:": "Zodra je deze configuratie hebt verwijderd:",
"Both configuration file \\(\\.conf\\) and database table related to this configuration will get deleted": "Zowel het configuratiebestand (.conf) als de databasetabel die aan deze configuratie is gekoppeld, worden verwijderd",
"Are you sure to delete this peer\\?": "Weet je zeker dat je deze peer wilt verwijderen?",
"Deleted ([0-9]{1,}) peer\\(s\\)": "$1 peer(s) verwijderd",
"Deleted ([0-9]{1,}) peer\\(s\\) successfully. Failed to delete ([0-9]{1,}) peer\\(s\\)": "$1 peer(s) succesvol verwijderd. Het verwijderen van $2 peer(s) is mislukt",
"Restricted ([0-9]{1,}) peer\\(s\\)": "$1 peer(s) beperkt",
"Restricted ([0-9]{1,}) peer\\(s\\) successfully. Failed to restrict ([0-9]{1,}) peer\\(s\\)": "$1 peer(s) succesvol beperkt. Het beperken van $2 peer(s) is mislukt"
}

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

@ -0,0 +1,312 @@
{
"Welcome to": "Witamy w",
"Username": "Nazwa Użytkownika",
"Password": "Hasło",
"OTP from your authenticator": "OTP z Twojego Autentykatora",
"Sign In": "Zaloguj",
"Signing In\\.\\.\\.": "Trwa Logowanie...",
"Access Remote Server": "Połącz się ze zdalnym serwerem",
"Server": "Serwer",
"Click": "Kliknij",
"Pinging...": "Pinguje...",
"to add your server": "aby dodać do Twojego serwera",
"Server List": "Lista Serwerów",
"Sorry, your username or password is incorrect.": "Nazwa użytkownika bądź hasło jest niepoprawne.",
"Home": "Strona Główna",
"Settings": "Ustawnienia",
"Tools": "Narzędzia",
"Sign Out": "Wyloguj się",
"Checking for update...": "Sprawdzanie aktualizacji...",
"You're on the latest version": "Korzystasz z najnowszej wersji",
"WireGuard Configurations": "Konfiguracja",
"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.": "Nie posiadasz żadnych konfiguarcji WireGuard. Sprawdź folder konfiguarcji lub zmień go w Ustawieniach. Domyślnie konfiguracje są zapisywane w /etc/wireguard.",
"Configuration": "Konfiguracja",
"Configurations": "Konfiguracje",
"Peers Default Settings": "Domyślne ustawienia Klientów",
"Dashboard Theme": "Styl Panelu",
"Light": "Jasny",
"Dark": "Ciemny",
"This will be changed globally, and will be apply to all peer's QR code and configuration file.": "Te zmiany zostaną wprowadzone globalnie i nadpiszą kody QR i konfiguracje wszystkich Klientów.",
"Manual restart of WGDashboard is needed to apply changes on IP Address and Listen Port": "Aby zapisać zmiany adresów IP lub portu nasłuchiwania wymagany będzie manualny restart WGDashboard.",
"WireGuard Configurations Settings": "Ustawienia Konfiguracji WireGuard",
"Configurations Directory": "Folder Konfiguracji",
"Remember to remove / at the end of your path. e.g /etc/wireguard": "Pamiętaj aby usunąć / na końcu ścieżki, na przykład /etc/wireguard",
"WGDashboard Account Settings": "Ustawienia Konta WGDashboard",
"Current Password": "Aktualne Hasło",
"New Password": "Nowe Hasło",
"Repeat New Password": "Powtórz Nowe Hasło",
"Update Password": "Aktualizuj Hasło",
"Multi-Factor Authentication \\(MFA\\)": "Weryfikacja Wieloskładnikowa (MFA)",
"Reset": "Reset",
"Setup": "Ustawienia",
"API Keys": "Klucze API",
"API Key": "Klucz API",
"Key": "Klucz",
"Enabled": "Włączone",
"Disabled": "Wyłączone",
"No WGDashboard API Key": "Brak Klucza API WGDashboard",
"Expire At": "Termin Ważności",
"Are you sure to delete this API key\\?": "Czy na pewno chcesz usunąć ten klucz API?",
"Create API Key": "Stwórz klucz API",
"When should this API Key expire\\?": "Kiedy ten klucz API powinien utracić swoją ważność?",
"Never Expire": "Nigdy",
"Don't think that's a good idea": "To nie jest dobry pomysł...",
"Creating\\.\\.\\.": "Tworzenie...",
"Create": "Stwórz",
"Status": "Status",
"On": "Wł.",
"Off": "Wył.",
"Turning On\\.\\.\\.": "Włączam...",
"Turning Off\\.\\.\\.": "Wyłączam...",
"Address": "Adres",
"Listen Port": "Port Nasłuchu",
"Public Key": "Klucz publiczny",
"Connected Peers": "Połączeni Klienci",
"Total Usage": "Łączne Użycie",
"Total Received": "Łącznie Odebrano",
"Total Sent": "Łącznie Wysłano",
"Peers Data Usage": "Użycie danych przez Klientów",
"Real Time Received Data Usage": "Aktualnie Odbierane Dane",
"Real Time Sent Data Usage": "Aktualnie Wysyłane Dane",
"Peer": "Klient",
"Peers": "Klienci",
"Peer Settings": "Ustawienia Klientów",
"Download All": "Pobierz Wszystkie",
"Search Peers\\.\\.\\.": "Szukaj Klientów...",
"Display": "Wyświetlanie",
"Sort By": "Sortuj po",
"Refresh Interval": "Interwał Odświeżania",
"Name": "Nazwa",
"Allowed IPs": "Dozwolone IP",
"Restricted": "Ograniczone",
"(.*) Seconds": "$1 sek.",
"(.*) Minutes": "$1 min.",
"Configuration Settings": "Ustawienia Konfiguracji",
"Peer Jobs": "Automatyzacje Klienta",
"Active Jobs": "Aktywne Automatyzacje",
"All Active Jobs": "Wszystkie Aktywne Automatyzacje",
"Logs": "Logi",
"Private Key": "Prywatny Klucz",
"\\(Required for QR Code and Download\\)": "Wymagane aby otrzymać kod QR lub Pobrać",
"\\(Required\\)": "Wymagane",
"Endpoint Allowed IPs": "Dozwolone IP Punktu Końcowego",
"DNS": "DNS",
"Optional Settings": "Opcjonalne Ustawienia",
"Pre-Shared Key": "Klucz PSK",
"MTU": "MTU",
"Persistent Keepalive": "Stałe Utrzymywanie Online",
"Reset Data Usage": "Zresetuje Użycie Danych",
"Total": "Łącznie",
"Sent": "Wysłano",
"Received": "Otrzymano",
"Revert": "Cofnij",
"Save Peer": "Zapisz Klienta",
"QR Code": "Kod QR",
"Schedule Jobs": "Automatyzacje",
"Job": "Automatyzacja",
"Job ID": "ID Automatyzacji",
"Unsaved Job": "Niezapisana Automatyzacja",
"This peer does not have any job yet\\.": "Ten klient nie posiada żadnych automatyzacji.",
"if": "Jeśli",
"is": "jest",
"then": "to wtedy",
"larger than": "większy/a niż",
"Date": "Data",
"Restrict Peer": "Ogranicz Klienta",
"Delete Peer": "Usuń Klienta",
"Edit": "Edytuj",
"Delete": "Usuń",
"Deleting...": "Usuwam...",
"Cancel": "Anuluj",
"Save": "Zapisz",
"No active job at the moment\\.": "Brak aktywnych automatyzacji.",
"Jobs Logs": "Logi Automatyzacji",
"Updated at": "Ostatnia zmiana",
"Refresh": "Odśwież",
"Filter": "Filtruj",
"Success": "Sukces",
"Failed": "Porażka",
"Log ID": "ID Logów",
"Message": "Wiadomość",
"Share Peer": "Udostępnij Klienta",
"Currently the peer is not sharing": "Aktualnie klient nie jest udostępniony",
"Sharing\\.\\.\\.": "Udostępniam...",
"Start Sharing": "Rozpocznij Udostępnianie",
"Stop Sharing\\.\\.\\.": "Zakańczanie Udostępniania...",
"Stop Sharing": "Zakończ",
"Access Restricted": "Dostęp Ograniczony",
"Restrict Access": "Ogranicz Dostęp",
"Restricting\\.\\.\\.": "Ograniczanie...",
"Allow Access": "Udostępnij Dostęp",
"Allowing Access\\.\\.\\.": "Udostępnianie Dostępu...",
"Download \\& QR Code is not available due to no private key set for this peer": "Kod QR lub pobieranie nie jest dostępne ze względu na brak ustawionego prywatnego klucza dla tego klienta",
"Add Peers": "Dodaj Klientów",
"Bulk Add": "Masowe Dodawanie",
"By adding peers by bulk, each peer's name will be auto generated, and Allowed IP will be assign to the next available IP\\.": "Dodając klientów masowo, nazwa każdego klienta zostanie wygenerowana automatycznie i przydzielone zostanie następny dostępny adres IP.",
"How many peers you want to add\\?": "Ilu klientów chcesz dodać?",
"You can add up to (.*) peers": "Możesz dodać do $1 Klientów",
"Use your own Private and Public Key": "Użyj własnych publicznych i prywatnych kluczy",
"Enter IP Address/CIDR": "Podaj adres IP/CIDR",
"IP Address/CIDR": "Adres IP/CIDR",
"or": "lub",
"Pick Available IP": "Wybierz Dostępny Adres IP",
"No available IP containing": "Brak dostępnych adresów IP zawierających",
"Add": "Dodaj",
"Adding\\.\\.\\.": "Dodawanie...",
"Failed to check available update": "Nie udało się sprawdzić dostępnych aktualizacji",
"Nice to meet you!": "Miło Cię poznać!",
"Please fill in the following fields to finish setup": "Wypełnij następujące pola aby ukończyć instalacje",
"Create an account": "Stwórz konto",
"Enter an username you like": "Wpisz nazwę użytkownika",
"Enter a password": "Utwórz Hasło",
"\\(At least 8 characters and make sure is strong enough!\\)": "(Wybierz silne hasło zawierające co najmniej 8 znaków!)",
"Confirm password": "Potwierdź Hasło",
"Next": "Dalej",
"Saving\\.\\.\\.": "Zapisywanie...",
"1\\. Please scan the following QR Code to generate TOTP with your choice of authenticator": "1. Zeskanuj ten kod QR aby utworzyć jednorazowe hasło (TOTP) za pomocą Twojego Autentykatora",
"Or you can click the link below:": "Lub kliknij w poniższy link",
"2\\. Enter the TOTP generated by your authenticator to verify": "2. Podaj swoje jednorazowe hasło (TOTP), utworzone za pomocą Twojego Autentykatora",
"TOTP verified!": "Jednorazowe hasło (TOTP) potwierdzone!",
"I don't need MFA": "Nie potrzebuję Weryfikacji Wieloskładnikowej (MFA)",
"Complete": "Zakończ",
"(v[0-9.]{1,}) is now available for update!": "Aktualizacja do wersji $1 jest dostępna do pobrania!",
"Current Version:": "Aktualna wersja: ",
"Oh no\\.\\.\\. This link is either expired or invalid\\.": "Ups. Ten link nie jest poprawny bądź utracił swoją ważność.",
"Scan QR Code with the WireGuard App to add peer": "Zeskanuj kod QR za pomocą aplikacji WireGuard aby dodać klienta",
"or click the button below to download the ": "lub kliknij przycisk poniżej aby pobrać ",
" file": " plik",
"FROM ": "z ",
"(.*) is on": "$1 jest wł.",
"(.*) is off": "$1 jest wył.",
"Allowed IPs is invalid": "Dozwolone Adresy IP są niepoprawne",
"Peer created successfully": "Klient utworzony pomyślnie",
"Please fill in all required box": "Wypełnij wszystkie wymagane pola",
"Please specify amount of peers you want to add": "Podaj liczbę klientów do dodania",
"No more available IP can assign": "Brak dostępnych adresów IP do dopisania",
"The maximum number of peers can add is (.*)": "Maksymalnie można dodać $1 klientów",
"Generating key pairs by bulk failed": "Tworzenie par kluczy nie udało się",
"Failed to add peers in bulk": "Nie udało się dodać klientów masowo",
"This peer already exist": "Ten klient już istnieje",
"This IP is not available: (.*)": "Ten adres IP nie jest dostępny: $1",
"Configuration does not exist": "Konfiguracja nie istnieje",
"Peer does not exist": "Klient nie istnieje",
"Please provide a valid configuration name": "Podaj poprawną nazwę konfiguracji",
"Peer saved": "Klient zapisany pomyślnie",
"Allowed IPs already taken by another peer": "Adres IP jest już wykorzystywany przez innego klienta",
"Endpoint Allowed IPs format is incorrect": "Format Dozwolonych adresów IP jest niepoprawny",
"DNS format is incorrect": "Niepoprawny format adresu serwera DNS",
"MTU format is not correct": "Niepoprawny format wartości MTU",
"Persistent Keepalive format is not correct": "Niepoprawny format wartości Stałego Utrzymywania Online",
"Private key does not match with the public key": "Prywatny klucz nie pasuje do publicznego klucza",
"Update peer failed when updating Pre-Shared Key": "Aktualizacja klientów nie powiodła się przy zapisywaniu Klucza PSK",
"Update peer failed when updating Allowed IPs": "Aktualizacja klientów nie powiodła się przy zapisywaniu dozwolonych adresów IP",
"Update peer failed when saving the configuration": "Aktualizacja klientów nie powiodła się przy zapisywaniu Konfiguracji",
"Peer data usage reset successfully": "Użycie danych klienta zresetowane pomyślnie",
"Peer download started": "Pobieranie klienta rozpoczęte",
"Please specify one or more peers": "Wybierz co najmniej jednego klienta",
"Share link failed to create. Reason: (.*)": "Nie udało się stworzyć linku do udostępniania. Powód: $1",
"Link expire date updated": "Data ważności linku zapisana",
"Link expire date failed to update. Reason: (.*)": "Nie udało się zapisać daty linku do udostępniania. Powód: $1",
"Peer job saved": "Automatyzacja klienta zapisana",
"Please specify job": "Wybierz poprawną automatyzacje",
"Please specify peer and configuration": "Wybierz klienta i konfiguracje",
"Peer job deleted": "Automatyzacja klienta usunięta pomyślnie",
"API Keys function is successfully enabled": "Funkcjonalność kluczy API pomyślnie włączona",
"API Keys function is successfully disabled": "Funkcjonalność kluczy API pomyślnie wyłączona",
"API Keys function is failed to enable": "Nie udało się włączyć funkcjonalności kluczy API",
"API Keys function is failed to disable": "Nie udało się wyłączyć funkcjonalności kluczy API",
"WGDashboard API Keys function is disabled": "Funkcjonalność kluczy API jest wyłączona",
"WireGuard configuration path saved": "Zapisano ścieżkę konfiguracji WireGuard pomyślnie",
"API Key deleted": "Klucz API usunięty pomyślnie",
"API Key created": "Klucz API stworzony pomyślnie",
"Sign in session ended, please sign in again": "Sesja logowania została zakończona. Zaloguj się ponownie",
"Please specify an IP Address (v4/v6)": "Podaj adres IP (v4/v6)",
"Please provide ipAddress and count": "Podaj adres IP i ilość",
"Please provide ipAddress": "Podaj adres IP",
"Dashboard Language": "Język Portalu WGDashboard",
"Dashboard language update failed": "Nie udało się zmienić języka portalu WGDashboard",
"Peer Remote Endpoint": "Zdalny Punkt Końcowy Klienta",
"New Configuration": "Nowa Konfiguracja",
"Configuration Name": "Nazwa Konfiguracji",
"Configuration name is invalid. Possible reasons:": "Nazwa Konfiguracji jest nieprawidłowa. Możliwy powód:",
"Configuration name already exist\\.": "Konfiguracja o tej nazwie już istnieje. ",
"Configuration name can only contain 15 lower/uppercase alphabet, numbers, underscore, equal sign, plus sign, period and hyphen\\.": "Nazwa konfiguracji może zawierać tylko 15 znaków składających się z małych i dużych liter alfabetu, liczb, oraz tych znaków: _=+.- ",
"Invalid Port": "Niepoprawny Port",
"Save Configuration": "Zapisz Konfiguracje",
"IP Address/CIDR is invalid": "Adres IP/CIDR jest niepoprawny",
"IP Address": "Adres IP",
"Enter IP Address / Hostname": "Wpisz Adres IP / Nazwę Hosta",
"IP Address / Hostname": "Adres IP / Nazwa Hosta",
"Dashboard IP Address \\& Listen Port": "Adres IP Portalu WGDashboard oraz Port Nasłuchiwania",
"Count": "Ilość",
"Geolocation": "Geolokalizacja",
"Is Alive": "Jest Online",
"Average / Min / Max Round Trip Time": "Średnia / Min. / Maks. czas podróży pakietu",
"Sent / Received / Lost Package": "Wysłane / Otrzymane / Utracone Pakiety",
"Restore Configuration": "Przywróc Konfiguracje",
"Step (.*)": "Krok $1",
"Select a backup you want to restore": "Wybierz kopię zapasową którą chcesz przywrócić",
"Click to change a backup": "Wybierz kopię zapasową",
"Selected Backup": "Wybrana kopia zapasowa",
"You don't have any configuration to restore": "Nie posiadasz żadnej konfiguracji do przywrócenia",
"Help": "Pomoc",
"Backup": "Kopia Zapasowa",
"([0-9].*) Backups?": "$1 Kopii Zapasowych?",
"Yes": "Tak",
"No": "Nie",
"Backup not selected": "Nie wybrano kopii zapasowej",
"Confirm \\& edit restore information": "Potwierdź i edytuj informacje o przywróceniu kopii zapasowej",
"(.*) Available IP Address": "$1 Dostępne Adresy IP",
"Database File": "Plik Bazy Danych",
"Contain": "Zawiera",
"Restricted Peers?": "Ograniczeni Klienci",
"Restore": "Przywróć",
"Restoring": "Trwa przywracanie...",
"WGDashboard Settings": "Ustawienia WGDashboard",
"Peers Settings": "Ustawienia Klientów",
"WireGuard Configuration Settings": "Ustawienia Konfiguracji WireGuard",
"Appearance": "Wygląd",
"Theme": "Styl",
"Language": "Język",
"Account Settings": "Ustawienia Konta",
"Peer Default Settings": "Domyślne Ustawienia Klientów",
"Toggle When Start Up": "Włącz przy starcie serwera",
"Other Settings": "Inne Ustawienia",
"Select Peers": "Wybierz Klientów",
"Backup & Restore": "Tworzenie i Przywracanie Kopii Zapasowej",
"Delete Configuration": "Usuń Konfiguracje",
"Create Backup": "Stwórz Kopię Zapasową",
"No backup yet, click the button above to create backup\\.": "Brak kopii Zapasowych, kliknij przycisk powyżej aby utworzyć nową kopię",
"Are you sure to delete this backup\\?": "Czy na pewno chcesz usunąć tą kopię zapasową?",
"Are you sure to restore this backup?\\": "Czy na pewno chcesz przywrócić tą kopię zapasową?",
"Backup Date": "Data Utworzenia",
"File": "Plik",
"Are you sure to delete this configuration\\?": "Czy na pewno chcesz usunąć tą konfigurację?",
"Once you deleted this configuration\\:": "Jak tylko usuniesz tą konfigurację: ",
"All connected peers will get disconnected": "Wszyscy klienci zostaną odłączeni",
"Both configuration file \\(\\.conf\\) and database table related to this configuration will get deleted": "Zarówno plik konfiguracji (.conf) jak i tabela w bazie danych dotycząca tej konfiguracji zostaną usunięte",
"Checking backups...": "Sprawdzanie kopii zapasowych...",
"This configuration have ([0-9].*) backups": "Ta konfiguracja ma utworzone $1 kopii zapasowych",
"This configuration have no backup": "Ta konfiguracja nie posiada żadnych kopii zapasowych",
"If you're sure, please type in the configuration name below and click Delete": "Jeśli jesteś pewny/a wpisz nazwę konfiguracji poniżej i kliknij Usuń",
"Select All": "Zaznacz Wszystkie",
"Clear Selection": "Wyczyść Zaznaczenie",
"([0-9].*) Peers?": "$1 Klientów?",
"Downloading": "Pobieranie",
"Download Finished": "Pobieranie Zakończone",
"Done": "Zakończono",
"Are you sure to delete": "Czy na pewno chcesz usunąć",
"Are you sure to delete this peer\\?": "Czy na pewno chcesz usunąć tego klienta?",
"Configuration deleted": "Konfiguracja usunięta pomyślnie",
"Configuration saved": "Konfiguracja zapisana pomyślnie",
"WGDashboard language update failed": "Nie udało się zmienić języka WGDashboard",
"Configuration restored": "Konfiguracja przywrócona pomyślnie",
"Allowed IP already taken by another peer": "Dozwolony Adres IP jest już wykorzystywany przez innego klienta",
"Failed to allow access of peer (.*)": "Nie udało się pozwolić na dostęp klientowi$1",
"Failed to save configuration through WireGuard": "Nie udało się zapisać konfiguracji poprzez WireGuard",
"Deleted ([0-9]{1,}) peer\\(s\\)": "Usunięto $1 klienta/ów",
"Deleted ([0-9]{1,}) peer\\(s\\) successfully. Failed to delete ([0-9]{1,}) peer\\(s\\)": "Usunięto $1 klienta/ów pomyślnie. Nie udało się usunąć $2 klienta/ów",
"Restricted ([0-9]{1,}) peer\\(s\\)": "Ograniczono $1 klienta/ów ",
"Restricted ([0-9]{1,}) peer\\(s\\) successfully. Failed to restrict ([0-9]{1,}) peer\\(s\\)": "Ograniczono $1 klienta/ów pomyślnie. Nie udało się ograniczyć $2 klienta/ów",
"Allow access successfully": "Pomyślnie udostępniono dostęp"
}

View File

@ -77,7 +77,6 @@
"Sort By": "Сортировать по",
"Refresh Interval": "Интервал обновления",
"Name": "Имя",
"ago": "назад",
"Allowed IPs": "Внутренний IP-адрес",
"Restricted": "Прекращен",
"(.*) Seconds": "$1 сек.",
@ -238,7 +237,6 @@
"IP Address": "IP-адрес",
"Enter IP Address / Hostname": "Введите IP-адрес / Имя хоста",
"IP Address / Hostname": "IP-адрес / Имя хоста",
"Dashboard IP Address & Listen Port": "IP-адрес и порт панели мониторинга",
"Count": "Число прыжков",
"Geolocation": "Геолокация",
"Is Alive": "Живой",
@ -305,13 +303,10 @@
"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 ",
"Traceroute": "Трассировка",
"Autostart": "Автозапуск",
"Path": "Директория"
"Dashboard IP Address \\& Listen Port": "IP-адрес и порт панели мониторинга",
"Allow access successfully": "Доступ разрешён"
}

View File

@ -0,0 +1,312 @@
{
"Welcome to": "Välkommen till",
"Username": "Användarnamn",
"Password": "Lösenord",
"OTP from your authenticator": "Engångslösenord från din autentiserare",
"Sign In": "Logga in",
"Access Remote Server": "Åtkomst till fjärrserver",
"Server": "Server",
"Click": "Klicka",
"Pinging...": "Pingar...",
"to add your server": "för att lägga till din server",
"Server List": "Serverlista",
"Sorry, your username or password is incorrect.": "Tyvärr, ditt användarnamn eller lösenord är fel.",
"Home": "Hem",
"Settings": "Inställningar",
"Tools": "Verktyg",
"Sign Out": "Logga ut",
"Checking for update...": "Kontrollerar efter uppdateringar...",
"You're on the latest version": "Du använder den senaste versionen",
"WireGuard Configurations": "WireGuard-konfigurationer",
"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.": "Du har inga WireGuard-konfigurationer ännu. Kontrollera konfigurationsmappen eller ändra den i Inställningar. Som standard är mappen /etc/wireguard.",
"Configuration": "Konfiguration",
"Configurations": "Konfigurationer",
"Peers Default Settings": "Standardinställningar för Peers",
"Dashboard Theme": "Paneltema",
"Light": "Ljust",
"Dark": "Mörkt",
"This will be changed globally, and will be apply to all peer's QR code and configuration file.": "Detta kommer att ändras globalt och tillämpas på alla Peers QR-koder och konfigurationsfiler.",
"WireGuard Configurations Settings": "Inställningar för WireGuard-konfigurationer",
"Configurations Directory": "Konfigurationskatalog",
"Remember to remove / at the end of your path. e.g /etc/wireguard": "Kom ihåg att ta bort / i slutet av sökvägen, t.ex. /etc/wireguard",
"WGDashboard Account Settings": "WGDashboard-kontoinställningar",
"Current Password": "Nuvarande lösenord",
"New Password": "Nytt lösenord",
"Repeat New Password": "Upprepa nytt lösenord",
"Update Password": "Uppdatera lösenord",
"Reset": "Återställ",
"Setup": "Installera",
"API Keys": "API-nycklar",
"API Key": "API-nyckel",
"Key": "Nyckel",
"Enabled": "Aktiverad",
"Disabled": "Inaktiverad",
"No WGDashboard API Key": "Ingen WGDashboard API-nyckel",
"Expire At": "Utgår",
"Create API Key": "Skapa API-nyckel",
"Never Expire": "Löper aldrig ut",
"Don't think that's a good idea": "Det är nog inte en bra idé",
"Create": "Skapa",
"Status": "Status",
"On": "På",
"Off": "Av",
"Address": "Adress",
"Listen Port": "Lyssnarport",
"Public Key": "Publik nyckel",
"Connected Peers": "Anslutna Peers",
"Total Usage": "Total användning",
"Total Received": "Totalt mottaget",
"Total Sent": "Totalt skickat",
"Peers Data Usage": "Dataanvändning för Peers",
"Real Time Received Data Usage": "Realtidsanvändning mottagen data",
"Real Time Sent Data Usage": "Realtidsanvändning skickad data",
"Peer": "Peer",
"Peers": "Peers",
"Peer Settings": "Peer-inställningar",
"Download All": "Ladda ner alla",
"Display": "Visa",
"Sort By": "Sortera efter",
"Refresh Interval": "Uppdateringsintervall",
"Name": "Namn",
"Allowed IPs": "Tillåtna IP-adresser",
"Restricted": "Begränsad",
"(.*) Seconds": "$1 sekunder",
"(.*) Minutes": "$1 minuter",
"Configuration Settings": "Konfigurationsinställningar",
"Peer Jobs": "Peer-jobb",
"Active Jobs": "Aktiva jobb",
"All Active Jobs": "Alla aktiva jobb",
"Logs": "Loggar",
"Private Key": "Privat nyckel",
"Endpoint Allowed IPs": "Tillåtna IP-adresser för slutpunkt",
"DNS": "DNS",
"Optional Settings": "Valfria inställningar",
"Pre-Shared Key": "Fördelad nyckel",
"MTU": "MTU",
"Persistent Keepalive": "Persistent Keepalive",
"Reset Data Usage": "Återställ dataanvändning",
"Total": "Totalt",
"Sent": "Skickat",
"Received": "Mottaget",
"Revert": "Återställ",
"Save Peer": "Spara Peer",
"QR Code": "QR-kod",
"Schedule Jobs": "Schemalägg jobb",
"Job": "Jobb",
"Job ID": "Jobb-ID",
"Unsaved Job": "Osparat jobb",
"if": "om",
"is": "är",
"then": "då",
"larger than": "större än",
"Date": "Datum",
"Restrict Peer": "Begränsa Peer",
"Delete Peer": "Radera Peer",
"Edit": "Redigera",
"Delete": "Radera",
"Deleting...": "Raderar...",
"Cancel": "Avbryt",
"Save": "Spara",
"Jobs Logs": "Jobbloggar",
"Updated at": "Uppdaterad",
"Refresh": "Uppdatera",
"Filter": "Filter",
"Success": "Lyckades",
"Failed": "Misslyckades",
"Log ID": "Logg-ID",
"Message": "Meddelande",
"Share Peer": "Dela Peer",
"Currently the peer is not sharing": "Peer delar inte för tillfället",
"Start Sharing": "Starta delning",
"Stop Sharing": "Stoppa delning",
"Access Restricted": "Begränsad åtkomst",
"Restrict Access": "Begränsa åtkomst",
"Allow Access": "Tillåt åtkomst",
"Add Peers": "Lägg till Peers",
"Bulk Add": "Lägg till i bulk",
"You can add up to (.*) peers": "Du kan lägga till upp till $1 Peers",
"Use your own Private and Public Key": "Använd din egen privata och publika nyckel",
"Enter IP Address/CIDR": "Ange IP-adress/CIDR",
"IP Address/CIDR": "IP-adress/CIDR",
"or": "eller",
"Pick Available IP": "Välj tillgänglig IP",
"No available IP containing": "Ingen tillgänglig IP som innehåller ",
"Add": "Lägg till",
"Failed to check available update": "Misslyckades med att kontrollera tillgänglig uppdatering",
"Nice to meet you!": "Trevligt att träffas!",
"Please fill in the following fields to finish setup": "Fyll i följande fält för att slutföra installationen",
"Create an account": "Skapa ett konto",
"Enter an username you like": "Skriv in ett användarnamn du gillar",
"Enter a password": "Ange ett lösenord",
"Confirm password": "Bekräfta lösenord",
"Next": "Nästa",
"Or you can click the link below:": "Eller så kan du klicka på länken nedan:",
"TOTP verified!": "TOTP verifierad!",
"I don't need MFA": "Jag behöver inte MFA",
"Complete": "Komplett",
"(v[0-9.]{1,}) is now available for update!": "Version $1 är nu tillgänglig för uppdatering!",
"Current Version:": "Nuvarande version:",
"Scan QR Code with the WireGuard App to add peer": "Skanna QR-koden med WireGuard-appen för att lägga till peer",
"or click the button below to download the ": "eller klicka på knappen nedan för att ladda ner ",
" file": " fil",
"FROM ": "FRÅN ",
"(.*) is on": "$1 är aktiverad",
"(.*) is off": "$1 är avstängd",
"Allowed IPs is invalid": "Tillåtna IP-adresser är ogiltiga",
"Peer created successfully": "Peer skapad framgångsrikt",
"Please fill in all required box": "Vänligen fyll i alla obligatoriska fält",
"Please specify amount of peers you want to add": "Ange antalet peers du vill lägga till",
"No more available IP can assign": "Det finns inga fler tillgängliga IP-adresser att tilldela",
"The maximum number of peers can add is (.*)": "Det maximala antalet peers som kan läggas till är $1",
"Generating key pairs by bulk failed": "Generering av nyckelpar i bulk misslyckades",
"Failed to add peers in bulk": "Misslyckades med att lägga till peers i bulk",
"This peer already exist": "Den här peeren finns redan",
"This IP is not available: (.*)": "Den här IP-adressen är inte tillgänglig: $1",
"Configuration does not exist": "Konfigurationen finns inte",
"Peer does not exist": "Peer finns inte",
"Please provide a valid configuration name": "Vänligen ange ett giltigt konfigurationsnamn",
"Peer saved": "Peer sparad",
"Allowed IPs already taken by another peer": "Tillåtna IP-adresser är redan upptagna av en annan peer",
"Endpoint Allowed IPs format is incorrect": "Endpoint tillåtna IP-adresser är i fel format",
"DNS format is incorrect": "DNS-formatet är felaktigt",
"MTU format is not correct": "MTU-formatet är inte korrekt",
"Persistent Keepalive format is not correct": "Formatet för Persistent Keepalive är inte korrekt",
"Private key does not match with the public key": "Privat nyckel matchar inte med den offentliga nyckeln",
"Update peer failed when updating Pre-Shared Key": "Uppdatering av peer misslyckades vid uppdatering av Pre-Shared Key",
"Update peer failed when updating Allowed IPs": "Uppdatering av peer misslyckades vid uppdatering av tillåtna IP-adresser",
"Update peer failed when saving the configuration": "Uppdatering av peer misslyckades vid sparande av konfigurationen",
"Peer data usage reset successfully": "Peer dataanvändning återställd framgångsrikt",
"Peer download started": "Peer nedladdning påbörjad",
"Please specify one or more peers": "Vänligen ange en eller flera peers",
"Share link failed to create. Reason: (.*)": "Delningslänk skapades inte. Orsak: $1",
"Link expire date updated": "Länkens utgångsdatum uppdaterat",
"Link expire date failed to update. Reason: (.*)": "Länkens utgångsdatum misslyckades med att uppdateras. Orsak: $1",
"Peer job saved": "Peer-jobb sparad",
"Please specify job": "Vänligen ange jobb",
"Please specify peer and configuration": "Vänligen ange peer och konfiguration",
"Peer job deleted": "Peer-jobb raderad",
"API Keys function is successfully enabled": "API-nyckelfunktion har aktiverats",
"API Keys function is successfully disabled": "API-nyckelfunktion har inaktiverats",
"API Keys function is failed to enable": "API-nyckelfunktion misslyckades med att aktiveras",
"API Keys function is failed to disable": "API-nyckelfunktion misslyckades med att inaktiveras",
"WGDashboard API Keys function is disabled": "WGDashboard API-nyckelfunktion är inaktiverad",
"WireGuard configuration path saved": "WireGuard-konfigurationsväg sparad",
"API Key deleted": "API-nyckel raderad",
"API Key created": "API-nyckel skapad",
"Sign in session ended, please sign in again": "Inloggningen har gått ut, vänligen logga in igen",
"Please specify an IP Address (v4/v6)": "Vänligen ange en IP-adress (v4/v6)",
"Please provide ipAddress and count": "Vänligen ange ipAddress och count",
"Please provide ipAddress": "Vänligen ange ipAddress",
"Dashboard Language": "Panelens språk",
"Dashboard language update failed": "Uppdatering av panelens språk misslyckades",
"Peer Remote Endpoint": "Peer fjärrslutpunkt",
"New Configuration": "Ny konfiguration",
"Configuration Name": "Konfigurationsnamn",
"Configuration name is invalid. Possible reasons:": "Konfigurationsnamn är ogiltigt. Möjliga orsaker:",
"Configuration name already exist\\.": "Konfigurationsnamnet finns redan.",
"Configuration name can only contain 15 lower/uppercase alphabet, numbers, underscore, equal sign, plus sign, period and hyphen\\.": "Konfigurationsnamnet får endast innehålla 15 små/stora bokstäver, siffror, understreck, likhetstecken, plustecken, punkt och bindestreck.",
"Invalid Port": "Ogiltig port",
"Save Configuration": "Spara konfiguration",
"IP Address/CIDR is invalid": "IP-adress/CIDR är ogiltig",
"IP Address": "IP-adress",
"Enter IP Address / Hostname": "Ange IP-adress / Värdnamn",
"IP Address / Hostname": "IP-adress / Värdnamn",
"Dashboard IP Address \\& Listen Port": "Panelens IP-adress & Lyssningsport",
"Count": "Antal",
"Geolocation": "Geolokalisering",
"Is Alive": "Är aktiv",
"Average / Min / Max Round Trip Time": "Genomsnitt / Min / Max rundturstid",
"Sent / Received / Lost Package": "Skickade / Mottagna / Förlorade paket",
"Manual restart of WGDashboard is needed to apply changes on IP Address and Listen Port": "Manuell omstart av WGDashboard krävs för att tillämpa ändringar på IP-adress och lyssningsport",
"Restore Configuration": "Återställ konfiguration",
"Step (.*)": "Steg $1",
"Select a backup you want to restore": "Välj en säkerhetskopia du vill återställa",
"Click to change a backup": "Klicka för att ändra säkerhetskopia",
"Selected Backup": "Vald säkerhetskopia",
"You don't have any configuration to restore": "Du har ingen konfiguration att återställa",
"Help": "Hjälp",
"Backup": "Säkerhetskopiering",
"([0-9].*) Backups?": "$1 säkerhetskopior?",
"Yes": "Ja",
"No": "Nej",
"Backup not selected": "Ingen säkerhetskopia vald",
"Confirm \\& edit restore information": "Bekräfta och redigera återställningsinformation",
"(.*) Available IP Address": "$1 tillgängliga IP-adresser",
"Database File": "Databasfil",
"Contain": "Innehåller",
"Restricted Peers?": "Begränsade peers?",
"Restore": "Återställ",
"Restoring": "Återställer...",
"WGDashboard Settings": "WGDashboard inställningar",
"Peers Settings": "Peer-inställningar",
"WireGuard Configuration Settings": "WireGuard konfigurationsinställningar",
"Appearance": "Utseende",
"Theme": "Tema",
"Language": "Språk",
"Account Settings": "Kontoinställningar",
"Peer Default Settings": "Peer-standardinställningar",
"Toggle When Start Up": "Växla vid start",
"Other Settings": "Övriga inställningar",
"Select Peers": "Välj peers",
"Backup & Restore": "Säkerhetskopiering & Återställning",
"Delete Configuration": "Radera konfiguration",
"Create Backup": "Skapa säkerhetskopia",
"No backup yet, click the button above to create backup\\.": "Ingen säkerhetskopia än, klicka på knappen ovan för att skapa en.",
"Are you sure to delete this backup\\?": "Är du säker på att du vill radera denna säkerhetskopia?",
"Are you sure to restore this backup?\\": "Är du säker på att du vill återställa denna säkerhetskopia?",
"Backup Date": "Säkerhetskopieringsdatum",
"File": "Fil",
"Are you sure to delete this configuration\\?": "Är du säker på att du vill radera denna konfiguration?",
"Once you deleted this configuration\\:": "När du raderat denna konfiguration:",
"All connected peers will get disconnected": "Alla anslutna peers kommer att kopplas bort",
"Both configuration file \\(\\.conf\\) and database table related to this configuration will get deleted": "Både konfigurationsfilen (.conf) och databastabellen relaterad till denna konfiguration kommer att raderas",
"Checking backups...": "Kontrollerar säkerhetskopior...",
"This configuration have ([0-9].*) backups": "Denna konfiguration har $1 säkerhetskopior",
"This configuration have no backup": "Denna konfiguration har ingen säkerhetskopia",
"If you're sure, please type in the configuration name below and click Delete": "Om du är säker, skriv in konfigurationsnamnet nedan och klicka på Radera",
"Select All": "Välj alla",
"Clear Selection": "Rensa urval",
"([0-9].*) Peers?": "$1 Peers?",
"Downloading": "Hämtar",
"Download Finished": "Nedladdning slutförd",
"Done": "Klar",
"Are you sure to delete": "Är du säker på att du vill radera",
"Are you sure to delete this peer\\?": "Är du säker på att du vill radera denna peer?",
"Configuration deleted": "Konfiguration raderad",
"Configuration saved": "Konfiguration sparad",
"WGDashboard language update failed": "Uppdatering av WGDashboard språk misslyckades",
"Configuration restored": "Konfiguration återställd",
"Allowed IP already taken by another peer": "Tillåten IP-adress är redan upptagen av en annan peer",
"Failed to allow access of peer (.*)": "Misslyckades att ge access till peer (.*)",
"Failed to save configuration through WireGuard": "Misslyckades att spara konfiguration genom WireGuard",
"Allow access successfully": "Åtkomst beviljad framgångsrikt",
"Deleted ([0-9]{1,}) peer\\(s\\)": "Raderade $1 peer(s)",
"Deleted ([0-9]{1,}) peer\\(s\\) successfully. Failed to delete ([0-9]{1,}) peer\\(s\\)": "Raderade framgångsrikt $1 peer(s), misslyckades att radera $2 peer(s)",
"Restricted ([0-9]{1,}) peer\\(s\\)": "Begränsade $1 peer(s)",
"Restricted ([0-9]{1,}) peer\\(s\\) successfully. Failed to restrict ([0-9]{1,}) peer\\(s\\)": "Begränsade framgångsrikt $1 peer(s), misslyckades att begränsa $2 peer(s)",
"Signing In\\.\\.\\.": "Loggar in...",
"Multi-Factor Authentication \\(MFA\\)": "Flerfaktorsautentisering (MFA)",
"Are you sure to delete this API key\\?": "Är du säker på att du vill radera denna API-nyckel?",
"When should this API Key expire\\?": "När ska denna API-nyckel löpa ut?",
"Creating\\.\\.\\.": "Skapar...",
"Turning On\\.\\.\\.": "Aktiverar...",
"Turning Off\\.\\.\\.": "Inaktiverar...",
"Search Peers\\.\\.\\.": "Sök Peers...",
"\\(Required for QR Code and Download\\)": "(Krävs för QR-kod och nedladdning)",
"\\(Required\\)": "(Krävs)",
"This peer does not have any job yet\\.": "Denna Peer har inga jobb ännu.",
"No active job at the moment\\.": "Inga aktiva jobb just nu.",
"Sharing\\.\\.\\.": "Delar...",
"Stop Sharing\\.\\.\\.": "Stoppar delning...",
"Restricting\\.\\.\\.": "Begränsar åtkomst...",
"Allowing Access\\.\\.\\.": "Tillåter åtkomst...",
"Download \\& QR Code is not available due to no private key set for this peer": "Nedladdning & QR-kod är inte tillgängligt eftersom ingen privat nyckel är inställd för denna Peer",
"By adding peers by bulk, each peer's name will be auto generated, and Allowed IP will be assign to the next available IP\\.": "Vid bulk-läggning genereras varje Peer's namn automatiskt och tillåtet IP tilldelas nästa tillgängliga IP.",
"How many peers you want to add\\?": "Hur många Peers vill du lägga till?",
"Adding\\.\\.\\.": "Lägger till...",
"\\(At least 8 characters and make sure is strong enough!\\)": "(Minst 8 tecken och se till att det är tillräckligt starkt!)",
"Saving\\.\\.\\.": "Sparar...",
"1\\. Please scan the following QR Code to generate TOTP with your choice of authenticator": "1. Vänligen skanna följande QR-kod för att generera TOTP med din valda autentiserare",
"2\\. Enter the TOTP generated by your authenticator to verify": "2. Ange den TOTP som din autentiserare genererade för att verifiera",
"Oh no\\.\\.\\. This link is either expired or invalid\\.": "Åh nej... Den här länken är antingen utgången eller ogiltig."
}

View File

@ -4,7 +4,7 @@
"Password": "Parola",
"OTP from your authenticator": "Kimlik doğrulama uygulamanızdan tek kullanımlık parola",
"Sign In": "Giriş Yap",
"Signing In...": "Giriş Yapılıyor...",
"Signing In\\.\\.\\.": "Giriş Yapılıyor...",
"Access Remote Server": "Uzak Sunuculara Eriş",
"Server": "Sunucu",
"Click": "Tıkla",
@ -35,7 +35,6 @@
"New Password": "Yeni Parola",
"Repeat New Password": "Yeni Parolayı Tekrarla",
"Update Password": "Parolayı Guncelle",
"Multi-Factor Authentication (MFA)": "Çok Adımlı Dogrulama (MFA)",
"Reset": "Sıfırla",
"Setup": "Kurulum",
"API Keys": "API Anahtarları",
@ -45,18 +44,13 @@
"Disabled": "Devre Dışı",
"No WGDashboard API Key": "WGDashboard API Anahtarı Yok",
"Expire At": "Geçerliliğini yitirme tarihi",
"Are you sure to delete this API key?": "Bu API anahtarını silmek istediğine emin misiniz?",
"Create API Key": "Yeni API anahtarı oluştur",
"When should this API Key expire?": "Bu API anahtarı ne zamana kadar geçerli olmalı?",
"Never Expire": "Geçerliligi asla yitirme",
"Don't think that's a good idea": "Bunun iyi bir fikir oldugunu düşünmüyorum",
"Creating...": "Oluşturuluyor...",
"Create": "Oluştur",
"Status": "Durum",
"On": "Açık",
"Off": "Kapalı",
"Turning On...": "Açılıyor...",
"Turning Off...": "Kapatılıyor...",
"Address": "Adres",
"Listen Port": "Port",
"Public Key": "Genel Anahtar",
@ -71,7 +65,6 @@
"Peers": "Eşler",
"Peer Settings": "Eş Ayarları",
"Download All": "Hepsini İndir",
"Search Peers...": "Eşleri Ara...",
"Display": "Göster",
"Sort By": "Sırala",
"Refresh Interval": "Yenileme Sıklığı",
@ -86,8 +79,6 @@
"All Active Jobs": "Aktif Tüm Görevler",
"Logs": "Loglar",
"Private Key": "Özel Anahtar",
"(Required for QR Code and Download)": "(QR Kodu ve İndirme için zorunlu)",
"(Required)": "(Zorunlu)",
"Endpoint Allowed IPs": "Endpointe Erişim İçin İzin Verilen IP Adresleri",
"DNS": "DNS",
"Optional Settings": "İsteğe Bağlı Ayarlar",
@ -105,7 +96,6 @@
"Job": "Görev",
"Job ID": "Görev ID",
"Unsaved Job": "Kaydedilmemiş Görev",
"This peer does not have any job yet.": "Bu eşe ait henüz herhangi bir görev yok.",
"if": "eğer",
"is": "",
"then": "öyleyse",
@ -118,7 +108,6 @@
"Deleting...": "Siliniyor...",
"Cancel": "İptal Et",
"Save": "Kaydet",
"No active job at the moment.": "Şu an herhangi bir aktif görev yok.",
"Jobs Logs": "Görev Logları",
"Updated at": "tarihinde güncellenmiş",
"Refresh": "Yenile",
@ -129,20 +118,13 @@
"Message": "Mesaj",
"Share Peer": "Eşi Paylaş",
"Currently the peer is not sharing": "Eş şu an paylaşım yapmıyor",
"Sharing...": "Paylaşılıyor...",
"Start Sharing": "Paylaşımı Başlat",
"Stop Sharing...": "Paylaşım Durduruluyor...",
"Stop Sharing": "Paylaşımı Durdur",
"Access Restricted": "Erişim Kısıtlandı",
"Restrict Access": "Erişimi Kısıtla",
"Restricting...": "Erişim Kısıtlanıyor...",
"Allow Access": "Erişim Ver",
"Allowing Access...": "Erişim Veriliyor...",
"Download & QR Code is not available due to no private key set for this peer": "Bu eş için özel anahtar tanımlandığı için İndirme ve QR Kod mevcut değil",
"Add Peers": "Eş Ekle",
"Bulk Add": "Toplu Ekle",
"By adding peers by bulk, each peer's name will be auto generated, and Allowed IP will be assign to the next available IP.": "Toplu ekleme yaparsanız eşlerin isimleri otomatik olarak oluşturulacak ve İzin Verilen IP adresi mevcut olan bir sonraki IP olarak tanımlanacak.",
"How many peers you want to add?": "Kaç adet eş eklemek istiyorsunuz?",
"You can add up to (.*) peers": "$1 adete kadar eş ekleyebilirsiniz",
"Use your own Private and Public Key": "Kendi özel ve genel anahtarınızı kullanın",
"Enter IP Address/CIDR": "IP Adresi/CIDR girin",
@ -151,7 +133,6 @@
"Pick Available IP": "Mevcut IP Adresi Seç",
"No available IP containing": "Mevcut IP Adresi bulunmuyor",
"Add": "Ekle",
"Adding...": "Ekleniyor...",
"Failed to check available update": "Mevcut güncelleştirme kontrol edilemedi",
"Nice to meet you!": "Tanıştığıma memnun oldum!",
"Please fill in the following fields to finish setup": "Lütfen kurulumu bitirmek için şu alanları doldurun",
@ -228,8 +209,6 @@
"New Configuration": "Yeni Yapılandırma",
"Configuration Name": "Yapılandırma Adı",
"Configuration name is invalid. Possible reasons:": "Yapılandırma ismi geçersiz. Muhtemel sebepler:",
"Configuration name already exist.": "Yapılandırma ismi zaten mevcut.",
"Configuration name can only contain 15 lower/uppercase alphabet, numbers, underscore, equal sign, plus sign, period and hyphen.": "Yapılandırma ismi 15 karakterden oluşur; büyük/küçük harf, sayı, alt çizgi, eşittir, artı, nokta ve tire içerebilir.",
"Invalid Port": "Geçersiz Port",
"Save Configuration": "Yapılandırmayı Kaydet",
"IP Address/CIDR is invalid": "IP Adresi/CIDR geçersiz",
@ -254,7 +233,6 @@
"Yes": "Evet",
"No": "Hayır",
"Backup not selected": "Yedek seçilmedi",
"Confirm & edit restore information": "Geri yükleme bilgisini doğrula ve düzelt",
"(.*) Available IP Address": "$1 adet mevcut IP Adresi",
"Database File": "Veritabanı Dosyası",
"Contain": "İçeriyor",
@ -275,15 +253,9 @@
"Backup & Restore": "Yedekleme ve Geri Yükleme",
"Delete Configuration": "Yapılandırmayı Sil",
"Create Backup": "Yedek Oluştur",
"No backup yet, click the button above to create backup.": "Henüz herhangi bir yedek bulunmuyor, oluşturmak için üstteki butona tıklayın.",
"Are you sure to delete this backup?": "Bu yedeği silmek istediğinize emin misiniz?",
"Are you sure to restore this backup?": "Bu yedeği geri yüklemek istediğinize emin misiniz?",
"Backup Date": "Yedek Tarihi",
"File": "Dosya",
"Are you sure to delete this configuration?": "Bu yapılandırmayı silmek istediğinize emin misiniz?",
"Once you deleted this configuration:": "Bu yapılandırmayı sildiğiniz an:",
"All connected peers will get disconnected": "Bağlı tüm eşlerin bağlantısı kopacak",
"Both configuration file (.conf) and database table related to this configuration will get deleted": "Hem yapılandırma dosyası (.conf) hem de bu yapılandırmanın veritabanı tablosu silinecek",
"Checking backups...": "Yedekler kontrol ediliyor...",
"This configuration have ([0-9].*) backups": "Bu yapılandırmanın $1 adet yedeği bulunuyor",
"This configuration have no backup": "Bu yapılandırmanın hiç yedeği bulunmuyor",
@ -291,11 +263,9 @@
"Select All": "Hepsini Seç",
"Clear Selection": "Seçimi Kaldır",
"([0-9].*) Peers?": "$1 Eş?",
"Downloadıng": "İndiriliyor",
"Download Finished": "İndirme Tamamlandı",
"Done": "Bitti",
"Are you sure to delete": "Silmek istediğinize emin misiniz?",
"Are you sure to delete this peer?": "Bu eşi silmek istediğinize emin misiniz?",
"Configuration deleted": "Yapılandırma silindi",
"Configuration saved": "Yapılandırma kaydedildi",
"WGDashboard language update failed": "WGDashboard ismi güncellenemedi",
@ -304,8 +274,39 @@
"Failed to allow access of peer (.*)": "$1 eşe erişim izni verilemedi",
"Failed to save configuration through WireGuard": "WireGuard üzerinden yapılandırma kaydedilemedi",
"Allow access successfully": "Erişim izni başarıyla verildi",
"Deleted ([0-9]{1,}) peer(s)": "$1 eş silindi",
"Deleted ([0-9]{1,}) peer(s) successfully. Failed to delete ([0-9]{1,}) peer(s)": "$1 eş başarıyla silindi. $2 eş silinemedi",
"Restricted ([0-9]{1,}) peer(s)": "$1 eşin erişimi kısıtlandı",
"Restricted ([0-9]{1,}) peer(s) successfully. Failed to restrict ([0-9]{1,}) peer(s)": "$1 eşin erişimi kısıtlandı. $2 eşin erişimi kısıtlanamadı"
"Multi-Factor Authentication \\(MFA\\)": "Çok Adımlı Dogrulama (MFA)",
"Are you sure to delete this API key\\?": "Bu API anahtarını silmek istediğine emin misiniz?",
"When should this API Key expire\\?": "Bu API anahtarı ne zamana kadar geçerli olmalı?",
"Creating\\.\\.\\.": "Oluşturuluyor...",
"Turning On\\.\\.\\.": "Açılıyor...",
"Turning Off\\.\\.\\.": "Kapatılıyor...",
"Search Peers\\.\\.\\.": "Eşleri Ara...",
"\\(Required for QR Code and Download\\)": "(QR Kodu ve İndirme için zorunlu)",
"\\(Required\\)": "(Zorunlu)",
"This peer does not have any job yet\\.": "Bu eşe ait henüz herhangi bir görev yok.",
"No active job at the moment\\.": "Şu an herhangi bir aktif görev yok.",
"Sharing\\.\\.\\.": "Paylaşılıyor...",
"Stop Sharing\\.\\.\\.": "Paylaşım Durduruluyor...",
"Restricting\\.\\.\\.": "Erişim Kısıtlanıyor...",
"Allowing Access\\.\\.\\.": "Erişim Veriliyor...",
"Download \\& QR Code is not available due to no private key set for this peer": "Bu eş için özel anahtar tanımlandığı için İndirme ve QR Kod mevcut değil",
"By adding peers by bulk, each peer's name will be auto generated, and Allowed IP will be assign to the next available IP\\.": "Toplu ekleme yaparsanız eşlerin isimleri otomatik olarak oluşturulacak ve İzin Verilen IP adresi mevcut olan bir sonraki IP olarak tanımlanacak.",
"How many peers you want to add\\?": "Kaç adet eş eklemek istiyorsunuz?",
"Adding\\.\\.\\.": "Ekleniyor...",
"Configuration name already exist\\.": "Yapılandırma ismi zaten mevcut.",
"Configuration name can only contain 15 lower/uppercase alphabet, numbers, underscore, equal sign, plus sign, period and hyphen\\.": "Yapılandırma ismi 15 karakterden oluşur; büyük/küçük harf, sayı, alt çizgi, eşittir, artı, nokta ve tire içerebilir.",
"Dashboard IP Address \\& Listen Port": "",
"Confirm \\& edit restore information": "Geri yükleme bilgisini doğrula ve düzelt",
"No backup yet, click the button above to create backup\\.": "Henüz herhangi bir yedek bulunmuyor, oluşturmak için üstteki butona tıklayın.",
"Are you sure to delete this backup\\?": "Bu yedeği silmek istediğinize emin misiniz?",
"Are you sure to restore this backup?\\": "Bu yedeği geri yüklemek istediğinize emin misiniz?",
"Are you sure to delete this configuration\\?": "Bu yapılandırmayı silmek istediğinize emin misiniz?",
"Once you deleted this configuration\\:": "Bu yapılandırmayı sildiğiniz an:",
"Both configuration file \\(\\.conf\\) and database table related to this configuration will get deleted": "Hem yapılandırma dosyası (.conf) hem de bu yapılandırmanın veritabanı tablosu silinecek",
"Downloading": "İndiriliyor",
"Are you sure to delete this peer\\?": "Bu eşi silmek istediğinize emin misiniz?",
"Deleted ([0-9]{1,}) peer\\(s\\)": "$1 eş silindi",
"Deleted ([0-9]{1,}) peer\\(s\\) successfully. Failed to delete ([0-9]{1,}) peer\\(s\\)": "$1 eş başarıyla silindi. $2 eş silinemedi",
"Restricted ([0-9]{1,}) peer\\(s\\)": "$1 eşin erişimi kısıtlandı",
"Restricted ([0-9]{1,}) peer\\(s\\) successfully. Failed to restrict ([0-9]{1,}) peer\\(s\\)": "$1 eşin erişimi kısıtlandı. $2 eşin erişimi kısıtlanamadı"
}

View File

@ -236,6 +236,7 @@
"IP Address": "IP-адреса",
"Enter IP Address / Hostname": "Введіть IP-адресу / ім’я хоста",
"IP Address / Hostname": "IP-адресу / ім’я хоста",
"Dashboard IP Address \\& Listen Port": "",
"Count": "Граф",
"Geolocation": "",
"Is Alive": "",

View File

@ -0,0 +1,62 @@
import json
active_languages = json.loads(open("active_languages.json", "r").read())
language_template = json.loads(open("language_template.json", "r").read())
if __name__ == "__main__":
welcome = "WGDashboard Locale File Verification [by @donaldzou]"
print("="*(len(welcome) + 4))
print(f"| {welcome} |")
print("="*(len(welcome) + 4))
print()
print("Active Languages\n")
status = False
for language in active_languages:
print(f"{language['lang_name']} | {language['lang_id']}")
lang_ids = list(map(lambda x: x['lang_id'], active_languages))
print()
lang_id = ""
while not status:
lang_id = input("Please enter the language ID to verify: ")
if lang_id not in lang_ids:
print(f'{lang_id} is not a valid language ID')
elif lang_id == 'en':
print(f'{lang_id} is not a editable language')
else:
status = True
with open(f"{lang_id}.json", "r") as f:
lang_file = json.load(f)
# Identify missing and deprecated translations
missing_translation = [
key for key in language_template
if key not in lang_file or not lang_file[key].strip()
]
deprecated_translation = [
key for key in lang_file
if key not in language_template
]
with open(f"{lang_id}.json", "w") as f:
new_lang_file = dict(lang_file)
for key in missing_translation:
new_lang_file[key] = ""
for key in deprecated_translation:
new_lang_file.pop(key)
f.write(json.dumps(new_lang_file, ensure_ascii=False, indent='\t'))
print()
# Print missing translations
print(f"\t[Missing Translations] {len(missing_translation)} translation{'s' if len(missing_translation) > 1 else ''}")
# Print deprecated translations
print(f"\t[Deprecated Translations] {len(deprecated_translation)} translation{'s' if len(deprecated_translation) > 1 else ''}")
print(f"\t[Note] All missing translations are added into {lang_id}.json, all deprecated translations are removed from {lang_id}.json")

View File

@ -298,7 +298,7 @@
"Are you sure to delete": "您确定要删除",
"Are you sure to delete this peer\\?": "您确定要删除此端点吗?",
"Configuration deleted": "配置删除成功",
"Configuration saved": "",
"Configuration saved": "配置保存成功",
"WGDashboard language update failed": "WGDashboard 语言更新失败",
"Configuration restored": "配置恢复成功",
"Allowed IP already taken by another peer": "允许的 IP 地址已经被别的端点占用",

View File

@ -298,7 +298,7 @@
"Are you sure to delete": "您確定要刪除",
"Are you sure to delete this peer\\?": "您確定要刪除此端點嗎?",
"Configuration deleted": "配置刪除成功",
"Configuration saved": "",
"Configuration saved": "配置保存成功",
"WGDashboard language update failed": "WGDashboard 語言更新失敗",
"Configuration restored": "配置恢復成功",
"Allowed IP already taken by another peer": "允許的 IP 地址已經被別的端點佔用",