Compare commits
23 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 53867985d1 | |||
| b3cc1ce839 | |||
| 71aaec93ef | |||
| 7a219b73d4 | |||
| c456c5e7dd | |||
| a5880cc0b8 | |||
| 5fca628ebd | |||
| 7ab297c366 | |||
| c5de8f0f44 | |||
| c0641889cf | |||
| 9141562f91 | |||
| d21af70df1 | |||
| 56ee86cc1c | |||
| f017b4968c | |||
| 6004457666 | |||
| 1a5a0180ea | |||
| c732f149e6 | |||
| 4819480eb0 | |||
| fc7ab0dc21 | |||
| eb6b96c0f1 | |||
| f62fad9c40 | |||
| e9a472c8f7 | |||
| 552e2b8cbf |
Vendored
+1
-1
@@ -3,7 +3,7 @@
|
|||||||
"aaron-bond.better-comments",
|
"aaron-bond.better-comments",
|
||||||
"dbaeumer.vscode-eslint",
|
"dbaeumer.vscode-eslint",
|
||||||
"antfu.goto-alias",
|
"antfu.goto-alias",
|
||||||
"prettier.prettier-vscode",
|
"esbenp.prettier-vscode",
|
||||||
"yoavbls.pretty-ts-errors",
|
"yoavbls.pretty-ts-errors",
|
||||||
"bradlc.vscode-tailwindcss",
|
"bradlc.vscode-tailwindcss",
|
||||||
"vue.volar",
|
"vue.volar",
|
||||||
|
|||||||
Vendored
+5
-5
@@ -1,22 +1,22 @@
|
|||||||
{
|
{
|
||||||
"editor.tabSize": 2,
|
"editor.tabSize": 2,
|
||||||
"editor.useTabStops": false,
|
"editor.useTabStops": false,
|
||||||
"editor.defaultFormatter": "prettier.prettier-vscode",
|
"editor.defaultFormatter": "esbenp.prettier-vscode",
|
||||||
"editor.formatOnSave": true,
|
"editor.formatOnSave": true,
|
||||||
"editor.codeActionsOnSave": {
|
"editor.codeActionsOnSave": {
|
||||||
"source.fixAll.eslint": "always"
|
"source.fixAll.eslint": "always"
|
||||||
},
|
},
|
||||||
"[vue]": {
|
"[vue]": {
|
||||||
"editor.defaultFormatter": "prettier.prettier-vscode"
|
"editor.defaultFormatter": "esbenp.prettier-vscode"
|
||||||
},
|
},
|
||||||
"[typescript]": {
|
"[typescript]": {
|
||||||
"editor.defaultFormatter": "prettier.prettier-vscode"
|
"editor.defaultFormatter": "esbenp.prettier-vscode"
|
||||||
},
|
},
|
||||||
"[json]": {
|
"[json]": {
|
||||||
"editor.defaultFormatter": "prettier.prettier-vscode"
|
"editor.defaultFormatter": "esbenp.prettier-vscode"
|
||||||
},
|
},
|
||||||
"[markdown]": {
|
"[markdown]": {
|
||||||
"editor.defaultFormatter": "prettier.prettier-vscode",
|
"editor.defaultFormatter": "esbenp.prettier-vscode",
|
||||||
"editor.tabSize": 4,
|
"editor.tabSize": 4,
|
||||||
"editor.useTabStops": false
|
"editor.useTabStops": false
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -7,6 +7,23 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|||||||
|
|
||||||
## [Unreleased]
|
## [Unreleased]
|
||||||
|
|
||||||
|
## [15.2.2] - 2026-02-06
|
||||||
|
|
||||||
|
### Added
|
||||||
|
|
||||||
|
- Added Userspace WireGuard support (https://github.com/wg-easy/wg-easy/pull/2419)
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
|
||||||
|
- LangSelector overlapping with Buttons (https://github.com/wg-easy/wg-easy/pull/2434)
|
||||||
|
- AmnzeziaWG config parameters (https://github.com/wg-easy/wg-easy/pull/2440)
|
||||||
|
- OpenMetrics help string format (https://github.com/wg-easy/wg-easy/pull/2453)
|
||||||
|
- Reset 2fa when resetting admin password (https://github.com/wg-easy/wg-easy/pull/2461)
|
||||||
|
|
||||||
|
### Docs
|
||||||
|
|
||||||
|
- Replace Watchtower with maintained fork (https://github.com/wg-easy/wg-easy/pull/2456)
|
||||||
|
|
||||||
## [15.2.1] - 2026-01-14
|
## [15.2.1] - 2026-01-14
|
||||||
|
|
||||||
### Fixed
|
### Fixed
|
||||||
|
|||||||
+10
-3
@@ -15,9 +15,12 @@ COPY src ./
|
|||||||
RUN pnpm build
|
RUN pnpm build
|
||||||
|
|
||||||
# Build amneziawg-tools
|
# Build amneziawg-tools
|
||||||
RUN apk add linux-headers build-base git && \
|
RUN apk add linux-headers build-base go git && \
|
||||||
git clone https://github.com/amnezia-vpn/amneziawg-tools.git && \
|
git clone https://github.com/amnezia-vpn/amneziawg-tools.git && \
|
||||||
cd amneziawg-tools/src && \
|
git clone https://github.com/amnezia-vpn/amneziawg-go && \
|
||||||
|
cd amneziawg-go && \
|
||||||
|
make && \
|
||||||
|
cd ../amneziawg-tools/src && \
|
||||||
make
|
make
|
||||||
|
|
||||||
# Copy build result to a new image.
|
# Copy build result to a new image.
|
||||||
@@ -33,11 +36,14 @@ COPY --from=build /app/.output /app
|
|||||||
COPY --from=build /app/server/database/migrations /app/server/database/migrations
|
COPY --from=build /app/server/database/migrations /app/server/database/migrations
|
||||||
# libsql (https://github.com/nitrojs/nitro/issues/3328)
|
# libsql (https://github.com/nitrojs/nitro/issues/3328)
|
||||||
RUN cd /app/server && \
|
RUN cd /app/server && \
|
||||||
npm install --no-save libsql && \
|
npm install --no-save --omit=dev libsql && \
|
||||||
npm cache clean --force
|
npm cache clean --force
|
||||||
# cli
|
# cli
|
||||||
COPY --from=build /app/cli/cli.sh /usr/local/bin/cli
|
COPY --from=build /app/cli/cli.sh /usr/local/bin/cli
|
||||||
RUN chmod +x /usr/local/bin/cli
|
RUN chmod +x /usr/local/bin/cli
|
||||||
|
# Copy amneziawg-go
|
||||||
|
COPY --from=build /app/amneziawg-go/amneziawg-go /usr/bin/amneziawg-go
|
||||||
|
RUN chmod +x /usr/bin/amneziawg-go
|
||||||
# Copy amneziawg-tools
|
# Copy amneziawg-tools
|
||||||
COPY --from=build /app/amneziawg-tools/src/wg /usr/bin/awg
|
COPY --from=build /app/amneziawg-tools/src/wg /usr/bin/awg
|
||||||
COPY --from=build /app/amneziawg-tools/src/wg-quick/linux.bash /usr/bin/awg-quick
|
COPY --from=build /app/amneziawg-tools/src/wg-quick/linux.bash /usr/bin/awg-quick
|
||||||
@@ -52,6 +58,7 @@ RUN apk add --no-cache \
|
|||||||
nftables \
|
nftables \
|
||||||
kmod \
|
kmod \
|
||||||
iptables-legacy \
|
iptables-legacy \
|
||||||
|
wireguard-go \
|
||||||
wireguard-tools
|
wireguard-tools
|
||||||
|
|
||||||
RUN mkdir -p /etc/amnezia
|
RUN mkdir -p /etc/amnezia
|
||||||
|
|||||||
@@ -16,6 +16,7 @@ RUN apk add --no-cache \
|
|||||||
ip6tables \
|
ip6tables \
|
||||||
kmod \
|
kmod \
|
||||||
iptables-legacy \
|
iptables-legacy \
|
||||||
|
wireguard-go \
|
||||||
wireguard-tools
|
wireguard-tools
|
||||||
|
|
||||||
# Use iptables-legacy
|
# Use iptables-legacy
|
||||||
|
|||||||
Binary file not shown.
|
Before Width: | Height: | Size: 185 KiB After Width: | Height: | Size: 167 KiB |
@@ -50,23 +50,23 @@ If a parameter is not set, it will not be added to the configuration. If all Amn
|
|||||||
|
|
||||||
## Client Applications
|
## Client Applications
|
||||||
|
|
||||||
To be able to connect to wg-easy if AmneziaWG is enabled, you must have an AmneziaWG-compatible client. Currently, only WG Tunnel and Amnezia VPN supports AmneziaWG 1.5/2.0! AmneziaWG clients require building from source code.
|
To be able to connect to wg-easy if AmneziaWG is enabled, you must have an AmneziaWG-compatible client. Where an AmneziaWG app is available for your platform, it is recommended to use it rather than Amnezia VPN.
|
||||||
|
|
||||||
Android:
|
Android:
|
||||||
|
|
||||||
- [Amnezia VPN](https://play.google.com/store/apps/details?id=org.amnezia.vpn) - Amnezia VPN Official Client
|
|
||||||
- [AmneziaWG](https://play.google.com/store/apps/details?id=org.amnezia.awg) - AmneziaWG Official Client
|
- [AmneziaWG](https://play.google.com/store/apps/details?id=org.amnezia.awg) - AmneziaWG Official Client
|
||||||
- [WG Tunnel](https://play.google.com/store/apps/details?id=com.zaneschepke.wireguardautotunnel) - Third Party Client
|
- [WG Tunnel](https://play.google.com/store/apps/details?id=com.zaneschepke.wireguardautotunnel) - Third Party Client
|
||||||
|
- [Amnezia VPN](https://play.google.com/store/apps/details?id=org.amnezia.vpn) - Amnezia VPN Official Client
|
||||||
|
|
||||||
iOS and macOS:
|
iOS and macOS:
|
||||||
|
|
||||||
- [Amnezia VPN](https://apps.apple.com/us/app/amneziavpn/id1600529900) - Amnezia VPN Official Client
|
|
||||||
- [AmneziaWG](https://apps.apple.com/us/app/amneziawg/id6478942365) - AmneziaWG Official Client
|
- [AmneziaWG](https://apps.apple.com/us/app/amneziawg/id6478942365) - AmneziaWG Official Client
|
||||||
|
- [Amnezia VPN](https://apps.apple.com/us/app/amneziavpn/id1600529900) - Amnezia VPN Official Client
|
||||||
|
|
||||||
Windows:
|
Windows:
|
||||||
|
|
||||||
|
- [AmneziaWG](https://github.com/amnezia-vpn/amneziawg-windows-client/releases) - AmneziaWG Official Client (Requires building from source code)
|
||||||
- [Amnezia VPN](https://amnezia.org/downloads) - Amnezia VPN Official Client
|
- [Amnezia VPN](https://amnezia.org/downloads) - Amnezia VPN Official Client
|
||||||
- [AmneziaWG](https://github.com/amnezia-vpn/amneziawg-windows-client/releases) - AmneziaWG Official Client
|
|
||||||
|
|
||||||
Linux:
|
Linux:
|
||||||
|
|
||||||
|
|||||||
@@ -20,7 +20,7 @@ File: `/etc/docker/containers/watchtower/docker-compose.yml`
|
|||||||
```yaml
|
```yaml
|
||||||
services:
|
services:
|
||||||
watchtower:
|
watchtower:
|
||||||
image: containrrr/watchtower:latest
|
image: nickfedor/watchtower:latest
|
||||||
volumes:
|
volumes:
|
||||||
- /var/run/docker.sock:/var/run/docker.sock
|
- /var/run/docker.sock:/var/run/docker.sock
|
||||||
env_file:
|
env_file:
|
||||||
|
|||||||
@@ -45,15 +45,15 @@ All workflows are using the tagging convention listed below. It is subsequently
|
|||||||
| tag | Type | Example | Description |
|
| tag | Type | Example | Description |
|
||||||
| ------------- | ------------------------------- | ------------------------------------------------------------- | ----------------------------------------------------------------------------- |
|
| ------------- | ------------------------------- | ------------------------------------------------------------- | ----------------------------------------------------------------------------- |
|
||||||
| `15` | latest minor for that major tag | `ghcr.io/wg-easy/wg-easy:15` | latest features for specific major versions, no breaking changes, recommended |
|
| `15` | latest minor for that major tag | `ghcr.io/wg-easy/wg-easy:15` | latest features for specific major versions, no breaking changes, recommended |
|
||||||
| `latest` | latest tag | `ghcr.io/wg-easy/wg-easy:latest` or `ghcr.io/wg-easy/wg-easy` | points to latest release, can include breaking changes |
|
|
||||||
| `15.0` | latest patch for that minor tag | `ghcr.io/wg-easy/wg-easy:15.0` | latest patches for specific minor version |
|
| `15.0` | latest patch for that minor tag | `ghcr.io/wg-easy/wg-easy:15.0` | latest patches for specific minor version |
|
||||||
| `15.0.0` | specific tag | `ghcr.io/wg-easy/wg-easy:15.0.0` | specific release, no updates |
|
| `15.0.0` | specific tag | `ghcr.io/wg-easy/wg-easy:15.0.0` | specific release, no updates |
|
||||||
| `edge` | push to `master` | `ghcr.io/wg-easy/wg-easy:edge` | mostly unstable, gets frequent package and code updates |
|
| `edge` | push to `master` | `ghcr.io/wg-easy/wg-easy:edge` | mostly unstable, gets frequent package and code updates |
|
||||||
| `development` | pull requests | `ghcr.io/wg-easy/wg-easy:development` | used for development, testing code from PRs |
|
| `development` | pull requests | `ghcr.io/wg-easy/wg-easy:development` | used for development, testing code from PRs |
|
||||||
|
| `latest` | latest tag | `ghcr.io/wg-easy/wg-easy:latest` or `ghcr.io/wg-easy/wg-easy` | points to the v14 release, should be avoided |
|
||||||
|
|
||||||
<!-- ref: major version (check links too) -->
|
<!-- ref: major version (check links too) -->
|
||||||
|
|
||||||
When publishing a tag we follow the [Semantic Versioning][semver] specification. The `latest` tag is always pointing to the latest stable release. If you want to avoid breaking changes, use the major version tag (e.g. `15`).
|
When publishing a tag we follow the [Semantic Versioning][semver] specification. Pin to the latest major version to avoid breaking changes (e.g. `15`), avoid using the `latest` tag.
|
||||||
|
|
||||||
[github-ci]: https://github.com/wg-easy/wg-easy/actions
|
[github-ci]: https://github.com/wg-easy/wg-easy/actions
|
||||||
[ghcr-image]: https://github.com/wg-easy/wg-easy/pkgs/container/wg-easy
|
[ghcr-image]: https://github.com/wg-easy/wg-easy/pkgs/container/wg-easy
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ hide:
|
|||||||
|
|
||||||
/// info | This Documentation is Versioned
|
/// info | This Documentation is Versioned
|
||||||
|
|
||||||
**Make sure** to select the correct version of this documentation! It should match the version of the image you are using. The default version corresponds to the `:latest` image tag - [the most recent stable release][docs-tagging].
|
**Make sure** to select the correct version of this documentation! It should match the version of the image you are using. The default version corresponds to [the most recent stable release][docs-tagging].
|
||||||
///
|
///
|
||||||
|
|
||||||
This documentation provides you not only with the basic setup and configuration of `wg-easy` but also with advanced configuration, elaborate usage scenarios, detailed examples, hints and more.
|
This documentation provides you not only with the basic setup and configuration of `wg-easy` but also with advanced configuration, elaborate usage scenarios, detailed examples, hints and more.
|
||||||
|
|||||||
+2
-2
@@ -11,7 +11,7 @@
|
|||||||
"format:check:docs": "prettier --check docs"
|
"format:check:docs": "prettier --check docs"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"prettier": "^3.7.4"
|
"prettier": "^3.8.1"
|
||||||
},
|
},
|
||||||
"packageManager": "pnpm@10.28.0"
|
"packageManager": "pnpm@10.29.2"
|
||||||
}
|
}
|
||||||
|
|||||||
Generated
+5
-5
@@ -9,16 +9,16 @@ importers:
|
|||||||
.:
|
.:
|
||||||
devDependencies:
|
devDependencies:
|
||||||
prettier:
|
prettier:
|
||||||
specifier: ^3.7.4
|
specifier: ^3.8.1
|
||||||
version: 3.7.4
|
version: 3.8.1
|
||||||
|
|
||||||
packages:
|
packages:
|
||||||
|
|
||||||
prettier@3.7.4:
|
prettier@3.8.1:
|
||||||
resolution: {integrity: sha512-v6UNi1+3hSlVvv8fSaoUbggEM5VErKmmpGA7Pl3HF8V6uKY7rvClBOJlH6yNwQtfTueNkGVpOv/mtWL9L4bgRA==}
|
resolution: {integrity: sha512-UOnG6LftzbdaHZcKoPFtOcCKztrQ57WkHDeRD9t/PTQtmT0NHSeWWepj6pS0z/N7+08BHFDQVUrfmfMRcZwbMg==}
|
||||||
engines: {node: '>=14'}
|
engines: {node: '>=14'}
|
||||||
hasBin: true
|
hasBin: true
|
||||||
|
|
||||||
snapshots:
|
snapshots:
|
||||||
|
|
||||||
prettier@3.7.4: {}
|
prettier@3.8.1: {}
|
||||||
|
|||||||
@@ -23,4 +23,6 @@ logs
|
|||||||
.env.*
|
.env.*
|
||||||
!.env.example
|
!.env.example
|
||||||
|
|
||||||
|
coverage/
|
||||||
|
|
||||||
wg-easy.db
|
wg-easy.db
|
||||||
|
|||||||
@@ -0,0 +1 @@
|
|||||||
|
setups.@nuxt/test-utils="3.23.0"
|
||||||
@@ -1,7 +1,7 @@
|
|||||||
<template>
|
<template>
|
||||||
<ClientCardCharts :client="client" />
|
<ClientCardCharts :client="client" />
|
||||||
<div
|
<div
|
||||||
class="relative z-10 flex flex-col justify-between gap-3 px-3 py-3 sm:flex-row md:py-5"
|
class="relative flex flex-col justify-between gap-3 px-3 py-3 sm:flex-row md:py-5"
|
||||||
>
|
>
|
||||||
<div class="flex w-full items-center gap-3 md:gap-4">
|
<div class="flex w-full items-center gap-3 md:gap-4">
|
||||||
<ClientCardAvatar :client="client" />
|
<ClientCardAvatar :client="client" />
|
||||||
|
|||||||
@@ -7,7 +7,7 @@
|
|||||||
href="https://github.com/wg-easy/wg-easy"
|
href="https://github.com/wg-easy/wg-easy"
|
||||||
>WireGuard Easy</a
|
>WireGuard Easy</a
|
||||||
>
|
>
|
||||||
({{ globalStore.information?.currentRelease }}) © 2021-2025 by
|
({{ globalStore.information?.currentRelease }}) © 2021-2026 by
|
||||||
<a
|
<a
|
||||||
class="hover:underline"
|
class="hover:underline"
|
||||||
target="_blank"
|
target="_blank"
|
||||||
|
|||||||
@@ -66,10 +66,11 @@ export const useClientsStore = defineStore('Clients', () => {
|
|||||||
const clientPersist = clientsPersist.value[client.id]!;
|
const clientPersist = clientsPersist.value[client.id]!;
|
||||||
|
|
||||||
// Debug
|
// Debug
|
||||||
// client.transferRx = this.clientsPersist[client.id].transferRxPrevious + Math.random() * 1000;
|
/* client.transferRx =
|
||||||
// client.transferTx = this.clientsPersist[client.id].transferTxPrevious + Math.random() * 1000;
|
clientPersist.transferRxPrevious + Math.random() * 1000;
|
||||||
// client.latestHandshakeAt = new Date();
|
client.transferTx =
|
||||||
// this.requiresPassword = true;
|
clientPersist.transferTxPrevious + Math.random() * 1000;
|
||||||
|
client.latestHandshakeAt = new Date().toISOString(); */
|
||||||
|
|
||||||
clientPersist.transferRxCurrent =
|
clientPersist.transferRxCurrent =
|
||||||
(client.transferRx ?? 0) - clientPersist.transferRxPrevious;
|
(client.transferRx ?? 0) - clientPersist.transferRxPrevious;
|
||||||
|
|||||||
+3
-1
@@ -18,7 +18,7 @@ const db = drizzle({ client, schema });
|
|||||||
const dbAdminReset = defineCommand({
|
const dbAdminReset = defineCommand({
|
||||||
meta: {
|
meta: {
|
||||||
name: 'db:admin:reset',
|
name: 'db:admin:reset',
|
||||||
description: 'Reset the admin user',
|
description: 'Reset the admin user password and TOTP settings',
|
||||||
},
|
},
|
||||||
args: {
|
args: {
|
||||||
password: {
|
password: {
|
||||||
@@ -61,6 +61,8 @@ const dbAdminReset = defineCommand({
|
|||||||
.update(schema.user)
|
.update(schema.user)
|
||||||
.set({
|
.set({
|
||||||
password: hash,
|
password: hash,
|
||||||
|
totpVerified: false,
|
||||||
|
totpKey: null,
|
||||||
})
|
})
|
||||||
.where(eq(schema.user.id, 1));
|
.where(eq(schema.user.id, 1));
|
||||||
|
|
||||||
|
|||||||
@@ -14,6 +14,10 @@ import ptbr from './locales/pt-BR.json';
|
|||||||
import tr from './locales/tr.json';
|
import tr from './locales/tr.json';
|
||||||
import bn from './locales/bn.json';
|
import bn from './locales/bn.json';
|
||||||
import id from './locales/id.json';
|
import id from './locales/id.json';
|
||||||
|
import nl from './locales/nl.json';
|
||||||
|
import nb from './locales/nb.json';
|
||||||
|
import bg from './locales/bg.json';
|
||||||
|
import gl from './locales/gl.json';
|
||||||
|
|
||||||
export default defineI18nConfig(() => ({
|
export default defineI18nConfig(() => ({
|
||||||
legacy: false,
|
legacy: false,
|
||||||
@@ -35,5 +39,9 @@ export default defineI18nConfig(() => ({
|
|||||||
tr,
|
tr,
|
||||||
bn,
|
bn,
|
||||||
id,
|
id,
|
||||||
|
nl,
|
||||||
|
nb,
|
||||||
|
bg,
|
||||||
|
gl,
|
||||||
},
|
},
|
||||||
}));
|
}));
|
||||||
|
|||||||
@@ -0,0 +1,286 @@
|
|||||||
|
{
|
||||||
|
"pages": {
|
||||||
|
"me": "Профил",
|
||||||
|
"clients": "Клиенти",
|
||||||
|
"admin": {
|
||||||
|
"panel": "Админ Панел",
|
||||||
|
"general": "Общи",
|
||||||
|
"config": "Конфигурация",
|
||||||
|
"interface": "Интерфейс",
|
||||||
|
"hooks": "Hooks"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"user": {
|
||||||
|
"email": "Имейл"
|
||||||
|
},
|
||||||
|
"me": {
|
||||||
|
"currentPassword": "Текуща парола",
|
||||||
|
"enable2fa": "Активирай двуфакторна автентикация",
|
||||||
|
"enable2faDesc": "Сканирай QR кода с твоето приложение за автентикатор или въведи ключа ръчно.",
|
||||||
|
"2faKey": "TOTP ключ",
|
||||||
|
"2faCodeDesc": "Въведи кода от твоето приложение за автентикатор.",
|
||||||
|
"disable2fa": "Деактивирай двуфакторна автентикация",
|
||||||
|
"disable2faDesc": "Въведи паролата си, за да деактивираш двуфакторната автентикация."
|
||||||
|
},
|
||||||
|
"general": {
|
||||||
|
"name": "Име",
|
||||||
|
"username": "Потребителско име",
|
||||||
|
"password": "Парола",
|
||||||
|
"newPassword": "Нова парола",
|
||||||
|
"updatePassword": "Обнови парола",
|
||||||
|
"mtu": "MTU",
|
||||||
|
"allowedIps": "Разрешени IP-та",
|
||||||
|
"dns": "DNS",
|
||||||
|
"persistentKeepalive": "Постоянно поддържане на връзката",
|
||||||
|
"logout": "Изход",
|
||||||
|
"continue": "Продължи",
|
||||||
|
"host": "Хост",
|
||||||
|
"port": "Порт",
|
||||||
|
"yes": "Да",
|
||||||
|
"no": "Не",
|
||||||
|
"confirmPassword": "Потвърди парола",
|
||||||
|
"loading": "Зареждане...",
|
||||||
|
"2fa": "Двуфакторна автентикация",
|
||||||
|
"2faCode": "TOTP код"
|
||||||
|
},
|
||||||
|
"setup": {
|
||||||
|
"welcome": "Добре дошъл в първоначалната настройка на wg-easy",
|
||||||
|
"welcomeDesc": "Откри най-лесния начин да инсталираш и управляваш WireGuard на всеки Linux сървър",
|
||||||
|
"existingSetup": "Имаш ли вече съществуваща инсталация?",
|
||||||
|
"createAdminDesc": "Моля, първо въведи администраторско потребителско име и силна сигурна парола. Тези данни ще се използват за вход в административния панел.",
|
||||||
|
"setupConfigDesc": "Моля, въведи хост и порт. Тази информация ще се използва при генериране на клиентски конфигурации за WireGuard.",
|
||||||
|
"setupMigrationDesc": "Ако желаеш да мигрираш данните от предишна версия на wg-easy, качи резервното копие.",
|
||||||
|
"upload": "Качи",
|
||||||
|
"migration": "Възстанови от резервно копие:",
|
||||||
|
"createAccount": "Създай акаунт",
|
||||||
|
"successful": "Настройката е успешна",
|
||||||
|
"hostDesc": "Публично име/адрес, към който клиентите ще се свързват",
|
||||||
|
"portDesc": "Публичен UDP порт, на който клиентите ще се свързват и на който WireGuard слуша"
|
||||||
|
},
|
||||||
|
"update": {
|
||||||
|
"updateAvailable": "Налична е актуализация!",
|
||||||
|
"update": "Актуализирай"
|
||||||
|
},
|
||||||
|
"theme": {
|
||||||
|
"dark": "Тъмна тема",
|
||||||
|
"light": "Светла тема",
|
||||||
|
"system": "Системна тема"
|
||||||
|
},
|
||||||
|
"layout": {
|
||||||
|
"toggleCharts": "Покажи/скрий графики",
|
||||||
|
"donate": "Дарение"
|
||||||
|
},
|
||||||
|
"login": {
|
||||||
|
"signIn": "Вход",
|
||||||
|
"rememberMe": "Запомни ме",
|
||||||
|
"rememberMeDesc": "Остани влязъл след затваряне на браузъра",
|
||||||
|
"insecure": "Не можеш да влезеш през несигурна връзка. Използвай HTTPS.",
|
||||||
|
"2faRequired": "Изисква се двуфакторна автентикация",
|
||||||
|
"2faWrong": "Грешен код за двуфакторна автентикация"
|
||||||
|
},
|
||||||
|
"client": {
|
||||||
|
"empty": "Все още няма клиенти.",
|
||||||
|
"newShort": "Нов",
|
||||||
|
"sort": "Сортирай",
|
||||||
|
"create": "Създай клиент",
|
||||||
|
"created": "Клиентът е създаден",
|
||||||
|
"new": "Нов клиент",
|
||||||
|
"name": "Име",
|
||||||
|
"expireDate": "Дата на изтичане",
|
||||||
|
"expireDateDesc": "Дата, след която клиентът ще бъде деактивиран. Празно = постоянен",
|
||||||
|
"delete": "Изтрий",
|
||||||
|
"deleteClient": "Изтрий клиент",
|
||||||
|
"deleteDialog1": "Сигурен ли си, че искаш да изтриеш",
|
||||||
|
"deleteDialog2": "Това действие е необратимо.",
|
||||||
|
"enabled": "Активен",
|
||||||
|
"address": "Адрес",
|
||||||
|
"serverAllowedIps": "Разрешени IP-та от сървъра",
|
||||||
|
"otlDesc": "Генерирай кратък еднократен линк",
|
||||||
|
"permanent": "Постоянно",
|
||||||
|
"createdOn": "Създаден на ",
|
||||||
|
"lastSeen": "Последно видян на ",
|
||||||
|
"totalDownload": "Общо изтеглени: ",
|
||||||
|
"totalUpload": "Общо качени: ",
|
||||||
|
"newClient": "Нов клиент",
|
||||||
|
"disableClient": "Деактивирай клиент",
|
||||||
|
"enableClient": "Активирай клиент",
|
||||||
|
"noPrivKey": "Този клиент няма известен частен ключ. Не може да се създаде конфигурация.",
|
||||||
|
"showQR": "Покажи QR код",
|
||||||
|
"downloadConfig": "Изтегли конфигурация",
|
||||||
|
"allowedIpsDesc": "Кои IP-та ще се насочват през VPN (замества глобалната настройка)",
|
||||||
|
"serverAllowedIpsDesc": "Кои IP-та сървърът ще насочва към клиента",
|
||||||
|
"mtuDesc": "Задава максималния размер на пакета (MTU) за VPN тунела",
|
||||||
|
"persistentKeepaliveDesc": "Интервал (в секунди) за изпращане на keep-alive пакети. 0 = изключено",
|
||||||
|
"hooks": "Hooks",
|
||||||
|
"hooksDescription": "Hooks работят само с wg-quick",
|
||||||
|
"hooksLeaveEmpty": "Само за wg-quick. В противен случай остави празно",
|
||||||
|
"dnsDesc": "DNS сървър, който клиентите ще използват (замества глобалната настройка)",
|
||||||
|
"notConnected": "Клиентът не е свързан",
|
||||||
|
"endpoint": "Крайна точка",
|
||||||
|
"endpointDesc": "IP адресът на клиента, от който е установена WireGuard връзката",
|
||||||
|
"search": "Търси клиенти...",
|
||||||
|
"config": "Конфигурация",
|
||||||
|
"viewConfig": "Прегледай конфигурацията"
|
||||||
|
},
|
||||||
|
"dialog": {
|
||||||
|
"change": "Промени",
|
||||||
|
"cancel": "Отказ",
|
||||||
|
"create": "Създай"
|
||||||
|
},
|
||||||
|
"toast": {
|
||||||
|
"success": "Успех",
|
||||||
|
"saved": "Запазено",
|
||||||
|
"error": "Грешка"
|
||||||
|
},
|
||||||
|
"form": {
|
||||||
|
"actions": "Действия",
|
||||||
|
"save": "Запази",
|
||||||
|
"revert": "Отмени промените",
|
||||||
|
"sectionGeneral": "Общи",
|
||||||
|
"sectionAdvanced": "Разширени",
|
||||||
|
"noItems": "Няма елементи",
|
||||||
|
"nullNoItems": "Няма елементи. Използва се глобалната конфигурация",
|
||||||
|
"add": "Добави"
|
||||||
|
},
|
||||||
|
"admin": {
|
||||||
|
"general": {
|
||||||
|
"sessionTimeout": "Време на сесията",
|
||||||
|
"sessionTimeoutDesc": "Продължителност на сесията при „Запомни ме“ (в секунди)",
|
||||||
|
"metrics": "Метрики",
|
||||||
|
"metricsPassword": "Парола",
|
||||||
|
"metricsPasswordDesc": "Bearer парола за достъп до metrics ендпойнт (парола или argon2 хеш)",
|
||||||
|
"json": "JSON",
|
||||||
|
"jsonDesc": "Път за метрики в JSON формат",
|
||||||
|
"prometheus": "Prometheus",
|
||||||
|
"prometheusDesc": "Път за Prometheus метрики"
|
||||||
|
},
|
||||||
|
"config": {
|
||||||
|
"connection": "Връзка",
|
||||||
|
"hostDesc": "Публично име/адрес за клиентите (инвалидира конфигурациите)",
|
||||||
|
"portDesc": "Публичен UDP порт за клиентите (инвалидира конфигурациите; вероятно искаш да смениш и порта на интерфейса)",
|
||||||
|
"allowedIpsDesc": "Разрешени IP-та за клиентите (глобална настройка)",
|
||||||
|
"dnsDesc": "DNS сървър за клиентите (глобална настройка)",
|
||||||
|
"mtuDesc": "MTU, който ще ползват клиентите (само за нови клиенти)",
|
||||||
|
"persistentKeepaliveDesc": "Интервал в секунди за keep-alive към сървъра. 0 = изключено (само за нови клиенти)",
|
||||||
|
"suggest": "Предложи",
|
||||||
|
"suggestDesc": "Избери IP адрес или хост за полето Host"
|
||||||
|
},
|
||||||
|
"interface": {
|
||||||
|
"cidrSuccess": "CIDR променен",
|
||||||
|
"device": "Устройство",
|
||||||
|
"deviceDesc": "Мрежово устройство, през което да се препраща WireGuard трафикът",
|
||||||
|
"mtuDesc": "MTU, който ще ползва WireGuard",
|
||||||
|
"portDesc": "UDP порт, на който слуша WireGuard (вероятно искаш да смениш и порта в Config)",
|
||||||
|
"changeCidr": "Смени CIDR",
|
||||||
|
"restart": "Рестартирай интерфейс",
|
||||||
|
"restartDesc": "Рестартиране на WireGuard интерфейса",
|
||||||
|
"restartWarn": "Сигурен ли си, че искаш да рестартираш интерфейса? Всички клиенти ще бъдат изключени.",
|
||||||
|
"restartSuccess": "Интерфейсът е рестартиран"
|
||||||
|
},
|
||||||
|
"introText": "Добре дошъл в административния панел.\n\nТук можеш да управляваш общите настройки, конфигурацията, настройките на интерфейса и hooks.\n\nЗапочни, като избереш някоя от секциите в страничното меню."
|
||||||
|
},
|
||||||
|
"zod": {
|
||||||
|
"generic": {
|
||||||
|
"required": "{0} е задължително",
|
||||||
|
"validNumber": "{0} трябва да е валидно число",
|
||||||
|
"validString": "{0} трябва да е валиден текст",
|
||||||
|
"validBoolean": "{0} трябва да е валидна булева стойност",
|
||||||
|
"validArray": "{0} трябва да е валиден масив",
|
||||||
|
"stringMin": "{0} трябва да съдържа поне {1} символа",
|
||||||
|
"numberMin": "{0} трябва да е поне {1}"
|
||||||
|
},
|
||||||
|
"client": {
|
||||||
|
"id": "ID на клиента",
|
||||||
|
"name": "Име",
|
||||||
|
"expiresAt": "Изтича на",
|
||||||
|
"address4": "IPv4 адрес",
|
||||||
|
"address6": "IPv6 адрес",
|
||||||
|
"serverAllowedIps": "Разрешени IP-та от сървъра"
|
||||||
|
},
|
||||||
|
"user": {
|
||||||
|
"username": "Потребителско име",
|
||||||
|
"password": "Парола",
|
||||||
|
"remember": "Запомни",
|
||||||
|
"name": "Име",
|
||||||
|
"email": "Имейл",
|
||||||
|
"emailInvalid": "Имейлът трябва да е валиден",
|
||||||
|
"passwordMatch": "Паролите трябва да съвпадат",
|
||||||
|
"totpEnable": "Активиране на TOTP",
|
||||||
|
"totpEnableTrue": "TOTP Enable трябва да е true",
|
||||||
|
"totpCode": "TOTP код"
|
||||||
|
},
|
||||||
|
"userConfig": {
|
||||||
|
"host": "Хост"
|
||||||
|
},
|
||||||
|
"general": {
|
||||||
|
"sessionTimeout": "Време на сесията",
|
||||||
|
"metricsEnabled": "Метрики",
|
||||||
|
"metricsPassword": "Парола за метрики"
|
||||||
|
},
|
||||||
|
"interface": {
|
||||||
|
"cidr": "CIDR",
|
||||||
|
"device": "Устройство",
|
||||||
|
"cidrValid": "CIDR трябва да е валиден"
|
||||||
|
},
|
||||||
|
"otl": "Еднократен линк",
|
||||||
|
"stringMalformed": "Невалиден формат на низа",
|
||||||
|
"body": "Тялото трябва да е валиден обект",
|
||||||
|
"hook": "Hook",
|
||||||
|
"enabled": "Активиран",
|
||||||
|
"mtu": "MTU",
|
||||||
|
"port": "Порт",
|
||||||
|
"persistentKeepalive": "Постоянно поддържане на връзката",
|
||||||
|
"address": "IP адрес",
|
||||||
|
"dns": "DNS",
|
||||||
|
"allowedIps": "Разрешени IP-та",
|
||||||
|
"file": "Файл"
|
||||||
|
},
|
||||||
|
"hooks": {
|
||||||
|
"preUp": "PreUp",
|
||||||
|
"postUp": "PostUp",
|
||||||
|
"preDown": "PreDown",
|
||||||
|
"postDown": "PostDown"
|
||||||
|
},
|
||||||
|
"copy": {
|
||||||
|
"notSupported": "Копиране не се поддържа",
|
||||||
|
"copied": "Копирано!",
|
||||||
|
"failed": "Копирането неуспешно",
|
||||||
|
"copy": "Копирай"
|
||||||
|
},
|
||||||
|
"awg": {
|
||||||
|
"jCLabel": "Брой junk пакети (Jc)",
|
||||||
|
"jCDescription": "Брой junk пакети за изпращане (1–128, препоръчително: 4–12)",
|
||||||
|
"jMinLabel": "Минимален размер на junk пакети (Jmin)",
|
||||||
|
"jMinDescription": "Минимален размер на junk пакетите (0–1279*, препоръчително: 8, трябва да е < Jmax)",
|
||||||
|
"jMaxLabel": "Максимален размер на junk пакети (Jmax)",
|
||||||
|
"jMaxDescription": "Максимален размер на junk пакетите (1–1280*, препоръчително: 80, трябва да е > Jmin)",
|
||||||
|
"s1Label": "Размер на junk в init пакета (S1)",
|
||||||
|
"s1Description": "Размер на junk в init пакета (0–1132 [1280*−148=1132], препоръчително: 15–150, S1+56 ≠ S2)",
|
||||||
|
"s2Label": "Размер на junk в отговорния пакет (S2)",
|
||||||
|
"s2Description": "Размер на junk в response пакета (0–1188 [1280*−92=1188], препоръчително: 15–150)",
|
||||||
|
"s3Label": "Размер на junk в cookie reply пакета (S3)",
|
||||||
|
"s3Description": "Размер на junk в cookie reply пакета",
|
||||||
|
"s4Label": "Размер на junk в транспортния пакет (S4)",
|
||||||
|
"s4Description": "Размер на junk в транспортния пакет",
|
||||||
|
"i1Label": "Специален junk пакет 1 (I1)",
|
||||||
|
"i1Description": "Пакет за имитация на протокол в hex формат: <b 0x...>",
|
||||||
|
"i2Label": "Специален junk пакет 2 (I2)",
|
||||||
|
"i2Description": "Пакет за имитация на протокол в hex формат: <b 0x...>",
|
||||||
|
"i3Label": "Специален junk пакет 3 (I3)",
|
||||||
|
"i3Description": "Пакет за имитация на протокол в hex формат: <b 0x...>",
|
||||||
|
"i4Label": "Специален junk пакет 4 (I4)",
|
||||||
|
"i4Description": "Пакет за имитация на протокол в hex формат: <b 0x...>",
|
||||||
|
"i5Label": "Специален junk пакет 5 (I5)",
|
||||||
|
"i5Description": "Пакет за имитация на протокол в hex формат: <b 0x...>",
|
||||||
|
"h1Label": "Init magic header (H1)",
|
||||||
|
"h1Description": "Стойност на хедера в init пакета (5–2147483647, уникална спрямо H2–H4)",
|
||||||
|
"h2Label": "Response magic header (H2)",
|
||||||
|
"h2Description": "Стойност на хедера в response пакета (5–2147483647, уникална спрямо H1, H3, H4)",
|
||||||
|
"h3Label": "Cookie reply magic header (H3)",
|
||||||
|
"h3Description": "Стойност на хедера в cookie reply пакета (5–2147483647, уникална спрямо H1, H2, H4)",
|
||||||
|
"h4Label": "Transport magic header (H4)",
|
||||||
|
"h4Description": "Стойност на хедера в транспортния пакет (5–2147483647, уникална спрямо H1–H3)",
|
||||||
|
"mtuNote": "Стойностите зависят от MTU",
|
||||||
|
"obfuscationParameters": "Параметри за обфускация на AmneziaWG"
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,145 @@
|
|||||||
|
{
|
||||||
|
"pages": {
|
||||||
|
"me": "Conta",
|
||||||
|
"clients": "Clientes",
|
||||||
|
"admin": {
|
||||||
|
"panel": "Panel de administración",
|
||||||
|
"general": "Xeral",
|
||||||
|
"config": "Configuración",
|
||||||
|
"interface": "Interface",
|
||||||
|
"hooks": "Hooks"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"user": {
|
||||||
|
"email": "Correo electrónico"
|
||||||
|
},
|
||||||
|
"me": {
|
||||||
|
"currentPassword": "Contrasinal actual",
|
||||||
|
"enable2fa": "Activar a autenticación de dobre factor",
|
||||||
|
"enable2faDesc": "Escanea o código QR coa túa aplicación de autenticación ou introduce a chave manualmente.",
|
||||||
|
"2faKey": "Chave TOTP",
|
||||||
|
"2faCodeDesc": "Introduce o código da túa aplicación de autenticación.",
|
||||||
|
"disable2fa": "Desactivar a autenticación de dobre factor",
|
||||||
|
"disable2faDesc": "Introduce o teu contrasinal para desactivar a autenticación de dobre factor."
|
||||||
|
},
|
||||||
|
"general": {
|
||||||
|
"name": "Nome",
|
||||||
|
"username": "Nome de usuario",
|
||||||
|
"password": "Contrasinal",
|
||||||
|
"newPassword": "Novo contrasinal",
|
||||||
|
"updatePassword": "Actualizar contrasinal",
|
||||||
|
"mtu": "MTU",
|
||||||
|
"allowedIps": "IP permitidas",
|
||||||
|
"dns": "DNS",
|
||||||
|
"persistentKeepalive": "Keepalive persistente",
|
||||||
|
"logout": "Pechar sesión",
|
||||||
|
"continue": "Continuar",
|
||||||
|
"host": "Host",
|
||||||
|
"port": "Porto",
|
||||||
|
"yes": "Si",
|
||||||
|
"no": "Non",
|
||||||
|
"confirmPassword": "Confirmar o contrasinal",
|
||||||
|
"loading": "Cargando...",
|
||||||
|
"2fa": "Autenticación de dobre factor",
|
||||||
|
"2faCode": "Código TOTP"
|
||||||
|
},
|
||||||
|
"setup": {
|
||||||
|
"welcome": "Benvido á túa primeira configuración de wg-easy",
|
||||||
|
"welcomeDesc": "Atopaches a forma máis doada de instalar e xestionar WireGuard en calquera sistema Linux",
|
||||||
|
"existingSetup": "Tes unha configuración existente?",
|
||||||
|
"createAdminDesc": "Por favor, introduce primeiro un usuario administrador cun contrasinal seguro. Esta información empregarase para acceder ao panel de administración.",
|
||||||
|
"setupConfigDesc": "Por favor, introduce a información do host e do porto. Isto empregarase para a configuración dos clientes ao configurar WireGuard nos seus dispositivos.",
|
||||||
|
"setupMigrationDesc": "Por favor, fornece o ficheiro da copia de seguridade se queres migrar os datos da túa versión anterior de wg-easy á nova configuración.",
|
||||||
|
"upload": "Subir",
|
||||||
|
"migration": "Recuperar a copia de seguridade:",
|
||||||
|
"createAccount": "Crear conta",
|
||||||
|
"successful": "Configuración completada con éxito",
|
||||||
|
"hostDesc": "Nome de host público ao que se conectarán os clientes",
|
||||||
|
"portDesc": "Porto UDP público ao que se conectarán os clientes e no que escoitará WireGuard"
|
||||||
|
},
|
||||||
|
"update": {
|
||||||
|
"updateAvailable": "Hai unha actualización dispoñible!",
|
||||||
|
"update": "Actualizar"
|
||||||
|
},
|
||||||
|
"theme": {
|
||||||
|
"dark": "Tema escuro",
|
||||||
|
"light": "Tema claro",
|
||||||
|
"system": "Tema do sistema"
|
||||||
|
},
|
||||||
|
"layout": {
|
||||||
|
"toggleCharts": "Amosar/Ocultar gráficas",
|
||||||
|
"donate": "Doar"
|
||||||
|
},
|
||||||
|
"login": {
|
||||||
|
"signIn": "Iniciar sesión",
|
||||||
|
"rememberMe": "Lembrarme",
|
||||||
|
"rememberMeDesc": "Manter a sesión iniciada ao pechar o navegador",
|
||||||
|
"insecure": "Non podes iniciar sesión cunha conexión insegura. Usa HTTPS.",
|
||||||
|
"2faRequired": "É necesaria a autenticación de dobre factor",
|
||||||
|
"2faWrong": "A autenticación de dobre factor é incorrecta"
|
||||||
|
},
|
||||||
|
"client": {
|
||||||
|
"empty": "Aínda non hai clientes.",
|
||||||
|
"newShort": "Novo",
|
||||||
|
"sort": "Ordenar",
|
||||||
|
"create": "Crear cliente",
|
||||||
|
"created": "Cliente creado",
|
||||||
|
"new": "Novo cliente",
|
||||||
|
"name": "Nome",
|
||||||
|
"expireDate": "Data de caducidade",
|
||||||
|
"expireDateDesc": "Data na que o cliente será desactivado. Déixao en branco para permanente",
|
||||||
|
"delete": "Eliminar",
|
||||||
|
"deleteClient": "Eliminar cliente",
|
||||||
|
"deleteDialog1": "Seguro que queres eliminar",
|
||||||
|
"deleteDialog2": "Esta acción non se pode desfacer.",
|
||||||
|
"enabled": "Activado",
|
||||||
|
"address": "Enderezo",
|
||||||
|
"serverAllowedIps": "IP permitidas polo servidor",
|
||||||
|
"otlDesc": "Xerar ligazón curta dun só uso",
|
||||||
|
"permanent": "Permanente",
|
||||||
|
"createdOn": "Creado o ",
|
||||||
|
"lastSeen": "Visto por última vez o ",
|
||||||
|
"totalDownload": "Descarga total: ",
|
||||||
|
"totalUpload": "Subida total: ",
|
||||||
|
"newClient": "Novo cliente",
|
||||||
|
"disableClient": "Desactivar cliente",
|
||||||
|
"enableClient": "Activar cliente",
|
||||||
|
"noPrivKey": "Este cliente non ten unha chave privada coñecida. Non se pode crear a configuración.",
|
||||||
|
"showQR": "Amosar código QR",
|
||||||
|
"downloadConfig": "Descargar configuración",
|
||||||
|
"allowedIpsDesc": "IP que se encamiñarán a través da VPN (sobrescribe a configuración global)",
|
||||||
|
"serverAllowedIpsDesc": "IP que o servidor encamiñará ao cliente",
|
||||||
|
"mtuDesc": "Define a unidade máxima de transmisión (tamaño do paquete) para o túnel VPN",
|
||||||
|
"persistentKeepaliveDesc": "Define o intervalo (en segundos) para os paquetes keep-alive. 0 desactívaos",
|
||||||
|
"hooks": "Hooks",
|
||||||
|
"hooksDescription": "Os hooks só funcionan con wg-quick",
|
||||||
|
"hooksLeaveEmpty": "Só para wg-quick. Noutro caso, déixao baleiro",
|
||||||
|
"dnsDesc": "Servidor DNS que empregarán os clientes (sobrescribe a configuración global)",
|
||||||
|
"notConnected": "Cliente non conectado",
|
||||||
|
"endpoint": "Punto final",
|
||||||
|
"endpointDesc": "IP do cliente desde a que se establece a conexión WireGuard",
|
||||||
|
"search": "Buscar clientes...",
|
||||||
|
"config": "Configuración",
|
||||||
|
"viewConfig": "Ver configuración"
|
||||||
|
},
|
||||||
|
"dialog": {
|
||||||
|
"change": "Cambiar",
|
||||||
|
"cancel": "Cancelar",
|
||||||
|
"create": "Crear"
|
||||||
|
},
|
||||||
|
"toast": {
|
||||||
|
"success": "Éxito",
|
||||||
|
"saved": "Gardado",
|
||||||
|
"error": "Erro"
|
||||||
|
},
|
||||||
|
"form": {
|
||||||
|
"actions": "Accións",
|
||||||
|
"save": "Gardar",
|
||||||
|
"revert": "Reverter",
|
||||||
|
"sectionGeneral": "Xeral",
|
||||||
|
"sectionAdvanced": "Avanzado",
|
||||||
|
"noItems": "Sen elementos",
|
||||||
|
"nullNoItems": "Sen elementos. Usando a configuración global",
|
||||||
|
"add": "Engadir"
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,286 @@
|
|||||||
|
{
|
||||||
|
"pages": {
|
||||||
|
"me": "Konto",
|
||||||
|
"clients": "Klienter",
|
||||||
|
"admin": {
|
||||||
|
"panel": "Adminpanel",
|
||||||
|
"general": "Generelt",
|
||||||
|
"config": "Oppsett",
|
||||||
|
"interface": "Grensesnitt",
|
||||||
|
"hooks": "Hooks"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"user": {
|
||||||
|
"email": "E-post"
|
||||||
|
},
|
||||||
|
"me": {
|
||||||
|
"currentPassword": "Nåværende passord",
|
||||||
|
"enable2fa": "Aktiver tofaktorautentisering",
|
||||||
|
"enable2faDesc": "Skann QR-koden med autentiseringsappen din eller skriv inn nøkkelen manuelt.",
|
||||||
|
"2faKey": "TOTP-nøkkel",
|
||||||
|
"2faCodeDesc": "Skriv inn koden fra autentiseringsappen din.",
|
||||||
|
"disable2fa": "Deaktiver tofaktorautentisering",
|
||||||
|
"disable2faDesc": "Skriv inn passordet ditt for å deaktivere tofaktorautentisering."
|
||||||
|
},
|
||||||
|
"general": {
|
||||||
|
"name": "Navn",
|
||||||
|
"username": "Brukernavn",
|
||||||
|
"password": "Passord",
|
||||||
|
"newPassword": "Nytt passord",
|
||||||
|
"updatePassword": "Oppdater passord",
|
||||||
|
"mtu": "MTU",
|
||||||
|
"allowedIps": "Tillatte IP-er",
|
||||||
|
"dns": "DNS",
|
||||||
|
"persistentKeepalive": "Vedvarende keepalive",
|
||||||
|
"logout": "Logg ut",
|
||||||
|
"continue": "Fortsett",
|
||||||
|
"host": "Vert",
|
||||||
|
"port": "Port",
|
||||||
|
"yes": "Ja",
|
||||||
|
"no": "Nei",
|
||||||
|
"confirmPassword": "Bekreft passord",
|
||||||
|
"loading": "Laster...",
|
||||||
|
"2fa": "Tofaktorautentisering",
|
||||||
|
"2faCode": "TOTP-kode"
|
||||||
|
},
|
||||||
|
"setup": {
|
||||||
|
"welcome": "Velkommen til ditt oppsett av wg-easy",
|
||||||
|
"welcomeDesc": "Du har funnet den enkleste måten å installere og administrere WireGuard på en hvilken som helst Linux-vert",
|
||||||
|
"existingSetup": "Har du et eksisterende oppsett?",
|
||||||
|
"createAdminDesc": "Skriv først inn et adminbrukernavn og et sterkt, sikkert passord. Denne informasjonen brukes til å logge inn i administrasjonspanelet.",
|
||||||
|
"setupConfigDesc": "Skriv inn vert- og portinformasjon. Dette brukes til klientkonfigurasjonen når du setter opp WireGuard på enhetene deres.",
|
||||||
|
"setupMigrationDesc": "Oppgi sikkerhetskopifilen hvis du vil migrere dataene dine fra forrige wg-easy-versjon til det nye oppsettet.",
|
||||||
|
"upload": "Last opp",
|
||||||
|
"migration": "Gjenopprett sikkerhetskopien:",
|
||||||
|
"createAccount": "Opprett konto",
|
||||||
|
"successful": "Oppsett vellykket",
|
||||||
|
"hostDesc": "Offentlig vertsnavn klienter vil koble seg til",
|
||||||
|
"portDesc": "Offentlig UDP-port klienter vil koble til og WireGuard vil lytte på"
|
||||||
|
},
|
||||||
|
"update": {
|
||||||
|
"updateAvailable": "En oppdatering er tilgjengelig!",
|
||||||
|
"update": "Oppdater"
|
||||||
|
},
|
||||||
|
"theme": {
|
||||||
|
"dark": "Mørkt tema",
|
||||||
|
"light": "Lyst tema",
|
||||||
|
"system": "Systemtema"
|
||||||
|
},
|
||||||
|
"layout": {
|
||||||
|
"toggleCharts": "Vis/skjul diagrammer",
|
||||||
|
"donate": "Doner"
|
||||||
|
},
|
||||||
|
"login": {
|
||||||
|
"signIn": "Logg inn",
|
||||||
|
"rememberMe": "Husk meg",
|
||||||
|
"rememberMeDesc": "Hold deg innlogget etter at nettleseren lukkes",
|
||||||
|
"insecure": "Du kan ikke logge inn med en usikker tilkobling. Bruk HTTPS.",
|
||||||
|
"2faRequired": "Tofaktorautentisering er påkrevd",
|
||||||
|
"2faWrong": "Tofaktorautentisering er feil"
|
||||||
|
},
|
||||||
|
"client": {
|
||||||
|
"empty": "Det finnes ingen klienter ennå.",
|
||||||
|
"newShort": "Ny",
|
||||||
|
"sort": "Sorter",
|
||||||
|
"create": "Opprett klient",
|
||||||
|
"created": "Klient opprettet",
|
||||||
|
"new": "Ny klient",
|
||||||
|
"name": "Navn",
|
||||||
|
"expireDate": "Utløpsdato",
|
||||||
|
"expireDateDesc": "Datoen klienten blir deaktivert. Tomt for permanent",
|
||||||
|
"delete": "Slett",
|
||||||
|
"deleteClient": "Slett klient",
|
||||||
|
"deleteDialog1": "Er du sikker på at du vil slette",
|
||||||
|
"deleteDialog2": "Denne handlingen kan ikke angres.",
|
||||||
|
"enabled": "Aktivert",
|
||||||
|
"address": "Adresse",
|
||||||
|
"serverAllowedIps": "Server tillatte IP-er",
|
||||||
|
"otlDesc": "Generer kort engangslenke",
|
||||||
|
"permanent": "Permanent",
|
||||||
|
"createdOn": "Opprettet ",
|
||||||
|
"lastSeen": "Sist sett ",
|
||||||
|
"totalDownload": "Totalt nedlastet: ",
|
||||||
|
"totalUpload": "Totalt opplastet: ",
|
||||||
|
"newClient": "Ny klient",
|
||||||
|
"disableClient": "Deaktiver klient",
|
||||||
|
"enableClient": "Aktiver klient",
|
||||||
|
"noPrivKey": "Denne klienten har ingen kjent privat nøkkel. Kan ikke opprette konfigurasjon.",
|
||||||
|
"showQR": "Vis QR-kode",
|
||||||
|
"downloadConfig": "Last ned konfigurasjon",
|
||||||
|
"allowedIpsDesc": "Hvilke IP-er som rutes gjennom VPN (overstyrer global konfig)",
|
||||||
|
"serverAllowedIpsDesc": "Hvilke IP-er serveren ruter til klienten",
|
||||||
|
"mtuDesc": "Setter maksimal overføringsenhet (pakkestørrelse) for VPN-tunnelen",
|
||||||
|
"persistentKeepaliveDesc": "Setter intervallet (i sekunder) for keepalive-pakker. 0 deaktiverer det",
|
||||||
|
"hooks": "Hooks",
|
||||||
|
"hooksDescription": "Hooks fungerer bare med wg-quick",
|
||||||
|
"hooksLeaveEmpty": "Kun for wg-quick. Ellers la det være tomt",
|
||||||
|
"dnsDesc": "DNS-server klienter vil bruke (overstyrer global konfig)",
|
||||||
|
"notConnected": "Klient ikke tilkoblet",
|
||||||
|
"endpoint": "Endepunkt",
|
||||||
|
"endpointDesc": "IP-en til klienten som WireGuard-tilkoblingen etableres fra",
|
||||||
|
"search": "Søk etter klienter...",
|
||||||
|
"config": "Konfigurasjon",
|
||||||
|
"viewConfig": "Vis konfigurasjon"
|
||||||
|
},
|
||||||
|
"dialog": {
|
||||||
|
"change": "Endre",
|
||||||
|
"cancel": "Avbryt",
|
||||||
|
"create": "Opprett"
|
||||||
|
},
|
||||||
|
"toast": {
|
||||||
|
"success": "Vellykket",
|
||||||
|
"saved": "Lagret",
|
||||||
|
"error": "Feil"
|
||||||
|
},
|
||||||
|
"form": {
|
||||||
|
"actions": "Handlinger",
|
||||||
|
"save": "Lagre",
|
||||||
|
"revert": "Tilbakestill",
|
||||||
|
"sectionGeneral": "Generelt",
|
||||||
|
"sectionAdvanced": "Avansert",
|
||||||
|
"noItems": "Ingen elementer",
|
||||||
|
"nullNoItems": "Ingen elementer. Bruker global konfig",
|
||||||
|
"add": "Legg til"
|
||||||
|
},
|
||||||
|
"admin": {
|
||||||
|
"general": {
|
||||||
|
"sessionTimeout": "Øktutløp",
|
||||||
|
"sessionTimeoutDesc": "Øktvarighet for Husk meg (sekunder)",
|
||||||
|
"metrics": "Målinger",
|
||||||
|
"metricsPassword": "Passord",
|
||||||
|
"metricsPasswordDesc": "Bearer-passord for metrics-endepunktet (passord eller argon2-hash)",
|
||||||
|
"json": "JSON",
|
||||||
|
"jsonDesc": "Rute for metrics i JSON-format",
|
||||||
|
"prometheus": "Prometheus",
|
||||||
|
"prometheusDesc": "Rute for Prometheus-målinger"
|
||||||
|
},
|
||||||
|
"config": {
|
||||||
|
"connection": "Tilkobling",
|
||||||
|
"hostDesc": "Offentlig vertsnavn klienter vil koble til (ugyldiggjør konfig)",
|
||||||
|
"portDesc": "Offentlig UDP-port klienter vil koble til (ugyldiggjør konfig, du vil sannsynligvis også endre Grensesnitt-port)",
|
||||||
|
"allowedIpsDesc": "Tillatte IP-er klienter vil bruke (global konfig)",
|
||||||
|
"dnsDesc": "DNS-server klienter vil bruke (global konfig)",
|
||||||
|
"mtuDesc": "MTU klienter vil bruke (kun for nye klienter)",
|
||||||
|
"persistentKeepaliveDesc": "Intervall i sekunder for å sende keepalives til serveren. 0 = deaktivert (kun for nye klienter)",
|
||||||
|
"suggest": "Foreslå",
|
||||||
|
"suggestDesc": "Velg en IP-adresse eller et vertsnavn for Vert-feltet"
|
||||||
|
},
|
||||||
|
"interface": {
|
||||||
|
"cidrSuccess": "CIDR endret",
|
||||||
|
"device": "Enhet",
|
||||||
|
"deviceDesc": "Ethernet-enhet som WireGuard-trafikken skal videresendes gjennom",
|
||||||
|
"mtuDesc": "MTU WireGuard vil bruke",
|
||||||
|
"portDesc": "UDP-port WireGuard vil lytte på (du vil sannsynligvis også endre Konfig-port)",
|
||||||
|
"changeCidr": "Endre CIDR",
|
||||||
|
"restart": "Start grensesnitt på nytt",
|
||||||
|
"restartDesc": "Start WireGuard-grensesnittet på nytt",
|
||||||
|
"restartWarn": "Er du sikker på at du vil starte grensesnittet på nytt? Dette vil koble fra alle klienter.",
|
||||||
|
"restartSuccess": "Grensesnitt startet på nytt"
|
||||||
|
},
|
||||||
|
"introText": "Velkommen til adminpanelet.\n\nHer kan du administrere de generelle innstillingene, konfigurasjonen, grensesnittinnstillingene og hooks.\n\nStart med å velge en av seksjonene i sidepanelet."
|
||||||
|
},
|
||||||
|
"zod": {
|
||||||
|
"generic": {
|
||||||
|
"required": "{0} er påkrevd",
|
||||||
|
"validNumber": "{0} må være et gyldig tall",
|
||||||
|
"validString": "{0} må være en gyldig streng",
|
||||||
|
"validBoolean": "{0} må være en gyldig boolsk verdi",
|
||||||
|
"validArray": "{0} må være en gyldig liste",
|
||||||
|
"stringMin": "{0} må være minst {1} tegn",
|
||||||
|
"numberMin": "{0} må være minst {1}"
|
||||||
|
},
|
||||||
|
"client": {
|
||||||
|
"id": "Klient-ID",
|
||||||
|
"name": "Navn",
|
||||||
|
"expiresAt": "Utløper",
|
||||||
|
"address4": "IPv4-adresse",
|
||||||
|
"address6": "IPv6-adresse",
|
||||||
|
"serverAllowedIps": "Server tillatte IP-er"
|
||||||
|
},
|
||||||
|
"user": {
|
||||||
|
"username": "Brukernavn",
|
||||||
|
"password": "Passord",
|
||||||
|
"remember": "Husk",
|
||||||
|
"name": "Navn",
|
||||||
|
"email": "E-post",
|
||||||
|
"emailInvalid": "E-post må være en gyldig e-postadresse",
|
||||||
|
"passwordMatch": "Passord må være like",
|
||||||
|
"totpEnable": "TOTP aktivert",
|
||||||
|
"totpEnableTrue": "TOTP aktivert må være sant",
|
||||||
|
"totpCode": "TOTP-kode"
|
||||||
|
},
|
||||||
|
"userConfig": {
|
||||||
|
"host": "Vert"
|
||||||
|
},
|
||||||
|
"general": {
|
||||||
|
"sessionTimeout": "Øktutløp",
|
||||||
|
"metricsEnabled": "Målinger",
|
||||||
|
"metricsPassword": "Målingspassord"
|
||||||
|
},
|
||||||
|
"interface": {
|
||||||
|
"cidr": "CIDR",
|
||||||
|
"device": "Enhet",
|
||||||
|
"cidrValid": "CIDR må være gyldig"
|
||||||
|
},
|
||||||
|
"otl": "Engangslenke",
|
||||||
|
"stringMalformed": "Strengen er ugyldig",
|
||||||
|
"body": "Innholdet må være et gyldig objekt",
|
||||||
|
"hook": "Hook",
|
||||||
|
"enabled": "Aktivert",
|
||||||
|
"mtu": "MTU",
|
||||||
|
"port": "Port",
|
||||||
|
"persistentKeepalive": "Vedvarende keepalive",
|
||||||
|
"address": "IP-adresse",
|
||||||
|
"dns": "DNS",
|
||||||
|
"allowedIps": "Tillatte IP-er",
|
||||||
|
"file": "Fil"
|
||||||
|
},
|
||||||
|
"hooks": {
|
||||||
|
"preUp": "PreUp",
|
||||||
|
"postUp": "PostUp",
|
||||||
|
"preDown": "PreDown",
|
||||||
|
"postDown": "PostDown"
|
||||||
|
},
|
||||||
|
"copy": {
|
||||||
|
"notSupported": "Kopiering støttes ikke",
|
||||||
|
"copied": "Kopiert!",
|
||||||
|
"failed": "Kopiering mislyktes",
|
||||||
|
"copy": "Kopier"
|
||||||
|
},
|
||||||
|
"awg": {
|
||||||
|
"jCLabel": "Antall junk-pakker (Jc)",
|
||||||
|
"jCDescription": "Antall junk-pakker som skal sendes (1-128, anbefalt: 4-12)",
|
||||||
|
"jMinLabel": "Min. størrelse på junk-pakker (Jmin)",
|
||||||
|
"jMinDescription": "Minimum størrelse på junk-pakker (0-1279*, anbefalt: 8, må være < Jmax)",
|
||||||
|
"jMaxLabel": "Maks. størrelse på junk-pakker (Jmax)",
|
||||||
|
"jMaxDescription": "Maksimal størrelse på junk-pakker (1-1280*, anbefalt: 80, må være > Jmin)",
|
||||||
|
"s1Label": "Init-pakke junk-størrelse (S1)",
|
||||||
|
"s1Description": "Init-pakke junk-størrelse (0-1132[1280* - 148 = 1132], anbefalt: 15-150, S1+56 ≠ S2)",
|
||||||
|
"s2Label": "Svarpakke junk-størrelse (S2)",
|
||||||
|
"s2Description": "Svarpakke junk-størrelse (0-1188[1280* - 92 = 1188], anbefalt: 15-150)",
|
||||||
|
"s3Label": "Cookie-svarpakke junk-størrelse (S3)",
|
||||||
|
"s3Description": "Cookie-svarpakke junk-størrelse",
|
||||||
|
"s4Label": "Transportpakke junk-størrelse (S4)",
|
||||||
|
"s4Description": "Transportpakke junk-størrelse",
|
||||||
|
"i1Label": "Spesiell junk-pakke 1 (I1)",
|
||||||
|
"i1Description": "Protokolllignende pakke i heksformat: <b 0x...>",
|
||||||
|
"i2Label": "Spesiell junk-pakke 2 (I2)",
|
||||||
|
"i2Description": "Protokolllignende pakke i heksformat: <b 0x...>",
|
||||||
|
"i3Label": "Spesiell junk-pakke 3 (I3)",
|
||||||
|
"i3Description": "Protokolllignende pakke i heksformat: <b 0x...>",
|
||||||
|
"i4Label": "Spesiell junk-pakke 4 (I4)",
|
||||||
|
"i4Description": "Protokolllignende pakke i heksformat: <b 0x...>",
|
||||||
|
"i5Label": "Spesiell junk-pakke 5 (I5)",
|
||||||
|
"i5Description": "Protokolllignende pakke i heksformat: <b 0x...>",
|
||||||
|
"h1Label": "Init magisk header (H1)",
|
||||||
|
"h1Description": "Init-pakke header-verdi (5-2147483647, må være unik fra H2-H4)",
|
||||||
|
"h2Label": "Svar magisk header (H2)",
|
||||||
|
"h2Description": "Svarpakke header-verdi (5-2147483647, må være unik fra H1, H3, H4)",
|
||||||
|
"h3Label": "Cookie-svar magisk header (H3)",
|
||||||
|
"h3Description": "Cookie-svarpakke header-verdi (5-2147483647, må være unik fra H1, H2, H4)",
|
||||||
|
"h4Label": "Transport magisk header (H4)",
|
||||||
|
"h4Description": "Transportpakke header-verdi (5-2147483647, må være unik fra H1-H3)",
|
||||||
|
"mtuNote": "Verdier avhenger av MTU",
|
||||||
|
"obfuscationParameters": "AmneziaWG obfuskasjonsparametere"
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,286 @@
|
|||||||
|
{
|
||||||
|
"pages": {
|
||||||
|
"me": "Account",
|
||||||
|
"clients": "Cliënten",
|
||||||
|
"admin": {
|
||||||
|
"panel": "Admin-paneel",
|
||||||
|
"general": "Algemeen",
|
||||||
|
"config": "Config",
|
||||||
|
"interface": "Interface",
|
||||||
|
"hooks": "Hooks"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"user": {
|
||||||
|
"email": "E-mail"
|
||||||
|
},
|
||||||
|
"me": {
|
||||||
|
"currentPassword": "Huidig wachtwoord",
|
||||||
|
"enable2fa": "Twee-factor-authenticatie inschakelen",
|
||||||
|
"enable2faDesc": "Scan de QR-code met uw authenticator-app of voer de sleutel handmatig in.",
|
||||||
|
"2faKey": "TOTP-sleutel",
|
||||||
|
"2faCodeDesc": "Voer de code in van uw authenticator-app.",
|
||||||
|
"disable2fa": "Twee-factor-authenticatie uitschakelen",
|
||||||
|
"disable2faDesc": "Voer uw wachtwoord in om de twee-factor-authenticatie uit te schakelen."
|
||||||
|
},
|
||||||
|
"general": {
|
||||||
|
"name": "Naam",
|
||||||
|
"username": "Gebruikersnaam",
|
||||||
|
"password": "Wachtwoord",
|
||||||
|
"newPassword": "Nieuw wachtwoord",
|
||||||
|
"updatePassword": "Wachtwoord bijwerken",
|
||||||
|
"mtu": "MTU",
|
||||||
|
"allowedIps": "Toegestane IP's",
|
||||||
|
"dns": "DNS",
|
||||||
|
"persistentKeepalive": "Aanhoudende verbinding",
|
||||||
|
"logout": "Uitloggen",
|
||||||
|
"continue": "Doorgaan",
|
||||||
|
"host": "Host",
|
||||||
|
"port": "Port",
|
||||||
|
"yes": "Ja",
|
||||||
|
"no": "Nee",
|
||||||
|
"confirmPassword": "Wachtwoord bevestigen",
|
||||||
|
"loading": "Laden...",
|
||||||
|
"2fa": "Twee-factor-authenticatie uitschakelen",
|
||||||
|
"2faCode": "TOTP-code"
|
||||||
|
},
|
||||||
|
"setup": {
|
||||||
|
"welcome": "Welkom bij uw eerste installatie van wg-easy",
|
||||||
|
"welcomeDesc": "U hebt de gemakkelijkste manier gevonden om WireGuard op elke Linux-host te installeren en te beheren",
|
||||||
|
"existingSetup": "Heeft u een bestaande installatie?",
|
||||||
|
"createAdminDesc": "Voer eerst een beheerdersgebruikersnaam en een sterk veilig wachtwoord in. Deze gegevens worden gebruikt om in te loggen op uw beheerderspaneel.",
|
||||||
|
"setupConfigDesc": "Voer alstublieft de host- en poortinformatie in. Dit wordt gebruikt voor de clientconfiguratie bij het instellen van WireGuard op hun apparaten.",
|
||||||
|
"setupMigrationDesc": "Geef alstublieft het back-upbestand als u uw gegevens van uw vorige wg-easy-versie naar uw nieuwe installatie wilt overzetten.",
|
||||||
|
"upload": "Uploaden",
|
||||||
|
"migration": "Herstel de back-up:",
|
||||||
|
"createAccount": "Account aanmaken",
|
||||||
|
"successful": "Installatie succesvol",
|
||||||
|
"hostDesc": "Publieke hostnaam waar clients verbinding mee maken",
|
||||||
|
"portDesc": "Publieke UDP-poort waarop clients verbinding maken en waarop WireGuard luistert"
|
||||||
|
},
|
||||||
|
"update": {
|
||||||
|
"updateAvailable": "Er is een update beschikbaar!",
|
||||||
|
"update": "Bijwerken"
|
||||||
|
},
|
||||||
|
"theme": {
|
||||||
|
"dark": "Donker thema",
|
||||||
|
"light": "Licht thema",
|
||||||
|
"system": "Systeem-thema"
|
||||||
|
},
|
||||||
|
"layout": {
|
||||||
|
"toggleCharts": "Grafieken tonen/verbergen",
|
||||||
|
"donate": "Donatie"
|
||||||
|
},
|
||||||
|
"login": {
|
||||||
|
"signIn": "Inloggen",
|
||||||
|
"rememberMe": "Onthoud mij",
|
||||||
|
"rememberMeDesc": "Ingelogd blijven na het sluiten van de browser",
|
||||||
|
"insecure": "U kunt niet inloggen via een onveilige verbinding. Gebruik HTTPS.",
|
||||||
|
"2faRequired": "Twee-factor-authenticatie is vereist",
|
||||||
|
"2faWrong": "Twee-factor-authenticatiecode is fout"
|
||||||
|
},
|
||||||
|
"client": {
|
||||||
|
"empty": "Er zijn nog geen cliënten.",
|
||||||
|
"newShort": "Nieuw",
|
||||||
|
"sort": "Sortering",
|
||||||
|
"create": "Cliënt aanmaken",
|
||||||
|
"created": "Cliënt aangemaakt",
|
||||||
|
"new": "Nieuwe cliënt",
|
||||||
|
"name": "Naam",
|
||||||
|
"expireDate": "Verloopdatum",
|
||||||
|
"expireDateDesc": "Datum waarop de cliënt wordt uitgeschakeld. Laat leeg voor permanent.",
|
||||||
|
"delete": "Verwijderen",
|
||||||
|
"deleteClient": "Cliënt verwijderen",
|
||||||
|
"deleteDialog1": "Weet u zeker dat u wilt verwijderen",
|
||||||
|
"deleteDialog2": "Deze actie kan niet ongedaan worden gemaakt.",
|
||||||
|
"enabled": "Ingeschakeld",
|
||||||
|
"address": "Adres",
|
||||||
|
"serverAllowedIps": "Toegestane IP's van de server",
|
||||||
|
"otlDesc": "Korte eenmalige link genereren",
|
||||||
|
"permanent": "Permanent",
|
||||||
|
"createdOn": "Aangemaakt op ",
|
||||||
|
"lastSeen": "Laatst gezien op ",
|
||||||
|
"totalDownload": "Totaal gedownload: ",
|
||||||
|
"totalUpload": "Totaal geüpload: ",
|
||||||
|
"newClient": "Nieuwe cliënt",
|
||||||
|
"disableClient": "Cliënt uitschakelen",
|
||||||
|
"enableClient": "Cliënt inschakelen",
|
||||||
|
"noPrivKey": "Deze cliënt heeft geen bekende privésleutel. Kan de configuratie niet aanmaken.",
|
||||||
|
"showQR": "QR-code weergeven",
|
||||||
|
"downloadConfig": "Configuratie downloaden",
|
||||||
|
"allowedIpsDesc": "Welke IP's via de VPN worden geleid (overschrijft algemene instellingen)",
|
||||||
|
"serverAllowedIpsDesc": "Naar welke IP's de server het cliëntverkeer zal routeren",
|
||||||
|
"mtuDesc": "Stelt de maximale transmissie-eenheid (pakketgrootte) voor de VPN-tunnel in",
|
||||||
|
"persistentKeepaliveDesc": "Stelt het interval (seconden) in voor keep-alive-pakketten. 0 schakelt dit uit",
|
||||||
|
"hooks": "Hooks",
|
||||||
|
"hooksDescription": "Hooks functioneren alleen met wg-quick",
|
||||||
|
"hooksLeaveEmpty": "Alleen voor wg-quick. Anders leeg laten",
|
||||||
|
"dnsDesc": "DNS-serverclients zullen gebruiken (overschrijft algemene instellingen)",
|
||||||
|
"notConnected": "Cliënt niet verbonden",
|
||||||
|
"endpoint": "Eindpunt",
|
||||||
|
"endpointDesc": "IP van de cliënt vanaf welke de WireGuard-verbinding tot stand wordt gebracht",
|
||||||
|
"search": "Cliënten zoeken...",
|
||||||
|
"config": "Configuratie",
|
||||||
|
"viewConfig": "Configuratie weergeven"
|
||||||
|
},
|
||||||
|
"dialog": {
|
||||||
|
"change": "Wijzigen",
|
||||||
|
"cancel": "Annuleren",
|
||||||
|
"create": "Aanmaken"
|
||||||
|
},
|
||||||
|
"toast": {
|
||||||
|
"success": "Succes",
|
||||||
|
"saved": "Opgeslagen",
|
||||||
|
"error": "Fout"
|
||||||
|
},
|
||||||
|
"form": {
|
||||||
|
"actions": "Acties",
|
||||||
|
"save": "Opslaan",
|
||||||
|
"revert": "Terugzetten",
|
||||||
|
"sectionGeneral": "Algemeen",
|
||||||
|
"sectionAdvanced": "Geavanceerd",
|
||||||
|
"noItems": "Geen items",
|
||||||
|
"nullNoItems": "Geen items. Globale configuratie gebruiken",
|
||||||
|
"add": "Toevoegen"
|
||||||
|
},
|
||||||
|
"admin": {
|
||||||
|
"general": {
|
||||||
|
"sessionTimeout": "Sessie verlopen",
|
||||||
|
"sessionTimeoutDesc": "Sessieduur voor Onthoud mij (sec.)",
|
||||||
|
"metrics": "Metrics",
|
||||||
|
"metricsPassword": "Wachtwoord",
|
||||||
|
"metricsPasswordDesc": "Bearer-wachtwoord voor het metrics-eindpunt (wachtwoord of argon2-hash)",
|
||||||
|
"json": "JSON",
|
||||||
|
"jsonDesc": "Route voor metrics in JSON-formaat",
|
||||||
|
"prometheus": "Prometheus",
|
||||||
|
"prometheusDesc": "Route voor Prometheus-metrics"
|
||||||
|
},
|
||||||
|
"config": {
|
||||||
|
"connection": "Verbinding",
|
||||||
|
"hostDesc": "Publieke hostnaam waarmee cliënten verbinding maken (maakt configuratie ongedaan)",
|
||||||
|
"portDesc": "Publieke UDP-poort waarmee clients verbinding maken (maakt configuratie ongedaan; u dient waarschijnlijk ook de interfacepoort te wijzigen)",
|
||||||
|
"allowedIpsDesc": "Toegestane IP's die cliënten zullen gebruiken (algemene configuratie)",
|
||||||
|
"dnsDesc": "DNS-server die cliënten zullen gebruiken (algemene configuratie)",
|
||||||
|
"mtuDesc": "MTU die cliënten zullen gebruiken (alleen voor nieuwe cliënten)",
|
||||||
|
"persistentKeepaliveDesc": "Interval in seconden om keepalives naar de server te sturen. 0 = uitgeschakeld (alleen voor nieuwe cliënten)",
|
||||||
|
"suggest": "Voorstellen",
|
||||||
|
"suggestDesc": "Kies een IP-adres of hostnaam voor het veld Host"
|
||||||
|
},
|
||||||
|
"interface": {
|
||||||
|
"cidrSuccess": "CIDR gewijzigd",
|
||||||
|
"device": "Apparaat",
|
||||||
|
"deviceDesc": "Ethernet-apparaat waar het WireGuard-verkeer doorheen moet worden doorgestuurd",
|
||||||
|
"mtuDesc": "MTU die WireGuard zal toepassen",
|
||||||
|
"portDesc": "UDP-poort waarop WireGuard zal luisteren (u dient waarschijnlijk ook de Config-poort te wijzigen)",
|
||||||
|
"changeCidr": "CIDR wijzigen",
|
||||||
|
"restart": "Interface opnieuw starten",
|
||||||
|
"restartDesc": "WireGuard-interface opnieuw starten",
|
||||||
|
"restartWarn": "Weet u zeker dat u de interface wilt herstarten? Dit zal alle cliënten loskoppelen.",
|
||||||
|
"restartSuccess": "Interface opnieuw gestart"
|
||||||
|
},
|
||||||
|
"introText": "Welkom bij het Admin-paneel.\n\nHier kunt u de algemene instellingen, de configuratie, de interface-instellingen en de hooks beheren.\n\nBegin met het kiezen van een van de secties in de zijbalk."
|
||||||
|
},
|
||||||
|
"zod": {
|
||||||
|
"generic": {
|
||||||
|
"required": "{0} is vereist",
|
||||||
|
"validNumber": "{0} moet een geldig nummer zijn",
|
||||||
|
"validString": "{0} moet een geldige tekenreeks zijn",
|
||||||
|
"validBoolean": "{0} moet een geldige boolean zijn",
|
||||||
|
"validArray": "{0} moet een geldige array zijn",
|
||||||
|
"stringMin": "{0} moet minstens {1} teken bevatten",
|
||||||
|
"numberMin": "{0} moet minstens {1} zijn"
|
||||||
|
},
|
||||||
|
"client": {
|
||||||
|
"id": "Cliënt-ID",
|
||||||
|
"name": "Naam",
|
||||||
|
"expiresAt": "Verloopt op",
|
||||||
|
"address4": "IPv4-adres",
|
||||||
|
"address6": "IPv6-adres",
|
||||||
|
"serverAllowedIps": "Toegestane IP's van de server"
|
||||||
|
},
|
||||||
|
"user": {
|
||||||
|
"username": "Gebruikersnaam",
|
||||||
|
"password": "Wachtwoord",
|
||||||
|
"remember": "Onthouden",
|
||||||
|
"name": "Naam",
|
||||||
|
"email": "E-mail",
|
||||||
|
"emailInvalid": "E-mail moet een geldig e-mailadres zijn",
|
||||||
|
"passwordMatch": "Wachtwoorden moeten overeenkomen",
|
||||||
|
"totpEnable": "TOTP inschakelen",
|
||||||
|
"totpEnableTrue": "TOTP inschakelen moet waar zijn",
|
||||||
|
"totpCode": "TOTP-code"
|
||||||
|
},
|
||||||
|
"userConfig": {
|
||||||
|
"host": "Host"
|
||||||
|
},
|
||||||
|
"general": {
|
||||||
|
"sessionTimeout": "Sessie-verlooptijd",
|
||||||
|
"metricsEnabled": "Metrics",
|
||||||
|
"metricsPassword": "Metrics-wachtwoord"
|
||||||
|
},
|
||||||
|
"interface": {
|
||||||
|
"cidr": "CIDR",
|
||||||
|
"device": "Apparaat",
|
||||||
|
"cidrValid": "CIDR moet geldig zijn"
|
||||||
|
},
|
||||||
|
"otl": "Eenmalige link",
|
||||||
|
"stringMalformed": "Tekenreeks is beschadigd",
|
||||||
|
"body": "Body moet een geldig object bevatten",
|
||||||
|
"hook": "Hook",
|
||||||
|
"enabled": "Ingeschakeld",
|
||||||
|
"mtu": "MTU",
|
||||||
|
"port": "Poort",
|
||||||
|
"persistentKeepalive": "Aanhoudende verbinding",
|
||||||
|
"address": "IP-adres",
|
||||||
|
"dns": "DNS",
|
||||||
|
"allowedIps": "Toegestane IP's",
|
||||||
|
"file": "Bestand"
|
||||||
|
},
|
||||||
|
"hooks": {
|
||||||
|
"preUp": "Pre-Up",
|
||||||
|
"postUp": "Post-Up",
|
||||||
|
"preDown": "Pre-Down",
|
||||||
|
"postDown": "Post-Down"
|
||||||
|
},
|
||||||
|
"copy": {
|
||||||
|
"notSupported": "Kopiëren wordt niet ondersteund",
|
||||||
|
"copied": "Gekopieerd!",
|
||||||
|
"failed": "Kopiëren is mislukt",
|
||||||
|
"copy": "Kopiëren"
|
||||||
|
},
|
||||||
|
"awg": {
|
||||||
|
"jCLabel": "Junk packet count (Jc)",
|
||||||
|
"jCDescription": "Aantal te verzenden junk packets (1-128, aanbevolen: 4-12)",
|
||||||
|
"jMinLabel": "Junk packet min size (Jmin)",
|
||||||
|
"jMinDescription": "Minimale grootte van junk packets (0-1279*, aanbevolen: 8, moet zijn < Jmax)",
|
||||||
|
"jMaxLabel": "Junk packet max size (Jmax)",
|
||||||
|
"jMaxDescription": "Maximale grootte van junk packets (1-1280*, aanbevolen: 80, moet zijn > Jmin)",
|
||||||
|
"s1Label": "Init packet junk size (S1)",
|
||||||
|
"s1Description": "Grootte Init packet junk (0-1132[1280* - 148 = 1132], aanbevolen: 15-150, S1+56 ≠ S2)",
|
||||||
|
"s2Label": "Response packet junk size (S2)",
|
||||||
|
"s2Description": "Grootte Response packet junk (0-1188[1280* - 92 = 1188], aanbevolen: 15-150)",
|
||||||
|
"s3Label": "Cookie reply packet junk size (S3)",
|
||||||
|
"s3Description": "Grootte Cookie reply packet junk",
|
||||||
|
"s4Label": "Transport packet junk size (S4)",
|
||||||
|
"s4Description": "Grootte Transport packet junk",
|
||||||
|
"i1Label": "Special junk packet 1 (I1)",
|
||||||
|
"i1Description": "Protocol mimic packet in hex formaat: <b 0x...>",
|
||||||
|
"i2Label": "Special junk packet 2 (I2)",
|
||||||
|
"i2Description": "Protocol mimic packet in hex formaat: <b 0x...>",
|
||||||
|
"i3Label": "Special junk packet 3 (I3)",
|
||||||
|
"i3Description": "Protocol mimic packet in hex formaat: <b 0x...>",
|
||||||
|
"i4Label": "Special junk packet 4 (I4)",
|
||||||
|
"i4Description": "Protocol mimic packet in hex formaat: <b 0x...>",
|
||||||
|
"i5Label": "Special junk packet 5 (I5)",
|
||||||
|
"i5Description": "Protocol mimic packet in hex formaat: <b 0x...>",
|
||||||
|
"h1Label": "Init magic header (H1)",
|
||||||
|
"h1Description": "Waarde Init packet header (5-2147483647, moet uniek zijn t.o.v. H2-H4)",
|
||||||
|
"h2Label": "Response magic header (H2)",
|
||||||
|
"h2Description": "Waarde Response packet header (5-2147483647, moet uniek zijn t.o.v. H1, H3, H4)",
|
||||||
|
"h3Label": "Cookie reply magic header (H3)",
|
||||||
|
"h3Description": "Waarde Cookie reply packet header (5-2147483647, moet uniek zijn t.o.v. H1, H2, H4)",
|
||||||
|
"h4Label": "Transport magic header (H4)",
|
||||||
|
"h4Description": "Waarde Transport packet header (5-2147483647, moet uniek zijn t.o.v. H1-H3)",
|
||||||
|
"mtuNote": "Waarden zijn afhankelijk van de MTU",
|
||||||
|
"obfuscationParameters": "AmneziaWG Obfuscation Parameters"
|
||||||
|
}
|
||||||
|
}
|
||||||
+19
-19
@@ -248,29 +248,29 @@
|
|||||||
"copy": "Копировать"
|
"copy": "Копировать"
|
||||||
},
|
},
|
||||||
"awg": {
|
"awg": {
|
||||||
"jCLabel": "Количество шумовых пакетов (Jc)",
|
"jCLabel": "Количество мусорных пакетов (Jc)",
|
||||||
"jCDescription": "Число шумовых пакетов для отправки (1-128, рекомендуется: 4-12)",
|
"jCDescription": "Число мусорных пакетов для отправки (1-128, рекомендуется: 4-12)",
|
||||||
"jMinLabel": "Минимальный размер шумовых пакетов (Jmin)",
|
"jMinLabel": "Минимальный размер мусорных пакетов (Jmin)",
|
||||||
"jMinDescription": "Минимальный размер шумовых пакетов (0-1279*, рекомендуется: 8, должен быть < Jmax)",
|
"jMinDescription": "Минимальный размер мусорных пакетов (0-1279*, рекомендуется: 8, должен быть < Jmax)",
|
||||||
"jMaxLabel": "Максимальный размер шумовых пакетов (Jmax)",
|
"jMaxLabel": "Максимальный размер мусорных пакетов (Jmax)",
|
||||||
"jMaxDescription": "Максимальный размер шумовых пакетов (1-1280*, рекомендуется: 80, должен быть > Jmin)",
|
"jMaxDescription": "Максимальный размер мусорных пакетов (1-1280*, рекомендуется: 80, должен быть > Jmin)",
|
||||||
"s1Label": "Размер шумовых данных в init-пакете (S1)",
|
"s1Label": "Размер мусорных данных в init-пакете (S1)",
|
||||||
"s1Description": "Размер шумовых данных в init-пакете (0-1132[1280* - 148 = 1132], рекомендуется: 15-150, S1+56 ≠ S2)",
|
"s1Description": "Размер мусорных данных в init-пакете (0-1132[1280* - 148 = 1132], рекомендуется: 15-150, S1+56 ≠ S2)",
|
||||||
"s2Label": "Размер шумовых данных в ответном пакете (S2)",
|
"s2Label": "Размер мусорных данных в ответном пакете (S2)",
|
||||||
"s2Description": "Размер шумовых данных в ответном пакете (0-1188[1280* - 92 = 1188], рекомендуется: 15-150)",
|
"s2Description": "Размер мусорных данных в ответном пакете (0-1188[1280* - 92 = 1188], рекомендуется: 15-150)",
|
||||||
"s3Label": "Размер шумовых данных в cookie-reply пакете (S3)",
|
"s3Label": "Размер мусорных данных в cookie-reply пакете (S3)",
|
||||||
"s3Description": "Размер шумовых данных в cookie-reply пакете",
|
"s3Description": "Размер мусорных данных в cookie-reply пакете",
|
||||||
"s4Label": "Размер шумовых данных в транспортном пакете (S4)",
|
"s4Label": "Размер мусорных данных в транспортном пакете (S4)",
|
||||||
"s4Description": "Размер шумовых данных в транспортном пакете",
|
"s4Description": "Размер мусорных данных в транспортном пакете",
|
||||||
"i1Label": "Специальный шумовой пакет 1 (I1)",
|
"i1Label": "Специальный мусорный пакет 1 (I1)",
|
||||||
"i1Description": "Пакет имитации протокола в hex формате: <b 0x...>",
|
"i1Description": "Пакет имитации протокола в hex формате: <b 0x...>",
|
||||||
"i2Label": "Специальный шумовой пакет 2 (I2)",
|
"i2Label": "Специальный мусорный пакет 2 (I2)",
|
||||||
"i2Description": "Пакет имитации протокола в hex формате: <b 0x...>",
|
"i2Description": "Пакет имитации протокола в hex формате: <b 0x...>",
|
||||||
"i3Label": "Специальный шумовой пакет 3 (I3)",
|
"i3Label": "Специальный мусорный пакет 3 (I3)",
|
||||||
"i3Description": "Пакет имитации протокола в hex формате: <b 0x...>",
|
"i3Description": "Пакет имитации протокола в hex формате: <b 0x...>",
|
||||||
"i4Label": "Специальный шумовой пакет 4 (I4)",
|
"i4Label": "Специальный мусорный пакет 4 (I4)",
|
||||||
"i4Description": "Пакет имитации протокола в hex формате: <b 0x...>",
|
"i4Description": "Пакет имитации протокола в hex формате: <b 0x...>",
|
||||||
"i5Label": "Специальный шумовой пакет 5 (I5)",
|
"i5Label": "Специальный мусорный пакет 5 (I5)",
|
||||||
"i5Description": "Пакет имитации протокола в hex формате: <b 0x...>",
|
"i5Description": "Пакет имитации протокола в hex формате: <b 0x...>",
|
||||||
"h1Label": "Init magic заголовок (H1)",
|
"h1Label": "Init magic заголовок (H1)",
|
||||||
"h1Description": "Значение заголовка init-пакета (5-2147483647, должно отличаться от H2-H4)",
|
"h1Description": "Значение заголовка init-пакета (5-2147483647, должно отличаться от H2-H4)",
|
||||||
|
|||||||
+22
-1
@@ -5,7 +5,7 @@ export default defineNuxtConfig({
|
|||||||
future: {
|
future: {
|
||||||
compatibilityVersion: 4,
|
compatibilityVersion: 4,
|
||||||
},
|
},
|
||||||
compatibilityDate: '2025-02-04',
|
compatibilityDate: '2026-02-06',
|
||||||
devtools: { enabled: true },
|
devtools: { enabled: true },
|
||||||
modules: [
|
modules: [
|
||||||
'@nuxtjs/i18n',
|
'@nuxtjs/i18n',
|
||||||
@@ -15,6 +15,7 @@ export default defineNuxtConfig({
|
|||||||
'radix-vue/nuxt',
|
'radix-vue/nuxt',
|
||||||
'@vueuse/nuxt',
|
'@vueuse/nuxt',
|
||||||
'@nuxt/eslint',
|
'@nuxt/eslint',
|
||||||
|
'@nuxt/test-utils/module',
|
||||||
],
|
],
|
||||||
colorMode: {
|
colorMode: {
|
||||||
preference: 'system',
|
preference: 'system',
|
||||||
@@ -109,6 +110,26 @@ export default defineNuxtConfig({
|
|||||||
language: 'id-ID',
|
language: 'id-ID',
|
||||||
name: 'Bahasa Indonesia',
|
name: 'Bahasa Indonesia',
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
code: 'nl',
|
||||||
|
language: 'nl-NL',
|
||||||
|
name: 'Nederlands',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
code: 'nb',
|
||||||
|
language: 'nb-NO',
|
||||||
|
name: 'Norsk bokmål',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
code: 'bg',
|
||||||
|
language: 'bg-BG',
|
||||||
|
name: 'Български',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
code: 'gl',
|
||||||
|
language: 'gl-ES',
|
||||||
|
name: 'Galego',
|
||||||
|
},
|
||||||
],
|
],
|
||||||
defaultLocale: 'en',
|
defaultLocale: 'en',
|
||||||
vueI18n: './i18n.config.ts',
|
vueI18n: './i18n.config.ts',
|
||||||
|
|||||||
+23
-18
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "wg-easy",
|
"name": "wg-easy",
|
||||||
"version": "15.2.1",
|
"version": "15.2.2",
|
||||||
"description": "The easiest way to run WireGuard VPN + Web-based Admin UI.",
|
"description": "The easiest way to run WireGuard VPN + Web-based Admin UI.",
|
||||||
"private": true,
|
"private": true,
|
||||||
"type": "module",
|
"type": "module",
|
||||||
@@ -17,57 +17,62 @@
|
|||||||
"check:all": "pnpm typecheck && pnpm lint && pnpm format:check && pnpm build",
|
"check:all": "pnpm typecheck && pnpm lint && pnpm format:check && pnpm build",
|
||||||
"db:generate": "drizzle-kit generate",
|
"db:generate": "drizzle-kit generate",
|
||||||
"cli:build": "node cli/build.js",
|
"cli:build": "node cli/build.js",
|
||||||
"cli:dev": "tsx cli/index.ts"
|
"cli:dev": "tsx cli/index.ts",
|
||||||
|
"test:unit": "vitest run --project unit"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@eschricht/nuxt-color-mode": "^1.2.0",
|
"@eschricht/nuxt-color-mode": "^1.2.0",
|
||||||
"@heroicons/vue": "^2.2.0",
|
"@heroicons/vue": "^2.2.0",
|
||||||
"@libsql/client": "^0.17.0",
|
"@libsql/client": "^0.17.0",
|
||||||
"@nuxtjs/i18n": "^10.2.1",
|
"@nuxtjs/i18n": "^10.2.3",
|
||||||
"@nuxtjs/tailwindcss": "^6.14.0",
|
"@nuxtjs/tailwindcss": "^6.14.0",
|
||||||
"@phc/format": "^1.0.0",
|
"@phc/format": "^1.0.0",
|
||||||
"@pinia/nuxt": "^0.11.3",
|
"@pinia/nuxt": "^0.11.3",
|
||||||
"@tailwindcss/forms": "^0.5.11",
|
"@tailwindcss/forms": "^0.5.11",
|
||||||
"@vueuse/core": "^14.1.0",
|
"@vueuse/core": "^14.2.0",
|
||||||
"@vueuse/nuxt": "^14.1.0",
|
"@vueuse/nuxt": "^14.2.0",
|
||||||
"apexcharts": "^5.3.6",
|
"apexcharts": "^5.3.6",
|
||||||
"argon2": "^0.44.0",
|
"argon2": "^0.44.0",
|
||||||
"cidr-tools": "^11.0.3",
|
"cidr-tools": "^11.0.6",
|
||||||
"citty": "^0.1.6",
|
"citty": "^0.2.0",
|
||||||
"consola": "^3.4.2",
|
"consola": "^3.4.2",
|
||||||
"crc-32": "^1.2.2",
|
"crc-32": "^1.2.2",
|
||||||
"debug": "^4.4.3",
|
"debug": "^4.4.3",
|
||||||
"drizzle-orm": "^0.45.1",
|
"drizzle-orm": "^0.45.1",
|
||||||
"ip-bigint": "^8.2.2",
|
"ip-bigint": "^8.2.4",
|
||||||
"is-cidr": "^6.0.1",
|
"is-cidr": "^6.0.2",
|
||||||
"is-ip": "^5.0.1",
|
"is-ip": "^5.0.1",
|
||||||
"js-sha256": "^0.11.1",
|
"js-sha256": "^0.11.1",
|
||||||
"nuxt": "^3.20.2",
|
"nuxt": "^3.21.1",
|
||||||
"otpauth": "^9.4.1",
|
"otpauth": "^9.5.0",
|
||||||
"pinia": "^3.0.4",
|
"pinia": "^3.0.4",
|
||||||
"qr": "^0.5.4",
|
"qr": "^0.5.4",
|
||||||
"radix-vue": "^1.9.17",
|
"radix-vue": "^1.9.17",
|
||||||
"semver": "^7.7.3",
|
"semver": "^7.7.4",
|
||||||
"tailwindcss": "^3.4.19",
|
"tailwindcss": "^3.4.19",
|
||||||
"timeago.js": "^4.0.2",
|
"timeago.js": "^4.0.2",
|
||||||
"vue": "latest",
|
"vue": "latest",
|
||||||
"vue3-apexcharts": "^1.10.0",
|
"vue3-apexcharts": "^1.10.0",
|
||||||
"zod": "^4.3.5"
|
"zod": "^4.3.6"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@nuxt/eslint": "^1.12.1",
|
"@nuxt/eslint": "^1.14.0",
|
||||||
|
"@nuxt/test-utils": "^3.23.0",
|
||||||
"@types/debug": "^4.1.12",
|
"@types/debug": "^4.1.12",
|
||||||
"@types/phc__format": "^1.0.1",
|
"@types/phc__format": "^1.0.1",
|
||||||
"@types/semver": "^7.7.1",
|
"@types/semver": "^7.7.1",
|
||||||
|
"@vitest/coverage-v8": "^4.0.18",
|
||||||
|
"@vitest/ui": "4.0.18",
|
||||||
"drizzle-kit": "^0.31.8",
|
"drizzle-kit": "^0.31.8",
|
||||||
"esbuild": "^0.27.2",
|
"esbuild": "^0.27.3",
|
||||||
"eslint": "^9.39.2",
|
"eslint": "^9.39.2",
|
||||||
"eslint-config-prettier": "^10.1.8",
|
"eslint-config-prettier": "^10.1.8",
|
||||||
"prettier": "^3.7.4",
|
"prettier": "^3.8.1",
|
||||||
"prettier-plugin-tailwindcss": "^0.7.2",
|
"prettier-plugin-tailwindcss": "^0.7.2",
|
||||||
"tsx": "^4.21.0",
|
"tsx": "^4.21.0",
|
||||||
"typescript": "^5.9.3",
|
"typescript": "^5.9.3",
|
||||||
"vue-tsc": "^3.2.2"
|
"vitest": "^4.0.18",
|
||||||
|
"vue-tsc": "^3.2.4"
|
||||||
},
|
},
|
||||||
"packageManager": "pnpm@10.28.0"
|
"packageManager": "pnpm@10.29.2"
|
||||||
}
|
}
|
||||||
|
|||||||
Generated
+2268
-1517
File diff suppressed because it is too large
Load Diff
@@ -39,8 +39,6 @@ async function getPrometheusResponse() {
|
|||||||
const id = `interface="${wgInterface.name}"`;
|
const id = `interface="${wgInterface.name}"`;
|
||||||
|
|
||||||
const returnText = [
|
const returnText = [
|
||||||
'# HELP wg-easy and wireguard metrics',
|
|
||||||
'',
|
|
||||||
'# HELP wireguard_configured_peers',
|
'# HELP wireguard_configured_peers',
|
||||||
'# TYPE wireguard_configured_peers gauge',
|
'# TYPE wireguard_configured_peers gauge',
|
||||||
`wireguard_configured_peers{${id}} ${wireguardPeerCount}`,
|
`wireguard_configured_peers{${id}} ${wireguardPeerCount}`,
|
||||||
|
|||||||
@@ -63,11 +63,11 @@ AllowedIPs = ${allowedIps.join(', ')}${extraLines.length ? `\n${extraLines.join(
|
|||||||
S2: wgInterface.s2,
|
S2: wgInterface.s2,
|
||||||
S3: wgInterface.s3,
|
S3: wgInterface.s3,
|
||||||
S4: wgInterface.s4,
|
S4: wgInterface.s4,
|
||||||
i1: wgInterface.i1,
|
I1: wgInterface.i1,
|
||||||
i2: wgInterface.i2,
|
I2: wgInterface.i2,
|
||||||
i3: wgInterface.i3,
|
I3: wgInterface.i3,
|
||||||
i4: wgInterface.i4,
|
I4: wgInterface.i4,
|
||||||
i5: wgInterface.i5,
|
I5: wgInterface.i5,
|
||||||
H1: wgInterface.h1,
|
H1: wgInterface.h1,
|
||||||
H2: wgInterface.h2,
|
H2: wgInterface.h2,
|
||||||
H3: wgInterface.h3,
|
H3: wgInterface.h3,
|
||||||
@@ -131,11 +131,11 @@ PostDown = ${iptablesTemplate(hooks.postDown, wgInterface)}`;
|
|||||||
S2: wgInterface.s2,
|
S2: wgInterface.s2,
|
||||||
S3: wgInterface.s3,
|
S3: wgInterface.s3,
|
||||||
S4: wgInterface.s4,
|
S4: wgInterface.s4,
|
||||||
i1: client.i1,
|
I1: client.i1,
|
||||||
i2: client.i2,
|
I2: client.i2,
|
||||||
i3: client.i3,
|
I3: client.i3,
|
||||||
i4: client.i4,
|
I4: client.i4,
|
||||||
i5: client.i5,
|
I5: client.i5,
|
||||||
H1: wgInterface.h1,
|
H1: wgInterface.h1,
|
||||||
H2: wgInterface.h2,
|
H2: wgInterface.h2,
|
||||||
H3: wgInterface.h3,
|
H3: wgInterface.h3,
|
||||||
|
|||||||
@@ -0,0 +1,20 @@
|
|||||||
|
import { expect, test, describe } from 'vitest';
|
||||||
|
import {
|
||||||
|
hashPassword,
|
||||||
|
isPasswordValid,
|
||||||
|
isValidPasswordHash,
|
||||||
|
} from '../../server/utils/password';
|
||||||
|
|
||||||
|
describe('password', () => {
|
||||||
|
test('password', async () => {
|
||||||
|
const hash = await hashPassword('password');
|
||||||
|
|
||||||
|
await expect(isPasswordValid('password', hash)).resolves.toBe(true);
|
||||||
|
await expect(isPasswordValid('wrong', hash)).resolves.toBe(false);
|
||||||
|
|
||||||
|
expect(isValidPasswordHash('not a hash')).toBe(false);
|
||||||
|
expect(isValidPasswordHash(hash)).toBe(true);
|
||||||
|
|
||||||
|
expect(isValidPasswordHash(hash.replace('argon2', 'argon3'))).toBe(false);
|
||||||
|
});
|
||||||
|
});
|
||||||
@@ -0,0 +1,18 @@
|
|||||||
|
import { defineConfig } from 'vitest/config';
|
||||||
|
|
||||||
|
export default defineConfig({
|
||||||
|
test: {
|
||||||
|
projects: [
|
||||||
|
{
|
||||||
|
test: {
|
||||||
|
name: 'unit',
|
||||||
|
include: ['test/unit/*.{test,spec}.ts'],
|
||||||
|
environment: 'node',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
],
|
||||||
|
coverage: {
|
||||||
|
enabled: true,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
});
|
||||||
Reference in New Issue
Block a user