mirror of
https://github.com/wg-easy/wg-easy.git
synced 2025-09-26 19:51:15 +08:00
Compare commits
63 Commits
v15.0.0
...
7b2d234ea5
Author | SHA1 | Date | |
---|---|---|---|
![]() |
7b2d234ea5 | ||
![]() |
a282ca35f1 | ||
![]() |
0792862c0d | ||
![]() |
6c0d8e91fa | ||
![]() |
8892c43a7d | ||
![]() |
7cfe04286a | ||
![]() |
000513f212 | ||
![]() |
6ca3da1b80 | ||
![]() |
fe394ecbe4 | ||
![]() |
ec6f0423ca | ||
![]() |
e12208af75 | ||
![]() |
2d9c75fd81 | ||
![]() |
0c54b1c3da | ||
![]() |
be7943dc9b | ||
![]() |
303c2f1e39 | ||
![]() |
0b32ab899c | ||
![]() |
ef463d3d85 | ||
![]() |
c10daa2fd4 | ||
![]() |
cb8aa45cde | ||
![]() |
54e0a1e886 | ||
![]() |
71a452080e | ||
![]() |
5be7fb3038 | ||
![]() |
59f0c8b0d2 | ||
![]() |
e1ed93674d | ||
![]() |
6b65a8099b | ||
![]() |
c1dd494d0f | ||
![]() |
bf9e8a6e21 | ||
![]() |
371d7617ff | ||
![]() |
0b435d9ed8 | ||
![]() |
07f89d15a9 | ||
![]() |
b5318086d2 | ||
![]() |
b7f9b7c830 | ||
![]() |
2e4f386f49 | ||
![]() |
9ead985798 | ||
![]() |
6326ee31c4 | ||
![]() |
984dc95550 | ||
![]() |
cd0a9b8e33 | ||
![]() |
90b9ba15ec | ||
![]() |
0abc419db7 | ||
![]() |
b185d7a63d | ||
![]() |
4bb880c4b7 | ||
![]() |
b0ba9e43f9 | ||
![]() |
ddb01fb968 | ||
![]() |
22812e0632 | ||
![]() |
4d84e1d9d3 | ||
![]() |
9368b857e8 | ||
![]() |
0f663df7f6 | ||
![]() |
68fde7d165 | ||
![]() |
501a784264 | ||
![]() |
629c184195 | ||
![]() |
76b8818a33 | ||
![]() |
6c52301a64 | ||
![]() |
be26db63ca | ||
![]() |
962bfa213f | ||
![]() |
ee00e5c914 | ||
![]() |
6343213538 | ||
![]() |
187bdc0836 | ||
![]() |
f2520f0481 | ||
![]() |
5e9a73645b | ||
![]() |
783fa3286c | ||
![]() |
77b4f9db65 | ||
![]() |
0f6f07161b | ||
![]() |
d75a836de9 |
2
.github/workflows/codeql.yml
vendored
2
.github/workflows/codeql.yml
vendored
@@ -27,7 +27,7 @@ jobs:
|
||||
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@v4
|
||||
uses: actions/checkout@v5
|
||||
|
||||
- name: Initialize CodeQL
|
||||
uses: github/codeql-action/init@v3
|
||||
|
16
.github/workflows/deploy-development.yml
vendored
16
.github/workflows/deploy-development.yml
vendored
@@ -21,7 +21,7 @@ jobs:
|
||||
- platform: linux/arm/v7
|
||||
os: ubuntu-24.04-arm
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- uses: actions/checkout@v5
|
||||
|
||||
- name: Prepare
|
||||
run: |
|
||||
@@ -85,7 +85,7 @@ jobs:
|
||||
needs: docker-build
|
||||
steps:
|
||||
- name: Download digests
|
||||
uses: actions/download-artifact@v4
|
||||
uses: actions/download-artifact@v5
|
||||
with:
|
||||
path: ${{ runner.temp }}/digests
|
||||
pattern: digests-*
|
||||
@@ -98,6 +98,13 @@ jobs:
|
||||
username: ${{ github.actor }}
|
||||
password: ${{ secrets.GITHUB_TOKEN }}
|
||||
|
||||
- name: Login to Codeberg
|
||||
uses: docker/login-action@v3
|
||||
with:
|
||||
registry: codeberg.org
|
||||
username: ${{ secrets.CODEBERG_USER }}
|
||||
password: ${{ secrets.CODEBERG_PASS }}
|
||||
|
||||
- name: Set up Docker Buildx
|
||||
uses: docker/setup-buildx-action@v3
|
||||
|
||||
@@ -107,6 +114,7 @@ jobs:
|
||||
with:
|
||||
images: |
|
||||
ghcr.io/wg-easy/wg-easy
|
||||
codeberg.org/wg-easy/wg-easy
|
||||
flavor: |
|
||||
latest=false
|
||||
tags: |
|
||||
@@ -130,10 +138,10 @@ jobs:
|
||||
contents: write
|
||||
needs: docker-merge
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- uses: actions/checkout@v5
|
||||
|
||||
- name: Setup Python
|
||||
uses: actions/setup-python@v5
|
||||
uses: actions/setup-python@v6
|
||||
with:
|
||||
python-version: 3.11.9
|
||||
cache: "pip"
|
||||
|
16
.github/workflows/deploy-edge.yml
vendored
16
.github/workflows/deploy-edge.yml
vendored
@@ -28,7 +28,7 @@ jobs:
|
||||
- platform: linux/arm/v7
|
||||
os: ubuntu-24.04-arm
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- uses: actions/checkout@v5
|
||||
with:
|
||||
ref: master
|
||||
|
||||
@@ -94,7 +94,7 @@ jobs:
|
||||
needs: docker-build
|
||||
steps:
|
||||
- name: Download digests
|
||||
uses: actions/download-artifact@v4
|
||||
uses: actions/download-artifact@v5
|
||||
with:
|
||||
path: ${{ runner.temp }}/digests
|
||||
pattern: digests-*
|
||||
@@ -107,6 +107,13 @@ jobs:
|
||||
username: ${{ github.actor }}
|
||||
password: ${{ secrets.GITHUB_TOKEN }}
|
||||
|
||||
- name: Login to Codeberg
|
||||
uses: docker/login-action@v3
|
||||
with:
|
||||
registry: codeberg.org
|
||||
username: ${{ secrets.CODEBERG_USER }}
|
||||
password: ${{ secrets.CODEBERG_PASS }}
|
||||
|
||||
- name: Set up Docker Buildx
|
||||
uses: docker/setup-buildx-action@v3
|
||||
|
||||
@@ -116,6 +123,7 @@ jobs:
|
||||
with:
|
||||
images: |
|
||||
ghcr.io/wg-easy/wg-easy
|
||||
codeberg.org/wg-easy/wg-easy
|
||||
flavor: |
|
||||
latest=false
|
||||
tags: |
|
||||
@@ -139,12 +147,12 @@ jobs:
|
||||
contents: write
|
||||
needs: docker-merge
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- uses: actions/checkout@v5
|
||||
with:
|
||||
ref: master
|
||||
|
||||
- name: Setup Python
|
||||
uses: actions/setup-python@v5
|
||||
uses: actions/setup-python@v6
|
||||
with:
|
||||
python-version: 3.11.9
|
||||
cache: "pip"
|
||||
|
2
.github/workflows/deploy-pr.yml
vendored
2
.github/workflows/deploy-pr.yml
vendored
@@ -24,7 +24,7 @@ jobs:
|
||||
- platform: linux/arm/v7
|
||||
os: ubuntu-24.04-arm
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- uses: actions/checkout@v5
|
||||
|
||||
- name: Prepare
|
||||
run: |
|
||||
|
16
.github/workflows/deploy.yml
vendored
16
.github/workflows/deploy.yml
vendored
@@ -29,7 +29,7 @@ jobs:
|
||||
- platform: linux/arm/v7
|
||||
os: ubuntu-24.04-arm
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- uses: actions/checkout@v5
|
||||
|
||||
- name: Prepare
|
||||
run: |
|
||||
@@ -95,7 +95,7 @@ jobs:
|
||||
needs: docker-build
|
||||
steps:
|
||||
- name: Download digests
|
||||
uses: actions/download-artifact@v4
|
||||
uses: actions/download-artifact@v5
|
||||
with:
|
||||
path: ${{ runner.temp }}/digests
|
||||
pattern: digests-*
|
||||
@@ -108,6 +108,13 @@ jobs:
|
||||
username: ${{ github.actor }}
|
||||
password: ${{ secrets.GITHUB_TOKEN }}
|
||||
|
||||
- name: Login to Codeberg
|
||||
uses: docker/login-action@v3
|
||||
with:
|
||||
registry: codeberg.org
|
||||
username: ${{ secrets.CODEBERG_USER }}
|
||||
password: ${{ secrets.CODEBERG_PASS }}
|
||||
|
||||
- name: Set up Docker Buildx
|
||||
uses: docker/setup-buildx-action@v3
|
||||
|
||||
@@ -117,6 +124,7 @@ jobs:
|
||||
with:
|
||||
images: |
|
||||
ghcr.io/wg-easy/wg-easy
|
||||
codeberg.org/wg-easy/wg-easy
|
||||
flavor: |
|
||||
latest=false
|
||||
tags: |
|
||||
@@ -144,10 +152,10 @@ jobs:
|
||||
contents: write
|
||||
needs: docker-merge
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- uses: actions/checkout@v5
|
||||
|
||||
- name: Setup Python
|
||||
uses: actions/setup-python@v5
|
||||
uses: actions/setup-python@v6
|
||||
with:
|
||||
python-version: 3.11.9
|
||||
cache: "pip"
|
||||
|
8
.github/workflows/lint.yml
vendored
8
.github/workflows/lint.yml
vendored
@@ -14,7 +14,7 @@ jobs:
|
||||
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@v4
|
||||
uses: actions/checkout@v5
|
||||
|
||||
- uses: pnpm/action-setup@v4
|
||||
name: Install pnpm
|
||||
@@ -22,7 +22,7 @@ jobs:
|
||||
run_install: false
|
||||
|
||||
- name: Setup Node
|
||||
uses: actions/setup-node@v4
|
||||
uses: actions/setup-node@v5
|
||||
with:
|
||||
node-version: "lts/*"
|
||||
check-latest: true
|
||||
@@ -47,7 +47,7 @@ jobs:
|
||||
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@v4
|
||||
uses: actions/checkout@v5
|
||||
|
||||
- uses: pnpm/action-setup@v4
|
||||
name: Install pnpm
|
||||
@@ -55,7 +55,7 @@ jobs:
|
||||
run_install: false
|
||||
|
||||
- name: Setup Node
|
||||
uses: actions/setup-node@v4
|
||||
uses: actions/setup-node@v5
|
||||
with:
|
||||
node-version: "lts/*"
|
||||
check-latest: true
|
||||
|
3
.github/workflows/stale.yml
vendored
3
.github/workflows/stale.yml
vendored
@@ -15,11 +15,12 @@ jobs:
|
||||
runs-on: ubuntu-latest
|
||||
if: github.repository_owner == 'wg-easy'
|
||||
permissions:
|
||||
actions: write
|
||||
issues: write
|
||||
pull-requests: write
|
||||
|
||||
steps:
|
||||
- uses: actions/stale@v9
|
||||
- uses: actions/stale@v10
|
||||
with:
|
||||
days-before-issue-stale: 30
|
||||
days-before-issue-close: 14
|
||||
|
1
.vscode/extensions.json
vendored
1
.vscode/extensions.json
vendored
@@ -4,7 +4,6 @@
|
||||
"dbaeumer.vscode-eslint",
|
||||
"antfu.goto-alias",
|
||||
"visualstudioexptteam.vscodeintellicode",
|
||||
"Nuxtr.nuxtr-vscode",
|
||||
"esbenp.prettier-vscode",
|
||||
"yoavbls.pretty-ts-errors",
|
||||
"bradlc.vscode-tailwindcss",
|
||||
|
3
.vscode/settings.json
vendored
3
.vscode/settings.json
vendored
@@ -3,9 +3,6 @@
|
||||
"editor.useTabStops": false,
|
||||
"editor.defaultFormatter": "esbenp.prettier-vscode",
|
||||
"editor.formatOnSave": true,
|
||||
"nuxtr.vueFiles.style.addStyleTag": false,
|
||||
"nuxtr.piniaFiles.defaultTemplate": "setup",
|
||||
"nuxtr.monorepoMode.DirectoryName": "src",
|
||||
"editor.codeActionsOnSave": {
|
||||
"source.fixAll.eslint": "always"
|
||||
},
|
||||
|
28
CHANGELOG.md
28
CHANGELOG.md
@@ -5,16 +5,38 @@ All notable changes to this project will be documented in this file.
|
||||
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
|
||||
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
||||
|
||||
## [Unreleased]
|
||||
## [15.1.0] - 2025-07-01
|
||||
|
||||
### Added
|
||||
|
||||
- Added Ukrainian language (#1906)
|
||||
- Add French language (#1924)
|
||||
- docs for caddy example (#1939)
|
||||
- add docs on how to add/update translation (be26db6)
|
||||
- Add german translations (#1889)
|
||||
- feat: Add Traditional Chinese (zh-HK) i18n Support (#1988)
|
||||
- Add Chinese Simplified (#1990)
|
||||
- Add option to disable ipv6 (#1951)
|
||||
|
||||
### Fixed
|
||||
|
||||
- Updated container launch commands (#1989)
|
||||
- update screenshot (962bfa2)
|
||||
|
||||
### Changed
|
||||
|
||||
- Updated dependencies
|
||||
|
||||
## [15.0.0] - 2025-05-28
|
||||
|
||||
We're super excited to announce v15!
|
||||
This update is an entire rewrite to make it even easier to set up your own VPN.
|
||||
|
||||
## Breaking Changes
|
||||
### Breaking Changes
|
||||
|
||||
As the whole setup has changed, we recommend to start from scratch. And import your existing configs.
|
||||
|
||||
## Major Changes
|
||||
### Major Changes
|
||||
|
||||
- Almost all Environment variables removed
|
||||
- New and Improved UI
|
||||
|
14
Dockerfile
14
Dockerfile
@@ -14,6 +14,12 @@ RUN pnpm install
|
||||
COPY src ./
|
||||
RUN pnpm build
|
||||
|
||||
# Build amneziawg-tools
|
||||
RUN apk add linux-headers build-base git && \
|
||||
git clone https://github.com/amnezia-vpn/amneziawg-tools.git && \
|
||||
cd amneziawg-tools/src && \
|
||||
make
|
||||
|
||||
# Copy build result to a new image.
|
||||
# This saves a lot of disk space.
|
||||
FROM docker.io/library/node:lts-alpine
|
||||
@@ -32,6 +38,10 @@ RUN cd /app/server && \
|
||||
# cli
|
||||
COPY --from=build /app/cli/cli.sh /usr/local/bin/cli
|
||||
RUN chmod +x /usr/local/bin/cli
|
||||
# Copy amneziawg-tools
|
||||
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
|
||||
RUN chmod +x /usr/bin/awg /usr/bin/awg-quick
|
||||
|
||||
# Install Linux packages
|
||||
RUN apk add --no-cache \
|
||||
@@ -44,6 +54,9 @@ RUN apk add --no-cache \
|
||||
iptables-legacy \
|
||||
wireguard-tools
|
||||
|
||||
RUN mkdir -p /etc/amnezia
|
||||
RUN ln -s /etc/wireguard /etc/amnezia/amneziawg
|
||||
|
||||
# Use iptables-legacy
|
||||
RUN update-alternatives --install /usr/sbin/iptables iptables /usr/sbin/iptables-legacy 10 --slave /usr/sbin/iptables-restore iptables-restore /usr/sbin/iptables-legacy-restore --slave /usr/sbin/iptables-save iptables-save /usr/sbin/iptables-legacy-save
|
||||
RUN update-alternatives --install /usr/sbin/ip6tables ip6tables /usr/sbin/ip6tables-legacy 10 --slave /usr/sbin/ip6tables-restore ip6tables-restore /usr/sbin/ip6tables-legacy-restore --slave /usr/sbin/ip6tables-save ip6tables-save /usr/sbin/ip6tables-legacy-save
|
||||
@@ -54,6 +67,7 @@ ENV PORT=51821
|
||||
ENV HOST=0.0.0.0
|
||||
ENV INSECURE=false
|
||||
ENV INIT_ENABLED=false
|
||||
ENV DISABLE_IPV6=false
|
||||
|
||||
LABEL org.opencontainers.image.source=https://github.com/wg-easy/wg-easy
|
||||
|
||||
|
@@ -28,6 +28,7 @@ ENV PORT=51821
|
||||
ENV HOST=0.0.0.0
|
||||
ENV INSECURE=true
|
||||
ENV INIT_ENABLED=false
|
||||
ENV DISABLE_IPV6=false
|
||||
|
||||
# Install Dependencies
|
||||
COPY src/package.json src/pnpm-lock.yaml ./
|
||||
|
@@ -12,7 +12,7 @@ You have found the easiest way to install & manage WireGuard on any Linux host!
|
||||
<!-- TOOD: update screenshot -->
|
||||
|
||||
<p align="center">
|
||||
<img src="./assets/screenshot.png" width="802" />
|
||||
<img src="./assets/screenshot.png" width="802" alt="wg-easy Screenshot" />
|
||||
</p>
|
||||
|
||||
## Features
|
||||
@@ -68,11 +68,11 @@ And log in again.
|
||||
|
||||
The easiest way to run WireGuard Easy is with Docker Compose.
|
||||
|
||||
Just download [`docker-compose.yml`](docker-compose.yml) and execute `sudo docker compose up -d`.
|
||||
Just follow [these steps](https://wg-easy.github.io/wg-easy/latest/examples/tutorials/basic-installation/) in the detailed documentation.
|
||||
|
||||
Now setup a reverse proxy to be able to access the Web UI securely from the internet.
|
||||
You can also install WireGuard Easy with the [docker run command](https://wg-easy.github.io/wg-easy/latest/examples/tutorials/docker-run/) or via [podman](https://wg-easy.github.io/wg-easy/latest/examples/tutorials/podman-nft/).
|
||||
|
||||
If you want to access the Web UI over HTTP, change the env var `INSECURE` to `true`. This is not recommended. Only use this for testing
|
||||
Now [setup a reverse proxy](https://wg-easy.github.io/wg-easy/latest/examples/tutorials/basic-installation/#setup-reverse-proxy) to be able to access the Web UI securely from the internet. This step is optional, just make sure to follow the guide [here](https://wg-easy.github.io/wg-easy/latest/examples/tutorials/reverse-proxyless/) if you decide not to do it.
|
||||
|
||||
## Donate
|
||||
|
||||
|
Binary file not shown.
Before Width: | Height: | Size: 104 KiB After Width: | Height: | Size: 185 KiB |
@@ -1,44 +0,0 @@
|
||||
volumes:
|
||||
etc_wireguard:
|
||||
|
||||
services:
|
||||
wg-easy:
|
||||
#environment:
|
||||
# Optional:
|
||||
# - PORT=51821
|
||||
# - HOST=0.0.0.0
|
||||
# - INSECURE=false
|
||||
|
||||
image: ghcr.io/wg-easy/wg-easy:15
|
||||
container_name: wg-easy
|
||||
networks:
|
||||
wg:
|
||||
ipv4_address: 10.42.42.42
|
||||
ipv6_address: fdcc:ad94:bacf:61a3::2a
|
||||
volumes:
|
||||
- etc_wireguard:/etc/wireguard
|
||||
- /lib/modules:/lib/modules:ro
|
||||
ports:
|
||||
- "51820:51820/udp"
|
||||
- "51821:51821/tcp"
|
||||
restart: unless-stopped
|
||||
cap_add:
|
||||
- NET_ADMIN
|
||||
- SYS_MODULE
|
||||
# - NET_RAW # ⚠️ Uncomment if using Podman Compose
|
||||
sysctls:
|
||||
- net.ipv4.ip_forward=1
|
||||
- net.ipv4.conf.all.src_valid_mark=1
|
||||
- net.ipv6.conf.all.disable_ipv6=0
|
||||
- net.ipv6.conf.all.forwarding=1
|
||||
- net.ipv6.conf.default.forwarding=1
|
||||
|
||||
networks:
|
||||
wg:
|
||||
driver: bridge
|
||||
enable_ipv6: true
|
||||
ipam:
|
||||
driver: default
|
||||
config:
|
||||
- subnet: 10.42.42.0/24
|
||||
- subnet: fdcc:ad94:bacf:61a3::/64
|
@@ -3,35 +3,21 @@ volumes:
|
||||
|
||||
services:
|
||||
wg-easy:
|
||||
environment:
|
||||
# Change Language:
|
||||
# (Supports: en, ua, ru, tr, no, pl, fr, de, ca, es, ko, vi, nl, is, pt, chs, cht, it, th, hi)
|
||||
- LANG=de
|
||||
# ⚠️ Required:
|
||||
# Change this to your host's public address
|
||||
- WG_HOST=raspberrypi.local
|
||||
#environment:
|
||||
# Optional:
|
||||
# - PORT=51821
|
||||
# - HOST=0.0.0.0
|
||||
# - INSECURE=false
|
||||
|
||||
# Optional:
|
||||
# - PASSWORD_HASH=$$2y$$10$$hBCoykrB95WSzuV4fafBzOHWKu9sbyVa34GJr8VV5R/pIelfEMYyG # (needs double $$, hash of 'foobar123'; see "How_to_generate_an_bcrypt_hash.md" for generate the hash)
|
||||
# - PORT=51821
|
||||
# - WG_PORT=51820
|
||||
# - WG_CONFIG_PORT=92820
|
||||
# - WG_DEFAULT_ADDRESS=10.8.0.x
|
||||
# - WG_DEFAULT_DNS=1.1.1.1
|
||||
# - WG_MTU=1420
|
||||
# - WG_ALLOWED_IPS=192.168.15.0/24, 10.0.1.0/24
|
||||
# - WG_PERSISTENT_KEEPALIVE=25
|
||||
# - WG_PRE_UP=echo "Pre Up" > /etc/wireguard/pre-up.txt
|
||||
# - WG_POST_UP=echo "Post Up" > /etc/wireguard/post-up.txt
|
||||
# - WG_PRE_DOWN=echo "Pre Down" > /etc/wireguard/pre-down.txt
|
||||
# - WG_POST_DOWN=echo "Post Down" > /etc/wireguard/post-down.txt
|
||||
# - UI_TRAFFIC_STATS=true
|
||||
# - UI_CHART_TYPE=0 # (0 Charts disabled, 1 # Line chart, 2 # Area chart, 3 # Bar chart)
|
||||
|
||||
image: ghcr.io/wg-easy/wg-easy:14
|
||||
image: ghcr.io/wg-easy/wg-easy:15
|
||||
container_name: wg-easy
|
||||
networks:
|
||||
wg:
|
||||
ipv4_address: 10.42.42.42
|
||||
ipv6_address: fdcc:ad94:bacf:61a3::2a
|
||||
volumes:
|
||||
- etc_wireguard:/etc/wireguard
|
||||
- /lib/modules:/lib/modules:ro
|
||||
ports:
|
||||
- "51820:51820/udp"
|
||||
- "51821:51821/tcp"
|
||||
@@ -43,3 +29,16 @@ services:
|
||||
sysctls:
|
||||
- net.ipv4.ip_forward=1
|
||||
- net.ipv4.conf.all.src_valid_mark=1
|
||||
- net.ipv6.conf.all.disable_ipv6=0
|
||||
- net.ipv6.conf.all.forwarding=1
|
||||
- net.ipv6.conf.default.forwarding=1
|
||||
|
||||
networks:
|
||||
wg:
|
||||
driver: bridge
|
||||
enable_ipv6: true
|
||||
ipam:
|
||||
driver: default
|
||||
config:
|
||||
- subnet: 10.42.42.0/24
|
||||
- subnet: fdcc:ad94:bacf:61a3::/64
|
||||
|
37
docs/content/advanced/config/amnezia.md
Normal file
37
docs/content/advanced/config/amnezia.md
Normal file
@@ -0,0 +1,37 @@
|
||||
---
|
||||
title: AmneziaWG
|
||||
---
|
||||
|
||||
Experimental support for AmneziaWG can be enabled by setting the `EXPERIMENTAL_AWG` environment variable to `true`. This feature is still under development and may change in future releases.
|
||||
|
||||
AmneziaWG adds multi-level transport-layer obfuscation by:
|
||||
|
||||
- Modifying packet headers
|
||||
- Randomizing handshake message sizes
|
||||
- Disguising traffic to resemble popular UDP protocols
|
||||
|
||||
These measures make it harder for third parties to analyze or identify your traffic, enhancing both privacy and security.
|
||||
|
||||
When enabled, wg-easy will automatically detect whether the AmneziaWG kernel module is available. If it is not, the system will fall back to the standard WireGuard module.
|
||||
|
||||
To override this automatic detection, set the `OVERRIDE_AUTO_AWG` environment variable. By default, this variable is unset.
|
||||
|
||||
Possible values:
|
||||
|
||||
- `awg` — Force use of AmneziaWG
|
||||
- `wg` — Force use of standard WireGuard
|
||||
|
||||
To be able to connect to wg-easy if AmneziaWG is enabled, you must have a AmneziaWG-compatible client.
|
||||
|
||||
Android:
|
||||
|
||||
- [AmneziaWG](https://play.google.com/store/apps/details?id=org.amnezia.awg) - Official Client
|
||||
- [WG Tunnel](https://play.google.com/store/apps/details?id=com.zaneschepke.wireguardautotunnel) - Third Party Client
|
||||
|
||||
iOS and macOS:
|
||||
|
||||
- [AmneziaWG](https://apps.apple.com/us/app/amneziawg/id6478942365) - Official Client
|
||||
|
||||
Windows:
|
||||
|
||||
- [AmneziaWG](https://github.com/amnezia-vpn/amneziawg-windows-client/releases) - Official Client
|
9
docs/content/advanced/config/experimental-config.md
Normal file
9
docs/content/advanced/config/experimental-config.md
Normal file
@@ -0,0 +1,9 @@
|
||||
---
|
||||
title: Experimental Configuration
|
||||
---
|
||||
|
||||
There are several experimental features that can be enabled by setting the appropriate environment variables. These features are not guaranteed to be stable and may change in future releases.
|
||||
|
||||
| Env | Default | Example | Description | Notes | More Info |
|
||||
| ---------------- | ------- | ------- | -------------------------------------- | --------------------------------------- | ------------------------ |
|
||||
| EXPERIMENTAL_AWG | false | true | Enables experimental AmneziaWG support | Planned to be enabled by default in v16 | [See here](./amnezia.md) |
|
@@ -4,8 +4,19 @@ title: Optional Configuration
|
||||
|
||||
You can set these environment variables to configure the container. They are not required, but can be useful in some cases.
|
||||
|
||||
| Env | Default | Example | Description |
|
||||
| ---------- | --------- | ----------- | ------------------------------ |
|
||||
| `PORT` | `51821` | `6789` | TCP port for Web UI. |
|
||||
| `HOST` | `0.0.0.0` | `localhost` | IP address web UI binds to. |
|
||||
| `INSECURE` | `false` | `true` | If access over http is allowed |
|
||||
| Env | Default | Example | Description |
|
||||
| -------------- | --------- | ----------- | ---------------------------------- |
|
||||
| `PORT` | `51821` | `6789` | TCP port for Web UI. |
|
||||
| `HOST` | `0.0.0.0` | `localhost` | IP address web UI binds to. |
|
||||
| `INSECURE` | `false` | `true` | If access over http is allowed |
|
||||
| `DISABLE_IPV6` | `false` | `true` | If IPv6 support should be disabled |
|
||||
|
||||
/// note | IPv6 Caveats
|
||||
|
||||
Disabling IPv6 will disable the creation of the default IPv6 firewall rules and won't add a IPv6 address to the interface and clients.
|
||||
|
||||
You will however still see a IPv6 address in the Web UI, but it won't be used.
|
||||
|
||||
This option can be removed in the future, as more devices support IPv6.
|
||||
|
||||
///
|
||||
|
@@ -6,18 +6,19 @@ If you want to run the setup without any user interaction, e.g. with a tool like
|
||||
|
||||
These will only be used during the first start of the container. After that, the setup will be disabled.
|
||||
|
||||
| Env | Example | Description | Group |
|
||||
| ---------------- | ----------------- | --------------------------------------------------------- | ----- |
|
||||
| `INIT_ENABLED` | `true` | Enables the below env vars | 0 |
|
||||
| `INIT_USERNAME` | `admin` | Sets admin username | 1 |
|
||||
| `INIT_PASSWORD` | `Se!ureP%ssw` | Sets admin password | 1 |
|
||||
| `INIT_HOST` | `vpn.example.com` | Host clients will connect to | 1 |
|
||||
| `INIT_PORT` | `51820` | Port clients will connect to and wireguard will listen on | 1 |
|
||||
| `INIT_DNS` | `1.1.1.1,8.8.8.8` | Sets global dns setting | 2 |
|
||||
| `INIT_IPV4_CIDR` | `10.8.0.0/24` | Sets IPv4 cidr | 3 |
|
||||
| `INIT_IPV6_CIDR` | `2001:0DB8::/32` | Sets IPv6 cidr | 3 |
|
||||
| Env | Example | Description | Group |
|
||||
| ------------------ | ---------------------------- | --------------------------------------------------------- | ----- |
|
||||
| `INIT_ENABLED` | `true` | Enables the below env vars | 0 |
|
||||
| `INIT_USERNAME` | `admin` | Sets admin username | 1 |
|
||||
| `INIT_PASSWORD` | `Se!ureP%ssw` | Sets admin password | 1 |
|
||||
| `INIT_HOST` | `vpn.example.com` | Host clients will connect to | 1 |
|
||||
| `INIT_PORT` | `51820` | Port clients will connect to and wireguard will listen on | 1 |
|
||||
| `INIT_DNS` | `1.1.1.1,8.8.8.8` | Sets global dns setting | 2 |
|
||||
| `INIT_IPV4_CIDR` | `10.8.0.0/24` | Sets IPv4 cidr | 3 |
|
||||
| `INIT_IPV6_CIDR` | `2001:0DB8::/32` | Sets IPv6 cidr | 3 |
|
||||
| `INIT_ALLOWED_IPS` | `10.8.0.0/24,2001:0DB8::/32` | Sets global Allowed IPs | 4 |
|
||||
|
||||
/// warning | Variables have to be used together
|
||||
/// warning | Variables have to be used together
|
||||
|
||||
If variables are in the same group, you have to set all of them. For example, if you set `INIT_IPV4_CIDR`, you also have to set `INIT_IPV6_CIDR`.
|
||||
|
||||
|
@@ -6,22 +6,24 @@ This guide will help you migrate from `v14` to version `v15` of `wg-easy`.
|
||||
|
||||
## Changes
|
||||
|
||||
- This is a complete rewrite of the `wg-easy` project. Therefore the configuration files and the way you interact with the project have changed.
|
||||
- This is a complete rewrite of the `wg-easy` project, therefore the configuration files and the way you interact with the project have changed.
|
||||
- If you use armv6, you unfortunately won't be able to migrate to `v15`.
|
||||
- If you are connecting to the web ui via HTTP, you need to set the `INSECURE` environment variable to `true` in the new container.
|
||||
- If you are connecting to the Web UI via HTTP, you need to set the `INSECURE` environment variable to `true` in the new container.
|
||||
|
||||
## Migration
|
||||
|
||||
### Backup
|
||||
|
||||
Before you start the migration, make sure to backup your existing configuration files.
|
||||
Before you start the migration, make sure to back up your existing configuration files.
|
||||
|
||||
Go into the Web Ui and click the Backup button, this should download a `wg0.json` file.
|
||||
Go into the Web UI and click the Backup button, this should download a `wg0.json` file.
|
||||
|
||||
Or download the `wg0.json` file from your container volume to your pc.
|
||||
|
||||
You will need this file for the migration
|
||||
|
||||
You will also need to back up the old environment variables you set for the container, as they will not be automatically migrated.
|
||||
|
||||
### Remove old container
|
||||
|
||||
1. Stop the running container
|
||||
@@ -32,10 +34,10 @@ If you are using `docker run`
|
||||
docker stop wg-easy
|
||||
```
|
||||
|
||||
If you are using `docker-compose`
|
||||
If you are using `docker compose`
|
||||
|
||||
```shell
|
||||
docker-compose down
|
||||
docker compose down
|
||||
```
|
||||
|
||||
### Start new container
|
||||
@@ -47,6 +49,10 @@ In the setup wizard, select that you already have a configuration file and uploa
|
||||
[docs-getting-started]: ../../getting-started.md
|
||||
[docs-examples]: ../../examples/tutorials/basic-installation.md
|
||||
|
||||
### Environment Variables
|
||||
|
||||
v15 does not use the same environment variables as v14, most of them have been moved to the Admin Panel in the Web UI.
|
||||
|
||||
### Done
|
||||
|
||||
You have now successfully migrated to `v15` of `wg-easy`.
|
||||
|
27
docs/content/contributing/translation.md
Normal file
27
docs/content/contributing/translation.md
Normal file
@@ -0,0 +1,27 @@
|
||||
---
|
||||
title: Translation
|
||||
---
|
||||
|
||||
This project supports multiple languages. If you would like to contribute a translation, please follow these steps:
|
||||
|
||||
## Add new Translation
|
||||
|
||||
Create a new file in `src/i18n/locales`. Name it `<locale_code>.json` (e.g. `fr.json` for French).
|
||||
|
||||
Import and add the newly created file in `src/i18n/i18n.config.ts`.
|
||||
|
||||
Add your language in the `src/nuxt.config.ts` file. You have to specify code, language and name.
|
||||
|
||||
`code` is the name of the translation file without the extension (e.g. `fr` for `fr.json`).
|
||||
|
||||
`language` is the BCP 47 language tag with region (e.g. `fr-FR` for French). See [www.lingoes.net](http://www.lingoes.net/en/translator/langcode.htm) for a list of language codes.
|
||||
|
||||
`name` is the display name of the language (e.g. `Français` for French).
|
||||
|
||||
## Update existing Translation
|
||||
|
||||
If you need to update an existing translation, simply edit the corresponding `<locale_code>.json` file in `src/i18n/locales`.
|
||||
|
||||
## Contribute changes
|
||||
|
||||
See [Pull Requests](./issues-and-pull-requests.md#pull-requests) on how to contribute your translation.
|
@@ -33,7 +33,7 @@ Follow the Docs here: <https://docs.docker.com/engine/install/> and install Dock
|
||||
|
||||
```shell
|
||||
cd /etc/docker/containers/wg-easy
|
||||
sudo docker-compose up -d
|
||||
sudo docker compose up -d
|
||||
```
|
||||
|
||||
## Setup Firewall
|
||||
@@ -56,8 +56,8 @@ To update `wg-easy` to the latest version, run:
|
||||
|
||||
```shell
|
||||
cd /etc/docker/containers/wg-easy
|
||||
sudo docker-compose pull
|
||||
sudo docker-compose up -d
|
||||
sudo docker compose pull
|
||||
sudo docker compose up -d
|
||||
```
|
||||
|
||||
## Auto Update
|
||||
|
@@ -2,8 +2,101 @@
|
||||
title: Caddy
|
||||
---
|
||||
|
||||
It seems like the Docs on how to setup Caddy are not available yet.
|
||||
/// note | Opinionated
|
||||
|
||||
Feel free to create a PR and add them here.
|
||||
This guide is opinionated. If you use other conventions or folder layouts, feel free to change the commands and paths.
|
||||
///
|
||||
|
||||
<!-- TODO -->
|
||||
We're using [Caddy](https://caddyserver.com/) here as reverse proxy to serve `wg-easy` on [https://wg-easy.example.com](https://wg-easy.example.com) via TLS.
|
||||
|
||||
## Create a docker composition for `caddy`
|
||||
|
||||
```txt
|
||||
.
|
||||
├── compose.yml
|
||||
└── Caddyfile
|
||||
|
||||
1 directory, 2 files
|
||||
```
|
||||
|
||||
```yaml
|
||||
# compose.yml
|
||||
|
||||
services:
|
||||
caddy:
|
||||
container_name: caddy
|
||||
image: caddy:2.10.0-alpine
|
||||
# publish everything you deem necessary
|
||||
ports:
|
||||
- '80:80/tcp'
|
||||
- '443:443/tcp'
|
||||
- '443:443/udp'
|
||||
networks:
|
||||
- caddy
|
||||
restart: unless-stopped
|
||||
volumes:
|
||||
- './Caddyfile:/etc/caddy/Caddyfile:ro'
|
||||
- config:/config
|
||||
- data:/data
|
||||
|
||||
networks:
|
||||
caddy:
|
||||
name: caddy
|
||||
|
||||
volumes:
|
||||
config:
|
||||
data:
|
||||
```
|
||||
|
||||
```txt
|
||||
# Caddyfile
|
||||
|
||||
{
|
||||
# setup your email address
|
||||
email mail@example.com
|
||||
}
|
||||
|
||||
wg-easy.example.com {
|
||||
# since the container will share the network with wg-easy
|
||||
# we can use the proper container name
|
||||
reverse_proxy wg-easy:80
|
||||
tls internal
|
||||
}
|
||||
```
|
||||
|
||||
...and start it with:
|
||||
|
||||
```shell
|
||||
sudo docker compose up -d
|
||||
```
|
||||
|
||||
## Adapt the docker composition of `wg-easy`
|
||||
|
||||
```yaml
|
||||
services:
|
||||
wg-easy:
|
||||
# sync container name and port according to Caddyfile
|
||||
container_name: wg-easy
|
||||
environment:
|
||||
- PORT=80
|
||||
# no need to publish the HTTP server anymore
|
||||
ports:
|
||||
- "51820:51820/udp"
|
||||
# add to caddy network
|
||||
networks:
|
||||
caddy:
|
||||
...
|
||||
|
||||
networks:
|
||||
caddy:
|
||||
external: true
|
||||
...
|
||||
```
|
||||
|
||||
...and restart it with:
|
||||
|
||||
```shell
|
||||
sudo docker compose up -d
|
||||
```
|
||||
|
||||
You can now access `wg-easy` at [https://wg-easy.example.com](https://wg-easy.example.com) and start the setup.
|
||||
|
@@ -7,9 +7,9 @@ To setup the IPv6 Network, simply run once:
|
||||
```shell
|
||||
docker network create \
|
||||
-d bridge --ipv6 \
|
||||
-d default \
|
||||
--subnet 10.42.42.0/24 \
|
||||
--subnet fdcc:ad94:bacf:61a3::/64 wg \
|
||||
--subnet fdcc:ad94:bacf:61a3::/64 \
|
||||
wg
|
||||
```
|
||||
|
||||
<!-- ref: major version -->
|
||||
|
@@ -141,10 +141,10 @@ sudo docker network create traefik
|
||||
## Start traefik
|
||||
|
||||
```shell
|
||||
sudo docker-compose up -d
|
||||
sudo docker compose up -d
|
||||
```
|
||||
|
||||
You can no access the Traefik dashboard at `https://traefik.$example.com$` with the credentials you set in `traefik_dynamic.yml`.
|
||||
You can now access the Traefik dashboard at `https://traefik.$example.com$` with the credentials you set in `traefik_dynamic.yml`.
|
||||
|
||||
## Add Labels to `wg-easy`
|
||||
|
||||
@@ -166,6 +166,7 @@ services:
|
||||
- "traefik.http.routers.wg-easy.entrypoints=websecure"
|
||||
- "traefik.http.routers.wg-easy.service=wg-easy"
|
||||
- "traefik.http.services.wg-easy.loadbalancer.server.port=51821"
|
||||
- "traefik.docker.network=traefik"
|
||||
...
|
||||
|
||||
networks:
|
||||
@@ -178,7 +179,7 @@ networks:
|
||||
|
||||
```shell
|
||||
cd /etc/docker/containers/wg-easy
|
||||
sudo docker-compose up -d
|
||||
sudo docker compose up -d
|
||||
```
|
||||
|
||||
You can now access `wg-easy` at `https://wg-easy.$example.com$` and start the setup.
|
||||
|
@@ -38,6 +38,7 @@ If you're using podman, make sure to read the related [documentation][docs-podma
|
||||
To understand which tags you should use, read this section carefully. [Our CI][github-ci] will automatically build, test and push new images to the following container registry:
|
||||
|
||||
1. GitHub Container Registry ([`ghcr.io/wg-easy/wg-easy`][ghcr-image])
|
||||
2. Codeberg Container Registry ([`codeberg.org/wg-easy/wg-easy`][codeberg-image]) (IPv6 support)
|
||||
|
||||
All workflows are using the tagging convention listed below. It is subsequently applied to all images.
|
||||
|
||||
@@ -50,12 +51,13 @@ All workflows are using the tagging convention listed below. It is subsequently
|
||||
| `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 |
|
||||
|
||||
<!-- ref: major version -->
|
||||
<!-- 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`).
|
||||
|
||||
[github-ci]: https://github.com/wg-easy/wg-easy/actions
|
||||
[ghcr-image]: https://github.com/wg-easy/wg-easy/pkgs/container/wg-easy
|
||||
[codeberg-image]: https://codeberg.org/wg-easy/-/packages/container/wg-easy/15
|
||||
[semver]: https://semver.org/
|
||||
|
||||
### Follow tutorials
|
||||
|
@@ -10,7 +10,7 @@
|
||||
"format:check:docs": "prettier --check docs"
|
||||
},
|
||||
"devDependencies": {
|
||||
"prettier": "^3.5.3"
|
||||
"prettier": "^3.6.2"
|
||||
},
|
||||
"packageManager": "pnpm@10.11.0"
|
||||
"packageManager": "pnpm@10.16.0"
|
||||
}
|
||||
|
10
pnpm-lock.yaml
generated
10
pnpm-lock.yaml
generated
@@ -9,16 +9,16 @@ importers:
|
||||
.:
|
||||
devDependencies:
|
||||
prettier:
|
||||
specifier: ^3.5.3
|
||||
version: 3.5.3
|
||||
specifier: ^3.6.2
|
||||
version: 3.6.2
|
||||
|
||||
packages:
|
||||
|
||||
prettier@3.5.3:
|
||||
resolution: {integrity: sha512-QQtaxnoDJeAkDvDKWCLiwIXkTgRhwYDEQCghU9Z6q03iyek/rxRh/2lC3HB7P8sWT2xC/y5JDctPLBIGzHKbhw==}
|
||||
prettier@3.6.2:
|
||||
resolution: {integrity: sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ==}
|
||||
engines: {node: '>=14'}
|
||||
hasBin: true
|
||||
|
||||
snapshots:
|
||||
|
||||
prettier@3.5.3: {}
|
||||
prettier@3.6.2: {}
|
||||
|
@@ -21,7 +21,9 @@
|
||||
<BasePrimaryButton as="span">
|
||||
<div class="flex items-center gap-3">
|
||||
<IconsSparkles class="w-4" />
|
||||
<span>{{ $t('admin.config.suggest') }}</span>
|
||||
<span class="whitespace-nowrap">
|
||||
{{ $t('admin.config.suggest') }}
|
||||
</span>
|
||||
</div>
|
||||
</BasePrimaryButton>
|
||||
</AdminSuggestDialog>
|
||||
|
20
src/app/components/Form/InfoField.vue
Normal file
20
src/app/components/Form/InfoField.vue
Normal file
@@ -0,0 +1,20 @@
|
||||
<template>
|
||||
<div class="flex items-center">
|
||||
<FormLabel :for="id">
|
||||
{{ label }}
|
||||
</FormLabel>
|
||||
<BaseTooltip v-if="description" :text="description">
|
||||
<IconsInfo class="size-4" />
|
||||
</BaseTooltip>
|
||||
</div>
|
||||
<span :id="id" class="flex flex-col justify-center">{{ data }}</span>
|
||||
</template>
|
||||
|
||||
<script lang="ts" setup>
|
||||
defineProps<{
|
||||
id: string;
|
||||
label: string;
|
||||
description?: string;
|
||||
data?: string;
|
||||
}>();
|
||||
</script>
|
@@ -44,18 +44,19 @@ const { t } = useI18n();
|
||||
|
||||
const route = useRoute();
|
||||
|
||||
const menuItems = [
|
||||
const menuItems = computed(() => [
|
||||
{ id: 'general', name: t('pages.admin.general') },
|
||||
{ id: 'config', name: t('pages.admin.config') },
|
||||
{ id: 'interface', name: t('pages.admin.interface') },
|
||||
{ id: 'hooks', name: t('pages.admin.hooks') },
|
||||
];
|
||||
]);
|
||||
|
||||
const defaultItem = { id: '', name: t('pages.admin.panel') };
|
||||
|
||||
const activeMenuItem = computed(() => {
|
||||
return (
|
||||
menuItems.find((item) => route.path === `/admin/${item.id}`) ?? defaultItem
|
||||
menuItems.value.find((item) => route.path === `/admin/${item.id}`) ??
|
||||
defaultItem
|
||||
);
|
||||
});
|
||||
</script>
|
||||
|
@@ -39,6 +39,12 @@
|
||||
v-model="data.ipv6Address"
|
||||
label="IPv6"
|
||||
/>
|
||||
<FormInfoField
|
||||
id="endpoint"
|
||||
:data="data.endpoint ?? $t('client.notConnected')"
|
||||
:label="$t('client.endpoint')"
|
||||
:description="$t('client.endpointDesc')"
|
||||
/>
|
||||
</FormGroup>
|
||||
<FormGroup>
|
||||
<FormHeading :description="$t('client.allowedIpsDesc')">
|
||||
|
@@ -1,5 +1,7 @@
|
||||
import VueApexCharts from 'vue3-apexcharts';
|
||||
|
||||
export default defineNuxtPlugin((nuxtApp) => {
|
||||
nuxtApp.vueApp.use(VueApexCharts);
|
||||
// https://github.com/apexcharts/vue3-apexcharts/issues/141
|
||||
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
||||
nuxtApp.vueApp.use(VueApexCharts as any);
|
||||
});
|
||||
|
@@ -1,9 +1,37 @@
|
||||
import en from './locales/en.json';
|
||||
import pl from './locales/pl.json';
|
||||
import uk from './locales/uk.json';
|
||||
import fr from './locales/fr.json';
|
||||
import de from './locales/de.json';
|
||||
import it from './locales/it.json';
|
||||
import ru from './locales/ru.json';
|
||||
import zhhk from './locales/zh-HK.json';
|
||||
import zhcn from './locales/zh-CN.json';
|
||||
import ko from './locales/ko.json';
|
||||
import es from './locales/es.json';
|
||||
import ptbr from './locales/pt-BR.json';
|
||||
import tr from './locales/tr.json';
|
||||
import bn from './locales/bn.json';
|
||||
import id from './locales/id.json';
|
||||
|
||||
export default defineI18nConfig(() => ({
|
||||
legacy: false,
|
||||
fallbackLocale: 'en',
|
||||
messages: {
|
||||
en,
|
||||
pl,
|
||||
uk,
|
||||
fr,
|
||||
de,
|
||||
it,
|
||||
ru,
|
||||
'zh-HK': zhhk,
|
||||
'zh-CN': zhcn,
|
||||
ko,
|
||||
es,
|
||||
'pt-BR': ptbr,
|
||||
tr,
|
||||
bn,
|
||||
id,
|
||||
},
|
||||
}));
|
||||
|
240
src/i18n/locales/bn.json
Normal file
240
src/i18n/locales/bn.json
Normal file
@@ -0,0 +1,240 @@
|
||||
{
|
||||
"pages": {
|
||||
"me": "অ্যাকাউন্ট",
|
||||
"clients": "ক্লায়েন্টস",
|
||||
"admin": {
|
||||
"panel": "অ্যাডমিন প্যানেল",
|
||||
"general": "সাধারণ",
|
||||
"config": "কনফিগ",
|
||||
"interface": "ইন্টারফেস",
|
||||
"hooks": "হুকস"
|
||||
}
|
||||
},
|
||||
"user": {
|
||||
"email": "ই-মেইল"
|
||||
},
|
||||
"me": {
|
||||
"currentPassword": "বর্তমান পাসওয়ার্ড",
|
||||
"enable2fa": "দুই স্তরের যাচাইকরণ চালু করুন",
|
||||
"enable2faDesc": "আপনার অথেন্টিকেটর অ্যাপ দিয়ে QR কোড স্ক্যান করুন অথবা কীটি ম্যানুয়ালি প্রবেশ করুন।",
|
||||
"2faKey": "TOTP কী",
|
||||
"2faCodeDesc": "আপনার অথেন্টিকেটর অ্যাপ থেকে কোডটি প্রবেশ করুন।",
|
||||
"disable2fa": "দুই স্তরের যাচাইকরণ বন্ধ করুন",
|
||||
"disable2faDesc": "দুই স্তরের যাচাইকরণ বন্ধ করতে আপনার পাসওয়ার্ড দিন।"
|
||||
},
|
||||
"general": {
|
||||
"name": "নাম",
|
||||
"username": "ইউজারনেম",
|
||||
"password": "পাসওয়ার্ড",
|
||||
"newPassword": "নতুন পাসওয়ার্ড",
|
||||
"updatePassword": "পাসওয়ার্ড আপডেট করুন",
|
||||
"mtu": "MTU",
|
||||
"allowedIps": "অনুমোদিত IPs",
|
||||
"dns": "DNS",
|
||||
"persistentKeepalive": "স্থায়ী কিপ-এলাইভ",
|
||||
"logout": "লগআউট",
|
||||
"continue": "চালিয়ে যান",
|
||||
"host": "হোস্ট",
|
||||
"port": "পোর্ট",
|
||||
"yes": "হ্যাঁ",
|
||||
"no": "না",
|
||||
"confirmPassword": "পাসওয়ার্ড নিশ্চিত করুন",
|
||||
"loading": "লোড হচ্ছে...",
|
||||
"2fa": "দুই স্তরের যাচাইকরণ",
|
||||
"2faCode": "TOTP কোড"
|
||||
},
|
||||
"setup": {
|
||||
"welcome": "wg-easy এর প্রথম সেটআপে স্বাগতম",
|
||||
"welcomeDesc": "আপনি WireGuard ইনস্টল ও পরিচালনার সবচেয়ে সহজ উপায় পেয়েছেন",
|
||||
"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": "যেদিন ক্লায়েন্ট নিষ্ক্রিয় হবে। স্থায়ী করতে ফাঁকা রাখুন",
|
||||
"deleteClient": "ক্লায়েন্ট মুছে ফেলুন",
|
||||
"deleteDialog1": "আপনি কি নিশ্চিতভাবে মুছে ফেলতে চান",
|
||||
"deleteDialog2": "এই কাজটি পূর্বাবস্থায় ফেরানো যাবে না।",
|
||||
"enabled": "সক্রিয়",
|
||||
"address": "ঠিকানা",
|
||||
"serverAllowedIps": "সার্ভার অনুমোদিত IPs",
|
||||
"otlDesc": "সংক্ষিপ্ত একবারের লিঙ্ক তৈরি করুন",
|
||||
"permanent": "স্থায়ী",
|
||||
"createdOn": "তৈরি হয়েছে",
|
||||
"lastSeen": "শেষ দেখা হয়েছে",
|
||||
"totalDownload": "মোট ডাউনলোড: ",
|
||||
"totalUpload": "মোট আপলোড: ",
|
||||
"newClient": "নতুন ক্লায়েন্ট",
|
||||
"disableClient": "ক্লায়েন্ট নিষ্ক্রিয় করুন",
|
||||
"enableClient": "ক্লায়েন্ট সক্রিয় করুন",
|
||||
"noPrivKey": "এই ক্লায়েন্টের কোনো ব্যক্তিগত কী নেই। কনফিগারেশন তৈরি করা যাবে না।",
|
||||
"showQR": "QR কোড দেখান",
|
||||
"downloadConfig": "কনফিগারেশন ডাউনলোড করুন",
|
||||
"allowedIpsDesc": "কোন IPs VPN এর মাধ্যমে রাউট হবে (গ্লোবাল কনফিগ ওভাররাইড করবে)",
|
||||
"serverAllowedIpsDesc": "কোন IPs সার্ভার ক্লায়েন্টে রাউট করবে",
|
||||
"mtuDesc": "VPN টানেলের জন্য সর্বাধিক প্যাকেট সাইজ নির্ধারণ করে",
|
||||
"persistentKeepaliveDesc": "কিপ-এলাইভ প্যাকেটের জন্য ইন্টারভাল (সেকেন্ডে)। 0 হলে বন্ধ",
|
||||
"hooks": "হুকস",
|
||||
"hooksDescription": "হুকস শুধুমাত্র wg-quick এর সাথে কাজ করে",
|
||||
"hooksLeaveEmpty": "শুধুমাত্র wg-quick এর জন্য। অন্যথায় ফাঁকা রাখুন",
|
||||
"dnsDesc": "DNS সার্ভার ক্লায়েন্টরা ব্যবহার করবে (গ্লোবাল কনফিগ ওভাররাইড করবে)",
|
||||
"notConnected": "ক্লায়েন্ট সংযুক্ত নয়",
|
||||
"endpoint": "এন্ডপয়েন্ট",
|
||||
"endpointDesc": "ক্লায়েন্টের IP যেখান থেকে WireGuard সংযোগ স্থাপন করা হয়েছে"
|
||||
},
|
||||
"dialog": {
|
||||
"change": "পরিবর্তন করুন",
|
||||
"cancel": "বাতিল করুন",
|
||||
"create": "তৈরি করুন"
|
||||
},
|
||||
"toast": {
|
||||
"success": "সফলতা",
|
||||
"saved": "সংরক্ষিত",
|
||||
"error": "ত্রুটি"
|
||||
},
|
||||
"form": {
|
||||
"actions": "কর্মসমূহ",
|
||||
"save": "সংরক্ষণ করুন",
|
||||
"revert": "পূর্বাবস্থায় ফেরান",
|
||||
"sectionGeneral": "সাধারণ",
|
||||
"sectionAdvanced": "উন্নত",
|
||||
"noItems": "কোনো আইটেম নেই",
|
||||
"nullNoItems": "কোনো আইটেম নেই। গ্লোবাল কনফিগ ব্যবহার হচ্ছে",
|
||||
"add": "যোগ করুন"
|
||||
},
|
||||
"admin": {
|
||||
"general": {
|
||||
"sessionTimeout": "সেশন টাইমআউট",
|
||||
"sessionTimeoutDesc": "মনে রাখুনের জন্য সেশন সময়কাল (সেকেন্ডে)",
|
||||
"metrics": "মেট্রিক্স",
|
||||
"metricsPassword": "পাসওয়ার্ড",
|
||||
"metricsPasswordDesc": "মেট্রিক্স এন্ডপয়েন্টের জন্য বেয়ারার পাসওয়ার্ড (পাসওয়ার্ড বা argon2 হ্যাশ)",
|
||||
"json": "JSON",
|
||||
"jsonDesc": "JSON ফরম্যাটে মেট্রিক্সের রুট",
|
||||
"prometheus": "Prometheus",
|
||||
"prometheusDesc": "Prometheus মেট্রিক্সের রুট"
|
||||
},
|
||||
"config": {
|
||||
"connection": "সংযোগ",
|
||||
"hostDesc": "পাবলিক হোস্টনেম ক্লায়েন্টরা সংযোগ করবে (কনফিগ বাতিল হবে)",
|
||||
"portDesc": "পাবলিক UDP পোর্ট ক্লায়েন্টরা সংযোগ করবে (কনফিগ বাতিল হবে, আপনি সম্ভবত ইন্টারফেস পোর্টও পরিবর্তন করতে চাইবেন)",
|
||||
"allowedIpsDesc": "অনুমোদিত IPs ক্লায়েন্টরা ব্যবহার করবে (গ্লোবাল কনফিগ)",
|
||||
"dnsDesc": "DNS সার্ভার ক্লায়েন্টরা ব্যবহার করবে (গ্লোবাল কনফিগ)",
|
||||
"mtuDesc": "MTU ক্লায়েন্টরা ব্যবহার করবে (শুধুমাত্র নতুন ক্লায়েন্টের জন্য)",
|
||||
"persistentKeepaliveDesc": "সার্ভারে কিপ-এলাইভ পাঠানোর ইন্টারভাল (সেকেন্ডে)। 0 = বন্ধ (শুধুমাত্র নতুন ক্লায়েন্টের জন্য)",
|
||||
"suggest": "পরামর্শ",
|
||||
"suggestDesc": "হোস্ট ফিল্ডের জন্য একটি IP-ঠিকানা বা হোস্টনেম নির্বাচন করুন"
|
||||
},
|
||||
"interface": {
|
||||
"cidrSuccess": "CIDR পরিবর্তন হয়েছে",
|
||||
"device": "ডিভাইস",
|
||||
"deviceDesc": "ইথারনেট ডিভাইস যার মাধ্যমে wireguard ট্রাফিক ফরওয়ার্ড হবে",
|
||||
"mtuDesc": "WireGuard ব্যবহার করবে এমন MTU",
|
||||
"portDesc": "UDP পোর্ট WireGuard শুনবে (আপনি সম্ভবত কনফিগ পোর্টও পরিবর্তন করতে চাইবেন)",
|
||||
"changeCidr": "CIDR পরিবর্তন করুন",
|
||||
"restart": "ইন্টারফেস রিস্টার্ট করুন",
|
||||
"restartDesc": "WireGuard ইন্টারফেস রিস্টার্ট করুন",
|
||||
"restartWarn": "আপনি কি নিশ্চিতভাবে ইন্টারফেস রিস্টার্ট করতে চান? এতে সব ক্লায়েন্ট সংযোগ বিচ্ছিন্ন হবে।",
|
||||
"restartSuccess": "ইন্টারফেস রিস্টার্ট হয়েছে"
|
||||
},
|
||||
"introText": "অ্যাডমিন প্যানেলে স্বাগতম।\n\nএখানে আপনি সাধারণ সেটিংস, কনফিগারেশন, ইন্টারফেস সেটিংস এবং হুকস পরিচালনা করতে পারবেন।\n\nসাইডবার থেকে একটি বিভাগ নির্বাচন করে শুরু করুন।"
|
||||
},
|
||||
"zod": {
|
||||
"generic": {
|
||||
"required": "{0} আবশ্যক",
|
||||
"validNumber": "{0} একটি বৈধ সংখ্যা হতে হবে",
|
||||
"validString": "{0} একটি বৈধ স্ট্রিং হতে হবে",
|
||||
"validBoolean": "{0} একটি বৈধ বুলিয়ান হতে হবে",
|
||||
"validArray": "{0} একটি বৈধ অ্যারে হতে হবে",
|
||||
"stringMin": "{0} কমপক্ষে {1} অক্ষর হতে হবে",
|
||||
"numberMin": "{0} কমপক্ষে {1} হতে হবে"
|
||||
},
|
||||
"client": {
|
||||
"id": "ক্লায়েন্ট আইডি",
|
||||
"name": "নাম",
|
||||
"expiresAt": "মেয়াদ শেষ",
|
||||
"address4": "IPv4 ঠিকানা",
|
||||
"address6": "IPv6 ঠিকানা",
|
||||
"serverAllowedIps": "সার্ভার অনুমোদিত IPs"
|
||||
},
|
||||
"user": {
|
||||
"username": "ইউজারনেম",
|
||||
"password": "পাসওয়ার্ড",
|
||||
"remember": "মনে রাখুন",
|
||||
"name": "নাম",
|
||||
"email": "ই-মেইল",
|
||||
"emailInvalid": "ই-মেইল একটি বৈধ ই-মেইল হতে হবে",
|
||||
"passwordMatch": "পাসওয়ার্ড মিলতে হবে",
|
||||
"totpEnable": "TOTP চালু",
|
||||
"totpEnableTrue": "TOTP চালু সত্য হতে হবে",
|
||||
"totpCode": "TOTP কোড"
|
||||
},
|
||||
"userConfig": {
|
||||
"host": "হোস্ট"
|
||||
},
|
||||
"general": {
|
||||
"sessionTimeout": "সেশন টাইমআউট",
|
||||
"metricsEnabled": "মেট্রিক্স",
|
||||
"metricsPassword": "মেট্রিক্স পাসওয়ার্ড"
|
||||
},
|
||||
"interface": {
|
||||
"cidr": "CIDR",
|
||||
"device": "ডিভাইস",
|
||||
"cidrValid": "CIDR বৈধ হতে হবে"
|
||||
},
|
||||
"otl": "একবারের লিঙ্ক",
|
||||
"stringMalformed": "স্ট্রিং বিকৃত",
|
||||
"body": "বডি একটি বৈধ অবজেক্ট হতে হবে",
|
||||
"hook": "হুক",
|
||||
"enabled": "সক্রিয়",
|
||||
"mtu": "MTU",
|
||||
"port": "পোর্ট",
|
||||
"persistentKeepalive": "স্থায়ী কিপ-এলাইভ",
|
||||
"address": "IP ঠিকানা",
|
||||
"dns": "DNS",
|
||||
"allowedIps": "অনুমোদিত IPs",
|
||||
"file": "ফাইল"
|
||||
},
|
||||
"hooks": {
|
||||
"preUp": "PreUp",
|
||||
"postUp": "PostUp",
|
||||
"preDown": "PreDown",
|
||||
"postDown": "PostDown"
|
||||
}
|
||||
}
|
237
src/i18n/locales/de.json
Normal file
237
src/i18n/locales/de.json
Normal file
@@ -0,0 +1,237 @@
|
||||
{
|
||||
"pages": {
|
||||
"me": "Konto",
|
||||
"clients": "Clients",
|
||||
"admin": {
|
||||
"panel": "Admin-Konsole",
|
||||
"general": "Allgemein",
|
||||
"config": "Konfiguration",
|
||||
"interface": "Oberfläche",
|
||||
"hooks": "Hooks"
|
||||
}
|
||||
},
|
||||
"user": {
|
||||
"email": "Email"
|
||||
},
|
||||
"me": {
|
||||
"currentPassword": "Aktuelles Passwort",
|
||||
"enable2fa": "Zwei-Faktor-Authentifizierunng aktivieren",
|
||||
"enable2faDesc": "Scannen Sie den QR-Code mit ihrer Authentifizierungs-App oder geben Sie den Schlüssel manuell ein.",
|
||||
"2faKey": "TOTP-Schlüssel",
|
||||
"2faCodeDesc": "Geben Sie den Code aus Ihrer Authentifizierungs-App ein.",
|
||||
"disable2fa": "Zwei-Faktor-Authentifizierung deaktivieren",
|
||||
"disable2faDesc": "Geben Sie Ihr Passwort ein, um die Zwei-Faktor-Authentifizierung zu deaktivieren."
|
||||
},
|
||||
"general": {
|
||||
"name": "Name",
|
||||
"username": "Benutzername",
|
||||
"password": "Passwort",
|
||||
"newPassword": "Neues Passwort",
|
||||
"updatePassword": "Passwort aktualisieren",
|
||||
"mtu": "MTU",
|
||||
"allowedIps": "Erlaubte IP-Adressen",
|
||||
"dns": "DNS",
|
||||
"persistentKeepalive": "Dauerhaftes Keepalive",
|
||||
"logout": "Abmelden",
|
||||
"continue": "Weiter",
|
||||
"host": "Host",
|
||||
"port": "Port",
|
||||
"yes": "Ja",
|
||||
"no": "Nein",
|
||||
"confirmPassword": "Passwort bestätigen",
|
||||
"loading": "Laden...",
|
||||
"2fa": "Zwei-Faktor-Authentifizierung",
|
||||
"2faCode": "TOTP-Code"
|
||||
},
|
||||
"setup": {
|
||||
"welcome": "Willkommen zur Ersteinrichtung von wg-easy",
|
||||
"welcomeDesc": "Das ist der einfachste Weg, um Wireguard auf jedem Linux-Server zu installieren und zu betreiben.",
|
||||
"existingSetup": "Haben Sie eine bestehende Einrichtung?",
|
||||
"createAdminDesc": "Bitte geben Sie zuerst einen Admin-Benutzernamen sowie ein starkes, sicheres Passwort ein. Diese Anmeldedaten benötigen Sie, um sich im Admin-Panel anzumelden.",
|
||||
"setupConfigDesc": "Bitte geben Sie die Host- und Portinformationen ein. Diese werden für die Client-Konfiguration verwendet, wenn Sie WireGuard auf Ihren Geräten einrichten.",
|
||||
"setupMigrationDesc": "Bitte halten Sie die Sicherungsdatei bereit, wenn Sie Ihre Daten von Ihrer vorherigen wg-easy Version auf ihre neue Einrichtung migrieren möchten.",
|
||||
"upload": "Hochladen",
|
||||
"migration": "Sicherung wiederherstellen:",
|
||||
"createAccount": "Konto erstellen",
|
||||
"successful": "Einrichtung erfolgreich",
|
||||
"hostDesc": "Öffentlicher Hostname mit dem sich die Clients verbinden",
|
||||
"portDesc": "Öffentlicher UDP-Port an dem sich die Clients verbinden und auf dem Wireguard läuft"
|
||||
},
|
||||
"update": {
|
||||
"updateAvailable": "Es ist ein neue Aktualisierung verfügbar!",
|
||||
"update": "Aktualisieren"
|
||||
},
|
||||
"theme": {
|
||||
"dark": "Dunkles Thema",
|
||||
"light": "Helles Thema",
|
||||
"system": "System-Thema"
|
||||
},
|
||||
"layout": {
|
||||
"toggleCharts": "Statistiken ein-/ausblenden",
|
||||
"donate": "Spenden"
|
||||
},
|
||||
"login": {
|
||||
"signIn": "Anmelden",
|
||||
"rememberMe": "Angemeldet bleiben",
|
||||
"rememberMeDesc": "Bleiben Sie auch nach dem Schließen des Browsers angemeldet",
|
||||
"insecure": "Sie können sich nicht über eine unsichere Verbindung anmelden. Bitte benutzen Sie HTTPS.",
|
||||
"2faRequired": "Zwei-Faktor-Authentifizierung wird benötigt",
|
||||
"2faWrong": "Zwei-Faktor-Authentifizierung ist fehlgeschlagen"
|
||||
},
|
||||
"client": {
|
||||
"empty": "Es gibt noch keine Clients.",
|
||||
"newShort": "Neu",
|
||||
"sort": "Sortieren",
|
||||
"create": "Client erstellen",
|
||||
"created": "Client wurde erstellt",
|
||||
"new": "Neuer client",
|
||||
"name": "Name",
|
||||
"expireDate": "Ablaufdatum",
|
||||
"expireDateDesc": "Datum, an dem der Client deaktiviert wird. Leer lassen, damit dies nie passiert.",
|
||||
"deleteClient": "Client löschen",
|
||||
"deleteDialog1": "Sind Sie sicher, dass Sie diesen Client löschen wollen",
|
||||
"deleteDialog2": "Diese Aktion kann nicht rückgängig gemacht werden.",
|
||||
"enabled": "Aktiviert",
|
||||
"address": "Adresse",
|
||||
"serverAllowedIps": "serverseitig erlaubte IP-Adressen",
|
||||
"otlDesc": "Einen kurzen Einmal-Link erzeugen",
|
||||
"permanent": "Dauerhaft",
|
||||
"createdOn": "Angelegt am ",
|
||||
"lastSeen": "Zuletzt verbunden am ",
|
||||
"totalDownload": "Gesamt-Download: ",
|
||||
"totalUpload": "Gesamt-Upload: ",
|
||||
"newClient": "Neuer Client",
|
||||
"disableClient": "Client deaktivieren",
|
||||
"enableClient": "Client aktivieren",
|
||||
"noPrivKey": "Dieser Client hat keinen bekannten privaten Schlüssel, weshalb keine Konfiguration angelegt werden kann.",
|
||||
"showQR": "QR-Code anzeigen",
|
||||
"downloadConfig": "Konfiguration herunterladen",
|
||||
"allowedIpsDesc": "Welche IP-Adressen durch das VPN geleitet werden (überschreibt die globale Konfiguration)",
|
||||
"serverAllowedIpsDesc": "Welche IP-Adressen der Server zum Client leiten wird",
|
||||
"mtuDesc": "Setzt die maximale Übertragungsgröße (Paketgröße) für den VPN-Tunnel",
|
||||
"persistentKeepaliveDesc": "Legt das Intervall (in Sekunden) für Keepalive-Pakete fest. 0 deaktiviert es",
|
||||
"hooks": "Hooks",
|
||||
"hooksDescription": "Hooks funktionieren nur mit wg-quick",
|
||||
"hooksLeaveEmpty": "Nur für wg-quick. Sonst leer lassen",
|
||||
"dnsDesc": "DNS-Server, den die Clients benutzen (überschreibt die globale Konfiguration)"
|
||||
},
|
||||
"dialog": {
|
||||
"change": "Ändern",
|
||||
"cancel": "Abbrechen",
|
||||
"create": "Erstellen"
|
||||
},
|
||||
"toast": {
|
||||
"success": "Erfolg",
|
||||
"saved": "Gespeichert",
|
||||
"error": "Fehler"
|
||||
},
|
||||
"form": {
|
||||
"actions": "Aktionen",
|
||||
"save": "Speichern",
|
||||
"revert": "Rückgängig machen",
|
||||
"sectionGeneral": "Allgemein",
|
||||
"sectionAdvanced": "Erweitert",
|
||||
"noItems": "Keine Einträge",
|
||||
"nullNoItems": "Keine Einträge. Die globale Konfiguration wird benutzt",
|
||||
"add": "Hinzufügen"
|
||||
},
|
||||
"admin": {
|
||||
"general": {
|
||||
"sessionTimeout": "Sitzungszeitüberschreitung",
|
||||
"sessionTimeoutDesc": "Sitzungsdauer für \"Angemeldet bleiben\" (Sekunden)",
|
||||
"metrics": "Statistiken",
|
||||
"metricsPassword": "Passwort",
|
||||
"metricsPasswordDesc": "Bearer-Passwort für den Statistik-Endpunkt (Passwort oder Argon2-Hash)",
|
||||
"json": "JSON",
|
||||
"jsonDesc": "Pfad zu den Statistiken als JSON",
|
||||
"prometheus": "Prometheus",
|
||||
"prometheusDesc": "Pfad zu den Prometheus-Statistiken"
|
||||
},
|
||||
"config": {
|
||||
"connection": "Verbindung",
|
||||
"hostDesc": "Öffentlicher Hostname mit dem sich die Clients verbinden (überschreibt die Konfiguration)",
|
||||
"portDesc": "Öffentlicher UDP-Port an dem sich die Clients verbinden (überschreibt die Konfiguration, vermutlich wollen Sie ebenfalls den Port der Weboberfläche ändern)",
|
||||
"allowedIpsDesc": "Erlaubte IP-Adressen, die die Clients nutzen werden (Globale Konfiguration)",
|
||||
"dnsDesc": "DNS-Server, den die Clients nutzen werden (Globale Konfiguration)",
|
||||
"mtuDesc": "MTU, den die Clients benutzen werden (nur für neue Clients)",
|
||||
"persistentKeepaliveDesc": "Intervall in Sekunden, in dem Keepalive-Packete an den Server gesendet werden. 0 = deaktiviert (nur für neue Clients)",
|
||||
"suggest": "Vorschlagen",
|
||||
"suggestDesc": "Wählen Sie eine IP-Adresse oder einen Hostnamen für das Host-Feld aus"
|
||||
},
|
||||
"interface": {
|
||||
"cidrSuccess": "CIDR wurde geändert",
|
||||
"device": "Gerät",
|
||||
"deviceDesc": "Ethernet-Gerät, durch das der Wireguard-Datenverkehr geleitet werden soll",
|
||||
"mtuDesc": "MTU, den WireGuard benutzen wird",
|
||||
"portDesc": "UDP Port, auf dem WireGuard lauschen wird (Sie wollen wahrscheinlich auch den Config-Port ändern)",
|
||||
"changeCidr": "CIDR ändern",
|
||||
"restart": "Interface neu starten",
|
||||
"restartDesc": "Das WireGuard-Interface neu starten",
|
||||
"restartWarn": "Sind Sie sicher, dass Sie das Interface neu starten wollen? Dies wird die Verbindungen aller Clients trennen.",
|
||||
"restartSuccess": "Interface neu gestartet"
|
||||
},
|
||||
"introText": "Willkommen in der Admin-Konsole.\n\nHier können Sie die allgemeinen Einstellungen, die Konfiguration, die Schnittstelleneinstellungen und die Hooks verwalten.\n\nBeginnen Sie, indem Sie einen der Bereiche in der Seitenleiste auswählen."
|
||||
},
|
||||
"zod": {
|
||||
"generic": {
|
||||
"required": "{0} ist erforderlich",
|
||||
"validNumber": "{0} muss eine Zahl sein",
|
||||
"validString": "{0} muss eine Zeichenkette sein",
|
||||
"validBoolean": "{0} muss ein Wahrheitswert sein",
|
||||
"validArray": "{0} muss eine Liste sein",
|
||||
"stringMin": "{0} muss mindestens {1} Zeichen lang sein",
|
||||
"numberMin": "{0} muss mindestens {1} sein"
|
||||
},
|
||||
"client": {
|
||||
"id": "Client-ID",
|
||||
"name": "Name",
|
||||
"expiresAt": "Läuft ab am",
|
||||
"address4": "IPv4-Adresse",
|
||||
"address6": "IPv6-Adresse",
|
||||
"serverAllowedIps": "serverseitig erlaubte IP-Adressen"
|
||||
},
|
||||
"user": {
|
||||
"username": "Benutzername",
|
||||
"password": "Passwort",
|
||||
"remember": "Merken",
|
||||
"name": "Name",
|
||||
"email": "Email",
|
||||
"emailInvalid": "Die Email-Adresse muss valide sein",
|
||||
"passwordMatch": "Die Passwörter müssen übereinstimmen",
|
||||
"totpEnable": "TOTP aktivieren",
|
||||
"totpEnableTrue": "\"TOTP aktivieren\" muss ausgewählt sein",
|
||||
"totpCode": "TOTP-Code"
|
||||
},
|
||||
"userConfig": {
|
||||
"host": "Host"
|
||||
},
|
||||
"general": {
|
||||
"sessionTimeout": "Sitzungszeitüberschreitung",
|
||||
"metricsEnabled": "Statistiken",
|
||||
"metricsPassword": "Passwort für Statistiken"
|
||||
},
|
||||
"interface": {
|
||||
"cidr": "CIDR",
|
||||
"device": "Geräte",
|
||||
"cidrValid": "CIDR muss valide sein"
|
||||
},
|
||||
"otl": "Einmal-Link",
|
||||
"stringMalformed": "Zeichenkette ist fehlerhaft",
|
||||
"body": "Body muss ein gültiges Objekt sein",
|
||||
"hook": "Hook",
|
||||
"enabled": "Aktiviert",
|
||||
"mtu": "MTU",
|
||||
"port": "Port",
|
||||
"persistentKeepalive": "Dauerhaftes Keepalive",
|
||||
"address": "IP-Adresse",
|
||||
"dns": "DNS",
|
||||
"allowedIps": "Erlaubte IP-Adressen",
|
||||
"file": "Datei"
|
||||
},
|
||||
"hooks": {
|
||||
"preUp": "PreUp",
|
||||
"postUp": "PostUp",
|
||||
"preDown": "PreDown",
|
||||
"postDown": "PostDown"
|
||||
}
|
||||
}
|
@@ -113,7 +113,10 @@
|
||||
"hooks": "Hooks",
|
||||
"hooksDescription": "Hooks only work with wg-quick",
|
||||
"hooksLeaveEmpty": "Only for wg-quick. Otherwise, leave it empty",
|
||||
"dnsDesc": "DNS server clients will use (overrides global config)"
|
||||
"dnsDesc": "DNS server clients will use (overrides global config)",
|
||||
"notConnected": "Client not connected",
|
||||
"endpoint": "Endpoint",
|
||||
"endpointDesc": "IP of the client from which the WireGuard connection is established"
|
||||
},
|
||||
"dialog": {
|
||||
"change": "Change",
|
||||
|
240
src/i18n/locales/es.json
Normal file
240
src/i18n/locales/es.json
Normal file
@@ -0,0 +1,240 @@
|
||||
{
|
||||
"pages": {
|
||||
"me": "Cuenta",
|
||||
"clients": "Clientes",
|
||||
"admin": {
|
||||
"panel": "Panel de Admin.",
|
||||
"general": "General",
|
||||
"config": "Configuración",
|
||||
"interface": "Interfaz",
|
||||
"hooks": "Hooks"
|
||||
}
|
||||
},
|
||||
"user": {
|
||||
"email": "Correo electrónico"
|
||||
},
|
||||
"me": {
|
||||
"currentPassword": "Contraseña actual",
|
||||
"enable2fa": "Habilitar autenticación en dos pasos",
|
||||
"enable2faDesc": "Escanea el código QR con tu aplicación de autenticación o introduce la clave manualmente.",
|
||||
"2faKey": "Clave TOTP",
|
||||
"2faCodeDesc": "Introduce el código de tu aplicación de autenticación.",
|
||||
"disable2fa": "Desactivar autenticación en dos pasos",
|
||||
"disable2faDesc": "Introduce tu contraseña para desactivar la autenticación en dos pasos."
|
||||
},
|
||||
"general": {
|
||||
"name": "Nombre",
|
||||
"username": "Usuario",
|
||||
"password": "Contraseña",
|
||||
"newPassword": "Nueva contraseña",
|
||||
"updatePassword": "Actualizar contraseña",
|
||||
"mtu": "MTU",
|
||||
"allowedIps": "IPs permitidas",
|
||||
"dns": "DNS",
|
||||
"persistentKeepalive": "Keepalive persistente",
|
||||
"logout": "Cerrar sesión",
|
||||
"continue": "Continuar",
|
||||
"host": "Host",
|
||||
"port": "Puerto",
|
||||
"yes": "Sí",
|
||||
"no": "No",
|
||||
"confirmPassword": "Confirmar contraseña",
|
||||
"loading": "Cargando...",
|
||||
"2fa": "Autenticación en dos pasos",
|
||||
"2faCode": "Código TOTP"
|
||||
},
|
||||
"setup": {
|
||||
"welcome": "Bienvenido a tu primera configuración de wg-easy",
|
||||
"welcomeDesc": "Has encontrado la forma más fácil de instalar y gestionar WireGuard en cualquier host Linux",
|
||||
"existingSetup": "¿Tienes una configuración existente?",
|
||||
"createAdminDesc": "Por favor, introduce un nombre de usuario y una contraseña segura. Esta información se usará para iniciar sesión en el panel de administración.",
|
||||
"setupConfigDesc": "Introduce la información del host y puerto. Se utilizará para la configuración del cliente al instalar WireGuard en sus dispositivos.",
|
||||
"setupMigrationDesc": "Proporciona el archivo de copia de seguridad si deseas migrar tus datos desde una versión anterior de wg-easy a esta nueva configuración.",
|
||||
"upload": "Subir",
|
||||
"migration": "Restaurar copia de seguridad:",
|
||||
"createAccount": "Crear cuenta",
|
||||
"successful": "Configuración completada",
|
||||
"hostDesc": "Nombre de host público al que se conectarán los clientes",
|
||||
"portDesc": "Puerto UDP público al que se conectarán los clientes y que escuchará WireGuard"
|
||||
},
|
||||
"update": {
|
||||
"updateAvailable": "¡Hay una actualización disponible!",
|
||||
"update": "Actualizar"
|
||||
},
|
||||
"theme": {
|
||||
"dark": "Tema oscuro",
|
||||
"light": "Tema claro",
|
||||
"system": "Tema del sistema"
|
||||
},
|
||||
"layout": {
|
||||
"toggleCharts": "Mostrar/ocultar gráficos",
|
||||
"donate": "Donar"
|
||||
},
|
||||
"login": {
|
||||
"signIn": "Iniciar sesión",
|
||||
"rememberMe": "Recordarme",
|
||||
"rememberMeDesc": "Mantener sesión iniciada tras cerrar el navegador",
|
||||
"insecure": "No puedes iniciar sesión con una conexión no segura. Usa HTTPS.",
|
||||
"2faRequired": "Se requiere autenticación en dos pasos",
|
||||
"2faWrong": "El código de autenticación en dos pasos es incorrecto"
|
||||
},
|
||||
"client": {
|
||||
"empty": "No hay clientes todavía.",
|
||||
"newShort": "Nuevo",
|
||||
"sort": "Ordenar",
|
||||
"create": "Crear cliente",
|
||||
"created": "Cliente creado",
|
||||
"new": "Nuevo cliente",
|
||||
"name": "Nombre",
|
||||
"expireDate": "Fecha de expiración",
|
||||
"expireDateDesc": "Fecha en que el cliente será desactivado. En blanco = permanente",
|
||||
"deleteClient": "Eliminar cliente",
|
||||
"deleteDialog1": "¿Estás seguro de que deseas eliminar a",
|
||||
"deleteDialog2": "Esta acción no se puede deshacer.",
|
||||
"enabled": "Habilitado",
|
||||
"address": "Dirección",
|
||||
"serverAllowedIps": "IPs permitidas del servidor",
|
||||
"otlDesc": "Generar enlace único de un solo uso",
|
||||
"permanent": "Permanente",
|
||||
"createdOn": "Creado el ",
|
||||
"lastSeen": "Última conexión el ",
|
||||
"totalDownload": "Descarga total: ",
|
||||
"totalUpload": "Subida total: ",
|
||||
"newClient": "Nuevo cliente",
|
||||
"disableClient": "Desactivar cliente",
|
||||
"enableClient": "Activar cliente",
|
||||
"noPrivKey": "Este cliente no tiene clave privada conocida. No se puede crear la configuración.",
|
||||
"showQR": "Mostrar código QR",
|
||||
"downloadConfig": "Descargar configuración",
|
||||
"allowedIpsDesc": "Qué IPs se enrutarán por la VPN (anula la configuración global)",
|
||||
"serverAllowedIpsDesc": "Qué IPs el servidor enviará al cliente",
|
||||
"mtuDesc": "Tamaño máximo de paquete (MTU) para el túnel VPN",
|
||||
"persistentKeepaliveDesc": "Intervalo (en segundos) para los paquetes keep-alive. 0 lo desactiva",
|
||||
"hooks": "Hooks",
|
||||
"hooksDescription": "Los hooks solo funcionan con wg-quick",
|
||||
"hooksLeaveEmpty": "Solo para wg-quick. En caso contrario, dejar vacío",
|
||||
"dnsDesc": "Servidor DNS que usarán los clientes (anula la configuración global)",
|
||||
"notConnected": "Cliente no conectado",
|
||||
"endpoint": "Punto de conexión",
|
||||
"endpointDesc": "IP del cliente desde donde se establece la conexión WireGuard"
|
||||
},
|
||||
"dialog": {
|
||||
"change": "Cambiar",
|
||||
"cancel": "Cancelar",
|
||||
"create": "Crear"
|
||||
},
|
||||
"toast": {
|
||||
"success": "Éxito",
|
||||
"saved": "Guardado",
|
||||
"error": "Error"
|
||||
},
|
||||
"form": {
|
||||
"actions": "Acciones",
|
||||
"save": "Guardar",
|
||||
"revert": "Revertir",
|
||||
"sectionGeneral": "General",
|
||||
"sectionAdvanced": "Avanzado",
|
||||
"noItems": "Sin elementos",
|
||||
"nullNoItems": "Sin elementos. Usando configuración global",
|
||||
"add": "Añadir"
|
||||
},
|
||||
"admin": {
|
||||
"general": {
|
||||
"sessionTimeout": "Tiempo de sesión",
|
||||
"sessionTimeoutDesc": "Duración de sesión con 'Recordarme' (en segundos)",
|
||||
"metrics": "Métricas",
|
||||
"metricsPassword": "Contraseña",
|
||||
"metricsPasswordDesc": "Contraseña Bearer para el endpoint de métricas (contraseña o hash argon2)",
|
||||
"json": "JSON",
|
||||
"jsonDesc": "Ruta para métricas en formato JSON",
|
||||
"prometheus": "Prometheus",
|
||||
"prometheusDesc": "Ruta para métricas de Prometheus"
|
||||
},
|
||||
"config": {
|
||||
"connection": "Conexión",
|
||||
"hostDesc": "Nombre de host público al que se conectarán los clientes (invalida config)",
|
||||
"portDesc": "Puerto UDP público al que se conectarán los clientes (invalida config, también debes cambiar el puerto de interfaz)",
|
||||
"allowedIpsDesc": "IPs permitidas que usarán los clientes (configuración global)",
|
||||
"dnsDesc": "Servidor DNS que usarán los clientes (configuración global)",
|
||||
"mtuDesc": "MTU que usarán los clientes (solo para nuevos clientes)",
|
||||
"persistentKeepaliveDesc": "Intervalo en segundos para enviar keepalives al servidor. 0 = desactivado (solo para nuevos clientes)",
|
||||
"suggest": "Sugerir",
|
||||
"suggestDesc": "Elegir dirección IP o nombre de host para el campo Host"
|
||||
},
|
||||
"interface": {
|
||||
"cidrSuccess": "CIDR cambiado",
|
||||
"device": "Dispositivo",
|
||||
"deviceDesc": "Dispositivo Ethernet por donde se reenviará el tráfico de WireGuard",
|
||||
"mtuDesc": "MTU que usará WireGuard",
|
||||
"portDesc": "Puerto UDP en el que escuchará WireGuard (debes cambiar también el puerto de config)",
|
||||
"changeCidr": "Cambiar CIDR",
|
||||
"restart": "Reiniciar interfaz",
|
||||
"restartDesc": "Reiniciar la interfaz de WireGuard",
|
||||
"restartWarn": "¿Estás seguro de reiniciar la interfaz? Esto desconectará a todos los clientes.",
|
||||
"restartSuccess": "Interfaz reiniciada"
|
||||
},
|
||||
"introText": "Bienvenido al panel de administración.\n\nAquí puedes gestionar los ajustes generales, la configuración, la interfaz y los hooks.\n\nEmpieza eligiendo una de las secciones en la barra lateral."
|
||||
},
|
||||
"zod": {
|
||||
"generic": {
|
||||
"required": "{0} es obligatorio",
|
||||
"validNumber": "{0} debe ser un número válido",
|
||||
"validString": "{0} debe ser una cadena válida",
|
||||
"validBoolean": "{0} debe ser un booleano válido",
|
||||
"validArray": "{0} debe ser una lista válida",
|
||||
"stringMin": "{0} debe tener al menos {1} caracteres",
|
||||
"numberMin": "{0} debe ser al menos {1}"
|
||||
},
|
||||
"client": {
|
||||
"id": "ID del cliente",
|
||||
"name": "Nombre",
|
||||
"expiresAt": "Expira el",
|
||||
"address4": "Dirección IPv4",
|
||||
"address6": "Dirección IPv6",
|
||||
"serverAllowedIps": "IPs permitidas del servidor"
|
||||
},
|
||||
"user": {
|
||||
"username": "Usuario",
|
||||
"password": "Contraseña",
|
||||
"remember": "Recordar",
|
||||
"name": "Nombre",
|
||||
"email": "Correo electrónico",
|
||||
"emailInvalid": "El correo electrónico debe ser válido",
|
||||
"passwordMatch": "Las contraseñas deben coincidir",
|
||||
"totpEnable": "Activar TOTP",
|
||||
"totpEnableTrue": "Debe estar activado",
|
||||
"totpCode": "Código TOTP"
|
||||
},
|
||||
"userConfig": {
|
||||
"host": "Host"
|
||||
},
|
||||
"general": {
|
||||
"sessionTimeout": "Tiempo de sesión",
|
||||
"metricsEnabled": "Métricas",
|
||||
"metricsPassword": "Contraseña de métricas"
|
||||
},
|
||||
"interface": {
|
||||
"cidr": "CIDR",
|
||||
"device": "Dispositivo",
|
||||
"cidrValid": "El CIDR debe ser válido"
|
||||
},
|
||||
"otl": "Enlace de un solo uso",
|
||||
"stringMalformed": "Cadena malformada",
|
||||
"body": "El cuerpo debe ser un objeto válido",
|
||||
"hook": "Hook",
|
||||
"enabled": "Habilitado",
|
||||
"mtu": "MTU",
|
||||
"port": "Puerto",
|
||||
"persistentKeepalive": "Keepalive persistente",
|
||||
"address": "Dirección IP",
|
||||
"dns": "DNS",
|
||||
"allowedIps": "IPs permitidas",
|
||||
"file": "Archivo"
|
||||
},
|
||||
"hooks": {
|
||||
"preUp": "PreUp",
|
||||
"postUp": "PostUp",
|
||||
"preDown": "PreDown",
|
||||
"postDown": "PostDown"
|
||||
}
|
||||
}
|
240
src/i18n/locales/fr.json
Normal file
240
src/i18n/locales/fr.json
Normal file
@@ -0,0 +1,240 @@
|
||||
{
|
||||
"pages": {
|
||||
"me": "Compte",
|
||||
"clients": "Clients",
|
||||
"admin": {
|
||||
"panel": "Panel Admin",
|
||||
"general": "Général",
|
||||
"config": "Config",
|
||||
"interface": "Interface",
|
||||
"hooks": "Hooks"
|
||||
}
|
||||
},
|
||||
"user": {
|
||||
"email": "E-Mail"
|
||||
},
|
||||
"me": {
|
||||
"currentPassword": "Mot de passe actuel",
|
||||
"enable2fa": "Activer l'authentification à double facteur",
|
||||
"enable2faDesc": "Scannez le code QR avec votre application d'authentification ou saisissez la clé manuellement.",
|
||||
"2faKey": "Clé TOTP",
|
||||
"2faCodeDesc": "Saisissez le code de votre application d'authentification.",
|
||||
"disable2fa": "Désactiver l'authentification à double facteur",
|
||||
"disable2faDesc": "Saisissez votre mot de passe pour désactiver l'authentification à double facteur"
|
||||
},
|
||||
"general": {
|
||||
"name": "Nom",
|
||||
"username": "Nom d'utilisateur",
|
||||
"password": "Mot de passe",
|
||||
"newPassword": "Nouveau mot de passe",
|
||||
"updatePassword": "Mettre à jour le mot de passe",
|
||||
"mtu": "MTU",
|
||||
"allowedIps": "IPs autorisées",
|
||||
"dns": "DNS",
|
||||
"persistentKeepalive": "Keepalive persistant",
|
||||
"logout": "Déconnexion",
|
||||
"continue": "Continuer",
|
||||
"host": "Hôte",
|
||||
"port": "Port",
|
||||
"yes": "Oui",
|
||||
"no": "Non",
|
||||
"confirmPassword": "Confirmer le mot de passe",
|
||||
"loading": "Chargement...",
|
||||
"2fa": "Authentification à double facteur",
|
||||
"2faCode": "Code TOTP"
|
||||
},
|
||||
"setup": {
|
||||
"welcome": "Bienvenue dans votre première installation de wg-easy",
|
||||
"welcomeDesc": "Vous avez trouvé la façon la plus simple d'installer et de gérer WireGuard sur n'importe quel hôte Linux.",
|
||||
"existingSetup": "Avez-vous une installation existante ?",
|
||||
"createAdminDesc": "Veuillez d'abord saisir un nom d'utilisateur administrateur et un mot de passe sécurisé. Ces informations seront utilisées pour vous connecter à votre panel d'administration.",
|
||||
"setupConfigDesc": "Veuillez saisir les informations relatives à l'hôte et au port. Ceci sera utilisé pour la configuration du client lors de la mise en place de WireGuard sur les appareils.",
|
||||
"setupMigrationDesc": "Veuillez fournir le fichier de sauvegarde si vous souhaitez migrer vos données de la version précédente de wg-easy vers votre nouvelle installation.",
|
||||
"upload": "Téléverser",
|
||||
"migration": "Restaurer la sauvegarde:",
|
||||
"createAccount": "Créer un compte",
|
||||
"successful": "Installation réussie",
|
||||
"hostDesc": "Nom d'hôte public auquel les clients se connecteront",
|
||||
"portDesc": "Port UDP public auquel les clients se connecteront et sur lequel WireGuard écoutera"
|
||||
},
|
||||
"update": {
|
||||
"updateAvailable": "Une mise à jour est disponible!",
|
||||
"update": "Mise à jour"
|
||||
},
|
||||
"theme": {
|
||||
"dark": "Thème sombre",
|
||||
"light": "Thème clair",
|
||||
"system": "Thème système"
|
||||
},
|
||||
"layout": {
|
||||
"toggleCharts": "Afficher/masquer les graphiques",
|
||||
"donate": "Donation"
|
||||
},
|
||||
"login": {
|
||||
"signIn": "Se connecter",
|
||||
"rememberMe": "Se souvenir de moi",
|
||||
"rememberMeDesc": "Rester connecté après avoir fermé le navigateur",
|
||||
"insecure": "Vous ne pouvez pas vous connecter avec une connexion non sécurisée. Utilisez HTTPS.",
|
||||
"2faRequired": "Une authentification à double facteur est requise",
|
||||
"2faWrong": "L'authentification à double facteur est incorrecte"
|
||||
},
|
||||
"client": {
|
||||
"empty": "Il n'y a pas encore de clients.",
|
||||
"newShort": "Nouveau",
|
||||
"sort": "Trier",
|
||||
"create": "Créer un client",
|
||||
"created": "Client créé",
|
||||
"new": "Nouveau client",
|
||||
"name": "Nom",
|
||||
"expireDate": "Date d'expiration",
|
||||
"expireDateDesc": "Date à laquelle le client sera désactivé. Vide pour permanent",
|
||||
"deleteClient": "Supprimer le client",
|
||||
"deleteDialog1": "Êtes-vous sûr de vouloir supprimer",
|
||||
"deleteDialog2": "Cette action ne peut être annulée.",
|
||||
"enabled": "Activé",
|
||||
"address": "Adresse",
|
||||
"serverAllowedIps": "Serveur IPs autorisées",
|
||||
"otlDesc": "Générer un lien court et unique",
|
||||
"permanent": "Permanent",
|
||||
"createdOn": "Créé le ",
|
||||
"lastSeen": "Dernière visite le ",
|
||||
"totalDownload": "Téléchargement total: ",
|
||||
"totalUpload": "Téléversement total: ",
|
||||
"newClient": "Nouveau client",
|
||||
"disableClient": "Désactiver le client",
|
||||
"enableClient": "Activer le client",
|
||||
"noPrivKey": "Ce client n'a pas de clé privée connue. Impossible de créer une configuration.",
|
||||
"showQR": "Afficher le code QR",
|
||||
"downloadConfig": "Télécharger la configuration",
|
||||
"allowedIpsDesc": "Quelles IPs seront acheminées par le VPN (remplace la configuration globale)",
|
||||
"serverAllowedIpsDesc": "Les IPs que le serveur acheminera vers le client",
|
||||
"mtuDesc": "Définit le nombre maximum d'unités de transmission (taille des paquets) pour le tunnel VPN.",
|
||||
"persistentKeepaliveDesc": "Définit l'intervalle (en secondes) pour les paquets keep-alive. 0 le désactive",
|
||||
"hooks": "Hooks",
|
||||
"hooksDescription": "Les hooks ne fonctionnent qu'avec wg-quick",
|
||||
"hooksLeaveEmpty": "Uniquement pour wg-quick. Sinon, laissez-le vide",
|
||||
"dnsDesc": "Serveur DNS que les clients utiliseront (remplace la configuration globale)",
|
||||
"notConnected": "Client non connecté",
|
||||
"endpoint": "Endpoint",
|
||||
"endpointDesc": "Adresse IP du client à partir duquel la connexion WireGuard est établie"
|
||||
},
|
||||
"dialog": {
|
||||
"change": "Modifier",
|
||||
"cancel": "Annuler",
|
||||
"create": "Créer"
|
||||
},
|
||||
"toast": {
|
||||
"success": "Réussite",
|
||||
"saved": "Sauvegardé",
|
||||
"error": "Erreur"
|
||||
},
|
||||
"form": {
|
||||
"actions": "Actions",
|
||||
"save": "Sauvegarder",
|
||||
"revert": "Revenir en arrière",
|
||||
"sectionGeneral": "Général",
|
||||
"sectionAdvanced": "Avancé",
|
||||
"noItems": "Aucun élément",
|
||||
"nullNoItems": "Aucun élément. Utilisation de la configuration globale",
|
||||
"add": "Ajouter"
|
||||
},
|
||||
"admin": {
|
||||
"general": {
|
||||
"sessionTimeout": "Délai d'expiration de la session",
|
||||
"sessionTimeoutDesc": "Durée de la session pour Se souvenir de moi (secondes)",
|
||||
"metrics": "Métriques",
|
||||
"metricsPassword": "Mot de passe",
|
||||
"metricsPasswordDesc": "Mot de passe Bearer pour le endpoint des métriques (mot de passe ou argon2 hash)",
|
||||
"json": "JSON",
|
||||
"jsonDesc": "Acheminement pour les métriques au format JSON",
|
||||
"prometheus": "Prometheus",
|
||||
"prometheusDesc": "Acheminement pour les métriques de Prometheus"
|
||||
},
|
||||
"config": {
|
||||
"connection": "Connexion",
|
||||
"hostDesc": "Nom d'hôte public auquel les clients se connecteront (invalide la configuration)",
|
||||
"portDesc": "Port UDP public auquel les clients se connecteront (invalide la configuration, vous souhaiterez probablement modifier le port d'interface également)",
|
||||
"allowedIpsDesc": "IPs autorisées que les clients utiliseront (configuration globale)",
|
||||
"dnsDesc": "Serveur DNS que les clients utiliseront (configuration globale)",
|
||||
"mtuDesc": "MTU que les clients utiliseront (uniquement pour les nouveaux clients)",
|
||||
"persistentKeepaliveDesc": "Intervalle en secondes keepalives du serveur. 0 = désactivé (uniquement pour les nouveaux clients)",
|
||||
"suggest": "Suggérer",
|
||||
"suggestDesc": "Choisissez une adresse IP ou un nom d'hôte pour le champ Hôte."
|
||||
},
|
||||
"interface": {
|
||||
"cidrSuccess": "CIDR modifié",
|
||||
"device": "Périphérique",
|
||||
"deviceDesc": "Périphérique Ethernet dans lequel le trafic wireguard sera transmis.",
|
||||
"mtuDesc": "MTU que WireGuard utilisera",
|
||||
"portDesc": "Port UDP sur lequel WireGuard écoutera (vous souhaiterez probablement changer le port de configuration aussi)",
|
||||
"changeCidr": "Modifier CIDR",
|
||||
"restart": "Redémarrer l'interface",
|
||||
"restartDesc": "Redémarre l'interface WireGuard",
|
||||
"restartWarn": "Êtes-vous sûr de redémarrer l'interface ? Cela déconnectera tous les clients.",
|
||||
"restartSuccess": "Interface redémarrée"
|
||||
},
|
||||
"introText": "Bienvenue dans le panel d'administration.\n\nVous pouvez y gérer les paramètres généraux, la configuration, les paramètres de l'interface et les hooks.\n\nCommencez par choisir l'une des sections de la barre latérale."
|
||||
},
|
||||
"zod": {
|
||||
"generic": {
|
||||
"required": "{0} est requis",
|
||||
"validNumber": "{0} doit être un nombre valide",
|
||||
"validString": "{0} doit être une chaîne de caractères valide",
|
||||
"validBoolean": "{0} doit être une variable valide",
|
||||
"validArray": "{0} doit être un tableau valide",
|
||||
"stringMin": "{0} doit être d'au moins {1} Caractère",
|
||||
"numberMin": "{0} doit être d'au moins {1}"
|
||||
},
|
||||
"client": {
|
||||
"id": "Client ID",
|
||||
"name": "Nom",
|
||||
"expiresAt": "Expire le",
|
||||
"address4": "Adresse IPv4",
|
||||
"address6": "Adresse IPv6",
|
||||
"serverAllowedIps": "Serveur IPs autorisées"
|
||||
},
|
||||
"user": {
|
||||
"username": "Nom d'utilisateur",
|
||||
"password": "Mot de passe",
|
||||
"remember": "Se souvenir",
|
||||
"name": "Nom",
|
||||
"email": "Email",
|
||||
"emailInvalid": "L'email doit être valide",
|
||||
"passwordMatch": "Les mots de passe doivent correspondre",
|
||||
"totpEnable": "Activer TOTP",
|
||||
"totpEnableTrue": "Activer TOTP doit être activé",
|
||||
"totpCode": "Code TOTP"
|
||||
},
|
||||
"userConfig": {
|
||||
"host": "Hôte"
|
||||
},
|
||||
"general": {
|
||||
"sessionTimeout": "Délai d'expiration de la session",
|
||||
"metricsEnabled": "Métriques",
|
||||
"metricsPassword": "Mot de passe métriques"
|
||||
},
|
||||
"interface": {
|
||||
"cidr": "CIDR",
|
||||
"device": "Périphérique",
|
||||
"cidrValid": "CIDR doit être valide"
|
||||
},
|
||||
"otl": "Lien unique",
|
||||
"stringMalformed": "La chaîne est malformée",
|
||||
"body": "Le corps doit être un objet valide",
|
||||
"hook": "Hook",
|
||||
"enabled": "Activé",
|
||||
"mtu": "MTU",
|
||||
"port": "Port",
|
||||
"persistentKeepalive": "Keepalive persistant",
|
||||
"address": "Adresse IP",
|
||||
"dns": "DNS",
|
||||
"allowedIps": "IPs autorisées",
|
||||
"file": "Fichier"
|
||||
},
|
||||
"hooks": {
|
||||
"preUp": "PreUp",
|
||||
"postUp": "PostUp",
|
||||
"preDown": "PreDown",
|
||||
"postDown": "PostDown"
|
||||
}
|
||||
}
|
240
src/i18n/locales/id.json
Normal file
240
src/i18n/locales/id.json
Normal file
@@ -0,0 +1,240 @@
|
||||
{
|
||||
"pages": {
|
||||
"me": "Akun",
|
||||
"clients": "Klien",
|
||||
"admin": {
|
||||
"panel": "Panel Admin",
|
||||
"general": "General",
|
||||
"config": "Umum",
|
||||
"interface": "Antarmuka",
|
||||
"hooks": "Hooks"
|
||||
}
|
||||
},
|
||||
"user": {
|
||||
"email": "E-Mail"
|
||||
},
|
||||
"me": {
|
||||
"currentPassword": "Kata Sandi Saat Ini",
|
||||
"enable2fa": "Aktifkan autentikasi dua faktor",
|
||||
"enable2faDesc": "Pindai kode QR dengan aplikasi autentikator anda atau masukkan kuncinya secara manual.",
|
||||
"2faKey": "Kunci TOTP",
|
||||
"2faCodeDesc": "Masukkan kode dari aplikasi autentikator Anda.",
|
||||
"disable2fa": "Nonaktifkan autentikasi dua faktor",
|
||||
"disable2faDesc": "Masukkan kata sandi anda untuk menonaktifkan autentikasi dua faktor."
|
||||
},
|
||||
"general": {
|
||||
"name": "Nama",
|
||||
"username": "Name Pengguna",
|
||||
"password": "Kata Sandi",
|
||||
"newPassword": "Kata Sandi Baru",
|
||||
"updatePassword": "Ubah Kata Sandi",
|
||||
"mtu": "MTU",
|
||||
"allowedIps": "IP yang diizinkan",
|
||||
"dns": "DNS",
|
||||
"persistentKeepalive": "Keepalive Persisten",
|
||||
"logout": "Keluar",
|
||||
"continue": "Lanjutkan",
|
||||
"host": "Host",
|
||||
"port": "Port",
|
||||
"yes": "Ya",
|
||||
"no": "Tidak",
|
||||
"confirmPassword": "Konfirmasi Kata Sandi",
|
||||
"loading": "Memuat...",
|
||||
"2fa": "Autentikasi Dua Faktor",
|
||||
"2faCode": "Kode TOTP"
|
||||
},
|
||||
"setup": {
|
||||
"welcome": "Selamat datang di pengaturan pertama wg-easy anda",
|
||||
"welcomeDesc": "Anda telah menemukan cara termudah untuk menginstal dan mengelola WireGuard di host Linux mana pun",
|
||||
"existingSetup": "Apakah anda sudah memiliki pengaturan sebelumnya?",
|
||||
"createAdminDesc": "Silakan masukkan dulu nama pengguna admin dan kata sandi yang kuat dan aman. Informasi ini akan digunakan untuk masuk ke panel administrasi Anda.",
|
||||
"setupConfigDesc": "Silakan masukkan informasi host dan port. Ini akan digunakan untuk konfigurasi klien saat mengatur WireGuard di perangkat mereka.",
|
||||
"setupMigrationDesc": "Silakan berikan file cadangan jika anda ingin memigrasikan data dari versi wg-easy sebelumnya ke pengaturan baru anda.",
|
||||
"upload": "Unggah",
|
||||
"migration": "Pulihkan cadangan:",
|
||||
"createAccount": "Buat Akun",
|
||||
"successful": "Pengaturan berhasil",
|
||||
"hostDesc": "Hostname publik yang akan digunakan klien untuk terhubung",
|
||||
"portDesc": "Port UDP publik yang akan digunakan klien untuk terhubung dan dibaca oleh WireGuard"
|
||||
},
|
||||
"update": {
|
||||
"updateAvailable": "Ada pembaruan tersedia!",
|
||||
"update": "Pembaruan"
|
||||
},
|
||||
"theme": {
|
||||
"dark": "Tema gelap",
|
||||
"light": "Tema terang",
|
||||
"system": "Tema sistem"
|
||||
},
|
||||
"layout": {
|
||||
"toggleCharts": "Tampilkan/sembunyikan Grafik",
|
||||
"donate": "Donasi"
|
||||
},
|
||||
"login": {
|
||||
"signIn": "Masuk",
|
||||
"rememberMe": "Ingat saya",
|
||||
"rememberMeDesc": "Tetap masuk setelah menutup browser",
|
||||
"insecure": "Anda tidak dapat masuk dengan koneksi yang tidak aman. Gunakan HTTPS.",
|
||||
"2faRequired": "Autentikasi dua faktor wajib digunakan",
|
||||
"2faWrong": "Autentikasi dua faktor salah"
|
||||
},
|
||||
"client": {
|
||||
"empty": "Belum ada klien.",
|
||||
"newShort": "Baru",
|
||||
"sort": "Urutkan",
|
||||
"create": "Buat Klien",
|
||||
"created": "Klien terbuat",
|
||||
"new": "Klien Baru",
|
||||
"name": "Nama",
|
||||
"expireDate": "Tanggal Kedaluwarsa",
|
||||
"expireDateDesc": "Tanggal klien akan dinonaktifkan. Kosongkan untuk opsi permanen.",
|
||||
"deleteClient": "Hapus Klien",
|
||||
"deleteDialog1": "Apakah anda yakin ingin menghapus",
|
||||
"deleteDialog2": "Tindakan ini tidak dapat dibatalkan.",
|
||||
"enabled": "Aktifkan",
|
||||
"address": "Alamat",
|
||||
"serverAllowedIps": "IP yang Diizinkan pada Server",
|
||||
"otlDesc": "Buat tautan sekali pakai singkat",
|
||||
"permanent": "Permanen",
|
||||
"createdOn": "Dibuat pada ",
|
||||
"lastSeen": "Terakhir terlihat pada ",
|
||||
"totalDownload": "Total Unduhan: ",
|
||||
"totalUpload": "Total Unggahan: ",
|
||||
"newClient": "Klien Baru",
|
||||
"disableClient": "Nonaktifkan Klien",
|
||||
"enableClient": "Aktifkan Klien",
|
||||
"noPrivKey": "Klien ini tidak memiliki kunci pribadi (private key) yang diketahui. Tidak dapat membuat konfigurasi.",
|
||||
"showQR": "Tampilkan Kode QR",
|
||||
"downloadConfig": "Unduh Konfigurasi",
|
||||
"allowedIpsDesc": "IP mana yang akan dialihkan melalui VPN (menggantikan konfigurasi global)",
|
||||
"serverAllowedIpsDesc": "IP mana yang akan dialihkan server ke klien",
|
||||
"mtuDesc": "Menetapkan unit transmisi maksimum (ukuran paket) untuk terowongan VPN",
|
||||
"persistentKeepaliveDesc": "Menetapkan interval (dalam detik) untuk paket keep-alive. 0 menonaktifkannya.",
|
||||
"hooks": "Hooks",
|
||||
"hooksDescription": "Hooks hanya berfungsi dengan wg-quick",
|
||||
"hooksLeaveEmpty": "Hanya untuk wg-quick. Jika tidak, biarkan kosong.",
|
||||
"dnsDesc": "Server DNS yang akan digunakan klien (menggantikan konfigurasi global)",
|
||||
"notConnected": "Klien tidak terhubung",
|
||||
"endpoint": "Titik Akhir (Endpoint)",
|
||||
"endpointDesc": "IP klien dari mana koneksi WireGuard dibuat"
|
||||
},
|
||||
"dialog": {
|
||||
"change": "Ubah",
|
||||
"cancel": "Batal",
|
||||
"create": "Buat"
|
||||
},
|
||||
"toast": {
|
||||
"success": "Berhasil",
|
||||
"saved": "Tersimpan",
|
||||
"error": "Kesalahan"
|
||||
},
|
||||
"form": {
|
||||
"actions": "Tindakan",
|
||||
"save": "Simpan",
|
||||
"revert": "Kembalikan",
|
||||
"sectionGeneral": "Umum",
|
||||
"sectionAdvanced": "Lanjutan",
|
||||
"noItems": "Tidak ada item",
|
||||
"nullNoItems": "Tidak ada item. Menggunakan konfigurasi global",
|
||||
"add": "Tambah"
|
||||
},
|
||||
"admin": {
|
||||
"general": {
|
||||
"sessionTimeout": "Waktu Sesi Habis",
|
||||
"sessionTimeoutDesc": "Durasi sesi untuk Ingat Saya (dalam detik)",
|
||||
"metrics": "Metrik",
|
||||
"metricsPassword": "Kata Sandi",
|
||||
"metricsPasswordDesc": "Kata sandi Bearer untuk endpoint metrik (kata sandi atau hash argon2)",
|
||||
"json": "JSON",
|
||||
"jsonDesc": "Rute untuk metrik dalam format JSON",
|
||||
"prometheus": "Prometheus",
|
||||
"prometheusDesc": "Rute untuk metrik Prometheus"
|
||||
},
|
||||
"config": {
|
||||
"connection": "Koneksi",
|
||||
"hostDesc": "Hostname publik yang akan digunakan klien untuk terhubung (membatalkan konfigurasi)",
|
||||
"portDesc": "Port UDP publik yang akan digunakan klien untuk terhubung (membatalkan konfigurasi, anda mungkin ingin mengubah Port Antarmuka juga)",
|
||||
"allowedIpsDesc": "IP yang diizinkan untuk digunakan klien (konfigurasi global)",
|
||||
"dnsDesc": "Server DNS yang akan digunakan klien (konfigurasi global)",
|
||||
"mtuDesc": "MTU yang akan digunakan klien (hanya untuk klien baru)",
|
||||
"persistentKeepaliveDesc": "Interval dalam detik untuk mengirim keepalive ke server. 0 = dinonaktifkan (hanya untuk klien baru)",
|
||||
"suggest": "Menyarankan",
|
||||
"suggestDesc": "Pilih alamat IP atau hostname untuk kolom Host"
|
||||
},
|
||||
"interface": {
|
||||
"cidrSuccess": "CIDR diperbarui",
|
||||
"device": "Perangkat",
|
||||
"deviceDesc": "Perangkat Ethernet tempat lalu lintas WireGuard harus diteruskan",
|
||||
"mtuDesc": "MTU yang akan digunakan oleh WireGuard",
|
||||
"portDesc": "Port UDP yang akan didengarkan oleh WireGuard (Anda mungkin ingin mengubah Port Konfigurasi juga)",
|
||||
"changeCidr": "Ubah CIDR",
|
||||
"restart": "Mulai Ulang Antarmuka",
|
||||
"restartDesc": "Mulai ulang antarmuka WireGuard",
|
||||
"restartWarn": "Apakah Anda yakin ingin memulai ulang antarmuka? Ini akan membuat semua klien menjadi terputus.",
|
||||
"restartSuccess": "Antarmuka telah dimulai ulang."
|
||||
},
|
||||
"introText": "Selamat datang di panel admin.\n\nDi sini Anda dapat mengelola pengaturan umum, konfigurasi, pengaturan antarmuka, dan hooks.\n\nMulailah dengan memilih salah satu bagian di bilah samping."
|
||||
},
|
||||
"zod": {
|
||||
"generic": {
|
||||
"required": "{0} diperlukan",
|
||||
"validNumber": "{0} harus berupa angka yang valid",
|
||||
"validString": "{0} harus berupa string yang valid",
|
||||
"validBoolean": "{0} harus berupa boolean yang valid",
|
||||
"validArray": "{0} harus berupa array yang valid",
|
||||
"stringMin": "{0} harus memiliki setidaknya {1} karakter",
|
||||
"numberMin": "{0} harus minimal {1}"
|
||||
},
|
||||
"client": {
|
||||
"id": "ID Klien",
|
||||
"name": "Nama",
|
||||
"expiresAt": "Berakhir pada",
|
||||
"address4": "Alamat IPv4",
|
||||
"address6": "Alamat IPv6",
|
||||
"serverAllowedIps": "IP yang diizinkan untuk Server"
|
||||
},
|
||||
"user": {
|
||||
"username": "Nama Pengguna",
|
||||
"password": "Kata Sandi",
|
||||
"remember": "Ingat",
|
||||
"name": "Nama",
|
||||
"email": "Email",
|
||||
"emailInvalid": "Harus berupa email yang valid",
|
||||
"passwordMatch": "Kata sandi harus cocok",
|
||||
"totpEnable": "Aktifkan TOTP",
|
||||
"totpEnableTrue": "Aktifkan TOTP harus bernilai true",
|
||||
"totpCode": "Kode TOTP"
|
||||
},
|
||||
"userConfig": {
|
||||
"host": "Host"
|
||||
},
|
||||
"general": {
|
||||
"sessionTimeout": "Waktu Sesi Habis",
|
||||
"metricsEnabled": "Metrik",
|
||||
"metricsPassword": "Kata Sandi Metrik"
|
||||
},
|
||||
"interface": {
|
||||
"cidr": "CIDR",
|
||||
"device": "Perangkat",
|
||||
"cidrValid": "CIDR harus valid"
|
||||
},
|
||||
"otl": "Tautan Sekali Pakai",
|
||||
"stringMalformed": "String tidak terformat dengan benar",
|
||||
"body": "Body harus berupa objek yang valid",
|
||||
"hook": "Hook",
|
||||
"enabled": "Diaktifkan",
|
||||
"mtu": "MTU",
|
||||
"port": "Port",
|
||||
"persistentKeepalive": "Keepalive Persisten",
|
||||
"address": "Alamat IP",
|
||||
"dns": "DNS",
|
||||
"allowedIps": "IP yang diizinkan",
|
||||
"file": "Berkas"
|
||||
},
|
||||
"hooks": {
|
||||
"preUp": "PreUp",
|
||||
"postUp": "PostUp",
|
||||
"preDown": "PreDown",
|
||||
"postDown": "PostDown"
|
||||
}
|
||||
}
|
240
src/i18n/locales/it.json
Normal file
240
src/i18n/locales/it.json
Normal file
@@ -0,0 +1,240 @@
|
||||
{
|
||||
"pages": {
|
||||
"me": "Account",
|
||||
"clients": "Client",
|
||||
"admin": {
|
||||
"panel": "Pannello di Amministrazione",
|
||||
"general": "Generale",
|
||||
"config": "Configurazione",
|
||||
"interface": "Interfaccia",
|
||||
"hooks": "Hooks"
|
||||
}
|
||||
},
|
||||
"user": {
|
||||
"email": "E-Mail"
|
||||
},
|
||||
"me": {
|
||||
"currentPassword": "Password attuale",
|
||||
"enable2fa": "Abilita Autenticazione a Due Fattori",
|
||||
"enable2faDesc": "Scansiona il codice QR con la tua app di autenticazione o inserisci manualmente la chiave.",
|
||||
"2faKey": "Chiave TOTP",
|
||||
"2faCodeDesc": "Inserisci il codice generato dalla tua app di autenticazione.",
|
||||
"disable2fa": "Disabilita Autenticazione a Due Fattori",
|
||||
"disable2faDesc": "Inserisci la tua password per disabilitare l’Autenticazione a Due Fattori."
|
||||
},
|
||||
"general": {
|
||||
"name": "Nome",
|
||||
"username": "Nome utente",
|
||||
"password": "Password",
|
||||
"newPassword": "Nuova Password",
|
||||
"updatePassword": "Aggiorna Password",
|
||||
"mtu": "MTU",
|
||||
"allowedIps": "IP consentiti",
|
||||
"dns": "DNS",
|
||||
"persistentKeepalive": "Keepalive Persistente",
|
||||
"logout": "Esci",
|
||||
"continue": "Continua",
|
||||
"host": "Host",
|
||||
"port": "Porta",
|
||||
"yes": "Sì",
|
||||
"no": "No",
|
||||
"confirmPassword": "Conferma Password",
|
||||
"loading": "Caricamento...",
|
||||
"2fa": "Autenticazione a Due Fattori",
|
||||
"2faCode": "Codice TOTP"
|
||||
},
|
||||
"setup": {
|
||||
"welcome": "Benvenuto alla tua prima configurazione di wg-easy",
|
||||
"welcomeDesc": "Hai trovato il modo più semplice per installare e gestire WireGuard su qualsiasi host Linux",
|
||||
"existingSetup": "Hai già una configurazione esistente?",
|
||||
"createAdminDesc": "Inserisci prima un nome utente admin e una password forte e sicura. Queste informazioni verranno usate per accedere al pannello di amministrazione.",
|
||||
"setupConfigDesc": "Inserisci le informazioni su host e porta. Saranno usate per la configurazione dei client quando imposteranno WireGuard sui loro dispositivi.",
|
||||
"setupMigrationDesc": "Fornisci il file di backup se vuoi migrare i tuoi dati dalla precedente versione di wg-easy alla nuova installazione.",
|
||||
"upload": "Carica",
|
||||
"migration": "Ripristina backup:",
|
||||
"createAccount": "Crea Account",
|
||||
"successful": "Configurazione completata con successo",
|
||||
"hostDesc": "Nome host pubblico a cui i client si connetteranno",
|
||||
"portDesc": "Porta UDP pubblica a cui i client si connetteranno e su cui WireGuard resterà in ascolto"
|
||||
},
|
||||
"update": {
|
||||
"updateAvailable": "È disponibile un aggiornamento!",
|
||||
"update": "Aggiorna"
|
||||
},
|
||||
"theme": {
|
||||
"dark": "Tema scuro",
|
||||
"light": "Tema chiaro",
|
||||
"system": "Tema di sistema"
|
||||
},
|
||||
"layout": {
|
||||
"toggleCharts": "Mostra/nascondi Grafici",
|
||||
"donate": "Dona"
|
||||
},
|
||||
"login": {
|
||||
"signIn": "Accedi",
|
||||
"rememberMe": "Ricordami",
|
||||
"rememberMeDesc": "Rimani connesso dopo aver chiuso il browser",
|
||||
"insecure": "Non puoi accedere con una connessione non sicura. Usa HTTPS.",
|
||||
"2faRequired": "È richiesta l’Autenticazione a Due Fattori",
|
||||
"2faWrong": "Codice di Autenticazione a Due Fattori errato"
|
||||
},
|
||||
"client": {
|
||||
"empty": "Non ci sono ancora client.",
|
||||
"newShort": "Nuovo",
|
||||
"sort": "Ordina",
|
||||
"create": "Crea Client",
|
||||
"created": "Client creato",
|
||||
"new": "Nuovo Client",
|
||||
"name": "Nome",
|
||||
"expireDate": "Data di Scadenza",
|
||||
"expireDateDesc": "Data in cui il client verrà disabilitato. Lascia vuoto per permanente",
|
||||
"deleteClient": "Elimina Client",
|
||||
"deleteDialog1": "Sei sicuro di voler eliminare",
|
||||
"deleteDialog2": "Questa azione non può essere annullata.",
|
||||
"enabled": "Abilitato",
|
||||
"address": "Indirizzo",
|
||||
"serverAllowedIps": "IP consentiti dal Server",
|
||||
"otlDesc": "Genera link temporaneo monouso",
|
||||
"permanent": "Permanente",
|
||||
"createdOn": "Creato il ",
|
||||
"lastSeen": "Ultima connessione il ",
|
||||
"totalDownload": "Download Totale: ",
|
||||
"totalUpload": "Upload Totale: ",
|
||||
"newClient": "Nuovo Client",
|
||||
"disableClient": "Disabilita Client",
|
||||
"enableClient": "Abilita Client",
|
||||
"noPrivKey": "Questo client non ha una chiave privata nota. Impossibile creare la configurazione.",
|
||||
"showQR": "Mostra Codice QR",
|
||||
"downloadConfig": "Scarica Configurazione",
|
||||
"allowedIpsDesc": "Quali IP verranno instradati attraverso la VPN (sovrascrive la config globale)",
|
||||
"serverAllowedIpsDesc": "Quali IP il server instraderà al client",
|
||||
"mtuDesc": "Imposta la dimensione massima dei pacchetti (MTU) per il tunnel VPN",
|
||||
"persistentKeepaliveDesc": "Imposta l’intervallo (in secondi) dei pacchetti keep-alive. 0 lo disabilita",
|
||||
"hooks": "Hooks",
|
||||
"hooksDescription": "Gli hooks funzionano solo con wg-quick",
|
||||
"hooksLeaveEmpty": "Solo per wg-quick. Altrimenti lascia vuoto",
|
||||
"dnsDesc": "Server DNS che i client useranno (sovrascrive la config globale)",
|
||||
"notConnected": "Client non connesso",
|
||||
"endpoint": "Endpoint",
|
||||
"endpointDesc": "IP del client da cui viene stabilita la connessione WireGuard"
|
||||
},
|
||||
"dialog": {
|
||||
"change": "Modifica",
|
||||
"cancel": "Annulla",
|
||||
"create": "Crea"
|
||||
},
|
||||
"toast": {
|
||||
"success": "Operazione riuscita",
|
||||
"saved": "Salvato",
|
||||
"error": "Errore"
|
||||
},
|
||||
"form": {
|
||||
"actions": "Azioni",
|
||||
"save": "Salva",
|
||||
"revert": "Annulla modifiche",
|
||||
"sectionGeneral": "Generale",
|
||||
"sectionAdvanced": "Avanzate",
|
||||
"noItems": "Nessun elemento",
|
||||
"nullNoItems": "Nessun elemento. Uso configurazione globale",
|
||||
"add": "Aggiungi"
|
||||
},
|
||||
"admin": {
|
||||
"general": {
|
||||
"sessionTimeout": "Timeout Sessione",
|
||||
"sessionTimeoutDesc": "Durata della sessione per 'Ricordami' (in secondi)",
|
||||
"metrics": "Metriche",
|
||||
"metricsPassword": "Password",
|
||||
"metricsPasswordDesc": "Password Bearer per l’endpoint metriche (password o hash argon2)",
|
||||
"json": "JSON",
|
||||
"jsonDesc": "Percorso per metriche in formato JSON",
|
||||
"prometheus": "Prometheus",
|
||||
"prometheusDesc": "Percorso per metriche Prometheus"
|
||||
},
|
||||
"config": {
|
||||
"connection": "Connessione",
|
||||
"hostDesc": "Nome host pubblico a cui i client si connetteranno (invalida la config)",
|
||||
"portDesc": "Porta UDP pubblica a cui i client si connetteranno (invalida la config, probabilmente vuoi cambiare anche la Porta Interfaccia)",
|
||||
"allowedIpsDesc": "IP consentiti che i client useranno (config globale)",
|
||||
"dnsDesc": "Server DNS che i client useranno (config globale)",
|
||||
"mtuDesc": "MTU usata dai client (solo per i nuovi client)",
|
||||
"persistentKeepaliveDesc": "Intervallo in secondi per inviare keepalive al server. 0 = disabilitato (solo per nuovi client)",
|
||||
"suggest": "Suggerisci",
|
||||
"suggestDesc": "Scegli un indirizzo IP o un Hostname per il campo Host"
|
||||
},
|
||||
"interface": {
|
||||
"cidrSuccess": "CIDR modificato",
|
||||
"device": "Dispositivo",
|
||||
"deviceDesc": "Dispositivo di rete attraverso cui instradare il traffico WireGuard",
|
||||
"mtuDesc": "MTU usata da WireGuard",
|
||||
"portDesc": "Porta UDP su cui WireGuard resterà in ascolto (probabilmente vuoi cambiare anche la Porta Config)",
|
||||
"changeCidr": "Modifica CIDR",
|
||||
"restart": "Riavvia Interfaccia",
|
||||
"restartDesc": "Riavvia l’interfaccia WireGuard",
|
||||
"restartWarn": "Sei sicuro di riavviare l’interfaccia? Tutti i client verranno disconnessi.",
|
||||
"restartSuccess": "Interfaccia riavviata"
|
||||
},
|
||||
"introText": "Benvenuto nel pannello di amministrazione.\n\nQui puoi gestire le impostazioni generali, la configurazione, le impostazioni dell’interfaccia e gli hooks.\n\nInizia scegliendo una delle sezioni nella barra laterale."
|
||||
},
|
||||
"zod": {
|
||||
"generic": {
|
||||
"required": "{0} è obbligatorio",
|
||||
"validNumber": "{0} deve essere un numero valido",
|
||||
"validString": "{0} deve essere una stringa valida",
|
||||
"validBoolean": "{0} deve essere un valore booleano valido",
|
||||
"validArray": "{0} deve essere un array valido",
|
||||
"stringMin": "{0} deve contenere almeno {1} carattere",
|
||||
"numberMin": "{0} deve essere almeno {1}"
|
||||
},
|
||||
"client": {
|
||||
"id": "ID Client",
|
||||
"name": "Nome",
|
||||
"expiresAt": "Scadenza",
|
||||
"address4": "Indirizzo IPv4",
|
||||
"address6": "Indirizzo IPv6",
|
||||
"serverAllowedIps": "IP consentiti dal Server"
|
||||
},
|
||||
"user": {
|
||||
"username": "Nome utente",
|
||||
"password": "Password",
|
||||
"remember": "Ricorda",
|
||||
"name": "Nome",
|
||||
"email": "Email",
|
||||
"emailInvalid": "Email deve essere un indirizzo valido",
|
||||
"passwordMatch": "Le password devono coincidere",
|
||||
"totpEnable": "Abilitazione TOTP",
|
||||
"totpEnableTrue": "TOTP deve essere abilitato",
|
||||
"totpCode": "Codice TOTP"
|
||||
},
|
||||
"userConfig": {
|
||||
"host": "Host"
|
||||
},
|
||||
"general": {
|
||||
"sessionTimeout": "Timeout Sessione",
|
||||
"metricsEnabled": "Metriche",
|
||||
"metricsPassword": "Password Metriche"
|
||||
},
|
||||
"interface": {
|
||||
"cidr": "CIDR",
|
||||
"device": "Dispositivo",
|
||||
"cidrValid": "CIDR deve essere valido"
|
||||
},
|
||||
"otl": "Link Monouso",
|
||||
"stringMalformed": "Stringa non valida",
|
||||
"body": "Body deve essere un oggetto valido",
|
||||
"hook": "Hook",
|
||||
"enabled": "Abilitato",
|
||||
"mtu": "MTU",
|
||||
"port": "Porta",
|
||||
"persistentKeepalive": "Keepalive Persistente",
|
||||
"address": "Indirizzo IP",
|
||||
"dns": "DNS",
|
||||
"allowedIps": "IP consentiti",
|
||||
"file": "File"
|
||||
},
|
||||
"hooks": {
|
||||
"preUp": "PreUp",
|
||||
"postUp": "PostUp",
|
||||
"preDown": "PreDown",
|
||||
"postDown": "PostDown"
|
||||
}
|
||||
}
|
240
src/i18n/locales/ko.json
Normal file
240
src/i18n/locales/ko.json
Normal file
@@ -0,0 +1,240 @@
|
||||
{
|
||||
"pages": {
|
||||
"me": "계정",
|
||||
"clients": "클라이언트",
|
||||
"admin": {
|
||||
"panel": "관리 패널",
|
||||
"general": "일반",
|
||||
"config": "구성",
|
||||
"interface": "인터페이스",
|
||||
"hooks": "후크"
|
||||
}
|
||||
},
|
||||
"user": {
|
||||
"email": "이메일"
|
||||
},
|
||||
"me": {
|
||||
"currentPassword": "현재 비밀번호",
|
||||
"enable2fa": "2단계 인증 활성화",
|
||||
"enable2faDesc": "인증 앱으로 QR 코드를 스캔하거나 키를 수동으로 입력하세요.",
|
||||
"2faKey": "TOTP 키",
|
||||
"2faCodeDesc": "인증기 앱에서 코드를 입력하십시오.",
|
||||
"disable2fa": "2단계 인증 비활성화",
|
||||
"disable2faDesc": "2단계 인증을 비활성화하려면 비밀번호를 입력하세요."
|
||||
},
|
||||
"general": {
|
||||
"name": "이름",
|
||||
"username": "사용자 이름",
|
||||
"password": "비밀번호",
|
||||
"newPassword": "새 비밀번호",
|
||||
"updatePassword": "비밀번호 업데이트",
|
||||
"mtu": "MTU",
|
||||
"allowedIps": "허용된 IP",
|
||||
"dns": "DNS",
|
||||
"persistentKeepalive": "지속적인 유지",
|
||||
"logout": "로그아웃",
|
||||
"continue": "계속",
|
||||
"host": "호스트",
|
||||
"port": "포트",
|
||||
"yes": "예",
|
||||
"no": "아니요",
|
||||
"confirmPassword": "비밀번호 확인",
|
||||
"loading": "로딩 중...",
|
||||
"2fa": "2단계 인증",
|
||||
"2faCode": "TOTP 코드"
|
||||
},
|
||||
"setup": {
|
||||
"welcome": "wg-easy의 첫 번째 설정에 오신 것을 환영합니다.",
|
||||
"welcomeDesc": "모든 Linux 호스트에서 WireGuard를 설치하고 관리하는 가장 쉬운 방법을 찾았습니다",
|
||||
"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": "2단계 인증이 필요합니다",
|
||||
"2faWrong": "2단계 인증이 잘못되었습니다"
|
||||
},
|
||||
"client": {
|
||||
"empty": "아직 클라이언트가 없습니다.",
|
||||
"newShort": "새로 만들기",
|
||||
"sort": "정렬",
|
||||
"create": "클라이언트 생성",
|
||||
"created": "클라이언트 생성됨",
|
||||
"new": "새 클라이언트",
|
||||
"name": "이름",
|
||||
"expireDate": "만료 날짜",
|
||||
"expireDateDesc": "클라이언트가 비활성화될 날짜. 영구적으로 비워두기",
|
||||
"deleteClient": "클라이언트 삭제",
|
||||
"deleteDialog1": "정말로 삭제하시겠습니까",
|
||||
"deleteDialog2": "이 작업은 실행 취소할 수 없습니다.",
|
||||
"enabled": "활성화됨",
|
||||
"address": "주소",
|
||||
"serverAllowedIps": "서버 허용된 IP",
|
||||
"otlDesc": "짧은 일회성 링크 생성",
|
||||
"permanent": "영구적",
|
||||
"createdOn": "생성일 ",
|
||||
"lastSeen": "마지막으로 본 시간 ",
|
||||
"totalDownload": "총 다운로드: ",
|
||||
"totalUpload": "총 업로드: ",
|
||||
"newClient": "새 클라이언트",
|
||||
"disableClient": "클라이언트 비활성화",
|
||||
"enableClient": "클라이언트 활성화",
|
||||
"noPrivKey": "이 클라이언트는 알려진 개인 키가 없습니다. 구성을 생성할 수 없습니다.",
|
||||
"showQR": "QR 코드 표시",
|
||||
"downloadConfig": "구성 다운로드",
|
||||
"allowedIpsDesc": "VPN을 통해 라우팅될 IP(전역 구성 재정의)",
|
||||
"serverAllowedIpsDesc": "서버가 클라이언트로 라우팅할 IPs",
|
||||
"mtuDesc": "VPN 터널의 최대 전송 단위(패킷 크기)를 설정합니다",
|
||||
"persistentKeepaliveDesc": "유지 관리 패킷의 간격(초 단위)을 설정합니다. 0은 비활성화합니다.",
|
||||
"hooks": "후크",
|
||||
"hooksDescription": "후크는 wg-quick과만 작동합니다",
|
||||
"hooksLeaveEmpty": "wg-quick 전용입니다. 그렇지 않으면 비워 두십시오.",
|
||||
"dnsDesc": "클라이언트가 사용할 DNS 서버(전역 구성 무시)",
|
||||
"notConnected": "클라이언트가 연결되지 않음",
|
||||
"endpoint": "엔드포인트",
|
||||
"endpointDesc": "WireGuard에 연결된 클라이언트의 IP 주소"
|
||||
},
|
||||
"dialog": {
|
||||
"change": "변경",
|
||||
"cancel": "취소",
|
||||
"create": "생성"
|
||||
},
|
||||
"toast": {
|
||||
"success": "성공",
|
||||
"saved": "저장됨",
|
||||
"error": "오류"
|
||||
},
|
||||
"form": {
|
||||
"actions": "작업",
|
||||
"save": "저장",
|
||||
"revert": "되돌리기",
|
||||
"sectionGeneral": "일반",
|
||||
"sectionAdvanced": "고급",
|
||||
"noItems": "항목 없음",
|
||||
"nullNoItems": "항목이 없습니다. 전역 구성 사용 중",
|
||||
"add": "추가"
|
||||
},
|
||||
"admin": {
|
||||
"general": {
|
||||
"sessionTimeout": "세션 타임아웃",
|
||||
"sessionTimeoutDesc": "기억하기 위한 세션 지속 시간(초)",
|
||||
"metrics": "메트릭",
|
||||
"metricsPassword": "비밀번호",
|
||||
"metricsPasswordDesc": "메트릭 엔드포인트에 대한 베어러 비밀번호(비밀번호 또는 argon2 해시)",
|
||||
"json": "JSON",
|
||||
"jsonDesc": "JSON 형식의 메트릭 경로",
|
||||
"prometheus": "프로메테우스",
|
||||
"prometheusDesc": "Prometheus 메트릭을 위한 경로"
|
||||
},
|
||||
"config": {
|
||||
"connection": "연결",
|
||||
"hostDesc": "클라이언트가 연결할 공용 호스트 이름(구성 무효화)",
|
||||
"portDesc": "공용 UDP 포트 클라이언트가 연결할 (구성을 무효화하며, 인터페이스 포트도 변경하는 것이 좋습니다)",
|
||||
"allowedIpsDesc": "클라이언트가 사용할 수 있는 허용된 IP(전역 설정)",
|
||||
"dnsDesc": "클라이언트가 사용할 DNS 서버(전역 설정)",
|
||||
"mtuDesc": "MTU 클라이언트가 사용할 (신규 클라이언트 전용)",
|
||||
"persistentKeepaliveDesc": "서버에 유지 신호를 보내기 위한 간격(초). 0 = 비활성화(새 클라이언트 전용)",
|
||||
"suggest": "제안",
|
||||
"suggestDesc": "호스트 필드에 사용할 IP 주소 또는 호스트 이름을 선택하세요."
|
||||
},
|
||||
"interface": {
|
||||
"cidrSuccess": "CIDR가 변경되었습니다.",
|
||||
"device": "장치",
|
||||
"deviceDesc": "WireGuard 트래픽이 전달되어야 하는 이더넷 장치",
|
||||
"mtuDesc": "MTU WireGuard가 사용할 값",
|
||||
"portDesc": "WireGuard가 수신할 UDP 포트 (구성 포트도 변경하는 것이 좋습니다)",
|
||||
"changeCidr": "CIDR 변경",
|
||||
"restart": "인터페이스 재시작",
|
||||
"restartDesc": "WireGuard 인터페이스를 재시작합니다.",
|
||||
"restartWarn": "인터페이스를 재시작하시겠습니까? 이 작업은 모든 클라이언트를 연결 해제합니다.",
|
||||
"restartSuccess": "인터페이스가 재시작되었습니다"
|
||||
},
|
||||
"introText": "관리 패널에 오신 것을 환영합니다.\n\n여기에서 일반 설정, 구성, 인터페이스 설정 및 후크를 관리할 수 있습니다.\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 사용은 true여야 합니다.",
|
||||
"totpCode": "TOTP 코드"
|
||||
},
|
||||
"userConfig": {
|
||||
"host": "호스트"
|
||||
},
|
||||
"general": {
|
||||
"sessionTimeout": "세션 타임아웃",
|
||||
"metricsEnabled": "메트릭",
|
||||
"metricsPassword": "메트릭 비밀번호"
|
||||
},
|
||||
"interface": {
|
||||
"cidr": "CIDR",
|
||||
"device": "장치",
|
||||
"cidrValid": "CIDR는 유효해야 합니다."
|
||||
},
|
||||
"otl": "일회성 링크",
|
||||
"stringMalformed": "문자열이 잘못되었습니다.",
|
||||
"body": "본문은 유효한 객체여야 합니다",
|
||||
"hook": "후크",
|
||||
"enabled": "활성화됨",
|
||||
"mtu": "MTU",
|
||||
"port": "포트",
|
||||
"persistentKeepalive": "지속적인 유지",
|
||||
"address": "IP 주소",
|
||||
"dns": "DNS",
|
||||
"allowedIps": "허용된 IP",
|
||||
"file": "파일"
|
||||
},
|
||||
"hooks": {
|
||||
"preUp": "PreUp",
|
||||
"postUp": "PostUp",
|
||||
"preDown": "PreDown",
|
||||
"postDown": "PostDown"
|
||||
}
|
||||
}
|
240
src/i18n/locales/pl.json
Normal file
240
src/i18n/locales/pl.json
Normal file
@@ -0,0 +1,240 @@
|
||||
{
|
||||
"pages": {
|
||||
"me": "Konto",
|
||||
"clients": "Konta",
|
||||
"admin": {
|
||||
"panel": "Panel administracyjny",
|
||||
"general": "Ogólne",
|
||||
"config": "Konfiguracja",
|
||||
"interface": "Interfejs",
|
||||
"hooks": "Hooki"
|
||||
}
|
||||
},
|
||||
"user": {
|
||||
"email": "E-mail"
|
||||
},
|
||||
"me": {
|
||||
"currentPassword": "Aktualne hasło",
|
||||
"enable2fa": "Włącz uwierzytelnianie dwuskładnikowe",
|
||||
"enable2faDesc": "Zeskanuj kod QR w aplikacji uwierzytelniającej lub wprowadź klucz ręcznie.",
|
||||
"2faKey": "Klucz TOTP",
|
||||
"2faCodeDesc": "Wprowadź kod z aplikacji uwierzytelniającej.",
|
||||
"disable2fa": "Wyłącz uwierzytelnianie dwuskładnikowe",
|
||||
"disable2faDesc": "Wprowadź swoje hasło, aby wyłączyć uwierzytelnianie dwuskładnikowe."
|
||||
},
|
||||
"general": {
|
||||
"name": "Nazwa",
|
||||
"username": "Nazwa użytkownika",
|
||||
"password": "Hasło",
|
||||
"newPassword": "Nowe hasło",
|
||||
"updatePassword": "Zmień hasło",
|
||||
"mtu": "MTU",
|
||||
"allowedIps": "Dozwolone adresy IP",
|
||||
"dns": "DNS",
|
||||
"persistentKeepalive": "Stałe utrzymywanie połączenia",
|
||||
"logout": "Wyloguj",
|
||||
"continue": "Kontynuuj",
|
||||
"host": "Host",
|
||||
"port": "Port",
|
||||
"yes": "Tak",
|
||||
"no": "Nie",
|
||||
"confirmPassword": "Potwierdź hasło",
|
||||
"loading": "Ładowanie...",
|
||||
"2fa": "Uwierzytelnianie dwuskładnikowe",
|
||||
"2faCode": "Kod TOTP"
|
||||
},
|
||||
"setup": {
|
||||
"welcome": "Witamy w pierwszej konfiguracji wg-easy",
|
||||
"welcomeDesc": "Znalazłeś najprostszy sposób na instalację i zarządzanie WireGuard na dowolnym serwerze Linux",
|
||||
"existingSetup": "Masz już istniejącą konfigurację?",
|
||||
"createAdminDesc": "Podaj nazwę użytkownika administratora oraz silne, bezpieczne hasło. Informacje te będą używane do logowania w panelu administracyjnym.",
|
||||
"setupConfigDesc": "Podaj informacje o hoście i porcie. Będą one używane w konfiguracji klienta podczas uruchamiania WireGuard na jego urządzeniach.",
|
||||
"setupMigrationDesc": "Podaj plik kopii zapasowej, jeśli chcesz przenieść dane ze starszej wersji wg-easy do nowej instalacji.",
|
||||
"upload": "Prześlij",
|
||||
"migration": "Przywróć kopię zapasową:",
|
||||
"createAccount": "Utwórz konto",
|
||||
"successful": "Konfiguracja zakończona sukcesem",
|
||||
"hostDesc": "Publiczny host, do którego będą łączyć się klienci",
|
||||
"portDesc": "Publiczny port UDP, na którym WireGuard będzie nasłuchiwał i do którego będą łączyć się klienci"
|
||||
},
|
||||
"update": {
|
||||
"updateAvailable": "Dostępna jest aktualizacja!",
|
||||
"update": "Aktualizuj"
|
||||
},
|
||||
"theme": {
|
||||
"dark": "Motyw ciemny",
|
||||
"light": "Motyw jasny",
|
||||
"system": "Motyw systemowy"
|
||||
},
|
||||
"layout": {
|
||||
"toggleCharts": "Pokaż/ukryj wykresy",
|
||||
"donate": "Wesprzyj"
|
||||
},
|
||||
"login": {
|
||||
"signIn": "Zaloguj się",
|
||||
"rememberMe": "Zapamiętaj mnie",
|
||||
"rememberMeDesc": "Pozostań zalogowany po zamknięciu przeglądarki",
|
||||
"insecure": "Nie możesz się zalogować przez niezabezpieczone połączenie. Użyj HTTPS.",
|
||||
"2faRequired": "Wymagane uwierzytelnianie dwuskładnikowe",
|
||||
"2faWrong": "Nieprawidłowy kod uwierzytelniania dwuskładnikowego"
|
||||
},
|
||||
"client": {
|
||||
"empty": "Brak klientów.",
|
||||
"newShort": "Nowy",
|
||||
"sort": "Sortuj",
|
||||
"create": "Utwórz klienta",
|
||||
"created": "Klient utworzony",
|
||||
"new": "Nowy klient",
|
||||
"name": "Nazwa",
|
||||
"expireDate": "Data wygaśnięcia",
|
||||
"expireDateDesc": "Data, po której klient zostanie wyłączony. Puste = na stałe",
|
||||
"deleteClient": "Usuń klienta",
|
||||
"deleteDialog1": "Czy na pewno chcesz usunąć",
|
||||
"deleteDialog2": "Tej akcji nie można cofnąć.",
|
||||
"enabled": "Włączony",
|
||||
"address": "Adres",
|
||||
"serverAllowedIps": "Dozwolone adresy IP serwera",
|
||||
"otlDesc": "Wygeneruj jednorazowy krótki link",
|
||||
"permanent": "Stały",
|
||||
"createdOn": "Utworzony ",
|
||||
"lastSeen": "Ostatnio widziany ",
|
||||
"totalDownload": "Łączne pobieranie: ",
|
||||
"totalUpload": "Łączne wysyłanie: ",
|
||||
"newClient": "Nowy klient",
|
||||
"disableClient": "Wyłącz klienta",
|
||||
"enableClient": "Włącz klienta",
|
||||
"noPrivKey": "Ten klient nie ma znanego klucza prywatnego. Nie można utworzyć konfiguracji.",
|
||||
"showQR": "Pokaż kod QR",
|
||||
"downloadConfig": "Pobierz konfigurację",
|
||||
"allowedIpsDesc": "Które adresy IP będą kierowane przez VPN (nadpisuje konfigurację globalną)",
|
||||
"serverAllowedIpsDesc": "Które adresy IP serwer będzie kierował do klienta",
|
||||
"mtuDesc": "Ustawia maksymalny rozmiar pakietu (MTU) dla tunelu VPN",
|
||||
"persistentKeepaliveDesc": "Ustawia interwał (w sekundach) wysyłania pakietów keep-alive. 0 = wyłączone",
|
||||
"hooks": "Hooki",
|
||||
"hooksDescription": "Hooki działają tylko z wg-quick",
|
||||
"hooksLeaveEmpty": "Tylko dla wg-quick. W innym przypadku pozostaw puste",
|
||||
"dnsDesc": "Serwer DNS, którego będą używać klienci (nadpisuje konfigurację globalną)",
|
||||
"notConnected": "Klient nie jest połączony",
|
||||
"endpoint": "Punkt końcowy",
|
||||
"endpointDesc": "Adres IP klienta, z którego ustanawiane jest połączenie WireGuard"
|
||||
},
|
||||
"dialog": {
|
||||
"change": "Zmień",
|
||||
"cancel": "Anuluj",
|
||||
"create": "Utwórz"
|
||||
},
|
||||
"toast": {
|
||||
"success": "Sukces",
|
||||
"saved": "Zapisano",
|
||||
"error": "Błąd"
|
||||
},
|
||||
"form": {
|
||||
"actions": "Akcje",
|
||||
"save": "Zapisz",
|
||||
"revert": "Przywróć",
|
||||
"sectionGeneral": "Ogólne",
|
||||
"sectionAdvanced": "Zaawansowane",
|
||||
"noItems": "Brak elementów",
|
||||
"nullNoItems": "Brak elementów. Używana konfiguracja globalna",
|
||||
"add": "Dodaj"
|
||||
},
|
||||
"admin": {
|
||||
"general": {
|
||||
"sessionTimeout": "Limit czasu sesji",
|
||||
"sessionTimeoutDesc": "Czas trwania sesji dla opcji Zapamiętaj mnie (w sekundach)",
|
||||
"metrics": "Metryki",
|
||||
"metricsPassword": "Hasło",
|
||||
"metricsPasswordDesc": "Hasło Bearer dla endpointu metryk (hasło lub hash argon2)",
|
||||
"json": "JSON",
|
||||
"jsonDesc": "Ścieżka dla metryk w formacie JSON",
|
||||
"prometheus": "Prometheus",
|
||||
"prometheusDesc": "Ścieżka dla metryk Prometheus"
|
||||
},
|
||||
"config": {
|
||||
"connection": "Połączenie",
|
||||
"hostDesc": "Publiczny host, do którego będą łączyć się klienci (unieważnia konfigurację)",
|
||||
"portDesc": "Publiczny port UDP, do którego będą łączyć się klienci (unieważnia konfigurację, prawdopodobnie należy też zmienić port interfejsu)",
|
||||
"allowedIpsDesc": "Dozwolone adresy IP klientów (konfiguracja globalna)",
|
||||
"dnsDesc": "Serwer DNS klientów (konfiguracja globalna)",
|
||||
"mtuDesc": "MTU klientów (tylko dla nowych klientów)",
|
||||
"persistentKeepaliveDesc": "Interwał w sekundach dla keepalive do serwera. 0 = wyłączone (tylko dla nowych klientów)",
|
||||
"suggest": "Sugeruj",
|
||||
"suggestDesc": "Wybierz adres IP lub nazwę hosta dla pola Host"
|
||||
},
|
||||
"interface": {
|
||||
"cidrSuccess": "Zmieniono CIDR",
|
||||
"device": "Urządzenie",
|
||||
"deviceDesc": "Urządzenie sieciowe, przez które ma być przekazywany ruch WireGuard",
|
||||
"mtuDesc": "MTU używane przez WireGuard",
|
||||
"portDesc": "Port UDP, na którym WireGuard będzie nasłuchiwał (prawdopodobnie trzeba też zmienić port w konfiguracji)",
|
||||
"changeCidr": "Zmień CIDR",
|
||||
"restart": "Restart interfejsu",
|
||||
"restartDesc": "Zrestartuj interfejs WireGuard",
|
||||
"restartWarn": "Czy na pewno chcesz zrestartować interfejs? Wszyscy klienci zostaną rozłączeni.",
|
||||
"restartSuccess": "Interfejs zrestartowany"
|
||||
},
|
||||
"introText": "Witamy w panelu administracyjnym.\n\nTutaj możesz zarządzać ustawieniami ogólnymi, konfiguracją, interfejsem i hookami.\n\nZacznij od wybrania jednej z sekcji w pasku bocznym."
|
||||
},
|
||||
"zod": {
|
||||
"generic": {
|
||||
"required": "{0} jest wymagane",
|
||||
"validNumber": "{0} musi być prawidłową liczbą",
|
||||
"validString": "{0} musi być prawidłowym tekstem",
|
||||
"validBoolean": "{0} musi być prawidłową wartością logiczną",
|
||||
"validArray": "{0} musi być prawidłową tablicą",
|
||||
"stringMin": "{0} musi mieć co najmniej {1} znaków",
|
||||
"numberMin": "{0} musi być co najmniej {1}"
|
||||
},
|
||||
"client": {
|
||||
"id": "ID klienta",
|
||||
"name": "Nazwa",
|
||||
"expiresAt": "Wygasa",
|
||||
"address4": "Adres IPv4",
|
||||
"address6": "Adres IPv6",
|
||||
"serverAllowedIps": "Dozwolone adresy IP serwera"
|
||||
},
|
||||
"user": {
|
||||
"username": "Nazwa użytkownika",
|
||||
"password": "Hasło",
|
||||
"remember": "Zapamiętaj",
|
||||
"name": "Imię",
|
||||
"email": "E-mail",
|
||||
"emailInvalid": "E-mail musi być prawidłowy",
|
||||
"passwordMatch": "Hasła muszą się zgadzać",
|
||||
"totpEnable": "Włącz TOTP",
|
||||
"totpEnableTrue": "TOTP musi być włączone",
|
||||
"totpCode": "Kod TOTP"
|
||||
},
|
||||
"userConfig": {
|
||||
"host": "Host"
|
||||
},
|
||||
"general": {
|
||||
"sessionTimeout": "Limit czasu sesji",
|
||||
"metricsEnabled": "Metryki",
|
||||
"metricsPassword": "Hasło do metryk"
|
||||
},
|
||||
"interface": {
|
||||
"cidr": "CIDR",
|
||||
"device": "Urządzenie",
|
||||
"cidrValid": "CIDR musi być prawidłowy"
|
||||
},
|
||||
"otl": "Jednorazowy link",
|
||||
"stringMalformed": "Nieprawidłowy format tekstu",
|
||||
"body": "Treść musi być prawidłowym obiektem",
|
||||
"hook": "Hook",
|
||||
"enabled": "Włączone",
|
||||
"mtu": "MTU",
|
||||
"port": "Port",
|
||||
"persistentKeepalive": "Stałe utrzymywanie połączenia",
|
||||
"address": "Adres IP",
|
||||
"dns": "DNS",
|
||||
"allowedIps": "Dozwolone adresy IP",
|
||||
"file": "Plik"
|
||||
},
|
||||
"hooks": {
|
||||
"preUp": "PreUp",
|
||||
"postUp": "PostUp",
|
||||
"preDown": "PreDown",
|
||||
"postDown": "PostDown"
|
||||
}
|
||||
}
|
240
src/i18n/locales/pt-BR.json
Normal file
240
src/i18n/locales/pt-BR.json
Normal file
@@ -0,0 +1,240 @@
|
||||
{
|
||||
"pages": {
|
||||
"me": "Conta",
|
||||
"clients": "Clientes",
|
||||
"admin": {
|
||||
"panel": "Panel de administração.",
|
||||
"general": "Geral",
|
||||
"config": "Configuração",
|
||||
"interface": "Interface",
|
||||
"hooks": "Hooks"
|
||||
}
|
||||
},
|
||||
"user": {
|
||||
"email": "E-mail"
|
||||
},
|
||||
"me": {
|
||||
"currentPassword": "Senha atual",
|
||||
"enable2fa": "Habilitar autenticação em dois fatores",
|
||||
"enable2faDesc": "Escaneie o QR Code com seu aplicativo autenticador ou insira a chave manualmente.",
|
||||
"2faKey": "Chave TOTP",
|
||||
"2faCodeDesc": "Digite o código do seu aplicativo autenticador.",
|
||||
"disable2fa": "Desativar autenticação de dois fatores.",
|
||||
"disable2faDesc": "Digite sua senha para desativar a autenticação de dois fatores."
|
||||
},
|
||||
"general": {
|
||||
"name": "Nome",
|
||||
"username": "Nome de usuário",
|
||||
"password": "Senha",
|
||||
"newPassword": "Nova senha",
|
||||
"updatePassword": "Atualizar senha",
|
||||
"mtu": "MTU",
|
||||
"allowedIps": "IPs permitidos",
|
||||
"dns": "DNS",
|
||||
"persistentKeepalive": "Keepalive persistente",
|
||||
"logout": "Sair",
|
||||
"continue": "Continue",
|
||||
"host": "Host",
|
||||
"port": "Porta",
|
||||
"yes": "Sim",
|
||||
"no": "Não",
|
||||
"confirmPassword": "Confirmar senha",
|
||||
"loading": "Carregando...",
|
||||
"2fa": "Autenticação de dois fatores",
|
||||
"2faCode": "Código TOTP"
|
||||
},
|
||||
"setup": {
|
||||
"welcome": "Bem-vindo à sua primeira configuração do wg-easy",
|
||||
"welcomeDesc": "Você encontrou a maneira mais fácil de instalar e gerenciar o WireGuard em qualquer host Linux",
|
||||
"existingSetup": "Você já tem uma configuração?",
|
||||
"createAdminDesc": "Primeiro, insira um nome de usuário de administrador e uma senha forte e segura. Essas informações serão usadas para fazer login no seu painel de administração.",
|
||||
"setupConfigDesc": "Insira as informações do host e da porta. Essas informações serão usadas para a configuração do cliente ao instalar o WireGuard em seus dispositivos.",
|
||||
"setupMigrationDesc": "Forneça o arquivo de backup se quiser migrar seus dados da versão anterior do wg-easy para a nova configuração.",
|
||||
"upload": "Upload",
|
||||
"migration": "Restaurar backup:",
|
||||
"createAccount": "Criar conta",
|
||||
"successful": "Configuração bem-sucedida",
|
||||
"hostDesc": "Nome de host público que os clientes se conectarão",
|
||||
"portDesc": "Porta UDP pública que os clientes se conectarão e o WireGuard escutará"
|
||||
},
|
||||
"update": {
|
||||
"updateAvailable": "Há uma atualização disponível!",
|
||||
"update": "Atualizar"
|
||||
},
|
||||
"theme": {
|
||||
"dark": "Tema escuro",
|
||||
"light": "Tema claro",
|
||||
"system": "Tema do sistema"
|
||||
},
|
||||
"layout": {
|
||||
"toggleCharts": "Mostrar/ocultar gráficos",
|
||||
"donate": "Doar"
|
||||
},
|
||||
"login": {
|
||||
"signIn": "Entrar",
|
||||
"rememberMe": "Lembrar de mim",
|
||||
"rememberMeDesc": "Permanecer conectado após fechar o navegador",
|
||||
"insecure": "Não é possível fazer login com uma conexão insegura. Use HTTPS.",
|
||||
"2faRequired": "É necessária autenticação de dois fatores",
|
||||
"2faWrong": "A autenticação de dois fatores está errada"
|
||||
},
|
||||
"client": {
|
||||
"empty": "Ainda não há clientes.",
|
||||
"newShort": "Novo",
|
||||
"sort": "Organizar",
|
||||
"create": "Criar cliente",
|
||||
"created": "Cliente criado",
|
||||
"new": "Novo cliente",
|
||||
"name": "Nome",
|
||||
"expireDate": "Data de expiração",
|
||||
"expireDateDesc": "Data em que o cliente será desativado. Em branco para permanente",
|
||||
"deleteClient": "Deletar cliente",
|
||||
"deleteDialog1": "Tem certeza de que deseja excluir?",
|
||||
"deleteDialog2": "Esta ação não pode ser desfeita.",
|
||||
"enabled": "Ativado",
|
||||
"address": "Endereço",
|
||||
"serverAllowedIps": "IPs permitidos do servidor",
|
||||
"otlDesc": "Gerar link curto e único",
|
||||
"permanent": "Permanente",
|
||||
"createdOn": "Criado em ",
|
||||
"lastSeen": "Visto pela última vez em",
|
||||
"totalDownload": "Download total: ",
|
||||
"totalUpload": "Upload total: ",
|
||||
"newClient": "Novo cliente",
|
||||
"disableClient": "Desativar cliente",
|
||||
"enableClient": "Ativar cliente",
|
||||
"noPrivKey": "Este cliente não possui uma chave privada conhecida. Não é possível criar a configuração.",
|
||||
"showQR": "Mostrar QR Code",
|
||||
"downloadConfig": "Download da configuração",
|
||||
"allowedIpsDesc": "Quais IPs serão roteados pela VPN (substitui a configuração global)",
|
||||
"serverAllowedIpsDesc": "Quais IPs o servidor irá rotear para o cliente",
|
||||
"mtuDesc": "Define a unidade máxima de transmissão (tamanho do pacote) para o túnel VPN",
|
||||
"persistentKeepaliveDesc": "Define o intervalo (em segundos) para pacotes keep-alive. 0 desabilita-o",
|
||||
"hooks": "Hooks",
|
||||
"hooksDescription": "Os hooks só funcionam com wg-quick",
|
||||
"hooksLeaveEmpty": "Somente para wg-quick. Caso contrário, deixe em branco.",
|
||||
"dnsDesc": "Os clientes do servidor DNS usarão (substitui a configuração global)",
|
||||
"notConnected": "Client não conectado",
|
||||
"endpoint": "Endpoint",
|
||||
"endpointDesc": "IP do cliente a partir do qual a conexão WireGuard é estabelecida"
|
||||
},
|
||||
"dialog": {
|
||||
"change": "Mudar",
|
||||
"cancel": "Cancelar",
|
||||
"create": "Criar"
|
||||
},
|
||||
"toast": {
|
||||
"success": "Sucesso",
|
||||
"saved": "Salvo",
|
||||
"error": "Erro"
|
||||
},
|
||||
"form": {
|
||||
"actions": "Ação",
|
||||
"save": "Salvar",
|
||||
"revert": "Reverter",
|
||||
"sectionGeneral": "Geral",
|
||||
"sectionAdvanced": "Avançado",
|
||||
"noItems": "Sem items",
|
||||
"nullNoItems": "Sem items. Usando configuração global",
|
||||
"add": "Adicionar"
|
||||
},
|
||||
"admin": {
|
||||
"general": {
|
||||
"sessionTimeout": "Tempo limite da sessão",
|
||||
"sessionTimeoutDesc": "Duração da sessão para Lembrar de mim (segundos)",
|
||||
"metrics": "Métricas",
|
||||
"metricsPassword": "Senha",
|
||||
"metricsPasswordDesc": "Senha do portador para o ponto final de métricas (senha ou hash argon2)",
|
||||
"json": "JSON",
|
||||
"jsonDesc": "Rota para métricas em formato JSON",
|
||||
"prometheus": "Prometheus",
|
||||
"prometheusDesc": "Rota para métricas do Prometheus"
|
||||
},
|
||||
"config": {
|
||||
"connection": "Conexão",
|
||||
"hostDesc": "Nome de host público ao qual os clientes se conectarão (invalida a configuração)",
|
||||
"portDesc": "Porta UDP pública à qual os clientes se conectarão (invalida a configuração, você provavelmente desejará alterar a porta da interface também)",
|
||||
"allowedIpsDesc": "IPs permitidos que os clientes usarão (configuração global)",
|
||||
"dnsDesc": "Os clientes do servidor DNS usarão (configuração global)",
|
||||
"mtuDesc": "Os clientes da MTU usarão (somente para novos clientes)",
|
||||
"persistentKeepaliveDesc": "Intervalo em segundos para enviar keepalives para o servidor. 0 = desabilitado (somente para novos clientes)",
|
||||
"suggest": "Sugestão",
|
||||
"suggestDesc": "Escolha um endereço IP ou nome de host para o campo Host"
|
||||
},
|
||||
"interface": {
|
||||
"cidrSuccess": "Mudar CIDR",
|
||||
"device": "Dispositivo",
|
||||
"deviceDesc": "Dispositivo Ethernet que o tráfego wireguard deve ser encaminhado",
|
||||
"mtuDesc": "MTU que o WireGuard usará",
|
||||
"portDesc": "A porta UDP que o WireGuard irá escutar (você provavelmente vai querer mudar a porta de configuração também)",
|
||||
"changeCidr": "Mudar CIDR",
|
||||
"restart": "Reiniciar interface",
|
||||
"restartDesc": "Reiniciar a interface do WireGuard",
|
||||
"restartWarn": "Tem certeza de que deseja reiniciar a interface? Isso desconectará todos os clientes.",
|
||||
"restartSuccess": "Interface reiniciada"
|
||||
},
|
||||
"introText": "Bem-vindo ao painel de administração.\n\nAqui você pode gerenciar as configurações gerais, a configuração, as configurações da interface e os hooks.\n\nComece escolhendo uma das seções na barra lateral."
|
||||
},
|
||||
"zod": {
|
||||
"generic": {
|
||||
"required": "{0} é obrigatório",
|
||||
"validNumber": "{0} deve ser um número válido",
|
||||
"validString": "{0} deve ser uma string válida",
|
||||
"validBoolean": "{0} deve ser um booleano válido",
|
||||
"validArray": "{0} deve ser uma matriz válida",
|
||||
"stringMin": "{0} deve ter pelo menos {1} caracteres",
|
||||
"numberMin": "{0} deve ter pelo menos {1}"
|
||||
},
|
||||
"client": {
|
||||
"id": "ID do cliente",
|
||||
"name": "Nome",
|
||||
"expiresAt": "Expira em",
|
||||
"address4": "Endereço IPv4",
|
||||
"address6": "Endereço IPv6",
|
||||
"serverAllowedIps": "IPs permitidos do servidor"
|
||||
},
|
||||
"user": {
|
||||
"username": "Usuário",
|
||||
"password": "Senha",
|
||||
"remember": "Lembrar",
|
||||
"name": "Nome",
|
||||
"email": "E-mail",
|
||||
"emailInvalid": "O e-mail deve ser um e-mail válido",
|
||||
"passwordMatch": "As senhas devem corresponder",
|
||||
"totpEnable": "Habilitar TOTP",
|
||||
"totpEnableTrue": "TOTP deve estar ativado",
|
||||
"totpCode": "Código TOTP"
|
||||
},
|
||||
"userConfig": {
|
||||
"host": "Host"
|
||||
},
|
||||
"general": {
|
||||
"sessionTimeout": "Tempo limite da sessão",
|
||||
"metricsEnabled": "Métricas",
|
||||
"metricsPassword": "Senha de métricas"
|
||||
},
|
||||
"interface": {
|
||||
"cidr": "CIDR",
|
||||
"device": "Dispositivo",
|
||||
"cidrValid": "O CIDR deve ser válido"
|
||||
},
|
||||
"otl": "Link de uso único",
|
||||
"stringMalformed": "A string está malformada",
|
||||
"body": "O corpo deve ser um objeto válido",
|
||||
"hook": "Hook",
|
||||
"enabled": "Ativado",
|
||||
"mtu": "MTU",
|
||||
"port": "Porta",
|
||||
"persistentKeepalive": "Keepalive persistente",
|
||||
"address": "Endereço IP",
|
||||
"dns": "DNS",
|
||||
"allowedIps": "IPs permitidos",
|
||||
"file": "Arquivo"
|
||||
},
|
||||
"hooks": {
|
||||
"preUp": "PreUp",
|
||||
"postUp": "PostUp",
|
||||
"preDown": "PreDown",
|
||||
"postDown": "PostDown"
|
||||
}
|
||||
}
|
240
src/i18n/locales/ru.json
Normal file
240
src/i18n/locales/ru.json
Normal file
@@ -0,0 +1,240 @@
|
||||
{
|
||||
"pages": {
|
||||
"me": "Аккаунт",
|
||||
"clients": "Клиенты",
|
||||
"admin": {
|
||||
"panel": "Админ панель",
|
||||
"general": "Общие",
|
||||
"config": "Конфигурация",
|
||||
"interface": "Интерфейс",
|
||||
"hooks": "Хуки"
|
||||
}
|
||||
},
|
||||
"user": {
|
||||
"email": "E-Mail"
|
||||
},
|
||||
"me": {
|
||||
"currentPassword": "Текущий пароль",
|
||||
"enable2fa": "Включить двухфакторную аутентификацию",
|
||||
"enable2faDesc": "Отсканируйте QR-код приложением-аутентификатором или введите ключ вручную.",
|
||||
"2faKey": "TOTP-ключ",
|
||||
"2faCodeDesc": "Введите код из приложения-аутентификатора.",
|
||||
"disable2fa": "Отключить двухфакторную аутентификацию",
|
||||
"disable2faDesc": "Введите пароль, чтобы отключить двухфакторную аутентификацию"
|
||||
},
|
||||
"general": {
|
||||
"name": "Имя",
|
||||
"username": "Имя пользователя",
|
||||
"password": "Пароль",
|
||||
"newPassword": "Новый пароль",
|
||||
"updatePassword": "Обновить пароль",
|
||||
"mtu": "MTU",
|
||||
"allowedIps": "Разрешённые IP",
|
||||
"dns": "DNS",
|
||||
"persistentKeepalive": "Постоянный keepalive",
|
||||
"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": "Дата, когда клиент будет отключён. Пусто — бессрочно",
|
||||
"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": "Максимальный размер пакета для VPN‑туннеля",
|
||||
"persistentKeepaliveDesc": "Интервал пакетов для поддержания соединения (в секундах). 0 — отключено.",
|
||||
"hooks": "Хуки",
|
||||
"hooksDescription": "Хуки работают только с wg-quick",
|
||||
"hooksLeaveEmpty": "Только для wg-quick. Иначе оставьте пустым",
|
||||
"dnsDesc": "DNS‑сервер, который будут использовать клиенты (перезаписывает общую конфигурацию)",
|
||||
"notConnected": "Клиент не подключен",
|
||||
"endpoint": "Конечная точка",
|
||||
"endpointDesc": "IP-адрес клиента, с которого установлено соединение WireGuard"
|
||||
},
|
||||
"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 для эндпоинта метрик (пароль или хеш argon2)",
|
||||
"json": "JSON",
|
||||
"jsonDesc": "Путь для метрик в формате JSON",
|
||||
"prometheus": "Prometheus",
|
||||
"prometheusDesc": "Путь для метрик Prometheus"
|
||||
},
|
||||
"config": {
|
||||
"connection": "Соединение",
|
||||
"hostDesc": "Публичное имя хоста для подключения клиентов (сбросит конфигурацию)",
|
||||
"portDesc": "Публичный UDP‑порт для подключения клиентов (также стоит изменить порт интерфейса)",
|
||||
"allowedIpsDesc": "Разрешённые IP для клиентов (общая конфигурация)",
|
||||
"dnsDesc": "DNS‑сервер для клиентов (общая конфигурация)",
|
||||
"mtuDesc": "MTU для клиентов (только для новых)",
|
||||
"persistentKeepaliveDesc": "Интервал отправки keepalive на сервер (секунды). 0 = отключено (только для новых)",
|
||||
"suggest": "Определить",
|
||||
"suggestDesc": "Выберите IP‑адрес или имя хоста для поля Host"
|
||||
},
|
||||
"interface": {
|
||||
"cidrSuccess": "CIDR изменён",
|
||||
"device": "Устройство",
|
||||
"deviceDesc": "Сетевое устройство, через которое должен проходить трафик WireGuard",
|
||||
"mtuDesc": "MTU, который использует WireGuard",
|
||||
"portDesc": "UDP‑порт, на котором WireGuard будет слушать (возможно, нужно изменить и порт конфигурации)",
|
||||
"changeCidr": "Изменить CIDR",
|
||||
"restart": "Перезапустить интерфейс",
|
||||
"restartDesc": "Перезапустить интерфейс WireGuard",
|
||||
"restartWarn": "Вы уверены, что хотите перезапустить интерфейс? Все клиенты будут отключены.",
|
||||
"restartSuccess": "Интерфейс перезапущен"
|
||||
},
|
||||
"introText": "Добро пожаловать в панель администратора.\n\nЗдесь вы можете управлять общими настройками, конфигурацией, параметрами интерфейса и хуками.\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": "Email",
|
||||
"emailInvalid": "Email должен быть валидным",
|
||||
"passwordMatch": "Пароли должны совпадать",
|
||||
"totpEnable": "Включить TOTP",
|
||||
"totpEnableTrue": "Необходимо включить TOTP",
|
||||
"totpCode": "TOTP‑код"
|
||||
},
|
||||
"userConfig": {
|
||||
"host": "Хост"
|
||||
},
|
||||
"general": {
|
||||
"sessionTimeout": "Тайм-аут сессии",
|
||||
"metricsEnabled": "Метрики",
|
||||
"metricsPassword": "Пароль для метрик"
|
||||
},
|
||||
"interface": {
|
||||
"cidr": "CIDR",
|
||||
"device": "Устройство",
|
||||
"cidrValid": "CIDR должен быть валидным"
|
||||
},
|
||||
"otl": "Одноразовая ссылка",
|
||||
"stringMalformed": "Строка имеет неверный формат",
|
||||
"body": "Тело должно быть объектом",
|
||||
"hook": "Хук",
|
||||
"enabled": "Включено",
|
||||
"mtu": "MTU",
|
||||
"port": "Порт",
|
||||
"persistentKeepalive": "Поддерживать соединение",
|
||||
"address": "IP‑адрес",
|
||||
"dns": "DNS",
|
||||
"allowedIps": "Разрешённые IP",
|
||||
"file": "Файл"
|
||||
},
|
||||
"hooks": {
|
||||
"preUp": "PreUp",
|
||||
"postUp": "PostUp",
|
||||
"preDown": "PreDown",
|
||||
"postDown": "PostDown"
|
||||
}
|
||||
}
|
240
src/i18n/locales/tr.json
Normal file
240
src/i18n/locales/tr.json
Normal file
@@ -0,0 +1,240 @@
|
||||
{
|
||||
"pages": {
|
||||
"me": "Hesap",
|
||||
"clients": "İstemciler",
|
||||
"admin": {
|
||||
"panel": "Yönetici Paneli",
|
||||
"general": "Genel",
|
||||
"config": "Yapılandırma",
|
||||
"interface": "Arayüz",
|
||||
"hooks": "Hook'lar"
|
||||
}
|
||||
},
|
||||
"user": {
|
||||
"email": "E-Posta"
|
||||
},
|
||||
"me": {
|
||||
"currentPassword": "Mevcut Şifre",
|
||||
"enable2fa": "İki Faktörlü Kimlik Doğrulamayı Etkinleştir",
|
||||
"enable2faDesc": "QR kodunu kimlik doğrulayıcı uygulamanızla tarayın veya anahtarı manuel olarak girin.",
|
||||
"2faKey": "TOTP Anahtarı",
|
||||
"2faCodeDesc": "Kimlik doğrulayıcı uygulamanızdan kodu girin.",
|
||||
"disable2fa": "İki Faktörlü Kimlik Doğrulamayı Devre Dışı Bırak",
|
||||
"disable2faDesc": "İki Faktörlü Kimlik Doğrulamayı devre dışı bırakmak için şifrenizi girin."
|
||||
},
|
||||
"general": {
|
||||
"name": "Ad",
|
||||
"username": "Kullanıcı Adı",
|
||||
"password": "Şifre",
|
||||
"newPassword": "Yeni Şifre",
|
||||
"updatePassword": "Şifreyi Güncelle",
|
||||
"mtu": "MTU",
|
||||
"allowedIps": "İzin Verilen IP'ler",
|
||||
"dns": "DNS",
|
||||
"persistentKeepalive": "Kalıcı Keepalive",
|
||||
"logout": "Çıkış Yap",
|
||||
"continue": "Devam Et",
|
||||
"host": "Ana Bilgisayar",
|
||||
"port": "Port",
|
||||
"yes": "Evet",
|
||||
"no": "Hayır",
|
||||
"confirmPassword": "Şifreyi Onayla",
|
||||
"loading": "Yükleniyor...",
|
||||
"2fa": "İki Faktörlü Kimlik Doğrulama",
|
||||
"2faCode": "TOTP Kodu"
|
||||
},
|
||||
"setup": {
|
||||
"welcome": "wg-easy ilk kurulumunuza hoş geldiniz",
|
||||
"welcomeDesc": "Herhangi bir Linux ana bilgisayarda WireGuard kurmanın ve yönetmenin en kolay yolunu buldunuz",
|
||||
"existingSetup": "Mevcut bir kurulumunuz var mı?",
|
||||
"createAdminDesc": "Lütfen önce bir yönetici kullanıcı adı ve güçlü bir güvenli şifre girin. Bu bilgiler yönetim panelinize giriş yapmak için kullanılacaktır.",
|
||||
"setupConfigDesc": "Lütfen ana bilgisayar ve port bilgilerini girin. Bu, cihazlarında WireGuard kurulumu yaparken istemci yapılandırması için kullanılacaktır.",
|
||||
"setupMigrationDesc": "Verilerinizi önceki wg-easy sürümünüzden yeni kurulumunuza taşımak istiyorsanız yedekleme dosyasını sağlayın.",
|
||||
"upload": "Yükle",
|
||||
"migration": "Yedeği geri yükle:",
|
||||
"createAccount": "Hesap Oluştur",
|
||||
"successful": "Kurulum başarılı",
|
||||
"hostDesc": "İstemcilerin bağlanacağı genel ana bilgisayar adı",
|
||||
"portDesc": "İstemcilerin bağlanacağı ve WireGuard'ın dinleyeceği genel UDP portu"
|
||||
},
|
||||
"update": {
|
||||
"updateAvailable": "Güncelleme mevcut!",
|
||||
"update": "Güncelle"
|
||||
},
|
||||
"theme": {
|
||||
"dark": "Koyu tema",
|
||||
"light": "Açık tema",
|
||||
"system": "Sistem teması"
|
||||
},
|
||||
"layout": {
|
||||
"toggleCharts": "Grafikleri Göster/Gizle",
|
||||
"donate": "Bağış Yap"
|
||||
},
|
||||
"login": {
|
||||
"signIn": "Giriş Yap",
|
||||
"rememberMe": "Beni hatırla",
|
||||
"rememberMeDesc": "Tarayıcıyı kapattıktan sonra giriş yapmış olarak kal",
|
||||
"insecure": "Güvensiz bir bağlantı ile giriş yapamazsınız. HTTPS kullanın.",
|
||||
"2faRequired": "İki Faktörlü Kimlik Doğrulama gerekli",
|
||||
"2faWrong": "İki Faktörlü Kimlik Doğrulama yanlış"
|
||||
},
|
||||
"client": {
|
||||
"empty": "Henüz istemci yok.",
|
||||
"newShort": "Yeni",
|
||||
"sort": "Sırala",
|
||||
"create": "İstemci Oluştur",
|
||||
"created": "İstemci oluşturuldu",
|
||||
"new": "Yeni İstemci",
|
||||
"name": "Ad",
|
||||
"expireDate": "Son Kullanma Tarihi",
|
||||
"expireDateDesc": "İstemcinin devre dışı bırakılacağı tarih. Kalıcı için boş bırakın",
|
||||
"deleteClient": "İstemciyi Sil",
|
||||
"deleteDialog1": "Silmek istediğinizden emin misiniz",
|
||||
"deleteDialog2": "Bu eylem geri alınamaz.",
|
||||
"enabled": "Etkin",
|
||||
"address": "Adres",
|
||||
"serverAllowedIps": "Sunucu İzin Verilen IP'ler",
|
||||
"otlDesc": "Kısa tek seferlik bağlantı oluştur",
|
||||
"permanent": "Kalıcı",
|
||||
"createdOn": "Oluşturulma tarihi ",
|
||||
"lastSeen": "Son görülme ",
|
||||
"totalDownload": "Toplam İndirme: ",
|
||||
"totalUpload": "Toplam Yükleme: ",
|
||||
"newClient": "Yeni İstemci",
|
||||
"disableClient": "İstemciyi Devre Dışı Bırak",
|
||||
"enableClient": "İstemciyi Etkinleştir",
|
||||
"noPrivKey": "Bu istemcinin bilinen özel anahtarı yok. Yapılandırma oluşturulamıyor.",
|
||||
"showQR": "QR Kodunu Göster",
|
||||
"downloadConfig": "Yapılandırmayı İndir",
|
||||
"allowedIpsDesc": "Hangi IP'lerin VPN üzerinden yönlendirileceği (genel yapılandırmayı geçersiz kılar)",
|
||||
"serverAllowedIpsDesc": "Sunucunun istemciye yönlendireceği IP'ler",
|
||||
"mtuDesc": "VPN tüneli için maksimum iletim birimini (paket boyutu) ayarlar",
|
||||
"persistentKeepaliveDesc": "Keepalive paketleri için aralığı (saniye cinsinden) ayarlar. 0 devre dışı bırakır",
|
||||
"hooks": "Hook'lar",
|
||||
"hooksDescription": "Hook'lar sadece wg-quick ile çalışır",
|
||||
"hooksLeaveEmpty": "Sadece wg-quick için. Aksi takdirde boş bırakın",
|
||||
"dnsDesc": "İstemcilerin kullanacağı DNS sunucusu (genel yapılandırmayı geçersiz kılar)",
|
||||
"notConnected": "İstemci bağlı değil",
|
||||
"endpoint": "Uç Nokta",
|
||||
"endpointDesc": "WireGuard bağlantısının kurulduğu istemcinin IP'si"
|
||||
},
|
||||
"dialog": {
|
||||
"change": "Değiştir",
|
||||
"cancel": "İptal",
|
||||
"create": "Oluştur"
|
||||
},
|
||||
"toast": {
|
||||
"success": "Başarılı",
|
||||
"saved": "Kaydedildi",
|
||||
"error": "Hata"
|
||||
},
|
||||
"form": {
|
||||
"actions": "Eylemler",
|
||||
"save": "Kaydet",
|
||||
"revert": "Geri Al",
|
||||
"sectionGeneral": "Genel",
|
||||
"sectionAdvanced": "Gelişmiş",
|
||||
"noItems": "Öğe yok",
|
||||
"nullNoItems": "Öğe yok. Genel yapılandırma kullanılıyor",
|
||||
"add": "Ekle"
|
||||
},
|
||||
"admin": {
|
||||
"general": {
|
||||
"sessionTimeout": "Oturum Zaman Aşımı",
|
||||
"sessionTimeoutDesc": "Beni Hatırla için oturum süresi (saniye)",
|
||||
"metrics": "Metrikler",
|
||||
"metricsPassword": "Şifre",
|
||||
"metricsPasswordDesc": "Metrik uç noktası için Bearer şifresi (şifre veya argon2 hash)",
|
||||
"json": "JSON",
|
||||
"jsonDesc": "JSON formatında metrikler için rota",
|
||||
"prometheus": "Prometheus",
|
||||
"prometheusDesc": "Prometheus metrikleri için rota"
|
||||
},
|
||||
"config": {
|
||||
"connection": "Bağlantı",
|
||||
"hostDesc": "İstemcilerin bağlanacağı genel ana bilgisayar adı (yapılandırmayı geçersiz kılar)",
|
||||
"portDesc": "İstemcilerin bağlanacağı genel UDP portu (yapılandırmayı geçersiz kılar, muhtemelen Arayüz Portunu da değiştirmek isteyeceksiniz)",
|
||||
"allowedIpsDesc": "İstemcilerin kullanacağı İzin Verilen IP'ler (genel yapılandırma)",
|
||||
"dnsDesc": "İstemcilerin kullanacağı DNS sunucusu (genel yapılandırma)",
|
||||
"mtuDesc": "İstemcilerin kullanacağı MTU (sadece yeni istemciler için)",
|
||||
"persistentKeepaliveDesc": "Sunucuya keepalive göndermek için saniye cinsinden aralık. 0 = devre dışı (sadece yeni istemciler için)",
|
||||
"suggest": "Öner",
|
||||
"suggestDesc": "Ana Bilgisayar alanı için bir IP Adresi veya Ana Bilgisayar Adı seçin"
|
||||
},
|
||||
"interface": {
|
||||
"cidrSuccess": "CIDR değiştirildi",
|
||||
"device": "Cihaz",
|
||||
"deviceDesc": "WireGuard trafiğinin yönlendirileceği Ethernet cihazı",
|
||||
"mtuDesc": "WireGuard'ın kullanacağı MTU",
|
||||
"portDesc": "WireGuard'ın dinleyeceği UDP Portu (muhtemelen Yapılandırma Portunu da değiştirmek isteyeceksiniz)",
|
||||
"changeCidr": "CIDR'ı Değiştir",
|
||||
"restart": "Arayüzü Yeniden Başlat",
|
||||
"restartDesc": "WireGuard arayüzünü yeniden başlat",
|
||||
"restartWarn": "Arayüzü yeniden başlatmak istediğinizden emin misiniz? Bu tüm istemcilerin bağlantısını kesecektir.",
|
||||
"restartSuccess": "Arayüz yeniden başlatıldı"
|
||||
},
|
||||
"introText": "Yönetici paneline hoş geldiniz.\n\nBurada genel ayarları, yapılandırmayı, arayüz ayarlarını ve hook'ları yönetebilirsiniz.\n\nKenar çubuğundaki bölümlerden birini seçerek başlayın."
|
||||
},
|
||||
"zod": {
|
||||
"generic": {
|
||||
"required": "{0} gerekli",
|
||||
"validNumber": "{0} geçerli bir sayı olmalı",
|
||||
"validString": "{0} geçerli bir dize olmalı",
|
||||
"validBoolean": "{0} geçerli bir boolean olmalı",
|
||||
"validArray": "{0} geçerli bir dizi olmalı",
|
||||
"stringMin": "{0} en az {1} karakter olmalı",
|
||||
"numberMin": "{0} en az {1} olmalı"
|
||||
},
|
||||
"client": {
|
||||
"id": "İstemci ID",
|
||||
"name": "Ad",
|
||||
"expiresAt": "Son Kullanma Tarihi",
|
||||
"address4": "IPv4 Adresi",
|
||||
"address6": "IPv6 Adresi",
|
||||
"serverAllowedIps": "Sunucu İzin Verilen IP'ler"
|
||||
},
|
||||
"user": {
|
||||
"username": "Kullanıcı Adı",
|
||||
"password": "Şifre",
|
||||
"remember": "Hatırla",
|
||||
"name": "Ad",
|
||||
"email": "E-posta",
|
||||
"emailInvalid": "E-posta geçerli bir e-posta olmalı",
|
||||
"passwordMatch": "Şifreler eşleşmeli",
|
||||
"totpEnable": "TOTP Etkinleştir",
|
||||
"totpEnableTrue": "TOTP Etkinleştir doğru olmalı",
|
||||
"totpCode": "TOTP Kodu"
|
||||
},
|
||||
"userConfig": {
|
||||
"host": "Ana Bilgisayar"
|
||||
},
|
||||
"general": {
|
||||
"sessionTimeout": "Oturum Zaman Aşımı",
|
||||
"metricsEnabled": "Metrikler",
|
||||
"metricsPassword": "Metrik Şifresi"
|
||||
},
|
||||
"interface": {
|
||||
"cidr": "CIDR",
|
||||
"device": "Cihaz",
|
||||
"cidrValid": "CIDR geçerli olmalı"
|
||||
},
|
||||
"otl": "Tek seferlik bağlantı",
|
||||
"stringMalformed": "Dize hatalı biçimlendirilmiş",
|
||||
"body": "Gövde geçerli bir nesne olmalı",
|
||||
"hook": "Hook",
|
||||
"enabled": "Etkin",
|
||||
"mtu": "MTU",
|
||||
"port": "Port",
|
||||
"persistentKeepalive": "Kalıcı Keepalive",
|
||||
"address": "IP Adresi",
|
||||
"dns": "DNS",
|
||||
"allowedIps": "İzin Verilen IP'ler",
|
||||
"file": "Dosya"
|
||||
},
|
||||
"hooks": {
|
||||
"preUp": "PreUp",
|
||||
"postUp": "PostUp",
|
||||
"preDown": "PreDown",
|
||||
"postDown": "PostDown"
|
||||
}
|
||||
}
|
240
src/i18n/locales/uk.json
Normal file
240
src/i18n/locales/uk.json
Normal file
@@ -0,0 +1,240 @@
|
||||
{
|
||||
"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": "Дата, коли клієнт буде відключений. Порожнє для постійного користування",
|
||||
"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": "Встановлює максимальний розмір пакета (одиницю передачі) для VPN-тунелю",
|
||||
"persistentKeepaliveDesc": "Встановлює інтервал (у секундах) для пакетів keep-alive. 0 вимикає його",
|
||||
"hooks": "Hooks",
|
||||
"hooksDescription": "Hooks працюють лише з wg-quick",
|
||||
"hooksLeaveEmpty": "Тільки для wg-quick. Інакше залиште порожнім",
|
||||
"dnsDesc": "DNS сервер, який використовуватимуть клієнти (перевизначає глобальну конфігурацію)",
|
||||
"notConnected": "Клієнт не підключений",
|
||||
"endpoint": "Кінцева точка",
|
||||
"endpointDesc": "IP-адреса клієнта, з якої встановлюється з’єднання WireGuard"
|
||||
},
|
||||
"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 для точки доступу метрик (пароль або хеш argon2)",
|
||||
"json": "JSON",
|
||||
"jsonDesc": "Маршрут для метрик у форматі JSON",
|
||||
"prometheus": "Prometheus",
|
||||
"prometheusDesc": "Маршрут для метрики Prometheus"
|
||||
},
|
||||
"config": {
|
||||
"connection": "З'єднання",
|
||||
"hostDesc": "Публічне ім'я хоста для підключення клієнтів (спрацьовує при зміні конфігурації)",
|
||||
"portDesc": "Публічний UDP порт для підключення клієнтів (спрацьовує при зміні конфігурації, можливо, варто змінити порт інтерфейсу теж)",
|
||||
"allowedIpsDesc": "Дозволені IP-адреси, які використовуватимуть клієнти (глобальна конфігурація)",
|
||||
"dnsDesc": "DNS-сервера, який використовуватимуть клієнти (глобальну конфігурацію)",
|
||||
"mtuDesc": "MTU, який використовуватимуть клієнти (лише для нових клієнтів)",
|
||||
"persistentKeepaliveDesc": "Інтервал у секундах для надсилання keepalive на сервер. 0 = вимкнено (лише для нових клієнтів)",
|
||||
"suggest": "Запропонувати",
|
||||
"suggestDesc": "Виберіть IP-адресу або ім'я хоста для поля 'Хост'"
|
||||
},
|
||||
"interface": {
|
||||
"cidrSuccess": "CIDR змінено",
|
||||
"device": "Пристрій",
|
||||
"deviceDesc": "Ethernet-пристрій, через який має проходити трафік WireGuard",
|
||||
"mtuDesc": "MTU, яке використовуватиме WireGuard",
|
||||
"portDesc": "UDP порт, який слухатиме WireGuard (ймовірно, варто змінити порт у конфігурації теж)",
|
||||
"changeCidr": "Змінити CIDR",
|
||||
"restart": "Перезавантажити інтерфейс",
|
||||
"restartDesc": "Перезавантажити інтерфейс WireGuard",
|
||||
"restartWarn": "Ви впевнені, що бажаєте перезавантажити інтерфейс? Це призведе до відключення всіх клієнтів.",
|
||||
"restartSuccess": "Інтерфейс перезавантажено"
|
||||
},
|
||||
"introText": "Ласкаво просимо до панелі адміністратора.\n\nТут ви можете керувати загальними налаштуваннями, конфігурацією, налаштуваннями інтерфейсу та перехоплювачами.\n\nПочніть з вибору одного з розділів на боковій панелі."
|
||||
},
|
||||
"zod": {
|
||||
"generic": {
|
||||
"required": "{0} обов'язковий",
|
||||
"validNumber": "{0} має бути дійсним числом",
|
||||
"validString": "{0} має бути дійсним рядком",
|
||||
"validBoolean": "{0} має бути дійсним логічним значенням",
|
||||
"validArray": "{0} має бути дійсним масивом",
|
||||
"stringMin": "{0} має містити щонайменше {1} символів",
|
||||
"numberMin": "{0} має бути щонайменше {1}"
|
||||
},
|
||||
"client": {
|
||||
"id": "Ідентифікатор клієнта",
|
||||
"name": "Ім'я",
|
||||
"expiresAt": "Термін дії закінчується о",
|
||||
"address4": "IPv4-адреса",
|
||||
"address6": "IPv6-адреса",
|
||||
"serverAllowedIps": "Дозволені IP-адреси сервера"
|
||||
},
|
||||
"user": {
|
||||
"username": "Ім'я користувача",
|
||||
"password": "Пароль",
|
||||
"remember": "Пам'ятати",
|
||||
"name": "Ім'я",
|
||||
"email": "Електронна пошта",
|
||||
"emailInvalid": "Email має бути дійсною",
|
||||
"passwordMatch": "Паролі мають збігатися",
|
||||
"totpEnable": "Увімкнути TOTP",
|
||||
"totpEnableTrue": "Увімкнення TOTP має бути 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"
|
||||
}
|
||||
}
|
236
src/i18n/locales/zh-CN.json
Normal file
236
src/i18n/locales/zh-CN.json
Normal file
@@ -0,0 +1,236 @@
|
||||
{
|
||||
"pages": {
|
||||
"me": "账户管理",
|
||||
"clients": "客户端管理",
|
||||
"admin": {
|
||||
"panel": "管理面板",
|
||||
"general": "通用设置",
|
||||
"config": "网络配置",
|
||||
"interface": "接口配置",
|
||||
"hooks": "钩子脚本"
|
||||
}
|
||||
},
|
||||
"user": {
|
||||
"email": "电子邮箱"
|
||||
},
|
||||
"me": {
|
||||
"currentPassword": "当前密码",
|
||||
"enable2fa": "启用双重认证",
|
||||
"enable2faDesc": "使用认证器应用扫描二维码或手动输入密钥进行配置",
|
||||
"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": "验证码"
|
||||
},
|
||||
"setup": {
|
||||
"welcome": "欢迎使用wg-easy安装向导",
|
||||
"welcomeDesc": "您正在使用最简单的WireGuard Linux主机安装和管理方案",
|
||||
"existingSetup": "是否已有现有配置?",
|
||||
"createAdminDesc": "请首先输入管理员用户名和强密码。这些信息将用于登录管理面板。",
|
||||
"setupConfigDesc": "请输入服务器主机和端口信息。这些设置将用于客户端设备连接WireGuard时的配置。",
|
||||
"setupMigrationDesc": "如果您希望从旧版wg-easy迁移数据到新安装,请提供备份文件。",
|
||||
"upload": "上传文件",
|
||||
"migration": "从备份恢复配置:",
|
||||
"createAccount": "创建账户",
|
||||
"successful": "安装配置成功",
|
||||
"hostDesc": "客户端将连接到的公共主机名或IP地址",
|
||||
"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": "客户端将被自动禁用的日期。留空表示永久有效",
|
||||
"deleteClient": "删除客户端",
|
||||
"deleteDialog1": "您确定要删除此客户端吗?",
|
||||
"deleteDialog2": "此操作无法撤销。",
|
||||
"enabled": "已启用",
|
||||
"address": "IP地址",
|
||||
"serverAllowedIps": "服务端允许的IP",
|
||||
"otlDesc": "生成一次性使用的短链接配置",
|
||||
"permanent": "永久有效",
|
||||
"createdOn": "创建于 ",
|
||||
"lastSeen": "最后在线时间 ",
|
||||
"totalDownload": "总下载流量: ",
|
||||
"totalUpload": "总上传流量: ",
|
||||
"newClient": "新建客户端",
|
||||
"disableClient": "禁用客户端",
|
||||
"enableClient": "启用客户端",
|
||||
"noPrivKey": "此客户端没有已知的私钥,无法创建配置文件",
|
||||
"showQR": "显示二维码",
|
||||
"downloadConfig": "下载配置文件",
|
||||
"allowedIpsDesc": "指定将通过VPN路由的IP地址(覆盖全局配置)",
|
||||
"serverAllowedIpsDesc": "指定服务端将路由到客户端的IP地址范围",
|
||||
"mtuDesc": "设置VPN隧道的MTU(最大传输单元)",
|
||||
"persistentKeepaliveDesc": "设置保活数据包的发送间隔(秒)。0表示禁用",
|
||||
"hooks": "钩子脚本",
|
||||
"hooksDescription": "钩子脚本仅在使用wg-quick时有效",
|
||||
"hooksLeaveEmpty": "如果不使用wg-quick,请留空此字段"
|
||||
},
|
||||
"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密码(支持密码或Argon2哈希)",
|
||||
"json": "JSON格式",
|
||||
"jsonDesc": "获取JSON格式的监控数据路由",
|
||||
"prometheus": "Prometheus格式",
|
||||
"prometheusDesc": "获取Prometheus格式监控数据的路由"
|
||||
},
|
||||
"config": {
|
||||
"connection": "连接设置",
|
||||
"hostDesc": "客户端将连接到的公共主机名(修改会使现有配置失效)",
|
||||
"portDesc": "客户端将连接到的公共UDP端口(修改会使现有配置失效,通常需要同时修改接口端口)",
|
||||
"allowedIpsDesc": "客户端使用的全局允许的IP范围",
|
||||
"dnsDesc": "客户端使用的全局DNS设置",
|
||||
"mtuDesc": "新客户端将使用的MTU(仅影响新客户端)",
|
||||
"persistentKeepaliveDesc": "向服务器发送保活数据包的间隔秒数。0表示禁用(仅影响新客户端)",
|
||||
"suggest": "检测",
|
||||
"suggestDesc": "为'主机'字段选择IP地址或主机名"
|
||||
},
|
||||
"interface": {
|
||||
"cidrSuccess": "CIDR修改成功",
|
||||
"device": "网络设备",
|
||||
"deviceDesc": "用于转发WireGuard流量的以太网设备",
|
||||
"mtuDesc": "WireGuard接口使用的MTU",
|
||||
"portDesc": "WireGuard监听的UDP端口(通常需要同时修改配置端口)",
|
||||
"changeCidr": "修改CIDR",
|
||||
"restart": "重启接口",
|
||||
"restartDesc": "重新启动WireGuard接口",
|
||||
"restartWarn": "确定要重启接口吗?这将断开所有客户端的连接。",
|
||||
"restartSuccess": "接口重启成功"
|
||||
},
|
||||
"introText": "欢迎使用管理控制台。\n\n您可以在这里管理通用设置、网络配置、接口配置和钩子脚本。\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": "必须启用双重认证",
|
||||
"totpCode": "验证码"
|
||||
},
|
||||
"userConfig": {
|
||||
"host": "服务器地址"
|
||||
},
|
||||
"general": {
|
||||
"sessionTimeout": "会话超时",
|
||||
"metricsEnabled": "启用监控",
|
||||
"metricsPassword": "监控密码"
|
||||
},
|
||||
"interface": {
|
||||
"cidr": "CIDR",
|
||||
"device": "网络设备",
|
||||
"cidrValid": "CIDR必须有效"
|
||||
},
|
||||
"otl": "一次性链接",
|
||||
"stringMalformed": "文本格式错误",
|
||||
"body": "请求体必须是有效对象",
|
||||
"hook": "钩子脚本",
|
||||
"enabled": "启用状态",
|
||||
"mtu": "MTU",
|
||||
"port": "端口",
|
||||
"persistentKeepalive": "保活间隔",
|
||||
"address": "IP地址",
|
||||
"dns": "DNS",
|
||||
"allowedIps": "允许的IP",
|
||||
"file": "文件"
|
||||
},
|
||||
"hooks": {
|
||||
"preUp": "启动前脚本",
|
||||
"postUp": "启动后脚本",
|
||||
"preDown": "停止前脚本",
|
||||
"postDown": "停止后脚本"
|
||||
}
|
||||
}
|
237
src/i18n/locales/zh-HK.json
Normal file
237
src/i18n/locales/zh-HK.json
Normal file
@@ -0,0 +1,237 @@
|
||||
{
|
||||
"pages": {
|
||||
"me": "帳戶",
|
||||
"clients": "客戶端",
|
||||
"admin": {
|
||||
"panel": "管理員版面",
|
||||
"general": "一般設定",
|
||||
"config": "配置設定",
|
||||
"interface": "介面設定",
|
||||
"hooks": "掛鉤設定"
|
||||
}
|
||||
},
|
||||
"user": {
|
||||
"email": "電郵"
|
||||
},
|
||||
"me": {
|
||||
"currentPassword": "目前密碼",
|
||||
"enable2fa": "啟用雙重認證",
|
||||
"enable2faDesc": "使用認證應用程式掃描二維碼,或手動輸入密匙。",
|
||||
"2faKey": "TOTP密匙",
|
||||
"2faCodeDesc": "請輸入認證應用程式中的驗證碼。",
|
||||
"disable2fa": "停用雙重認證",
|
||||
"disable2faDesc": "請輸入密碼以停用雙重認證。"
|
||||
},
|
||||
"general": {
|
||||
"name": "名稱",
|
||||
"username": "用戶名",
|
||||
"password": "密碼",
|
||||
"newPassword": "新密碼",
|
||||
"updatePassword": "更改密碼",
|
||||
"mtu": "MTU",
|
||||
"allowedIps": "IP白名單",
|
||||
"dns": "域名系統",
|
||||
"persistentKeepalive": "保持連線",
|
||||
"logout": "登出",
|
||||
"continue": "繼續",
|
||||
"host": "主機",
|
||||
"port": "連接埠",
|
||||
"yes": "是",
|
||||
"no": "否",
|
||||
"confirmPassword": "確認新密碼",
|
||||
"loading": "載入中...",
|
||||
"2fa": "雙重認證",
|
||||
"2faCode": "TOTP驗證碼"
|
||||
},
|
||||
"setup": {
|
||||
"welcome": "歡迎首次設定wg-easy",
|
||||
"welcomeDesc": "這是最簡單的方法讓你在任何Linux主機上安裝及管理WireGuard",
|
||||
"existingSetup": "你有現存設定嗎?",
|
||||
"createAdminDesc": "請輸入管理員用戶名及一個高強度密碼。這些資料將用於登入管理員版面。",
|
||||
"setupConfigDesc": "請輸入主機及連接埠資料。這將用於客戶端設定,以便在他們的裝置上設定WireGuard。",
|
||||
"setupMigrationDesc": "如果你想將舊版wg-easy的資料轉移到新設定,請提供備份檔案。",
|
||||
"upload": "上傳",
|
||||
"migration": "還原備份:",
|
||||
"createAccount": "建立帳戶",
|
||||
"successful": "設定成功",
|
||||
"hostDesc": "客戶端連接的公共主機名稱",
|
||||
"portDesc": "客戶端和WireGuard使用的公共UDP連接埠"
|
||||
},
|
||||
"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": "客戶端將於此日期停用。留空則為永久有效",
|
||||
"deleteClient": "刪除客戶端",
|
||||
"deleteDialog1": "你確定要刪除",
|
||||
"deleteDialog2": "此操作無法還原。",
|
||||
"enabled": "已啟用",
|
||||
"address": "IP地址",
|
||||
"serverAllowedIps": "伺服器IP白名單",
|
||||
"otlDesc": "生成短暫單次超連結",
|
||||
"permanent": "永久",
|
||||
"createdOn": "建立於",
|
||||
"lastSeen": "上次活動於",
|
||||
"totalDownload": "總下載量:",
|
||||
"totalUpload": "總上傳量:",
|
||||
"newClient": "新客戶端",
|
||||
"disableClient": "停用客戶端",
|
||||
"enableClient": "啟用客戶端",
|
||||
"noPrivKey": "此客戶端沒有已知的密匙。無法建立配置。",
|
||||
"showQR": "顯示二維碼",
|
||||
"downloadConfig": "下載配置",
|
||||
"allowedIpsDesc": "通過VPN的IP地址(取代全局配置)",
|
||||
"serverAllowedIpsDesc": "伺服器路由到客戶端的IP地址",
|
||||
"mtuDesc": "設定VPN隧道的最大傳輸單位(封包大小)",
|
||||
"persistentKeepaliveDesc": "設定保持連線封包的秒數間隔。0代表停用",
|
||||
"hooks": "掛鉤",
|
||||
"hooksDescription": "掛鉤僅適用於wg-quick",
|
||||
"hooksLeaveEmpty": "僅適用於wg-quick,否則請留空",
|
||||
"dnsDesc": "客戶端使用的域名系統伺服器(取代全局配置)"
|
||||
},
|
||||
"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密碼(密碼或argon2雜湊)",
|
||||
"json": "JSON",
|
||||
"jsonDesc": "JSON格式指標的路由",
|
||||
"prometheus": "Prometheus",
|
||||
"prometheusDesc": "Prometheus指標的路由"
|
||||
},
|
||||
"config": {
|
||||
"connection": "連線",
|
||||
"hostDesc": "客戶端連接的公共主機名稱(使配置無效)",
|
||||
"portDesc": "客戶端連接的公共UDP連接埠(使配置無效,你可能也想更改介面連接埠)",
|
||||
"allowedIpsDesc": "客戶端使用的IP白名單(全局配置)",
|
||||
"dnsDesc": "客戶端使用的域名系統伺服器(全局配置)",
|
||||
"mtuDesc": "客戶端使用的MTU(僅適用於新客戶端)",
|
||||
"persistentKeepaliveDesc": "向伺服器發送保持連線封包的秒數間隔。0代表停用(僅適用於新客戶端)",
|
||||
"suggest": "建議",
|
||||
"suggestDesc": "選擇一個IP地址或主機名稱"
|
||||
},
|
||||
"interface": {
|
||||
"cidrSuccess": "成功更改CIDR",
|
||||
"device": "裝置",
|
||||
"deviceDesc": "WireGuard流量通過的乙太網路裝置",
|
||||
"mtuDesc": "WireGuard使用的MTU",
|
||||
"portDesc": "WireGuard監聽的UDP連接埠 (你可能也想更改設定連接埠)",
|
||||
"changeCidr": "更改CIDR",
|
||||
"restart": "重啟介面",
|
||||
"restartDesc": "重啟WireGuard介面",
|
||||
"restartWarn": "你確定要重新啟動介面嗎?這將中斷所有客戶端連線。",
|
||||
"restartSuccess": "介面已重啟"
|
||||
},
|
||||
"introText": "歡迎來到管理員版面。\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啟用必須為正確",
|
||||
"totpCode": "TOTP驗證碼"
|
||||
},
|
||||
"userConfig": {
|
||||
"host": "主機"
|
||||
},
|
||||
"general": {
|
||||
"sessionTimeout": "工作階段逾時",
|
||||
"metricsEnabled": "指標",
|
||||
"metricsPassword": "指標密碼"
|
||||
},
|
||||
"interface": {
|
||||
"cidr": "CIDR",
|
||||
"device": "裝置",
|
||||
"cidrValid": "CIDR必須有效"
|
||||
},
|
||||
"otl": "單次超連結",
|
||||
"stringMalformed": "字串格式不正確",
|
||||
"body": "主體必須是有效的物件",
|
||||
"hook": "掛鉤",
|
||||
"enabled": "已啟動",
|
||||
"mtu": "MTU",
|
||||
"port": "連接埠",
|
||||
"persistentKeepalive": "保持連線",
|
||||
"address": "IP地址",
|
||||
"dns": "域名系統",
|
||||
"allowedIps": "IP白名單",
|
||||
"file": "文件"
|
||||
},
|
||||
"hooks": {
|
||||
"preUp": "PreUp",
|
||||
"postUp": "PostUp",
|
||||
"preDown": "PreDown",
|
||||
"postDown": "PostDown"
|
||||
}
|
||||
}
|
@@ -26,14 +26,83 @@ export default defineNuxtConfig({
|
||||
experimental: {
|
||||
localeDetector: './localeDetector.ts',
|
||||
},
|
||||
// https://wg-easy.github.io/wg-easy/latest/contributing/translation/
|
||||
locales: [
|
||||
{
|
||||
// same as i18n.config.ts
|
||||
code: 'en',
|
||||
// BCP 47 language tag
|
||||
language: 'en-US',
|
||||
name: 'English',
|
||||
},
|
||||
{
|
||||
code: 'de',
|
||||
language: 'de-DE',
|
||||
name: 'Deutsch',
|
||||
},
|
||||
{
|
||||
code: 'es',
|
||||
language: 'es-ES',
|
||||
name: 'Español',
|
||||
},
|
||||
{
|
||||
code: 'it',
|
||||
language: 'it-IT',
|
||||
name: 'Italiano',
|
||||
},
|
||||
{
|
||||
code: 'fr',
|
||||
language: 'fr-FR',
|
||||
name: 'Français',
|
||||
},
|
||||
{
|
||||
code: 'ko',
|
||||
language: 'ko-KR',
|
||||
name: '한국어',
|
||||
},
|
||||
{
|
||||
code: 'ru',
|
||||
language: 'ru-RU',
|
||||
name: 'Русский',
|
||||
},
|
||||
{
|
||||
code: 'uk',
|
||||
language: 'uk-UA',
|
||||
name: 'Українська',
|
||||
},
|
||||
{
|
||||
code: 'zh-CN',
|
||||
language: 'zh-CN',
|
||||
name: '简体中文',
|
||||
},
|
||||
{
|
||||
code: 'zh-HK',
|
||||
language: 'zh-HK',
|
||||
name: '繁體中文(香港)',
|
||||
},
|
||||
{
|
||||
code: 'pl',
|
||||
language: 'pl-PL',
|
||||
name: 'Polski',
|
||||
},
|
||||
{
|
||||
code: 'pt-BR',
|
||||
language: 'pt-BR',
|
||||
name: 'Português (Brasil)',
|
||||
},
|
||||
{
|
||||
code: 'tr',
|
||||
language: 'tr-TR',
|
||||
name: 'Türkçe',
|
||||
},
|
||||
{
|
||||
code: 'bn',
|
||||
language: 'bn-BD',
|
||||
name: 'বাংলা',
|
||||
},
|
||||
{
|
||||
code: 'id',
|
||||
language: 'id-ID',
|
||||
name: 'Bahasa Indonesia',
|
||||
},
|
||||
],
|
||||
defaultLocale: 'en',
|
||||
vueI18n: './i18n.config.ts',
|
||||
@@ -41,15 +110,12 @@ export default defineNuxtConfig({
|
||||
detectBrowserLanguage: {
|
||||
useCookie: true,
|
||||
},
|
||||
bundle: {
|
||||
optimizeTranslationDirective: false,
|
||||
},
|
||||
},
|
||||
nitro: {
|
||||
esbuild: {
|
||||
options: {
|
||||
// to support big int
|
||||
target: 'es2020',
|
||||
target: 'node20',
|
||||
},
|
||||
},
|
||||
alias: {
|
||||
|
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "wg-easy",
|
||||
"version": "15.0.0",
|
||||
"version": "15.1.0",
|
||||
"description": "The easiest way to run WireGuard VPN + Web-based Admin UI.",
|
||||
"private": true,
|
||||
"type": "module",
|
||||
@@ -20,57 +20,57 @@
|
||||
"cli:dev": "tsx cli/index.ts"
|
||||
},
|
||||
"dependencies": {
|
||||
"@eschricht/nuxt-color-mode": "^1.1.5",
|
||||
"@eschricht/nuxt-color-mode": "^1.2.0",
|
||||
"@heroicons/vue": "^2.2.0",
|
||||
"@libsql/client": "^0.15.7",
|
||||
"@nuxtjs/i18n": "^9.5.4",
|
||||
"@libsql/client": "^0.15.15",
|
||||
"@nuxtjs/i18n": "^10.1.0",
|
||||
"@nuxtjs/tailwindcss": "^6.14.0",
|
||||
"@phc/format": "^1.0.0",
|
||||
"@pinia/nuxt": "^0.11.0",
|
||||
"@pinia/nuxt": "^0.11.2",
|
||||
"@tailwindcss/forms": "^0.5.10",
|
||||
"apexcharts": "^4.7.0",
|
||||
"argon2": "^0.43.0",
|
||||
"apexcharts": "^5.3.5",
|
||||
"argon2": "^0.44.0",
|
||||
"cidr-tools": "^11.0.3",
|
||||
"citty": "^0.1.6",
|
||||
"consola": "^3.4.2",
|
||||
"crc-32": "^1.2.2",
|
||||
"debug": "^4.4.1",
|
||||
"drizzle-orm": "^0.43.1",
|
||||
"ip-bigint": "^8.2.1",
|
||||
"is-cidr": "^5.1.1",
|
||||
"drizzle-orm": "^0.44.5",
|
||||
"ip-bigint": "^8.2.2",
|
||||
"is-cidr": "^6.0.0",
|
||||
"is-ip": "^5.0.1",
|
||||
"js-sha256": "^0.11.1",
|
||||
"nuxt": "^3.17.4",
|
||||
"otpauth": "^9.4.0",
|
||||
"pinia": "^3.0.2",
|
||||
"qr": "^0.4.2",
|
||||
"nuxt": "^3.19.2",
|
||||
"otpauth": "^9.4.1",
|
||||
"pinia": "^3.0.3",
|
||||
"qr": "^0.5.1",
|
||||
"radix-vue": "^1.9.17",
|
||||
"semver": "^7.7.2",
|
||||
"tailwindcss": "^3.4.17",
|
||||
"timeago.js": "^4.0.2",
|
||||
"vue": "latest",
|
||||
"vue3-apexcharts": "^1.8.0",
|
||||
"zod": "^3.25.30"
|
||||
"zod": "^4.1.8"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@nuxt/eslint": "^1.4.1",
|
||||
"@nuxt/eslint": "^1.9.0",
|
||||
"@types/debug": "^4.1.12",
|
||||
"@types/phc__format": "^1.0.1",
|
||||
"@types/semver": "^7.7.0",
|
||||
"drizzle-kit": "^0.31.1",
|
||||
"esbuild": "^0.25.5",
|
||||
"eslint": "^9.27.0",
|
||||
"eslint-config-prettier": "^10.1.5",
|
||||
"prettier": "^3.5.3",
|
||||
"prettier-plugin-tailwindcss": "^0.6.11",
|
||||
"tsx": "^4.19.4",
|
||||
"typescript": "^5.8.3",
|
||||
"vue-tsc": "^2.2.10"
|
||||
"@types/semver": "^7.7.1",
|
||||
"drizzle-kit": "^0.31.4",
|
||||
"esbuild": "^0.25.9",
|
||||
"eslint": "^9.35.0",
|
||||
"eslint-config-prettier": "^10.1.8",
|
||||
"prettier": "^3.6.2",
|
||||
"prettier-plugin-tailwindcss": "^0.6.14",
|
||||
"tsx": "^4.20.5",
|
||||
"typescript": "^5.9.2",
|
||||
"vue-tsc": "^3.0.7"
|
||||
},
|
||||
"packageManager": "pnpm@10.11.0",
|
||||
"packageManager": "pnpm@10.16.0",
|
||||
"pnpm": {
|
||||
"overrides": {
|
||||
"oxc-parser": "^0.70.0"
|
||||
"rollup": "4.50.0"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
6685
src/pnpm-lock.yaml
generated
6685
src/pnpm-lock.yaml
generated
File diff suppressed because it is too large
Load Diff
@@ -18,6 +18,18 @@ export default definePermissionEventHandler(
|
||||
statusMessage: 'Client not found',
|
||||
});
|
||||
}
|
||||
return result;
|
||||
|
||||
const data = await WireGuard.dumpByPublicKey(result.publicKey);
|
||||
if (!data) {
|
||||
throw createError({
|
||||
statusCode: 500,
|
||||
statusMessage: 'Failed to dump client data',
|
||||
});
|
||||
}
|
||||
|
||||
return {
|
||||
...result,
|
||||
endpoint: data.endpoint,
|
||||
};
|
||||
}
|
||||
);
|
||||
|
@@ -18,6 +18,17 @@ function createPreparedStatement(db: DBType) {
|
||||
},
|
||||
})
|
||||
.prepare(),
|
||||
findAllPublic: db.query.client
|
||||
.findMany({
|
||||
with: {
|
||||
oneTimeLink: true,
|
||||
},
|
||||
columns: {
|
||||
privateKey: false,
|
||||
preSharedKey: false,
|
||||
},
|
||||
})
|
||||
.prepare(),
|
||||
findById: db.query.client
|
||||
.findFirst({ where: eq(client.id, sql.placeholder('id')) })
|
||||
.prepare(),
|
||||
@@ -25,6 +36,10 @@ function createPreparedStatement(db: DBType) {
|
||||
.findMany({
|
||||
where: eq(client.userId, sql.placeholder('userId')),
|
||||
with: { oneTimeLink: true },
|
||||
columns: {
|
||||
privateKey: false,
|
||||
preSharedKey: false,
|
||||
},
|
||||
})
|
||||
.prepare(),
|
||||
toggle: db
|
||||
@@ -57,6 +72,9 @@ export class ClientService {
|
||||
}));
|
||||
}
|
||||
|
||||
/**
|
||||
* Never return values directly from this function. Use {@link getAllPublic} instead.
|
||||
*/
|
||||
async getAll() {
|
||||
const result = await this.#statements.findAll.execute();
|
||||
return result.map((row) => ({
|
||||
@@ -66,6 +84,18 @@ export class ClientService {
|
||||
}));
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns all clients without sensitive data
|
||||
*/
|
||||
async getAllPublic() {
|
||||
const result = await this.#statements.findAllPublic.execute();
|
||||
return result.map((row) => ({
|
||||
...row,
|
||||
createdAt: new Date(row.createdAt),
|
||||
updatedAt: new Date(row.updatedAt),
|
||||
}));
|
||||
}
|
||||
|
||||
get(id: ID) {
|
||||
return this.#statements.findById.execute({ id });
|
||||
}
|
||||
|
@@ -71,7 +71,7 @@ export const ClientUpdateSchema = schemaForType<UpdateClientType>()(
|
||||
);
|
||||
|
||||
// TODO: investigate if coerce is bad
|
||||
const clientId = z.number({ message: t('zod.client.id'), coerce: true });
|
||||
const clientId = z.coerce.number({ message: t('zod.client.id') });
|
||||
|
||||
export const ClientGetSchema = z.object({
|
||||
clientId: clientId,
|
||||
|
@@ -54,7 +54,7 @@ export class UserConfigService {
|
||||
});
|
||||
}
|
||||
|
||||
update(data: UserConfigUpdateType) {
|
||||
update(data: Partial<UserConfigUpdateType>) {
|
||||
return this.#db
|
||||
.update(userConfig)
|
||||
.set(data)
|
||||
|
@@ -2,6 +2,7 @@ import { drizzle } from 'drizzle-orm/libsql';
|
||||
import { migrate as drizzleMigrate } from 'drizzle-orm/libsql/migrator';
|
||||
import { createClient } from '@libsql/client';
|
||||
import debug from 'debug';
|
||||
import { eq } from 'drizzle-orm';
|
||||
|
||||
import * as schema from './schema';
|
||||
import { ClientService } from './repositories/client/service';
|
||||
@@ -25,6 +26,11 @@ export async function connect() {
|
||||
await initialSetup(dbService);
|
||||
}
|
||||
|
||||
if (WG_ENV.DISABLE_IPV6) {
|
||||
DB_DEBUG('Warning: Disabling IPv6...');
|
||||
await disableIpv6(db);
|
||||
}
|
||||
|
||||
return dbService;
|
||||
}
|
||||
|
||||
@@ -83,13 +89,18 @@ async function initialSetup(db: DBServiceType) {
|
||||
|
||||
if (WG_INITIAL_ENV.DNS) {
|
||||
DB_DEBUG('Setting initial DNS...');
|
||||
const userConfig = await db.userConfigs.get();
|
||||
await db.userConfigs.update({
|
||||
...userConfig,
|
||||
defaultDns: WG_INITIAL_ENV.DNS,
|
||||
});
|
||||
}
|
||||
|
||||
if (WG_INITIAL_ENV.ALLOWED_IPS) {
|
||||
DB_DEBUG('Setting initial Allowed IPs...');
|
||||
await db.userConfigs.update({
|
||||
defaultAllowedIps: WG_INITIAL_ENV.ALLOWED_IPS,
|
||||
});
|
||||
}
|
||||
|
||||
if (
|
||||
WG_INITIAL_ENV.USERNAME &&
|
||||
WG_INITIAL_ENV.PASSWORD &&
|
||||
@@ -108,3 +119,48 @@ async function initialSetup(db: DBServiceType) {
|
||||
await db.general.setSetupStep(0);
|
||||
}
|
||||
}
|
||||
|
||||
async function disableIpv6(db: DBType) {
|
||||
// This should match the initial value migration
|
||||
const postUpMatch =
|
||||
' ip6tables -t nat -A POSTROUTING -s {{ipv6Cidr}} -o {{device}} -j MASQUERADE; ip6tables -A INPUT -p udp -m udp --dport {{port}} -j ACCEPT; ip6tables -A FORWARD -i wg0 -j ACCEPT; ip6tables -A FORWARD -o wg0 -j ACCEPT;';
|
||||
const postDownMatch =
|
||||
' ip6tables -t nat -D POSTROUTING -s {{ipv6Cidr}} -o {{device}} -j MASQUERADE; ip6tables -D INPUT -p udp -m udp --dport {{port}} -j ACCEPT; ip6tables -D FORWARD -i wg0 -j ACCEPT; ip6tables -D FORWARD -o wg0 -j ACCEPT;';
|
||||
|
||||
await db.transaction(async (tx) => {
|
||||
const hooks = await tx.query.hooks.findFirst({
|
||||
where: eq(schema.hooks.id, 'wg0'),
|
||||
});
|
||||
|
||||
if (!hooks) {
|
||||
throw new Error('Hooks not found');
|
||||
}
|
||||
|
||||
if (hooks.postUp.includes(postUpMatch)) {
|
||||
DB_DEBUG('Disabling IPv6 in Post Up hooks...');
|
||||
await tx
|
||||
.update(schema.hooks)
|
||||
.set({
|
||||
postUp: hooks.postUp.replace(postUpMatch, ''),
|
||||
postDown: hooks.postDown.replace(postDownMatch, ''),
|
||||
})
|
||||
.where(eq(schema.hooks.id, 'wg0'))
|
||||
.execute();
|
||||
} else {
|
||||
DB_DEBUG('IPv6 Post Up hooks already disabled, skipping...');
|
||||
}
|
||||
if (hooks.postDown.includes(postDownMatch)) {
|
||||
DB_DEBUG('Disabling IPv6 in Post Down hooks...');
|
||||
await tx
|
||||
.update(schema.hooks)
|
||||
.set({
|
||||
postUp: hooks.postUp.replace(postUpMatch, ''),
|
||||
postDown: hooks.postDown.replace(postDownMatch, ''),
|
||||
})
|
||||
.where(eq(schema.hooks.id, 'wg0'))
|
||||
.execute();
|
||||
} else {
|
||||
DB_DEBUG('IPv6 Post Down hooks already disabled, skipping...');
|
||||
}
|
||||
});
|
||||
}
|
||||
|
@@ -25,13 +25,21 @@ class WireGuard {
|
||||
const hooks = await Database.hooks.get();
|
||||
|
||||
const result = [];
|
||||
result.push(wg.generateServerInterface(wgInterface, hooks));
|
||||
result.push(
|
||||
wg.generateServerInterface(wgInterface, hooks, {
|
||||
enableIpv6: !WG_ENV.DISABLE_IPV6,
|
||||
})
|
||||
);
|
||||
|
||||
for (const client of clients) {
|
||||
if (!client.enabled) {
|
||||
continue;
|
||||
}
|
||||
result.push(wg.generateServerPeer(client));
|
||||
result.push(
|
||||
wg.generateServerPeer(client, {
|
||||
enableIpv6: !WG_ENV.DISABLE_IPV6,
|
||||
})
|
||||
);
|
||||
}
|
||||
|
||||
result.push('');
|
||||
@@ -85,9 +93,20 @@ class WireGuard {
|
||||
return clients;
|
||||
}
|
||||
|
||||
async dumpByPublicKey(publicKey: string) {
|
||||
const wgInterface = await Database.interfaces.get();
|
||||
|
||||
const dump = await wg.dump(wgInterface.name);
|
||||
const clientDump = dump.find(
|
||||
({ publicKey: dumpPublicKey }) => dumpPublicKey === publicKey
|
||||
);
|
||||
|
||||
return clientDump;
|
||||
}
|
||||
|
||||
async getAllClients() {
|
||||
const wgInterface = await Database.interfaces.get();
|
||||
const dbClients = await Database.clients.getAll();
|
||||
const dbClients = await Database.clients.getAllPublic();
|
||||
const clients = dbClients.map((client) => ({
|
||||
...client,
|
||||
latestHandshakeAt: null as Date | null,
|
||||
@@ -125,7 +144,9 @@ class WireGuard {
|
||||
throw new Error('Client not found');
|
||||
}
|
||||
|
||||
return wg.generateClientConfig(wgInterface, userConfig, client);
|
||||
return wg.generateClientConfig(wgInterface, userConfig, client, {
|
||||
enableIpv6: !WG_ENV.DISABLE_IPV6,
|
||||
});
|
||||
}
|
||||
|
||||
async getClientQRCodeSVG({ clientId }: { clientId: ID }) {
|
||||
|
@@ -12,11 +12,23 @@ export const OLD_ENV = {
|
||||
PASSWORD_HASH: process.env.PASSWORD_HASH,
|
||||
};
|
||||
|
||||
const OVERRIDE_AUTO_AWG = process.env.OVERRIDE_AUTO_AWG?.toLowerCase();
|
||||
|
||||
export const WG_ENV = {
|
||||
/** UI is hosted on HTTP instead of HTTPS */
|
||||
INSECURE: process.env.INSECURE === 'true',
|
||||
/** Port the UI is listening on */
|
||||
PORT: assertEnv('PORT'),
|
||||
/** If IPv6 should be disabled */
|
||||
DISABLE_IPV6: process.env.DISABLE_IPV6 === 'true',
|
||||
/** Override automatic detection */
|
||||
OVERRIDE_AUTO_AWG:
|
||||
OVERRIDE_AUTO_AWG === ('wg' as const) ||
|
||||
OVERRIDE_AUTO_AWG === ('awg' as const)
|
||||
? OVERRIDE_AUTO_AWG
|
||||
: undefined,
|
||||
/** TODO: delete on next major version */
|
||||
EXPERIMENTAL_AWG: process.env.EXPERIMENTAL_AWG === 'true',
|
||||
};
|
||||
|
||||
export const WG_INITIAL_ENV = {
|
||||
@@ -26,6 +38,7 @@ export const WG_INITIAL_ENV = {
|
||||
DNS: process.env.INIT_DNS?.split(',').map((x) => x.trim()),
|
||||
IPV4_CIDR: process.env.INIT_IPV4_CIDR,
|
||||
IPV6_CIDR: process.env.INIT_IPV6_CIDR,
|
||||
ALLOWED_IPS: process.env.INIT_ALLOWED_IPS?.split(',').map((x) => x.trim()),
|
||||
HOST: process.env.INIT_HOST,
|
||||
PORT: process.env.INIT_PORT
|
||||
? Number.parseInt(process.env.INIT_PORT, 10)
|
||||
|
@@ -40,9 +40,7 @@ export const AddressSchema = z
|
||||
.min(1, { message: t('zod.address') })
|
||||
.pipe(safeStringRefine);
|
||||
|
||||
export const DnsSchema = z
|
||||
.array(AddressSchema, { message: t('zod.dns') })
|
||||
.min(1, t('zod.dns'));
|
||||
export const DnsSchema = z.array(AddressSchema, { message: t('zod.dns') });
|
||||
|
||||
export const AllowedIpsSchema = z
|
||||
.array(AddressSchema, { message: t('zod.allowedIps') })
|
||||
@@ -84,7 +82,7 @@ export function validateZod<T>(
|
||||
if (v.message.startsWith('zod.')) {
|
||||
switch (v.code) {
|
||||
case 'too_small':
|
||||
switch (v.type) {
|
||||
switch (v.origin) {
|
||||
case 'string':
|
||||
newMessage = t('zod.generic.stringMin', [
|
||||
t(v.message),
|
||||
@@ -100,7 +98,7 @@ export function validateZod<T>(
|
||||
}
|
||||
break;
|
||||
case 'invalid_type': {
|
||||
if (v.received === 'null' || v.received === 'undefined') {
|
||||
if (v.input === null || v.input === undefined) {
|
||||
newMessage = t('zod.generic.required', [
|
||||
v.path.join('.'),
|
||||
]);
|
||||
|
@@ -5,11 +5,32 @@ import type { InterfaceType } from '#db/repositories/interface/types';
|
||||
import type { UserConfigType } from '#db/repositories/userConfig/types';
|
||||
import type { HooksType } from '#db/repositories/hooks/types';
|
||||
|
||||
type Options = {
|
||||
enableIpv6?: boolean;
|
||||
};
|
||||
|
||||
let wgExecutable: 'awg' | 'wg' = 'wg';
|
||||
|
||||
if (WG_ENV.EXPERIMENTAL_AWG) {
|
||||
if (WG_ENV.OVERRIDE_AUTO_AWG !== undefined) {
|
||||
wgExecutable = WG_ENV.OVERRIDE_AUTO_AWG;
|
||||
} else {
|
||||
wgExecutable = await exec('modinfo amneziawg')
|
||||
.then(() => 'awg' as const)
|
||||
.catch(() => 'wg' as const);
|
||||
}
|
||||
}
|
||||
|
||||
export const wg = {
|
||||
generateServerPeer: (client: Omit<ClientType, 'createdAt' | 'updatedAt'>) => {
|
||||
generateServerPeer: (
|
||||
client: Omit<ClientType, 'createdAt' | 'updatedAt'>,
|
||||
options: Options = {}
|
||||
) => {
|
||||
const { enableIpv6 = true } = options;
|
||||
|
||||
const allowedIps = [
|
||||
`${client.ipv4Address}/32`,
|
||||
`${client.ipv6Address}/128`,
|
||||
...(enableIpv6 ? [`${client.ipv6Address}/128`] : []),
|
||||
...(client.serverAllowedIps ?? []),
|
||||
];
|
||||
|
||||
@@ -25,19 +46,29 @@ PresharedKey = ${client.preSharedKey}
|
||||
AllowedIPs = ${allowedIps.join(', ')}${extraLines.length ? `\n${extraLines.join('\n')}` : ''}`;
|
||||
},
|
||||
|
||||
generateServerInterface: (wgInterface: InterfaceType, hooks: HooksType) => {
|
||||
generateServerInterface: (
|
||||
wgInterface: InterfaceType,
|
||||
hooks: HooksType,
|
||||
options: Options = {}
|
||||
) => {
|
||||
const { enableIpv6 = true } = options;
|
||||
|
||||
const cidr4 = parseCidr(wgInterface.ipv4Cidr);
|
||||
const cidr6 = parseCidr(wgInterface.ipv6Cidr);
|
||||
const ipv4Addr = stringifyIp({ number: cidr4.start + 1n, version: 4 });
|
||||
const ipv6Addr = stringifyIp({ number: cidr6.start + 1n, version: 6 });
|
||||
|
||||
const address =
|
||||
`${ipv4Addr}/${cidr4.prefix}` +
|
||||
(enableIpv6 ? `, ${ipv6Addr}/${cidr6.prefix}` : '');
|
||||
|
||||
return `# Note: Do not edit this file directly.
|
||||
# Your changes will be overwritten!
|
||||
|
||||
# Server
|
||||
[Interface]
|
||||
PrivateKey = ${wgInterface.privateKey}
|
||||
Address = ${ipv4Addr}/${cidr4.prefix}, ${ipv6Addr}/${cidr6.prefix}
|
||||
Address = ${address}
|
||||
ListenPort = ${wgInterface.port}
|
||||
MTU = ${wgInterface.mtu}
|
||||
PreUp = ${iptablesTemplate(hooks.preUp, wgInterface)}
|
||||
@@ -49,24 +80,36 @@ PostDown = ${iptablesTemplate(hooks.postDown, wgInterface)}`;
|
||||
generateClientConfig: (
|
||||
wgInterface: InterfaceType,
|
||||
userConfig: UserConfigType,
|
||||
client: ClientType
|
||||
client: ClientType,
|
||||
options: Options = {}
|
||||
) => {
|
||||
const { enableIpv6 = true } = options;
|
||||
|
||||
const cidr4Block = parseCidr(wgInterface.ipv4Cidr).prefix;
|
||||
const cidr6Block = parseCidr(wgInterface.ipv6Cidr).prefix;
|
||||
|
||||
const address =
|
||||
`${client.ipv4Address}/${cidr4Block}` +
|
||||
(enableIpv6 ? `, ${client.ipv6Address}/${cidr6Block}` : '');
|
||||
|
||||
const hookLines = [
|
||||
client.preUp ? `PreUp = ${client.preUp}` : null,
|
||||
client.postUp ? `PostUp = ${client.postUp}` : null,
|
||||
client.preDown ? `PreDown = ${client.preDown}` : null,
|
||||
client.postDown ? `PostDown = ${client.postDown}` : null,
|
||||
].filter((v) => v !== null);
|
||||
];
|
||||
|
||||
const dnsServers = client.dns ?? userConfig.defaultDns;
|
||||
const dnsLine =
|
||||
dnsServers.length > 0 ? `DNS = ${dnsServers.join(', ')}` : null;
|
||||
|
||||
const extraLines = [dnsLine, ...hookLines].filter((v) => v !== null);
|
||||
|
||||
return `[Interface]
|
||||
PrivateKey = ${client.privateKey}
|
||||
Address = ${client.ipv4Address}/${cidr4Block}, ${client.ipv6Address}/${cidr6Block}
|
||||
DNS = ${(client.dns ?? userConfig.defaultDns).join(', ')}
|
||||
Address = ${address}
|
||||
MTU = ${client.mtu}
|
||||
${hookLines.length ? `${hookLines.join('\n')}\n` : ''}
|
||||
${extraLines.length ? `${extraLines.join('\n')}\n` : ''}
|
||||
[Peer]
|
||||
PublicKey = ${wgInterface.publicKey}
|
||||
PresharedKey = ${client.preSharedKey}
|
||||
@@ -76,37 +119,41 @@ Endpoint = ${userConfig.host}:${userConfig.port}`;
|
||||
},
|
||||
|
||||
generatePrivateKey: () => {
|
||||
return exec('wg genkey');
|
||||
return exec(`${wgExecutable} genkey`);
|
||||
},
|
||||
|
||||
getPublicKey: (privateKey: string) => {
|
||||
return exec(`echo ${privateKey} | wg pubkey`, {
|
||||
log: 'echo ***hidden*** | wg pubkey',
|
||||
return exec(`echo ${privateKey} | ${wgExecutable} pubkey`, {
|
||||
log: `echo ***hidden*** | ${wgExecutable} pubkey`,
|
||||
});
|
||||
},
|
||||
|
||||
generatePreSharedKey: () => {
|
||||
return exec('wg genpsk');
|
||||
return exec(`${wgExecutable} genpsk`);
|
||||
},
|
||||
|
||||
up: (infName: string) => {
|
||||
return exec(`wg-quick up ${infName}`);
|
||||
return exec(`${wgExecutable}-quick up ${infName}`);
|
||||
},
|
||||
|
||||
down: (infName: string) => {
|
||||
return exec(`wg-quick down ${infName}`);
|
||||
return exec(`${wgExecutable}-quick down ${infName}`);
|
||||
},
|
||||
|
||||
restart: (infName: string) => {
|
||||
return exec(`wg-quick down ${infName}; wg-quick up ${infName}`);
|
||||
return exec(
|
||||
`${wgExecutable}-quick down ${infName}; ${wgExecutable}-quick up ${infName}`
|
||||
);
|
||||
},
|
||||
|
||||
sync: (infName: string) => {
|
||||
return exec(`wg syncconf ${infName} <(wg-quick strip ${infName})`);
|
||||
return exec(
|
||||
`${wgExecutable} syncconf ${infName} <(${wgExecutable}-quick strip ${infName})`
|
||||
);
|
||||
},
|
||||
|
||||
dump: async (infName: string) => {
|
||||
const rawDump = await exec(`wg show ${infName} dump`, {
|
||||
const rawDump = await exec(`${wgExecutable} show ${infName} dump`, {
|
||||
log: false,
|
||||
});
|
||||
|
||||
|
@@ -59,7 +59,7 @@ type RolesWithPermissions = {
|
||||
|
||||
export type Permissions = {
|
||||
clients: {
|
||||
dataType: ClientType;
|
||||
dataType: Pick<ClientType, 'id' | 'userId'>;
|
||||
action: 'view' | 'create' | 'update' | 'delete' | 'custom';
|
||||
};
|
||||
admin: {
|
||||
|
Reference in New Issue
Block a user