mirror of
https://github.com/fosrl/pangolin.git
synced 2026-02-19 11:26:37 +00:00
Compare commits
379 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
6dd161fe17 | ||
|
|
558bd040c6 | ||
|
|
f2c48975f6 | ||
|
|
fc43a56bb3 | ||
|
|
ca7f557a3c | ||
|
|
7477713eef | ||
|
|
c16e762fa4 | ||
|
|
eec3f183e6 | ||
|
|
31b66cd911 | ||
|
|
da0196a308 | ||
|
|
e585972b7b | ||
|
|
cc62cd4add | ||
|
|
25225a452c | ||
|
|
678644c7fb | ||
|
|
32f20ed984 | ||
|
|
4eb5bf08d5 | ||
|
|
35c93f38e0 | ||
|
|
f60c2f4fb9 | ||
|
|
b2cf152b9e | ||
|
|
444928dffd | ||
|
|
4d7e2d5840 | ||
|
|
318046ce1d | ||
|
|
808ad1e272 | ||
|
|
05a1195661 | ||
|
|
c46322c6a6 | ||
|
|
80d5efc41f | ||
|
|
0409ab7dc1 | ||
|
|
63f079ec76 | ||
|
|
5988f1e8da | ||
|
|
ed0c0edeba | ||
|
|
34b4841f4d | ||
|
|
ff47c5a8ad | ||
|
|
9430a53c0c | ||
|
|
03334e3f0f | ||
|
|
6f2ecf9d0d | ||
|
|
6f803c3b4b | ||
|
|
15d400c842 | ||
|
|
3ddf150661 | ||
|
|
5b519afee4 | ||
|
|
15ea9f3dcc | ||
|
|
d5e2536f8d | ||
|
|
d7e9083e06 | ||
|
|
e0cc338c3a | ||
|
|
624c5741e2 | ||
|
|
558507dd71 | ||
|
|
565340bd53 | ||
|
|
756745487a | ||
|
|
d2ece4d370 | ||
|
|
d5f5d1da1e | ||
|
|
dfaf1a72cc | ||
|
|
ff8e5b871c | ||
|
|
927dda4e53 | ||
|
|
0e51bac307 | ||
|
|
7a50af14f3 | ||
|
|
396477c2e2 | ||
|
|
8765874d9a | ||
|
|
49dffe086d | ||
|
|
77ddadcded | ||
|
|
05b297ddec | ||
|
|
feb0de9a08 | ||
|
|
f4f2361d22 | ||
|
|
cae6a9f51c | ||
|
|
2872f5c018 | ||
|
|
0512c21ad7 | ||
|
|
922a69feed | ||
|
|
24192c79d4 | ||
|
|
17c22a635f | ||
|
|
bcbcf417b5 | ||
|
|
acf7596368 | ||
|
|
34c7d925ca | ||
|
|
c10730ebb9 | ||
|
|
e50743b922 | ||
|
|
75b0745e42 | ||
|
|
ebd99f95a3 | ||
|
|
0e649883cb | ||
|
|
3d376c8d14 | ||
|
|
adedb0e391 | ||
|
|
521935786c | ||
|
|
885b9d186b | ||
|
|
356f023539 | ||
|
|
de8d3f45da | ||
|
|
72c9956190 | ||
|
|
6dc4cbe448 | ||
|
|
77364488c2 | ||
|
|
5a61040027 | ||
|
|
c6f7be40df | ||
|
|
c36fb63f8c | ||
|
|
48aebea6cf | ||
|
|
55082d2ef8 | ||
|
|
cc03b97234 | ||
|
|
5542873368 | ||
|
|
1db5d76ef1 | ||
|
|
ca6c45087b | ||
|
|
3333eb95f9 | ||
|
|
d681725fc3 | ||
|
|
f5eadc9e1e | ||
|
|
219e213c1e | ||
|
|
af654e663b | ||
|
|
39b3b4ef9d | ||
|
|
6c62a0900f | ||
|
|
ddd772eb43 | ||
|
|
69458ab649 | ||
|
|
c7df70143e | ||
|
|
a81ea7cc8f | ||
|
|
02330a0756 | ||
|
|
db49b599b5 | ||
|
|
bb0bfd440a | ||
|
|
10ce732b8d | ||
|
|
4c567cf2d7 | ||
|
|
2783d2989d | ||
|
|
c3d6510231 | ||
|
|
3bb948991f | ||
|
|
4b9ce22f06 | ||
|
|
772bda69f9 | ||
|
|
8b4722b1c9 | ||
|
|
9e5c9d9c34 | ||
|
|
ee533df38f | ||
|
|
52dc8e011c | ||
|
|
bd5cc790d6 | ||
|
|
7d6d5a7787 | ||
|
|
ba6e7dd06a | ||
|
|
6270fb3237 | ||
|
|
16ec50a6ee | ||
|
|
3d2021c8a1 | ||
|
|
15d63ddffa | ||
|
|
7ce6fadb3d | ||
|
|
6b18a24f9b | ||
|
|
a38cb961c7 | ||
|
|
3c5fe21078 | ||
|
|
b44305694f | ||
|
|
be217e2b6f | ||
|
|
6ce04c2aa1 | ||
|
|
85e4b649db | ||
|
|
73a3335148 | ||
|
|
32845c5a3d | ||
|
|
05a878ac34 | ||
|
|
847d015243 | ||
|
|
51cde2681c | ||
|
|
9c0606942c | ||
|
|
646d476bdb | ||
|
|
31261681a0 | ||
|
|
f6fae820c4 | ||
|
|
b3cbf925aa | ||
|
|
aa1ae3ee42 | ||
|
|
80f6c8b74e | ||
|
|
79d8e8d59d | ||
|
|
9193375586 | ||
|
|
240bcb8759 | ||
|
|
a5dcafb84c | ||
|
|
192207a857 | ||
|
|
d18fafb0ef | ||
|
|
380c86898c | ||
|
|
b59a6b82ef | ||
|
|
77ba568c36 | ||
|
|
a0f05cc77b | ||
|
|
80f43a9774 | ||
|
|
c04d9eda6b | ||
|
|
cabf3e9695 | ||
|
|
ff7b4386d6 | ||
|
|
4dbbe159ee | ||
|
|
eeab92719a | ||
|
|
43e6b7de07 | ||
|
|
4cfd1b1ff5 | ||
|
|
09ba018493 | ||
|
|
7acf7dd0eb | ||
|
|
592d085de6 | ||
|
|
2cf2c64651 | ||
|
|
560974f7d2 | ||
|
|
85270f497a | ||
|
|
9fbea4a380 | ||
|
|
cbf9c5361e | ||
|
|
44316731c0 | ||
|
|
60513af8ed | ||
|
|
24cfe02979 | ||
|
|
8f3324560a | ||
|
|
2041edcf30 | ||
|
|
1227b3c11a | ||
|
|
8973726f63 | ||
|
|
5559fef1bc | ||
|
|
9cb3c3821a | ||
|
|
c85e367ded | ||
|
|
5e20487216 | ||
|
|
bc6b9eb905 | ||
|
|
5940bbd498 | ||
|
|
f4a0f6a2e6 | ||
|
|
0df7d45678 | ||
|
|
a05ee2483b | ||
|
|
f5dbc18c05 | ||
|
|
dd052fa1af | ||
|
|
2cc4ad9c30 | ||
|
|
4dd741cc3f | ||
|
|
9ce81b34c9 | ||
|
|
460df46abc | ||
|
|
1e70e4289b | ||
|
|
5fa0ac5927 | ||
|
|
4b40e7b8d6 | ||
|
|
29cd035a05 | ||
|
|
39d6b93d42 | ||
|
|
629f17294a | ||
|
|
10a5af67aa | ||
|
|
b542d82553 | ||
|
|
2a644c3f88 | ||
|
|
f6de61968d | ||
|
|
68f0c4df3a | ||
|
|
0743daf56a | ||
|
|
58b6ab2601 | ||
|
|
038f8829c2 | ||
|
|
ddcf77a62d | ||
|
|
adefbdbeb3 | ||
|
|
921285e5b1 | ||
|
|
264bf46798 | ||
|
|
5a7b5d65a4 | ||
|
|
23b13f0a0e | ||
|
|
90ddffce0e | ||
|
|
e30fde5237 | ||
|
|
ac683c3ff7 | ||
|
|
b5a931c96e | ||
|
|
5b61742075 | ||
|
|
4e4a38f7e9 | ||
|
|
c1bb029a1c | ||
|
|
eae2c37388 | ||
|
|
7193fea068 | ||
|
|
9b85deebf8 | ||
|
|
0211f75cb6 | ||
|
|
fa6b7ca3ed | ||
|
|
007d03e7f6 | ||
|
|
a534301eb7 | ||
|
|
1baa987016 | ||
|
|
a5b48ab392 | ||
|
|
7f981f05fb | ||
|
|
259cea1c42 | ||
|
|
9024b2a974 | ||
|
|
f2c31d3ca6 | ||
|
|
6f8b5dd909 | ||
|
|
6521b66b7c | ||
|
|
202d2075a6 | ||
|
|
e575fae73b | ||
|
|
d84ee3d03d | ||
|
|
ba745588e9 | ||
|
|
84731bdc19 | ||
|
|
f748c5dbe4 | ||
|
|
fdd4d5244f | ||
|
|
9301477262 | ||
|
|
9a787e6ef8 | ||
|
|
5b8cdf7884 | ||
|
|
5fd104bb30 | ||
|
|
9ba42a8fa3 | ||
|
|
fe8fd2e3a8 | ||
|
|
9ebce35d2b | ||
|
|
654145be84 | ||
|
|
3662d42374 | ||
|
|
d392fb371e | ||
|
|
1142d6ac48 | ||
|
|
bdc3b2425b | ||
|
|
9a64f45815 | ||
|
|
3633e02ff7 | ||
|
|
2c502ec764 | ||
|
|
b17d7f0e27 | ||
|
|
65364d6b0f | ||
|
|
6fd6c77ce6 | ||
|
|
e447549de1 | ||
|
|
6b0dd00aa5 | ||
|
|
461866836e | ||
|
|
3ae42f054f | ||
|
|
5a571f19e1 | ||
|
|
70aeaf7b5d | ||
|
|
7a6838f5a5 | ||
|
|
07f5e8f215 | ||
|
|
2b05bc1f5f | ||
|
|
edf64ae7b5 | ||
|
|
7370448be9 | ||
|
|
51af293d66 | ||
|
|
d37e28215e | ||
|
|
2c01849f2e | ||
|
|
c29ba9bb5f | ||
|
|
8fdf120ec2 | ||
|
|
a9b9161c40 | ||
|
|
43f907ebec | ||
|
|
ae670e1eb5 | ||
|
|
f102718901 | ||
|
|
9d452efc7d | ||
|
|
156fe529b5 | ||
|
|
df24525105 | ||
|
|
d938345deb | ||
|
|
d6681733dd | ||
|
|
2f1aec02f0 | ||
|
|
d30e0a3c51 | ||
|
|
3f3e9cf1bb | ||
|
|
e77909d498 | ||
|
|
d10830f892 | ||
|
|
18d8f72da2 | ||
|
|
4a59823e58 | ||
|
|
f3149e46cd | ||
|
|
60379a7b4e | ||
|
|
605b3cccee | ||
|
|
843799f4f6 | ||
|
|
a69cda5c13 | ||
|
|
dbaa3dbd52 | ||
|
|
58197c6fb2 | ||
|
|
7813093452 | ||
|
|
3f2c3dc987 | ||
|
|
08ddba25d0 | ||
|
|
d47fa7e64f | ||
|
|
c87aa2e537 | ||
|
|
bc430546bc | ||
|
|
9428e065eb | ||
|
|
10408c5717 | ||
|
|
ae902da913 | ||
|
|
0be5a91eff | ||
|
|
7dcf46ce98 | ||
|
|
33e6e4b411 | ||
|
|
bab6e4eb0d | ||
|
|
6a7c7521d8 | ||
|
|
d070244ea7 | ||
|
|
9219bb7d6e | ||
|
|
54e83f35e5 | ||
|
|
eb138d6526 | ||
|
|
edd0c3099b | ||
|
|
04455d40cf | ||
|
|
221af94d15 | ||
|
|
48ac3bb7af | ||
|
|
07273b8b7f | ||
|
|
bfb5b2864d | ||
|
|
07330e84fb | ||
|
|
0e39704b3a | ||
|
|
f25e794e7c | ||
|
|
df46ce8bdc | ||
|
|
4d83f537dc | ||
|
|
58443ef53f | ||
|
|
1ee52ad86b | ||
|
|
bc941239ec | ||
|
|
9a52d5387d | ||
|
|
1f50bc3752 | ||
|
|
0819df0910 | ||
|
|
663787c15b | ||
|
|
2c39d07261 | ||
|
|
dce84b9b09 | ||
|
|
a5bab6bb80 | ||
|
|
7536c03f63 | ||
|
|
ada5d2ef0e | ||
|
|
b8bead0590 | ||
|
|
68f852d6d1 | ||
|
|
d9fe5a8819 | ||
|
|
346183a23f | ||
|
|
dcfd7f5443 | ||
|
|
e59cd6672b | ||
|
|
7c8c440f67 | ||
|
|
f258c41f15 | ||
|
|
ae4a24f4aa | ||
|
|
476cdcfe86 | ||
|
|
f869df2f65 | ||
|
|
03cfabacd9 | ||
|
|
47ac5875f3 | ||
|
|
f67327358e | ||
|
|
4901823f15 | ||
|
|
5407e3c821 | ||
|
|
1d5cdad8b7 | ||
|
|
cd2424cb77 | ||
|
|
c17efde6bf | ||
|
|
40cd8cdec7 | ||
|
|
6768672a44 | ||
|
|
240c5b005b | ||
|
|
8dde170a35 | ||
|
|
c07abf8ff9 | ||
|
|
e5a436593f | ||
|
|
bb6e093ac6 | ||
|
|
59a334ce24 | ||
|
|
d241dcfb27 | ||
|
|
af263e7913 | ||
|
|
6610e7d405 | ||
|
|
c476e65cf2 | ||
|
|
b69b2eeeb3 | ||
|
|
89dab0917b | ||
|
|
73efdb95ae | ||
|
|
1bcca88614 | ||
|
|
8387571c1d | ||
|
|
1d017f60b4 | ||
|
|
81effda9e8 | ||
|
|
9343906ab1 |
118
.github/workflows/cicd.yml
vendored
118
.github/workflows/cicd.yml
vendored
@@ -1,34 +1,62 @@
|
|||||||
name: CI/CD Pipeline
|
name: CI/CD Pipeline
|
||||||
|
|
||||||
|
# CI/CD workflow for building, publishing, mirroring, signing container images and building release binaries.
|
||||||
|
# Actions are pinned to specific SHAs to reduce supply-chain risk. This workflow triggers on tag push events.
|
||||||
|
|
||||||
|
permissions:
|
||||||
|
contents: read
|
||||||
|
packages: write # for GHCR push
|
||||||
|
id-token: write # for Cosign Keyless (OIDC) Signing
|
||||||
|
|
||||||
|
# Required secrets:
|
||||||
|
# - DOCKER_HUB_USERNAME / DOCKER_HUB_ACCESS_TOKEN: push to Docker Hub
|
||||||
|
# - GITHUB_TOKEN: used for GHCR login and OIDC keyless signing
|
||||||
|
# - COSIGN_PRIVATE_KEY / COSIGN_PASSWORD / COSIGN_PUBLIC_KEY: for key-based signing
|
||||||
|
|
||||||
on:
|
on:
|
||||||
push:
|
push:
|
||||||
tags:
|
tags:
|
||||||
- "[0-9]+.[0-9]+.[0-9]+"
|
- "[0-9]+.[0-9]+.[0-9]+"
|
||||||
|
- "[0-9]+.[0-9]+.[0-9]+.rc.[0-9]+"
|
||||||
|
|
||||||
|
concurrency:
|
||||||
|
group: ${{ github.ref }}
|
||||||
|
cancel-in-progress: true
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
release:
|
release:
|
||||||
name: Build and Release
|
name: Build and Release
|
||||||
runs-on: amd64-runner
|
runs-on: [self-hosted, linux, x64]
|
||||||
|
# Job-level timeout to avoid runaway or stuck runs
|
||||||
|
timeout-minutes: 120
|
||||||
|
env:
|
||||||
|
# Target images
|
||||||
|
DOCKERHUB_IMAGE: docker.io/fosrl/${{ github.event.repository.name }}
|
||||||
|
GHCR_IMAGE: ghcr.io/${{ github.repository_owner }}/${{ github.event.repository.name }}
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout code
|
- name: Checkout code
|
||||||
uses: actions/checkout@v5
|
uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
|
||||||
|
|
||||||
|
- name: Set up QEMU
|
||||||
|
uses: docker/setup-qemu-action@29109295f81e9208d7d86ff1c6c12d2833863392 # v3.6.0
|
||||||
|
|
||||||
- name: Set up Docker Buildx
|
- name: Set up Docker Buildx
|
||||||
uses: docker/setup-buildx-action@v3
|
uses: docker/setup-buildx-action@e468171a9de216ec08956ac3ada2f0791b6bd435 # v3.11.1
|
||||||
|
|
||||||
- name: Log in to Docker Hub
|
- name: Log in to Docker Hub
|
||||||
uses: docker/login-action@v3
|
uses: docker/login-action@5e57cd118135c172c3672efd75eb46360885c0ef # v3.6.0
|
||||||
with:
|
with:
|
||||||
|
registry: docker.io
|
||||||
username: ${{ secrets.DOCKER_HUB_USERNAME }}
|
username: ${{ secrets.DOCKER_HUB_USERNAME }}
|
||||||
password: ${{ secrets.DOCKER_HUB_ACCESS_TOKEN }}
|
password: ${{ secrets.DOCKER_HUB_ACCESS_TOKEN }}
|
||||||
|
|
||||||
- name: Extract tag name
|
- name: Extract tag name
|
||||||
id: get-tag
|
id: get-tag
|
||||||
run: echo "TAG=${GITHUB_REF#refs/tags/}" >> $GITHUB_ENV
|
run: echo "TAG=${GITHUB_REF#refs/tags/}" >> $GITHUB_ENV
|
||||||
|
shell: bash
|
||||||
|
|
||||||
- name: Install Go
|
- name: Install Go
|
||||||
uses: actions/setup-go@v6
|
uses: actions/setup-go@44694675825211faa026b3c33043df3e48a5fa00 # v6.0.0
|
||||||
with:
|
with:
|
||||||
go-version: 1.24
|
go-version: 1.24
|
||||||
|
|
||||||
@@ -37,18 +65,21 @@ jobs:
|
|||||||
TAG=${{ env.TAG }}
|
TAG=${{ env.TAG }}
|
||||||
sed -i "s/export const APP_VERSION = \".*\";/export const APP_VERSION = \"$TAG\";/" server/lib/consts.ts
|
sed -i "s/export const APP_VERSION = \".*\";/export const APP_VERSION = \"$TAG\";/" server/lib/consts.ts
|
||||||
cat server/lib/consts.ts
|
cat server/lib/consts.ts
|
||||||
|
shell: bash
|
||||||
|
|
||||||
- name: Pull latest Gerbil version
|
- name: Pull latest Gerbil version
|
||||||
id: get-gerbil-tag
|
id: get-gerbil-tag
|
||||||
run: |
|
run: |
|
||||||
LATEST_TAG=$(curl -s https://api.github.com/repos/fosrl/gerbil/tags | jq -r '.[0].name')
|
LATEST_TAG=$(curl -s https://api.github.com/repos/fosrl/gerbil/tags | jq -r '.[0].name')
|
||||||
echo "LATEST_GERBIL_TAG=$LATEST_TAG" >> $GITHUB_ENV
|
echo "LATEST_GERBIL_TAG=$LATEST_TAG" >> $GITHUB_ENV
|
||||||
|
shell: bash
|
||||||
|
|
||||||
- name: Pull latest Badger version
|
- name: Pull latest Badger version
|
||||||
id: get-badger-tag
|
id: get-badger-tag
|
||||||
run: |
|
run: |
|
||||||
LATEST_TAG=$(curl -s https://api.github.com/repos/fosrl/badger/tags | jq -r '.[0].name')
|
LATEST_TAG=$(curl -s https://api.github.com/repos/fosrl/badger/tags | jq -r '.[0].name')
|
||||||
echo "LATEST_BADGER_TAG=$LATEST_TAG" >> $GITHUB_ENV
|
echo "LATEST_BADGER_TAG=$LATEST_TAG" >> $GITHUB_ENV
|
||||||
|
shell: bash
|
||||||
|
|
||||||
- name: Update install/main.go
|
- name: Update install/main.go
|
||||||
run: |
|
run: |
|
||||||
@@ -60,6 +91,7 @@ jobs:
|
|||||||
sed -i "s/config.BadgerVersion = \".*\"/config.BadgerVersion = \"$BADGER_VERSION\"/" install/main.go
|
sed -i "s/config.BadgerVersion = \".*\"/config.BadgerVersion = \"$BADGER_VERSION\"/" install/main.go
|
||||||
echo "Updated install/main.go with Pangolin version $PANGOLIN_VERSION, Gerbil version $GERBIL_VERSION, and Badger version $BADGER_VERSION"
|
echo "Updated install/main.go with Pangolin version $PANGOLIN_VERSION, Gerbil version $GERBIL_VERSION, and Badger version $BADGER_VERSION"
|
||||||
cat install/main.go
|
cat install/main.go
|
||||||
|
shell: bash
|
||||||
|
|
||||||
- name: Build installer
|
- name: Build installer
|
||||||
working-directory: install
|
working-directory: install
|
||||||
@@ -67,12 +99,82 @@ jobs:
|
|||||||
make go-build-release
|
make go-build-release
|
||||||
|
|
||||||
- name: Upload artifacts from /install/bin
|
- name: Upload artifacts from /install/bin
|
||||||
uses: actions/upload-artifact@v4
|
uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5.0.0
|
||||||
with:
|
with:
|
||||||
name: install-bin
|
name: install-bin
|
||||||
path: install/bin/
|
path: install/bin/
|
||||||
|
|
||||||
- name: Build and push Docker images
|
- name: Build and push Docker images (Docker Hub)
|
||||||
run: |
|
run: |
|
||||||
TAG=${{ env.TAG }}
|
TAG=${{ env.TAG }}
|
||||||
make build-release tag=$TAG
|
make build-release tag=$TAG
|
||||||
|
echo "Built & pushed to: ${{ env.DOCKERHUB_IMAGE }}:${TAG}"
|
||||||
|
shell: bash
|
||||||
|
|
||||||
|
- name: Install skopeo + jq
|
||||||
|
# skopeo: copy/inspect images between registries
|
||||||
|
# jq: JSON parsing tool used to extract digest values
|
||||||
|
run: |
|
||||||
|
sudo apt-get update -y
|
||||||
|
sudo apt-get install -y skopeo jq
|
||||||
|
skopeo --version
|
||||||
|
shell: bash
|
||||||
|
|
||||||
|
- name: Login to GHCR
|
||||||
|
run: |
|
||||||
|
skopeo login ghcr.io -u "${{ github.actor }}" -p "${{ secrets.GITHUB_TOKEN }}"
|
||||||
|
shell: bash
|
||||||
|
|
||||||
|
- name: Copy tag from Docker Hub to GHCR
|
||||||
|
# Mirror the already-built image (all architectures) to GHCR so we can sign it
|
||||||
|
run: |
|
||||||
|
set -euo pipefail
|
||||||
|
TAG=${{ env.TAG }}
|
||||||
|
echo "Copying ${{ env.DOCKERHUB_IMAGE }}:${TAG} -> ${{ env.GHCR_IMAGE }}:${TAG}"
|
||||||
|
skopeo copy --all --retry-times 3 \
|
||||||
|
docker://$DOCKERHUB_IMAGE:$TAG \
|
||||||
|
docker://$GHCR_IMAGE:$TAG
|
||||||
|
shell: bash
|
||||||
|
|
||||||
|
- name: Install cosign
|
||||||
|
# cosign is used to sign and verify container images (key and keyless)
|
||||||
|
uses: sigstore/cosign-installer@faadad0cce49287aee09b3a48701e75088a2c6ad # v4.0.0
|
||||||
|
|
||||||
|
- name: Dual-sign and verify (GHCR & Docker Hub)
|
||||||
|
# Sign each image by digest using keyless (OIDC) and key-based signing,
|
||||||
|
# then verify both the public key signature and the keyless OIDC signature.
|
||||||
|
env:
|
||||||
|
TAG: ${{ env.TAG }}
|
||||||
|
COSIGN_PRIVATE_KEY: ${{ secrets.COSIGN_PRIVATE_KEY }}
|
||||||
|
COSIGN_PASSWORD: ${{ secrets.COSIGN_PASSWORD }}
|
||||||
|
COSIGN_PUBLIC_KEY: ${{ secrets.COSIGN_PUBLIC_KEY }}
|
||||||
|
COSIGN_YES: "true"
|
||||||
|
run: |
|
||||||
|
set -euo pipefail
|
||||||
|
|
||||||
|
issuer="https://token.actions.githubusercontent.com"
|
||||||
|
id_regex="^https://github.com/${{ github.repository }}/.+" # accept this repo (all workflows/refs)
|
||||||
|
|
||||||
|
for IMAGE in "${GHCR_IMAGE}" "${DOCKERHUB_IMAGE}"; do
|
||||||
|
echo "Processing ${IMAGE}:${TAG}"
|
||||||
|
|
||||||
|
DIGEST="$(skopeo inspect --retry-times 3 docker://${IMAGE}:${TAG} | jq -r '.Digest')"
|
||||||
|
REF="${IMAGE}@${DIGEST}"
|
||||||
|
echo "Resolved digest: ${REF}"
|
||||||
|
|
||||||
|
echo "==> cosign sign (keyless) --recursive ${REF}"
|
||||||
|
cosign sign --recursive "${REF}"
|
||||||
|
|
||||||
|
echo "==> cosign sign (key) --recursive ${REF}"
|
||||||
|
cosign sign --key env://COSIGN_PRIVATE_KEY --recursive "${REF}"
|
||||||
|
|
||||||
|
echo "==> cosign verify (public key) ${REF}"
|
||||||
|
cosign verify --key env://COSIGN_PUBLIC_KEY "${REF}" -o text
|
||||||
|
|
||||||
|
echo "==> cosign verify (keyless policy) ${REF}"
|
||||||
|
cosign verify \
|
||||||
|
--certificate-oidc-issuer "${issuer}" \
|
||||||
|
--certificate-identity-regexp "${id_regex}" \
|
||||||
|
"${REF}" -o text
|
||||||
|
done
|
||||||
|
shell: bash
|
||||||
|
|||||||
9
.github/workflows/linting.yml
vendored
9
.github/workflows/linting.yml
vendored
@@ -1,5 +1,8 @@
|
|||||||
name: ESLint
|
name: ESLint
|
||||||
|
|
||||||
|
permissions:
|
||||||
|
contents: read
|
||||||
|
|
||||||
on:
|
on:
|
||||||
pull_request:
|
pull_request:
|
||||||
paths:
|
paths:
|
||||||
@@ -18,10 +21,10 @@ jobs:
|
|||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout code
|
- name: Checkout code
|
||||||
uses: actions/checkout@v5
|
uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
|
||||||
|
|
||||||
- name: Set up Node.js
|
- name: Set up Node.js
|
||||||
uses: actions/setup-node@v5
|
uses: actions/setup-node@2028fbc5c25fe9cf00d9f06a71cc4710d4507903 # v6.0.0
|
||||||
with:
|
with:
|
||||||
node-version: '22'
|
node-version: '22'
|
||||||
|
|
||||||
@@ -32,4 +35,4 @@ jobs:
|
|||||||
run: npm run set:oss
|
run: npm run set:oss
|
||||||
|
|
||||||
- name: Run ESLint
|
- name: Run ESLint
|
||||||
run: npx eslint . --ext .js,.jsx,.ts,.tsx
|
run: npx eslint . --ext .js,.jsx,.ts,.tsx
|
||||||
|
|||||||
132
.github/workflows/mirror.yaml
vendored
Normal file
132
.github/workflows/mirror.yaml
vendored
Normal file
@@ -0,0 +1,132 @@
|
|||||||
|
name: Mirror & Sign (Docker Hub to GHCR)
|
||||||
|
|
||||||
|
on:
|
||||||
|
workflow_dispatch: {}
|
||||||
|
|
||||||
|
permissions:
|
||||||
|
contents: read
|
||||||
|
packages: write
|
||||||
|
id-token: write # for keyless OIDC
|
||||||
|
|
||||||
|
env:
|
||||||
|
SOURCE_IMAGE: docker.io/fosrl/pangolin
|
||||||
|
DEST_IMAGE: ghcr.io/${{ github.repository_owner }}/${{ github.event.repository.name }}
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
mirror-and-dual-sign:
|
||||||
|
runs-on: amd64-runner
|
||||||
|
steps:
|
||||||
|
- name: Install skopeo + jq
|
||||||
|
run: |
|
||||||
|
sudo apt-get update -y
|
||||||
|
sudo apt-get install -y skopeo jq
|
||||||
|
skopeo --version
|
||||||
|
|
||||||
|
- name: Install cosign
|
||||||
|
uses: sigstore/cosign-installer@faadad0cce49287aee09b3a48701e75088a2c6ad # v4.0.0
|
||||||
|
|
||||||
|
- name: Input check
|
||||||
|
run: |
|
||||||
|
test -n "${SOURCE_IMAGE}" || (echo "SOURCE_IMAGE is empty" && exit 1)
|
||||||
|
echo "Source : ${SOURCE_IMAGE}"
|
||||||
|
echo "Target : ${DEST_IMAGE}"
|
||||||
|
|
||||||
|
# Auth for skopeo (containers-auth)
|
||||||
|
- name: Skopeo login to GHCR
|
||||||
|
run: |
|
||||||
|
skopeo login ghcr.io -u "${{ github.actor }}" -p "${{ secrets.GITHUB_TOKEN }}"
|
||||||
|
|
||||||
|
# Auth for cosign (docker-config)
|
||||||
|
- name: Docker login to GHCR (for cosign)
|
||||||
|
run: |
|
||||||
|
echo "${{ secrets.GITHUB_TOKEN }}" | docker login ghcr.io -u "${{ github.actor }}" --password-stdin
|
||||||
|
|
||||||
|
- name: List source tags
|
||||||
|
run: |
|
||||||
|
set -euo pipefail
|
||||||
|
skopeo list-tags --retry-times 3 docker://"${SOURCE_IMAGE}" \
|
||||||
|
| jq -r '.Tags[]' | sort -u > src-tags.txt
|
||||||
|
echo "Found source tags: $(wc -l < src-tags.txt)"
|
||||||
|
head -n 20 src-tags.txt || true
|
||||||
|
|
||||||
|
- name: List destination tags (skip existing)
|
||||||
|
run: |
|
||||||
|
set -euo pipefail
|
||||||
|
if skopeo list-tags --retry-times 3 docker://"${DEST_IMAGE}" >/tmp/dst.json 2>/dev/null; then
|
||||||
|
jq -r '.Tags[]' /tmp/dst.json | sort -u > dst-tags.txt
|
||||||
|
else
|
||||||
|
: > dst-tags.txt
|
||||||
|
fi
|
||||||
|
echo "Existing destination tags: $(wc -l < dst-tags.txt)"
|
||||||
|
|
||||||
|
- name: Mirror, dual-sign, and verify
|
||||||
|
env:
|
||||||
|
# keyless
|
||||||
|
COSIGN_YES: "true"
|
||||||
|
# key-based
|
||||||
|
COSIGN_PRIVATE_KEY: ${{ secrets.COSIGN_PRIVATE_KEY }}
|
||||||
|
COSIGN_PASSWORD: ${{ secrets.COSIGN_PASSWORD }}
|
||||||
|
# verify
|
||||||
|
COSIGN_PUBLIC_KEY: ${{ secrets.COSIGN_PUBLIC_KEY }}
|
||||||
|
run: |
|
||||||
|
set -euo pipefail
|
||||||
|
copied=0; skipped=0; v_ok=0; errs=0
|
||||||
|
|
||||||
|
issuer="https://token.actions.githubusercontent.com"
|
||||||
|
id_regex="^https://github.com/${{ github.repository }}/.+"
|
||||||
|
|
||||||
|
while read -r tag; do
|
||||||
|
[ -z "$tag" ] && continue
|
||||||
|
|
||||||
|
if grep -Fxq "$tag" dst-tags.txt; then
|
||||||
|
echo "::notice ::Skip (exists) ${DEST_IMAGE}:${tag}"
|
||||||
|
skipped=$((skipped+1))
|
||||||
|
continue
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "==> Copy ${SOURCE_IMAGE}:${tag} → ${DEST_IMAGE}:${tag}"
|
||||||
|
if ! skopeo copy --all --retry-times 3 \
|
||||||
|
docker://"${SOURCE_IMAGE}:${tag}" docker://"${DEST_IMAGE}:${tag}"; then
|
||||||
|
echo "::warning title=Copy failed::${SOURCE_IMAGE}:${tag}"
|
||||||
|
errs=$((errs+1)); continue
|
||||||
|
fi
|
||||||
|
copied=$((copied+1))
|
||||||
|
|
||||||
|
digest="$(skopeo inspect --retry-times 3 docker://"${DEST_IMAGE}:${tag}" | jq -r '.Digest')"
|
||||||
|
ref="${DEST_IMAGE}@${digest}"
|
||||||
|
|
||||||
|
echo "==> cosign sign (keyless) --recursive ${ref}"
|
||||||
|
if ! cosign sign --recursive "${ref}"; then
|
||||||
|
echo "::warning title=Keyless sign failed::${ref}"
|
||||||
|
errs=$((errs+1))
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "==> cosign sign (key) --recursive ${ref}"
|
||||||
|
if ! cosign sign --key env://COSIGN_PRIVATE_KEY --recursive "${ref}"; then
|
||||||
|
echo "::warning title=Key sign failed::${ref}"
|
||||||
|
errs=$((errs+1))
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "==> cosign verify (public key) ${ref}"
|
||||||
|
if ! cosign verify --key env://COSIGN_PUBLIC_KEY "${ref}" -o text; then
|
||||||
|
echo "::warning title=Verify(pubkey) failed::${ref}"
|
||||||
|
errs=$((errs+1))
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "==> cosign verify (keyless policy) ${ref}"
|
||||||
|
if ! cosign verify \
|
||||||
|
--certificate-oidc-issuer "${issuer}" \
|
||||||
|
--certificate-identity-regexp "${id_regex}" \
|
||||||
|
"${ref}" -o text; then
|
||||||
|
echo "::warning title=Verify(keyless) failed::${ref}"
|
||||||
|
errs=$((errs+1))
|
||||||
|
else
|
||||||
|
v_ok=$((v_ok+1))
|
||||||
|
fi
|
||||||
|
done < src-tags.txt
|
||||||
|
|
||||||
|
echo "---- Summary ----"
|
||||||
|
echo "Copied : $copied"
|
||||||
|
echo "Skipped : $skipped"
|
||||||
|
echo "Verified OK : $v_ok"
|
||||||
|
echo "Errors : $errs"
|
||||||
4
.github/workflows/stale-bot.yml
vendored
4
.github/workflows/stale-bot.yml
vendored
@@ -14,7 +14,7 @@ jobs:
|
|||||||
stale:
|
stale:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/stale@v10
|
- uses: actions/stale@5f858e3efba33a5ca4407a664cc011ad407f2008 # v10.1.0
|
||||||
with:
|
with:
|
||||||
days-before-stale: 14
|
days-before-stale: 14
|
||||||
days-before-close: 14
|
days-before-close: 14
|
||||||
@@ -34,4 +34,4 @@ jobs:
|
|||||||
operations-per-run: 100
|
operations-per-run: 100
|
||||||
remove-stale-when-updated: true
|
remove-stale-when-updated: true
|
||||||
delete-branch: false
|
delete-branch: false
|
||||||
enable-statistics: true
|
enable-statistics: true
|
||||||
|
|||||||
7
.github/workflows/test.yml
vendored
7
.github/workflows/test.yml
vendored
@@ -1,5 +1,8 @@
|
|||||||
name: Run Tests
|
name: Run Tests
|
||||||
|
|
||||||
|
permissions:
|
||||||
|
contents: read
|
||||||
|
|
||||||
on:
|
on:
|
||||||
pull_request:
|
pull_request:
|
||||||
branches:
|
branches:
|
||||||
@@ -11,9 +14,9 @@ jobs:
|
|||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v5
|
- uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
|
||||||
|
|
||||||
- uses: actions/setup-node@v5
|
- uses: actions/setup-node@2028fbc5c25fe9cf00d9f06a71cc4710d4507903 # v6.0.0
|
||||||
with:
|
with:
|
||||||
node-version: '22'
|
node-version: '22'
|
||||||
|
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ Contributions are welcome!
|
|||||||
|
|
||||||
Please see the contribution and local development guide on the docs page before getting started:
|
Please see the contribution and local development guide on the docs page before getting started:
|
||||||
|
|
||||||
https://docs.digpangolin.com/development/contributing
|
https://docs.pangolin.net/development/contributing
|
||||||
|
|
||||||
### Licensing Considerations
|
### Licensing Considerations
|
||||||
|
|
||||||
|
|||||||
30
Makefile
30
Makefile
@@ -44,6 +44,36 @@ build-release:
|
|||||||
--tag fosrl/pangolin:ee-postgresql-$(tag) \
|
--tag fosrl/pangolin:ee-postgresql-$(tag) \
|
||||||
--push .
|
--push .
|
||||||
|
|
||||||
|
build-rc:
|
||||||
|
@if [ -z "$(tag)" ]; then \
|
||||||
|
echo "Error: tag is required. Usage: make build-release tag=<tag>"; \
|
||||||
|
exit 1; \
|
||||||
|
fi
|
||||||
|
docker buildx build \
|
||||||
|
--build-arg BUILD=oss \
|
||||||
|
--build-arg DATABASE=sqlite \
|
||||||
|
--platform linux/arm64,linux/amd64 \
|
||||||
|
--tag fosrl/pangolin:$(tag) \
|
||||||
|
--push .
|
||||||
|
docker buildx build \
|
||||||
|
--build-arg BUILD=oss \
|
||||||
|
--build-arg DATABASE=pg \
|
||||||
|
--platform linux/arm64,linux/amd64 \
|
||||||
|
--tag fosrl/pangolin:postgresql-$(tag) \
|
||||||
|
--push .
|
||||||
|
docker buildx build \
|
||||||
|
--build-arg BUILD=enterprise \
|
||||||
|
--build-arg DATABASE=sqlite \
|
||||||
|
--platform linux/arm64,linux/amd64 \
|
||||||
|
--tag fosrl/pangolin:ee-$(tag) \
|
||||||
|
--push .
|
||||||
|
docker buildx build \
|
||||||
|
--build-arg BUILD=enterprise \
|
||||||
|
--build-arg DATABASE=pg \
|
||||||
|
--platform linux/arm64,linux/amd64 \
|
||||||
|
--tag fosrl/pangolin:ee-postgresql-$(tag) \
|
||||||
|
--push .
|
||||||
|
|
||||||
build-arm:
|
build-arm:
|
||||||
docker buildx build --platform linux/arm64 -t fosrl/pangolin:latest .
|
docker buildx build --platform linux/arm64 -t fosrl/pangolin:latest .
|
||||||
|
|
||||||
|
|||||||
25
README.md
25
README.md
@@ -1,6 +1,6 @@
|
|||||||
<div align="center">
|
<div align="center">
|
||||||
<h2>
|
<h2>
|
||||||
<a href="https://digpangolin.com">
|
<a href="https://pangolin.net/">
|
||||||
<picture>
|
<picture>
|
||||||
<source media="(prefers-color-scheme: dark)" srcset="public/logo/word_mark_white.png">
|
<source media="(prefers-color-scheme: dark)" srcset="public/logo/word_mark_white.png">
|
||||||
<img alt="Pangolin Logo" src="public/logo/word_mark_black.png" width="350">
|
<img alt="Pangolin Logo" src="public/logo/word_mark_black.png" width="350">
|
||||||
@@ -11,15 +11,15 @@
|
|||||||
|
|
||||||
<div align="center">
|
<div align="center">
|
||||||
<h5>
|
<h5>
|
||||||
<a href="https://digpangolin.com">
|
<a href="https://pangolin.net/">
|
||||||
Website
|
Website
|
||||||
</a>
|
</a>
|
||||||
<span> | </span>
|
<span> | </span>
|
||||||
<a href="https://docs.digpangolin.com/">
|
<a href="https://docs.pangolin.net/">
|
||||||
Documentation
|
Documentation
|
||||||
</a>
|
</a>
|
||||||
<span> | </span>
|
<span> | </span>
|
||||||
<a href="mailto:contact@fossorial.io">
|
<a href="mailto:contact@pangolin.net">
|
||||||
Contact Us
|
Contact Us
|
||||||
</a>
|
</a>
|
||||||
</h5>
|
</h5>
|
||||||
@@ -28,7 +28,7 @@
|
|||||||
<div align="center">
|
<div align="center">
|
||||||
|
|
||||||
[](https://discord.gg/HCJR8Xhme4)
|
[](https://discord.gg/HCJR8Xhme4)
|
||||||
[](https://digpangolin.com/slack)
|
[](https://pangolin.net/slack)
|
||||||
[](https://hub.docker.com/r/fosrl/pangolin)
|
[](https://hub.docker.com/r/fosrl/pangolin)
|
||||||

|

|
||||||
[](https://www.youtube.com/@fossorial-app)
|
[](https://www.youtube.com/@fossorial-app)
|
||||||
@@ -37,7 +37,7 @@
|
|||||||
|
|
||||||
<p align="center">
|
<p align="center">
|
||||||
<strong>
|
<strong>
|
||||||
Start testing Pangolin at <a href="https://pangolin.fossorial.io/auth/signup">pangolin.fossorial.io</a>
|
Start testing Pangolin at <a href="https://app.pangolin.net/auth/signup">app.pangolin.net</a>
|
||||||
</strong>
|
</strong>
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
@@ -45,7 +45,10 @@ Pangolin is a self-hosted tunneled reverse proxy server with identity and contex
|
|||||||
|
|
||||||
## Installation
|
## Installation
|
||||||
|
|
||||||
Check out the [quick install guide](https://docs.digpangolin.com/self-host/quick-install) for how to install and set up Pangolin.
|
- Check out the [quick install guide](https://docs.pangolin.net/self-host/quick-install) for how to install and set up Pangolin.
|
||||||
|
- Install from the [DigitalOcean marketplace](https://marketplace.digitalocean.com/apps/pangolin-ce-1?refcode=edf0480eeb81) for a one-click pre-configured installer.
|
||||||
|
|
||||||
|
<img src="public/screenshots/hero.png" />
|
||||||
|
|
||||||
## Deployment Options
|
## Deployment Options
|
||||||
|
|
||||||
@@ -53,7 +56,7 @@ Check out the [quick install guide](https://docs.digpangolin.com/self-host/quick
|
|||||||
|-----------------|--------------|
|
|-----------------|--------------|
|
||||||
| **Self-Host: Community Edition** | Free, open source, and licensed under AGPL-3. |
|
| **Self-Host: Community Edition** | Free, open source, and licensed under AGPL-3. |
|
||||||
| **Self-Host: Enterprise Edition** | Licensed under Fossorial Commercial License. Free for personal and hobbyist use, and for businesses earning under \$100K USD annually. |
|
| **Self-Host: Enterprise Edition** | Licensed under Fossorial Commercial License. Free for personal and hobbyist use, and for businesses earning under \$100K USD annually. |
|
||||||
| **Pangolin Cloud** | Fully managed service with instant setup and pay-as-you-go pricing — no infrastructure required. Or, self-host your own [remote node](https://docs.digpangolin.com/manage/remote-node/nodes) and connect to our control plane. |
|
| **Pangolin Cloud** | Fully managed service with instant setup and pay-as-you-go pricing — no infrastructure required. Or, self-host your own [remote node](https://docs.pangolin.net/manage/remote-node/nodes) and connect to our control plane. |
|
||||||
|
|
||||||
## Key Features
|
## Key Features
|
||||||
|
|
||||||
@@ -71,17 +74,17 @@ Pangolin packages everything you need for seamless application access and exposu
|
|||||||
### Check out the docs
|
### Check out the docs
|
||||||
|
|
||||||
We encourage everyone to read the full documentation first, which is
|
We encourage everyone to read the full documentation first, which is
|
||||||
available at [docs.digpangolin.com](https://docs.digpangolin.com). This README provides only a very brief subset of
|
available at [docs.pangolin.net](https://docs.pangolin.net). This README provides only a very brief subset of
|
||||||
the docs to illustrate some basic ideas.
|
the docs to illustrate some basic ideas.
|
||||||
|
|
||||||
### Sign up and try now
|
### Sign up and try now
|
||||||
|
|
||||||
For Pangolin's managed service, you will first need to create an account at
|
For Pangolin's managed service, you will first need to create an account at
|
||||||
[pangolin.fossorial.io](https://pangolin.fossorial.io). We have a generous free tier to get started.
|
[app.pangolin.net](https://app.pangolin.net). We have a generous free tier to get started.
|
||||||
|
|
||||||
## Licensing
|
## Licensing
|
||||||
|
|
||||||
Pangolin is dual licensed under the AGPL-3 and the [Fossorial Commercial License](https://digpangolin.com/fcl.html). For inquiries about commercial licensing, please contact us at [contact@fossorial.io](mailto:contact@fossorial.io).
|
Pangolin is dual licensed under the AGPL-3 and the [Fossorial Commercial License](https://pangolin.net/fcl.html). For inquiries about commercial licensing, please contact us at [contact@pangolin.net](mailto:contact@pangolin.net).
|
||||||
|
|
||||||
## Contributions
|
## Contributions
|
||||||
|
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
If you discover a security vulnerability, please follow the steps below to responsibly disclose it to us:
|
If you discover a security vulnerability, please follow the steps below to responsibly disclose it to us:
|
||||||
|
|
||||||
1. **Do not create a public GitHub issue or discussion post.** This could put the security of other users at risk.
|
1. **Do not create a public GitHub issue or discussion post.** This could put the security of other users at risk.
|
||||||
2. Send a detailed report to [security@fossorial.io](mailto:security@fossorial.io) or send a **private** message to a maintainer on [Discord](https://discord.gg/HCJR8Xhme4). Include:
|
2. Send a detailed report to [security@pangolin.net](mailto:security@pangolin.net) or send a **private** message to a maintainer on [Discord](https://discord.gg/HCJR8Xhme4). Include:
|
||||||
|
|
||||||
- Description and location of the vulnerability.
|
- Description and location of the vulnerability.
|
||||||
- Potential impact of the vulnerability.
|
- Potential impact of the vulnerability.
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ import base64
|
|||||||
YAML_FILE_PATH = 'blueprint.yaml'
|
YAML_FILE_PATH = 'blueprint.yaml'
|
||||||
|
|
||||||
# The API endpoint and headers from the curl request
|
# The API endpoint and headers from the curl request
|
||||||
API_URL = 'http://api.pangolin.fossorial.io/v1/org/test/blueprint'
|
API_URL = 'http://api.pangolin.net/v1/org/test/blueprint'
|
||||||
HEADERS = {
|
HEADERS = {
|
||||||
'accept': '*/*',
|
'accept': '*/*',
|
||||||
'Authorization': 'Bearer <your_token_here>',
|
'Authorization': 'Bearer <your_token_here>',
|
||||||
|
|||||||
@@ -28,9 +28,9 @@ proxy-resources:
|
|||||||
# sso-roles:
|
# sso-roles:
|
||||||
# - Member
|
# - Member
|
||||||
# sso-users:
|
# sso-users:
|
||||||
# - owen@fossorial.io
|
# - owen@pangolin.net
|
||||||
# whitelist-users:
|
# whitelist-users:
|
||||||
# - owen@fossorial.io
|
# - owen@pangolin.net
|
||||||
headers:
|
headers:
|
||||||
- name: X-Example-Header
|
- name: X-Example-Header
|
||||||
value: example-value
|
value: example-value
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ post {
|
|||||||
|
|
||||||
body:json {
|
body:json {
|
||||||
{
|
{
|
||||||
"email": "owen@fossorial.io",
|
"email": "owen@pangolin.net",
|
||||||
"password": "Password123!"
|
"password": "Password123!"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -12,6 +12,6 @@ post {
|
|||||||
|
|
||||||
body:json {
|
body:json {
|
||||||
{
|
{
|
||||||
"email": "milo@fossorial.io"
|
"email": "milo@pangolin.net"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ put {
|
|||||||
|
|
||||||
body:json {
|
body:json {
|
||||||
{
|
{
|
||||||
"email": "numbat@fossorial.io",
|
"email": "numbat@pangolin.net",
|
||||||
"password": "Password123!"
|
"password": "Password123!"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -90,7 +90,8 @@ export const setAdminCredentials: CommandModule<{}, SetAdminCredentialsArgs> = {
|
|||||||
passwordHash,
|
passwordHash,
|
||||||
dateCreated: moment().toISOString(),
|
dateCreated: moment().toISOString(),
|
||||||
serverAdmin: true,
|
serverAdmin: true,
|
||||||
emailVerified: true
|
emailVerified: true,
|
||||||
|
lastPasswordChange: new Date().getTime()
|
||||||
});
|
});
|
||||||
|
|
||||||
console.log("Server admin created");
|
console.log("Server admin created");
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
# To see all available options, please visit the docs:
|
# To see all available options, please visit the docs:
|
||||||
# https://docs.digpangolin.com/self-host/advanced/config-file
|
# https://docs.pangolin.net/self-host/advanced/config-file
|
||||||
|
|
||||||
app:
|
app:
|
||||||
dashboard_url: http://localhost:3002
|
dashboard_url: http://localhost:3002
|
||||||
|
|||||||
15
docker-compose.drizzle.yml
Normal file
15
docker-compose.drizzle.yml
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
services:
|
||||||
|
drizzle-gateway:
|
||||||
|
image: ghcr.io/drizzle-team/gateway:latest
|
||||||
|
ports:
|
||||||
|
- "4984:4983"
|
||||||
|
depends_on:
|
||||||
|
- db
|
||||||
|
environment:
|
||||||
|
- STORE_PATH=/app
|
||||||
|
- DATABASE_URL=postgresql://postgres:password@db:5432/postgres
|
||||||
|
volumes:
|
||||||
|
- drizzle-gateway-data:/app
|
||||||
|
|
||||||
|
volumes:
|
||||||
|
drizzle-gateway-data:
|
||||||
@@ -11,7 +11,7 @@ services:
|
|||||||
- ./config/postgres:/var/lib/postgresql/data
|
- ./config/postgres:/var/lib/postgresql/data
|
||||||
ports:
|
ports:
|
||||||
- "5432:5432" # Map host port 5432 to container port 5432
|
- "5432:5432" # Map host port 5432 to container port 5432
|
||||||
restart: no
|
restart: no
|
||||||
|
|
||||||
redis:
|
redis:
|
||||||
image: redis:latest # Use the latest Redis image
|
image: redis:latest # Use the latest Redis image
|
||||||
|
|||||||
@@ -18,7 +18,11 @@ put-back:
|
|||||||
mv main.go.bak main.go
|
mv main.go.bak main.go
|
||||||
|
|
||||||
dev-update-versions:
|
dev-update-versions:
|
||||||
PANGOLIN_VERSION=$$(curl -s https://api.github.com/repos/fosrl/pangolin/tags | jq -r '.[0].name') && \
|
if [ -z "$(tag)" ]; then \
|
||||||
|
PANGOLIN_VERSION=$$(curl -s https://api.github.com/repos/fosrl/pangolin/tags | jq -r '.[0].name'); \
|
||||||
|
else \
|
||||||
|
PANGOLIN_VERSION=$(tag); \
|
||||||
|
fi && \
|
||||||
GERBIL_VERSION=$$(curl -s https://api.github.com/repos/fosrl/gerbil/tags | jq -r '.[0].name') && \
|
GERBIL_VERSION=$$(curl -s https://api.github.com/repos/fosrl/gerbil/tags | jq -r '.[0].name') && \
|
||||||
BADGER_VERSION=$$(curl -s https://api.github.com/repos/fosrl/badger/tags | jq -r '.[0].name') && \
|
BADGER_VERSION=$$(curl -s https://api.github.com/repos/fosrl/badger/tags | jq -r '.[0].name') && \
|
||||||
echo "Latest versions - Pangolin: $$PANGOLIN_VERSION, Gerbil: $$GERBIL_VERSION, Badger: $$BADGER_VERSION" && \
|
echo "Latest versions - Pangolin: $$PANGOLIN_VERSION, Gerbil: $$GERBIL_VERSION, Badger: $$BADGER_VERSION" && \
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
# To see all available options, please visit the docs:
|
# To see all available options, please visit the docs:
|
||||||
# https://docs.digpangolin.com/
|
# https://docs.pangolin.net/
|
||||||
|
|
||||||
gerbil:
|
gerbil:
|
||||||
start_port: 51820
|
start_port: 51820
|
||||||
@@ -14,7 +14,6 @@ app:
|
|||||||
domains:
|
domains:
|
||||||
domain1:
|
domain1:
|
||||||
base_domain: "{{.BaseDomain}}"
|
base_domain: "{{.BaseDomain}}"
|
||||||
cert_resolver: "letsencrypt"
|
|
||||||
|
|
||||||
server:
|
server:
|
||||||
secret: "{{.Secret}}"
|
secret: "{{.Secret}}"
|
||||||
@@ -36,4 +35,4 @@ flags:
|
|||||||
require_email_verification: {{.EnableEmail}}
|
require_email_verification: {{.EnableEmail}}
|
||||||
disable_signup_without_invite: true
|
disable_signup_without_invite: true
|
||||||
disable_user_create_org: false
|
disable_user_create_org: false
|
||||||
allow_raw_resources: true
|
allow_raw_resources: true
|
||||||
|
|||||||
@@ -51,3 +51,12 @@ http:
|
|||||||
loadBalancer:
|
loadBalancer:
|
||||||
servers:
|
servers:
|
||||||
- url: "http://pangolin:3000" # API/WebSocket server
|
- url: "http://pangolin:3000" # API/WebSocket server
|
||||||
|
|
||||||
|
tcp:
|
||||||
|
serversTransports:
|
||||||
|
pp-transport-v1:
|
||||||
|
proxyProtocol:
|
||||||
|
version: 1
|
||||||
|
pp-transport-v2:
|
||||||
|
proxyProtocol:
|
||||||
|
version: 2
|
||||||
@@ -378,7 +378,7 @@ func collectUserInput(reader *bufio.Reader) Config {
|
|||||||
fmt.Println("\n=== Advanced Configuration ===")
|
fmt.Println("\n=== Advanced Configuration ===")
|
||||||
|
|
||||||
config.EnableIPv6 = readBool(reader, "Is your server IPv6 capable?", true)
|
config.EnableIPv6 = readBool(reader, "Is your server IPv6 capable?", true)
|
||||||
config.EnableGeoblocking = readBool(reader, "Do you want to download the MaxMind GeoLite2 database for geoblocking functionality?", false)
|
config.EnableGeoblocking = readBool(reader, "Do you want to download the MaxMind GeoLite2 database for geoblocking functionality?", true)
|
||||||
|
|
||||||
if config.DashboardDomain == "" {
|
if config.DashboardDomain == "" {
|
||||||
fmt.Println("Error: Dashboard Domain name is required")
|
fmt.Println("Error: Dashboard Domain name is required")
|
||||||
|
|||||||
@@ -47,9 +47,8 @@
|
|||||||
"edit": "Редактиране",
|
"edit": "Редактиране",
|
||||||
"siteConfirmDelete": "Потвърждение на изтриване на сайта",
|
"siteConfirmDelete": "Потвърждение на изтриване на сайта",
|
||||||
"siteDelete": "Изтриване на сайта",
|
"siteDelete": "Изтриване на сайта",
|
||||||
"siteMessageRemove": "След изтриване, сайтът няма повече да бъде достъпен. Всички ресурси и цели, свързани със сайта, също ще бъдат премахнати.",
|
"siteMessageRemove": "След премахване, сайтът вече няма да бъде достъпен. Всички цели, свързани със сайта, също ще бъдат премахнати.",
|
||||||
"siteMessageConfirm": "За потвърждение, моля, напишете името на сайта по-долу.",
|
"siteQuestionRemove": "Сигурни ли сте, че искате да премахнете сайта от организацията?",
|
||||||
"siteQuestionRemove": "Сигурни ли сте, че искате да премахнете сайта {selectedSite} от организацията?",
|
|
||||||
"siteManageSites": "Управление на сайтове",
|
"siteManageSites": "Управление на сайтове",
|
||||||
"siteDescription": "Позволете свързване към вашата мрежа чрез сигурни тунели",
|
"siteDescription": "Позволете свързване към вашата мрежа чрез сигурни тунели",
|
||||||
"siteCreate": "Създайте сайт",
|
"siteCreate": "Създайте сайт",
|
||||||
@@ -96,7 +95,7 @@
|
|||||||
"siteWgDescription": "Use any WireGuard client to establish a tunnel. Manual NAT setup required. ONLY WORKS ON SELF HOSTED NODES",
|
"siteWgDescription": "Use any WireGuard client to establish a tunnel. Manual NAT setup required. ONLY WORKS ON SELF HOSTED NODES",
|
||||||
"siteWgDescriptionSaas": "Използвайте всеки WireGuard клиент за установяване на тунел. Ръчно нат задаване е необходимо. РАБОТИ САМО НА СОБСТВЕНИ УЗЛИ.",
|
"siteWgDescriptionSaas": "Използвайте всеки WireGuard клиент за установяване на тунел. Ръчно нат задаване е необходимо. РАБОТИ САМО НА СОБСТВЕНИ УЗЛИ.",
|
||||||
"siteLocalDescription": "Local resources only. No tunneling. ONLY WORKS ON SELF HOSTED NODES",
|
"siteLocalDescription": "Local resources only. No tunneling. ONLY WORKS ON SELF HOSTED NODES",
|
||||||
"siteLocalDescriptionSaas": "Local resources only. No tunneling. Only available on remote nodes.",
|
"siteLocalDescriptionSaas": "Само локални ресурси. Без тунелиране. Достъпно само на отдалечени възли.",
|
||||||
"siteSeeAll": "Вижте всички сайтове",
|
"siteSeeAll": "Вижте всички сайтове",
|
||||||
"siteTunnelDescription": "Определете как искате да се свържете с вашия сайт",
|
"siteTunnelDescription": "Определете как искате да се свържете с вашия сайт",
|
||||||
"siteNewtCredentials": "Newt Удостоверения",
|
"siteNewtCredentials": "Newt Удостоверения",
|
||||||
@@ -154,8 +153,7 @@
|
|||||||
"protected": "Защита",
|
"protected": "Защита",
|
||||||
"notProtected": "Не защитен",
|
"notProtected": "Не защитен",
|
||||||
"resourceMessageRemove": "След като се премахне, ресурсът няма повече да бъде достъпен. Всички цели, свързани с ресурса, също ще бъдат премахнати.",
|
"resourceMessageRemove": "След като се премахне, ресурсът няма повече да бъде достъпен. Всички цели, свързани с ресурса, също ще бъдат премахнати.",
|
||||||
"resourceMessageConfirm": "За потвърждение, моля, напишете името на ресурса по-долу.",
|
"resourceQuestionRemove": "Сигурни ли сте, че искате да премахнете ресурса от организацията?",
|
||||||
"resourceQuestionRemove": "Сигурни ли сте, че искате да премахнете ресурса {selectedResource} от организацията?",
|
|
||||||
"resourceHTTP": "HTTPS ресурс",
|
"resourceHTTP": "HTTPS ресурс",
|
||||||
"resourceHTTPDescription": "Прокси заявки към вашето приложение през HTTPS с помощта на субдомейн или базов домейн.",
|
"resourceHTTPDescription": "Прокси заявки към вашето приложение през HTTPS с помощта на субдомейн или базов домейн.",
|
||||||
"resourceRaw": "Суров TCP/UDP ресурс",
|
"resourceRaw": "Суров TCP/UDP ресурс",
|
||||||
@@ -220,7 +218,7 @@
|
|||||||
"orgDeleteConfirm": "Потвърдете изтриване на организация",
|
"orgDeleteConfirm": "Потвърдете изтриване на организация",
|
||||||
"orgMessageRemove": "Това действие е необратимо и ще изтрие всички свързани данни.",
|
"orgMessageRemove": "Това действие е необратимо и ще изтрие всички свързани данни.",
|
||||||
"orgMessageConfirm": "За потвърждение, моля, напишете името на организацията по-долу.",
|
"orgMessageConfirm": "За потвърждение, моля, напишете името на организацията по-долу.",
|
||||||
"orgQuestionRemove": "Сигурни ли сте, че искате да премахнете организацията {selectedOrg}?",
|
"orgQuestionRemove": "Сигурни ли сте, че искате да премахнете организацията?",
|
||||||
"orgUpdated": "Организацията е актуализирана",
|
"orgUpdated": "Организацията е актуализирана",
|
||||||
"orgUpdatedDescription": "Организацията е обновена.",
|
"orgUpdatedDescription": "Организацията е обновена.",
|
||||||
"orgErrorUpdate": "Неуспешно актуализиране на организацията",
|
"orgErrorUpdate": "Неуспешно актуализиране на организацията",
|
||||||
@@ -287,9 +285,8 @@
|
|||||||
"apiKeysAdd": "Генерирайте API ключ",
|
"apiKeysAdd": "Генерирайте API ключ",
|
||||||
"apiKeysErrorDelete": "Грешка при изтриване на API ключ",
|
"apiKeysErrorDelete": "Грешка при изтриване на API ключ",
|
||||||
"apiKeysErrorDeleteMessage": "Грешка при изтриване на API ключ",
|
"apiKeysErrorDeleteMessage": "Грешка при изтриване на API ключ",
|
||||||
"apiKeysQuestionRemove": "Сигурни ли сте, че искате да премахнете API ключа {selectedApiKey} от организацията?",
|
"apiKeysQuestionRemove": "Сигурни ли сте, че искате да премахнете API ключа от организацията?",
|
||||||
"apiKeysMessageRemove": "След като бъде премахнат, API ключът няма вече да може да се използва.",
|
"apiKeysMessageRemove": "След като бъде премахнат, API ключът няма вече да може да се използва.",
|
||||||
"apiKeysMessageConfirm": "За потвърждение, моля, напишете името на API ключа по-долу.",
|
|
||||||
"apiKeysDeleteConfirm": "Потвърдете изтриване на API ключ",
|
"apiKeysDeleteConfirm": "Потвърдете изтриване на API ключ",
|
||||||
"apiKeysDelete": "Изтрийте API ключа",
|
"apiKeysDelete": "Изтрийте API ключа",
|
||||||
"apiKeysManage": "Управление на API ключове",
|
"apiKeysManage": "Управление на API ключове",
|
||||||
@@ -305,8 +302,7 @@
|
|||||||
"userDeleteConfirm": "Потвърдете изтриването на потребител",
|
"userDeleteConfirm": "Потвърдете изтриването на потребител",
|
||||||
"userDeleteServer": "Изтрийте потребителя от сървъра",
|
"userDeleteServer": "Изтрийте потребителя от сървъра",
|
||||||
"userMessageRemove": "Потребителят ще бъде премахнат от всички организации и напълно заличен от сървъра.",
|
"userMessageRemove": "Потребителят ще бъде премахнат от всички организации и напълно заличен от сървъра.",
|
||||||
"userMessageConfirm": "За да потвърдите, въведете името на потребителя по-долу.",
|
"userQuestionRemove": "Сигурни ли сте, че искате да изтриете потребител от сървъра?",
|
||||||
"userQuestionRemove": "Сигурни ли сте, че искате да изтриете завинаги {selectedUser} от сървъра?",
|
|
||||||
"licenseKey": "Ключ за лиценз",
|
"licenseKey": "Ключ за лиценз",
|
||||||
"valid": "Валиден",
|
"valid": "Валиден",
|
||||||
"numberOfSites": "Брой сайтове",
|
"numberOfSites": "Брой сайтове",
|
||||||
@@ -339,7 +335,7 @@
|
|||||||
"fossorialLicense": "Преглед на търговски условия и абонамент за Fossorial",
|
"fossorialLicense": "Преглед на търговски условия и абонамент за Fossorial",
|
||||||
"licenseMessageRemove": "Това ще премахне лицензионния ключ и всички свързани права, предоставени от него.",
|
"licenseMessageRemove": "Това ще премахне лицензионния ключ и всички свързани права, предоставени от него.",
|
||||||
"licenseMessageConfirm": "За да потвърдите, въведете лицензионния ключ по-долу.",
|
"licenseMessageConfirm": "За да потвърдите, въведете лицензионния ключ по-долу.",
|
||||||
"licenseQuestionRemove": "Сигурни ли сте, че искате да изтриете лицензионния ключ {selectedKey}?",
|
"licenseQuestionRemove": "Сигурни ли сте, че искате да премахнете лицензионния ключ?",
|
||||||
"licenseKeyDelete": "Изтриване на лицензионен ключ",
|
"licenseKeyDelete": "Изтриване на лицензионен ключ",
|
||||||
"licenseKeyDeleteConfirm": "Потвърдете изтриването на лицензионен ключ",
|
"licenseKeyDeleteConfirm": "Потвърдете изтриването на лицензионен ключ",
|
||||||
"licenseTitle": "Управление на лицензионния статус",
|
"licenseTitle": "Управление на лицензионния статус",
|
||||||
@@ -372,7 +368,7 @@
|
|||||||
"inviteRemoveErrorDescription": "Възникна грешка при премахване на поканата.",
|
"inviteRemoveErrorDescription": "Възникна грешка при премахване на поканата.",
|
||||||
"inviteRemoved": "Поканата е премахната",
|
"inviteRemoved": "Поканата е премахната",
|
||||||
"inviteRemovedDescription": "Поканата за {имейл} е премахната.",
|
"inviteRemovedDescription": "Поканата за {имейл} е премахната.",
|
||||||
"inviteQuestionRemove": "Сигурни ли сте, че искате да премахнете поканата {email}?",
|
"inviteQuestionRemove": "Сигурни ли сте, че искате да премахнете поканата?",
|
||||||
"inviteMessageRemove": "След като бъде премахната, тази покана няма да е валидна. Винаги можете да поканите потребителя отново по-късно.",
|
"inviteMessageRemove": "След като бъде премахната, тази покана няма да е валидна. Винаги можете да поканите потребителя отново по-късно.",
|
||||||
"inviteMessageConfirm": "За да потвърдите, въведете имейл адреса на поканата по-долу.",
|
"inviteMessageConfirm": "За да потвърдите, въведете имейл адреса на поканата по-долу.",
|
||||||
"inviteQuestionRegenerate": "Сигурни ли сте, че искате да регенерирате поканата за {email}? Това ще отмени предишната покана.",
|
"inviteQuestionRegenerate": "Сигурни ли сте, че искате да регенерирате поканата за {email}? Това ще отмени предишната покана.",
|
||||||
@@ -398,9 +394,8 @@
|
|||||||
"userErrorOrgRemoveDescription": "Възникна грешка при премахване на потребителя.",
|
"userErrorOrgRemoveDescription": "Възникна грешка при премахване на потребителя.",
|
||||||
"userOrgRemoved": "Потребителят е премахнат",
|
"userOrgRemoved": "Потребителят е премахнат",
|
||||||
"userOrgRemovedDescription": "Потребителят {email} беше премахнат от организацията.",
|
"userOrgRemovedDescription": "Потребителят {email} беше премахнат от организацията.",
|
||||||
"userQuestionOrgRemove": "Сигурни ли сте, че искате да премахнете {email} от организацията?",
|
"userQuestionOrgRemove": "Сигурни ли сте, че искате да премахнете този потребител от организацията?",
|
||||||
"userMessageOrgRemove": "След като бъде премахнат, този потребител няма да има достъп до организацията. Винаги можете да го поканите отново по-късно, но той ще трябва да приеме отново поканата.",
|
"userMessageOrgRemove": "След като бъде премахнат, този потребител няма да има достъп до организацията. Винаги можете да го поканите отново по-късно, но той ще трябва да приеме отново поканата.",
|
||||||
"userMessageOrgConfirm": "За да потвърдите, въведете името на потребителя по-долу.",
|
|
||||||
"userRemoveOrgConfirm": "Потвърдете премахването на потребителя",
|
"userRemoveOrgConfirm": "Потвърдете премахването на потребителя",
|
||||||
"userRemoveOrg": "Премахване на потребителя от организацията",
|
"userRemoveOrg": "Премахване на потребителя от организацията",
|
||||||
"users": "Потребители",
|
"users": "Потребители",
|
||||||
@@ -730,7 +725,7 @@
|
|||||||
"pangolinServerAdmin": "Администратор на сървър - Панголин",
|
"pangolinServerAdmin": "Администратор на сървър - Панголин",
|
||||||
"licenseTierProfessional": "Професионален лиценз",
|
"licenseTierProfessional": "Професионален лиценз",
|
||||||
"licenseTierEnterprise": "Предприятие лиценз",
|
"licenseTierEnterprise": "Предприятие лиценз",
|
||||||
"licenseTierPersonal": "Personal License",
|
"licenseTierPersonal": "Персонален лиценз",
|
||||||
"licensed": "Лицензиран",
|
"licensed": "Лицензиран",
|
||||||
"yes": "Да",
|
"yes": "Да",
|
||||||
"no": "Не",
|
"no": "Не",
|
||||||
@@ -742,7 +737,7 @@
|
|||||||
"idpManageDescription": "Прегледайте и управлявайте доставчици на идентичност в системата",
|
"idpManageDescription": "Прегледайте и управлявайте доставчици на идентичност в системата",
|
||||||
"idpDeletedDescription": "Доставчик на идентичност успешно изтрит",
|
"idpDeletedDescription": "Доставчик на идентичност успешно изтрит",
|
||||||
"idpOidc": "OAuth2/OIDC",
|
"idpOidc": "OAuth2/OIDC",
|
||||||
"idpQuestionRemove": "Сигурни ли сте, че искате да изтриете трайно доставчика на идентичност {name}",
|
"idpQuestionRemove": "Сигурни ли сте, че искате да изтриете доставчика за идентичност?",
|
||||||
"idpMessageRemove": "Това ще премахне доставчика на идентичност и всички свързани конфигурации. Потребителите, които се удостоверяват през този доставчик, вече няма да могат да влязат.",
|
"idpMessageRemove": "Това ще премахне доставчика на идентичност и всички свързани конфигурации. Потребителите, които се удостоверяват през този доставчик, вече няма да могат да влязат.",
|
||||||
"idpMessageConfirm": "За потвърждение, моля въведете името на доставчика на идентичност по-долу.",
|
"idpMessageConfirm": "За потвърждение, моля въведете името на доставчика на идентичност по-долу.",
|
||||||
"idpConfirmDelete": "Потвърдите изтриването на доставчик на идентичност",
|
"idpConfirmDelete": "Потвърдите изтриването на доставчик на идентичност",
|
||||||
@@ -765,7 +760,7 @@
|
|||||||
"idpDisplayName": "Име за показване за този доставчик на идентичност",
|
"idpDisplayName": "Име за показване за този доставчик на идентичност",
|
||||||
"idpAutoProvisionUsers": "Автоматично потребителско създаване",
|
"idpAutoProvisionUsers": "Автоматично потребителско създаване",
|
||||||
"idpAutoProvisionUsersDescription": "Когато е активирано, потребителите ще бъдат автоматично създадени в системата при първо влизане с възможност за свързване на потребителите с роли и организации.",
|
"idpAutoProvisionUsersDescription": "Когато е активирано, потребителите ще бъдат автоматично създадени в системата при първо влизане с възможност за свързване на потребителите с роли и организации.",
|
||||||
"licenseBadge": "EE",
|
"licenseBadge": "ЕЕ",
|
||||||
"idpType": "Тип доставчик",
|
"idpType": "Тип доставчик",
|
||||||
"idpTypeDescription": "Изберете типа доставчик на идентичност, който искате да конфигурирате",
|
"idpTypeDescription": "Изберете типа доставчик на идентичност, който искате да конфигурирате",
|
||||||
"idpOidcConfigure": "Конфигурация на OAuth2/OIDC",
|
"idpOidcConfigure": "Конфигурация на OAuth2/OIDC",
|
||||||
@@ -916,6 +911,18 @@
|
|||||||
"passwordResetCodeDescription": "Проверете имейла си за код за нулиране.",
|
"passwordResetCodeDescription": "Проверете имейла си за код за нулиране.",
|
||||||
"passwordNew": "Нова парола",
|
"passwordNew": "Нова парола",
|
||||||
"passwordNewConfirm": "Потвърдете новата парола",
|
"passwordNewConfirm": "Потвърдете новата парола",
|
||||||
|
"changePassword": "Промяна на парола",
|
||||||
|
"changePasswordDescription": "Актуализиране на паролата на акаунта",
|
||||||
|
"oldPassword": "Текуща парола",
|
||||||
|
"newPassword": "Нова парола",
|
||||||
|
"confirmNewPassword": "Потвърдете новата парола",
|
||||||
|
"changePasswordError": "Неуспешна промяна на парола",
|
||||||
|
"changePasswordErrorDescription": "Възникна грешка при промяна на вашата парола",
|
||||||
|
"changePasswordSuccess": "Паролата беше успешно променена",
|
||||||
|
"changePasswordSuccessDescription": "Вашата парола беше успешно актуализирана",
|
||||||
|
"passwordExpiryRequired": "Изисква се изтичане на срока на годност на паролата",
|
||||||
|
"passwordExpiryDescription": "Тази организация изисква да сменяте паролата си на всеки {maxDays} дни.",
|
||||||
|
"changePasswordNow": "Сменете паролата сега",
|
||||||
"pincodeAuth": "Код на удостоверителя",
|
"pincodeAuth": "Код на удостоверителя",
|
||||||
"pincodeSubmit2": "Изпрати код",
|
"pincodeSubmit2": "Изпрати код",
|
||||||
"passwordResetSubmit": "Заявка за нулиране",
|
"passwordResetSubmit": "Заявка за нулиране",
|
||||||
@@ -1154,8 +1161,27 @@
|
|||||||
"sidebarAllUsers": "Всички потребители",
|
"sidebarAllUsers": "Всички потребители",
|
||||||
"sidebarIdentityProviders": "Идентификационни доставчици",
|
"sidebarIdentityProviders": "Идентификационни доставчици",
|
||||||
"sidebarLicense": "Лиценз",
|
"sidebarLicense": "Лиценз",
|
||||||
"sidebarClients": "Clients",
|
"sidebarClients": "Клиенти",
|
||||||
"sidebarDomains": "Домейни",
|
"sidebarDomains": "Домейни",
|
||||||
|
"sidebarBluePrints": "Чертежи",
|
||||||
|
"blueprints": "Чертежи",
|
||||||
|
"blueprintsDescription": "Чертежите са декларативни YAML конфигурации, които определят вашите ресурси и техните настройки",
|
||||||
|
"blueprintAdd": "Добави Чертеж",
|
||||||
|
"blueprintGoBack": "Виж всички Чертежи",
|
||||||
|
"blueprintCreate": "Създай Чертеж",
|
||||||
|
"blueprintCreateDescription2": "Следвайте стъпките по-долу, за да създадете и приложите нов чертеж",
|
||||||
|
"blueprintDetails": "Детайли за Чертежа",
|
||||||
|
"blueprintDetailsDescription": "Вижте детайлите за изпълнението на чертежа",
|
||||||
|
"blueprintInfo": "Информация за Чертежа",
|
||||||
|
"message": "Съобщение",
|
||||||
|
"blueprintContentsDescription": "Дефинирайте YAML съдържанието, описващо вашата инфраструктура",
|
||||||
|
"blueprintErrorCreateDescription": "Възникна грешка при прилагането на чертежа",
|
||||||
|
"blueprintErrorCreate": "Грешка при създаването на чертеж",
|
||||||
|
"searchBlueprintProgress": "Търси чертежи...",
|
||||||
|
"appliedAt": "Приложено във",
|
||||||
|
"source": "Източник",
|
||||||
|
"contents": "Съдържание",
|
||||||
|
"parsedContents": "Анализирано съдържание",
|
||||||
"enableDockerSocket": "Активиране на Docker Чернова",
|
"enableDockerSocket": "Активиране на Docker Чернова",
|
||||||
"enableDockerSocketDescription": "Активиране на Docker Socket маркировка за изтегляне на етикети на чернова. Пътят на гнездото трябва да бъде предоставен на Newt.",
|
"enableDockerSocketDescription": "Активиране на Docker Socket маркировка за изтегляне на етикети на чернова. Пътят на гнездото трябва да бъде предоставен на Newt.",
|
||||||
"enableDockerSocketLink": "Научете повече",
|
"enableDockerSocketLink": "Научете повече",
|
||||||
@@ -1211,9 +1237,8 @@
|
|||||||
"domainCreate": "Създаване на домейн",
|
"domainCreate": "Създаване на домейн",
|
||||||
"domainCreatedDescription": "Домейнът е създаден успешно",
|
"domainCreatedDescription": "Домейнът е създаден успешно",
|
||||||
"domainDeletedDescription": "Домейнът е изтрит успешно",
|
"domainDeletedDescription": "Домейнът е изтрит успешно",
|
||||||
"domainQuestionRemove": "Сигурни ли сте, че искате да премахнете домейна {domain} от вашия профил?",
|
"domainQuestionRemove": "Сигурни ли сте, че искате да премахнете домейна от вашия профил?",
|
||||||
"domainMessageRemove": "След премахването, домейнът вече няма да бъде свързан с вашия профил.",
|
"domainMessageRemove": "След премахването, домейнът вече няма да бъде свързан с вашия профил.",
|
||||||
"domainMessageConfirm": "За потвърждение, моля въведете името на домейна по-долу.",
|
|
||||||
"domainConfirmDelete": "Потвърдете изтриването на домейн",
|
"domainConfirmDelete": "Потвърдете изтриването на домейн",
|
||||||
"domainDelete": "Изтриване на домейн",
|
"domainDelete": "Изтриване на домейн",
|
||||||
"domain": "Домейн",
|
"domain": "Домейн",
|
||||||
@@ -1280,7 +1305,7 @@
|
|||||||
"billingFreeTier": "Безплатен план",
|
"billingFreeTier": "Безплатен план",
|
||||||
"billingWarningOverLimit": "Предупреждение: Превишили сте една или повече лимити за използване. Вашите сайтове няма да се свържат, докато не промените абонамента си или не коригирате използването.",
|
"billingWarningOverLimit": "Предупреждение: Превишили сте една или повече лимити за използване. Вашите сайтове няма да се свържат, докато не промените абонамента си или не коригирате използването.",
|
||||||
"billingUsageLimitsOverview": "Преглед на лимитите за използване",
|
"billingUsageLimitsOverview": "Преглед на лимитите за използване",
|
||||||
"billingMonitorUsage": "Следете използването спрямо конфигурираните лимити. Ако ви е необходимо увеличаване на лимитите, моля, свържете се с нас на support@fossorial.io.",
|
"billingMonitorUsage": "Следете своята употреба спрямо конфигурираните лимити. Ако имате нужда от увеличаване на лимитите, моля свържете се с нас support@pangolin.net.",
|
||||||
"billingDataUsage": "Използване на данни",
|
"billingDataUsage": "Използване на данни",
|
||||||
"billingOnlineTime": "Време на работа на сайта",
|
"billingOnlineTime": "Време на работа на сайта",
|
||||||
"billingUsers": "Активни потребители",
|
"billingUsers": "Активни потребители",
|
||||||
@@ -1346,6 +1371,19 @@
|
|||||||
"securityKeyUnknownError": "Възникна проблем при използването на ключа за сигурност. Моля, опитайте отново.",
|
"securityKeyUnknownError": "Възникна проблем при използването на ключа за сигурност. Моля, опитайте отново.",
|
||||||
"twoFactorRequired": "Двуфакторното удостоверяване е необходимо за регистрация на ключ за защита.",
|
"twoFactorRequired": "Двуфакторното удостоверяване е необходимо за регистрация на ключ за защита.",
|
||||||
"twoFactor": "Двуфакторно удостоверяване",
|
"twoFactor": "Двуфакторно удостоверяване",
|
||||||
|
"twoFactorAuthentication": "Двуфакторно удостоверяване",
|
||||||
|
"twoFactorDescription": "Тази организация изисква двуфакторно удостоверяване.",
|
||||||
|
"enableTwoFactor": "Активиране на двуфакторно удостоверяване",
|
||||||
|
"organizationSecurityPolicy": "Политика за сигурност на организацията",
|
||||||
|
"organizationSecurityPolicyDescription": "Тази организация има изисквания за сигурност, които трябва да бъдат изпълнени, за да имате достъп до нея.",
|
||||||
|
"securityRequirements": "Изисквания за сигурност",
|
||||||
|
"allRequirementsMet": "Всички изисквания са изпълнени",
|
||||||
|
"completeRequirementsToContinue": "Завършете изискванията по-долу, за да продължите достъпа до тази организация",
|
||||||
|
"youCanNowAccessOrganization": "Вече можете да получите достъп до тази организация",
|
||||||
|
"reauthenticationRequired": "Продължителност на сесията",
|
||||||
|
"reauthenticationDescription": "Тази организация изисква да влизате на всеки {maxDays} дни.",
|
||||||
|
"reauthenticationDescriptionHours": "Тази организация изисква да влизате на всеки {maxHours} часа.",
|
||||||
|
"reauthenticateNow": "Влезте отново",
|
||||||
"adminEnabled2FaOnYourAccount": "Вашият администратор е активирал двуфакторно удостоверяване за {email}. Моля, завършете процеса по настройка, за да продължите.",
|
"adminEnabled2FaOnYourAccount": "Вашият администратор е активирал двуфакторно удостоверяване за {email}. Моля, завършете процеса по настройка, за да продължите.",
|
||||||
"securityKeyAdd": "Добавяне на ключ за сигурност",
|
"securityKeyAdd": "Добавяне на ключ за сигурност",
|
||||||
"securityKeyRegisterTitle": "Регистриране на нов ключ за сигурност",
|
"securityKeyRegisterTitle": "Регистриране на нов ключ за сигурност",
|
||||||
@@ -1558,14 +1596,13 @@
|
|||||||
"autoLoginErrorNoRedirectUrl": "Не е получен URL за пренасочване от доставчика на идентификационни данни.",
|
"autoLoginErrorNoRedirectUrl": "Не е получен URL за пренасочване от доставчика на идентификационни данни.",
|
||||||
"autoLoginErrorGeneratingUrl": "Неуспешно генериране на URL за удостоверяване.",
|
"autoLoginErrorGeneratingUrl": "Неуспешно генериране на URL за удостоверяване.",
|
||||||
"remoteExitNodeManageRemoteExitNodes": "Отдалечени възли",
|
"remoteExitNodeManageRemoteExitNodes": "Отдалечени възли",
|
||||||
"remoteExitNodeDescription": "Self-host one or more remote nodes to extend your network connectivity and reduce reliance on the cloud",
|
"remoteExitNodeDescription": "Самостоятелно хоствайте един или повече отдалечени възли, за да разширите своята мрежова връзка и намалите зависимостта от облака.",
|
||||||
"remoteExitNodes": "Възли",
|
"remoteExitNodes": "Възли",
|
||||||
"searchRemoteExitNodes": "Търсене на възли...",
|
"searchRemoteExitNodes": "Търсене на възли...",
|
||||||
"remoteExitNodeAdd": "Добавяне на възел",
|
"remoteExitNodeAdd": "Добавяне на възел",
|
||||||
"remoteExitNodeErrorDelete": "Грешка при изтриване на възел",
|
"remoteExitNodeErrorDelete": "Грешка при изтриване на възел",
|
||||||
"remoteExitNodeQuestionRemove": "Сигурни ли сте, че искате да премахнете възела {selectedNode} от организацията?",
|
"remoteExitNodeQuestionRemove": "Сигурни ли сте, че искате да премахнете възела от организацията?",
|
||||||
"remoteExitNodeMessageRemove": "След премахване, възелът вече няма да бъде достъпен.",
|
"remoteExitNodeMessageRemove": "След премахване, възелът вече няма да бъде достъпен.",
|
||||||
"remoteExitNodeMessageConfirm": "За потвърждение, моля въведете името на възела по-долу.",
|
|
||||||
"remoteExitNodeConfirmDelete": "Потвърдете изтриването на възела (\"Confirm Delete Site\" match)",
|
"remoteExitNodeConfirmDelete": "Потвърдете изтриването на възела (\"Confirm Delete Site\" match)",
|
||||||
"remoteExitNodeDelete": "Изтрийте възела (\"Delete Site\" match)",
|
"remoteExitNodeDelete": "Изтрийте възела (\"Delete Site\" match)",
|
||||||
"sidebarRemoteExitNodes": "Отдалечени възли",
|
"sidebarRemoteExitNodes": "Отдалечени възли",
|
||||||
@@ -1733,7 +1770,49 @@
|
|||||||
"resourceExposePortsEditFile": "Редактиране на файл: docker-compose.yml",
|
"resourceExposePortsEditFile": "Редактиране на файл: docker-compose.yml",
|
||||||
"emailVerificationRequired": "Потвърждението на Email е необходимо. Моля, влезте отново чрез {dashboardUrl}/auth/login, за да завършите тази стъпка. След това, върнете се тук.",
|
"emailVerificationRequired": "Потвърждението на Email е необходимо. Моля, влезте отново чрез {dashboardUrl}/auth/login, за да завършите тази стъпка. След това, върнете се тук.",
|
||||||
"twoFactorSetupRequired": "Необходима е настройка на двуфакторно удостоверяване. Моля, влезте отново чрез {dashboardUrl}/auth/login, за да завършите тази стъпка. След това, върнете се тук.",
|
"twoFactorSetupRequired": "Необходима е настройка на двуфакторно удостоверяване. Моля, влезте отново чрез {dashboardUrl}/auth/login, за да завършите тази стъпка. След това, върнете се тук.",
|
||||||
|
"additionalSecurityRequired": "Необходима е допълнителна сигурност",
|
||||||
|
"organizationRequiresAdditionalSteps": "Тази организация изисква допълнителни стъпки за сигурност, за да получите достъп до ресурсите.",
|
||||||
|
"completeTheseSteps": "Завършете тези стъпки",
|
||||||
|
"enableTwoFactorAuthentication": "Активирайте двуфакторното удостоверяване",
|
||||||
|
"completeSecuritySteps": "Завършете стъпките за сигурност",
|
||||||
|
"securitySettings": "Настройки за сигурност",
|
||||||
|
"securitySettingsDescription": "Конфигурирайте политиките за сигурност на вашата организация",
|
||||||
|
"requireTwoFactorForAllUsers": "Изисквайте двуфакторно удостоверяване за всички потребители",
|
||||||
|
"requireTwoFactorDescription": "Когато е активирано, всички вътрешни потребители в организацията трябва да имат активирано двуфакторно удостоверяване, за да имат достъп до организацията.",
|
||||||
|
"requireTwoFactorDisabledDescription": "Тази функция изисква валиден лиценз (Enterprise) или активен абонамент (SaaS).",
|
||||||
|
"requireTwoFactorCannotEnableDescription": "Трябва да активирате двуфакторното удостоверяване за вашия акаунт, преди да го наложите за всички потребители.",
|
||||||
|
"maxSessionLength": "Максимална продължителност на сесията",
|
||||||
|
"maxSessionLengthDescription": "Задайте максималната продължителност на потребителските сесии. След това време потребителите ще трябва да се удостоверят отново.",
|
||||||
|
"maxSessionLengthDisabledDescription": "Тази функция изисква валиден лиценз (Enterprise) или активен абонамент (SaaS).",
|
||||||
|
"selectSessionLength": "Изберете продължителност на сесията",
|
||||||
|
"unenforced": "Неналожено",
|
||||||
|
"1Hour": "1 час",
|
||||||
|
"3Hours": "3 часа",
|
||||||
|
"6Hours": "6 часа",
|
||||||
|
"12Hours": "12 часа",
|
||||||
|
"1DaySession": "1 ден",
|
||||||
|
"3Days": "3 дни",
|
||||||
|
"7Days": "7 дни",
|
||||||
|
"14Days": "14 дни",
|
||||||
|
"30DaysSession": "30 дни",
|
||||||
|
"90DaysSession": "90 дни",
|
||||||
|
"180DaysSession": "180 дни",
|
||||||
|
"passwordExpiryDays": "Изтичане на парола",
|
||||||
|
"editPasswordExpiryDescription": "Задайте броя дни, след които потребителите трябва да сменят паролата си.",
|
||||||
|
"selectPasswordExpiry": "Изберете изтичането на парола",
|
||||||
|
"30Days": "30 дни",
|
||||||
|
"1Day": "1 ден",
|
||||||
|
"60Days": "60 дни",
|
||||||
|
"90Days": "90 дни",
|
||||||
|
"180Days": "180 дни",
|
||||||
|
"1Year": "1 година",
|
||||||
|
"subscriptionBadge": "Изисква се абонамент",
|
||||||
|
"securityPolicyChangeWarning": "Предупреждение за промяна на политиката за сигурност",
|
||||||
|
"securityPolicyChangeDescription": "Ще променяте настройките на политиката за сигурност. След запазване може да се наложи да се удостоверите отново, за да се съобразите с тези актуализации. Всички потребители, които не са съвместими, също ще трябва да се удостоверят отново.",
|
||||||
|
"securityPolicyChangeConfirmMessage": "Потвърждавам",
|
||||||
|
"securityPolicyChangeWarningText": "Това ще засегне всички потребители в организацията",
|
||||||
"authPageErrorUpdateMessage": "Възникна грешка при актуализирането на настройките на страницата за удостоверяване",
|
"authPageErrorUpdateMessage": "Възникна грешка при актуализирането на настройките на страницата за удостоверяване",
|
||||||
|
"authPageErrorUpdate": "Неуспешно актуализиране на страницата за удостоверяване",
|
||||||
"authPageUpdated": "Страницата за удостоверяване е актуализирана успешно",
|
"authPageUpdated": "Страницата за удостоверяване е актуализирана успешно",
|
||||||
"healthCheckNotAvailable": "Локална",
|
"healthCheckNotAvailable": "Локална",
|
||||||
"rewritePath": "Пренапиши път",
|
"rewritePath": "Пренапиши път",
|
||||||
@@ -1745,153 +1824,261 @@
|
|||||||
"resourceHeaderAuthRemoveDescription": "Автентикацията в заглавката беше премахната успешно.",
|
"resourceHeaderAuthRemoveDescription": "Автентикацията в заглавката беше премахната успешно.",
|
||||||
"resourceErrorHeaderAuthRemove": "Неуспешно премахване на автентикация в заглавката",
|
"resourceErrorHeaderAuthRemove": "Неуспешно премахване на автентикация в заглавката",
|
||||||
"resourceErrorHeaderAuthRemoveDescription": "Не беше възможно премахването на автентикацията в заглавката за ресурса.",
|
"resourceErrorHeaderAuthRemoveDescription": "Не беше възможно премахването на автентикацията в заглавката за ресурса.",
|
||||||
"resourceHeaderAuthProtectionEnabled": "Header Authentication Enabled",
|
"resourceHeaderAuthProtectionEnabled": "Активирано удостоверяване чрез заглавие",
|
||||||
"resourceHeaderAuthProtectionDisabled": "Header Authentication Disabled",
|
"resourceHeaderAuthProtectionDisabled": "Деактивирано удостоверяване чрез заглавие",
|
||||||
"headerAuthRemove": "Remove Header Auth",
|
"headerAuthRemove": "Премахни удостоверяване чрез заглавие",
|
||||||
"headerAuthAdd": "Add Header Auth",
|
"headerAuthAdd": "Добави удостоверяване чрез заглавие",
|
||||||
"resourceErrorHeaderAuthSetup": "Неуспешно задаване на автентикация в заглавката",
|
"resourceErrorHeaderAuthSetup": "Неуспешно задаване на автентикация в заглавката",
|
||||||
"resourceErrorHeaderAuthSetupDescription": "Не беше възможно задаването на автентикация в заглавката за ресурса.",
|
"resourceErrorHeaderAuthSetupDescription": "Не беше възможно задаването на автентикация в заглавката за ресурса.",
|
||||||
"resourceHeaderAuthSetup": "Автентикацията в заглавката беше зададена успешно",
|
"resourceHeaderAuthSetup": "Автентикацията в заглавката беше зададена успешно",
|
||||||
"resourceHeaderAuthSetupDescription": "Автентикацията в заглавката беше успешно зададена.",
|
"resourceHeaderAuthSetupDescription": "Автентикацията в заглавката беше успешно зададена.",
|
||||||
"resourceHeaderAuthSetupTitle": "Задаване на автентикация в заглавката",
|
"resourceHeaderAuthSetupTitle": "Задаване на автентикация в заглавката",
|
||||||
"resourceHeaderAuthSetupTitleDescription": "Set the basic auth credentials (username and password) to protect this resource with HTTP Header Authentication. Access it using the format https://username:password@resource.example.com",
|
"resourceHeaderAuthSetupTitleDescription": "Задайте базови идентификационни данни (потребителско име и парола), за да защитите този ресурс чрез HTTP удостоверяване чрез заглавие. Достъпете до него, използвайки формата https://потребител:парола@ресурс.example.com",
|
||||||
"resourceHeaderAuthSubmit": "Задаване на автентикация в заглавката",
|
"resourceHeaderAuthSubmit": "Задаване на автентикация в заглавката",
|
||||||
"actionSetResourceHeaderAuth": "Задаване на автентикация в заглавката",
|
"actionSetResourceHeaderAuth": "Задаване на автентикация в заглавката",
|
||||||
"enterpriseEdition": "Enterprise Edition",
|
"enterpriseEdition": "Корпоративно издание",
|
||||||
"unlicensed": "Unlicensed",
|
"unlicensed": "Без лиценз",
|
||||||
"beta": "Beta",
|
"beta": "Бета",
|
||||||
"manageClients": "Manage Clients",
|
"manageClients": "Управление на клиенти",
|
||||||
"manageClientsDescription": "Clients are devices that can connect to your sites",
|
"manageClientsDescription": "Клиентите са устройства, които могат да се свързват към вашите сайтове",
|
||||||
"licenseTableValidUntil": "Valid Until",
|
"licenseTableValidUntil": "Валиден до",
|
||||||
"saasLicenseKeysSettingsTitle": "Enterprise Licenses",
|
"saasLicenseKeysSettingsTitle": "Корпоративни лицензи",
|
||||||
"saasLicenseKeysSettingsDescription": "Generate and manage Enterprise license keys for self-hosted Pangolin instances",
|
"saasLicenseKeysSettingsDescription": "Генериране и управление на корпоративни лицензионни ключове за самостоятелно хоствани инстанции на Pangolin",
|
||||||
"sidebarEnterpriseLicenses": "Licenses",
|
"sidebarEnterpriseLicenses": "Лицензи",
|
||||||
"generateLicenseKey": "Generate License Key",
|
"generateLicenseKey": "Генерация на лицензионен ключ",
|
||||||
"generateLicenseKeyForm": {
|
"generateLicenseKeyForm": {
|
||||||
"validation": {
|
"validation": {
|
||||||
"emailRequired": "Please enter a valid email address",
|
"emailRequired": "Моля въведете валиден имейл адрес",
|
||||||
"useCaseTypeRequired": "Please select a use case type",
|
"useCaseTypeRequired": "Моля изберете тип на употреба",
|
||||||
"firstNameRequired": "First name is required",
|
"firstNameRequired": "Името е задължително",
|
||||||
"lastNameRequired": "Last name is required",
|
"lastNameRequired": "Фамилията е задължителна",
|
||||||
"primaryUseRequired": "Please describe your primary use",
|
"primaryUseRequired": "Моля опишете основната си употреба",
|
||||||
"jobTitleRequiredBusiness": "Job title is required for business use",
|
"jobTitleRequiredBusiness": "Позицията е задължителна за бизнес изполване",
|
||||||
"industryRequiredBusiness": "Industry is required for business use",
|
"industryRequiredBusiness": "Индустрията е задължителна за бизнес изполване",
|
||||||
"stateProvinceRegionRequired": "State/Province/Region is required",
|
"stateProvinceRegionRequired": "Държава/Област/Регион е задължително",
|
||||||
"postalZipCodeRequired": "Postal/ZIP Code is required",
|
"postalZipCodeRequired": "Пощенски/ЗИП Код е задължителен",
|
||||||
"companyNameRequiredBusiness": "Company name is required for business use",
|
"companyNameRequiredBusiness": "Фирменото име е задължително за бизнес изполване",
|
||||||
"countryOfResidenceRequiredBusiness": "Country of residence is required for business use",
|
"countryOfResidenceRequiredBusiness": "Държавата на пребиваване е задължителна за бизнес изполване",
|
||||||
"countryRequiredPersonal": "Country is required for personal use",
|
"countryRequiredPersonal": "Държавата е задължителна за лична употреба",
|
||||||
"agreeToTermsRequired": "You must agree to the terms",
|
"agreeToTermsRequired": "Трябва да се съгласите с условията",
|
||||||
"complianceConfirmationRequired": "You must confirm compliance with the Fossorial Commercial License"
|
"complianceConfirmationRequired": "Трябва да потвърдите съответствието с Fossorial Commercial License"
|
||||||
},
|
},
|
||||||
"useCaseOptions": {
|
"useCaseOptions": {
|
||||||
"personal": {
|
"personal": {
|
||||||
"title": "Personal Use",
|
"title": "Лична употреба",
|
||||||
"description": "For individual, non-commercial use such as learning, personal projects, or experimentation."
|
"description": "За индивидуална, некомерсиална употреба като учене, лични проекти или експериментиране."
|
||||||
},
|
},
|
||||||
"business": {
|
"business": {
|
||||||
"title": "Business Use",
|
"title": "Бизнес употреба",
|
||||||
"description": "For use within organizations, companies, or commercial or revenue-generating activities."
|
"description": "За вътрешно използване във фирми, компании или комерсиални или доходоносни дейности."
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"steps": {
|
"steps": {
|
||||||
"emailLicenseType": {
|
"emailLicenseType": {
|
||||||
"title": "Email & License Type",
|
"title": "Имейл и тип лиценз",
|
||||||
"description": "Enter your email and choose your license type"
|
"description": "Въведете своя имейл и изберете вид на лиценза"
|
||||||
},
|
},
|
||||||
"personalInformation": {
|
"personalInformation": {
|
||||||
"title": "Personal Information",
|
"title": "Лична информация",
|
||||||
"description": "Tell us about yourself"
|
"description": "Разкажете ни за себе си"
|
||||||
},
|
},
|
||||||
"contactInformation": {
|
"contactInformation": {
|
||||||
"title": "Contact Information",
|
"title": "Контактна информация",
|
||||||
"description": "Your contact details"
|
"description": "Вашите контактни данни"
|
||||||
},
|
},
|
||||||
"termsGenerate": {
|
"termsGenerate": {
|
||||||
"title": "Terms & Generate",
|
"title": "Условия и генериране",
|
||||||
"description": "Review and accept terms to generate your license"
|
"description": "Прегледайте и приемете условията, за да генерирате своя лиценз"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"alerts": {
|
"alerts": {
|
||||||
"commercialUseDisclosure": {
|
"commercialUseDisclosure": {
|
||||||
"title": "Usage Disclosure",
|
"title": "Разкриване на употреба",
|
||||||
"description": "Select the license tier that accurately reflects your intended use. The Personal License permits free use of the Software for individual, non-commercial or small-scale commercial activities with annual gross revenue under $100,000 USD. Any use beyond these limits — including use within a business, organization, or other revenue-generating environment — requires a valid Enterprise License and payment of the applicable licensing fee. All users, whether Personal or Enterprise, must comply with the Fossorial Commercial License Terms."
|
"description": "Изберете лицензионен клас, който точно отразява вашата целена употреба. Персоналният лиценз позволява безплатно ползване на софтуера за индивидуална, некомерсиална или маломащабна комерсиална дейност с годишен брутен приход под 100,000 USD. Всяко ползване извън тези граници — включително ползване във фирма, организация или друга доходоносна среда — изисква валиден корпоративен лиценз и плащане на съответната лицензионна такса. Всички потребители, независимо дали са лични или корпоративни, трябва да спазват Условията на Fossorial Commercial License."
|
||||||
},
|
},
|
||||||
"trialPeriodInformation": {
|
"trialPeriodInformation": {
|
||||||
"title": "Trial Period Information",
|
"title": "Информация за пробен период",
|
||||||
"description": "This License Key enables Enterprise features for a 7-day evaluation period. Continued access to Paid Features beyond the evaluation period requires activation under a valid Personal or Enterprise License. For Enterprise licensing, contact sales@fossorial.io."
|
"description": "Този лицензионен ключ предоставя функции на Enterprise за 7-дневен пробен период. За продължен достъп до платени функции след изтичането на пробния период е необходима активация под валиден персонален или корпоративен лиценз. За корпоративно лицензиране се свържете с sales@pangolin.net."
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"form": {
|
"form": {
|
||||||
"useCaseQuestion": "Are you using Pangolin for personal or business use?",
|
"useCaseQuestion": "Използвате ли Pangolin за лична или бизнес употреба?",
|
||||||
"firstName": "First Name",
|
"firstName": "Име",
|
||||||
"lastName": "Last Name",
|
"lastName": "Фамилия",
|
||||||
"jobTitle": "Job Title",
|
"jobTitle": "Позиция",
|
||||||
"primaryUseQuestion": "What do you primarily plan to use Pangolin for?",
|
"primaryUseQuestion": "Каква е основната ви цел да използвате Pangolin?",
|
||||||
"industryQuestion": "What is your industry?",
|
"industryQuestion": "Какъв е вашият отрасъл?",
|
||||||
"prospectiveUsersQuestion": "How many prospective users do you expect to have?",
|
"prospectiveUsersQuestion": "Колко потенциални потребители очаквате да имате?",
|
||||||
"prospectiveSitesQuestion": "How many prospective sites (tunnels) do you expect to have?",
|
"prospectiveSitesQuestion": "Колко потенциални сайтове (тунели) очаквате да имате?",
|
||||||
"companyName": "Company name",
|
"companyName": "Фирмено име",
|
||||||
"countryOfResidence": "Country of residence",
|
"countryOfResidence": "Държава на пребиваване",
|
||||||
"stateProvinceRegion": "State / Province / Region",
|
"stateProvinceRegion": "Държава / Област / Регион",
|
||||||
"postalZipCode": "Postal / ZIP Code",
|
"postalZipCode": "Пощенски / ЗИП код",
|
||||||
"companyWebsite": "Company website",
|
"companyWebsite": "Фирмен уебсайт",
|
||||||
"companyPhoneNumber": "Company phone number",
|
"companyPhoneNumber": "Фирмен телефонен номер",
|
||||||
"country": "Country",
|
"country": "Държава",
|
||||||
"phoneNumberOptional": "Phone number (optional)",
|
"phoneNumberOptional": "Телефонен номер (по избор)",
|
||||||
"complianceConfirmation": "I confirm that I am in compliance with the Fossorial Commercial License and that reporting inaccurate information or misidentifying use of the product is a violation of the license."
|
"complianceConfirmation": "Потвърждавам, че предоставената от мен информация е точна и че съм в съответствие с търговския лиценз Fossorial. Съобщаването на неточна информация или неправилното идентифициране на използването на продукта е нарушение на лиценза и може да доведе до анулиране на вашия ключ."
|
||||||
},
|
},
|
||||||
"buttons": {
|
"buttons": {
|
||||||
"close": "Close",
|
"close": "Затвори",
|
||||||
"previous": "Previous",
|
"previous": "Предишен",
|
||||||
"next": "Next",
|
"next": "Следващ",
|
||||||
"generateLicenseKey": "Generate License Key"
|
"generateLicenseKey": "Генериране на лицензионен ключ"
|
||||||
},
|
},
|
||||||
"toasts": {
|
"toasts": {
|
||||||
"success": {
|
"success": {
|
||||||
"title": "License key generated successfully",
|
"title": "Лицензионният ключ е успешно генериран",
|
||||||
"description": "Your license key has been generated and is ready to use."
|
"description": "Вашият лицензионен ключ е генериран и готов за употреба."
|
||||||
},
|
},
|
||||||
"error": {
|
"error": {
|
||||||
"title": "Failed to generate license key",
|
"title": "Грешка при генериране на лицензионен ключ",
|
||||||
"description": "An error occurred while generating the license key."
|
"description": "Възникна грешка при генериране на лицензионния ключ."
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"priority": "Приоритет",
|
"priority": "Приоритет",
|
||||||
"priorityDescription": "По-високите приоритетни маршрути се оценяват първи. Приоритет = 100 означава автоматично подреждане (системата решава). Използвайте друго число, за да наложите ръчен приоритет.",
|
"priorityDescription": "По-високите приоритетни маршрути се оценяват първи. Приоритет = 100 означава автоматично подреждане (системата решава). Използвайте друго число, за да наложите ръчен приоритет.",
|
||||||
"instanceName": "Instance Name",
|
"instanceName": "Име на инстанция",
|
||||||
"pathMatchModalTitle": "Configure Path Matching",
|
"pathMatchModalTitle": "Конфигурация на съвпадение по пътека",
|
||||||
"pathMatchModalDescription": "Set up how incoming requests should be matched based on their path.",
|
"pathMatchModalDescription": "Настройте как трябва да бъдат съвпадани входящите заявки въз основа на техния път.",
|
||||||
"pathMatchType": "Match Type",
|
"pathMatchType": "Вид на съвпадението",
|
||||||
"pathMatchPrefix": "Prefix",
|
"pathMatchPrefix": "Префикс",
|
||||||
"pathMatchExact": "Exact",
|
"pathMatchExact": "Точно",
|
||||||
"pathMatchRegex": "Regex",
|
"pathMatchRegex": "Регекс",
|
||||||
"pathMatchValue": "Path Value",
|
"pathMatchValue": "Стойност на пътя",
|
||||||
"clear": "Clear",
|
"clear": "Изчисти",
|
||||||
"saveChanges": "Save Changes",
|
"saveChanges": "Запиши промените",
|
||||||
"pathMatchRegexPlaceholder": "^/api/.*",
|
"pathMatchRegexPlaceholder": "^/api/.*",
|
||||||
"pathMatchDefaultPlaceholder": "/path",
|
"pathMatchDefaultPlaceholder": "/път",
|
||||||
"pathMatchPrefixHelp": "Example: /api matches /api, /api/users, etc.",
|
"pathMatchPrefixHelp": "Пример: /api съвпада /api, /api/потребители и т.н.",
|
||||||
"pathMatchExactHelp": "Example: /api matches only /api",
|
"pathMatchExactHelp": "Пример: /api съвпада само с /api",
|
||||||
"pathMatchRegexHelp": "Example: ^/api/.* matches /api/anything",
|
"pathMatchRegexHelp": "Пример: ^/api/.* съвпада с /api/всичко",
|
||||||
"pathRewriteModalTitle": "Configure Path Rewriting",
|
"pathRewriteModalTitle": "Конфигурация на пренаписване на пътя",
|
||||||
"pathRewriteModalDescription": "Transform the matched path before forwarding to the target.",
|
"pathRewriteModalDescription": "Преобразуване на съвпаднатия път преди препращане към целта.",
|
||||||
"pathRewriteType": "Rewrite Type",
|
"pathRewriteType": "Вид на пренаписването",
|
||||||
"pathRewritePrefixOption": "Prefix - Replace prefix",
|
"pathRewritePrefixOption": "Префикс - Подмяна на префикса",
|
||||||
"pathRewriteExactOption": "Exact - Replace entire path",
|
"pathRewriteExactOption": "Точно - Замяна на целия път",
|
||||||
"pathRewriteRegexOption": "Regex - Pattern replacement",
|
"pathRewriteRegexOption": "Регекс - Смяна на модела",
|
||||||
"pathRewriteStripPrefixOption": "Strip Prefix - Remove prefix",
|
"pathRewriteStripPrefixOption": "Премахване на префикса",
|
||||||
"pathRewriteValue": "Rewrite Value",
|
"pathRewriteValue": "Стойност на пренаписването",
|
||||||
"pathRewriteRegexPlaceholder": "/new/$1",
|
"pathRewriteRegexPlaceholder": "/нов/$1",
|
||||||
"pathRewriteDefaultPlaceholder": "/new-path",
|
"pathRewriteDefaultPlaceholder": "/нов-пътека",
|
||||||
"pathRewritePrefixHelp": "Replace the matched prefix with this value",
|
"pathRewritePrefixHelp": "Заменете съвпаднатия префикс с тази стойност",
|
||||||
"pathRewriteExactHelp": "Replace the entire path with this value when the path matches exactly",
|
"pathRewriteExactHelp": "Заменете целия път с тази стойност, когато пътят съвпада точно",
|
||||||
"pathRewriteRegexHelp": "Use capture groups like $1, $2 for replacement",
|
"pathRewriteRegexHelp": "Използвайте групи за улавяне като $1, $2 за заместване",
|
||||||
"pathRewriteStripPrefixHelp": "Leave empty to strip prefix or provide new prefix",
|
"pathRewriteStripPrefixHelp": "Оставете празно, за да премахнете префикса или предоставете нов префикс",
|
||||||
"pathRewritePrefix": "Prefix",
|
"pathRewritePrefix": "Префикс",
|
||||||
"pathRewriteExact": "Exact",
|
"pathRewriteExact": "Точно",
|
||||||
"pathRewriteRegex": "Regex",
|
"pathRewriteRegex": "Регекс",
|
||||||
"pathRewriteStrip": "Strip",
|
"pathRewriteStrip": "Премахване",
|
||||||
"pathRewriteStripLabel": "strip"
|
"pathRewriteStripLabel": "премахване",
|
||||||
|
"sidebarEnableEnterpriseLicense": "Активиране на корпоративен лиценз",
|
||||||
|
"cannotbeUndone": "Това не може да се отмени.",
|
||||||
|
"toConfirm": "за потвърждение",
|
||||||
|
"deleteClientQuestion": "Сигурни ли сте, че искате да премахнете клиента от сайта и организацията?",
|
||||||
|
"clientMessageRemove": "След като клиентът бъде премахнат, той вече няма да може да се свързва с сайта.",
|
||||||
|
"sidebarLogs": "Логове",
|
||||||
|
"request": "Изискване",
|
||||||
|
"logs": "Логове",
|
||||||
|
"logsSettingsDescription": "Следете логовете, събрани от тази организация",
|
||||||
|
"searchLogs": "Търсете в логовете...",
|
||||||
|
"action": "Действие",
|
||||||
|
"actor": "Извършващ",
|
||||||
|
"timestamp": "Отбелязано време",
|
||||||
|
"accessLogs": "Достъп до логове",
|
||||||
|
"exportCsv": "Експортиране в CSV",
|
||||||
|
"actorId": "ID на извършващия",
|
||||||
|
"allowedByRule": "Разрешено от правило",
|
||||||
|
"allowedNoAuth": "Разрешено без удостоверение",
|
||||||
|
"validAccessToken": "Валиден токен за достъп",
|
||||||
|
"validHeaderAuth": "Валиден заглавен авто",
|
||||||
|
"validPincode": "Валиден ПИН код",
|
||||||
|
"validPassword": "Валидна парола",
|
||||||
|
"validEmail": "Валиден имейл",
|
||||||
|
"validSSO": "Валидно SSO",
|
||||||
|
"resourceBlocked": "Блокирани ресурси",
|
||||||
|
"droppedByRule": "Прекратено от правило",
|
||||||
|
"noSessions": "Няма сесии",
|
||||||
|
"temporaryRequestToken": "Временен токен на заявка",
|
||||||
|
"noMoreAuthMethods": "Няма валидни методи за удостоверение",
|
||||||
|
"ip": "IP",
|
||||||
|
"reason": "Причина",
|
||||||
|
"requestLogs": "Заявка за логове",
|
||||||
|
"host": "Хост",
|
||||||
|
"location": "Местоположение",
|
||||||
|
"actionLogs": "Дневници на действията",
|
||||||
|
"sidebarLogsRequest": "Заявка за логове",
|
||||||
|
"sidebarLogsAccess": "Достъп до логове",
|
||||||
|
"sidebarLogsAction": "Дневници на действията",
|
||||||
|
"logRetention": "Задържане на логове",
|
||||||
|
"logRetentionDescription": "Управлявайте времето за задържане на различни видове логове за тази организация или ги деактивирайте",
|
||||||
|
"requestLogsDescription": "Прегледайте подробни логове на заявки за ресурси в тази организация",
|
||||||
|
"logRetentionRequestLabel": "Задържане на логове на заявки",
|
||||||
|
"logRetentionRequestDescription": "Колко дълго да се задържат логовете на заявките",
|
||||||
|
"logRetentionAccessLabel": "Задържане на логове за достъп",
|
||||||
|
"logRetentionAccessDescription": "Колко дълго да се задържат логовете за достъп",
|
||||||
|
"logRetentionActionLabel": "Задържане на логове за действия",
|
||||||
|
"logRetentionActionDescription": "Колко дълго да се задържат логовете за действия",
|
||||||
|
"logRetentionDisabled": "Деактивирано",
|
||||||
|
"logRetention3Days": "3 дни",
|
||||||
|
"logRetention7Days": "7 дни",
|
||||||
|
"logRetention14Days": "14 дни",
|
||||||
|
"logRetention30Days": "30 дни",
|
||||||
|
"logRetention90Days": "90 дни",
|
||||||
|
"logRetentionForever": "Завинаги",
|
||||||
|
"actionLogsDescription": "Прегледайте историята на действията, извършени в тази организация",
|
||||||
|
"accessLogsDescription": "Прегледайте заявките за удостоверяване на достъпа до ресурсите в тази организация",
|
||||||
|
"licenseRequiredToUse": "Необходим е лиценз Enterprise, за да се използва тази функция.",
|
||||||
|
"certResolver": "Решавач на сертификати",
|
||||||
|
"certResolverDescription": "Изберете решавач на сертификати за използване за този ресурс.",
|
||||||
|
"selectCertResolver": "Изберете решавач на сертификати",
|
||||||
|
"enterCustomResolver": "Въведете персонализиран решавач",
|
||||||
|
"preferWildcardCert": "Предпочитайте универсален сертификат",
|
||||||
|
"unverified": "Невалидиран",
|
||||||
|
"domainSetting": "Настройки на домейните",
|
||||||
|
"domainSettingDescription": "Конфигурирайте настройките за вашия домейн",
|
||||||
|
"preferWildcardCertDescription": "Опит за генериране на универсален сертификат (изисква правилно конфигуриран решавач на сертификати).",
|
||||||
|
"recordName": "Име на запис",
|
||||||
|
"auto": "Автоматично",
|
||||||
|
"TTL": "TTL",
|
||||||
|
"howToAddRecords": "Как да добавите записи",
|
||||||
|
"dnsRecord": "DNS записи",
|
||||||
|
"required": "Задължително",
|
||||||
|
"domainSettingsUpdated": "Настройките на домейна са успешно актуализирани",
|
||||||
|
"orgOrDomainIdMissing": "Липсва идентификатор на организация или домейн",
|
||||||
|
"loadingDNSRecords": "Зареждане на DNS записи...",
|
||||||
|
"olmUpdateAvailableInfo": "Налична е актуализирана версия на Olm. Моля, актуализирайте до най-новата версия за най-добро преживяване.",
|
||||||
|
"client": "Клиент",
|
||||||
|
"proxyProtocol": "Настройки на прокси протокол",
|
||||||
|
"proxyProtocolDescription": "Конфигурирайте прокси протокол за запазване на IP адресите на клиентите за TCP/UDP услуги.",
|
||||||
|
"enableProxyProtocol": "Активирайте прокси протокола",
|
||||||
|
"proxyProtocolInfo": "Запазете IP адресите на клиентите за TCP/UDP бекенди",
|
||||||
|
"proxyProtocolVersion": "Версия на прокси протокола",
|
||||||
|
"version1": "Версия 1 (Препоръчително)",
|
||||||
|
"version2": "Версия 2",
|
||||||
|
"versionDescription": "Версия 1 е текстово-базирана и широко поддържана. Версия 2 е бърна и по-ефективна, но по-малко съвместима.",
|
||||||
|
"warning": "Предупреждение",
|
||||||
|
"proxyProtocolWarning": "Вашето бекенд приложение трябва да бъде конфигурирано да приема прокси протоколни връзки. Ако вашият бекенд не поддържа прокси протокол, активирането му ще прекъсне всички връзки. Уверете се, че сте конфигурирали вашия бекенд да се доверява на заглавията на прокси протокола от Traefik.",
|
||||||
|
"restarting": "Рестартиране...",
|
||||||
|
"manual": "Ръководство",
|
||||||
|
"messageSupport": "Съобщение до поддръжката",
|
||||||
|
"supportNotAvailableTitle": "Поддръжката не е налична",
|
||||||
|
"supportNotAvailableDescription": "Поддръжката не е налична в момента. Можете да изпратите имейл на support@pangolin.net.",
|
||||||
|
"supportRequestSentTitle": "Заявката за поддръжка е изпратена",
|
||||||
|
"supportRequestSentDescription": "Вашето съобщение беше изпратено успешно.",
|
||||||
|
"supportRequestFailedTitle": "Неуспешно изпращане на заявка",
|
||||||
|
"supportRequestFailedDescription": "Възникна грешка при изпращането на вашата заявка за поддръжка.",
|
||||||
|
"supportSubjectRequired": "Необходимо е въведеното описание",
|
||||||
|
"supportSubjectMaxLength": "Темата трябва да бъде до 255 символа",
|
||||||
|
"supportMessageRequired": "Необходимо е съобщение",
|
||||||
|
"supportReplyTo": "Отговор до",
|
||||||
|
"supportSubject": "Тема",
|
||||||
|
"supportSubjectPlaceholder": "Въведете тема",
|
||||||
|
"supportMessage": "Съобщение",
|
||||||
|
"supportMessagePlaceholder": "Въведете вашето съобщение",
|
||||||
|
"supportSending": "Изпращане...",
|
||||||
|
"supportSend": "Изпрати",
|
||||||
|
"supportMessageSent": "Съобщението е изпратено!",
|
||||||
|
"supportWillContact": "Ще се свържем с вас скоро!"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -47,9 +47,8 @@
|
|||||||
"edit": "Upravit",
|
"edit": "Upravit",
|
||||||
"siteConfirmDelete": "Potvrdit odstranění lokality",
|
"siteConfirmDelete": "Potvrdit odstranění lokality",
|
||||||
"siteDelete": "Odstranění lokality",
|
"siteDelete": "Odstranění lokality",
|
||||||
"siteMessageRemove": "Jakmile lokalitu odstraníte, nebude dostupná. Všechny související služby a cíle budou také odstraněny.",
|
"siteMessageRemove": "Po odstranění webu již nebude přístupný. Všechny cíle spojené s webem budou také odstraněny.",
|
||||||
"siteMessageConfirm": "Pro potvrzení zadejte prosím název lokality.",
|
"siteQuestionRemove": "Jste si jisti, že chcete odstranit tuto stránku z organizace?",
|
||||||
"siteQuestionRemove": "Opravdu chcete odstranit lokalitu {selectedSite} z organizace?",
|
|
||||||
"siteManageSites": "Správa lokalit",
|
"siteManageSites": "Správa lokalit",
|
||||||
"siteDescription": "Umožní připojení k vaší síti prostřednictvím zabezpečených tunelů",
|
"siteDescription": "Umožní připojení k vaší síti prostřednictvím zabezpečených tunelů",
|
||||||
"siteCreate": "Vytvořit lokalitu",
|
"siteCreate": "Vytvořit lokalitu",
|
||||||
@@ -96,7 +95,7 @@
|
|||||||
"siteWgDescription": "Použijte jakéhokoli klienta WireGuard abyste sestavili tunel. Vyžaduje se ruční nastavení NAT.",
|
"siteWgDescription": "Použijte jakéhokoli klienta WireGuard abyste sestavili tunel. Vyžaduje se ruční nastavení NAT.",
|
||||||
"siteWgDescriptionSaas": "Použijte jakéhokoli klienta WireGuard abyste sestavili tunel. Vyžaduje se ruční nastavení NAT. FUNGUJE POUZE NA SELF-HOSTED SERVERECH",
|
"siteWgDescriptionSaas": "Použijte jakéhokoli klienta WireGuard abyste sestavili tunel. Vyžaduje se ruční nastavení NAT. FUNGUJE POUZE NA SELF-HOSTED SERVERECH",
|
||||||
"siteLocalDescription": "Pouze lokální zdroje. Žádný tunel.",
|
"siteLocalDescription": "Pouze lokální zdroje. Žádný tunel.",
|
||||||
"siteLocalDescriptionSaas": "Local resources only. No tunneling. Only available on remote nodes.",
|
"siteLocalDescriptionSaas": "Pouze místní zdroje. Žádný tunel. Dostupné pouze na vzdálených uzlech.",
|
||||||
"siteSeeAll": "Zobrazit všechny lokality",
|
"siteSeeAll": "Zobrazit všechny lokality",
|
||||||
"siteTunnelDescription": "Určete jak se chcete připojit k vaší lokalitě",
|
"siteTunnelDescription": "Určete jak se chcete připojit k vaší lokalitě",
|
||||||
"siteNewtCredentials": "Přihlašovací údaje Newt",
|
"siteNewtCredentials": "Přihlašovací údaje Newt",
|
||||||
@@ -154,8 +153,7 @@
|
|||||||
"protected": "Chráněno",
|
"protected": "Chráněno",
|
||||||
"notProtected": "Nechráněno",
|
"notProtected": "Nechráněno",
|
||||||
"resourceMessageRemove": "Jakmile zdroj odstraníte, nebude dostupný. Všechny související služby a cíle budou také odstraněny.",
|
"resourceMessageRemove": "Jakmile zdroj odstraníte, nebude dostupný. Všechny související služby a cíle budou také odstraněny.",
|
||||||
"resourceMessageConfirm": "Pro potvrzení zadejte prosím název zdroje.",
|
"resourceQuestionRemove": "Jste si jisti, že chcete odstranit zdroj z organizace?",
|
||||||
"resourceQuestionRemove": "Opravdu chcete odstranit zdroj {selectedResource} z organizace?",
|
|
||||||
"resourceHTTP": "Zdroj HTTPS",
|
"resourceHTTP": "Zdroj HTTPS",
|
||||||
"resourceHTTPDescription": "Požadavky na proxy pro vaši aplikaci přes HTTPS pomocí subdomény nebo základní domény.",
|
"resourceHTTPDescription": "Požadavky na proxy pro vaši aplikaci přes HTTPS pomocí subdomény nebo základní domény.",
|
||||||
"resourceRaw": "Surový TCP/UDP zdroj",
|
"resourceRaw": "Surový TCP/UDP zdroj",
|
||||||
@@ -220,7 +218,7 @@
|
|||||||
"orgDeleteConfirm": "Potvrdit odstranění organizace",
|
"orgDeleteConfirm": "Potvrdit odstranění organizace",
|
||||||
"orgMessageRemove": "Tato akce je nevratná a odstraní všechna související data.",
|
"orgMessageRemove": "Tato akce je nevratná a odstraní všechna související data.",
|
||||||
"orgMessageConfirm": "Pro potvrzení zadejte níže uvedený název organizace.",
|
"orgMessageConfirm": "Pro potvrzení zadejte níže uvedený název organizace.",
|
||||||
"orgQuestionRemove": "Opravdu chcete odstranit organizaci {selectedOrg}?",
|
"orgQuestionRemove": "Jste si jisti, že chcete odstranit organizaci?",
|
||||||
"orgUpdated": "Organizace byla aktualizována",
|
"orgUpdated": "Organizace byla aktualizována",
|
||||||
"orgUpdatedDescription": "Organizace byla aktualizována.",
|
"orgUpdatedDescription": "Organizace byla aktualizována.",
|
||||||
"orgErrorUpdate": "Aktualizace organizace se nezdařila",
|
"orgErrorUpdate": "Aktualizace organizace se nezdařila",
|
||||||
@@ -287,9 +285,8 @@
|
|||||||
"apiKeysAdd": "Generovat API klíč",
|
"apiKeysAdd": "Generovat API klíč",
|
||||||
"apiKeysErrorDelete": "Chyba při odstraňování API klíče",
|
"apiKeysErrorDelete": "Chyba při odstraňování API klíče",
|
||||||
"apiKeysErrorDeleteMessage": "Chyba při odstraňování API klíče",
|
"apiKeysErrorDeleteMessage": "Chyba při odstraňování API klíče",
|
||||||
"apiKeysQuestionRemove": "Opravdu chcete odstranit API klíč {selectedApiKey} z organizace?",
|
"apiKeysQuestionRemove": "Jste si jisti, že chcete odstranit klíč API z organizace?",
|
||||||
"apiKeysMessageRemove": "Po odstranění klíče API již nebude možné použít.",
|
"apiKeysMessageRemove": "Po odstranění klíče API již nebude možné použít.",
|
||||||
"apiKeysMessageConfirm": "Pro potvrzení zadejte název klíče API.",
|
|
||||||
"apiKeysDeleteConfirm": "Potvrdit odstranění API klíče",
|
"apiKeysDeleteConfirm": "Potvrdit odstranění API klíče",
|
||||||
"apiKeysDelete": "Odstranit klíč API",
|
"apiKeysDelete": "Odstranit klíč API",
|
||||||
"apiKeysManage": "Správa API klíčů",
|
"apiKeysManage": "Správa API klíčů",
|
||||||
@@ -305,8 +302,7 @@
|
|||||||
"userDeleteConfirm": "Potvrdit odstranění uživatele",
|
"userDeleteConfirm": "Potvrdit odstranění uživatele",
|
||||||
"userDeleteServer": "Odstranit uživatele ze serveru",
|
"userDeleteServer": "Odstranit uživatele ze serveru",
|
||||||
"userMessageRemove": "Uživatel bude odstraněn ze všech organizací a bude zcela odstraněn ze serveru.",
|
"userMessageRemove": "Uživatel bude odstraněn ze všech organizací a bude zcela odstraněn ze serveru.",
|
||||||
"userMessageConfirm": "Pro potvrzení zadejte níže uvedené jméno uživatele.",
|
"userQuestionRemove": "Jste si jisti, že chcete trvale odstranit uživatele ze serveru?",
|
||||||
"userQuestionRemove": "Opravdu chcete trvale odstranit {selectedUser} ze serveru?",
|
|
||||||
"licenseKey": "Licenční klíč",
|
"licenseKey": "Licenční klíč",
|
||||||
"valid": "Valid",
|
"valid": "Valid",
|
||||||
"numberOfSites": "Počet stránek",
|
"numberOfSites": "Počet stránek",
|
||||||
@@ -339,7 +335,7 @@
|
|||||||
"fossorialLicense": "Zobrazit Fossorial Commercial License & Subscription terms",
|
"fossorialLicense": "Zobrazit Fossorial Commercial License & Subscription terms",
|
||||||
"licenseMessageRemove": "Tímto odstraníte licenční klíč a všechna s ním spojená oprávnění, která mu byla udělena.",
|
"licenseMessageRemove": "Tímto odstraníte licenční klíč a všechna s ním spojená oprávnění, která mu byla udělena.",
|
||||||
"licenseMessageConfirm": "Pro potvrzení zadejte licenční klíč níže.",
|
"licenseMessageConfirm": "Pro potvrzení zadejte licenční klíč níže.",
|
||||||
"licenseQuestionRemove": "Jste si jisti, že chcete odstranit licenční klíč {selectedKey}?",
|
"licenseQuestionRemove": "Jste si jisti, že chcete odstranit licenční klíč?",
|
||||||
"licenseKeyDelete": "Odstranit licenční klíč",
|
"licenseKeyDelete": "Odstranit licenční klíč",
|
||||||
"licenseKeyDeleteConfirm": "Potvrdit odstranění licenčního klíče",
|
"licenseKeyDeleteConfirm": "Potvrdit odstranění licenčního klíče",
|
||||||
"licenseTitle": "Správa stavu licence",
|
"licenseTitle": "Správa stavu licence",
|
||||||
@@ -372,7 +368,7 @@
|
|||||||
"inviteRemoveErrorDescription": "Došlo k chybě při odstraňování pozvánky.",
|
"inviteRemoveErrorDescription": "Došlo k chybě při odstraňování pozvánky.",
|
||||||
"inviteRemoved": "Pozvánka odstraněna",
|
"inviteRemoved": "Pozvánka odstraněna",
|
||||||
"inviteRemovedDescription": "Pozvánka pro {email} byla odstraněna.",
|
"inviteRemovedDescription": "Pozvánka pro {email} byla odstraněna.",
|
||||||
"inviteQuestionRemove": "Jste si jisti, že chcete odstranit pozvánku {email}?",
|
"inviteQuestionRemove": "Jste si jisti, že chcete odstranit pozvánku?",
|
||||||
"inviteMessageRemove": "Po odstranění, tato pozvánka již nebude platná. Později můžete uživatele znovu pozvat.",
|
"inviteMessageRemove": "Po odstranění, tato pozvánka již nebude platná. Později můžete uživatele znovu pozvat.",
|
||||||
"inviteMessageConfirm": "Pro potvrzení zadejte prosím níže uvedenou e-mailovou adresu.",
|
"inviteMessageConfirm": "Pro potvrzení zadejte prosím níže uvedenou e-mailovou adresu.",
|
||||||
"inviteQuestionRegenerate": "Jste si jisti, že chcete obnovit pozvánku pro {email}? Tato akce zruší předchozí pozvánku.",
|
"inviteQuestionRegenerate": "Jste si jisti, že chcete obnovit pozvánku pro {email}? Tato akce zruší předchozí pozvánku.",
|
||||||
@@ -398,9 +394,8 @@
|
|||||||
"userErrorOrgRemoveDescription": "Došlo k chybě při odebírání uživatele.",
|
"userErrorOrgRemoveDescription": "Došlo k chybě při odebírání uživatele.",
|
||||||
"userOrgRemoved": "Uživatel odstraněn",
|
"userOrgRemoved": "Uživatel odstraněn",
|
||||||
"userOrgRemovedDescription": "Uživatel {email} byl odebrán z organizace.",
|
"userOrgRemovedDescription": "Uživatel {email} byl odebrán z organizace.",
|
||||||
"userQuestionOrgRemove": "Jste si jisti, že chcete odstranit {email} z organizace?",
|
"userQuestionOrgRemove": "Jste si jisti, že chcete odstranit tohoto uživatele z organizace?",
|
||||||
"userMessageOrgRemove": "Po odstranění tohoto uživatele již nebude mít přístup k organizaci. Vždy je můžete znovu pozvat později, ale budou muset pozvání znovu přijmout.",
|
"userMessageOrgRemove": "Po odstranění tohoto uživatele již nebude mít přístup k organizaci. Vždy je můžete znovu pozvat později, ale budou muset pozvání znovu přijmout.",
|
||||||
"userMessageOrgConfirm": "Pro potvrzení, zadejte prosím jméno uživatele níže.",
|
|
||||||
"userRemoveOrgConfirm": "Potvrdit odebrání uživatele",
|
"userRemoveOrgConfirm": "Potvrdit odebrání uživatele",
|
||||||
"userRemoveOrg": "Odebrat uživatele z organizace",
|
"userRemoveOrg": "Odebrat uživatele z organizace",
|
||||||
"users": "Uživatelé",
|
"users": "Uživatelé",
|
||||||
@@ -730,7 +725,7 @@
|
|||||||
"pangolinServerAdmin": "Správce serveru - Pangolin",
|
"pangolinServerAdmin": "Správce serveru - Pangolin",
|
||||||
"licenseTierProfessional": "Profesionální licence",
|
"licenseTierProfessional": "Profesionální licence",
|
||||||
"licenseTierEnterprise": "Podniková licence",
|
"licenseTierEnterprise": "Podniková licence",
|
||||||
"licenseTierPersonal": "Personal License",
|
"licenseTierPersonal": "Osobní licence",
|
||||||
"licensed": "Licencováno",
|
"licensed": "Licencováno",
|
||||||
"yes": "Ano",
|
"yes": "Ano",
|
||||||
"no": "Ne",
|
"no": "Ne",
|
||||||
@@ -742,7 +737,7 @@
|
|||||||
"idpManageDescription": "Zobrazit a spravovat poskytovatele identity v systému",
|
"idpManageDescription": "Zobrazit a spravovat poskytovatele identity v systému",
|
||||||
"idpDeletedDescription": "Poskytovatel identity byl úspěšně odstraněn",
|
"idpDeletedDescription": "Poskytovatel identity byl úspěšně odstraněn",
|
||||||
"idpOidc": "OAuth2/OIDC",
|
"idpOidc": "OAuth2/OIDC",
|
||||||
"idpQuestionRemove": "Jste si jisti, že chcete trvale odstranit poskytovatele identity {name}?",
|
"idpQuestionRemove": "Jste si jisti, že chcete trvale odstranit poskytovatele identity?",
|
||||||
"idpMessageRemove": "Tímto odstraníte poskytovatele identity a všechny přidružené konfigurace. Uživatelé, kteří se autentizují prostřednictvím tohoto poskytovatele, se již nebudou moci přihlásit.",
|
"idpMessageRemove": "Tímto odstraníte poskytovatele identity a všechny přidružené konfigurace. Uživatelé, kteří se autentizují prostřednictvím tohoto poskytovatele, se již nebudou moci přihlásit.",
|
||||||
"idpMessageConfirm": "Pro potvrzení zadejte níže uvedené jméno poskytovatele identity.",
|
"idpMessageConfirm": "Pro potvrzení zadejte níže uvedené jméno poskytovatele identity.",
|
||||||
"idpConfirmDelete": "Potvrdit odstranění poskytovatele identity",
|
"idpConfirmDelete": "Potvrdit odstranění poskytovatele identity",
|
||||||
@@ -765,7 +760,7 @@
|
|||||||
"idpDisplayName": "Zobrazované jméno tohoto poskytovatele identity",
|
"idpDisplayName": "Zobrazované jméno tohoto poskytovatele identity",
|
||||||
"idpAutoProvisionUsers": "Automatická úprava uživatelů",
|
"idpAutoProvisionUsers": "Automatická úprava uživatelů",
|
||||||
"idpAutoProvisionUsersDescription": "Pokud je povoleno, uživatelé budou automaticky vytvářeni v systému při prvním přihlášení, s možností namapovat uživatele na role a organizace.",
|
"idpAutoProvisionUsersDescription": "Pokud je povoleno, uživatelé budou automaticky vytvářeni v systému při prvním přihlášení, s možností namapovat uživatele na role a organizace.",
|
||||||
"licenseBadge": "EE",
|
"licenseBadge": "PE",
|
||||||
"idpType": "Typ poskytovatele",
|
"idpType": "Typ poskytovatele",
|
||||||
"idpTypeDescription": "Vyberte typ poskytovatele identity, který chcete nakonfigurovat",
|
"idpTypeDescription": "Vyberte typ poskytovatele identity, který chcete nakonfigurovat",
|
||||||
"idpOidcConfigure": "Nastavení OAuth2/OIDC",
|
"idpOidcConfigure": "Nastavení OAuth2/OIDC",
|
||||||
@@ -916,6 +911,18 @@
|
|||||||
"passwordResetCodeDescription": "Zkontrolujte svůj e-mail pro kód pro obnovení.",
|
"passwordResetCodeDescription": "Zkontrolujte svůj e-mail pro kód pro obnovení.",
|
||||||
"passwordNew": "Nové heslo",
|
"passwordNew": "Nové heslo",
|
||||||
"passwordNewConfirm": "Potvrdit nové heslo",
|
"passwordNewConfirm": "Potvrdit nové heslo",
|
||||||
|
"changePassword": "Změnit heslo",
|
||||||
|
"changePasswordDescription": "Aktualizujte heslo k účtu",
|
||||||
|
"oldPassword": "Aktuální heslo",
|
||||||
|
"newPassword": "Nové heslo",
|
||||||
|
"confirmNewPassword": "Potvrdit nové heslo",
|
||||||
|
"changePasswordError": "Změna hesla se nezdařila",
|
||||||
|
"changePasswordErrorDescription": "Došlo k chybě při změně hesla",
|
||||||
|
"changePasswordSuccess": "Heslo úspěšně změněno",
|
||||||
|
"changePasswordSuccessDescription": "Vaše heslo bylo úspěšně aktualizováno",
|
||||||
|
"passwordExpiryRequired": "Vyžaduje vypršení platnosti hesla",
|
||||||
|
"passwordExpiryDescription": "Tato organizace vyžaduje změnu hesla každých {maxDays} dní.",
|
||||||
|
"changePasswordNow": "Změnit heslo",
|
||||||
"pincodeAuth": "Ověřovací kód",
|
"pincodeAuth": "Ověřovací kód",
|
||||||
"pincodeSubmit2": "Odeslat kód",
|
"pincodeSubmit2": "Odeslat kód",
|
||||||
"passwordResetSubmit": "Žádost o obnovení",
|
"passwordResetSubmit": "Žádost o obnovení",
|
||||||
@@ -1154,8 +1161,27 @@
|
|||||||
"sidebarAllUsers": "Všichni uživatelé",
|
"sidebarAllUsers": "Všichni uživatelé",
|
||||||
"sidebarIdentityProviders": "Poskytovatelé identity",
|
"sidebarIdentityProviders": "Poskytovatelé identity",
|
||||||
"sidebarLicense": "Licence",
|
"sidebarLicense": "Licence",
|
||||||
"sidebarClients": "Clients",
|
"sidebarClients": "Klienti",
|
||||||
"sidebarDomains": "Domény",
|
"sidebarDomains": "Domény",
|
||||||
|
"sidebarBluePrints": "Plány",
|
||||||
|
"blueprints": "Plány",
|
||||||
|
"blueprintsDescription": "Plány jsou deklarativní YAML konfigurace, které definují vaše zdroje a jejich nastavení",
|
||||||
|
"blueprintAdd": "Přidat plán",
|
||||||
|
"blueprintGoBack": "Zobrazit všechny plány",
|
||||||
|
"blueprintCreate": "Vytvořit plán",
|
||||||
|
"blueprintCreateDescription2": "Postupujte podle níže uvedených kroků pro vytvoření a použití nového plánu",
|
||||||
|
"blueprintDetails": "Podrobnosti plánu",
|
||||||
|
"blueprintDetailsDescription": "Podívejte se na detaily běhu plánu",
|
||||||
|
"blueprintInfo": "Informace o plánu",
|
||||||
|
"message": "Zpráva",
|
||||||
|
"blueprintContentsDescription": "Definujte obsah YAML popisující vaši infrastrukturu",
|
||||||
|
"blueprintErrorCreateDescription": "Při aplikaci plánu došlo k chybě",
|
||||||
|
"blueprintErrorCreate": "Chyba při vytváření plánu",
|
||||||
|
"searchBlueprintProgress": "Hledat plány...",
|
||||||
|
"appliedAt": "Použito v",
|
||||||
|
"source": "Zdroj",
|
||||||
|
"contents": "Obsah",
|
||||||
|
"parsedContents": "Parsovaný obsah",
|
||||||
"enableDockerSocket": "Povolit Docker plán",
|
"enableDockerSocket": "Povolit Docker plán",
|
||||||
"enableDockerSocketDescription": "Povolte seškrábání štítků na Docker Socket pro popisky plánů. Nová cesta musí být k dispozici.",
|
"enableDockerSocketDescription": "Povolte seškrábání štítků na Docker Socket pro popisky plánů. Nová cesta musí být k dispozici.",
|
||||||
"enableDockerSocketLink": "Zjistit více",
|
"enableDockerSocketLink": "Zjistit více",
|
||||||
@@ -1211,9 +1237,8 @@
|
|||||||
"domainCreate": "Vytvořit doménu",
|
"domainCreate": "Vytvořit doménu",
|
||||||
"domainCreatedDescription": "Doména byla úspěšně vytvořena",
|
"domainCreatedDescription": "Doména byla úspěšně vytvořena",
|
||||||
"domainDeletedDescription": "Doména byla úspěšně odstraněna",
|
"domainDeletedDescription": "Doména byla úspěšně odstraněna",
|
||||||
"domainQuestionRemove": "Opravdu chcete odstranit doménu {domain} z vašeho účtu?",
|
"domainQuestionRemove": "Opravdu chcete odstranit doménu z vašeho účtu?",
|
||||||
"domainMessageRemove": "Po odstranění domény již nebude přiřazena k vašemu účtu.",
|
"domainMessageRemove": "Po odstranění domény již nebude přiřazena k vašemu účtu.",
|
||||||
"domainMessageConfirm": "Pro potvrzení zadejte název domény níže.",
|
|
||||||
"domainConfirmDelete": "Potvrdit odstranění domény",
|
"domainConfirmDelete": "Potvrdit odstranění domény",
|
||||||
"domainDelete": "Odstranit doménu",
|
"domainDelete": "Odstranit doménu",
|
||||||
"domain": "Doména",
|
"domain": "Doména",
|
||||||
@@ -1280,7 +1305,7 @@
|
|||||||
"billingFreeTier": "Volná úroveň",
|
"billingFreeTier": "Volná úroveň",
|
||||||
"billingWarningOverLimit": "Upozornění: Překročili jste jeden nebo více omezení používání. Vaše stránky se nepřipojí dokud nezměníte předplatné nebo neupravíte své používání.",
|
"billingWarningOverLimit": "Upozornění: Překročili jste jeden nebo více omezení používání. Vaše stránky se nepřipojí dokud nezměníte předplatné nebo neupravíte své používání.",
|
||||||
"billingUsageLimitsOverview": "Přehled omezení použití",
|
"billingUsageLimitsOverview": "Přehled omezení použití",
|
||||||
"billingMonitorUsage": "Sledujte vaše využití pomocí nastavených limitů. Pokud potřebujete zvýšit limity, kontaktujte nás prosím support@fossorial.io.",
|
"billingMonitorUsage": "Sledujte vaše využití pomocí nastavených limitů. Pokud potřebujete zvýšit limity, kontaktujte nás prosím support@pangolin.net.",
|
||||||
"billingDataUsage": "Využití dat",
|
"billingDataUsage": "Využití dat",
|
||||||
"billingOnlineTime": "Stránka online čas",
|
"billingOnlineTime": "Stránka online čas",
|
||||||
"billingUsers": "Aktivní uživatelé",
|
"billingUsers": "Aktivní uživatelé",
|
||||||
@@ -1346,6 +1371,19 @@
|
|||||||
"securityKeyUnknownError": "Vyskytl se problém s použitím bezpečnostního klíče. Zkuste to prosím znovu.",
|
"securityKeyUnknownError": "Vyskytl se problém s použitím bezpečnostního klíče. Zkuste to prosím znovu.",
|
||||||
"twoFactorRequired": "Pro registraci bezpečnostního klíče je nutné dvoufaktorové ověření.",
|
"twoFactorRequired": "Pro registraci bezpečnostního klíče je nutné dvoufaktorové ověření.",
|
||||||
"twoFactor": "Dvoufaktorové ověření",
|
"twoFactor": "Dvoufaktorové ověření",
|
||||||
|
"twoFactorAuthentication": "Dvoufaktorové ověření",
|
||||||
|
"twoFactorDescription": "Tato organizace vyžaduje dvoufaktorové ověření.",
|
||||||
|
"enableTwoFactor": "Povolit dvoufaktorové ověření",
|
||||||
|
"organizationSecurityPolicy": "Bezpečnostní politika organizace",
|
||||||
|
"organizationSecurityPolicyDescription": "Tato organizace má bezpečnostní požadavky, které musí být splněny, než k ní budete mít přístup",
|
||||||
|
"securityRequirements": "Bezpečnostní požadavky",
|
||||||
|
"allRequirementsMet": "Všechny požadavky byly splněny",
|
||||||
|
"completeRequirementsToContinue": "Pro pokračování v přístupu k této organizaci splněte níže uvedené požadavky",
|
||||||
|
"youCanNowAccessOrganization": "Nyní můžete přistupovat k této organizaci",
|
||||||
|
"reauthenticationRequired": "Délka relace",
|
||||||
|
"reauthenticationDescription": "Tato organizace vyžaduje, abyste se přihlásili každých {maxDays} dní.",
|
||||||
|
"reauthenticationDescriptionHours": "Tato organizace vyžaduje, abyste se přihlásili každých {maxHours} hodin.",
|
||||||
|
"reauthenticateNow": "Přihlásit se znovu",
|
||||||
"adminEnabled2FaOnYourAccount": "Váš správce povolil dvoufaktorové ověřování pro {email}. Chcete-li pokračovat, dokončete proces nastavení.",
|
"adminEnabled2FaOnYourAccount": "Váš správce povolil dvoufaktorové ověřování pro {email}. Chcete-li pokračovat, dokončete proces nastavení.",
|
||||||
"securityKeyAdd": "Přidat bezpečnostní klíč",
|
"securityKeyAdd": "Přidat bezpečnostní klíč",
|
||||||
"securityKeyRegisterTitle": "Registrovat nový bezpečnostní klíč",
|
"securityKeyRegisterTitle": "Registrovat nový bezpečnostní klíč",
|
||||||
@@ -1558,14 +1596,13 @@
|
|||||||
"autoLoginErrorNoRedirectUrl": "Od poskytovatele identity nebyla obdržena žádná adresa URL.",
|
"autoLoginErrorNoRedirectUrl": "Od poskytovatele identity nebyla obdržena žádná adresa URL.",
|
||||||
"autoLoginErrorGeneratingUrl": "Nepodařilo se vygenerovat ověřovací URL.",
|
"autoLoginErrorGeneratingUrl": "Nepodařilo se vygenerovat ověřovací URL.",
|
||||||
"remoteExitNodeManageRemoteExitNodes": "Vzdálené uzly",
|
"remoteExitNodeManageRemoteExitNodes": "Vzdálené uzly",
|
||||||
"remoteExitNodeDescription": "Self-host one or more remote nodes to extend your network connectivity and reduce reliance on the cloud",
|
"remoteExitNodeDescription": "Hostujte jeden nebo více vlastních vzdálených uzlů, abyste rozšířili síťová připojení a snížili závislost na cloudu",
|
||||||
"remoteExitNodes": "Uzly",
|
"remoteExitNodes": "Uzly",
|
||||||
"searchRemoteExitNodes": "Hledat uzly...",
|
"searchRemoteExitNodes": "Hledat uzly...",
|
||||||
"remoteExitNodeAdd": "Přidat uzel",
|
"remoteExitNodeAdd": "Přidat uzel",
|
||||||
"remoteExitNodeErrorDelete": "Chyba při odstraňování uzlu",
|
"remoteExitNodeErrorDelete": "Chyba při odstraňování uzlu",
|
||||||
"remoteExitNodeQuestionRemove": "Jste si jisti, že chcete odstranit uzel {selectedNode} z organizace?",
|
"remoteExitNodeQuestionRemove": "Jste si jisti, že chcete odstranit uzel z organizace?",
|
||||||
"remoteExitNodeMessageRemove": "Po odstranění uzel již nebude přístupný.",
|
"remoteExitNodeMessageRemove": "Po odstranění uzel již nebude přístupný.",
|
||||||
"remoteExitNodeMessageConfirm": "Pro potvrzení zadejte název uzlu níže.",
|
|
||||||
"remoteExitNodeConfirmDelete": "Potvrdit odstranění uzlu",
|
"remoteExitNodeConfirmDelete": "Potvrdit odstranění uzlu",
|
||||||
"remoteExitNodeDelete": "Odstranit uzel",
|
"remoteExitNodeDelete": "Odstranit uzel",
|
||||||
"sidebarRemoteExitNodes": "Vzdálené uzly",
|
"sidebarRemoteExitNodes": "Vzdálené uzly",
|
||||||
@@ -1733,7 +1770,49 @@
|
|||||||
"resourceExposePortsEditFile": "Upravit soubor: docker-compose.yml",
|
"resourceExposePortsEditFile": "Upravit soubor: docker-compose.yml",
|
||||||
"emailVerificationRequired": "Je vyžadováno ověření e-mailu. Přihlaste se znovu pomocí {dashboardUrl}/auth/login dokončete tento krok. Poté se vraťte zde.",
|
"emailVerificationRequired": "Je vyžadováno ověření e-mailu. Přihlaste se znovu pomocí {dashboardUrl}/auth/login dokončete tento krok. Poté se vraťte zde.",
|
||||||
"twoFactorSetupRequired": "Je vyžadováno nastavení dvoufaktorového ověřování. Přihlaste se znovu pomocí {dashboardUrl}/autentizace/přihlášení dokončí tento krok. Poté se vraťte zde.",
|
"twoFactorSetupRequired": "Je vyžadováno nastavení dvoufaktorového ověřování. Přihlaste se znovu pomocí {dashboardUrl}/autentizace/přihlášení dokončí tento krok. Poté se vraťte zde.",
|
||||||
|
"additionalSecurityRequired": "Vyžadováno další zabezpečení",
|
||||||
|
"organizationRequiresAdditionalSteps": "Tato organizace vyžaduje další bezpečnostní kroky, než budete moci přistupovat ke zdrojům.",
|
||||||
|
"completeTheseSteps": "Dokončete tyto kroky",
|
||||||
|
"enableTwoFactorAuthentication": "Povolit dvoufaktorové ověření",
|
||||||
|
"completeSecuritySteps": "Dokončit bezpečnostní kroky",
|
||||||
|
"securitySettings": "Nastavení zabezpečení",
|
||||||
|
"securitySettingsDescription": "Konfigurace bezpečnostních zásad pro vaši organizaci",
|
||||||
|
"requireTwoFactorForAllUsers": "Vyžadovat dvoufaktorové ověření pro všechny uživatele",
|
||||||
|
"requireTwoFactorDescription": "Pokud je povoleno, všichni interní uživatelé v této organizaci musí mít dvoufaktorové ověření povoleno pro přístup k organizaci.",
|
||||||
|
"requireTwoFactorDisabledDescription": "Tato funkce vyžaduje platnou licenci (Enterprise) nebo aktivní předplatné (SaaS)",
|
||||||
|
"requireTwoFactorCannotEnableDescription": "Před vynucením dvoufaktorového ověření vašeho účtu musíte povolit dvoufaktorové ověření pro všechny uživatele",
|
||||||
|
"maxSessionLength": "Maximální délka relace",
|
||||||
|
"maxSessionLengthDescription": "Nastavte maximální dobu trvání relace uživatele. Po této době se uživatelé budou muset znovu přihlásit.",
|
||||||
|
"maxSessionLengthDisabledDescription": "Tato funkce vyžaduje platnou licenci (Enterprise) nebo aktivní předplatné (SaaS)",
|
||||||
|
"selectSessionLength": "Vyberte délku relace",
|
||||||
|
"unenforced": "Nevynucené",
|
||||||
|
"1Hour": "1 hodina",
|
||||||
|
"3Hours": "3 hodiny",
|
||||||
|
"6Hours": "6 hodin",
|
||||||
|
"12Hours": "12 hodin",
|
||||||
|
"1DaySession": "1 den",
|
||||||
|
"3Days": "3 dny",
|
||||||
|
"7Days": "7 dní",
|
||||||
|
"14Days": "14 dní",
|
||||||
|
"30DaysSession": "30 dní",
|
||||||
|
"90DaysSession": "90 dní",
|
||||||
|
"180DaysSession": "180 dní",
|
||||||
|
"passwordExpiryDays": "Platnost hesla",
|
||||||
|
"editPasswordExpiryDescription": "Nastavte počet dní před tím, než jsou uživatelé povinni změnit své heslo.",
|
||||||
|
"selectPasswordExpiry": "Vyberte vypršení platnosti hesla",
|
||||||
|
"30Days": "30 dní",
|
||||||
|
"1Day": "1 den",
|
||||||
|
"60Days": "60 dní",
|
||||||
|
"90Days": "90 dní",
|
||||||
|
"180Days": "180 dní",
|
||||||
|
"1Year": "1 rok",
|
||||||
|
"subscriptionBadge": "Vyžadováno předplatné",
|
||||||
|
"securityPolicyChangeWarning": "Upozornění na změnu bezpečnostní politiky",
|
||||||
|
"securityPolicyChangeDescription": "Chystáte se změnit nastavení bezpečnostních pravidel. Po uložení bude možná nutné znovu ověřit, abyste dodrželi tyto aktualizace přístupových práv. Všichni uživatelé, kteří nevyhovují, se také budou muset znovu přihlásit.",
|
||||||
|
"securityPolicyChangeConfirmMessage": "Potvrzuji",
|
||||||
|
"securityPolicyChangeWarningText": "Toto ovlivní všechny uživatele v organizaci",
|
||||||
"authPageErrorUpdateMessage": "Při aktualizaci nastavení autentizační stránky došlo k chybě",
|
"authPageErrorUpdateMessage": "Při aktualizaci nastavení autentizační stránky došlo k chybě",
|
||||||
|
"authPageErrorUpdate": "Nelze aktualizovat ověřovací stránku",
|
||||||
"authPageUpdated": "Autentizační stránka byla úspěšně aktualizována",
|
"authPageUpdated": "Autentizační stránka byla úspěšně aktualizována",
|
||||||
"healthCheckNotAvailable": "Místní",
|
"healthCheckNotAvailable": "Místní",
|
||||||
"rewritePath": "Přepsat cestu",
|
"rewritePath": "Přepsat cestu",
|
||||||
@@ -1745,153 +1824,261 @@
|
|||||||
"resourceHeaderAuthRemoveDescription": "Úspěšně odstraněna autentizace záhlaví.",
|
"resourceHeaderAuthRemoveDescription": "Úspěšně odstraněna autentizace záhlaví.",
|
||||||
"resourceErrorHeaderAuthRemove": "Nepodařilo se odstranit Autentizaci Záhlaví",
|
"resourceErrorHeaderAuthRemove": "Nepodařilo se odstranit Autentizaci Záhlaví",
|
||||||
"resourceErrorHeaderAuthRemoveDescription": "Nepodařilo se odstranit autentizaci záhlaví ze zdroje.",
|
"resourceErrorHeaderAuthRemoveDescription": "Nepodařilo se odstranit autentizaci záhlaví ze zdroje.",
|
||||||
"resourceHeaderAuthProtectionEnabled": "Header Authentication Enabled",
|
"resourceHeaderAuthProtectionEnabled": "Ověřování pomocí hlaviček zapnuto",
|
||||||
"resourceHeaderAuthProtectionDisabled": "Header Authentication Disabled",
|
"resourceHeaderAuthProtectionDisabled": "Ověřování pomocí hlaviček vypnuto",
|
||||||
"headerAuthRemove": "Remove Header Auth",
|
"headerAuthRemove": "Odstranit ověřování pomocí hlaviček",
|
||||||
"headerAuthAdd": "Add Header Auth",
|
"headerAuthAdd": "Přidat ověřování pomocí hlaviček",
|
||||||
"resourceErrorHeaderAuthSetup": "Nepodařilo se nastavit Autentizaci Záhlaví",
|
"resourceErrorHeaderAuthSetup": "Nepodařilo se nastavit Autentizaci Záhlaví",
|
||||||
"resourceErrorHeaderAuthSetupDescription": "Nepodařilo se nastavit autentizaci záhlaví ze zdroje.",
|
"resourceErrorHeaderAuthSetupDescription": "Nepodařilo se nastavit autentizaci záhlaví ze zdroje.",
|
||||||
"resourceHeaderAuthSetup": "Úspěšně nastavena Autentizace Záhlaví",
|
"resourceHeaderAuthSetup": "Úspěšně nastavena Autentizace Záhlaví",
|
||||||
"resourceHeaderAuthSetupDescription": "Autentizace záhlaví byla úspěšně nastavena.",
|
"resourceHeaderAuthSetupDescription": "Autentizace záhlaví byla úspěšně nastavena.",
|
||||||
"resourceHeaderAuthSetupTitle": "Nastavit Autentizaci Záhlaví",
|
"resourceHeaderAuthSetupTitle": "Nastavit Autentizaci Záhlaví",
|
||||||
"resourceHeaderAuthSetupTitleDescription": "Set the basic auth credentials (username and password) to protect this resource with HTTP Header Authentication. Access it using the format https://username:password@resource.example.com",
|
"resourceHeaderAuthSetupTitleDescription": "Nastavte přihlašovací údaje basic auth (uživatelské jméno a heslo) abyste tento zdroj chránili ověřováním pomocí HTTP hlaviček. Pro přístup použijte adresu ve formátu https://username:password@resource.example.com",
|
||||||
"resourceHeaderAuthSubmit": "Nastavit Autentizaci Záhlaví",
|
"resourceHeaderAuthSubmit": "Nastavit Autentizaci Záhlaví",
|
||||||
"actionSetResourceHeaderAuth": "Nastavit Autentizaci Záhlaví",
|
"actionSetResourceHeaderAuth": "Nastavit Autentizaci Záhlaví",
|
||||||
"enterpriseEdition": "Enterprise Edition",
|
"enterpriseEdition": "Podniková edice",
|
||||||
"unlicensed": "Unlicensed",
|
"unlicensed": "Nelicencováno",
|
||||||
"beta": "Beta",
|
"beta": "Beta",
|
||||||
"manageClients": "Manage Clients",
|
"manageClients": "Spravovat klienty",
|
||||||
"manageClientsDescription": "Clients are devices that can connect to your sites",
|
"manageClientsDescription": "Klienti jsou zařízení, která se mohou připojit k vašim lokalitám",
|
||||||
"licenseTableValidUntil": "Valid Until",
|
"licenseTableValidUntil": "Platná do",
|
||||||
"saasLicenseKeysSettingsTitle": "Enterprise Licenses",
|
"saasLicenseKeysSettingsTitle": "Podniková licence",
|
||||||
"saasLicenseKeysSettingsDescription": "Generate and manage Enterprise license keys for self-hosted Pangolin instances",
|
"saasLicenseKeysSettingsDescription": "Vygenerovat a spravovat podnikové licence pro instance Pangolin na vlastním hostingu",
|
||||||
"sidebarEnterpriseLicenses": "Licenses",
|
"sidebarEnterpriseLicenses": "Licence",
|
||||||
"generateLicenseKey": "Generate License Key",
|
"generateLicenseKey": "Vygenerovat licenční klíč",
|
||||||
"generateLicenseKeyForm": {
|
"generateLicenseKeyForm": {
|
||||||
"validation": {
|
"validation": {
|
||||||
"emailRequired": "Please enter a valid email address",
|
"emailRequired": "Prosím zadejte platnou emailovou adresu",
|
||||||
"useCaseTypeRequired": "Please select a use case type",
|
"useCaseTypeRequired": "Vyberte prosím typ použití",
|
||||||
"firstNameRequired": "First name is required",
|
"firstNameRequired": "Zadejte křestní jméno",
|
||||||
"lastNameRequired": "Last name is required",
|
"lastNameRequired": "Zadejte příjmení",
|
||||||
"primaryUseRequired": "Please describe your primary use",
|
"primaryUseRequired": "Popište prosím účel použití",
|
||||||
"jobTitleRequiredBusiness": "Job title is required for business use",
|
"jobTitleRequiredBusiness": "Pro komerční využití zadejte název pracovní pozice",
|
||||||
"industryRequiredBusiness": "Industry is required for business use",
|
"industryRequiredBusiness": "Pro komerční využití zadejte odvětví společnosti",
|
||||||
"stateProvinceRegionRequired": "State/Province/Region is required",
|
"stateProvinceRegionRequired": "Zadejte stát/provincii/oblast",
|
||||||
"postalZipCodeRequired": "Postal/ZIP Code is required",
|
"postalZipCodeRequired": "Zadejte PSČ",
|
||||||
"companyNameRequiredBusiness": "Company name is required for business use",
|
"companyNameRequiredBusiness": "Pro komerční využití zadejte název společnosti",
|
||||||
"countryOfResidenceRequiredBusiness": "Country of residence is required for business use",
|
"countryOfResidenceRequiredBusiness": "Pro komerční využití zadejte zemi sídla společnosti",
|
||||||
"countryRequiredPersonal": "Country is required for personal use",
|
"countryRequiredPersonal": "Pro osobní využití zadejte zemi",
|
||||||
"agreeToTermsRequired": "You must agree to the terms",
|
"agreeToTermsRequired": "Musíte souhlasit s podmínkami",
|
||||||
"complianceConfirmationRequired": "You must confirm compliance with the Fossorial Commercial License"
|
"complianceConfirmationRequired": "Musíte potvrdit dodržování Fossorial Commercial Licence"
|
||||||
},
|
},
|
||||||
"useCaseOptions": {
|
"useCaseOptions": {
|
||||||
"personal": {
|
"personal": {
|
||||||
"title": "Personal Use",
|
"title": "Osobní využití",
|
||||||
"description": "For individual, non-commercial use such as learning, personal projects, or experimentation."
|
"description": "Pro osobní nekomerční využití jako je vzdělávání, osobní projekty nebo experimentování."
|
||||||
},
|
},
|
||||||
"business": {
|
"business": {
|
||||||
"title": "Business Use",
|
"title": "Podnikové využití",
|
||||||
"description": "For use within organizations, companies, or commercial or revenue-generating activities."
|
"description": "Pro použití v organizacích, společnostech nebo při činnostech generujících zisk."
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"steps": {
|
"steps": {
|
||||||
"emailLicenseType": {
|
"emailLicenseType": {
|
||||||
"title": "Email & License Type",
|
"title": "Email a typ licence",
|
||||||
"description": "Enter your email and choose your license type"
|
"description": "Zadejte svůj email a vyberte typ licence"
|
||||||
},
|
},
|
||||||
"personalInformation": {
|
"personalInformation": {
|
||||||
"title": "Personal Information",
|
"title": "Osobní údaje",
|
||||||
"description": "Tell us about yourself"
|
"description": "Povězte nám něco o sobě"
|
||||||
},
|
},
|
||||||
"contactInformation": {
|
"contactInformation": {
|
||||||
"title": "Contact Information",
|
"title": "Kontaktní údaje",
|
||||||
"description": "Your contact details"
|
"description": "Vaše kontaktní údaje"
|
||||||
},
|
},
|
||||||
"termsGenerate": {
|
"termsGenerate": {
|
||||||
"title": "Terms & Generate",
|
"title": "Podmínky a vygenerovat",
|
||||||
"description": "Review and accept terms to generate your license"
|
"description": "Zkontrolujte a přijměte podmínky pro vygenerování vaší licence"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"alerts": {
|
"alerts": {
|
||||||
"commercialUseDisclosure": {
|
"commercialUseDisclosure": {
|
||||||
"title": "Usage Disclosure",
|
"title": "Poskytnutí využití",
|
||||||
"description": "Select the license tier that accurately reflects your intended use. The Personal License permits free use of the Software for individual, non-commercial or small-scale commercial activities with annual gross revenue under $100,000 USD. Any use beyond these limits — including use within a business, organization, or other revenue-generating environment — requires a valid Enterprise License and payment of the applicable licensing fee. All users, whether Personal or Enterprise, must comply with the Fossorial Commercial License Terms."
|
"description": "Vyberte si typ licence který odráží způsob využití. Osobní licence dovoluje používat aplikaci pro osobní využití, nekomerční využití nebo v malých organizacích do ročního obratu pod 100 000 USD. Jakékoliv jiné využití včetně využití pro podnikání, organizace nebo jiná prostředí generující zisk vyžaduje platnou podnikovou licenci a platbu licenčních poplatků. Všichni uživatelé, ať už osobních nebo podnikových licencí, musí souhlasit s Fossorial Commercial License Terms."
|
||||||
},
|
},
|
||||||
"trialPeriodInformation": {
|
"trialPeriodInformation": {
|
||||||
"title": "Trial Period Information",
|
"title": "Informace o zkušební době",
|
||||||
"description": "This License Key enables Enterprise features for a 7-day evaluation period. Continued access to Paid Features beyond the evaluation period requires activation under a valid Personal or Enterprise License. For Enterprise licensing, contact sales@fossorial.io."
|
"description": "Tento licenční klíč umožňuje používat podnikové funkce po dobu sedmidenní zkušební doby. Abyste zachovali přístup k placeným funkcím po skončení zkušební doby, musíte aktivovat platnou osobní nebo podnikovou licenci. Pro podnikové licence kontaktujte sales@pangolin.net."
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"form": {
|
"form": {
|
||||||
"useCaseQuestion": "Are you using Pangolin for personal or business use?",
|
"useCaseQuestion": "Používáte Pangolin pro osobní nebo obchodní účely?",
|
||||||
"firstName": "First Name",
|
"firstName": "Křestní jméno",
|
||||||
"lastName": "Last Name",
|
"lastName": "Příjmení",
|
||||||
"jobTitle": "Job Title",
|
"jobTitle": "Pracovní pozice",
|
||||||
"primaryUseQuestion": "What do you primarily plan to use Pangolin for?",
|
"primaryUseQuestion": "Na co budete především používat Pangolin?",
|
||||||
"industryQuestion": "What is your industry?",
|
"industryQuestion": "Jaké je vaše odvětví?",
|
||||||
"prospectiveUsersQuestion": "How many prospective users do you expect to have?",
|
"prospectiveUsersQuestion": "Kolik potenciálních uživatelů předpokládáte?",
|
||||||
"prospectiveSitesQuestion": "How many prospective sites (tunnels) do you expect to have?",
|
"prospectiveSitesQuestion": "Kolik předpokládáte lokalit (tunelů)?",
|
||||||
"companyName": "Company name",
|
"companyName": "Název společnosti",
|
||||||
"countryOfResidence": "Country of residence",
|
"countryOfResidence": "Země sídla společnosti",
|
||||||
"stateProvinceRegion": "State / Province / Region",
|
"stateProvinceRegion": "Stát / kraj / oblast",
|
||||||
"postalZipCode": "Postal / ZIP Code",
|
"postalZipCode": "PSČ",
|
||||||
"companyWebsite": "Company website",
|
"companyWebsite": "Stránky společnosti",
|
||||||
"companyPhoneNumber": "Company phone number",
|
"companyPhoneNumber": "Telefonní číslo společnosti",
|
||||||
"country": "Country",
|
"country": "Země",
|
||||||
"phoneNumberOptional": "Phone number (optional)",
|
"phoneNumberOptional": "Telefonní číslo (nepovinné)",
|
||||||
"complianceConfirmation": "I confirm that I am in compliance with the Fossorial Commercial License and that reporting inaccurate information or misidentifying use of the product is a violation of the license."
|
"complianceConfirmation": "Potvrzuji, že informace které jsem poskytl jsou přesné a že jsem v souladu s licencí Fossorial Commercial License. Poskutnutí nepřesných informací nebo nesprávné určení použití produktu je porušením licence a může vést ke zrušení platnosti klíče."
|
||||||
},
|
},
|
||||||
"buttons": {
|
"buttons": {
|
||||||
"close": "Close",
|
"close": "Zavřít",
|
||||||
"previous": "Previous",
|
"previous": "Předchozí",
|
||||||
"next": "Next",
|
"next": "Následující",
|
||||||
"generateLicenseKey": "Generate License Key"
|
"generateLicenseKey": "Vygenerovat licenční klíč"
|
||||||
},
|
},
|
||||||
"toasts": {
|
"toasts": {
|
||||||
"success": {
|
"success": {
|
||||||
"title": "License key generated successfully",
|
"title": "Licenční klíč byl úspěšně vytvořen",
|
||||||
"description": "Your license key has been generated and is ready to use."
|
"description": "Váš licenční klíč byl vytvořen a je připraven k použití."
|
||||||
},
|
},
|
||||||
"error": {
|
"error": {
|
||||||
"title": "Failed to generate license key",
|
"title": "Nepodařilo se vytvořit licenční klíč",
|
||||||
"description": "An error occurred while generating the license key."
|
"description": "Při generování licenčního klíče došlo k chybě."
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"priority": "Priorita",
|
"priority": "Priorita",
|
||||||
"priorityDescription": "Vyšší priorita je vyhodnocena jako první. Priorita = 100 znamená automatické řazení (rozhodnutí systému). Pro vynucení manuální priority použijte jiné číslo.",
|
"priorityDescription": "Vyšší priorita je vyhodnocena jako první. Priorita = 100 znamená automatické řazení (rozhodnutí systému). Pro vynucení manuální priority použijte jiné číslo.",
|
||||||
"instanceName": "Instance Name",
|
"instanceName": "Název instance",
|
||||||
"pathMatchModalTitle": "Configure Path Matching",
|
"pathMatchModalTitle": "Nastavit porovnávání cest",
|
||||||
"pathMatchModalDescription": "Set up how incoming requests should be matched based on their path.",
|
"pathMatchModalDescription": "Nastavte jak se bude ověřovat, ze cesty příchozích požadavků se shodují.",
|
||||||
"pathMatchType": "Match Type",
|
"pathMatchType": "Typ shody",
|
||||||
"pathMatchPrefix": "Prefix",
|
"pathMatchPrefix": "Prefix",
|
||||||
"pathMatchExact": "Exact",
|
"pathMatchExact": "Přesná",
|
||||||
"pathMatchRegex": "Regex",
|
"pathMatchRegex": "Regex",
|
||||||
"pathMatchValue": "Path Value",
|
"pathMatchValue": "Hodnota cesty",
|
||||||
"clear": "Clear",
|
"clear": "Smazat",
|
||||||
"saveChanges": "Save Changes",
|
"saveChanges": "Uložit změny",
|
||||||
"pathMatchRegexPlaceholder": "^/api/.*",
|
"pathMatchRegexPlaceholder": "^/api/.*",
|
||||||
"pathMatchDefaultPlaceholder": "/path",
|
"pathMatchDefaultPlaceholder": "/cesta",
|
||||||
"pathMatchPrefixHelp": "Example: /api matches /api, /api/users, etc.",
|
"pathMatchPrefixHelp": "Příklad: /api se shoduje s cestami /api, /api/users atd.",
|
||||||
"pathMatchExactHelp": "Example: /api matches only /api",
|
"pathMatchExactHelp": "Příklad: /api se shoduje pouze s cestou /api",
|
||||||
"pathMatchRegexHelp": "Example: ^/api/.* matches /api/anything",
|
"pathMatchRegexHelp": "Příklad: ^/api/.* se shoduje s /api/cokoliv",
|
||||||
"pathRewriteModalTitle": "Configure Path Rewriting",
|
"pathRewriteModalTitle": "Nastavit přepis cesty",
|
||||||
"pathRewriteModalDescription": "Transform the matched path before forwarding to the target.",
|
"pathRewriteModalDescription": "Upravit shodující se cestu před odesláním požadavku do cíle.",
|
||||||
"pathRewriteType": "Rewrite Type",
|
"pathRewriteType": "Typ přepisu",
|
||||||
"pathRewritePrefixOption": "Prefix - Replace prefix",
|
"pathRewritePrefixOption": "Prefix - Nahradí prefix",
|
||||||
"pathRewriteExactOption": "Exact - Replace entire path",
|
"pathRewriteExactOption": "Přesný - Nahradí celou cestu",
|
||||||
"pathRewriteRegexOption": "Regex - Pattern replacement",
|
"pathRewriteRegexOption": "Regex - Nahrazení pomocí vzorů",
|
||||||
"pathRewriteStripPrefixOption": "Strip Prefix - Remove prefix",
|
"pathRewriteStripPrefixOption": "Odstranit prefix - Odstraní prefix",
|
||||||
"pathRewriteValue": "Rewrite Value",
|
"pathRewriteValue": "Přepisovaná hodnota",
|
||||||
"pathRewriteRegexPlaceholder": "/new/$1",
|
"pathRewriteRegexPlaceholder": "/nová/$1",
|
||||||
"pathRewriteDefaultPlaceholder": "/new-path",
|
"pathRewriteDefaultPlaceholder": "/nová-cesta",
|
||||||
"pathRewritePrefixHelp": "Replace the matched prefix with this value",
|
"pathRewritePrefixHelp": "Nahradit odpovídající prefix touto hodnotou",
|
||||||
"pathRewriteExactHelp": "Replace the entire path with this value when the path matches exactly",
|
"pathRewriteExactHelp": "Nahradit celou cestu touto hodnotou, pokud cesta přesně odpovídá",
|
||||||
"pathRewriteRegexHelp": "Use capture groups like $1, $2 for replacement",
|
"pathRewriteRegexHelp": "K nahrazení použít capture groups jako $1, $2",
|
||||||
"pathRewriteStripPrefixHelp": "Leave empty to strip prefix or provide new prefix",
|
"pathRewriteStripPrefixHelp": "Ponechte prázdné pro odstranění prefixu nebo zadejte nový prefix",
|
||||||
"pathRewritePrefix": "Prefix",
|
"pathRewritePrefix": "Prefix",
|
||||||
"pathRewriteExact": "Exact",
|
"pathRewriteExact": "Přesný",
|
||||||
"pathRewriteRegex": "Regex",
|
"pathRewriteRegex": "Regex",
|
||||||
"pathRewriteStrip": "Strip",
|
"pathRewriteStrip": "Odstranit",
|
||||||
"pathRewriteStripLabel": "strip"
|
"pathRewriteStripLabel": "odstranit",
|
||||||
|
"sidebarEnableEnterpriseLicense": "Použít podnikovou licenci",
|
||||||
|
"cannotbeUndone": "To nelze vrátit zpět.",
|
||||||
|
"toConfirm": "Potvrdit",
|
||||||
|
"deleteClientQuestion": "Jste si jisti, že chcete odstranit klienta z webu a organizace?",
|
||||||
|
"clientMessageRemove": "Po odstranění se klient již nebude moci připojit k webu.",
|
||||||
|
"sidebarLogs": "Logy",
|
||||||
|
"request": "Žádost",
|
||||||
|
"logs": "Logy",
|
||||||
|
"logsSettingsDescription": "Monitorovat logy shromážděné z této orginizace",
|
||||||
|
"searchLogs": "Hledat logy...",
|
||||||
|
"action": "Akce",
|
||||||
|
"actor": "Aktér",
|
||||||
|
"timestamp": "Časové razítko",
|
||||||
|
"accessLogs": "Protokoly přístupu",
|
||||||
|
"exportCsv": "Exportovat CSV",
|
||||||
|
"actorId": "ID aktéra",
|
||||||
|
"allowedByRule": "Povoleno pomocí pravidla",
|
||||||
|
"allowedNoAuth": "Povoleno bez ověření",
|
||||||
|
"validAccessToken": "Platný přístupový token",
|
||||||
|
"validHeaderAuth": "Valid header auth",
|
||||||
|
"validPincode": "Valid Pincode",
|
||||||
|
"validPassword": "Platné heslo",
|
||||||
|
"validEmail": "Valid email",
|
||||||
|
"validSSO": "Valid SSO",
|
||||||
|
"resourceBlocked": "Zablokované zdroje",
|
||||||
|
"droppedByRule": "Zrušeno pravidlem",
|
||||||
|
"noSessions": "Žádné relace",
|
||||||
|
"temporaryRequestToken": "Dočasný požadavek token",
|
||||||
|
"noMoreAuthMethods": "No Valid Auth",
|
||||||
|
"ip": "IP adresa",
|
||||||
|
"reason": "Důvod",
|
||||||
|
"requestLogs": "Záznamy požadavků",
|
||||||
|
"host": "Hostitel",
|
||||||
|
"location": "Poloha",
|
||||||
|
"actionLogs": "Záznamy akcí",
|
||||||
|
"sidebarLogsRequest": "Záznamy požadavků",
|
||||||
|
"sidebarLogsAccess": "Protokoly přístupu",
|
||||||
|
"sidebarLogsAction": "Záznamy akcí",
|
||||||
|
"logRetention": "Zaznamenávání záznamu",
|
||||||
|
"logRetentionDescription": "Spravovat, jak dlouho jsou různé typy logů uloženy pro tuto organizaci nebo je zakázat",
|
||||||
|
"requestLogsDescription": "Zobrazit podrobné protokoly požadavků pro zdroje v této organizaci",
|
||||||
|
"logRetentionRequestLabel": "Zachování logu žádosti",
|
||||||
|
"logRetentionRequestDescription": "Jak dlouho uchovávat záznamy požadavků",
|
||||||
|
"logRetentionAccessLabel": "Zachování záznamu přístupu",
|
||||||
|
"logRetentionAccessDescription": "Jak dlouho uchovávat přístupové záznamy",
|
||||||
|
"logRetentionActionLabel": "Uchovávání protokolu akcí",
|
||||||
|
"logRetentionActionDescription": "Jak dlouho uchovávat záznamy akcí",
|
||||||
|
"logRetentionDisabled": "Zakázáno",
|
||||||
|
"logRetention3Days": "3 dny",
|
||||||
|
"logRetention7Days": "7 dní",
|
||||||
|
"logRetention14Days": "14 dní",
|
||||||
|
"logRetention30Days": "30 dní",
|
||||||
|
"logRetention90Days": "90 dní",
|
||||||
|
"logRetentionForever": "Navždy",
|
||||||
|
"actionLogsDescription": "Zobrazit historii akcí provedených v této organizaci",
|
||||||
|
"accessLogsDescription": "Zobrazit žádosti o ověření přístupu pro zdroje v této organizaci",
|
||||||
|
"licenseRequiredToUse": "Pro použití této funkce je vyžadována licence pro podnikání.",
|
||||||
|
"certResolver": "Oddělovač certifikátů",
|
||||||
|
"certResolverDescription": "Vyberte řešitele certifikátů pro tento dokument.",
|
||||||
|
"selectCertResolver": "Vyberte řešič certifikátů",
|
||||||
|
"enterCustomResolver": "Zadejte vlastní rozlišovač",
|
||||||
|
"preferWildcardCert": "Preferovat Wildcard certifikát",
|
||||||
|
"unverified": "Neověřeno",
|
||||||
|
"domainSetting": "Nastavení domény",
|
||||||
|
"domainSettingDescription": "Konfigurace nastavení pro vaši doménu",
|
||||||
|
"preferWildcardCertDescription": "Pokus o vygenerování zástupného certifikátu (vyžaduje správně nakonfigurovaný certifikát).",
|
||||||
|
"recordName": "Název záznamu",
|
||||||
|
"auto": "Automaticky",
|
||||||
|
"TTL": "TTL",
|
||||||
|
"howToAddRecords": "Jak přidat záznamy",
|
||||||
|
"dnsRecord": "Záznamy DNS",
|
||||||
|
"required": "Požadováno",
|
||||||
|
"domainSettingsUpdated": "Nastavení domény bylo úspěšně aktualizováno",
|
||||||
|
"orgOrDomainIdMissing": "Chybí ID organizace nebo domény",
|
||||||
|
"loadingDNSRecords": "Načítání DNS záznamů...",
|
||||||
|
"olmUpdateAvailableInfo": "Je k dispozici aktualizovaná verze Olm. Pro nejlepší zážitek prosím aktualizujte na nejnovější verzi.",
|
||||||
|
"client": "Zákazník",
|
||||||
|
"proxyProtocol": "Nastavení proxy protokolu",
|
||||||
|
"proxyProtocolDescription": "Konfigurace Proxy protokolu pro zachování klientských IP adres pro služby TCP/UDP.",
|
||||||
|
"enableProxyProtocol": "Povolit Proxy protokol",
|
||||||
|
"proxyProtocolInfo": "Zachovat IP adresy klienta pro TCP/UDP backends",
|
||||||
|
"proxyProtocolVersion": "Verze proxy protokolu",
|
||||||
|
"version1": " Verze 1 (doporučeno)",
|
||||||
|
"version2": "Verze 2",
|
||||||
|
"versionDescription": "Verze 1 je textová a široce podporovaná. Verze 2 je binární a efektivnější, ale méně kompatibilní.",
|
||||||
|
"warning": "Varování",
|
||||||
|
"proxyProtocolWarning": "Vaše backend aplikace musí být nakonfigurována, aby mohla být přijata spojení s Proxy protokolem. Pokud vaše backend nepodporuje Proxy protokol, povolením tohoto protokolu dojde k přerušení všech připojení. Ujistěte se, že nastavíte svou backend a důvěřujte hlavičkám Proxy protokolu z Traefik.",
|
||||||
|
"restarting": "Restartování...",
|
||||||
|
"manual": "Ruční",
|
||||||
|
"messageSupport": "Podpora zpráv",
|
||||||
|
"supportNotAvailableTitle": "Podpora není k dispozici",
|
||||||
|
"supportNotAvailableDescription": "Podpora není momentálně k dispozici. Můžete poslat e-mail na support@pangolin.net.",
|
||||||
|
"supportRequestSentTitle": "Žádost o podporu odeslána",
|
||||||
|
"supportRequestSentDescription": "Vaše zpráva byla úspěšně odeslána.",
|
||||||
|
"supportRequestFailedTitle": "Nepodařilo se odeslat žádost",
|
||||||
|
"supportRequestFailedDescription": "Při odesílání vaší žádosti o podporu došlo k chybě.",
|
||||||
|
"supportSubjectRequired": "Předmět je povinný",
|
||||||
|
"supportSubjectMaxLength": "Předmět musí být 255 znaků nebo méně",
|
||||||
|
"supportMessageRequired": "Je vyžadována zpráva",
|
||||||
|
"supportReplyTo": "Odpovědět na",
|
||||||
|
"supportSubject": "Předmět",
|
||||||
|
"supportSubjectPlaceholder": "Zadejte předmět",
|
||||||
|
"supportMessage": "Zpráva",
|
||||||
|
"supportMessagePlaceholder": "Zadejte svou zprávu",
|
||||||
|
"supportSending": "Odesílání...",
|
||||||
|
"supportSend": "Poslat",
|
||||||
|
"supportMessageSent": "Zpráva odeslána!",
|
||||||
|
"supportWillContact": "Brzy budeme v kontaktu!"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -10,7 +10,7 @@
|
|||||||
"setupErrorIdentifier": "Organisations-ID ist bereits vergeben. Bitte wähle eine andere.",
|
"setupErrorIdentifier": "Organisations-ID ist bereits vergeben. Bitte wähle eine andere.",
|
||||||
"componentsErrorNoMemberCreate": "Du bist derzeit kein Mitglied einer Organisation. Erstelle eine Organisation, um zu starten.",
|
"componentsErrorNoMemberCreate": "Du bist derzeit kein Mitglied einer Organisation. Erstelle eine Organisation, um zu starten.",
|
||||||
"componentsErrorNoMember": "Du bist aktuell kein Mitglied einer Organisation.",
|
"componentsErrorNoMember": "Du bist aktuell kein Mitglied einer Organisation.",
|
||||||
"welcome": "Willkommen zu Pangolin",
|
"welcome": "Willkommen bei Pangolin!",
|
||||||
"welcomeTo": "Willkommen bei",
|
"welcomeTo": "Willkommen bei",
|
||||||
"componentsCreateOrg": "Erstelle eine Organisation",
|
"componentsCreateOrg": "Erstelle eine Organisation",
|
||||||
"componentsMember": "Du bist Mitglied von {count, plural, =0 {keiner Organisation} one {einer Organisation} other {# Organisationen}}.",
|
"componentsMember": "Du bist Mitglied von {count, plural, =0 {keiner Organisation} one {einer Organisation} other {# Organisationen}}.",
|
||||||
@@ -27,7 +27,7 @@
|
|||||||
"inviteLogInOtherUser": "Als anderer Benutzer anmelden",
|
"inviteLogInOtherUser": "Als anderer Benutzer anmelden",
|
||||||
"createAnAccount": "Konto erstellen",
|
"createAnAccount": "Konto erstellen",
|
||||||
"inviteNotAccepted": "Einladung nicht angenommen",
|
"inviteNotAccepted": "Einladung nicht angenommen",
|
||||||
"authCreateAccount": "Erstellen ein Konto um loszulegen",
|
"authCreateAccount": "Erstelle ein Konto um loszulegen",
|
||||||
"authNoAccount": "Du besitzt noch kein Konto?",
|
"authNoAccount": "Du besitzt noch kein Konto?",
|
||||||
"email": "E-Mail",
|
"email": "E-Mail",
|
||||||
"password": "Passwort",
|
"password": "Passwort",
|
||||||
@@ -47,9 +47,8 @@
|
|||||||
"edit": "Bearbeiten",
|
"edit": "Bearbeiten",
|
||||||
"siteConfirmDelete": "Standort löschen bestätigen",
|
"siteConfirmDelete": "Standort löschen bestätigen",
|
||||||
"siteDelete": "Standort löschen",
|
"siteDelete": "Standort löschen",
|
||||||
"siteMessageRemove": "Sobald dieser Standort entfernt ist, wird er nicht mehr zugänglich sein. Alle Ressourcen und Ziele, die mit diesem Standort verbunden sind, werden ebenfalls entfernt.",
|
"siteMessageRemove": "Sobald die Site entfernt ist, wird sie nicht mehr zugänglich sein. Alle mit der Site verbundenen Ziele werden ebenfalls entfernt.",
|
||||||
"siteMessageConfirm": "Um zu bestätigen, gib den Namen des Standortes unten ein.",
|
"siteQuestionRemove": "Sind Sie sicher, dass Sie die Site aus der Organisation entfernen möchten?",
|
||||||
"siteQuestionRemove": "Bist du sicher, dass der Standort {selectedSite} aus der Organisation entfernt werden soll?",
|
|
||||||
"siteManageSites": "Standorte verwalten",
|
"siteManageSites": "Standorte verwalten",
|
||||||
"siteDescription": "Verbindung zum Netzwerk durch sichere Tunnel erlauben",
|
"siteDescription": "Verbindung zum Netzwerk durch sichere Tunnel erlauben",
|
||||||
"siteCreate": "Standort erstellen",
|
"siteCreate": "Standort erstellen",
|
||||||
@@ -64,7 +63,7 @@
|
|||||||
"siteLearnNewt": "Wie du Newt auf deinem System installieren kannst",
|
"siteLearnNewt": "Wie du Newt auf deinem System installieren kannst",
|
||||||
"siteSeeConfigOnce": "Du kannst die Konfiguration nur einmalig ansehen.",
|
"siteSeeConfigOnce": "Du kannst die Konfiguration nur einmalig ansehen.",
|
||||||
"siteLoadWGConfig": "Lade WireGuard Konfiguration...",
|
"siteLoadWGConfig": "Lade WireGuard Konfiguration...",
|
||||||
"siteDocker": "Erweitern für Docker Details",
|
"siteDocker": "Docker-Details anzeigen",
|
||||||
"toggle": "Umschalten",
|
"toggle": "Umschalten",
|
||||||
"dockerCompose": "Docker Compose",
|
"dockerCompose": "Docker Compose",
|
||||||
"dockerRun": "Docker Run",
|
"dockerRun": "Docker Run",
|
||||||
@@ -96,7 +95,7 @@
|
|||||||
"siteWgDescription": "Verwende jeden WireGuard-Client, um einen Tunnel einzurichten. Manuelles NAT-Setup erforderlich.",
|
"siteWgDescription": "Verwende jeden WireGuard-Client, um einen Tunnel einzurichten. Manuelles NAT-Setup erforderlich.",
|
||||||
"siteWgDescriptionSaas": "Verwenden Sie jeden WireGuard-Client, um einen Tunnel zu erstellen. Manuelles NAT-Setup erforderlich. FUNKTIONIERT NUR BEI SELBSTGEHOSTETEN KNOTEN",
|
"siteWgDescriptionSaas": "Verwenden Sie jeden WireGuard-Client, um einen Tunnel zu erstellen. Manuelles NAT-Setup erforderlich. FUNKTIONIERT NUR BEI SELBSTGEHOSTETEN KNOTEN",
|
||||||
"siteLocalDescription": "Nur lokale Ressourcen. Kein Tunneling.",
|
"siteLocalDescription": "Nur lokale Ressourcen. Kein Tunneling.",
|
||||||
"siteLocalDescriptionSaas": "Local resources only. No tunneling. Only available on remote nodes.",
|
"siteLocalDescriptionSaas": "Nur lokale Ressourcen. Kein Tunneling. Nur für entfernte Knoten verfügbar.",
|
||||||
"siteSeeAll": "Alle Standorte anzeigen",
|
"siteSeeAll": "Alle Standorte anzeigen",
|
||||||
"siteTunnelDescription": "Lege fest, wie du dich mit deinem Standort verbinden möchtest",
|
"siteTunnelDescription": "Lege fest, wie du dich mit deinem Standort verbinden möchtest",
|
||||||
"siteNewtCredentials": "Neue Newt Zugangsdaten",
|
"siteNewtCredentials": "Neue Newt Zugangsdaten",
|
||||||
@@ -119,7 +118,7 @@
|
|||||||
"tokenId": "Token-ID",
|
"tokenId": "Token-ID",
|
||||||
"requestHeades": "Anfrage-Header",
|
"requestHeades": "Anfrage-Header",
|
||||||
"queryParameter": "Abfrageparameter",
|
"queryParameter": "Abfrageparameter",
|
||||||
"importantNote": "Wichtige Notiz",
|
"importantNote": "Wichtiger Hinweis",
|
||||||
"shareImportantDescription": "Aus Sicherheitsgründen wird die Verwendung von Headern über Abfrageparameter empfohlen, wenn möglich, da Abfrageparameter in Server-Logs oder Browserverlauf protokolliert werden können.",
|
"shareImportantDescription": "Aus Sicherheitsgründen wird die Verwendung von Headern über Abfrageparameter empfohlen, wenn möglich, da Abfrageparameter in Server-Logs oder Browserverlauf protokolliert werden können.",
|
||||||
"token": "Token",
|
"token": "Token",
|
||||||
"shareTokenSecurety": "Halten Sie Ihr Zugangs-Token sicher. Teilen Sie es nicht in öffentlich zugänglichen Bereichen oder Client-seitigem Code.",
|
"shareTokenSecurety": "Halten Sie Ihr Zugangs-Token sicher. Teilen Sie es nicht in öffentlich zugänglichen Bereichen oder Client-seitigem Code.",
|
||||||
@@ -132,7 +131,7 @@
|
|||||||
"expireIn": "Verfällt in",
|
"expireIn": "Verfällt in",
|
||||||
"neverExpire": "Nie ablaufen",
|
"neverExpire": "Nie ablaufen",
|
||||||
"shareExpireDescription": "Ablaufzeit ist, wie lange der Link verwendet werden kann und bietet Zugriff auf die Ressource. Nach dieser Zeit wird der Link nicht mehr funktionieren und Benutzer, die diesen Link benutzt haben, verlieren den Zugriff auf die Ressource.",
|
"shareExpireDescription": "Ablaufzeit ist, wie lange der Link verwendet werden kann und bietet Zugriff auf die Ressource. Nach dieser Zeit wird der Link nicht mehr funktionieren und Benutzer, die diesen Link benutzt haben, verlieren den Zugriff auf die Ressource.",
|
||||||
"shareSeeOnce": "Sie können diese Linie nur sehen. Bitte kopieren Sie sie.",
|
"shareSeeOnce": "Sie können diesen Link nur ein einziges Mal sehen. Bitte kopieren Sie ihn.",
|
||||||
"shareAccessHint": "Jeder mit diesem Link kann auf die Ressource zugreifen. Teilen Sie sie mit Vorsicht.",
|
"shareAccessHint": "Jeder mit diesem Link kann auf die Ressource zugreifen. Teilen Sie sie mit Vorsicht.",
|
||||||
"shareTokenUsage": "Zugriffstoken-Nutzung anzeigen",
|
"shareTokenUsage": "Zugriffstoken-Nutzung anzeigen",
|
||||||
"createLink": "Link erstellen",
|
"createLink": "Link erstellen",
|
||||||
@@ -154,11 +153,10 @@
|
|||||||
"protected": "Geschützt",
|
"protected": "Geschützt",
|
||||||
"notProtected": "Nicht geschützt",
|
"notProtected": "Nicht geschützt",
|
||||||
"resourceMessageRemove": "Einmal entfernt, wird die Ressource nicht mehr zugänglich sein. Alle mit der Ressource verbundenen Ziele werden ebenfalls entfernt.",
|
"resourceMessageRemove": "Einmal entfernt, wird die Ressource nicht mehr zugänglich sein. Alle mit der Ressource verbundenen Ziele werden ebenfalls entfernt.",
|
||||||
"resourceMessageConfirm": "Um zu bestätigen, geben Sie bitte den Namen der Ressource unten ein.",
|
"resourceQuestionRemove": "Sind Sie sicher, dass Sie die Ressource aus der Organisation entfernen möchten?",
|
||||||
"resourceQuestionRemove": "Sind Sie sicher, dass Sie die Ressource {selectedResource} aus der Organisation entfernen möchten?",
|
|
||||||
"resourceHTTP": "HTTPS-Ressource",
|
"resourceHTTP": "HTTPS-Ressource",
|
||||||
"resourceHTTPDescription": "Proxy-Anfragen an Ihre App über HTTPS unter Verwendung einer Subdomain oder einer Basis-Domain.",
|
"resourceHTTPDescription": "Proxy-Anfragen an Ihre App über HTTPS unter Verwendung einer Subdomain oder einer Basis-Domain.",
|
||||||
"resourceRaw": "Rohe TCP/UDP Ressource",
|
"resourceRaw": "Direkte TCP/UDP Ressource (raw)",
|
||||||
"resourceRawDescription": "Proxy-Anfragen an Ihre App über TCP/UDP mit einer Portnummer.",
|
"resourceRawDescription": "Proxy-Anfragen an Ihre App über TCP/UDP mit einer Portnummer.",
|
||||||
"resourceCreate": "Ressource erstellen",
|
"resourceCreate": "Ressource erstellen",
|
||||||
"resourceCreateDescription": "Folgen Sie den Schritten unten, um eine neue Ressource zu erstellen",
|
"resourceCreateDescription": "Folgen Sie den Schritten unten, um eine neue Ressource zu erstellen",
|
||||||
@@ -176,10 +174,10 @@
|
|||||||
"resourceTypeDescription": "Legen Sie fest, wie Sie auf Ihre Ressource zugreifen möchten",
|
"resourceTypeDescription": "Legen Sie fest, wie Sie auf Ihre Ressource zugreifen möchten",
|
||||||
"resourceHTTPSSettings": "HTTPS-Einstellungen",
|
"resourceHTTPSSettings": "HTTPS-Einstellungen",
|
||||||
"resourceHTTPSSettingsDescription": "Konfigurieren Sie den Zugriff auf Ihre Ressource über HTTPS",
|
"resourceHTTPSSettingsDescription": "Konfigurieren Sie den Zugriff auf Ihre Ressource über HTTPS",
|
||||||
"domainType": "Domänentyp",
|
"domainType": "Domain-Typ",
|
||||||
"subdomain": "Subdomain",
|
"subdomain": "Subdomain",
|
||||||
"baseDomain": "Basisdomäne",
|
"baseDomain": "Basis-Domain",
|
||||||
"subdomnainDescription": "Die Subdomäne, auf die Ihre Ressource zugegriffen werden soll.",
|
"subdomnainDescription": "Die Subdomain, auf der Ihre Ressource erreichbar sein soll.",
|
||||||
"resourceRawSettings": "TCP/UDP Einstellungen",
|
"resourceRawSettings": "TCP/UDP Einstellungen",
|
||||||
"resourceRawSettingsDescription": "Konfigurieren Sie den Zugriff auf Ihre Ressource über TCP/UDP",
|
"resourceRawSettingsDescription": "Konfigurieren Sie den Zugriff auf Ihre Ressource über TCP/UDP",
|
||||||
"protocol": "Protokoll",
|
"protocol": "Protokoll",
|
||||||
@@ -190,7 +188,7 @@
|
|||||||
"resourceConfig": "Konfiguration Snippets",
|
"resourceConfig": "Konfiguration Snippets",
|
||||||
"resourceConfigDescription": "Kopieren und fügen Sie diese Konfigurations-Snippets ein, um Ihre TCP/UDP Ressource einzurichten",
|
"resourceConfigDescription": "Kopieren und fügen Sie diese Konfigurations-Snippets ein, um Ihre TCP/UDP Ressource einzurichten",
|
||||||
"resourceAddEntrypoints": "Traefik: Einstiegspunkte hinzufügen",
|
"resourceAddEntrypoints": "Traefik: Einstiegspunkte hinzufügen",
|
||||||
"resourceExposePorts": "Gerbil: Ports im Docker Compose ausblenden",
|
"resourceExposePorts": "Gerbil: Ports im Docker Compose freigeben",
|
||||||
"resourceLearnRaw": "Lernen Sie, wie Sie TCP/UDP Ressourcen konfigurieren",
|
"resourceLearnRaw": "Lernen Sie, wie Sie TCP/UDP Ressourcen konfigurieren",
|
||||||
"resourceBack": "Zurück zu den Ressourcen",
|
"resourceBack": "Zurück zu den Ressourcen",
|
||||||
"resourceGoTo": "Zu Ressource gehen",
|
"resourceGoTo": "Zu Ressource gehen",
|
||||||
@@ -220,7 +218,7 @@
|
|||||||
"orgDeleteConfirm": "Organisation löschen bestätigen",
|
"orgDeleteConfirm": "Organisation löschen bestätigen",
|
||||||
"orgMessageRemove": "Diese Aktion ist unwiderruflich und löscht alle zugehörigen Daten.",
|
"orgMessageRemove": "Diese Aktion ist unwiderruflich und löscht alle zugehörigen Daten.",
|
||||||
"orgMessageConfirm": "Um zu bestätigen, geben Sie bitte den Namen der Organisation unten ein.",
|
"orgMessageConfirm": "Um zu bestätigen, geben Sie bitte den Namen der Organisation unten ein.",
|
||||||
"orgQuestionRemove": "Sind Sie sicher, dass Sie die Organisation {selectedOrg} entfernen möchten?",
|
"orgQuestionRemove": "Sind Sie sicher, dass Sie die Organisation entfernen möchten?",
|
||||||
"orgUpdated": "Organisation aktualisiert",
|
"orgUpdated": "Organisation aktualisiert",
|
||||||
"orgUpdatedDescription": "Die Organisation wurde aktualisiert.",
|
"orgUpdatedDescription": "Die Organisation wurde aktualisiert.",
|
||||||
"orgErrorUpdate": "Fehler beim Aktualisieren der Organisation",
|
"orgErrorUpdate": "Fehler beim Aktualisieren der Organisation",
|
||||||
@@ -287,9 +285,8 @@
|
|||||||
"apiKeysAdd": "API-Schlüssel generieren",
|
"apiKeysAdd": "API-Schlüssel generieren",
|
||||||
"apiKeysErrorDelete": "Fehler beim Löschen des API-Schlüssels",
|
"apiKeysErrorDelete": "Fehler beim Löschen des API-Schlüssels",
|
||||||
"apiKeysErrorDeleteMessage": "Fehler beim Löschen des API-Schlüssels",
|
"apiKeysErrorDeleteMessage": "Fehler beim Löschen des API-Schlüssels",
|
||||||
"apiKeysQuestionRemove": "Sind Sie sicher, dass Sie den API-Schlüssel {selectedApiKey} aus der Organisation entfernen möchten?",
|
"apiKeysQuestionRemove": "Sind Sie sicher, dass Sie den API-Schlüssel aus der Organisation entfernen möchten?",
|
||||||
"apiKeysMessageRemove": "Einmal entfernt, kann der API-Schlüssel nicht mehr verwendet werden.",
|
"apiKeysMessageRemove": "Einmal entfernt, kann der API-Schlüssel nicht mehr verwendet werden.",
|
||||||
"apiKeysMessageConfirm": "Zur Bestätigung geben Sie bitte den Namen des API-Schlüssels unten ein.",
|
|
||||||
"apiKeysDeleteConfirm": "Löschen des API-Schlüssels bestätigen",
|
"apiKeysDeleteConfirm": "Löschen des API-Schlüssels bestätigen",
|
||||||
"apiKeysDelete": "API-Schlüssel löschen",
|
"apiKeysDelete": "API-Schlüssel löschen",
|
||||||
"apiKeysManage": "API-Schlüssel verwalten",
|
"apiKeysManage": "API-Schlüssel verwalten",
|
||||||
@@ -305,8 +302,7 @@
|
|||||||
"userDeleteConfirm": "Benutzer löschen bestätigen",
|
"userDeleteConfirm": "Benutzer löschen bestätigen",
|
||||||
"userDeleteServer": "Benutzer vom Server löschen",
|
"userDeleteServer": "Benutzer vom Server löschen",
|
||||||
"userMessageRemove": "Der Benutzer wird von allen Organisationen entfernt und vollständig vom Server entfernt.",
|
"userMessageRemove": "Der Benutzer wird von allen Organisationen entfernt und vollständig vom Server entfernt.",
|
||||||
"userMessageConfirm": "Um zu bestätigen, geben Sie bitte den Namen des Benutzers unten ein.",
|
"userQuestionRemove": "Sind Sie sicher, dass Sie den Benutzer dauerhaft vom Server löschen möchten?",
|
||||||
"userQuestionRemove": "Sind Sie sicher, dass Sie {selectedUser} dauerhaft vom Server löschen möchten?",
|
|
||||||
"licenseKey": "Lizenzschlüssel",
|
"licenseKey": "Lizenzschlüssel",
|
||||||
"valid": "Gültig",
|
"valid": "Gültig",
|
||||||
"numberOfSites": "Anzahl der Standorte",
|
"numberOfSites": "Anzahl der Standorte",
|
||||||
@@ -339,7 +335,7 @@
|
|||||||
"fossorialLicense": "Fossorial Gewerbelizenz & Abonnementbedingungen anzeigen",
|
"fossorialLicense": "Fossorial Gewerbelizenz & Abonnementbedingungen anzeigen",
|
||||||
"licenseMessageRemove": "Dadurch werden der Lizenzschlüssel und alle zugehörigen Berechtigungen entfernt.",
|
"licenseMessageRemove": "Dadurch werden der Lizenzschlüssel und alle zugehörigen Berechtigungen entfernt.",
|
||||||
"licenseMessageConfirm": "Um zu bestätigen, geben Sie bitte den Lizenzschlüssel unten ein.",
|
"licenseMessageConfirm": "Um zu bestätigen, geben Sie bitte den Lizenzschlüssel unten ein.",
|
||||||
"licenseQuestionRemove": "Sind Sie sicher, dass Sie den Lizenzschlüssel {selectedKey} löschen möchten?",
|
"licenseQuestionRemove": "Sind Sie sicher, dass Sie den Lizenzschlüssel löschen möchten?",
|
||||||
"licenseKeyDelete": "Lizenzschlüssel löschen",
|
"licenseKeyDelete": "Lizenzschlüssel löschen",
|
||||||
"licenseKeyDeleteConfirm": "Lizenzschlüssel löschen bestätigen",
|
"licenseKeyDeleteConfirm": "Lizenzschlüssel löschen bestätigen",
|
||||||
"licenseTitle": "Lizenzstatus verwalten",
|
"licenseTitle": "Lizenzstatus verwalten",
|
||||||
@@ -372,7 +368,7 @@
|
|||||||
"inviteRemoveErrorDescription": "Beim Entfernen der Einladung ist ein Fehler aufgetreten.",
|
"inviteRemoveErrorDescription": "Beim Entfernen der Einladung ist ein Fehler aufgetreten.",
|
||||||
"inviteRemoved": "Einladung entfernt",
|
"inviteRemoved": "Einladung entfernt",
|
||||||
"inviteRemovedDescription": "Die Einladung für {email} wurde entfernt.",
|
"inviteRemovedDescription": "Die Einladung für {email} wurde entfernt.",
|
||||||
"inviteQuestionRemove": "Sind Sie sicher, dass Sie die Einladung {email} entfernen möchten?",
|
"inviteQuestionRemove": "Sind Sie sicher, dass Sie die Einladung entfernen möchten?",
|
||||||
"inviteMessageRemove": "Sobald entfernt, wird diese Einladung nicht mehr gültig sein. Sie können den Benutzer später jederzeit erneut einladen.",
|
"inviteMessageRemove": "Sobald entfernt, wird diese Einladung nicht mehr gültig sein. Sie können den Benutzer später jederzeit erneut einladen.",
|
||||||
"inviteMessageConfirm": "Bitte geben Sie zur Bestätigung die E-Mail-Adresse der Einladung unten ein.",
|
"inviteMessageConfirm": "Bitte geben Sie zur Bestätigung die E-Mail-Adresse der Einladung unten ein.",
|
||||||
"inviteQuestionRegenerate": "Sind Sie sicher, dass Sie die Einladung {email} neu generieren möchten? Dies wird die vorherige Einladung widerrufen.",
|
"inviteQuestionRegenerate": "Sind Sie sicher, dass Sie die Einladung {email} neu generieren möchten? Dies wird die vorherige Einladung widerrufen.",
|
||||||
@@ -398,9 +394,8 @@
|
|||||||
"userErrorOrgRemoveDescription": "Beim Entfernen des Benutzers ist ein Fehler aufgetreten.",
|
"userErrorOrgRemoveDescription": "Beim Entfernen des Benutzers ist ein Fehler aufgetreten.",
|
||||||
"userOrgRemoved": "Benutzer entfernt",
|
"userOrgRemoved": "Benutzer entfernt",
|
||||||
"userOrgRemovedDescription": "Der Benutzer {email} wurde aus der Organisation entfernt.",
|
"userOrgRemovedDescription": "Der Benutzer {email} wurde aus der Organisation entfernt.",
|
||||||
"userQuestionOrgRemove": "Sind Sie sicher, dass Sie {email} aus der Organisation entfernen möchten?",
|
"userQuestionOrgRemove": "Sind Sie sicher, dass Sie diesen Benutzer aus der Organisation entfernen möchten?",
|
||||||
"userMessageOrgRemove": "Nach dem Entfernen hat dieser Benutzer keinen Zugriff mehr auf die Organisation. Sie können ihn später jederzeit wieder einladen, aber er muss die Einladung erneut annehmen.",
|
"userMessageOrgRemove": "Nach dem Entfernen hat dieser Benutzer keinen Zugriff mehr auf die Organisation. Sie können ihn später jederzeit wieder einladen, aber er muss die Einladung erneut annehmen.",
|
||||||
"userMessageOrgConfirm": "Geben Sie zur Bestätigung den Namen des Benutzers unten ein.",
|
|
||||||
"userRemoveOrgConfirm": "Entfernen des Benutzers bestätigen",
|
"userRemoveOrgConfirm": "Entfernen des Benutzers bestätigen",
|
||||||
"userRemoveOrg": "Benutzer aus der Organisation entfernen",
|
"userRemoveOrg": "Benutzer aus der Organisation entfernen",
|
||||||
"users": "Benutzer",
|
"users": "Benutzer",
|
||||||
@@ -466,8 +461,8 @@
|
|||||||
"accessUsersRolesDescription": "Laden Sie Benutzer ein und fügen Sie sie zu Rollen hinzu, um den Zugriff auf Ihre Organisation zu verwalten",
|
"accessUsersRolesDescription": "Laden Sie Benutzer ein und fügen Sie sie zu Rollen hinzu, um den Zugriff auf Ihre Organisation zu verwalten",
|
||||||
"key": "Schlüssel",
|
"key": "Schlüssel",
|
||||||
"createdAt": "Erstellt am",
|
"createdAt": "Erstellt am",
|
||||||
"proxyErrorInvalidHeader": "Ungültiger benutzerdefinierter Host-Header-Wert. Verwenden Sie das Domänennamensformat oder speichern Sie leer, um den benutzerdefinierten Host-Header zu deaktivieren.",
|
"proxyErrorInvalidHeader": "Ungültiger benutzerdefinierter Host-Header-Wert. Verwenden Sie das Domain-Namensformat oder speichern Sie leer, um den benutzerdefinierten Host-Header zu deaktivieren.",
|
||||||
"proxyErrorTls": "Ungültiger TLS-Servername. Verwenden Sie das Domänennamensformat oder speichern Sie leer, um den TLS-Servernamen zu entfernen.",
|
"proxyErrorTls": "Ungültiger TLS-Servername. Verwenden Sie das Domain-Namensformat oder speichern Sie leer, um den TLS-Servernamen zu entfernen.",
|
||||||
"proxyEnableSSL": "SSL aktivieren",
|
"proxyEnableSSL": "SSL aktivieren",
|
||||||
"proxyEnableSSLDescription": "Aktiviere SSL/TLS-Verschlüsselung für sichere HTTPS-Verbindungen zu deinen Zielen.",
|
"proxyEnableSSLDescription": "Aktiviere SSL/TLS-Verschlüsselung für sichere HTTPS-Verbindungen zu deinen Zielen.",
|
||||||
"target": "Target",
|
"target": "Target",
|
||||||
@@ -531,7 +526,7 @@
|
|||||||
"ipAddressErrorInvalidFormat": "Ungültiges IP-Adressformat",
|
"ipAddressErrorInvalidFormat": "Ungültiges IP-Adressformat",
|
||||||
"ipAddressErrorInvalidOctet": "Ungültiges IP-Adress-Oktett",
|
"ipAddressErrorInvalidOctet": "Ungültiges IP-Adress-Oktett",
|
||||||
"path": "Pfad",
|
"path": "Pfad",
|
||||||
"matchPath": "Spielpfad",
|
"matchPath": "Match-Pfad",
|
||||||
"ipAddressRange": "IP-Bereich",
|
"ipAddressRange": "IP-Bereich",
|
||||||
"rulesErrorFetch": "Fehler beim Abrufen der Regeln",
|
"rulesErrorFetch": "Fehler beim Abrufen der Regeln",
|
||||||
"rulesErrorFetchDescription": "Beim Abrufen der Regeln ist ein Fehler aufgetreten",
|
"rulesErrorFetchDescription": "Beim Abrufen der Regeln ist ein Fehler aufgetreten",
|
||||||
@@ -591,7 +586,7 @@
|
|||||||
"none": "Keine",
|
"none": "Keine",
|
||||||
"unknown": "Unbekannt",
|
"unknown": "Unbekannt",
|
||||||
"resources": "Ressourcen",
|
"resources": "Ressourcen",
|
||||||
"resourcesDescription": "Ressourcen sind Proxies zu Anwendungen in Ihrem privaten Netzwerk. Erstellen Sie eine Ressource für jeden HTTP/HTTPS- oder rohen TCP/UDP-Dienst in Ihrem privaten Netzwerk. Jede Ressource muss mit einer Site verbunden sein, um private, sichere Konnektivität über einen verschlüsselten WireGuard-Tunnel zu ermöglichen.",
|
"resourcesDescription": "Ressourcen sind Proxies zu Anwendungen in Ihrem privaten Netzwerk. Erstellen Sie eine Ressource für jeden HTTP/HTTPS- oder direkten TCP/UDP-Dienst in Ihrem privaten Netzwerk. Jede Ressource muss mit einer Site verbunden sein, um private, sichere Konnektivität über einen verschlüsselten WireGuard-Tunnel zu ermöglichen.",
|
||||||
"resourcesWireGuardConnect": "Sichere Verbindung mit WireGuard-Verschlüsselung",
|
"resourcesWireGuardConnect": "Sichere Verbindung mit WireGuard-Verschlüsselung",
|
||||||
"resourcesMultipleAuthenticationMethods": "Mehrere Authentifizierungsmethoden konfigurieren",
|
"resourcesMultipleAuthenticationMethods": "Mehrere Authentifizierungsmethoden konfigurieren",
|
||||||
"resourcesUsersRolesAccess": "Benutzer- und rollenbasierte Zugriffskontrolle",
|
"resourcesUsersRolesAccess": "Benutzer- und rollenbasierte Zugriffskontrolle",
|
||||||
@@ -730,7 +725,7 @@
|
|||||||
"pangolinServerAdmin": "Server-Admin - Pangolin",
|
"pangolinServerAdmin": "Server-Admin - Pangolin",
|
||||||
"licenseTierProfessional": "Professional Lizenz",
|
"licenseTierProfessional": "Professional Lizenz",
|
||||||
"licenseTierEnterprise": "Enterprise Lizenz",
|
"licenseTierEnterprise": "Enterprise Lizenz",
|
||||||
"licenseTierPersonal": "Personal License",
|
"licenseTierPersonal": "Persönliche Lizenz",
|
||||||
"licensed": "Lizenziert",
|
"licensed": "Lizenziert",
|
||||||
"yes": "Ja",
|
"yes": "Ja",
|
||||||
"no": "Nein",
|
"no": "Nein",
|
||||||
@@ -742,7 +737,7 @@
|
|||||||
"idpManageDescription": "Identitätsanbieter im System anzeigen und verwalten",
|
"idpManageDescription": "Identitätsanbieter im System anzeigen und verwalten",
|
||||||
"idpDeletedDescription": "Identitätsanbieter erfolgreich gelöscht",
|
"idpDeletedDescription": "Identitätsanbieter erfolgreich gelöscht",
|
||||||
"idpOidc": "OAuth2/OIDC",
|
"idpOidc": "OAuth2/OIDC",
|
||||||
"idpQuestionRemove": "Sind Sie sicher, dass Sie den Identitätsanbieter {name} dauerhaft löschen möchten?",
|
"idpQuestionRemove": "Sind Sie sicher, dass Sie den Identitätsanbieter dauerhaft löschen möchten?",
|
||||||
"idpMessageRemove": "Dies wird den Identitätsanbieter und alle zugehörigen Konfigurationen entfernen. Benutzer, die sich über diesen Anbieter authentifizieren, können sich nicht mehr anmelden.",
|
"idpMessageRemove": "Dies wird den Identitätsanbieter und alle zugehörigen Konfigurationen entfernen. Benutzer, die sich über diesen Anbieter authentifizieren, können sich nicht mehr anmelden.",
|
||||||
"idpMessageConfirm": "Bitte geben Sie zur Bestätigung den Namen des Identitätsanbieters unten ein.",
|
"idpMessageConfirm": "Bitte geben Sie zur Bestätigung den Namen des Identitätsanbieters unten ein.",
|
||||||
"idpConfirmDelete": "Löschen des Identitätsanbieters bestätigen",
|
"idpConfirmDelete": "Löschen des Identitätsanbieters bestätigen",
|
||||||
@@ -916,6 +911,18 @@
|
|||||||
"passwordResetCodeDescription": "Prüfen Sie Ihre E-Mail für den Reset-Code.",
|
"passwordResetCodeDescription": "Prüfen Sie Ihre E-Mail für den Reset-Code.",
|
||||||
"passwordNew": "Neues Passwort",
|
"passwordNew": "Neues Passwort",
|
||||||
"passwordNewConfirm": "Neues Passwort bestätigen",
|
"passwordNewConfirm": "Neues Passwort bestätigen",
|
||||||
|
"changePassword": "Passwort ändern",
|
||||||
|
"changePasswordDescription": "Passwort des Kontos aktualisieren",
|
||||||
|
"oldPassword": "Aktuelles Passwort",
|
||||||
|
"newPassword": "Neues Passwort",
|
||||||
|
"confirmNewPassword": "Neues Passwort bestätigen",
|
||||||
|
"changePasswordError": "Fehler beim Ändern des Passworts",
|
||||||
|
"changePasswordErrorDescription": "Fehler beim Ändern Ihres Passworts",
|
||||||
|
"changePasswordSuccess": "Passwort erfolgreich geändert",
|
||||||
|
"changePasswordSuccessDescription": "Ihr Passwort wurde erfolgreich aktualisiert",
|
||||||
|
"passwordExpiryRequired": "Passwortablauf erforderlich",
|
||||||
|
"passwordExpiryDescription": "Diese Organisation erfordert, dass Sie Ihr Passwort alle {maxDays} Tage ändern.",
|
||||||
|
"changePasswordNow": "Passwort jetzt ändern",
|
||||||
"pincodeAuth": "Authentifizierungscode",
|
"pincodeAuth": "Authentifizierungscode",
|
||||||
"pincodeSubmit2": "Code absenden",
|
"pincodeSubmit2": "Code absenden",
|
||||||
"passwordResetSubmit": "Zurücksetzung anfordern",
|
"passwordResetSubmit": "Zurücksetzung anfordern",
|
||||||
@@ -1009,7 +1016,7 @@
|
|||||||
"actionUpdateUser": "Benutzer aktualisieren",
|
"actionUpdateUser": "Benutzer aktualisieren",
|
||||||
"actionGetUser": "Benutzer abrufen",
|
"actionGetUser": "Benutzer abrufen",
|
||||||
"actionGetOrgUser": "Organisationsbenutzer abrufen",
|
"actionGetOrgUser": "Organisationsbenutzer abrufen",
|
||||||
"actionListOrgDomains": "Organisationsdomänen auflisten",
|
"actionListOrgDomains": "Organisationsdomains auflisten",
|
||||||
"actionCreateSite": "Standort erstellen",
|
"actionCreateSite": "Standort erstellen",
|
||||||
"actionDeleteSite": "Standort löschen",
|
"actionDeleteSite": "Standort löschen",
|
||||||
"actionGetSite": "Standort abrufen",
|
"actionGetSite": "Standort abrufen",
|
||||||
@@ -1154,8 +1161,27 @@
|
|||||||
"sidebarAllUsers": "Alle Benutzer",
|
"sidebarAllUsers": "Alle Benutzer",
|
||||||
"sidebarIdentityProviders": "Identitätsanbieter",
|
"sidebarIdentityProviders": "Identitätsanbieter",
|
||||||
"sidebarLicense": "Lizenz",
|
"sidebarLicense": "Lizenz",
|
||||||
"sidebarClients": "Clients",
|
"sidebarClients": "Kunden",
|
||||||
"sidebarDomains": "Domänen",
|
"sidebarDomains": "Domänen",
|
||||||
|
"sidebarBluePrints": "Baupläne",
|
||||||
|
"blueprints": "Baupläne",
|
||||||
|
"blueprintsDescription": "Blaupausen sind deklarative YAML-Konfigurationen, die deine Ressourcen und deren Einstellungen definieren",
|
||||||
|
"blueprintAdd": "Blaupause hinzufügen",
|
||||||
|
"blueprintGoBack": "Alle Blaupausen ansehen",
|
||||||
|
"blueprintCreate": "Blaupause erstellen",
|
||||||
|
"blueprintCreateDescription2": "Folge den Schritten unten, um eine neue Blaupause zu erstellen und anzuwenden",
|
||||||
|
"blueprintDetails": "Blaupausendetails",
|
||||||
|
"blueprintDetailsDescription": "Siehe die Blaupausenlauf-Details",
|
||||||
|
"blueprintInfo": "Blaupauseninformation",
|
||||||
|
"message": "Nachricht",
|
||||||
|
"blueprintContentsDescription": "Definieren Sie den YAML-Inhalt, der Ihre Infrastruktur beschreibt",
|
||||||
|
"blueprintErrorCreateDescription": "Fehler beim Anwenden der Blaupause",
|
||||||
|
"blueprintErrorCreate": "Fehler beim Erstellen der Blaupause",
|
||||||
|
"searchBlueprintProgress": "Blaupausen suchen...",
|
||||||
|
"appliedAt": "Angewandt am",
|
||||||
|
"source": "Quelle",
|
||||||
|
"contents": "Inhalt",
|
||||||
|
"parsedContents": "Analysierte Inhalte",
|
||||||
"enableDockerSocket": "Docker Blaupause aktivieren",
|
"enableDockerSocket": "Docker Blaupause aktivieren",
|
||||||
"enableDockerSocketDescription": "Aktiviere Docker-Socket-Label-Scraping für Blaupausenbeschriftungen. Der Socket-Pfad muss neu angegeben werden.",
|
"enableDockerSocketDescription": "Aktiviere Docker-Socket-Label-Scraping für Blaupausenbeschriftungen. Der Socket-Pfad muss neu angegeben werden.",
|
||||||
"enableDockerSocketLink": "Mehr erfahren",
|
"enableDockerSocketLink": "Mehr erfahren",
|
||||||
@@ -1163,15 +1189,15 @@
|
|||||||
"containersIn": "Container in {siteName}",
|
"containersIn": "Container in {siteName}",
|
||||||
"selectContainerDescription": "Wählen Sie einen Container, der als Hostname für dieses Ziel verwendet werden soll. Klicken Sie auf einen Port, um einen Port zu verwenden.",
|
"selectContainerDescription": "Wählen Sie einen Container, der als Hostname für dieses Ziel verwendet werden soll. Klicken Sie auf einen Port, um einen Port zu verwenden.",
|
||||||
"containerName": "Name",
|
"containerName": "Name",
|
||||||
"containerImage": "Bild",
|
"containerImage": "Image",
|
||||||
"containerState": "Bundesland",
|
"containerState": "Status",
|
||||||
"containerNetworks": "Netzwerke",
|
"containerNetworks": "Netzwerke",
|
||||||
"containerHostnameIp": "Hostname/IP",
|
"containerHostnameIp": "Hostname/IP",
|
||||||
"containerLabels": "Etiketten",
|
"containerLabels": "Etiketten",
|
||||||
"containerLabelsCount": "{count, plural, one {# Etikett} other {# Etiketten}}",
|
"containerLabelsCount": "{count, plural, one {# Etikett} other {# Etiketten}}",
|
||||||
"containerLabelsTitle": "Container-Labels",
|
"containerLabelsTitle": "Container-Labels",
|
||||||
"containerLabelEmpty": "<leer>",
|
"containerLabelEmpty": "<leer>",
|
||||||
"containerPorts": "Häfen",
|
"containerPorts": "Ports",
|
||||||
"containerPortsMore": "+{count} mehr",
|
"containerPortsMore": "+{count} mehr",
|
||||||
"containerActions": "Aktionen",
|
"containerActions": "Aktionen",
|
||||||
"select": "Auswählen",
|
"select": "Auswählen",
|
||||||
@@ -1183,7 +1209,7 @@
|
|||||||
"searchResultsCount": "{count, plural, one {# Ergebnis} other {# Ergebnisse}}",
|
"searchResultsCount": "{count, plural, one {# Ergebnis} other {# Ergebnisse}}",
|
||||||
"filters": "Filter",
|
"filters": "Filter",
|
||||||
"filterOptions": "Filteroptionen",
|
"filterOptions": "Filteroptionen",
|
||||||
"filterPorts": "Häfen",
|
"filterPorts": "Ports",
|
||||||
"filterStopped": "Stoppt",
|
"filterStopped": "Stoppt",
|
||||||
"clearAllFilters": "Alle Filter löschen",
|
"clearAllFilters": "Alle Filter löschen",
|
||||||
"columns": "Spalten",
|
"columns": "Spalten",
|
||||||
@@ -1211,9 +1237,8 @@
|
|||||||
"domainCreate": "Domain erstellen",
|
"domainCreate": "Domain erstellen",
|
||||||
"domainCreatedDescription": "Domain erfolgreich erstellt",
|
"domainCreatedDescription": "Domain erfolgreich erstellt",
|
||||||
"domainDeletedDescription": "Domain erfolgreich gelöscht",
|
"domainDeletedDescription": "Domain erfolgreich gelöscht",
|
||||||
"domainQuestionRemove": "Möchten Sie die Domain {domain} wirklich aus Ihrem Konto entfernen?",
|
"domainQuestionRemove": "Sind Sie sicher, dass Sie die Domain von Ihrem Konto entfernen möchten?",
|
||||||
"domainMessageRemove": "Nach dem Entfernen wird die Domain nicht mehr mit Ihrem Konto verknüpft.",
|
"domainMessageRemove": "Nach dem Entfernen wird die Domain nicht mehr mit Ihrem Konto verknüpft.",
|
||||||
"domainMessageConfirm": "Um zu bestätigen, geben Sie bitte den Domainnamen unten ein.",
|
|
||||||
"domainConfirmDelete": "Domain-Löschung bestätigen",
|
"domainConfirmDelete": "Domain-Löschung bestätigen",
|
||||||
"domainDelete": "Domain löschen",
|
"domainDelete": "Domain löschen",
|
||||||
"domain": "Domäne",
|
"domain": "Domäne",
|
||||||
@@ -1253,13 +1278,13 @@
|
|||||||
"settingsErrorUpdate": "Einstellungen konnten nicht aktualisiert werden",
|
"settingsErrorUpdate": "Einstellungen konnten nicht aktualisiert werden",
|
||||||
"settingsErrorUpdateDescription": "Beim Aktualisieren der Einstellungen ist ein Fehler aufgetreten",
|
"settingsErrorUpdateDescription": "Beim Aktualisieren der Einstellungen ist ein Fehler aufgetreten",
|
||||||
"sidebarCollapse": "Zusammenklappen",
|
"sidebarCollapse": "Zusammenklappen",
|
||||||
"sidebarExpand": "Erweitern",
|
"sidebarExpand": "Aufklappen",
|
||||||
"newtUpdateAvailable": "Update verfügbar",
|
"newtUpdateAvailable": "Update verfügbar",
|
||||||
"newtUpdateAvailableInfo": "Eine neue Version von Newt ist verfügbar. Bitte aktualisieren Sie auf die neueste Version für das beste Erlebnis.",
|
"newtUpdateAvailableInfo": "Eine neue Version von Newt ist verfügbar. Bitte aktualisieren Sie auf die neueste Version für das beste Erlebnis.",
|
||||||
"domainPickerEnterDomain": "Domäne",
|
"domainPickerEnterDomain": "Domäne",
|
||||||
"domainPickerPlaceholder": "myapp.example.com",
|
"domainPickerPlaceholder": "myapp.example.com",
|
||||||
"domainPickerDescription": "Geben Sie die vollständige Domäne der Ressource ein, um verfügbare Optionen zu sehen.",
|
"domainPickerDescription": "Geben Sie die vollständige Domain der Ressource ein, um verfügbare Optionen zu sehen.",
|
||||||
"domainPickerDescriptionSaas": "Geben Sie eine vollständige Domäne, Subdomäne oder einfach einen Namen ein, um verfügbare Optionen zu sehen",
|
"domainPickerDescriptionSaas": "Geben Sie eine vollständige Domain, Subdomain oder einfach einen Namen ein, um verfügbare Optionen zu sehen",
|
||||||
"domainPickerTabAll": "Alle",
|
"domainPickerTabAll": "Alle",
|
||||||
"domainPickerTabOrganization": "Organisation",
|
"domainPickerTabOrganization": "Organisation",
|
||||||
"domainPickerTabProvided": "Bereitgestellt",
|
"domainPickerTabProvided": "Bereitgestellt",
|
||||||
@@ -1280,11 +1305,11 @@
|
|||||||
"billingFreeTier": "Kostenlose Stufe",
|
"billingFreeTier": "Kostenlose Stufe",
|
||||||
"billingWarningOverLimit": "Warnung: Sie haben ein oder mehrere Nutzungslimits überschritten. Ihre Webseiten werden nicht verbunden, bis Sie Ihr Abonnement ändern oder Ihren Verbrauch anpassen.",
|
"billingWarningOverLimit": "Warnung: Sie haben ein oder mehrere Nutzungslimits überschritten. Ihre Webseiten werden nicht verbunden, bis Sie Ihr Abonnement ändern oder Ihren Verbrauch anpassen.",
|
||||||
"billingUsageLimitsOverview": "Übersicht über Nutzungsgrenzen",
|
"billingUsageLimitsOverview": "Übersicht über Nutzungsgrenzen",
|
||||||
"billingMonitorUsage": "Überwachen Sie Ihren Verbrauch im Vergleich zu konfigurierten Grenzwerten. Wenn Sie eine Erhöhung der Limits benötigen, kontaktieren Sie uns bitte support@fossorial.io.",
|
"billingMonitorUsage": "Überwachen Sie Ihren Verbrauch im Vergleich zu konfigurierten Grenzwerten. Wenn Sie eine Erhöhung der Limits benötigen, kontaktieren Sie uns bitte support@pangolin.net.",
|
||||||
"billingDataUsage": "Datenverbrauch",
|
"billingDataUsage": "Datenverbrauch",
|
||||||
"billingOnlineTime": "Online-Zeit der Seite",
|
"billingOnlineTime": "Online-Zeit der Seite",
|
||||||
"billingUsers": "Aktive Benutzer",
|
"billingUsers": "Aktive Benutzer",
|
||||||
"billingDomains": "Aktive Domänen",
|
"billingDomains": "Aktive Domains",
|
||||||
"billingRemoteExitNodes": "Aktive selbstgehostete Nodes",
|
"billingRemoteExitNodes": "Aktive selbstgehostete Nodes",
|
||||||
"billingNoLimitConfigured": "Kein Limit konfiguriert",
|
"billingNoLimitConfigured": "Kein Limit konfiguriert",
|
||||||
"billingEstimatedPeriod": "Geschätzter Abrechnungszeitraum",
|
"billingEstimatedPeriod": "Geschätzter Abrechnungszeitraum",
|
||||||
@@ -1312,7 +1337,7 @@
|
|||||||
"billingDataUsageInfo": "Wenn Sie mit der Cloud verbunden sind, werden alle Daten über Ihre sicheren Tunnel belastet. Dies schließt eingehenden und ausgehenden Datenverkehr über alle Ihre Websites ein. Wenn Sie Ihr Limit erreichen, werden Ihre Seiten die Verbindung trennen, bis Sie Ihr Paket upgraden oder die Nutzung verringern. Daten werden nicht belastet, wenn Sie Knoten verwenden.",
|
"billingDataUsageInfo": "Wenn Sie mit der Cloud verbunden sind, werden alle Daten über Ihre sicheren Tunnel belastet. Dies schließt eingehenden und ausgehenden Datenverkehr über alle Ihre Websites ein. Wenn Sie Ihr Limit erreichen, werden Ihre Seiten die Verbindung trennen, bis Sie Ihr Paket upgraden oder die Nutzung verringern. Daten werden nicht belastet, wenn Sie Knoten verwenden.",
|
||||||
"billingOnlineTimeInfo": "Sie werden belastet, abhängig davon, wie lange Ihre Seiten mit der Cloud verbunden bleiben. Zum Beispiel 44.640 Minuten entspricht einer Site, die 24 Stunden am Tag des Monats läuft. Wenn Sie Ihr Limit erreichen, werden Ihre Seiten die Verbindung trennen, bis Sie Ihr Paket upgraden oder die Nutzung verringern. Die Zeit wird nicht belastet, wenn Sie Knoten verwenden.",
|
"billingOnlineTimeInfo": "Sie werden belastet, abhängig davon, wie lange Ihre Seiten mit der Cloud verbunden bleiben. Zum Beispiel 44.640 Minuten entspricht einer Site, die 24 Stunden am Tag des Monats läuft. Wenn Sie Ihr Limit erreichen, werden Ihre Seiten die Verbindung trennen, bis Sie Ihr Paket upgraden oder die Nutzung verringern. Die Zeit wird nicht belastet, wenn Sie Knoten verwenden.",
|
||||||
"billingUsersInfo": "Ihnen wird für jeden Benutzer in Ihrer Organisation berechnet. Die Abrechnung erfolgt täglich basierend auf der Anzahl der aktiven Benutzerkonten in Ihrer Organisation.",
|
"billingUsersInfo": "Ihnen wird für jeden Benutzer in Ihrer Organisation berechnet. Die Abrechnung erfolgt täglich basierend auf der Anzahl der aktiven Benutzerkonten in Ihrer Organisation.",
|
||||||
"billingDomainInfo": "Ihnen wird für jede Domäne in Ihrer Organisation berechnet. Die Abrechnung erfolgt täglich basierend auf der Anzahl der aktiven Domänenkonten in Ihrer Organisation.",
|
"billingDomainInfo": "Ihnen wird jede Domain in Ihrer Organisation berechnet. Die Abrechnung erfolgt täglich, basierend auf der Anzahl der aktiven Domain-Konten in Ihrer Organisation.",
|
||||||
"billingRemoteExitNodesInfo": "Ihnen wird für jeden verwalteten Node in Ihrer Organisation berechnet. Die Abrechnung erfolgt täglich basierend auf der Anzahl der aktiven verwalteten Nodes in Ihrer Organisation.",
|
"billingRemoteExitNodesInfo": "Ihnen wird für jeden verwalteten Node in Ihrer Organisation berechnet. Die Abrechnung erfolgt täglich basierend auf der Anzahl der aktiven verwalteten Nodes in Ihrer Organisation.",
|
||||||
"domainNotFound": "Domain nicht gefunden",
|
"domainNotFound": "Domain nicht gefunden",
|
||||||
"domainNotFoundDescription": "Diese Ressource ist deaktiviert, weil die Domain nicht mehr in unserem System existiert. Bitte setzen Sie eine neue Domain für diese Ressource.",
|
"domainNotFoundDescription": "Diese Ressource ist deaktiviert, weil die Domain nicht mehr in unserem System existiert. Bitte setzen Sie eine neue Domain für diese Ressource.",
|
||||||
@@ -1346,6 +1371,19 @@
|
|||||||
"securityKeyUnknownError": "Es gab ein Problem mit Ihrem Sicherheitsschlüssel. Bitte versuchen Sie es erneut.",
|
"securityKeyUnknownError": "Es gab ein Problem mit Ihrem Sicherheitsschlüssel. Bitte versuchen Sie es erneut.",
|
||||||
"twoFactorRequired": "Zur Registrierung eines Sicherheitsschlüssels ist eine Zwei-Faktor-Authentifizierung erforderlich.",
|
"twoFactorRequired": "Zur Registrierung eines Sicherheitsschlüssels ist eine Zwei-Faktor-Authentifizierung erforderlich.",
|
||||||
"twoFactor": "Zwei-Faktor-Authentifizierung",
|
"twoFactor": "Zwei-Faktor-Authentifizierung",
|
||||||
|
"twoFactorAuthentication": "Zwei-Faktor-Authentifizierung",
|
||||||
|
"twoFactorDescription": "Diese Organisation erfordert Zwei-Faktor-Authentifizierung.",
|
||||||
|
"enableTwoFactor": "Zwei-Faktor-Authentifizierung aktivieren",
|
||||||
|
"organizationSecurityPolicy": "Sicherheitsrichtlinien der Organisation",
|
||||||
|
"organizationSecurityPolicyDescription": "Diese Organisation hat Sicherheitsanforderungen, die erfüllt werden müssen, bevor Sie darauf zugreifen können",
|
||||||
|
"securityRequirements": "Sicherheitsanforderungen",
|
||||||
|
"allRequirementsMet": "Alle Anforderungen wurden erfüllt",
|
||||||
|
"completeRequirementsToContinue": "Erfülle die folgenden Anforderungen, um weiterhin auf diese Organisation zuzugreifen",
|
||||||
|
"youCanNowAccessOrganization": "Sie können nun auf diese Organisation zugreifen",
|
||||||
|
"reauthenticationRequired": "Sitzungslänge",
|
||||||
|
"reauthenticationDescription": "Diese Organisation erfordert, dass Sie sich alle {maxDays} Tage anmelden.",
|
||||||
|
"reauthenticationDescriptionHours": "Diese Organisation erfordert, dass Sie sich alle {maxHours} Stunden einloggen.",
|
||||||
|
"reauthenticateNow": "Erneut anmelden",
|
||||||
"adminEnabled2FaOnYourAccount": "Ihr Administrator hat die Zwei-Faktor-Authentifizierung für {email} aktiviert. Bitte schließen Sie den Einrichtungsprozess ab, um fortzufahren.",
|
"adminEnabled2FaOnYourAccount": "Ihr Administrator hat die Zwei-Faktor-Authentifizierung für {email} aktiviert. Bitte schließen Sie den Einrichtungsprozess ab, um fortzufahren.",
|
||||||
"securityKeyAdd": "Sicherheitsschlüssel hinzufügen",
|
"securityKeyAdd": "Sicherheitsschlüssel hinzufügen",
|
||||||
"securityKeyRegisterTitle": "Neuen Sicherheitsschlüssel registrieren",
|
"securityKeyRegisterTitle": "Neuen Sicherheitsschlüssel registrieren",
|
||||||
@@ -1387,7 +1425,7 @@
|
|||||||
"olmTunnel": "Olm-Tunnel",
|
"olmTunnel": "Olm-Tunnel",
|
||||||
"olmTunnelDescription": "Nutzen Sie Olm für die Kundenverbindung",
|
"olmTunnelDescription": "Nutzen Sie Olm für die Kundenverbindung",
|
||||||
"errorCreatingClient": "Fehler beim Erstellen des Clients",
|
"errorCreatingClient": "Fehler beim Erstellen des Clients",
|
||||||
"clientDefaultsNotFound": "Kundenvorgaben nicht gefunden",
|
"clientDefaultsNotFound": "Standardeinstellungen des Clients nicht gefunden",
|
||||||
"createClient": "Client erstellen",
|
"createClient": "Client erstellen",
|
||||||
"createClientDescription": "Erstellen Sie einen neuen Client für die Verbindung zu Ihren Standorten.",
|
"createClientDescription": "Erstellen Sie einen neuen Client für die Verbindung zu Ihren Standorten.",
|
||||||
"seeAllClients": "Alle Clients anzeigen",
|
"seeAllClients": "Alle Clients anzeigen",
|
||||||
@@ -1464,13 +1502,13 @@
|
|||||||
"httpMethod": "HTTP-Methode",
|
"httpMethod": "HTTP-Methode",
|
||||||
"selectHttpMethod": "HTTP-Methode auswählen",
|
"selectHttpMethod": "HTTP-Methode auswählen",
|
||||||
"domainPickerSubdomainLabel": "Subdomain",
|
"domainPickerSubdomainLabel": "Subdomain",
|
||||||
"domainPickerBaseDomainLabel": "Basisdomäne",
|
"domainPickerBaseDomainLabel": "Basisdomain",
|
||||||
"domainPickerSearchDomains": "Domains suchen...",
|
"domainPickerSearchDomains": "Domains suchen...",
|
||||||
"domainPickerNoDomainsFound": "Keine Domains gefunden",
|
"domainPickerNoDomainsFound": "Keine Domains gefunden",
|
||||||
"domainPickerLoadingDomains": "Domains werden geladen...",
|
"domainPickerLoadingDomains": "Domains werden geladen...",
|
||||||
"domainPickerSelectBaseDomain": "Basisdomäne auswählen...",
|
"domainPickerSelectBaseDomain": "Basisdomain auswählen...",
|
||||||
"domainPickerNotAvailableForCname": "Für CNAME-Domains nicht verfügbar",
|
"domainPickerNotAvailableForCname": "Für CNAME-Domains nicht verfügbar",
|
||||||
"domainPickerEnterSubdomainOrLeaveBlank": "Geben Sie eine Subdomain ein oder lassen Sie das Feld leer, um die Basisdomäne zu verwenden.",
|
"domainPickerEnterSubdomainOrLeaveBlank": "Geben Sie eine Subdomain ein oder lassen Sie das Feld leer, um die Basisdomain zu verwenden.",
|
||||||
"domainPickerEnterSubdomainToSearch": "Geben Sie eine Subdomain ein, um verfügbare freie Domains zu suchen und auszuwählen.",
|
"domainPickerEnterSubdomainToSearch": "Geben Sie eine Subdomain ein, um verfügbare freie Domains zu suchen und auszuwählen.",
|
||||||
"domainPickerFreeDomains": "Freie Domains",
|
"domainPickerFreeDomains": "Freie Domains",
|
||||||
"domainPickerSearchForAvailableDomains": "Verfügbare Domains suchen",
|
"domainPickerSearchForAvailableDomains": "Verfügbare Domains suchen",
|
||||||
@@ -1485,7 +1523,7 @@
|
|||||||
"resourcesTableNoInternalResourcesFound": "Keine internen Ressourcen gefunden.",
|
"resourcesTableNoInternalResourcesFound": "Keine internen Ressourcen gefunden.",
|
||||||
"resourcesTableDestination": "Ziel",
|
"resourcesTableDestination": "Ziel",
|
||||||
"resourcesTableTheseResourcesForUseWith": "Diese Ressourcen sind zur Verwendung mit",
|
"resourcesTableTheseResourcesForUseWith": "Diese Ressourcen sind zur Verwendung mit",
|
||||||
"resourcesTableClients": "Kunden",
|
"resourcesTableClients": "Clients",
|
||||||
"resourcesTableAndOnlyAccessibleInternally": "und sind nur intern zugänglich, wenn mit einem Client verbunden.",
|
"resourcesTableAndOnlyAccessibleInternally": "und sind nur intern zugänglich, wenn mit einem Client verbunden.",
|
||||||
"editInternalResourceDialogEditClientResource": "Client-Ressource bearbeiten",
|
"editInternalResourceDialogEditClientResource": "Client-Ressource bearbeiten",
|
||||||
"editInternalResourceDialogUpdateResourceProperties": "Aktualisieren Sie die Ressourceneigenschaften und die Zielkonfiguration für {resourceName}.",
|
"editInternalResourceDialogUpdateResourceProperties": "Aktualisieren Sie die Ressourceneigenschaften und die Zielkonfiguration für {resourceName}.",
|
||||||
@@ -1558,20 +1596,19 @@
|
|||||||
"autoLoginErrorNoRedirectUrl": "Keine Weiterleitungs-URL vom Identitätsanbieter erhalten.",
|
"autoLoginErrorNoRedirectUrl": "Keine Weiterleitungs-URL vom Identitätsanbieter erhalten.",
|
||||||
"autoLoginErrorGeneratingUrl": "Fehler beim Generieren der Authentifizierungs-URL.",
|
"autoLoginErrorGeneratingUrl": "Fehler beim Generieren der Authentifizierungs-URL.",
|
||||||
"remoteExitNodeManageRemoteExitNodes": "Entfernte Knoten",
|
"remoteExitNodeManageRemoteExitNodes": "Entfernte Knoten",
|
||||||
"remoteExitNodeDescription": "Self-host one or more remote nodes to extend your network connectivity and reduce reliance on the cloud",
|
"remoteExitNodeDescription": "Self-Hosten Sie einen oder mehrere entfernte Knoten, um Ihr Netzwerk zu erweitern und die Abhängigkeit von der Cloud zu verringern",
|
||||||
"remoteExitNodes": "Knoten",
|
"remoteExitNodes": "Knoten",
|
||||||
"searchRemoteExitNodes": "Knoten suchen...",
|
"searchRemoteExitNodes": "Knoten suchen...",
|
||||||
"remoteExitNodeAdd": "Knoten hinzufügen",
|
"remoteExitNodeAdd": "Knoten hinzufügen",
|
||||||
"remoteExitNodeErrorDelete": "Fehler beim Löschen des Knotens",
|
"remoteExitNodeErrorDelete": "Fehler beim Löschen des Knotens",
|
||||||
"remoteExitNodeQuestionRemove": "Sind Sie sicher, dass Sie den Knoten {selectedNode} aus der Organisation entfernen möchten?",
|
"remoteExitNodeQuestionRemove": "Sind Sie sicher, dass Sie den Knoten aus der Organisation entfernen möchten?",
|
||||||
"remoteExitNodeMessageRemove": "Einmal entfernt, wird der Knoten nicht mehr zugänglich sein.",
|
"remoteExitNodeMessageRemove": "Einmal entfernt, wird der Knoten nicht mehr zugänglich sein.",
|
||||||
"remoteExitNodeMessageConfirm": "Um zu bestätigen, geben Sie bitte den Namen des Knotens unten ein.",
|
|
||||||
"remoteExitNodeConfirmDelete": "Löschknoten bestätigen",
|
"remoteExitNodeConfirmDelete": "Löschknoten bestätigen",
|
||||||
"remoteExitNodeDelete": "Knoten löschen",
|
"remoteExitNodeDelete": "Knoten löschen",
|
||||||
"sidebarRemoteExitNodes": "Entfernte Knoten",
|
"sidebarRemoteExitNodes": "Entfernte Knoten",
|
||||||
"remoteExitNodeCreate": {
|
"remoteExitNodeCreate": {
|
||||||
"title": "Knoten erstellen",
|
"title": "Knoten erstellen",
|
||||||
"description": "Erstellen Sie einen neuen Knoten, um Ihre Netzwerkverbindung zu erweitern",
|
"description": "Erstellen Sie einen neuen Knoten, um Ihr Netzwerk zu erweitern",
|
||||||
"viewAllButton": "Alle Knoten anzeigen",
|
"viewAllButton": "Alle Knoten anzeigen",
|
||||||
"strategy": {
|
"strategy": {
|
||||||
"title": "Erstellungsstrategie",
|
"title": "Erstellungsstrategie",
|
||||||
@@ -1679,7 +1716,7 @@
|
|||||||
"idpAzureConfigurationDescription": "Konfigurieren Sie Ihre Azure Entra ID OAuth2 Zugangsdaten",
|
"idpAzureConfigurationDescription": "Konfigurieren Sie Ihre Azure Entra ID OAuth2 Zugangsdaten",
|
||||||
"idpTenantId": "Mandanten-ID",
|
"idpTenantId": "Mandanten-ID",
|
||||||
"idpTenantIdPlaceholder": "deine Mandant-ID",
|
"idpTenantIdPlaceholder": "deine Mandant-ID",
|
||||||
"idpAzureTenantIdDescription": "Ihre Azure Mieter-ID (gefunden in Azure Active Directory Übersicht)",
|
"idpAzureTenantIdDescription": "Ihre Azure Tenant-ID (gefunden in Azure Active Directory Übersicht)",
|
||||||
"idpAzureClientIdDescription": "Ihre Azure App Registration Client ID",
|
"idpAzureClientIdDescription": "Ihre Azure App Registration Client ID",
|
||||||
"idpAzureClientSecretDescription": "Ihr Azure App Registration Client Secret",
|
"idpAzureClientSecretDescription": "Ihr Azure App Registration Client Secret",
|
||||||
"idpGoogleTitle": "Google",
|
"idpGoogleTitle": "Google",
|
||||||
@@ -1698,7 +1735,7 @@
|
|||||||
"authPage": "Auth Seite",
|
"authPage": "Auth Seite",
|
||||||
"authPageDescription": "Konfigurieren Sie die Auth-Seite für Ihre Organisation",
|
"authPageDescription": "Konfigurieren Sie die Auth-Seite für Ihre Organisation",
|
||||||
"authPageDomain": "Domain der Auth Seite",
|
"authPageDomain": "Domain der Auth Seite",
|
||||||
"noDomainSet": "Keine Domäne gesetzt",
|
"noDomainSet": "Keine Domain gesetzt",
|
||||||
"changeDomain": "Domain ändern",
|
"changeDomain": "Domain ändern",
|
||||||
"selectDomain": "Domain auswählen",
|
"selectDomain": "Domain auswählen",
|
||||||
"restartCertificate": "Zertifikat neu starten",
|
"restartCertificate": "Zertifikat neu starten",
|
||||||
@@ -1714,7 +1751,7 @@
|
|||||||
"domainPickerUnverified": "Nicht verifiziert",
|
"domainPickerUnverified": "Nicht verifiziert",
|
||||||
"domainPickerInvalidSubdomainStructure": "Diese Subdomain enthält ungültige Zeichen oder Struktur. Sie wird beim Speichern automatisch bereinigt.",
|
"domainPickerInvalidSubdomainStructure": "Diese Subdomain enthält ungültige Zeichen oder Struktur. Sie wird beim Speichern automatisch bereinigt.",
|
||||||
"domainPickerError": "Fehler",
|
"domainPickerError": "Fehler",
|
||||||
"domainPickerErrorLoadDomains": "Fehler beim Laden der Organisations-Domänen",
|
"domainPickerErrorLoadDomains": "Fehler beim Laden der Organisations-Domains",
|
||||||
"domainPickerErrorCheckAvailability": "Fehler beim Prüfen der Domain-Verfügbarkeit",
|
"domainPickerErrorCheckAvailability": "Fehler beim Prüfen der Domain-Verfügbarkeit",
|
||||||
"domainPickerInvalidSubdomain": "Ungültige Subdomain",
|
"domainPickerInvalidSubdomain": "Ungültige Subdomain",
|
||||||
"domainPickerInvalidSubdomainRemoved": "Die Eingabe \"{sub}\" wurde entfernt, weil sie nicht gültig ist.",
|
"domainPickerInvalidSubdomainRemoved": "Die Eingabe \"{sub}\" wurde entfernt, weil sie nicht gültig ist.",
|
||||||
@@ -1733,7 +1770,49 @@
|
|||||||
"resourceExposePortsEditFile": "Datei bearbeiten: docker-compose.yml",
|
"resourceExposePortsEditFile": "Datei bearbeiten: docker-compose.yml",
|
||||||
"emailVerificationRequired": "E-Mail-Verifizierung ist erforderlich. Bitte melden Sie sich erneut über {dashboardUrl}/auth/login an. Kommen Sie dann wieder hierher.",
|
"emailVerificationRequired": "E-Mail-Verifizierung ist erforderlich. Bitte melden Sie sich erneut über {dashboardUrl}/auth/login an. Kommen Sie dann wieder hierher.",
|
||||||
"twoFactorSetupRequired": "Die Zwei-Faktor-Authentifizierung ist erforderlich. Bitte melden Sie sich erneut über {dashboardUrl}/auth/login an. Dann kommen Sie hierher zurück.",
|
"twoFactorSetupRequired": "Die Zwei-Faktor-Authentifizierung ist erforderlich. Bitte melden Sie sich erneut über {dashboardUrl}/auth/login an. Dann kommen Sie hierher zurück.",
|
||||||
|
"additionalSecurityRequired": "Zusätzliche Sicherheit erforderlich",
|
||||||
|
"organizationRequiresAdditionalSteps": "Diese Organisation erfordert zusätzliche Sicherheitsschritte, bevor Sie auf Ressourcen zugreifen können.",
|
||||||
|
"completeTheseSteps": "Schließe diese Schritte ab",
|
||||||
|
"enableTwoFactorAuthentication": "Zwei-Faktor-Authentifizierung aktivieren",
|
||||||
|
"completeSecuritySteps": "Schließe Sicherheitsschritte ab",
|
||||||
|
"securitySettings": "Sicherheitseinstellungen",
|
||||||
|
"securitySettingsDescription": "Konfigurieren Sie Sicherheitsrichtlinien für Ihre Organisation",
|
||||||
|
"requireTwoFactorForAllUsers": "Zwei-Faktor-Authentifizierung für alle Benutzer erforderlich",
|
||||||
|
"requireTwoFactorDescription": "Wenn aktiviert, müssen alle internen Benutzer in dieser Organisation die Zwei-Faktor-Authentifizierung aktiviert haben, um auf die Organisation zuzugreifen.",
|
||||||
|
"requireTwoFactorDisabledDescription": "Diese Funktion erfordert eine gültige Lizenz (Unternehmen) oder ein aktives Abonnement (SaaS)",
|
||||||
|
"requireTwoFactorCannotEnableDescription": "Sie müssen die Zwei-Faktor-Authentifizierung für Ihr Konto aktivieren, bevor Sie es für alle Benutzer erzwingen können",
|
||||||
|
"maxSessionLength": "Maximale Sitzungslänge",
|
||||||
|
"maxSessionLengthDescription": "Legen Sie die maximale Dauer für Benutzersitzungen fest. Nach dieser Zeit müssen Benutzer erneut authentifizieren.",
|
||||||
|
"maxSessionLengthDisabledDescription": "Diese Funktion erfordert eine gültige Lizenz (Unternehmen) oder ein aktives Abonnement (SaaS)",
|
||||||
|
"selectSessionLength": "Sitzungslänge auswählen",
|
||||||
|
"unenforced": "Unerzwungen",
|
||||||
|
"1Hour": "1 Stunde",
|
||||||
|
"3Hours": "3 Stunden",
|
||||||
|
"6Hours": "6 Stunden",
|
||||||
|
"12Hours": "12 Stunden",
|
||||||
|
"1DaySession": "1 Tag",
|
||||||
|
"3Days": "3 Tage",
|
||||||
|
"7Days": "7 Tage",
|
||||||
|
"14Days": "14 Tage",
|
||||||
|
"30DaysSession": "30 Tage",
|
||||||
|
"90DaysSession": "90 Tage",
|
||||||
|
"180DaysSession": "180 Tage",
|
||||||
|
"passwordExpiryDays": "Passwortablauf",
|
||||||
|
"editPasswordExpiryDescription": "Legen Sie die Anzahl der Tage fest, bevor Benutzer ihr Passwort ändern müssen.",
|
||||||
|
"selectPasswordExpiry": "Ablauf des Passworts auswählen",
|
||||||
|
"30Days": "30 Tage",
|
||||||
|
"1Day": "1 Tag",
|
||||||
|
"60Days": "60 Tage",
|
||||||
|
"90Days": "90 Tage",
|
||||||
|
"180Days": "180 Tage",
|
||||||
|
"1Year": "1 Jahr",
|
||||||
|
"subscriptionBadge": "Abonnement erforderlich",
|
||||||
|
"securityPolicyChangeWarning": "Sicherheitsrichtlinienänderungs-Warnung",
|
||||||
|
"securityPolicyChangeDescription": "Sie sind dabei, die Sicherheitseinstellungen zu ändern. Nach dem Speichern müssen Sie sich erneut authentifizieren, um diesen Richtlinien-Aktualisierungen nachzukommen. Alle Benutzer, die nicht konform sind, müssen sich ebenfalls neu authentifizieren.",
|
||||||
|
"securityPolicyChangeConfirmMessage": "Ich bestätige",
|
||||||
|
"securityPolicyChangeWarningText": "Dies betrifft alle Benutzer in der Organisation",
|
||||||
"authPageErrorUpdateMessage": "Beim Aktualisieren der Auth-Seiten-Einstellungen ist ein Fehler aufgetreten",
|
"authPageErrorUpdateMessage": "Beim Aktualisieren der Auth-Seiten-Einstellungen ist ein Fehler aufgetreten",
|
||||||
|
"authPageErrorUpdate": "Auth Seite kann nicht aktualisiert werden",
|
||||||
"authPageUpdated": "Auth-Seite erfolgreich aktualisiert",
|
"authPageUpdated": "Auth-Seite erfolgreich aktualisiert",
|
||||||
"healthCheckNotAvailable": "Lokal",
|
"healthCheckNotAvailable": "Lokal",
|
||||||
"rewritePath": "Pfad neu schreiben",
|
"rewritePath": "Pfad neu schreiben",
|
||||||
@@ -1745,153 +1824,261 @@
|
|||||||
"resourceHeaderAuthRemoveDescription": "Header-Authentifizierung erfolgreich entfernt.",
|
"resourceHeaderAuthRemoveDescription": "Header-Authentifizierung erfolgreich entfernt.",
|
||||||
"resourceErrorHeaderAuthRemove": "Fehler beim Entfernen der Header-Authentifizierung",
|
"resourceErrorHeaderAuthRemove": "Fehler beim Entfernen der Header-Authentifizierung",
|
||||||
"resourceErrorHeaderAuthRemoveDescription": "Die Headerauthentifizierung für die Ressource konnte nicht entfernt werden.",
|
"resourceErrorHeaderAuthRemoveDescription": "Die Headerauthentifizierung für die Ressource konnte nicht entfernt werden.",
|
||||||
"resourceHeaderAuthProtectionEnabled": "Header Authentication Enabled",
|
"resourceHeaderAuthProtectionEnabled": "Header-Authentifizierung aktiviert",
|
||||||
"resourceHeaderAuthProtectionDisabled": "Header Authentication Disabled",
|
"resourceHeaderAuthProtectionDisabled": "Header-Authentifizierung deaktiviert",
|
||||||
"headerAuthRemove": "Remove Header Auth",
|
"headerAuthRemove": "Header-Auth entfernen",
|
||||||
"headerAuthAdd": "Add Header Auth",
|
"headerAuthAdd": "Header-Auth hinzufügen",
|
||||||
"resourceErrorHeaderAuthSetup": "Fehler beim Setzen der Header-Authentifizierung",
|
"resourceErrorHeaderAuthSetup": "Fehler beim Setzen der Header-Authentifizierung",
|
||||||
"resourceErrorHeaderAuthSetupDescription": "Konnte Header-Authentifizierung für die Ressource nicht festlegen.",
|
"resourceErrorHeaderAuthSetupDescription": "Konnte Header-Authentifizierung für die Ressource nicht festlegen.",
|
||||||
"resourceHeaderAuthSetup": "Header-Authentifizierung erfolgreich festgelegt",
|
"resourceHeaderAuthSetup": "Header-Authentifizierung erfolgreich festgelegt",
|
||||||
"resourceHeaderAuthSetupDescription": "Header-Authentifizierung wurde erfolgreich festgelegt.",
|
"resourceHeaderAuthSetupDescription": "Header-Authentifizierung wurde erfolgreich festgelegt.",
|
||||||
"resourceHeaderAuthSetupTitle": "Header-Authentifizierung festlegen",
|
"resourceHeaderAuthSetupTitle": "Header-Authentifizierung festlegen",
|
||||||
"resourceHeaderAuthSetupTitleDescription": "Set the basic auth credentials (username and password) to protect this resource with HTTP Header Authentication. Access it using the format https://username:password@resource.example.com",
|
"resourceHeaderAuthSetupTitleDescription": "Legen Sie die grundlegenden Authentifizierungsdaten (Benutzername und Passwort) fest, um diese Ressource mit HTTP-Header-Authentifizierung zu schützen. Greifen Sie auf sie mit dem Format https://username:password@resource.example.com",
|
||||||
"resourceHeaderAuthSubmit": "Header-Authentifizierung festlegen",
|
"resourceHeaderAuthSubmit": "Header-Authentifizierung festlegen",
|
||||||
"actionSetResourceHeaderAuth": "Header-Authentifizierung festlegen",
|
"actionSetResourceHeaderAuth": "Header-Authentifizierung festlegen",
|
||||||
"enterpriseEdition": "Enterprise Edition",
|
"enterpriseEdition": "Enterprise Edition",
|
||||||
"unlicensed": "Unlicensed",
|
"unlicensed": "Nicht lizenziert",
|
||||||
"beta": "Beta",
|
"beta": "Beta",
|
||||||
"manageClients": "Manage Clients",
|
"manageClients": "Clients verwalten",
|
||||||
"manageClientsDescription": "Clients are devices that can connect to your sites",
|
"manageClientsDescription": "Clients sind Geräte, die sich mit Ihren Websites verbinden können",
|
||||||
"licenseTableValidUntil": "Valid Until",
|
"licenseTableValidUntil": "Gültig bis",
|
||||||
"saasLicenseKeysSettingsTitle": "Enterprise Licenses",
|
"saasLicenseKeysSettingsTitle": "Enterprise-Lizenzen",
|
||||||
"saasLicenseKeysSettingsDescription": "Generate and manage Enterprise license keys for self-hosted Pangolin instances",
|
"saasLicenseKeysSettingsDescription": "Erstelle und verwalte Enterprise-Lizenzschlüssel für selbst gehostete Pangolin-Instanzen",
|
||||||
"sidebarEnterpriseLicenses": "Licenses",
|
"sidebarEnterpriseLicenses": "Lizenzen",
|
||||||
"generateLicenseKey": "Generate License Key",
|
"generateLicenseKey": "Lizenzschlüssel generieren",
|
||||||
"generateLicenseKeyForm": {
|
"generateLicenseKeyForm": {
|
||||||
"validation": {
|
"validation": {
|
||||||
"emailRequired": "Please enter a valid email address",
|
"emailRequired": "Bitte geben Sie eine gültige E-Mail-Adresse ein",
|
||||||
"useCaseTypeRequired": "Please select a use case type",
|
"useCaseTypeRequired": "Bitte wählen Sie einen Anwendungsfall",
|
||||||
"firstNameRequired": "First name is required",
|
"firstNameRequired": "Vorname ist erforderlich",
|
||||||
"lastNameRequired": "Last name is required",
|
"lastNameRequired": "Nachname ist erforderlich",
|
||||||
"primaryUseRequired": "Please describe your primary use",
|
"primaryUseRequired": "Bitte beschreiben Sie Ihre primäre Verwendung",
|
||||||
"jobTitleRequiredBusiness": "Job title is required for business use",
|
"jobTitleRequiredBusiness": "Job-Titel ist für die geschäftliche Nutzung erforderlich",
|
||||||
"industryRequiredBusiness": "Industry is required for business use",
|
"industryRequiredBusiness": "Industrie ist für die geschäftliche Nutzung erforderlich",
|
||||||
"stateProvinceRegionRequired": "State/Province/Region is required",
|
"stateProvinceRegionRequired": "Bundesland/Provinz/Region ist erforderlich",
|
||||||
"postalZipCodeRequired": "Postal/ZIP Code is required",
|
"postalZipCodeRequired": "Postleitzahl ist erforderlich",
|
||||||
"companyNameRequiredBusiness": "Company name is required for business use",
|
"companyNameRequiredBusiness": "Firmenname ist erforderlich für den geschäftlichen Gebrauch",
|
||||||
"countryOfResidenceRequiredBusiness": "Country of residence is required for business use",
|
"countryOfResidenceRequiredBusiness": "Land des Wohnsitzes ist für die geschäftliche Nutzung erforderlich",
|
||||||
"countryRequiredPersonal": "Country is required for personal use",
|
"countryRequiredPersonal": "Land ist für den persönlichen Gebrauch erforderlich",
|
||||||
"agreeToTermsRequired": "You must agree to the terms",
|
"agreeToTermsRequired": "Sie müssen den Bedingungen zustimmen",
|
||||||
"complianceConfirmationRequired": "You must confirm compliance with the Fossorial Commercial License"
|
"complianceConfirmationRequired": "Sie müssen die Einhaltung der Fossorial Commercial License bestätigen"
|
||||||
},
|
},
|
||||||
"useCaseOptions": {
|
"useCaseOptions": {
|
||||||
"personal": {
|
"personal": {
|
||||||
"title": "Personal Use",
|
"title": "Persönliche Nutzung",
|
||||||
"description": "For individual, non-commercial use such as learning, personal projects, or experimentation."
|
"description": "Für den individuellen, nicht-kommerziellen Gebrauch wie Lernen, persönliche Projekte oder Experimente."
|
||||||
},
|
},
|
||||||
"business": {
|
"business": {
|
||||||
"title": "Business Use",
|
"title": "Business-Nutzung",
|
||||||
"description": "For use within organizations, companies, or commercial or revenue-generating activities."
|
"description": "Für den Einsatz innerhalb von Organisationen, Unternehmen oder kommerziellen oder einkommensfördernden Aktivitäten."
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"steps": {
|
"steps": {
|
||||||
"emailLicenseType": {
|
"emailLicenseType": {
|
||||||
"title": "Email & License Type",
|
"title": "E-Mail & Lizenztyp",
|
||||||
"description": "Enter your email and choose your license type"
|
"description": "Geben Sie Ihre E-Mail ein und wählen Sie Ihren Lizenztyp"
|
||||||
},
|
},
|
||||||
"personalInformation": {
|
"personalInformation": {
|
||||||
"title": "Personal Information",
|
"title": "Persönliche Informationen",
|
||||||
"description": "Tell us about yourself"
|
"description": "Erzählen Sie uns über sich selbst"
|
||||||
},
|
},
|
||||||
"contactInformation": {
|
"contactInformation": {
|
||||||
"title": "Contact Information",
|
"title": "Kontaktinformationen",
|
||||||
"description": "Your contact details"
|
"description": "Ihre Kontaktdaten"
|
||||||
},
|
},
|
||||||
"termsGenerate": {
|
"termsGenerate": {
|
||||||
"title": "Terms & Generate",
|
"title": "Begriffe & Generieren",
|
||||||
"description": "Review and accept terms to generate your license"
|
"description": "Bedingungen überprüfen und akzeptieren, um Ihre Lizenz zu generieren"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"alerts": {
|
"alerts": {
|
||||||
"commercialUseDisclosure": {
|
"commercialUseDisclosure": {
|
||||||
"title": "Usage Disclosure",
|
"title": "Verwendungsanzeige",
|
||||||
"description": "Select the license tier that accurately reflects your intended use. The Personal License permits free use of the Software for individual, non-commercial or small-scale commercial activities with annual gross revenue under $100,000 USD. Any use beyond these limits — including use within a business, organization, or other revenue-generating environment — requires a valid Enterprise License and payment of the applicable licensing fee. All users, whether Personal or Enterprise, must comply with the Fossorial Commercial License Terms."
|
"description": "Wählen Sie die Lizenz-Ebene, die Ihre beabsichtigte Nutzung genau widerspiegelt. Die Persönliche Lizenz erlaubt die freie Nutzung der Software für individuelle, nicht-kommerzielle oder kleine kommerzielle Aktivitäten mit jährlichen Brutto-Einnahmen von 100.000 USD. Über diese Grenzen hinausgehende Verwendungszwecke – einschließlich der Verwendung innerhalb eines Unternehmens, einer Organisation, oder eine andere umsatzgenerierende Umgebung — erfordert eine gültige Enterprise-Lizenz und die Zahlung der Lizenzgebühr. Alle Benutzer, ob Personal oder Enterprise, müssen die Fossorial Commercial License Bedingungen einhalten."
|
||||||
},
|
},
|
||||||
"trialPeriodInformation": {
|
"trialPeriodInformation": {
|
||||||
"title": "Trial Period Information",
|
"title": "Testperiode Information",
|
||||||
"description": "This License Key enables Enterprise features for a 7-day evaluation period. Continued access to Paid Features beyond the evaluation period requires activation under a valid Personal or Enterprise License. For Enterprise licensing, contact sales@fossorial.io."
|
"description": "Dieser Lizenzschlüssel ermöglicht Enterprise-Funktionen für einen 7-tägigen Bewertungszeitraum. Der fortgesetzte Zugriff auf kostenpflichtige Funktionen über den Bewertungszeitraum hinaus erfordert die Aktivierung unter einer gültigen Personen- oder Enterprise-Lizenz. Für die Enterprise-Lizenzierung wenden Sie sich bitte an sales@pangolin.net."
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"form": {
|
"form": {
|
||||||
"useCaseQuestion": "Are you using Pangolin for personal or business use?",
|
"useCaseQuestion": "Benutzen Sie Pangolin für den persönlichen oder geschäftlichen Gebrauch?",
|
||||||
"firstName": "First Name",
|
"firstName": "Vorname",
|
||||||
"lastName": "Last Name",
|
"lastName": "Nachname",
|
||||||
"jobTitle": "Job Title",
|
"jobTitle": "Job Titel",
|
||||||
"primaryUseQuestion": "What do you primarily plan to use Pangolin for?",
|
"primaryUseQuestion": "Wofür planen Sie in erster Linie Pangolin zu benutzen?",
|
||||||
"industryQuestion": "What is your industry?",
|
"industryQuestion": "Was ist Ihre Branche?",
|
||||||
"prospectiveUsersQuestion": "How many prospective users do you expect to have?",
|
"prospectiveUsersQuestion": "Wie viele Interessenten erwarten Sie?",
|
||||||
"prospectiveSitesQuestion": "How many prospective sites (tunnels) do you expect to have?",
|
"prospectiveSitesQuestion": "Wie viele potentielle Standorte (Tunnel) erwarten Sie?",
|
||||||
"companyName": "Company name",
|
"companyName": "Firmenname",
|
||||||
"countryOfResidence": "Country of residence",
|
"countryOfResidence": "Land des Wohnsitzes",
|
||||||
"stateProvinceRegion": "State / Province / Region",
|
"stateProvinceRegion": "Bundesland / Provinz / Region",
|
||||||
"postalZipCode": "Postal / ZIP Code",
|
"postalZipCode": "Postleitzahl",
|
||||||
"companyWebsite": "Company website",
|
"companyWebsite": "Firmen-Webseite",
|
||||||
"companyPhoneNumber": "Company phone number",
|
"companyPhoneNumber": "Firmennummer",
|
||||||
"country": "Country",
|
"country": "Land",
|
||||||
"phoneNumberOptional": "Phone number (optional)",
|
"phoneNumberOptional": "Telefonnummer (optional)",
|
||||||
"complianceConfirmation": "I confirm that I am in compliance with the Fossorial Commercial License and that reporting inaccurate information or misidentifying use of the product is a violation of the license."
|
"complianceConfirmation": "Ich bestätige, dass die von mir übermittelten Informationen korrekt sind und dass ich im Einklang mit der Fossorial Commercial License bin. Die Meldung ungenauer Informationen oder die falsche Identifizierung der Nutzung des Produkts stellt eine Verletzung der Lizenz dar und kann dazu führen, dass Ihr Schlüssel widerrufen wird."
|
||||||
},
|
},
|
||||||
"buttons": {
|
"buttons": {
|
||||||
"close": "Close",
|
"close": "Schließen",
|
||||||
"previous": "Previous",
|
"previous": "Vorherige",
|
||||||
"next": "Next",
|
"next": "Nächste",
|
||||||
"generateLicenseKey": "Generate License Key"
|
"generateLicenseKey": "Lizenzschlüssel generieren"
|
||||||
},
|
},
|
||||||
"toasts": {
|
"toasts": {
|
||||||
"success": {
|
"success": {
|
||||||
"title": "License key generated successfully",
|
"title": "Lizenzschlüssel erfolgreich erstellt",
|
||||||
"description": "Your license key has been generated and is ready to use."
|
"description": "Ihr Lizenzschlüssel wurde generiert und kann verwendet werden."
|
||||||
},
|
},
|
||||||
"error": {
|
"error": {
|
||||||
"title": "Failed to generate license key",
|
"title": "Fehler beim Generieren des Lizenzschlüssels",
|
||||||
"description": "An error occurred while generating the license key."
|
"description": "Beim Generieren des Lizenzschlüssels ist ein Fehler aufgetreten."
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"priority": "Priorität",
|
"priority": "Priorität",
|
||||||
"priorityDescription": "Die Routen mit höherer Priorität werden zuerst ausgewertet. Priorität = 100 bedeutet automatische Bestellung (Systementscheidung). Verwenden Sie eine andere Nummer, um manuelle Priorität zu erzwingen.",
|
"priorityDescription": "Die Routen mit höherer Priorität werden zuerst ausgewertet. Priorität = 100 bedeutet automatische Bestellung (Systementscheidung). Verwenden Sie eine andere Nummer, um manuelle Priorität zu erzwingen.",
|
||||||
"instanceName": "Instance Name",
|
"instanceName": "Instanzname",
|
||||||
"pathMatchModalTitle": "Configure Path Matching",
|
"pathMatchModalTitle": "Pfad anpassen konfigurieren",
|
||||||
"pathMatchModalDescription": "Set up how incoming requests should be matched based on their path.",
|
"pathMatchModalDescription": "Legen Sie fest, wie eingehende Anfragen basierend auf ihrem Pfad übereinstimmen sollen.",
|
||||||
"pathMatchType": "Match Type",
|
"pathMatchType": "Übereinstimmungstyp",
|
||||||
"pathMatchPrefix": "Prefix",
|
"pathMatchPrefix": "Präfix",
|
||||||
"pathMatchExact": "Exact",
|
"pathMatchExact": "Exakt",
|
||||||
"pathMatchRegex": "Regex",
|
"pathMatchRegex": "Regex",
|
||||||
"pathMatchValue": "Path Value",
|
"pathMatchValue": "Pfadwert",
|
||||||
"clear": "Clear",
|
"clear": "Leeren",
|
||||||
"saveChanges": "Save Changes",
|
"saveChanges": "Änderungen speichern",
|
||||||
"pathMatchRegexPlaceholder": "^/api/.*",
|
"pathMatchRegexPlaceholder": "^/api/.*",
|
||||||
"pathMatchDefaultPlaceholder": "/path",
|
"pathMatchDefaultPlaceholder": "/Pfad",
|
||||||
"pathMatchPrefixHelp": "Example: /api matches /api, /api/users, etc.",
|
"pathMatchPrefixHelp": "Beispiel: /api trifft /api, /api/users etc.",
|
||||||
"pathMatchExactHelp": "Example: /api matches only /api",
|
"pathMatchExactHelp": "Beispiel: /api passt nur auf /api",
|
||||||
"pathMatchRegexHelp": "Example: ^/api/.* matches /api/anything",
|
"pathMatchRegexHelp": "Beispiel: ^/api/.* entspricht /api/anything",
|
||||||
"pathRewriteModalTitle": "Configure Path Rewriting",
|
"pathRewriteModalTitle": "Pfad Rewriting konfigurieren",
|
||||||
"pathRewriteModalDescription": "Transform the matched path before forwarding to the target.",
|
"pathRewriteModalDescription": "Transformieren Sie den übereinstimmenden Pfad bevor Sie zum Ziel weiterleiten.",
|
||||||
"pathRewriteType": "Rewrite Type",
|
"pathRewriteType": "Rewrite Typ",
|
||||||
"pathRewritePrefixOption": "Prefix - Replace prefix",
|
"pathRewritePrefixOption": "Präfix - Präfix ersetzen",
|
||||||
"pathRewriteExactOption": "Exact - Replace entire path",
|
"pathRewriteExactOption": "Exakt - Gesamten Pfad ersetzen",
|
||||||
"pathRewriteRegexOption": "Regex - Pattern replacement",
|
"pathRewriteRegexOption": "Regex - Musterersetzung",
|
||||||
"pathRewriteStripPrefixOption": "Strip Prefix - Remove prefix",
|
"pathRewriteStripPrefixOption": "Präfix entfernen - Präfix entfernen",
|
||||||
"pathRewriteValue": "Rewrite Value",
|
"pathRewriteValue": "Wert umschreiben",
|
||||||
"pathRewriteRegexPlaceholder": "/new/$1",
|
"pathRewriteRegexPlaceholder": "/neu/$1",
|
||||||
"pathRewriteDefaultPlaceholder": "/new-path",
|
"pathRewriteDefaultPlaceholder": "/new-path",
|
||||||
"pathRewritePrefixHelp": "Replace the matched prefix with this value",
|
"pathRewritePrefixHelp": "Ersetze das passende Präfix mit diesem Wert",
|
||||||
"pathRewriteExactHelp": "Replace the entire path with this value when the path matches exactly",
|
"pathRewriteExactHelp": "Ersetze den gesamten Pfad mit diesem Wert, wenn der Pfad genau zutrifft",
|
||||||
"pathRewriteRegexHelp": "Use capture groups like $1, $2 for replacement",
|
"pathRewriteRegexHelp": "Capture-Gruppen wie $1, $2 zum Ersetzen verwenden",
|
||||||
"pathRewriteStripPrefixHelp": "Leave empty to strip prefix or provide new prefix",
|
"pathRewriteStripPrefixHelp": "Leer lassen, um Präfix zu entfernen oder neues Präfix anzugeben",
|
||||||
"pathRewritePrefix": "Prefix",
|
"pathRewritePrefix": "Präfix",
|
||||||
"pathRewriteExact": "Exact",
|
"pathRewriteExact": "Exakt",
|
||||||
"pathRewriteRegex": "Regex",
|
"pathRewriteRegex": "Regex",
|
||||||
"pathRewriteStrip": "Strip",
|
"pathRewriteStrip": "Entfernen",
|
||||||
"pathRewriteStripLabel": "strip"
|
"pathRewriteStripLabel": "entfernen",
|
||||||
|
"sidebarEnableEnterpriseLicense": "Enterprise-Lizenz aktivieren",
|
||||||
|
"cannotbeUndone": "Dies kann nicht rückgängig gemacht werden.",
|
||||||
|
"toConfirm": "bestätigen",
|
||||||
|
"deleteClientQuestion": "Sind Sie sicher, dass Sie den Client von der Website und der Organisation entfernen möchten?",
|
||||||
|
"clientMessageRemove": "Nach dem Entfernen kann sich der Client nicht mehr mit der Website verbinden.",
|
||||||
|
"sidebarLogs": "Logs",
|
||||||
|
"request": "Anfrage",
|
||||||
|
"logs": "Logs",
|
||||||
|
"logsSettingsDescription": "Aus dieser Orginisierung gesammelte Logs überwachen",
|
||||||
|
"searchLogs": "Logs suchen...",
|
||||||
|
"action": "Aktion",
|
||||||
|
"actor": "Akteur",
|
||||||
|
"timestamp": "Zeitstempel",
|
||||||
|
"accessLogs": "Zugriffsprotokolle",
|
||||||
|
"exportCsv": "CSV exportieren",
|
||||||
|
"actorId": "Akteur-ID",
|
||||||
|
"allowedByRule": "Erlaubt durch Regel",
|
||||||
|
"allowedNoAuth": "Keine Auth erlaubt",
|
||||||
|
"validAccessToken": "Gültiges Zugriffstoken",
|
||||||
|
"validHeaderAuth": "Valid header auth",
|
||||||
|
"validPincode": "Valid Pincode",
|
||||||
|
"validPassword": "Gültiges Passwort",
|
||||||
|
"validEmail": "Valid email",
|
||||||
|
"validSSO": "Valid SSO",
|
||||||
|
"resourceBlocked": "Ressource blockiert",
|
||||||
|
"droppedByRule": "Abgelegt durch Regel",
|
||||||
|
"noSessions": "Keine Sitzungen",
|
||||||
|
"temporaryRequestToken": "Temporäres Anfrage-Token",
|
||||||
|
"noMoreAuthMethods": "No Valid Auth",
|
||||||
|
"ip": "IP",
|
||||||
|
"reason": "Grund",
|
||||||
|
"requestLogs": "Logs anfordern",
|
||||||
|
"host": "Host",
|
||||||
|
"location": "Standort",
|
||||||
|
"actionLogs": "Aktionsprotokolle",
|
||||||
|
"sidebarLogsRequest": "Logs anfordern",
|
||||||
|
"sidebarLogsAccess": "Zugriffsprotokolle",
|
||||||
|
"sidebarLogsAction": "Aktionsprotokolle",
|
||||||
|
"logRetention": "Log-Speicherung",
|
||||||
|
"logRetentionDescription": "Verwalten, wie lange verschiedene Logs für diese Organisation gespeichert werden oder deaktivieren",
|
||||||
|
"requestLogsDescription": "Detaillierte Request-Logs für Ressourcen in dieser Organisation anzeigen",
|
||||||
|
"logRetentionRequestLabel": "Log-Speicherung anfordern",
|
||||||
|
"logRetentionRequestDescription": "Wie lange sollen Request-Logs gespeichert werden",
|
||||||
|
"logRetentionAccessLabel": "Zugriffsprotokoll-Speicherung",
|
||||||
|
"logRetentionAccessDescription": "Wie lange Zugriffsprotokolle beibehalten werden sollen",
|
||||||
|
"logRetentionActionLabel": "Aktionsprotokoll-Speicherung",
|
||||||
|
"logRetentionActionDescription": "Dauer des Action-Logs",
|
||||||
|
"logRetentionDisabled": "Deaktiviert",
|
||||||
|
"logRetention3Days": "3 Tage",
|
||||||
|
"logRetention7Days": "7 Tage",
|
||||||
|
"logRetention14Days": "14 Tage",
|
||||||
|
"logRetention30Days": "30 Tage",
|
||||||
|
"logRetention90Days": "90 Tage",
|
||||||
|
"logRetentionForever": "Für immer",
|
||||||
|
"actionLogsDescription": "Verlauf der in dieser Organisation durchgeführten Aktionen anzeigen",
|
||||||
|
"accessLogsDescription": "Zugriffsauth-Anfragen für Ressourcen in dieser Organisation anzeigen",
|
||||||
|
"licenseRequiredToUse": "Um diese Funktion nutzen zu können, ist eine Enterprise-Lizenz erforderlich.",
|
||||||
|
"certResolver": "Zertifikatsauflöser",
|
||||||
|
"certResolverDescription": "Wählen Sie den Zertifikatslöser aus, der für diese Ressource verwendet werden soll.",
|
||||||
|
"selectCertResolver": "Zertifikatsauflöser auswählen",
|
||||||
|
"enterCustomResolver": "Eigenen Auflöser eingeben",
|
||||||
|
"preferWildcardCert": "Wildcard-Zertifikat bevorzugen",
|
||||||
|
"unverified": "Nicht verifiziert",
|
||||||
|
"domainSetting": "Domänen-Einstellungen",
|
||||||
|
"domainSettingDescription": "Einstellungen für Ihre Domain konfigurieren",
|
||||||
|
"preferWildcardCertDescription": "Versuch ein Platzhalterzertifikat zu generieren (erfordert einen richtig konfigurierten Zertifikatslöser).",
|
||||||
|
"recordName": "Name des Datensatzes",
|
||||||
|
"auto": "Auto",
|
||||||
|
"TTL": "TTL",
|
||||||
|
"howToAddRecords": "So kann man Datensätze hinzufügen",
|
||||||
|
"dnsRecord": "DNS-Einträge",
|
||||||
|
"required": "Benötigt",
|
||||||
|
"domainSettingsUpdated": "Domain-Einstellungen erfolgreich aktualisiert",
|
||||||
|
"orgOrDomainIdMissing": "Organisation oder Domänen-ID fehlt",
|
||||||
|
"loadingDNSRecords": "Lade DNS-Einträge...",
|
||||||
|
"olmUpdateAvailableInfo": "Eine aktualisierte Version von Olm ist verfügbar. Bitte aktualisieren Sie auf die neueste Version für die beste Erfahrung.",
|
||||||
|
"client": "Kunde",
|
||||||
|
"proxyProtocol": "Proxy-Protokoll-Einstellungen",
|
||||||
|
"proxyProtocolDescription": "Konfigurieren Sie das Proxy-Protokoll, um die IP-Adressen des Clients für TCP/UDP-Dienste zu erhalten.",
|
||||||
|
"enableProxyProtocol": "Proxy-Protokoll aktivieren",
|
||||||
|
"proxyProtocolInfo": "Client-IP-Adressen für TCP/UDP Backends beibehalten",
|
||||||
|
"proxyProtocolVersion": "Proxy-Protokollversion",
|
||||||
|
"version1": " Version 1 (empfohlen)",
|
||||||
|
"version2": "Version 2",
|
||||||
|
"versionDescription": "Die Version 1 ist textbasiert und unterstützt die Version 2, ist binär und effizienter, aber weniger kompatibel.",
|
||||||
|
"warning": "Warnung",
|
||||||
|
"proxyProtocolWarning": "Ihre Backend-Anwendung muss so konfiguriert sein, dass sie Proxy-Protokoll-Verbindungen akzeptiert. Wenn Ihr Backend das Proxy-Protokoll nicht unterstützt, wird die Aktivierung dieser Option alle Verbindungen zerstören. Stellen Sie sicher, dass Sie Ihr Backend so konfigurieren, dass es Proxy-Protokoll-Header von Traefik vertraut.",
|
||||||
|
"restarting": "Neustarten...",
|
||||||
|
"manual": "Manuell",
|
||||||
|
"messageSupport": "Nachrichtenunterstützung",
|
||||||
|
"supportNotAvailableTitle": "Support nicht verfügbar",
|
||||||
|
"supportNotAvailableDescription": "Support ist momentan nicht verfügbar. Sie können eine E-Mail an support@pangolin.net senden.",
|
||||||
|
"supportRequestSentTitle": "Supportanfrage gesendet",
|
||||||
|
"supportRequestSentDescription": "Ihre Nachricht wurde erfolgreich gesendet.",
|
||||||
|
"supportRequestFailedTitle": "Senden der Anfrage fehlgeschlagen",
|
||||||
|
"supportRequestFailedDescription": "Beim Senden Ihrer Supportanfrage ist ein Fehler aufgetreten.",
|
||||||
|
"supportSubjectRequired": "Betreff ist erforderlich",
|
||||||
|
"supportSubjectMaxLength": "Betreff muss mindestens 255 Zeichen lang sein",
|
||||||
|
"supportMessageRequired": "Nachricht ist erforderlich",
|
||||||
|
"supportReplyTo": "Antwort an",
|
||||||
|
"supportSubject": "Betreff",
|
||||||
|
"supportSubjectPlaceholder": "Betreff eingeben",
|
||||||
|
"supportMessage": "Nachricht",
|
||||||
|
"supportMessagePlaceholder": "Geben Sie Ihre Nachricht ein",
|
||||||
|
"supportSending": "Senden...",
|
||||||
|
"supportSend": "Senden",
|
||||||
|
"supportMessageSent": "Nachricht gesendet!",
|
||||||
|
"supportWillContact": "Wir werden in Kürze kontaktieren!"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -47,9 +47,8 @@
|
|||||||
"edit": "Edit",
|
"edit": "Edit",
|
||||||
"siteConfirmDelete": "Confirm Delete Site",
|
"siteConfirmDelete": "Confirm Delete Site",
|
||||||
"siteDelete": "Delete Site",
|
"siteDelete": "Delete Site",
|
||||||
"siteMessageRemove": "Once removed, the site will no longer be accessible. All resources and targets associated with the site will also be removed.",
|
"siteMessageRemove": "Once removed the site will no longer be accessible. All targets associated with the site will also be removed.",
|
||||||
"siteMessageConfirm": "To confirm, please type the name of the site below.",
|
"siteQuestionRemove": "Are you sure you want to remove the site from the organization?",
|
||||||
"siteQuestionRemove": "Are you sure you want to remove the site {selectedSite} from the organization?",
|
|
||||||
"siteManageSites": "Manage Sites",
|
"siteManageSites": "Manage Sites",
|
||||||
"siteDescription": "Allow connectivity to your network through secure tunnels",
|
"siteDescription": "Allow connectivity to your network through secure tunnels",
|
||||||
"siteCreate": "Create Site",
|
"siteCreate": "Create Site",
|
||||||
@@ -154,8 +153,7 @@
|
|||||||
"protected": "Protected",
|
"protected": "Protected",
|
||||||
"notProtected": "Not Protected",
|
"notProtected": "Not Protected",
|
||||||
"resourceMessageRemove": "Once removed, the resource will no longer be accessible. All targets associated with the resource will also be removed.",
|
"resourceMessageRemove": "Once removed, the resource will no longer be accessible. All targets associated with the resource will also be removed.",
|
||||||
"resourceMessageConfirm": "To confirm, please type the name of the resource below.",
|
"resourceQuestionRemove": "Are you sure you want to remove the resource from the organization?",
|
||||||
"resourceQuestionRemove": "Are you sure you want to remove the resource {selectedResource} from the organization?",
|
|
||||||
"resourceHTTP": "HTTPS Resource",
|
"resourceHTTP": "HTTPS Resource",
|
||||||
"resourceHTTPDescription": "Proxy requests to your app over HTTPS using a subdomain or base domain.",
|
"resourceHTTPDescription": "Proxy requests to your app over HTTPS using a subdomain or base domain.",
|
||||||
"resourceRaw": "Raw TCP/UDP Resource",
|
"resourceRaw": "Raw TCP/UDP Resource",
|
||||||
@@ -209,7 +207,7 @@
|
|||||||
"alwaysAllow": "Always Allow",
|
"alwaysAllow": "Always Allow",
|
||||||
"alwaysDeny": "Always Deny",
|
"alwaysDeny": "Always Deny",
|
||||||
"passToAuth": "Pass to Auth",
|
"passToAuth": "Pass to Auth",
|
||||||
"orgSettingsDescription": "Configure your organization's general settings",
|
"orgSettingsDescription": "Configure your organization's settings",
|
||||||
"orgGeneralSettings": "Organization Settings",
|
"orgGeneralSettings": "Organization Settings",
|
||||||
"orgGeneralSettingsDescription": "Manage your organization details and configuration",
|
"orgGeneralSettingsDescription": "Manage your organization details and configuration",
|
||||||
"saveGeneralSettings": "Save General Settings",
|
"saveGeneralSettings": "Save General Settings",
|
||||||
@@ -220,7 +218,7 @@
|
|||||||
"orgDeleteConfirm": "Confirm Delete Organization",
|
"orgDeleteConfirm": "Confirm Delete Organization",
|
||||||
"orgMessageRemove": "This action is irreversible and will delete all associated data.",
|
"orgMessageRemove": "This action is irreversible and will delete all associated data.",
|
||||||
"orgMessageConfirm": "To confirm, please type the name of the organization below.",
|
"orgMessageConfirm": "To confirm, please type the name of the organization below.",
|
||||||
"orgQuestionRemove": "Are you sure you want to remove the organization {selectedOrg}?",
|
"orgQuestionRemove": "Are you sure you want to remove the organization?",
|
||||||
"orgUpdated": "Organization updated",
|
"orgUpdated": "Organization updated",
|
||||||
"orgUpdatedDescription": "The organization has been updated.",
|
"orgUpdatedDescription": "The organization has been updated.",
|
||||||
"orgErrorUpdate": "Failed to update organization",
|
"orgErrorUpdate": "Failed to update organization",
|
||||||
@@ -287,9 +285,8 @@
|
|||||||
"apiKeysAdd": "Generate API Key",
|
"apiKeysAdd": "Generate API Key",
|
||||||
"apiKeysErrorDelete": "Error deleting API key",
|
"apiKeysErrorDelete": "Error deleting API key",
|
||||||
"apiKeysErrorDeleteMessage": "Error deleting API key",
|
"apiKeysErrorDeleteMessage": "Error deleting API key",
|
||||||
"apiKeysQuestionRemove": "Are you sure you want to remove the API key {selectedApiKey} from the organization?",
|
"apiKeysQuestionRemove": "Are you sure you want to remove the API key from the organization?",
|
||||||
"apiKeysMessageRemove": "Once removed, the API key will no longer be able to be used.",
|
"apiKeysMessageRemove": "Once removed, the API key will no longer be able to be used.",
|
||||||
"apiKeysMessageConfirm": "To confirm, please type the name of the API key below.",
|
|
||||||
"apiKeysDeleteConfirm": "Confirm Delete API Key",
|
"apiKeysDeleteConfirm": "Confirm Delete API Key",
|
||||||
"apiKeysDelete": "Delete API Key",
|
"apiKeysDelete": "Delete API Key",
|
||||||
"apiKeysManage": "Manage API Keys",
|
"apiKeysManage": "Manage API Keys",
|
||||||
@@ -305,8 +302,7 @@
|
|||||||
"userDeleteConfirm": "Confirm Delete User",
|
"userDeleteConfirm": "Confirm Delete User",
|
||||||
"userDeleteServer": "Delete User from Server",
|
"userDeleteServer": "Delete User from Server",
|
||||||
"userMessageRemove": "The user will be removed from all organizations and be completely removed from the server.",
|
"userMessageRemove": "The user will be removed from all organizations and be completely removed from the server.",
|
||||||
"userMessageConfirm": "To confirm, please type the name of the user below.",
|
"userQuestionRemove": "Are you sure you want to permanently delete user from the server?",
|
||||||
"userQuestionRemove": "Are you sure you want to permanently delete {selectedUser} from the server?",
|
|
||||||
"licenseKey": "License Key",
|
"licenseKey": "License Key",
|
||||||
"valid": "Valid",
|
"valid": "Valid",
|
||||||
"numberOfSites": "Number of Sites",
|
"numberOfSites": "Number of Sites",
|
||||||
@@ -339,7 +335,7 @@
|
|||||||
"fossorialLicense": "View Fossorial Commercial License & Subscription Terms",
|
"fossorialLicense": "View Fossorial Commercial License & Subscription Terms",
|
||||||
"licenseMessageRemove": "This will remove the license key and all associated permissions granted by it.",
|
"licenseMessageRemove": "This will remove the license key and all associated permissions granted by it.",
|
||||||
"licenseMessageConfirm": "To confirm, please type the license key below.",
|
"licenseMessageConfirm": "To confirm, please type the license key below.",
|
||||||
"licenseQuestionRemove": "Are you sure you want to delete the license key {selectedKey} ?",
|
"licenseQuestionRemove": "Are you sure you want to delete the license key ?",
|
||||||
"licenseKeyDelete": "Delete License Key",
|
"licenseKeyDelete": "Delete License Key",
|
||||||
"licenseKeyDeleteConfirm": "Confirm Delete License Key",
|
"licenseKeyDeleteConfirm": "Confirm Delete License Key",
|
||||||
"licenseTitle": "Manage License Status",
|
"licenseTitle": "Manage License Status",
|
||||||
@@ -372,7 +368,7 @@
|
|||||||
"inviteRemoveErrorDescription": "An error occurred while removing the invitation.",
|
"inviteRemoveErrorDescription": "An error occurred while removing the invitation.",
|
||||||
"inviteRemoved": "Invitation removed",
|
"inviteRemoved": "Invitation removed",
|
||||||
"inviteRemovedDescription": "The invitation for {email} has been removed.",
|
"inviteRemovedDescription": "The invitation for {email} has been removed.",
|
||||||
"inviteQuestionRemove": "Are you sure you want to remove the invitation {email}?",
|
"inviteQuestionRemove": "Are you sure you want to remove the invitation?",
|
||||||
"inviteMessageRemove": "Once removed, this invitation will no longer be valid. You can always re-invite the user later.",
|
"inviteMessageRemove": "Once removed, this invitation will no longer be valid. You can always re-invite the user later.",
|
||||||
"inviteMessageConfirm": "To confirm, please type the email address of the invitation below.",
|
"inviteMessageConfirm": "To confirm, please type the email address of the invitation below.",
|
||||||
"inviteQuestionRegenerate": "Are you sure you want to regenerate the invitation for {email}? This will revoke the previous invitation.",
|
"inviteQuestionRegenerate": "Are you sure you want to regenerate the invitation for {email}? This will revoke the previous invitation.",
|
||||||
@@ -398,9 +394,8 @@
|
|||||||
"userErrorOrgRemoveDescription": "An error occurred while removing the user.",
|
"userErrorOrgRemoveDescription": "An error occurred while removing the user.",
|
||||||
"userOrgRemoved": "User removed",
|
"userOrgRemoved": "User removed",
|
||||||
"userOrgRemovedDescription": "The user {email} has been removed from the organization.",
|
"userOrgRemovedDescription": "The user {email} has been removed from the organization.",
|
||||||
"userQuestionOrgRemove": "Are you sure you want to remove {email} from the organization?",
|
"userQuestionOrgRemove": "Are you sure you want to remove this user from the organization?",
|
||||||
"userMessageOrgRemove": "Once removed, this user will no longer have access to the organization. You can always re-invite them later, but they will need to accept the invitation again.",
|
"userMessageOrgRemove": "Once removed, this user will no longer have access to the organization. You can always re-invite them later, but they will need to accept the invitation again.",
|
||||||
"userMessageOrgConfirm": "To confirm, please type the name of the of the user below.",
|
|
||||||
"userRemoveOrgConfirm": "Confirm Remove User",
|
"userRemoveOrgConfirm": "Confirm Remove User",
|
||||||
"userRemoveOrg": "Remove User from Organization",
|
"userRemoveOrg": "Remove User from Organization",
|
||||||
"users": "Users",
|
"users": "Users",
|
||||||
@@ -742,7 +737,7 @@
|
|||||||
"idpManageDescription": "View and manage identity providers in the system",
|
"idpManageDescription": "View and manage identity providers in the system",
|
||||||
"idpDeletedDescription": "Identity provider deleted successfully",
|
"idpDeletedDescription": "Identity provider deleted successfully",
|
||||||
"idpOidc": "OAuth2/OIDC",
|
"idpOidc": "OAuth2/OIDC",
|
||||||
"idpQuestionRemove": "Are you sure you want to permanently delete the identity provider {name}?",
|
"idpQuestionRemove": "Are you sure you want to permanently delete the identity provider?",
|
||||||
"idpMessageRemove": "This will remove the identity provider and all associated configurations. Users who authenticate through this provider will no longer be able to log in.",
|
"idpMessageRemove": "This will remove the identity provider and all associated configurations. Users who authenticate through this provider will no longer be able to log in.",
|
||||||
"idpMessageConfirm": "To confirm, please type the name of the identity provider below.",
|
"idpMessageConfirm": "To confirm, please type the name of the identity provider below.",
|
||||||
"idpConfirmDelete": "Confirm Delete Identity Provider",
|
"idpConfirmDelete": "Confirm Delete Identity Provider",
|
||||||
@@ -916,6 +911,18 @@
|
|||||||
"passwordResetCodeDescription": "Check your email for the reset code.",
|
"passwordResetCodeDescription": "Check your email for the reset code.",
|
||||||
"passwordNew": "New Password",
|
"passwordNew": "New Password",
|
||||||
"passwordNewConfirm": "Confirm New Password",
|
"passwordNewConfirm": "Confirm New Password",
|
||||||
|
"changePassword": "Change Password",
|
||||||
|
"changePasswordDescription": "Update your account password",
|
||||||
|
"oldPassword": "Current Password",
|
||||||
|
"newPassword": "New Password",
|
||||||
|
"confirmNewPassword": "Confirm New Password",
|
||||||
|
"changePasswordError": "Failed to change password",
|
||||||
|
"changePasswordErrorDescription": "An error occurred while changing your password",
|
||||||
|
"changePasswordSuccess": "Password Changed Successfully",
|
||||||
|
"changePasswordSuccessDescription": "Your password has been updated successfully",
|
||||||
|
"passwordExpiryRequired": "Password Expiry Required",
|
||||||
|
"passwordExpiryDescription": "This organization requires you to change your password every {maxDays} days.",
|
||||||
|
"changePasswordNow": "Change Password Now",
|
||||||
"pincodeAuth": "Authenticator Code",
|
"pincodeAuth": "Authenticator Code",
|
||||||
"pincodeSubmit2": "Submit Code",
|
"pincodeSubmit2": "Submit Code",
|
||||||
"passwordResetSubmit": "Request Reset",
|
"passwordResetSubmit": "Request Reset",
|
||||||
@@ -1156,6 +1163,25 @@
|
|||||||
"sidebarLicense": "License",
|
"sidebarLicense": "License",
|
||||||
"sidebarClients": "Clients",
|
"sidebarClients": "Clients",
|
||||||
"sidebarDomains": "Domains",
|
"sidebarDomains": "Domains",
|
||||||
|
"sidebarBluePrints": "Blueprints",
|
||||||
|
"blueprints": "Blueprints",
|
||||||
|
"blueprintsDescription": "Blueprints are declarative YAML configurations that define your resources and their settings",
|
||||||
|
"blueprintAdd": "Add Blueprint",
|
||||||
|
"blueprintGoBack": "See all Blueprints",
|
||||||
|
"blueprintCreate": "Create Blueprint",
|
||||||
|
"blueprintCreateDescription2": "Follow the steps below to create and apply a new blueprint",
|
||||||
|
"blueprintDetails": "Blueprint details",
|
||||||
|
"blueprintDetailsDescription": "See the blueprint run details",
|
||||||
|
"blueprintInfo": "Blueprint Information",
|
||||||
|
"message": "Message",
|
||||||
|
"blueprintContentsDescription": "Define the YAML content describing your infrastructure",
|
||||||
|
"blueprintErrorCreateDescription": "An error occurred when applying the blueprint",
|
||||||
|
"blueprintErrorCreate": "Error creating blueprint",
|
||||||
|
"searchBlueprintProgress": "Search blueprints...",
|
||||||
|
"appliedAt": "Applied At",
|
||||||
|
"source": "Source",
|
||||||
|
"contents": "Contents",
|
||||||
|
"parsedContents": "Parsed Contents",
|
||||||
"enableDockerSocket": "Enable Docker Blueprint",
|
"enableDockerSocket": "Enable Docker Blueprint",
|
||||||
"enableDockerSocketDescription": "Enable Docker Socket label scraping for blueprint labels. Socket path must be provided to Newt.",
|
"enableDockerSocketDescription": "Enable Docker Socket label scraping for blueprint labels. Socket path must be provided to Newt.",
|
||||||
"enableDockerSocketLink": "Learn More",
|
"enableDockerSocketLink": "Learn More",
|
||||||
@@ -1211,9 +1237,8 @@
|
|||||||
"domainCreate": "Create Domain",
|
"domainCreate": "Create Domain",
|
||||||
"domainCreatedDescription": "Domain created successfully",
|
"domainCreatedDescription": "Domain created successfully",
|
||||||
"domainDeletedDescription": "Domain deleted successfully",
|
"domainDeletedDescription": "Domain deleted successfully",
|
||||||
"domainQuestionRemove": "Are you sure you want to remove the domain {domain} from your account?",
|
"domainQuestionRemove": "Are you sure you want to remove the domain from your account?",
|
||||||
"domainMessageRemove": "Once removed, the domain will no longer be associated with your account.",
|
"domainMessageRemove": "Once removed, the domain will no longer be associated with your account.",
|
||||||
"domainMessageConfirm": "To confirm, please type the domain name below.",
|
|
||||||
"domainConfirmDelete": "Confirm Delete Domain",
|
"domainConfirmDelete": "Confirm Delete Domain",
|
||||||
"domainDelete": "Delete Domain",
|
"domainDelete": "Delete Domain",
|
||||||
"domain": "Domain",
|
"domain": "Domain",
|
||||||
@@ -1280,7 +1305,7 @@
|
|||||||
"billingFreeTier": "Free Tier",
|
"billingFreeTier": "Free Tier",
|
||||||
"billingWarningOverLimit": "Warning: You have exceeded one or more usage limits. Your sites will not connect until you modify your subscription or adjust your usage.",
|
"billingWarningOverLimit": "Warning: You have exceeded one or more usage limits. Your sites will not connect until you modify your subscription or adjust your usage.",
|
||||||
"billingUsageLimitsOverview": "Usage Limits Overview",
|
"billingUsageLimitsOverview": "Usage Limits Overview",
|
||||||
"billingMonitorUsage": "Monitor your usage against configured limits. If you need limits increased please contact us support@fossorial.io.",
|
"billingMonitorUsage": "Monitor your usage against configured limits. If you need limits increased please contact us support@pangolin.net.",
|
||||||
"billingDataUsage": "Data Usage",
|
"billingDataUsage": "Data Usage",
|
||||||
"billingOnlineTime": "Site Online Time",
|
"billingOnlineTime": "Site Online Time",
|
||||||
"billingUsers": "Active Users",
|
"billingUsers": "Active Users",
|
||||||
@@ -1346,6 +1371,19 @@
|
|||||||
"securityKeyUnknownError": "There was a problem using your security key. Please try again.",
|
"securityKeyUnknownError": "There was a problem using your security key. Please try again.",
|
||||||
"twoFactorRequired": "Two-factor authentication is required to register a security key.",
|
"twoFactorRequired": "Two-factor authentication is required to register a security key.",
|
||||||
"twoFactor": "Two-Factor Authentication",
|
"twoFactor": "Two-Factor Authentication",
|
||||||
|
"twoFactorAuthentication": "Two-Factor Authentication",
|
||||||
|
"twoFactorDescription": "This organization requires two-factor authentication.",
|
||||||
|
"enableTwoFactor": "Enable Two-Factor Authentication",
|
||||||
|
"organizationSecurityPolicy": "Organization Security Policy",
|
||||||
|
"organizationSecurityPolicyDescription": "This organization has security requirements that must be met before you can access it",
|
||||||
|
"securityRequirements": "Security Requirements",
|
||||||
|
"allRequirementsMet": "All requirements have been met",
|
||||||
|
"completeRequirementsToContinue": "Complete the requirements below to continue accessing this organization",
|
||||||
|
"youCanNowAccessOrganization": "You can now access this organization",
|
||||||
|
"reauthenticationRequired": "Session Length",
|
||||||
|
"reauthenticationDescription": "This organization requires you to log in every {maxDays} days.",
|
||||||
|
"reauthenticationDescriptionHours": "This organization requires you to log in every {maxHours} hours.",
|
||||||
|
"reauthenticateNow": "Log In Again",
|
||||||
"adminEnabled2FaOnYourAccount": "Your administrator has enabled two-factor authentication for {email}. Please complete the setup process to continue.",
|
"adminEnabled2FaOnYourAccount": "Your administrator has enabled two-factor authentication for {email}. Please complete the setup process to continue.",
|
||||||
"securityKeyAdd": "Add Security Key",
|
"securityKeyAdd": "Add Security Key",
|
||||||
"securityKeyRegisterTitle": "Register New Security Key",
|
"securityKeyRegisterTitle": "Register New Security Key",
|
||||||
@@ -1563,9 +1601,8 @@
|
|||||||
"searchRemoteExitNodes": "Search nodes...",
|
"searchRemoteExitNodes": "Search nodes...",
|
||||||
"remoteExitNodeAdd": "Add Node",
|
"remoteExitNodeAdd": "Add Node",
|
||||||
"remoteExitNodeErrorDelete": "Error deleting node",
|
"remoteExitNodeErrorDelete": "Error deleting node",
|
||||||
"remoteExitNodeQuestionRemove": "Are you sure you want to remove the node {selectedNode} from the organization?",
|
"remoteExitNodeQuestionRemove": "Are you sure you want to remove the node from the organization?",
|
||||||
"remoteExitNodeMessageRemove": "Once removed, the node will no longer be accessible.",
|
"remoteExitNodeMessageRemove": "Once removed, the node will no longer be accessible.",
|
||||||
"remoteExitNodeMessageConfirm": "To confirm, please type the name of the node below.",
|
|
||||||
"remoteExitNodeConfirmDelete": "Confirm Delete Node",
|
"remoteExitNodeConfirmDelete": "Confirm Delete Node",
|
||||||
"remoteExitNodeDelete": "Delete Node",
|
"remoteExitNodeDelete": "Delete Node",
|
||||||
"sidebarRemoteExitNodes": "Remote Nodes",
|
"sidebarRemoteExitNodes": "Remote Nodes",
|
||||||
@@ -1733,7 +1770,49 @@
|
|||||||
"resourceExposePortsEditFile": "Edit file: docker-compose.yml",
|
"resourceExposePortsEditFile": "Edit file: docker-compose.yml",
|
||||||
"emailVerificationRequired": "Email verification is required. Please log in again via {dashboardUrl}/auth/login complete this step. Then, come back here.",
|
"emailVerificationRequired": "Email verification is required. Please log in again via {dashboardUrl}/auth/login complete this step. Then, come back here.",
|
||||||
"twoFactorSetupRequired": "Two-factor authentication setup is required. Please log in again via {dashboardUrl}/auth/login complete this step. Then, come back here.",
|
"twoFactorSetupRequired": "Two-factor authentication setup is required. Please log in again via {dashboardUrl}/auth/login complete this step. Then, come back here.",
|
||||||
|
"additionalSecurityRequired": "Additional Security Required",
|
||||||
|
"organizationRequiresAdditionalSteps": "This organization requires additional security steps before you can access resources.",
|
||||||
|
"completeTheseSteps": "Complete these steps",
|
||||||
|
"enableTwoFactorAuthentication": "Enable two-factor authentication",
|
||||||
|
"completeSecuritySteps": "Complete Security Steps",
|
||||||
|
"securitySettings": "Security Settings",
|
||||||
|
"securitySettingsDescription": "Configure security policies for your organization",
|
||||||
|
"requireTwoFactorForAllUsers": "Require Two-Factor Authentication for All Users",
|
||||||
|
"requireTwoFactorDescription": "When enabled, all internal users in this organization must have two-factor authentication enabled to access the organization.",
|
||||||
|
"requireTwoFactorDisabledDescription": "This feature requires a valid license (Enterprise) or active subscription (SaaS)",
|
||||||
|
"requireTwoFactorCannotEnableDescription": "You must enable two-factor authentication for your account before enforcing it for all users",
|
||||||
|
"maxSessionLength": "Maximum Session Length",
|
||||||
|
"maxSessionLengthDescription": "Set the maximum duration for user sessions. After this time, users will need to re-authenticate.",
|
||||||
|
"maxSessionLengthDisabledDescription": "This feature requires a valid license (Enterprise) or active subscription (SaaS)",
|
||||||
|
"selectSessionLength": "Select session length",
|
||||||
|
"unenforced": "Unenforced",
|
||||||
|
"1Hour": "1 hour",
|
||||||
|
"3Hours": "3 hours",
|
||||||
|
"6Hours": "6 hours",
|
||||||
|
"12Hours": "12 hours",
|
||||||
|
"1DaySession": "1 day",
|
||||||
|
"3Days": "3 days",
|
||||||
|
"7Days": "7 days",
|
||||||
|
"14Days": "14 days",
|
||||||
|
"30DaysSession": "30 days",
|
||||||
|
"90DaysSession": "90 days",
|
||||||
|
"180DaysSession": "180 days",
|
||||||
|
"passwordExpiryDays": "Password Expiry",
|
||||||
|
"editPasswordExpiryDescription": "Set the number of days before users are required to change their password.",
|
||||||
|
"selectPasswordExpiry": "Select password expiry",
|
||||||
|
"30Days": "30 days",
|
||||||
|
"1Day": "1 day",
|
||||||
|
"60Days": "60 days",
|
||||||
|
"90Days": "90 days",
|
||||||
|
"180Days": "180 days",
|
||||||
|
"1Year": "1 year",
|
||||||
|
"subscriptionBadge": "Subscription Required",
|
||||||
|
"securityPolicyChangeWarning": "Security Policy Change Warning",
|
||||||
|
"securityPolicyChangeDescription": "You are about to change security policy settings. After saving, you may need to reauthenticate to comply with these policy updates. All users who are not compliant will also need to reauthenticate.",
|
||||||
|
"securityPolicyChangeConfirmMessage": "I confirm",
|
||||||
|
"securityPolicyChangeWarningText": "This will affect all users in the organization",
|
||||||
"authPageErrorUpdateMessage": "An error occurred while updating the auth page settings",
|
"authPageErrorUpdateMessage": "An error occurred while updating the auth page settings",
|
||||||
|
"authPageErrorUpdate": "Unable to update auth page",
|
||||||
"authPageUpdated": "Auth page updated successfully",
|
"authPageUpdated": "Auth page updated successfully",
|
||||||
"healthCheckNotAvailable": "Local",
|
"healthCheckNotAvailable": "Local",
|
||||||
"rewritePath": "Rewrite Path",
|
"rewritePath": "Rewrite Path",
|
||||||
@@ -1819,7 +1898,7 @@
|
|||||||
},
|
},
|
||||||
"trialPeriodInformation": {
|
"trialPeriodInformation": {
|
||||||
"title": "Trial Period Information",
|
"title": "Trial Period Information",
|
||||||
"description": "This License Key enables Enterprise features for a 7-day evaluation period. Continued access to Paid Features beyond the evaluation period requires activation under a valid Personal or Enterprise License. For Enterprise licensing, contact sales@fossorial.io."
|
"description": "This License Key enables Enterprise features for a 7-day evaluation period. Continued access to Paid Features beyond the evaluation period requires activation under a valid Personal or Enterprise License. For Enterprise licensing, contact sales@pangolin.net."
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"form": {
|
"form": {
|
||||||
@@ -1894,5 +1973,113 @@
|
|||||||
"pathRewriteRegex": "Regex",
|
"pathRewriteRegex": "Regex",
|
||||||
"pathRewriteStrip": "Strip",
|
"pathRewriteStrip": "Strip",
|
||||||
"pathRewriteStripLabel": "strip",
|
"pathRewriteStripLabel": "strip",
|
||||||
"sidebarEnableEnterpriseLicense": "Enable Enterprise License"
|
"sidebarEnableEnterpriseLicense": "Enable Enterprise License",
|
||||||
|
"cannotbeUndone": "This can not be undone.",
|
||||||
|
"toConfirm": "to confirm",
|
||||||
|
"deleteClientQuestion": "Are you sure you want to remove the client from the site and organization?",
|
||||||
|
"clientMessageRemove": "Once removed, the client will no longer be able to connect to the site.",
|
||||||
|
"sidebarLogs": "Logs",
|
||||||
|
"request": "Request",
|
||||||
|
"logs": "Logs",
|
||||||
|
"logsSettingsDescription": "Monitor logs collected from this orginization",
|
||||||
|
"searchLogs": "Search logs...",
|
||||||
|
"action": "Action",
|
||||||
|
"actor": "Actor",
|
||||||
|
"timestamp": "Timestamp",
|
||||||
|
"accessLogs": "Access Logs",
|
||||||
|
"exportCsv": "Export CSV",
|
||||||
|
"actorId": "Actor ID",
|
||||||
|
"allowedByRule": "Allowed by Rule",
|
||||||
|
"allowedNoAuth": "Allowed No Auth",
|
||||||
|
"validAccessToken": "Valid Access Token",
|
||||||
|
"validHeaderAuth": "Valid header auth",
|
||||||
|
"validPincode": "Valid Pincode",
|
||||||
|
"validPassword": "Valid Password",
|
||||||
|
"validEmail": "Valid email",
|
||||||
|
"validSSO": "Valid SSO",
|
||||||
|
"resourceBlocked": "Resource Blocked",
|
||||||
|
"droppedByRule": "Dropped by Rule",
|
||||||
|
"noSessions": "No Sessions",
|
||||||
|
"temporaryRequestToken": "Temporary Request Token",
|
||||||
|
"noMoreAuthMethods": "No Valid Auth",
|
||||||
|
"ip": "IP",
|
||||||
|
"reason": "Reason",
|
||||||
|
"requestLogs": "Request Logs",
|
||||||
|
"host": "Host",
|
||||||
|
"location": "Location",
|
||||||
|
"actionLogs": "Action Logs",
|
||||||
|
"sidebarLogsRequest": "Request Logs",
|
||||||
|
"sidebarLogsAccess": "Access Logs",
|
||||||
|
"sidebarLogsAction": "Action Logs",
|
||||||
|
"logRetention": "Log Retention",
|
||||||
|
"logRetentionDescription": "Manage how long different types of logs are retained for this organization or disable them",
|
||||||
|
"requestLogsDescription": "View detailed request logs for resources in this organization",
|
||||||
|
"logRetentionRequestLabel": "Request Log Retention",
|
||||||
|
"logRetentionRequestDescription": "How long to retain request logs",
|
||||||
|
"logRetentionAccessLabel": "Access Log Retention",
|
||||||
|
"logRetentionAccessDescription": "How long to retain access logs",
|
||||||
|
"logRetentionActionLabel": "Action Log Retention",
|
||||||
|
"logRetentionActionDescription": "How long to retain action logs",
|
||||||
|
"logRetentionDisabled": "Disabled",
|
||||||
|
"logRetention3Days": "3 days",
|
||||||
|
"logRetention7Days": "7 days",
|
||||||
|
"logRetention14Days": "14 days",
|
||||||
|
"logRetention30Days": "30 days",
|
||||||
|
"logRetention90Days": "90 days",
|
||||||
|
"logRetentionForever": "Forever",
|
||||||
|
"actionLogsDescription": "View a history of actions performed in this organization",
|
||||||
|
"accessLogsDescription": "View access auth requests for resources in this organization",
|
||||||
|
"licenseRequiredToUse": "An Enterprise license is required to use this feature.",
|
||||||
|
"certResolver": "Certificate Resolver",
|
||||||
|
"certResolverDescription": "Select the certificate resolver to use for this resource.",
|
||||||
|
"selectCertResolver": "Select Certificate Resolver",
|
||||||
|
"enterCustomResolver": "Enter Custom Resolver",
|
||||||
|
"preferWildcardCert": "Prefer Wildcard Certificate",
|
||||||
|
"unverified": "Unverified",
|
||||||
|
"domainSetting": "Domain Settings",
|
||||||
|
"domainSettingDescription": "Configure settings for your domain",
|
||||||
|
"preferWildcardCertDescription": "Attempt to generate a wildcard certificate (require a properly configured certificate resolver).",
|
||||||
|
"recordName": "Record Name",
|
||||||
|
"auto": "Auto",
|
||||||
|
"TTL": "TTL",
|
||||||
|
"howToAddRecords": "How to Add Records",
|
||||||
|
"dnsRecord": "DNS Records",
|
||||||
|
"required": "Required",
|
||||||
|
"domainSettingsUpdated": "Domain settings updated successfully",
|
||||||
|
"orgOrDomainIdMissing": "Organization or Domain ID is missing",
|
||||||
|
"loadingDNSRecords": "Loading DNS records...",
|
||||||
|
"olmUpdateAvailableInfo": "An updated version of Olm is available. Please update to the latest version for the best experience.",
|
||||||
|
"client": "Client",
|
||||||
|
"proxyProtocol": "Proxy Protocol Settings",
|
||||||
|
"proxyProtocolDescription": "Configure Proxy Protocol to preserve client IP addresses for TCP/UDP services.",
|
||||||
|
"enableProxyProtocol": "Enable Proxy Protocol",
|
||||||
|
"proxyProtocolInfo": "Preserve client IP addresses for TCP/UDP backends",
|
||||||
|
"proxyProtocolVersion": "Proxy Protocol Version",
|
||||||
|
"version1": " Version 1 (Recommended)",
|
||||||
|
"version2": "Version 2",
|
||||||
|
"versionDescription": "Version 1 is text-based and widely supported. Version 2 is binary and more efficient but less compatible. Make sure servers transport is added to dynamic config.",
|
||||||
|
"warning": "Warning",
|
||||||
|
"proxyProtocolWarning": "Your backend application must be configured to accept Proxy Protocol connections. If your backend doesn't support Proxy Protocol, enabling this will break all connections so only enable this if you know what you're doing. Make sure to configure your backend to trust Proxy Protocol headers from Traefik.",
|
||||||
|
"restarting": "Restarting...",
|
||||||
|
"manual": "Manual",
|
||||||
|
"messageSupport": "Message Support",
|
||||||
|
"supportNotAvailableTitle": "Support Not Available",
|
||||||
|
"supportNotAvailableDescription": "Support is not available right now. You can send an email to support@pangolin.net.",
|
||||||
|
"supportRequestSentTitle": "Support Request Sent",
|
||||||
|
"supportRequestSentDescription": "Your message has been sent successfully.",
|
||||||
|
"supportRequestFailedTitle": "Failed to Send Request",
|
||||||
|
"supportRequestFailedDescription": "An error occurred while sending your support request.",
|
||||||
|
"supportSubjectRequired": "Subject is required",
|
||||||
|
"supportSubjectMaxLength": "Subject must be 255 characters or less",
|
||||||
|
"supportMessageRequired": "Message is required",
|
||||||
|
"supportReplyTo": "Reply To",
|
||||||
|
"supportSubject": "Subject",
|
||||||
|
"supportSubjectPlaceholder": "Enter subject",
|
||||||
|
"supportMessage": "Message",
|
||||||
|
"supportMessagePlaceholder": "Enter your message",
|
||||||
|
"supportSending": "Sending...",
|
||||||
|
"supportSend": "Send",
|
||||||
|
"supportMessageSent": "Message Sent!",
|
||||||
|
"supportWillContact": "We'll be in touch shortly!",
|
||||||
|
"selectLogRetention": "Select log retention"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -47,9 +47,8 @@
|
|||||||
"edit": "Editar",
|
"edit": "Editar",
|
||||||
"siteConfirmDelete": "Confirmar Borrar Sitio",
|
"siteConfirmDelete": "Confirmar Borrar Sitio",
|
||||||
"siteDelete": "Eliminar sitio",
|
"siteDelete": "Eliminar sitio",
|
||||||
"siteMessageRemove": "Una vez eliminado, el sitio ya no será accesible. Todos los recursos y objetivos asociados con el sitio también serán eliminados.",
|
"siteMessageRemove": "Una vez eliminado, el sitio ya no será accesible. Todos los objetivos asociados con el sitio también serán eliminados.",
|
||||||
"siteMessageConfirm": "Para confirmar, por favor escriba el nombre del sitio a continuación.",
|
"siteQuestionRemove": "¿Está seguro que desea eliminar el sitio de la organización?",
|
||||||
"siteQuestionRemove": "¿Está seguro de que desea eliminar el sitio {selectedSite} de la organización?",
|
|
||||||
"siteManageSites": "Administrar Sitios",
|
"siteManageSites": "Administrar Sitios",
|
||||||
"siteDescription": "Permitir conectividad a tu red a través de túneles seguros",
|
"siteDescription": "Permitir conectividad a tu red a través de túneles seguros",
|
||||||
"siteCreate": "Crear sitio",
|
"siteCreate": "Crear sitio",
|
||||||
@@ -96,7 +95,7 @@
|
|||||||
"siteWgDescription": "Utilice cualquier cliente Wirex Guard para establecer un túnel. Se requiere una configuración manual de NAT.",
|
"siteWgDescription": "Utilice cualquier cliente Wirex Guard para establecer un túnel. Se requiere una configuración manual de NAT.",
|
||||||
"siteWgDescriptionSaas": "Utilice cualquier cliente de WireGuard para establecer un túnel. Se requiere configuración manual de NAT. SOLO FUNCIONA EN NODOS AUTOGESTIONADOS",
|
"siteWgDescriptionSaas": "Utilice cualquier cliente de WireGuard para establecer un túnel. Se requiere configuración manual de NAT. SOLO FUNCIONA EN NODOS AUTOGESTIONADOS",
|
||||||
"siteLocalDescription": "Solo recursos locales. Sin túneles.",
|
"siteLocalDescription": "Solo recursos locales. Sin túneles.",
|
||||||
"siteLocalDescriptionSaas": "Local resources only. No tunneling. Only available on remote nodes.",
|
"siteLocalDescriptionSaas": "Solo recursos locales. No hay túneles. Sólo disponible en nodos remotos.",
|
||||||
"siteSeeAll": "Ver todos los sitios",
|
"siteSeeAll": "Ver todos los sitios",
|
||||||
"siteTunnelDescription": "Determina cómo quieres conectarte a tu sitio",
|
"siteTunnelDescription": "Determina cómo quieres conectarte a tu sitio",
|
||||||
"siteNewtCredentials": "Credenciales nuevas",
|
"siteNewtCredentials": "Credenciales nuevas",
|
||||||
@@ -154,8 +153,7 @@
|
|||||||
"protected": "Protegido",
|
"protected": "Protegido",
|
||||||
"notProtected": "No protegido",
|
"notProtected": "No protegido",
|
||||||
"resourceMessageRemove": "Una vez eliminado, el recurso ya no será accesible. Todos los objetivos asociados con el recurso también serán eliminados.",
|
"resourceMessageRemove": "Una vez eliminado, el recurso ya no será accesible. Todos los objetivos asociados con el recurso también serán eliminados.",
|
||||||
"resourceMessageConfirm": "Para confirmar, por favor escriba el nombre del recurso a continuación.",
|
"resourceQuestionRemove": "¿Está seguro que desea eliminar el recurso de la organización?",
|
||||||
"resourceQuestionRemove": "¿Está seguro de que desea eliminar el recurso {selectedResource} de la organización?",
|
|
||||||
"resourceHTTP": "HTTPS Recurso",
|
"resourceHTTP": "HTTPS Recurso",
|
||||||
"resourceHTTPDescription": "Solicitudes de proxy a tu aplicación sobre HTTPS usando un subdominio o dominio base.",
|
"resourceHTTPDescription": "Solicitudes de proxy a tu aplicación sobre HTTPS usando un subdominio o dominio base.",
|
||||||
"resourceRaw": "Recurso TCP/UDP sin procesar",
|
"resourceRaw": "Recurso TCP/UDP sin procesar",
|
||||||
@@ -220,7 +218,7 @@
|
|||||||
"orgDeleteConfirm": "Confirmar eliminación de organización",
|
"orgDeleteConfirm": "Confirmar eliminación de organización",
|
||||||
"orgMessageRemove": "Esta acción es irreversible y eliminará todos los datos asociados.",
|
"orgMessageRemove": "Esta acción es irreversible y eliminará todos los datos asociados.",
|
||||||
"orgMessageConfirm": "Para confirmar, por favor escriba el nombre de la organización a continuación.",
|
"orgMessageConfirm": "Para confirmar, por favor escriba el nombre de la organización a continuación.",
|
||||||
"orgQuestionRemove": "¿Está seguro que desea eliminar la organización {selectedOrg}?",
|
"orgQuestionRemove": "¿Está seguro que desea eliminar la organización?",
|
||||||
"orgUpdated": "Organización actualizada",
|
"orgUpdated": "Organización actualizada",
|
||||||
"orgUpdatedDescription": "La organización ha sido actualizada.",
|
"orgUpdatedDescription": "La organización ha sido actualizada.",
|
||||||
"orgErrorUpdate": "Error al actualizar la organización",
|
"orgErrorUpdate": "Error al actualizar la organización",
|
||||||
@@ -287,9 +285,8 @@
|
|||||||
"apiKeysAdd": "Generar clave API",
|
"apiKeysAdd": "Generar clave API",
|
||||||
"apiKeysErrorDelete": "Error al eliminar la clave API",
|
"apiKeysErrorDelete": "Error al eliminar la clave API",
|
||||||
"apiKeysErrorDeleteMessage": "Error al eliminar la clave API",
|
"apiKeysErrorDeleteMessage": "Error al eliminar la clave API",
|
||||||
"apiKeysQuestionRemove": "¿Está seguro de que desea eliminar la clave de API {selectedApiKey} de la organización?",
|
"apiKeysQuestionRemove": "¿Está seguro que desea eliminar la clave API de la organización?",
|
||||||
"apiKeysMessageRemove": "Una vez eliminada, la clave API ya no podrá ser utilizada.",
|
"apiKeysMessageRemove": "Una vez eliminada, la clave API ya no podrá ser utilizada.",
|
||||||
"apiKeysMessageConfirm": "Para confirmar, por favor escriba el nombre de la clave API a continuación.",
|
|
||||||
"apiKeysDeleteConfirm": "Confirmar Borrar Clave API",
|
"apiKeysDeleteConfirm": "Confirmar Borrar Clave API",
|
||||||
"apiKeysDelete": "Borrar Clave API",
|
"apiKeysDelete": "Borrar Clave API",
|
||||||
"apiKeysManage": "Administrar claves API",
|
"apiKeysManage": "Administrar claves API",
|
||||||
@@ -305,8 +302,7 @@
|
|||||||
"userDeleteConfirm": "Confirmar Borrar Usuario",
|
"userDeleteConfirm": "Confirmar Borrar Usuario",
|
||||||
"userDeleteServer": "Eliminar usuario del servidor",
|
"userDeleteServer": "Eliminar usuario del servidor",
|
||||||
"userMessageRemove": "El usuario será eliminado de todas las organizaciones y será eliminado completamente del servidor.",
|
"userMessageRemove": "El usuario será eliminado de todas las organizaciones y será eliminado completamente del servidor.",
|
||||||
"userMessageConfirm": "Para confirmar, por favor escriba el nombre del usuario a continuación.",
|
"userQuestionRemove": "¿Está seguro que desea eliminar permanentemente al usuario del servidor?",
|
||||||
"userQuestionRemove": "¿Está seguro que desea eliminar permanentemente {selectedUser} del servidor?",
|
|
||||||
"licenseKey": "Clave de licencia",
|
"licenseKey": "Clave de licencia",
|
||||||
"valid": "Válido",
|
"valid": "Válido",
|
||||||
"numberOfSites": "Número de sitios",
|
"numberOfSites": "Número de sitios",
|
||||||
@@ -339,7 +335,7 @@
|
|||||||
"fossorialLicense": "Ver Términos de suscripción y licencia comercial",
|
"fossorialLicense": "Ver Términos de suscripción y licencia comercial",
|
||||||
"licenseMessageRemove": "Esto eliminará la clave de licencia y todos los permisos asociados otorgados por ella.",
|
"licenseMessageRemove": "Esto eliminará la clave de licencia y todos los permisos asociados otorgados por ella.",
|
||||||
"licenseMessageConfirm": "Para confirmar, por favor escriba la clave de licencia a continuación.",
|
"licenseMessageConfirm": "Para confirmar, por favor escriba la clave de licencia a continuación.",
|
||||||
"licenseQuestionRemove": "¿Está seguro que desea eliminar la clave de licencia {selectedKey}?",
|
"licenseQuestionRemove": "¿Está seguro que desea eliminar la clave de licencia?",
|
||||||
"licenseKeyDelete": "Eliminar clave de licencia",
|
"licenseKeyDelete": "Eliminar clave de licencia",
|
||||||
"licenseKeyDeleteConfirm": "Confirmar eliminar clave de licencia",
|
"licenseKeyDeleteConfirm": "Confirmar eliminar clave de licencia",
|
||||||
"licenseTitle": "Administrar estado de licencia",
|
"licenseTitle": "Administrar estado de licencia",
|
||||||
@@ -372,7 +368,7 @@
|
|||||||
"inviteRemoveErrorDescription": "Ocurrió un error mientras se eliminaba la invitación.",
|
"inviteRemoveErrorDescription": "Ocurrió un error mientras se eliminaba la invitación.",
|
||||||
"inviteRemoved": "Invitación eliminada",
|
"inviteRemoved": "Invitación eliminada",
|
||||||
"inviteRemovedDescription": "La invitación para {email} ha sido eliminada.",
|
"inviteRemovedDescription": "La invitación para {email} ha sido eliminada.",
|
||||||
"inviteQuestionRemove": "¿Está seguro de que desea eliminar la invitación {email}?",
|
"inviteQuestionRemove": "¿Está seguro de que desea eliminar la invitación?",
|
||||||
"inviteMessageRemove": "Una vez eliminada, esta invitación ya no será válida. Siempre puede volver a invitar al usuario más tarde.",
|
"inviteMessageRemove": "Una vez eliminada, esta invitación ya no será válida. Siempre puede volver a invitar al usuario más tarde.",
|
||||||
"inviteMessageConfirm": "Para confirmar, por favor escriba la dirección de correo electrónico de la invitación a continuación.",
|
"inviteMessageConfirm": "Para confirmar, por favor escriba la dirección de correo electrónico de la invitación a continuación.",
|
||||||
"inviteQuestionRegenerate": "¿Estás seguro de que quieres regenerar la invitación para {email}? Esto revocará la invitación anterior.",
|
"inviteQuestionRegenerate": "¿Estás seguro de que quieres regenerar la invitación para {email}? Esto revocará la invitación anterior.",
|
||||||
@@ -398,9 +394,8 @@
|
|||||||
"userErrorOrgRemoveDescription": "Ocurrió un error mientras se eliminaba el usuario.",
|
"userErrorOrgRemoveDescription": "Ocurrió un error mientras se eliminaba el usuario.",
|
||||||
"userOrgRemoved": "Usuario eliminado",
|
"userOrgRemoved": "Usuario eliminado",
|
||||||
"userOrgRemovedDescription": "El usuario {email} ha sido eliminado de la organización.",
|
"userOrgRemovedDescription": "El usuario {email} ha sido eliminado de la organización.",
|
||||||
"userQuestionOrgRemove": "¿Estás seguro de que quieres eliminar {email} de la organización?",
|
"userQuestionOrgRemove": "¿Está seguro que desea eliminar este usuario de la organización?",
|
||||||
"userMessageOrgRemove": "Una vez eliminado, este usuario ya no tendrá acceso a la organización. Siempre puede volver a invitarlos más tarde, pero tendrán que aceptar la invitación de nuevo.",
|
"userMessageOrgRemove": "Una vez eliminado, este usuario ya no tendrá acceso a la organización. Siempre puede volver a invitarlos más tarde, pero tendrán que aceptar la invitación de nuevo.",
|
||||||
"userMessageOrgConfirm": "Para confirmar, por favor escriba el nombre del usuario a continuación.",
|
|
||||||
"userRemoveOrgConfirm": "Confirmar eliminar usuario",
|
"userRemoveOrgConfirm": "Confirmar eliminar usuario",
|
||||||
"userRemoveOrg": "Eliminar usuario de la organización",
|
"userRemoveOrg": "Eliminar usuario de la organización",
|
||||||
"users": "Usuarios",
|
"users": "Usuarios",
|
||||||
@@ -730,7 +725,7 @@
|
|||||||
"pangolinServerAdmin": "Admin Servidor - Pangolin",
|
"pangolinServerAdmin": "Admin Servidor - Pangolin",
|
||||||
"licenseTierProfessional": "Licencia profesional",
|
"licenseTierProfessional": "Licencia profesional",
|
||||||
"licenseTierEnterprise": "Licencia Enterprise",
|
"licenseTierEnterprise": "Licencia Enterprise",
|
||||||
"licenseTierPersonal": "Personal License",
|
"licenseTierPersonal": "Licencia personal",
|
||||||
"licensed": "Licenciado",
|
"licensed": "Licenciado",
|
||||||
"yes": "Sí",
|
"yes": "Sí",
|
||||||
"no": "Nu",
|
"no": "Nu",
|
||||||
@@ -742,7 +737,7 @@
|
|||||||
"idpManageDescription": "Ver y administrar proveedores de identidad en el sistema",
|
"idpManageDescription": "Ver y administrar proveedores de identidad en el sistema",
|
||||||
"idpDeletedDescription": "Proveedor de identidad eliminado correctamente",
|
"idpDeletedDescription": "Proveedor de identidad eliminado correctamente",
|
||||||
"idpOidc": "OAuth2/OIDC",
|
"idpOidc": "OAuth2/OIDC",
|
||||||
"idpQuestionRemove": "¿Está seguro que desea eliminar permanentemente el proveedor de identidad {name}?",
|
"idpQuestionRemove": "¿Está seguro que desea eliminar permanentemente el proveedor de identidad?",
|
||||||
"idpMessageRemove": "Esto eliminará el proveedor de identidad y todas las configuraciones asociadas. Los usuarios que se autentifiquen a través de este proveedor ya no podrán iniciar sesión.",
|
"idpMessageRemove": "Esto eliminará el proveedor de identidad y todas las configuraciones asociadas. Los usuarios que se autentifiquen a través de este proveedor ya no podrán iniciar sesión.",
|
||||||
"idpMessageConfirm": "Para confirmar, por favor escriba el nombre del proveedor de identidad a continuación.",
|
"idpMessageConfirm": "Para confirmar, por favor escriba el nombre del proveedor de identidad a continuación.",
|
||||||
"idpConfirmDelete": "Confirmar eliminar proveedor de identidad",
|
"idpConfirmDelete": "Confirmar eliminar proveedor de identidad",
|
||||||
@@ -916,6 +911,18 @@
|
|||||||
"passwordResetCodeDescription": "Revisa tu correo electrónico para ver el código de restablecimiento.",
|
"passwordResetCodeDescription": "Revisa tu correo electrónico para ver el código de restablecimiento.",
|
||||||
"passwordNew": "Nueva contraseña",
|
"passwordNew": "Nueva contraseña",
|
||||||
"passwordNewConfirm": "Confirmar nueva contraseña",
|
"passwordNewConfirm": "Confirmar nueva contraseña",
|
||||||
|
"changePassword": "Cambiar Contraseña",
|
||||||
|
"changePasswordDescription": "Actualizar la contraseña de tu cuenta",
|
||||||
|
"oldPassword": "Contraseña Actual",
|
||||||
|
"newPassword": "Nueva Contraseña",
|
||||||
|
"confirmNewPassword": "Confirme Nueva Contraseña",
|
||||||
|
"changePasswordError": "Error al cambiar la contraseña",
|
||||||
|
"changePasswordErrorDescription": "Se ha producido un error al cambiar la contraseña",
|
||||||
|
"changePasswordSuccess": "La contraseña ha sido cambiada correctamente",
|
||||||
|
"changePasswordSuccessDescription": "Su contraseña ha sido actualizada correctamente",
|
||||||
|
"passwordExpiryRequired": "Contraseña con caducidad requerida",
|
||||||
|
"passwordExpiryDescription": "Esta organización requiere que cambies tu contraseña cada {maxDays} días.",
|
||||||
|
"changePasswordNow": "Cambiar Contraseña Ahora",
|
||||||
"pincodeAuth": "Código de autenticación",
|
"pincodeAuth": "Código de autenticación",
|
||||||
"pincodeSubmit2": "Enviar código",
|
"pincodeSubmit2": "Enviar código",
|
||||||
"passwordResetSubmit": "Reiniciar Solicitud",
|
"passwordResetSubmit": "Reiniciar Solicitud",
|
||||||
@@ -1154,8 +1161,27 @@
|
|||||||
"sidebarAllUsers": "Todos los usuarios",
|
"sidebarAllUsers": "Todos los usuarios",
|
||||||
"sidebarIdentityProviders": "Proveedores de identidad",
|
"sidebarIdentityProviders": "Proveedores de identidad",
|
||||||
"sidebarLicense": "Licencia",
|
"sidebarLicense": "Licencia",
|
||||||
"sidebarClients": "Clients",
|
"sidebarClients": "Clientes",
|
||||||
"sidebarDomains": "Dominios",
|
"sidebarDomains": "Dominios",
|
||||||
|
"sidebarBluePrints": "Planos",
|
||||||
|
"blueprints": "Planos",
|
||||||
|
"blueprintsDescription": "Los planos son configuraciones YAML declarativas que definen sus recursos y sus configuraciones",
|
||||||
|
"blueprintAdd": "Añadir plano",
|
||||||
|
"blueprintGoBack": "Ver todos los Planos",
|
||||||
|
"blueprintCreate": "Crear Plano",
|
||||||
|
"blueprintCreateDescription2": "Siga los siguientes pasos para crear y aplicar un nuevo plano",
|
||||||
|
"blueprintDetails": "Detalles del plano",
|
||||||
|
"blueprintDetailsDescription": "Ver los detalles de la ejecución del plano",
|
||||||
|
"blueprintInfo": "Información del plano",
|
||||||
|
"message": "Mensaje",
|
||||||
|
"blueprintContentsDescription": "Defina el contenido YAML describiendo su infraestructura",
|
||||||
|
"blueprintErrorCreateDescription": "Se ha producido un error al aplicar el plano",
|
||||||
|
"blueprintErrorCreate": "Error al crear el plano",
|
||||||
|
"searchBlueprintProgress": "Buscar planos...",
|
||||||
|
"appliedAt": "Aplicado en",
|
||||||
|
"source": "Fuente",
|
||||||
|
"contents": "Contenido",
|
||||||
|
"parsedContents": "Contenido analizado",
|
||||||
"enableDockerSocket": "Habilitar Plano Docker",
|
"enableDockerSocket": "Habilitar Plano Docker",
|
||||||
"enableDockerSocketDescription": "Activar el raspado de etiquetas de Socket Docker para etiquetas de planos. La ruta del Socket debe proporcionarse a Newt.",
|
"enableDockerSocketDescription": "Activar el raspado de etiquetas de Socket Docker para etiquetas de planos. La ruta del Socket debe proporcionarse a Newt.",
|
||||||
"enableDockerSocketLink": "Saber más",
|
"enableDockerSocketLink": "Saber más",
|
||||||
@@ -1211,9 +1237,8 @@
|
|||||||
"domainCreate": "Crear dominio",
|
"domainCreate": "Crear dominio",
|
||||||
"domainCreatedDescription": "Dominio creado con éxito",
|
"domainCreatedDescription": "Dominio creado con éxito",
|
||||||
"domainDeletedDescription": "Dominio eliminado exitosamente",
|
"domainDeletedDescription": "Dominio eliminado exitosamente",
|
||||||
"domainQuestionRemove": "¿Está seguro de que desea eliminar el dominio {domain} de su cuenta?",
|
"domainQuestionRemove": "¿Está seguro que desea eliminar el dominio de su cuenta?",
|
||||||
"domainMessageRemove": "Una vez eliminado, el dominio ya no estará asociado con su cuenta.",
|
"domainMessageRemove": "Una vez eliminado, el dominio ya no estará asociado con su cuenta.",
|
||||||
"domainMessageConfirm": "Para confirmar, por favor escriba el nombre del dominio abajo.",
|
|
||||||
"domainConfirmDelete": "Confirmar eliminación del dominio",
|
"domainConfirmDelete": "Confirmar eliminación del dominio",
|
||||||
"domainDelete": "Eliminar dominio",
|
"domainDelete": "Eliminar dominio",
|
||||||
"domain": "Dominio",
|
"domain": "Dominio",
|
||||||
@@ -1280,7 +1305,7 @@
|
|||||||
"billingFreeTier": "Nivel Gratis",
|
"billingFreeTier": "Nivel Gratis",
|
||||||
"billingWarningOverLimit": "Advertencia: Has excedido uno o más límites de uso. Tus sitios no se conectarán hasta que modifiques tu suscripción o ajustes tu uso.",
|
"billingWarningOverLimit": "Advertencia: Has excedido uno o más límites de uso. Tus sitios no se conectarán hasta que modifiques tu suscripción o ajustes tu uso.",
|
||||||
"billingUsageLimitsOverview": "Descripción general de los límites de uso",
|
"billingUsageLimitsOverview": "Descripción general de los límites de uso",
|
||||||
"billingMonitorUsage": "Monitorea tu uso comparado con los límites configurados. Si necesitas que aumenten los límites, contáctanos a soporte@fossorial.io.",
|
"billingMonitorUsage": "Monitorea tu uso comparado con los límites configurados. Si necesitas que aumenten los límites, contáctanos a soporte@pangolin.net.",
|
||||||
"billingDataUsage": "Uso de datos",
|
"billingDataUsage": "Uso de datos",
|
||||||
"billingOnlineTime": "Tiempo en línea del sitio",
|
"billingOnlineTime": "Tiempo en línea del sitio",
|
||||||
"billingUsers": "Usuarios activos",
|
"billingUsers": "Usuarios activos",
|
||||||
@@ -1346,6 +1371,19 @@
|
|||||||
"securityKeyUnknownError": "Hubo un problema al usar tu llave de seguridad. Por favor, inténtalo de nuevo.",
|
"securityKeyUnknownError": "Hubo un problema al usar tu llave de seguridad. Por favor, inténtalo de nuevo.",
|
||||||
"twoFactorRequired": "Se requiere autenticación de dos factores para registrar una llave de seguridad.",
|
"twoFactorRequired": "Se requiere autenticación de dos factores para registrar una llave de seguridad.",
|
||||||
"twoFactor": "Autenticación de dos factores",
|
"twoFactor": "Autenticación de dos factores",
|
||||||
|
"twoFactorAuthentication": "Autenticación de Dos Factores",
|
||||||
|
"twoFactorDescription": "Esta organización requiere autenticación de dos factores.",
|
||||||
|
"enableTwoFactor": "Habilitar autenticación de dos factores",
|
||||||
|
"organizationSecurityPolicy": "Política de Seguridad de la Organización",
|
||||||
|
"organizationSecurityPolicyDescription": "Esta organización tiene requisitos de seguridad que deben cumplirse antes de poder acceder a ella",
|
||||||
|
"securityRequirements": "Requisitos de seguridad",
|
||||||
|
"allRequirementsMet": "Todos los requisitos han sido cumplidos",
|
||||||
|
"completeRequirementsToContinue": "Completa los siguientes requisitos para seguir accediendo a esta organización",
|
||||||
|
"youCanNowAccessOrganization": "Ahora puedes acceder a esta organización",
|
||||||
|
"reauthenticationRequired": "Longitud de la sesión",
|
||||||
|
"reauthenticationDescription": "Esta organización requiere que inicies sesión cada {maxDays} días.",
|
||||||
|
"reauthenticationDescriptionHours": "Esta organización requiere que inicies sesión cada {maxHours} horas.",
|
||||||
|
"reauthenticateNow": "Iniciar sesión de nuevo",
|
||||||
"adminEnabled2FaOnYourAccount": "Su administrador ha habilitado la autenticación de dos factores para {email}. Por favor, complete el proceso de configuración para continuar.",
|
"adminEnabled2FaOnYourAccount": "Su administrador ha habilitado la autenticación de dos factores para {email}. Por favor, complete el proceso de configuración para continuar.",
|
||||||
"securityKeyAdd": "Agregar llave de seguridad",
|
"securityKeyAdd": "Agregar llave de seguridad",
|
||||||
"securityKeyRegisterTitle": "Registrar nueva llave de seguridad",
|
"securityKeyRegisterTitle": "Registrar nueva llave de seguridad",
|
||||||
@@ -1558,14 +1596,13 @@
|
|||||||
"autoLoginErrorNoRedirectUrl": "No se recibió URL de redirección del proveedor de identidad.",
|
"autoLoginErrorNoRedirectUrl": "No se recibió URL de redirección del proveedor de identidad.",
|
||||||
"autoLoginErrorGeneratingUrl": "Error al generar URL de autenticación.",
|
"autoLoginErrorGeneratingUrl": "Error al generar URL de autenticación.",
|
||||||
"remoteExitNodeManageRemoteExitNodes": "Nodos remotos",
|
"remoteExitNodeManageRemoteExitNodes": "Nodos remotos",
|
||||||
"remoteExitNodeDescription": "Self-host one or more remote nodes to extend your network connectivity and reduce reliance on the cloud",
|
"remoteExitNodeDescription": "Autoalojar uno o más nodos remotos para extender la conectividad de red y reducir la dependencia de la nube",
|
||||||
"remoteExitNodes": "Nodos",
|
"remoteExitNodes": "Nodos",
|
||||||
"searchRemoteExitNodes": "Buscar nodos...",
|
"searchRemoteExitNodes": "Buscar nodos...",
|
||||||
"remoteExitNodeAdd": "Añadir Nodo",
|
"remoteExitNodeAdd": "Añadir Nodo",
|
||||||
"remoteExitNodeErrorDelete": "Error al eliminar el nodo",
|
"remoteExitNodeErrorDelete": "Error al eliminar el nodo",
|
||||||
"remoteExitNodeQuestionRemove": "¿Está seguro de que desea eliminar el nodo {selectedNode} de la organización?",
|
"remoteExitNodeQuestionRemove": "¿Está seguro que desea eliminar el nodo de la organización?",
|
||||||
"remoteExitNodeMessageRemove": "Una vez eliminado, el nodo ya no será accesible.",
|
"remoteExitNodeMessageRemove": "Una vez eliminado, el nodo ya no será accesible.",
|
||||||
"remoteExitNodeMessageConfirm": "Para confirmar, por favor escriba el nombre del nodo a continuación.",
|
|
||||||
"remoteExitNodeConfirmDelete": "Confirmar eliminar nodo",
|
"remoteExitNodeConfirmDelete": "Confirmar eliminar nodo",
|
||||||
"remoteExitNodeDelete": "Eliminar Nodo",
|
"remoteExitNodeDelete": "Eliminar Nodo",
|
||||||
"sidebarRemoteExitNodes": "Nodos remotos",
|
"sidebarRemoteExitNodes": "Nodos remotos",
|
||||||
@@ -1733,7 +1770,49 @@
|
|||||||
"resourceExposePortsEditFile": "Editar archivo: docker-compose.yml",
|
"resourceExposePortsEditFile": "Editar archivo: docker-compose.yml",
|
||||||
"emailVerificationRequired": "Se requiere verificación de correo electrónico. Por favor, inicie sesión de nuevo a través de {dashboardUrl}/auth/login complete este paso. Luego, vuelva aquí.",
|
"emailVerificationRequired": "Se requiere verificación de correo electrónico. Por favor, inicie sesión de nuevo a través de {dashboardUrl}/auth/login complete este paso. Luego, vuelva aquí.",
|
||||||
"twoFactorSetupRequired": "La configuración de autenticación de doble factor es requerida. Por favor, inicia sesión de nuevo a través de {dashboardUrl}/auth/login completa este paso. Luego, vuelve aquí.",
|
"twoFactorSetupRequired": "La configuración de autenticación de doble factor es requerida. Por favor, inicia sesión de nuevo a través de {dashboardUrl}/auth/login completa este paso. Luego, vuelve aquí.",
|
||||||
|
"additionalSecurityRequired": "Seguridad adicional requerida",
|
||||||
|
"organizationRequiresAdditionalSteps": "Esta organización requiere pasos de seguridad adicionales antes de poder acceder a los recursos.",
|
||||||
|
"completeTheseSteps": "Completa estos pasos",
|
||||||
|
"enableTwoFactorAuthentication": "Habilitar autenticación de doble factor",
|
||||||
|
"completeSecuritySteps": "Pasos de seguridad completos",
|
||||||
|
"securitySettings": "Ajustes de seguridad",
|
||||||
|
"securitySettingsDescription": "Configurar políticas de seguridad para su organización",
|
||||||
|
"requireTwoFactorForAllUsers": "Requiere autenticación de doble factor para todos los usuarios",
|
||||||
|
"requireTwoFactorDescription": "Cuando está activado, todos los usuarios internos de esta organización deben tener habilitada la autenticación de dos factores para acceder a la organización.",
|
||||||
|
"requireTwoFactorDisabledDescription": "Esta característica requiere una licencia válida (Enterprise) o una suscripción activa (SaBudget)",
|
||||||
|
"requireTwoFactorCannotEnableDescription": "Debes habilitar la autenticación de doble factor para tu cuenta antes de aplicarla a todos los usuarios",
|
||||||
|
"maxSessionLength": "Longitud máxima de la sesión",
|
||||||
|
"maxSessionLengthDescription": "Establecer la duración máxima de las sesiones de usuario. Después de este tiempo, los usuarios tendrán que volver a autenticarse.",
|
||||||
|
"maxSessionLengthDisabledDescription": "Esta característica requiere una licencia válida (Enterprise) o una suscripción activa (SaBudget)",
|
||||||
|
"selectSessionLength": "Seleccionar duración de sesión",
|
||||||
|
"unenforced": "No aplicado",
|
||||||
|
"1Hour": "1 hora",
|
||||||
|
"3Hours": "3 horas",
|
||||||
|
"6Hours": "6 horas",
|
||||||
|
"12Hours": "12 horas",
|
||||||
|
"1DaySession": "1 día",
|
||||||
|
"3Days": "3 días",
|
||||||
|
"7Days": "7 días",
|
||||||
|
"14Days": "14 días",
|
||||||
|
"30DaysSession": "30 días",
|
||||||
|
"90DaysSession": "90 días",
|
||||||
|
"180DaysSession": "180 días",
|
||||||
|
"passwordExpiryDays": "Caduca la contraseña",
|
||||||
|
"editPasswordExpiryDescription": "Establecer el número de días antes de que los usuarios tengan que cambiar su contraseña.",
|
||||||
|
"selectPasswordExpiry": "Seleccione la contraseña expirada",
|
||||||
|
"30Days": "30 días",
|
||||||
|
"1Day": "1 día",
|
||||||
|
"60Days": "60 días",
|
||||||
|
"90Days": "90 días",
|
||||||
|
"180Days": "180 días",
|
||||||
|
"1Year": "1 año",
|
||||||
|
"subscriptionBadge": "Suscripción requerida",
|
||||||
|
"securityPolicyChangeWarning": "Advertencia de cambio de política de seguridad",
|
||||||
|
"securityPolicyChangeDescription": "Está a punto de cambiar la configuración de la política de seguridad. Después de guardar, puede que necesite volver a autenticarse para cumplir con estas actualizaciones de política. Todos los usuarios que no cumplan con los requisitos también tendrán que volver a autenticarse.",
|
||||||
|
"securityPolicyChangeConfirmMessage": "Confirmo",
|
||||||
|
"securityPolicyChangeWarningText": "Esto afectará a todos los usuarios de la organización",
|
||||||
"authPageErrorUpdateMessage": "Ocurrió un error mientras se actualizaban los ajustes de la página auth",
|
"authPageErrorUpdateMessage": "Ocurrió un error mientras se actualizaban los ajustes de la página auth",
|
||||||
|
"authPageErrorUpdate": "No se puede actualizar la página de autenticación",
|
||||||
"authPageUpdated": "Página auth actualizada correctamente",
|
"authPageUpdated": "Página auth actualizada correctamente",
|
||||||
"healthCheckNotAvailable": "Local",
|
"healthCheckNotAvailable": "Local",
|
||||||
"rewritePath": "Reescribir Ruta",
|
"rewritePath": "Reescribir Ruta",
|
||||||
@@ -1745,153 +1824,261 @@
|
|||||||
"resourceHeaderAuthRemoveDescription": "Autenticación de cabecera eliminada correctamente.",
|
"resourceHeaderAuthRemoveDescription": "Autenticación de cabecera eliminada correctamente.",
|
||||||
"resourceErrorHeaderAuthRemove": "Error al eliminar autenticación de cabecera",
|
"resourceErrorHeaderAuthRemove": "Error al eliminar autenticación de cabecera",
|
||||||
"resourceErrorHeaderAuthRemoveDescription": "No se pudo eliminar la autenticación de cabecera del recurso.",
|
"resourceErrorHeaderAuthRemoveDescription": "No se pudo eliminar la autenticación de cabecera del recurso.",
|
||||||
"resourceHeaderAuthProtectionEnabled": "Header Authentication Enabled",
|
"resourceHeaderAuthProtectionEnabled": "Autenticación de cabecera habilitada",
|
||||||
"resourceHeaderAuthProtectionDisabled": "Header Authentication Disabled",
|
"resourceHeaderAuthProtectionDisabled": "Autenticación de cabecera desactivada",
|
||||||
"headerAuthRemove": "Remove Header Auth",
|
"headerAuthRemove": "Eliminar Auth del Encabezado",
|
||||||
"headerAuthAdd": "Add Header Auth",
|
"headerAuthAdd": "Añadir autenticación de cabecera",
|
||||||
"resourceErrorHeaderAuthSetup": "Error al establecer autenticación de cabecera",
|
"resourceErrorHeaderAuthSetup": "Error al establecer autenticación de cabecera",
|
||||||
"resourceErrorHeaderAuthSetupDescription": "No se pudo establecer autenticación de cabecera para el recurso.",
|
"resourceErrorHeaderAuthSetupDescription": "No se pudo establecer autenticación de cabecera para el recurso.",
|
||||||
"resourceHeaderAuthSetup": "Autenticación de cabecera establecida correctamente",
|
"resourceHeaderAuthSetup": "Autenticación de cabecera establecida correctamente",
|
||||||
"resourceHeaderAuthSetupDescription": "La autenticación de cabecera se ha establecido correctamente.",
|
"resourceHeaderAuthSetupDescription": "La autenticación de cabecera se ha establecido correctamente.",
|
||||||
"resourceHeaderAuthSetupTitle": "Establecer autenticación de cabecera",
|
"resourceHeaderAuthSetupTitle": "Establecer autenticación de cabecera",
|
||||||
"resourceHeaderAuthSetupTitleDescription": "Set the basic auth credentials (username and password) to protect this resource with HTTP Header Authentication. Access it using the format https://username:password@resource.example.com",
|
"resourceHeaderAuthSetupTitleDescription": "Establezca las credenciales básicas de autenticación (nombre de usuario y contraseña) para proteger este recurso con autenticación de HTTP Header. Acceda a él usando el formato https://username:password@resource.example.com",
|
||||||
"resourceHeaderAuthSubmit": "Establecer autenticación de cabecera",
|
"resourceHeaderAuthSubmit": "Establecer autenticación de cabecera",
|
||||||
"actionSetResourceHeaderAuth": "Establecer autenticación de cabecera",
|
"actionSetResourceHeaderAuth": "Establecer autenticación de cabecera",
|
||||||
"enterpriseEdition": "Enterprise Edition",
|
"enterpriseEdition": "Edición corporativa",
|
||||||
"unlicensed": "Unlicensed",
|
"unlicensed": "Sin licencia",
|
||||||
"beta": "Beta",
|
"beta": "Beta",
|
||||||
"manageClients": "Manage Clients",
|
"manageClients": "Administrar clientes",
|
||||||
"manageClientsDescription": "Clients are devices that can connect to your sites",
|
"manageClientsDescription": "Los clientes son dispositivos que pueden conectarse a sus sitios",
|
||||||
"licenseTableValidUntil": "Valid Until",
|
"licenseTableValidUntil": "Válido hasta",
|
||||||
"saasLicenseKeysSettingsTitle": "Enterprise Licenses",
|
"saasLicenseKeysSettingsTitle": "Licencias empresariales",
|
||||||
"saasLicenseKeysSettingsDescription": "Generate and manage Enterprise license keys for self-hosted Pangolin instances",
|
"saasLicenseKeysSettingsDescription": "Generar y administrar claves de licencia Enterprise para instancias Pangolin autoalojadas",
|
||||||
"sidebarEnterpriseLicenses": "Licenses",
|
"sidebarEnterpriseLicenses": "Licencias",
|
||||||
"generateLicenseKey": "Generate License Key",
|
"generateLicenseKey": "Generar clave de licencia",
|
||||||
"generateLicenseKeyForm": {
|
"generateLicenseKeyForm": {
|
||||||
"validation": {
|
"validation": {
|
||||||
"emailRequired": "Please enter a valid email address",
|
"emailRequired": "Por favor, introduzca una dirección de correo válida",
|
||||||
"useCaseTypeRequired": "Please select a use case type",
|
"useCaseTypeRequired": "Por favor, seleccione un tipo de caso de uso",
|
||||||
"firstNameRequired": "First name is required",
|
"firstNameRequired": "El nombre es obligatorio",
|
||||||
"lastNameRequired": "Last name is required",
|
"lastNameRequired": "Se requiere apellido",
|
||||||
"primaryUseRequired": "Please describe your primary use",
|
"primaryUseRequired": "Por favor describa su uso principal",
|
||||||
"jobTitleRequiredBusiness": "Job title is required for business use",
|
"jobTitleRequiredBusiness": "El título de la tarea es obligatorio para uso empresarial",
|
||||||
"industryRequiredBusiness": "Industry is required for business use",
|
"industryRequiredBusiness": "La industria es necesaria para uso comercial",
|
||||||
"stateProvinceRegionRequired": "State/Province/Region is required",
|
"stateProvinceRegionRequired": "Se requiere estado/Province/región",
|
||||||
"postalZipCodeRequired": "Postal/ZIP Code is required",
|
"postalZipCodeRequired": "Código Postal/ZIP es requerido",
|
||||||
"companyNameRequiredBusiness": "Company name is required for business use",
|
"companyNameRequiredBusiness": "El nombre de la empresa es obligatorio para uso comercial",
|
||||||
"countryOfResidenceRequiredBusiness": "Country of residence is required for business use",
|
"countryOfResidenceRequiredBusiness": "El país de residencia es obligatorio para uso de negocios",
|
||||||
"countryRequiredPersonal": "Country is required for personal use",
|
"countryRequiredPersonal": "El país es obligatorio para uso personal",
|
||||||
"agreeToTermsRequired": "You must agree to the terms",
|
"agreeToTermsRequired": "Debe aceptar los términos",
|
||||||
"complianceConfirmationRequired": "You must confirm compliance with the Fossorial Commercial License"
|
"complianceConfirmationRequired": "Debe confirmar el cumplimiento de la Licencia Comercial Fossorial"
|
||||||
},
|
},
|
||||||
"useCaseOptions": {
|
"useCaseOptions": {
|
||||||
"personal": {
|
"personal": {
|
||||||
"title": "Personal Use",
|
"title": "Uso personal",
|
||||||
"description": "For individual, non-commercial use such as learning, personal projects, or experimentation."
|
"description": "Para uso individual y no comercial, tales como aprendizaje, proyectos personales o experimentación."
|
||||||
},
|
},
|
||||||
"business": {
|
"business": {
|
||||||
"title": "Business Use",
|
"title": "Uso de Negocio",
|
||||||
"description": "For use within organizations, companies, or commercial or revenue-generating activities."
|
"description": "Para uso dentro de organizaciones, empresas o actividades comerciales o generadoras de ingresos."
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"steps": {
|
"steps": {
|
||||||
"emailLicenseType": {
|
"emailLicenseType": {
|
||||||
"title": "Email & License Type",
|
"title": "Email y tipo de licencia",
|
||||||
"description": "Enter your email and choose your license type"
|
"description": "Introduzca su correo electrónico y elija su tipo de licencia"
|
||||||
},
|
},
|
||||||
"personalInformation": {
|
"personalInformation": {
|
||||||
"title": "Personal Information",
|
"title": "Información Personal",
|
||||||
"description": "Tell us about yourself"
|
"description": "Cuéntanos acerca de ti"
|
||||||
},
|
},
|
||||||
"contactInformation": {
|
"contactInformation": {
|
||||||
"title": "Contact Information",
|
"title": "Información de contacto",
|
||||||
"description": "Your contact details"
|
"description": "Sus datos de contacto"
|
||||||
},
|
},
|
||||||
"termsGenerate": {
|
"termsGenerate": {
|
||||||
"title": "Terms & Generate",
|
"title": "Términos y Generar",
|
||||||
"description": "Review and accept terms to generate your license"
|
"description": "Revisar y aceptar términos para generar su licencia"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"alerts": {
|
"alerts": {
|
||||||
"commercialUseDisclosure": {
|
"commercialUseDisclosure": {
|
||||||
"title": "Usage Disclosure",
|
"title": "Divulgación de uso",
|
||||||
"description": "Select the license tier that accurately reflects your intended use. The Personal License permits free use of the Software for individual, non-commercial or small-scale commercial activities with annual gross revenue under $100,000 USD. Any use beyond these limits — including use within a business, organization, or other revenue-generating environment — requires a valid Enterprise License and payment of the applicable licensing fee. All users, whether Personal or Enterprise, must comply with the Fossorial Commercial License Terms."
|
"description": "Seleccione el nivel de licencia que refleje con precisión su uso previsto. La Licencia Personal permite el uso libre del Software para actividades comerciales individuales, no comerciales o de pequeña escala con ingresos brutos anuales inferiores a $100,000 USD. Cualquier uso más allá de estos límites — incluyendo el uso dentro de una empresa, organización, u otro entorno de generación de ingresos — requiere una Licencia Empresarial válida y el pago de la cuota de licencia aplicable. Todos los usuarios, ya sean personales o empresariales, deben cumplir con las Condiciones de Licencia Comercial Fossorial."
|
||||||
},
|
},
|
||||||
"trialPeriodInformation": {
|
"trialPeriodInformation": {
|
||||||
"title": "Trial Period Information",
|
"title": "Información del período de prueba",
|
||||||
"description": "This License Key enables Enterprise features for a 7-day evaluation period. Continued access to Paid Features beyond the evaluation period requires activation under a valid Personal or Enterprise License. For Enterprise licensing, contact sales@fossorial.io."
|
"description": "Esta Clave de Licencia permite las funciones de la Empresa durante un período de evaluación de 7 días. El acceso continuado a las características de pago más allá del período de evaluación requiere una activación bajo una Licencia Personal o Empresarial válida. Para licencias de la Empresa, póngase en contacto con sales@pangolin.net."
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"form": {
|
"form": {
|
||||||
"useCaseQuestion": "Are you using Pangolin for personal or business use?",
|
"useCaseQuestion": "¿Estás usando Pangolin para uso personal o de negocios?",
|
||||||
"firstName": "First Name",
|
"firstName": "Nombre",
|
||||||
"lastName": "Last Name",
|
"lastName": "Apellido",
|
||||||
"jobTitle": "Job Title",
|
"jobTitle": "Trabajo",
|
||||||
"primaryUseQuestion": "What do you primarily plan to use Pangolin for?",
|
"primaryUseQuestion": "¿Para qué planeas usar principalmente Pangolin?",
|
||||||
"industryQuestion": "What is your industry?",
|
"industryQuestion": "¿Cuál es su industria?",
|
||||||
"prospectiveUsersQuestion": "How many prospective users do you expect to have?",
|
"prospectiveUsersQuestion": "¿Cuántos usuarios potenciales esperas tener?",
|
||||||
"prospectiveSitesQuestion": "How many prospective sites (tunnels) do you expect to have?",
|
"prospectiveSitesQuestion": "¿Cuántos sitios potenciales (túneles) esperas tener?",
|
||||||
"companyName": "Company name",
|
"companyName": "Nombre de la empresa",
|
||||||
"countryOfResidence": "Country of residence",
|
"countryOfResidence": "País de residencia",
|
||||||
"stateProvinceRegion": "State / Province / Region",
|
"stateProvinceRegion": "Estado / Province / Región",
|
||||||
"postalZipCode": "Postal / ZIP Code",
|
"postalZipCode": "Código postal",
|
||||||
"companyWebsite": "Company website",
|
"companyWebsite": "Sitio web de la empresa",
|
||||||
"companyPhoneNumber": "Company phone number",
|
"companyPhoneNumber": "Número de teléfono de la empresa",
|
||||||
"country": "Country",
|
"country": "País",
|
||||||
"phoneNumberOptional": "Phone number (optional)",
|
"phoneNumberOptional": "Número de teléfono (opcional)",
|
||||||
"complianceConfirmation": "I confirm that I am in compliance with the Fossorial Commercial License and that reporting inaccurate information or misidentifying use of the product is a violation of the license."
|
"complianceConfirmation": "Confirmo que la información que he proporcionado es exacta y que estoy en conformidad con la Licencia Comercial Fossorial. Informar de información inexacta o identificar mal el uso del producto es una violación de la licencia y puede resultar en que su clave sea revocada."
|
||||||
},
|
},
|
||||||
"buttons": {
|
"buttons": {
|
||||||
"close": "Close",
|
"close": "Cerrar",
|
||||||
"previous": "Previous",
|
"previous": "Anterior",
|
||||||
"next": "Next",
|
"next": "Siguiente",
|
||||||
"generateLicenseKey": "Generate License Key"
|
"generateLicenseKey": "Generar clave de licencia"
|
||||||
},
|
},
|
||||||
"toasts": {
|
"toasts": {
|
||||||
"success": {
|
"success": {
|
||||||
"title": "License key generated successfully",
|
"title": "Clave de licencia generada con éxito",
|
||||||
"description": "Your license key has been generated and is ready to use."
|
"description": "Su clave de licencia ha sido generada y está lista para usar."
|
||||||
},
|
},
|
||||||
"error": {
|
"error": {
|
||||||
"title": "Failed to generate license key",
|
"title": "Error al generar la clave de licencia",
|
||||||
"description": "An error occurred while generating the license key."
|
"description": "Se ha producido un error al generar la clave de licencia."
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"priority": "Prioridad",
|
"priority": "Prioridad",
|
||||||
"priorityDescription": "Las rutas de prioridad más alta son evaluadas primero. Prioridad = 100 significa orden automático (decisiones del sistema). Utilice otro número para hacer cumplir la prioridad manual.",
|
"priorityDescription": "Las rutas de prioridad más alta son evaluadas primero. Prioridad = 100 significa orden automático (decisiones del sistema). Utilice otro número para hacer cumplir la prioridad manual.",
|
||||||
"instanceName": "Instance Name",
|
"instanceName": "Nombre de instancia",
|
||||||
"pathMatchModalTitle": "Configure Path Matching",
|
"pathMatchModalTitle": "Configurar ruta coincidente",
|
||||||
"pathMatchModalDescription": "Set up how incoming requests should be matched based on their path.",
|
"pathMatchModalDescription": "Configurar cómo deben coincidir las peticiones entrantes en función de su ruta.",
|
||||||
"pathMatchType": "Match Type",
|
"pathMatchType": "Tipo de partida",
|
||||||
"pathMatchPrefix": "Prefix",
|
"pathMatchPrefix": "Prefijo",
|
||||||
"pathMatchExact": "Exact",
|
"pathMatchExact": "Exacto",
|
||||||
"pathMatchRegex": "Regex",
|
"pathMatchRegex": "Regex",
|
||||||
"pathMatchValue": "Path Value",
|
"pathMatchValue": "Valor de ruta",
|
||||||
"clear": "Clear",
|
"clear": "Claro",
|
||||||
"saveChanges": "Save Changes",
|
"saveChanges": "Guardar Cambios",
|
||||||
"pathMatchRegexPlaceholder": "^/api/.*",
|
"pathMatchRegexPlaceholder": "^/api/.*",
|
||||||
"pathMatchDefaultPlaceholder": "/path",
|
"pathMatchDefaultPlaceholder": "/ruta",
|
||||||
"pathMatchPrefixHelp": "Example: /api matches /api, /api/users, etc.",
|
"pathMatchPrefixHelp": "Ejemplo: /api coincide con /api, /api/users, etc.",
|
||||||
"pathMatchExactHelp": "Example: /api matches only /api",
|
"pathMatchExactHelp": "Ejemplo: /api coincide sólo con /api",
|
||||||
"pathMatchRegexHelp": "Example: ^/api/.* matches /api/anything",
|
"pathMatchRegexHelp": "Ejemplo: ^/api/.* coincide con /api/anything",
|
||||||
"pathRewriteModalTitle": "Configure Path Rewriting",
|
"pathRewriteModalTitle": "Configurar ruta de reescritura",
|
||||||
"pathRewriteModalDescription": "Transform the matched path before forwarding to the target.",
|
"pathRewriteModalDescription": "Transforma la ruta coincidente antes de reenviarla al objetivo.",
|
||||||
"pathRewriteType": "Rewrite Type",
|
"pathRewriteType": "Tipo de reescritura",
|
||||||
"pathRewritePrefixOption": "Prefix - Replace prefix",
|
"pathRewritePrefixOption": "Prefijo - Reemplazar prefijo",
|
||||||
"pathRewriteExactOption": "Exact - Replace entire path",
|
"pathRewriteExactOption": "Exacto - Reemplazar toda la ruta",
|
||||||
"pathRewriteRegexOption": "Regex - Pattern replacement",
|
"pathRewriteRegexOption": "Regex - Reemplazo de patrón",
|
||||||
"pathRewriteStripPrefixOption": "Strip Prefix - Remove prefix",
|
"pathRewriteStripPrefixOption": "Prefijo de clip - Quitar prefijo",
|
||||||
"pathRewriteValue": "Rewrite Value",
|
"pathRewriteValue": "Reescribir valor",
|
||||||
"pathRewriteRegexPlaceholder": "/new/$1",
|
"pathRewriteRegexPlaceholder": "/new/$1",
|
||||||
"pathRewriteDefaultPlaceholder": "/new-path",
|
"pathRewriteDefaultPlaceholder": "/new-path",
|
||||||
"pathRewritePrefixHelp": "Replace the matched prefix with this value",
|
"pathRewritePrefixHelp": "Reemplazar el prefijo coincidente con este valor",
|
||||||
"pathRewriteExactHelp": "Replace the entire path with this value when the path matches exactly",
|
"pathRewriteExactHelp": "Reemplaza toda la ruta con este valor cuando la ruta coincida exactamente",
|
||||||
"pathRewriteRegexHelp": "Use capture groups like $1, $2 for replacement",
|
"pathRewriteRegexHelp": "Usar grupos de captura como $1, $2 para reemplazar",
|
||||||
"pathRewriteStripPrefixHelp": "Leave empty to strip prefix or provide new prefix",
|
"pathRewriteStripPrefixHelp": "Dejar en blanco para el prefijo strip o proporcionar un nuevo prefijo",
|
||||||
"pathRewritePrefix": "Prefix",
|
"pathRewritePrefix": "Prefijo",
|
||||||
"pathRewriteExact": "Exact",
|
"pathRewriteExact": "Exacto",
|
||||||
"pathRewriteRegex": "Regex",
|
"pathRewriteRegex": "Regex",
|
||||||
"pathRewriteStrip": "Strip",
|
"pathRewriteStrip": "Clip",
|
||||||
"pathRewriteStripLabel": "strip"
|
"pathRewriteStripLabel": "clip",
|
||||||
|
"sidebarEnableEnterpriseLicense": "Activar licencia corporativa",
|
||||||
|
"cannotbeUndone": "Esto no se puede deshacer.",
|
||||||
|
"toConfirm": "confirmar",
|
||||||
|
"deleteClientQuestion": "¿Está seguro que desea eliminar el cliente del sitio y la organización?",
|
||||||
|
"clientMessageRemove": "Una vez eliminado, el cliente ya no podrá conectarse al sitio.",
|
||||||
|
"sidebarLogs": "Registros",
|
||||||
|
"request": "Solicitud",
|
||||||
|
"logs": "Registros",
|
||||||
|
"logsSettingsDescription": "Monitorear registros recogidos de esta orginización",
|
||||||
|
"searchLogs": "Buscar registros...",
|
||||||
|
"action": "Accin",
|
||||||
|
"actor": "Actor",
|
||||||
|
"timestamp": "Timestamp",
|
||||||
|
"accessLogs": "Registros de acceso",
|
||||||
|
"exportCsv": "Exportar CSV",
|
||||||
|
"actorId": "ID de Actor",
|
||||||
|
"allowedByRule": "Permitido por regla",
|
||||||
|
"allowedNoAuth": "No se permite autorización",
|
||||||
|
"validAccessToken": "Token de Acceso Válido",
|
||||||
|
"validHeaderAuth": "Valid header auth",
|
||||||
|
"validPincode": "Valid Pincode",
|
||||||
|
"validPassword": "Contraseña válida",
|
||||||
|
"validEmail": "Valid email",
|
||||||
|
"validSSO": "Valid SSO",
|
||||||
|
"resourceBlocked": "Recurso bloqueado",
|
||||||
|
"droppedByRule": "Soltado por regla",
|
||||||
|
"noSessions": "No hay sesiones",
|
||||||
|
"temporaryRequestToken": "Token de solicitud temporal",
|
||||||
|
"noMoreAuthMethods": "No Valid Auth",
|
||||||
|
"ip": "IP",
|
||||||
|
"reason": "Razón",
|
||||||
|
"requestLogs": "Registros de Solicitud",
|
||||||
|
"host": "Anfitrión",
|
||||||
|
"location": "Ubicación",
|
||||||
|
"actionLogs": "Registros de acción",
|
||||||
|
"sidebarLogsRequest": "Registros de Solicitud",
|
||||||
|
"sidebarLogsAccess": "Registros de acceso",
|
||||||
|
"sidebarLogsAction": "Registros de acción",
|
||||||
|
"logRetention": "Retención de Log",
|
||||||
|
"logRetentionDescription": "Administrar cuánto tiempo se conservan los diferentes tipos de registros para esta organización o desactivarlos",
|
||||||
|
"requestLogsDescription": "Ver registros de solicitudes detallados para los recursos de esta organización",
|
||||||
|
"logRetentionRequestLabel": "Retención de Registro de Solicitud",
|
||||||
|
"logRetentionRequestDescription": "Cuánto tiempo conservar los registros de solicitudes",
|
||||||
|
"logRetentionAccessLabel": "Retención de Log de Acceso",
|
||||||
|
"logRetentionAccessDescription": "Cuánto tiempo retener los registros de acceso",
|
||||||
|
"logRetentionActionLabel": "Retención de registro de acción",
|
||||||
|
"logRetentionActionDescription": "Cuánto tiempo retener los registros de acción",
|
||||||
|
"logRetentionDisabled": "Deshabilitado",
|
||||||
|
"logRetention3Days": "3 días",
|
||||||
|
"logRetention7Days": "7 días",
|
||||||
|
"logRetention14Days": "14 días",
|
||||||
|
"logRetention30Days": "30 días",
|
||||||
|
"logRetention90Days": "90 días",
|
||||||
|
"logRetentionForever": "Para siempre",
|
||||||
|
"actionLogsDescription": "Ver un historial de acciones realizadas en esta organización",
|
||||||
|
"accessLogsDescription": "Ver solicitudes de acceso a los recursos de esta organización",
|
||||||
|
"licenseRequiredToUse": "Se requiere una licencia Enterprise para utilizar esta función.",
|
||||||
|
"certResolver": "Resolver certificado",
|
||||||
|
"certResolverDescription": "Seleccione la resolución de certificados a utilizar para este recurso.",
|
||||||
|
"selectCertResolver": "Seleccionar Resolver Certificado",
|
||||||
|
"enterCustomResolver": "Introducir resolución personalizada",
|
||||||
|
"preferWildcardCert": "Certificado de comodín preferido",
|
||||||
|
"unverified": "Sin verificar",
|
||||||
|
"domainSetting": "Ajustes de dominio",
|
||||||
|
"domainSettingDescription": "Configurar ajustes para tu dominio",
|
||||||
|
"preferWildcardCertDescription": "Intento de generar un certificado comodín (requiere una resolución de certificados correctamente configurada).",
|
||||||
|
"recordName": "Nombre del registro",
|
||||||
|
"auto": "Auto",
|
||||||
|
"TTL": "TTL",
|
||||||
|
"howToAddRecords": "Cómo añadir registros",
|
||||||
|
"dnsRecord": "Registros DNS",
|
||||||
|
"required": "Requerido",
|
||||||
|
"domainSettingsUpdated": "Configuración de dominio actualizada correctamente",
|
||||||
|
"orgOrDomainIdMissing": "Falta el ID de organización o dominio",
|
||||||
|
"loadingDNSRecords": "Cargando registros DNS...",
|
||||||
|
"olmUpdateAvailableInfo": "Una versión actualizada de Olm está disponible. Por favor, actualice a la última versión para obtener la mejor experiencia.",
|
||||||
|
"client": "Cliente",
|
||||||
|
"proxyProtocol": "Configuración del Protocolo Proxy",
|
||||||
|
"proxyProtocolDescription": "Configurar el protocolo de proxy para preservar las direcciones IP del cliente para los servicios TCP/UDP.",
|
||||||
|
"enableProxyProtocol": "Habilitar protocolo proxy",
|
||||||
|
"proxyProtocolInfo": "Conservar direcciones IP del cliente para backends TCP/UDP",
|
||||||
|
"proxyProtocolVersion": "Versión del Protocolo Proxy",
|
||||||
|
"version1": " Versión 1 (Recomendado)",
|
||||||
|
"version2": "Versión 2",
|
||||||
|
"versionDescription": "La versión 1 está basada en texto y es ampliamente soportada. La versión 2 es binaria y más eficiente pero menos compatible.",
|
||||||
|
"warning": "Advertencia",
|
||||||
|
"proxyProtocolWarning": "Su aplicación de backend debe estar configurada para aceptar conexiones Proxy Protocol. Si su backend no soporta Proxy Protocol, habilitando esto romperá todas las conexiones. Asegúrese de configurar su backend para que confíe en las cabeceras del protocolo Proxy de Traefik.",
|
||||||
|
"restarting": "Reiniciando...",
|
||||||
|
"manual": "Manual",
|
||||||
|
"messageSupport": "Soporte de mensajes",
|
||||||
|
"supportNotAvailableTitle": "Soporte no disponible",
|
||||||
|
"supportNotAvailableDescription": "El soporte no está disponible en este momento. Puedes enviar un correo electrónico a support@pangolin.net.",
|
||||||
|
"supportRequestSentTitle": "Solicitud de soporte enviada",
|
||||||
|
"supportRequestSentDescription": "Su mensaje ha sido enviado con éxito.",
|
||||||
|
"supportRequestFailedTitle": "Error al enviar la solicitud",
|
||||||
|
"supportRequestFailedDescription": "Se ha producido un error al enviar su solicitud de soporte.",
|
||||||
|
"supportSubjectRequired": "El asunto es obligatorio",
|
||||||
|
"supportSubjectMaxLength": "El asunto debe tener 255 caracteres o menos",
|
||||||
|
"supportMessageRequired": "El mensaje es obligatorio",
|
||||||
|
"supportReplyTo": "Responder a",
|
||||||
|
"supportSubject": "Asunto",
|
||||||
|
"supportSubjectPlaceholder": "Introducir asunto",
|
||||||
|
"supportMessage": "Mensaje",
|
||||||
|
"supportMessagePlaceholder": "Introduce tu mensaje",
|
||||||
|
"supportSending": "Enviando...",
|
||||||
|
"supportSend": "Enviar",
|
||||||
|
"supportMessageSent": "¡Mensaje enviado!",
|
||||||
|
"supportWillContact": "¡Estaremos en contacto en breve!"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -47,9 +47,8 @@
|
|||||||
"edit": "Editer",
|
"edit": "Editer",
|
||||||
"siteConfirmDelete": "Confirmer la suppression du site",
|
"siteConfirmDelete": "Confirmer la suppression du site",
|
||||||
"siteDelete": "Supprimer le site",
|
"siteDelete": "Supprimer le site",
|
||||||
"siteMessageRemove": "Une fois supprimé, le site ne sera plus accessible. Toutes les ressources et cibles associées au site seront également supprimées.",
|
"siteMessageRemove": "Une fois supprimé, le site ne sera plus accessible. Toutes les cibles associées au site seront également supprimées.",
|
||||||
"siteMessageConfirm": "Pour confirmer, veuillez saisir le nom du site ci-dessous.",
|
"siteQuestionRemove": "Êtes-vous sûr de vouloir supprimer le site de l'organisation ?",
|
||||||
"siteQuestionRemove": "Êtes-vous sûr de vouloir supprimer le site {selectedSite} de l'organisation ?",
|
|
||||||
"siteManageSites": "Gérer les sites",
|
"siteManageSites": "Gérer les sites",
|
||||||
"siteDescription": "Autoriser la connectivité à votre réseau via des tunnels sécurisés",
|
"siteDescription": "Autoriser la connectivité à votre réseau via des tunnels sécurisés",
|
||||||
"siteCreate": "Créer un site",
|
"siteCreate": "Créer un site",
|
||||||
@@ -96,7 +95,7 @@
|
|||||||
"siteWgDescription": "Utilisez n'importe quel client WireGuard pour établir un tunnel. Configuration NAT manuelle requise.",
|
"siteWgDescription": "Utilisez n'importe quel client WireGuard pour établir un tunnel. Configuration NAT manuelle requise.",
|
||||||
"siteWgDescriptionSaas": "Utilisez n'importe quel client WireGuard pour établir un tunnel. Configuration NAT manuelle requise. FONCTIONNE UNIQUEMENT SUR DES NŒUDS AUTONOMES",
|
"siteWgDescriptionSaas": "Utilisez n'importe quel client WireGuard pour établir un tunnel. Configuration NAT manuelle requise. FONCTIONNE UNIQUEMENT SUR DES NŒUDS AUTONOMES",
|
||||||
"siteLocalDescription": "Ressources locales seulement. Pas de tunneling.",
|
"siteLocalDescription": "Ressources locales seulement. Pas de tunneling.",
|
||||||
"siteLocalDescriptionSaas": "Local resources only. No tunneling. Only available on remote nodes.",
|
"siteLocalDescriptionSaas": "Ressources locales uniquement. Pas de tunneling. Disponible uniquement sur les nœuds distants.",
|
||||||
"siteSeeAll": "Voir tous les sites",
|
"siteSeeAll": "Voir tous les sites",
|
||||||
"siteTunnelDescription": "Déterminez comment vous voulez vous connecter à votre site",
|
"siteTunnelDescription": "Déterminez comment vous voulez vous connecter à votre site",
|
||||||
"siteNewtCredentials": "Identifiants Newt",
|
"siteNewtCredentials": "Identifiants Newt",
|
||||||
@@ -154,8 +153,7 @@
|
|||||||
"protected": "Protégé",
|
"protected": "Protégé",
|
||||||
"notProtected": "Non Protégé",
|
"notProtected": "Non Protégé",
|
||||||
"resourceMessageRemove": "Une fois supprimée, la ressource ne sera plus accessible. Toutes les cibles associées à la ressource seront également supprimées.",
|
"resourceMessageRemove": "Une fois supprimée, la ressource ne sera plus accessible. Toutes les cibles associées à la ressource seront également supprimées.",
|
||||||
"resourceMessageConfirm": "Pour confirmer, veuillez saisir le nom de la ressource ci-dessous.",
|
"resourceQuestionRemove": "Êtes-vous sûr de vouloir supprimer la ressource de l'organisation ?",
|
||||||
"resourceQuestionRemove": "Êtes-vous sûr de vouloir supprimer la ressource {selectedResource} de l'organisation ?",
|
|
||||||
"resourceHTTP": "Ressource HTTPS",
|
"resourceHTTP": "Ressource HTTPS",
|
||||||
"resourceHTTPDescription": "Requêtes de proxy à votre application via HTTPS en utilisant un sous-domaine ou un domaine de base.",
|
"resourceHTTPDescription": "Requêtes de proxy à votre application via HTTPS en utilisant un sous-domaine ou un domaine de base.",
|
||||||
"resourceRaw": "Ressource TCP/UDP brute",
|
"resourceRaw": "Ressource TCP/UDP brute",
|
||||||
@@ -220,7 +218,7 @@
|
|||||||
"orgDeleteConfirm": "Confirmer la suppression de l'organisation",
|
"orgDeleteConfirm": "Confirmer la suppression de l'organisation",
|
||||||
"orgMessageRemove": "Cette action est irréversible et supprimera toutes les données associées.",
|
"orgMessageRemove": "Cette action est irréversible et supprimera toutes les données associées.",
|
||||||
"orgMessageConfirm": "Pour confirmer, veuillez saisir le nom de l'organisation ci-dessous.",
|
"orgMessageConfirm": "Pour confirmer, veuillez saisir le nom de l'organisation ci-dessous.",
|
||||||
"orgQuestionRemove": "Êtes-vous sûr de vouloir supprimer l'organisation {selectedOrg}?",
|
"orgQuestionRemove": "Êtes-vous sûr de vouloir supprimer l'organisation ?",
|
||||||
"orgUpdated": "Organisation mise à jour",
|
"orgUpdated": "Organisation mise à jour",
|
||||||
"orgUpdatedDescription": "L'organisation a été mise à jour.",
|
"orgUpdatedDescription": "L'organisation a été mise à jour.",
|
||||||
"orgErrorUpdate": "Échec de la mise à jour de l'organisation",
|
"orgErrorUpdate": "Échec de la mise à jour de l'organisation",
|
||||||
@@ -287,9 +285,8 @@
|
|||||||
"apiKeysAdd": "Générer une clé API",
|
"apiKeysAdd": "Générer une clé API",
|
||||||
"apiKeysErrorDelete": "Erreur lors de la suppression de la clé API",
|
"apiKeysErrorDelete": "Erreur lors de la suppression de la clé API",
|
||||||
"apiKeysErrorDeleteMessage": "Erreur lors de la suppression de la clé API",
|
"apiKeysErrorDeleteMessage": "Erreur lors de la suppression de la clé API",
|
||||||
"apiKeysQuestionRemove": "Êtes-vous sûr de vouloir supprimer la clé API {selectedApiKey} de l'organisation ?",
|
"apiKeysQuestionRemove": "Êtes-vous sûr de vouloir supprimer la clé API de l'organisation ?",
|
||||||
"apiKeysMessageRemove": "Une fois supprimée, la clé API ne pourra plus être utilisée.",
|
"apiKeysMessageRemove": "Une fois supprimée, la clé API ne pourra plus être utilisée.",
|
||||||
"apiKeysMessageConfirm": "Pour confirmer, veuillez saisir le nom de la clé API ci-dessous.",
|
|
||||||
"apiKeysDeleteConfirm": "Confirmer la suppression de la clé API",
|
"apiKeysDeleteConfirm": "Confirmer la suppression de la clé API",
|
||||||
"apiKeysDelete": "Supprimer la clé API",
|
"apiKeysDelete": "Supprimer la clé API",
|
||||||
"apiKeysManage": "Gérer les clés API",
|
"apiKeysManage": "Gérer les clés API",
|
||||||
@@ -305,8 +302,7 @@
|
|||||||
"userDeleteConfirm": "Confirmer la suppression de l'utilisateur",
|
"userDeleteConfirm": "Confirmer la suppression de l'utilisateur",
|
||||||
"userDeleteServer": "Supprimer l'utilisateur du serveur",
|
"userDeleteServer": "Supprimer l'utilisateur du serveur",
|
||||||
"userMessageRemove": "L'utilisateur sera retiré de toutes les organisations et sera complètement retiré du serveur.",
|
"userMessageRemove": "L'utilisateur sera retiré de toutes les organisations et sera complètement retiré du serveur.",
|
||||||
"userMessageConfirm": "Pour confirmer, veuillez saisir le nom de l'utilisateur ci-dessous.",
|
"userQuestionRemove": "Êtes-vous sûr de vouloir supprimer définitivement l'utilisateur du serveur?",
|
||||||
"userQuestionRemove": "Êtes-vous sûr de vouloir supprimer définitivement {selectedUser} du serveur?",
|
|
||||||
"licenseKey": "Clé de licence",
|
"licenseKey": "Clé de licence",
|
||||||
"valid": "Valide",
|
"valid": "Valide",
|
||||||
"numberOfSites": "Nombre de sites",
|
"numberOfSites": "Nombre de sites",
|
||||||
@@ -339,7 +335,7 @@
|
|||||||
"fossorialLicense": "Voir les conditions de licence commerciale et d'abonnement Fossorial",
|
"fossorialLicense": "Voir les conditions de licence commerciale et d'abonnement Fossorial",
|
||||||
"licenseMessageRemove": "Cela supprimera la clé de licence et toutes les autorisations qui lui sont associées.",
|
"licenseMessageRemove": "Cela supprimera la clé de licence et toutes les autorisations qui lui sont associées.",
|
||||||
"licenseMessageConfirm": "Pour confirmer, veuillez saisir la clé de licence ci-dessous.",
|
"licenseMessageConfirm": "Pour confirmer, veuillez saisir la clé de licence ci-dessous.",
|
||||||
"licenseQuestionRemove": "Êtes-vous sûr de vouloir supprimer la clé de licence {selectedKey}?",
|
"licenseQuestionRemove": "Êtes-vous sûr de vouloir supprimer la clé de licence ?",
|
||||||
"licenseKeyDelete": "Supprimer la clé de licence",
|
"licenseKeyDelete": "Supprimer la clé de licence",
|
||||||
"licenseKeyDeleteConfirm": "Confirmer la suppression de la clé de licence",
|
"licenseKeyDeleteConfirm": "Confirmer la suppression de la clé de licence",
|
||||||
"licenseTitle": "Gérer le statut de la licence",
|
"licenseTitle": "Gérer le statut de la licence",
|
||||||
@@ -372,7 +368,7 @@
|
|||||||
"inviteRemoveErrorDescription": "Une erreur s'est produite lors de la suppression de l'invitation.",
|
"inviteRemoveErrorDescription": "Une erreur s'est produite lors de la suppression de l'invitation.",
|
||||||
"inviteRemoved": "Invitation supprimée",
|
"inviteRemoved": "Invitation supprimée",
|
||||||
"inviteRemovedDescription": "L'invitation pour {email} a été supprimée.",
|
"inviteRemovedDescription": "L'invitation pour {email} a été supprimée.",
|
||||||
"inviteQuestionRemove": "Êtes-vous sûr de vouloir supprimer l'invitation {email}?",
|
"inviteQuestionRemove": "Êtes-vous sûr de vouloir supprimer l'invitation?",
|
||||||
"inviteMessageRemove": "Une fois supprimée, cette invitation ne sera plus valide. Vous pourrez toujours réinviter l'utilisateur plus tard.",
|
"inviteMessageRemove": "Une fois supprimée, cette invitation ne sera plus valide. Vous pourrez toujours réinviter l'utilisateur plus tard.",
|
||||||
"inviteMessageConfirm": "Pour confirmer, veuillez saisir l'adresse e-mail de l'invitation ci-dessous.",
|
"inviteMessageConfirm": "Pour confirmer, veuillez saisir l'adresse e-mail de l'invitation ci-dessous.",
|
||||||
"inviteQuestionRegenerate": "Êtes-vous sûr de vouloir régénérer l'invitation {email}? Cela révoquera l'invitation précédente.",
|
"inviteQuestionRegenerate": "Êtes-vous sûr de vouloir régénérer l'invitation {email}? Cela révoquera l'invitation précédente.",
|
||||||
@@ -398,9 +394,8 @@
|
|||||||
"userErrorOrgRemoveDescription": "Une erreur s'est produite lors de la suppression de l'utilisateur.",
|
"userErrorOrgRemoveDescription": "Une erreur s'est produite lors de la suppression de l'utilisateur.",
|
||||||
"userOrgRemoved": "Utilisateur supprimé",
|
"userOrgRemoved": "Utilisateur supprimé",
|
||||||
"userOrgRemovedDescription": "L'utilisateur {email} a été retiré de l'organisation.",
|
"userOrgRemovedDescription": "L'utilisateur {email} a été retiré de l'organisation.",
|
||||||
"userQuestionOrgRemove": "Êtes-vous sûr de vouloir retirer {email} de l'organisation ?",
|
"userQuestionOrgRemove": "Êtes-vous sûr de vouloir supprimer cet utilisateur de l'organisation ?",
|
||||||
"userMessageOrgRemove": "Une fois retiré, cet utilisateur n'aura plus accès à l'organisation. Vous pouvez toujours le réinviter plus tard, mais il devra accepter l'invitation à nouveau.",
|
"userMessageOrgRemove": "Une fois retiré, cet utilisateur n'aura plus accès à l'organisation. Vous pouvez toujours le réinviter plus tard, mais il devra accepter l'invitation à nouveau.",
|
||||||
"userMessageOrgConfirm": "Pour confirmer, veuillez saisir le nom de l'utilisateur ci-dessous.",
|
|
||||||
"userRemoveOrgConfirm": "Confirmer la suppression de l'utilisateur",
|
"userRemoveOrgConfirm": "Confirmer la suppression de l'utilisateur",
|
||||||
"userRemoveOrg": "Retirer l'utilisateur de l'organisation",
|
"userRemoveOrg": "Retirer l'utilisateur de l'organisation",
|
||||||
"users": "Utilisateurs",
|
"users": "Utilisateurs",
|
||||||
@@ -730,7 +725,7 @@
|
|||||||
"pangolinServerAdmin": "Admin Serveur - Pangolin",
|
"pangolinServerAdmin": "Admin Serveur - Pangolin",
|
||||||
"licenseTierProfessional": "Licence Professionnelle",
|
"licenseTierProfessional": "Licence Professionnelle",
|
||||||
"licenseTierEnterprise": "Licence Entreprise",
|
"licenseTierEnterprise": "Licence Entreprise",
|
||||||
"licenseTierPersonal": "Personal License",
|
"licenseTierPersonal": "Licence personnelle",
|
||||||
"licensed": "Sous licence",
|
"licensed": "Sous licence",
|
||||||
"yes": "Oui",
|
"yes": "Oui",
|
||||||
"no": "Non",
|
"no": "Non",
|
||||||
@@ -742,7 +737,7 @@
|
|||||||
"idpManageDescription": "Voir et gérer les fournisseurs d'identité dans le système",
|
"idpManageDescription": "Voir et gérer les fournisseurs d'identité dans le système",
|
||||||
"idpDeletedDescription": "Fournisseur d'identité supprimé avec succès",
|
"idpDeletedDescription": "Fournisseur d'identité supprimé avec succès",
|
||||||
"idpOidc": "OAuth2/OIDC",
|
"idpOidc": "OAuth2/OIDC",
|
||||||
"idpQuestionRemove": "Êtes-vous sûr de vouloir supprimer définitivement le fournisseur d'identité {name}?",
|
"idpQuestionRemove": "Êtes-vous sûr de vouloir supprimer définitivement le fournisseur d'identité?",
|
||||||
"idpMessageRemove": "Cela supprimera le fournisseur d'identité et toutes les configurations associées. Les utilisateurs qui s'authentifient via ce fournisseur ne pourront plus se connecter.",
|
"idpMessageRemove": "Cela supprimera le fournisseur d'identité et toutes les configurations associées. Les utilisateurs qui s'authentifient via ce fournisseur ne pourront plus se connecter.",
|
||||||
"idpMessageConfirm": "Pour confirmer, veuillez saisir le nom du fournisseur d'identité ci-dessous.",
|
"idpMessageConfirm": "Pour confirmer, veuillez saisir le nom du fournisseur d'identité ci-dessous.",
|
||||||
"idpConfirmDelete": "Confirmer la suppression du fournisseur d'identité",
|
"idpConfirmDelete": "Confirmer la suppression du fournisseur d'identité",
|
||||||
@@ -916,6 +911,18 @@
|
|||||||
"passwordResetCodeDescription": "Vérifiez votre e-mail pour le code de réinitialisation.",
|
"passwordResetCodeDescription": "Vérifiez votre e-mail pour le code de réinitialisation.",
|
||||||
"passwordNew": "Nouveau mot de passe",
|
"passwordNew": "Nouveau mot de passe",
|
||||||
"passwordNewConfirm": "Confirmer le nouveau mot de passe",
|
"passwordNewConfirm": "Confirmer le nouveau mot de passe",
|
||||||
|
"changePassword": "Changer le mot de passe",
|
||||||
|
"changePasswordDescription": "Mettre à jour le mot de passe de votre compte",
|
||||||
|
"oldPassword": "Mot de passe actuel",
|
||||||
|
"newPassword": "Nouveau mot de passe",
|
||||||
|
"confirmNewPassword": "Confirmer le nouveau mot de passe",
|
||||||
|
"changePasswordError": "Impossible de changer le mot de passe",
|
||||||
|
"changePasswordErrorDescription": "Une erreur s'est produite lors de la modification de votre mot de passe",
|
||||||
|
"changePasswordSuccess": "Mot de passe modifié avec succès",
|
||||||
|
"changePasswordSuccessDescription": "Votre mot de passe a été mis à jour avec succès",
|
||||||
|
"passwordExpiryRequired": "Expiration du mot de passe requise",
|
||||||
|
"passwordExpiryDescription": "Cette organisation vous demande de changer votre mot de passe tous les {maxDays} jours.",
|
||||||
|
"changePasswordNow": "Changer le mot de passe maintenant",
|
||||||
"pincodeAuth": "Code d'authentification",
|
"pincodeAuth": "Code d'authentification",
|
||||||
"pincodeSubmit2": "Soumettre le code",
|
"pincodeSubmit2": "Soumettre le code",
|
||||||
"passwordResetSubmit": "Demander la réinitialisation",
|
"passwordResetSubmit": "Demander la réinitialisation",
|
||||||
@@ -1156,6 +1163,25 @@
|
|||||||
"sidebarLicense": "Licence",
|
"sidebarLicense": "Licence",
|
||||||
"sidebarClients": "Clients",
|
"sidebarClients": "Clients",
|
||||||
"sidebarDomains": "Domaines",
|
"sidebarDomains": "Domaines",
|
||||||
|
"sidebarBluePrints": "Plans",
|
||||||
|
"blueprints": "Plans",
|
||||||
|
"blueprintsDescription": "Les plans sont des configurations YAML déclaratives qui définissent vos ressources et leurs paramètres",
|
||||||
|
"blueprintAdd": "Ajouter un Plan",
|
||||||
|
"blueprintGoBack": "Voir tous les plans",
|
||||||
|
"blueprintCreate": "Créer un Plan",
|
||||||
|
"blueprintCreateDescription2": "Suivez les étapes ci-dessous pour créer et appliquer un nouveau plan",
|
||||||
|
"blueprintDetails": "Détails du Plan",
|
||||||
|
"blueprintDetailsDescription": "Voir les détails de l'exécution des plans",
|
||||||
|
"blueprintInfo": "Informations sur le Plan",
|
||||||
|
"message": "Message",
|
||||||
|
"blueprintContentsDescription": "Définissez le contenu YAML décrivant votre infrastructure",
|
||||||
|
"blueprintErrorCreateDescription": "Une erreur s'est produite lors de l'application du plan",
|
||||||
|
"blueprintErrorCreate": "Erreur lors de la création du plan",
|
||||||
|
"searchBlueprintProgress": "Rechercher des plans...",
|
||||||
|
"appliedAt": "Appliqué à",
|
||||||
|
"source": "Source",
|
||||||
|
"contents": "Contenus",
|
||||||
|
"parsedContents": "Contenu analysé",
|
||||||
"enableDockerSocket": "Activer le Plan Docker",
|
"enableDockerSocket": "Activer le Plan Docker",
|
||||||
"enableDockerSocketDescription": "Activer le ramassage d'étiquettes de socket Docker pour les étiquettes de plan. Le chemin de socket doit être fourni à Newt.",
|
"enableDockerSocketDescription": "Activer le ramassage d'étiquettes de socket Docker pour les étiquettes de plan. Le chemin de socket doit être fourni à Newt.",
|
||||||
"enableDockerSocketLink": "En savoir plus",
|
"enableDockerSocketLink": "En savoir plus",
|
||||||
@@ -1211,9 +1237,8 @@
|
|||||||
"domainCreate": "Créer un domaine",
|
"domainCreate": "Créer un domaine",
|
||||||
"domainCreatedDescription": "Domaine créé avec succès",
|
"domainCreatedDescription": "Domaine créé avec succès",
|
||||||
"domainDeletedDescription": "Domaine supprimé avec succès",
|
"domainDeletedDescription": "Domaine supprimé avec succès",
|
||||||
"domainQuestionRemove": "Êtes-vous sûr de vouloir supprimer le domaine {domain} de votre compte ?",
|
"domainQuestionRemove": "Êtes-vous sûr de vouloir supprimer le domaine de votre compte ?",
|
||||||
"domainMessageRemove": "Une fois supprimé, le domaine ne sera plus associé à votre compte.",
|
"domainMessageRemove": "Une fois supprimé, le domaine ne sera plus associé à votre compte.",
|
||||||
"domainMessageConfirm": "Pour confirmer, veuillez taper le nom du domaine ci-dessous.",
|
|
||||||
"domainConfirmDelete": "Confirmer la suppression du domaine",
|
"domainConfirmDelete": "Confirmer la suppression du domaine",
|
||||||
"domainDelete": "Supprimer le domaine",
|
"domainDelete": "Supprimer le domaine",
|
||||||
"domain": "Domaine",
|
"domain": "Domaine",
|
||||||
@@ -1280,7 +1305,7 @@
|
|||||||
"billingFreeTier": "Niveau gratuit",
|
"billingFreeTier": "Niveau gratuit",
|
||||||
"billingWarningOverLimit": "Attention : Vous avez dépassé une ou plusieurs limites d'utilisation. Vos sites ne se connecteront pas tant que vous n'avez pas modifié votre abonnement ou ajusté votre utilisation.",
|
"billingWarningOverLimit": "Attention : Vous avez dépassé une ou plusieurs limites d'utilisation. Vos sites ne se connecteront pas tant que vous n'avez pas modifié votre abonnement ou ajusté votre utilisation.",
|
||||||
"billingUsageLimitsOverview": "Vue d'ensemble des limites d'utilisation",
|
"billingUsageLimitsOverview": "Vue d'ensemble des limites d'utilisation",
|
||||||
"billingMonitorUsage": "Surveillez votre consommation par rapport aux limites configurées. Si vous avez besoin d'une augmentation des limites, veuillez nous contacter à support@fossorial.io.",
|
"billingMonitorUsage": "Surveillez votre consommation par rapport aux limites configurées. Si vous avez besoin d'une augmentation des limites, veuillez nous contacter à support@pangolin.net.",
|
||||||
"billingDataUsage": "Utilisation des données",
|
"billingDataUsage": "Utilisation des données",
|
||||||
"billingOnlineTime": "Temps en ligne du site",
|
"billingOnlineTime": "Temps en ligne du site",
|
||||||
"billingUsers": "Utilisateurs actifs",
|
"billingUsers": "Utilisateurs actifs",
|
||||||
@@ -1346,6 +1371,19 @@
|
|||||||
"securityKeyUnknownError": "Un problème est survenu avec votre clé de sécurité. Veuillez réessayer.",
|
"securityKeyUnknownError": "Un problème est survenu avec votre clé de sécurité. Veuillez réessayer.",
|
||||||
"twoFactorRequired": "L'authentification à deux facteurs est requise pour enregistrer une clé de sécurité.",
|
"twoFactorRequired": "L'authentification à deux facteurs est requise pour enregistrer une clé de sécurité.",
|
||||||
"twoFactor": "Authentification à deux facteurs",
|
"twoFactor": "Authentification à deux facteurs",
|
||||||
|
"twoFactorAuthentication": "Authentification à deux facteurs",
|
||||||
|
"twoFactorDescription": "Cette organisation nécessite une authentification à deux facteurs.",
|
||||||
|
"enableTwoFactor": "Activer l'authentification à deux facteurs",
|
||||||
|
"organizationSecurityPolicy": "Politique de sécurité de l'organisation",
|
||||||
|
"organizationSecurityPolicyDescription": "Cette organisation a des exigences de sécurité qui doivent être remplies avant que vous puissiez y accéder",
|
||||||
|
"securityRequirements": "Exigences de sécurité",
|
||||||
|
"allRequirementsMet": "Toutes les conditions ont été remplies",
|
||||||
|
"completeRequirementsToContinue": "Remplissez les conditions ci-dessous pour continuer à accéder à cette organisation",
|
||||||
|
"youCanNowAccessOrganization": "Vous pouvez maintenant accéder à cette organisation",
|
||||||
|
"reauthenticationRequired": "Durée de la session",
|
||||||
|
"reauthenticationDescription": "Cette organisation vous demande de vous connecter tous les {maxDays} jours.",
|
||||||
|
"reauthenticationDescriptionHours": "Cette organisation vous demande de vous connecter toutes les {maxHours} heures.",
|
||||||
|
"reauthenticateNow": "Reconnectez-vous",
|
||||||
"adminEnabled2FaOnYourAccount": "Votre administrateur a activé l'authentification à deux facteurs pour {email}. Veuillez terminer le processus d'installation pour continuer.",
|
"adminEnabled2FaOnYourAccount": "Votre administrateur a activé l'authentification à deux facteurs pour {email}. Veuillez terminer le processus d'installation pour continuer.",
|
||||||
"securityKeyAdd": "Ajouter une clé de sécurité",
|
"securityKeyAdd": "Ajouter une clé de sécurité",
|
||||||
"securityKeyRegisterTitle": "Enregistrer une nouvelle clé de sécurité",
|
"securityKeyRegisterTitle": "Enregistrer une nouvelle clé de sécurité",
|
||||||
@@ -1558,14 +1596,13 @@
|
|||||||
"autoLoginErrorNoRedirectUrl": "Aucune URL de redirection reçue du fournisseur d'identité.",
|
"autoLoginErrorNoRedirectUrl": "Aucune URL de redirection reçue du fournisseur d'identité.",
|
||||||
"autoLoginErrorGeneratingUrl": "Échec de la génération de l'URL d'authentification.",
|
"autoLoginErrorGeneratingUrl": "Échec de la génération de l'URL d'authentification.",
|
||||||
"remoteExitNodeManageRemoteExitNodes": "Nœuds distants",
|
"remoteExitNodeManageRemoteExitNodes": "Nœuds distants",
|
||||||
"remoteExitNodeDescription": "Self-host one or more remote nodes to extend your network connectivity and reduce reliance on the cloud",
|
"remoteExitNodeDescription": "Héberger un ou plusieurs nœuds distants pour étendre votre connectivité réseau et réduire la dépendance sur le cloud",
|
||||||
"remoteExitNodes": "Nœuds",
|
"remoteExitNodes": "Nœuds",
|
||||||
"searchRemoteExitNodes": "Rechercher des nœuds...",
|
"searchRemoteExitNodes": "Rechercher des nœuds...",
|
||||||
"remoteExitNodeAdd": "Ajouter un noeud",
|
"remoteExitNodeAdd": "Ajouter un noeud",
|
||||||
"remoteExitNodeErrorDelete": "Erreur lors de la suppression du noeud",
|
"remoteExitNodeErrorDelete": "Erreur lors de la suppression du noeud",
|
||||||
"remoteExitNodeQuestionRemove": "Êtes-vous sûr de vouloir supprimer le noeud {selectedNode} de l'organisation ?",
|
"remoteExitNodeQuestionRemove": "Êtes-vous sûr de vouloir supprimer le noeud de l'organisation ?",
|
||||||
"remoteExitNodeMessageRemove": "Une fois supprimé, le noeud ne sera plus accessible.",
|
"remoteExitNodeMessageRemove": "Une fois supprimé, le noeud ne sera plus accessible.",
|
||||||
"remoteExitNodeMessageConfirm": "Pour confirmer, veuillez saisir le nom du noeud ci-dessous.",
|
|
||||||
"remoteExitNodeConfirmDelete": "Confirmer la suppression du noeud",
|
"remoteExitNodeConfirmDelete": "Confirmer la suppression du noeud",
|
||||||
"remoteExitNodeDelete": "Supprimer le noeud",
|
"remoteExitNodeDelete": "Supprimer le noeud",
|
||||||
"sidebarRemoteExitNodes": "Nœuds distants",
|
"sidebarRemoteExitNodes": "Nœuds distants",
|
||||||
@@ -1733,7 +1770,49 @@
|
|||||||
"resourceExposePortsEditFile": "Modifier le fichier : docker-compose.yml",
|
"resourceExposePortsEditFile": "Modifier le fichier : docker-compose.yml",
|
||||||
"emailVerificationRequired": "La vérification de l'e-mail est requise. Veuillez vous reconnecter via {dashboardUrl}/auth/login terminé cette étape. Puis revenez ici.",
|
"emailVerificationRequired": "La vérification de l'e-mail est requise. Veuillez vous reconnecter via {dashboardUrl}/auth/login terminé cette étape. Puis revenez ici.",
|
||||||
"twoFactorSetupRequired": "La configuration d'authentification à deux facteurs est requise. Veuillez vous reconnecter via {dashboardUrl}/auth/login terminé cette étape. Puis revenez ici.",
|
"twoFactorSetupRequired": "La configuration d'authentification à deux facteurs est requise. Veuillez vous reconnecter via {dashboardUrl}/auth/login terminé cette étape. Puis revenez ici.",
|
||||||
|
"additionalSecurityRequired": "Sécurité supplémentaire requise",
|
||||||
|
"organizationRequiresAdditionalSteps": "Cette organisation nécessite des étapes de sécurité supplémentaires avant de pouvoir accéder aux ressources.",
|
||||||
|
"completeTheseSteps": "Compléter ces étapes",
|
||||||
|
"enableTwoFactorAuthentication": "Activer l'authentification à deux facteurs",
|
||||||
|
"completeSecuritySteps": "Compléter les étapes de sécurité",
|
||||||
|
"securitySettings": "Paramètres de sécurité",
|
||||||
|
"securitySettingsDescription": "Configurer les politiques de sécurité de votre organisation",
|
||||||
|
"requireTwoFactorForAllUsers": "Exiger une authentification à deux facteurs pour tous les utilisateurs",
|
||||||
|
"requireTwoFactorDescription": "Lorsque cette option est activée, tous les utilisateurs internes de cette organisation doivent avoir l'authentification à deux facteurs pour accéder à l'organisation.",
|
||||||
|
"requireTwoFactorDisabledDescription": "Cette fonctionnalité nécessite une licence valide (Entreprise) ou un abonnement actif (SaaS)",
|
||||||
|
"requireTwoFactorCannotEnableDescription": "Vous devez activer l'authentification à deux facteurs pour votre compte avant de l'appliquer pour tous les utilisateurs",
|
||||||
|
"maxSessionLength": "Longueur maximale de la session",
|
||||||
|
"maxSessionLengthDescription": "Définissez la durée maximale des sessions utilisateur. Après cette période, les utilisateurs devront se ré-authentifier.",
|
||||||
|
"maxSessionLengthDisabledDescription": "Cette fonctionnalité nécessite une licence valide (Entreprise) ou un abonnement actif (SaaS)",
|
||||||
|
"selectSessionLength": "Sélectionnez la durée de la session",
|
||||||
|
"unenforced": "Non appliqué",
|
||||||
|
"1Hour": "1 heure",
|
||||||
|
"3Hours": "3heures",
|
||||||
|
"6Hours": "6 heures",
|
||||||
|
"12Hours": "12 heures",
|
||||||
|
"1DaySession": "1 jour",
|
||||||
|
"3Days": "3 jours",
|
||||||
|
"7Days": "7 jours",
|
||||||
|
"14Days": "14 jours",
|
||||||
|
"30DaysSession": "30 jours",
|
||||||
|
"90DaysSession": "90 jours",
|
||||||
|
"180DaysSession": "180 jours",
|
||||||
|
"passwordExpiryDays": "Expiration du mot de passe",
|
||||||
|
"editPasswordExpiryDescription": "Définissez le nombre de jours avant que les utilisateurs ne soient tenus de changer leur mot de passe.",
|
||||||
|
"selectPasswordExpiry": "Sélectionnez l'expiration du mot de passe",
|
||||||
|
"30Days": "30 jours",
|
||||||
|
"1Day": "1 jour",
|
||||||
|
"60Days": "60 jours",
|
||||||
|
"90Days": "90 jours",
|
||||||
|
"180Days": "180 jours",
|
||||||
|
"1Year": "1 an",
|
||||||
|
"subscriptionBadge": "Abonnement Requis",
|
||||||
|
"securityPolicyChangeWarning": "Avertissement de changement de politique de sécurité",
|
||||||
|
"securityPolicyChangeDescription": "Vous êtes sur le point de modifier les paramètres de la politique de sécurité. Une fois enregistré, vous devrez peut-être vous authentifier à nouveau pour vous conformer à ces mises à jour de règles. Tous les utilisateurs qui ne sont pas conformes devront également se réauthentifier.",
|
||||||
|
"securityPolicyChangeConfirmMessage": "Je confirme",
|
||||||
|
"securityPolicyChangeWarningText": "Cela affectera tous les utilisateurs de l'organisation",
|
||||||
"authPageErrorUpdateMessage": "Une erreur s'est produite lors de la mise à jour de la page d\u000027authentification",
|
"authPageErrorUpdateMessage": "Une erreur s'est produite lors de la mise à jour de la page d\u000027authentification",
|
||||||
|
"authPageErrorUpdate": "Impossible de mettre à jour la page d'authentification",
|
||||||
"authPageUpdated": "Page d\u000027authentification mise à jour avec succès",
|
"authPageUpdated": "Page d\u000027authentification mise à jour avec succès",
|
||||||
"healthCheckNotAvailable": "Locale",
|
"healthCheckNotAvailable": "Locale",
|
||||||
"rewritePath": "Réécrire le chemin",
|
"rewritePath": "Réécrire le chemin",
|
||||||
@@ -1745,153 +1824,261 @@
|
|||||||
"resourceHeaderAuthRemoveDescription": "Authentification de l'en-tête supprimée avec succès.",
|
"resourceHeaderAuthRemoveDescription": "Authentification de l'en-tête supprimée avec succès.",
|
||||||
"resourceErrorHeaderAuthRemove": "Échec de la suppression de l'authentification de l'en-tête",
|
"resourceErrorHeaderAuthRemove": "Échec de la suppression de l'authentification de l'en-tête",
|
||||||
"resourceErrorHeaderAuthRemoveDescription": "Impossible de supprimer l'authentification de l'en-tête de la ressource.",
|
"resourceErrorHeaderAuthRemoveDescription": "Impossible de supprimer l'authentification de l'en-tête de la ressource.",
|
||||||
"resourceHeaderAuthProtectionEnabled": "Header Authentication Enabled",
|
"resourceHeaderAuthProtectionEnabled": "Authentification de l'en-tête activée",
|
||||||
"resourceHeaderAuthProtectionDisabled": "Header Authentication Disabled",
|
"resourceHeaderAuthProtectionDisabled": "L'authentification de l'en-tête est désactivée",
|
||||||
"headerAuthRemove": "Remove Header Auth",
|
"headerAuthRemove": "Supprimer l'authentification de l'en-tête",
|
||||||
"headerAuthAdd": "Add Header Auth",
|
"headerAuthAdd": "Ajouter l'authentification de l'en-tête",
|
||||||
"resourceErrorHeaderAuthSetup": "Impossible de définir l'authentification de l'en-tête",
|
"resourceErrorHeaderAuthSetup": "Impossible de définir l'authentification de l'en-tête",
|
||||||
"resourceErrorHeaderAuthSetupDescription": "Impossible de définir l'authentification de l'en-tête pour la ressource.",
|
"resourceErrorHeaderAuthSetupDescription": "Impossible de définir l'authentification de l'en-tête pour la ressource.",
|
||||||
"resourceHeaderAuthSetup": "Authentification de l'en-tête définie avec succès",
|
"resourceHeaderAuthSetup": "Authentification de l'en-tête définie avec succès",
|
||||||
"resourceHeaderAuthSetupDescription": "L'authentification de l'en-tête a été définie avec succès.",
|
"resourceHeaderAuthSetupDescription": "L'authentification de l'en-tête a été définie avec succès.",
|
||||||
"resourceHeaderAuthSetupTitle": "Authentification de l'en-tête",
|
"resourceHeaderAuthSetupTitle": "Authentification de l'en-tête",
|
||||||
"resourceHeaderAuthSetupTitleDescription": "Set the basic auth credentials (username and password) to protect this resource with HTTP Header Authentication. Access it using the format https://username:password@resource.example.com",
|
"resourceHeaderAuthSetupTitleDescription": "Définissez les identifiants d'authentification de base (nom d'utilisateur et mot de passe) pour protéger cette ressource avec l'authentification de l'en-tête HTTP. Accédez-y en utilisant le format https://username:password@resource.example.com",
|
||||||
"resourceHeaderAuthSubmit": "Authentification de l'en-tête",
|
"resourceHeaderAuthSubmit": "Authentification de l'en-tête",
|
||||||
"actionSetResourceHeaderAuth": "Authentification de l'en-tête",
|
"actionSetResourceHeaderAuth": "Authentification de l'en-tête",
|
||||||
"enterpriseEdition": "Enterprise Edition",
|
"enterpriseEdition": "Édition Entreprise",
|
||||||
"unlicensed": "Unlicensed",
|
"unlicensed": "Sans licence",
|
||||||
"beta": "Beta",
|
"beta": "Bêta",
|
||||||
"manageClients": "Manage Clients",
|
"manageClients": "Gérer les clients",
|
||||||
"manageClientsDescription": "Clients are devices that can connect to your sites",
|
"manageClientsDescription": "Les clients sont des appareils qui peuvent se connecter à vos sites",
|
||||||
"licenseTableValidUntil": "Valid Until",
|
"licenseTableValidUntil": "Valable jusqu'au",
|
||||||
"saasLicenseKeysSettingsTitle": "Enterprise Licenses",
|
"saasLicenseKeysSettingsTitle": "Licences Entreprise",
|
||||||
"saasLicenseKeysSettingsDescription": "Generate and manage Enterprise license keys for self-hosted Pangolin instances",
|
"saasLicenseKeysSettingsDescription": "Générer et gérer les clés de licence Entreprise pour les instances Pangolin auto-hébergées",
|
||||||
"sidebarEnterpriseLicenses": "Licenses",
|
"sidebarEnterpriseLicenses": "Licences",
|
||||||
"generateLicenseKey": "Generate License Key",
|
"generateLicenseKey": "Générer une clé de licence",
|
||||||
"generateLicenseKeyForm": {
|
"generateLicenseKeyForm": {
|
||||||
"validation": {
|
"validation": {
|
||||||
"emailRequired": "Please enter a valid email address",
|
"emailRequired": "Veuillez entrer une adresse e-mail valide",
|
||||||
"useCaseTypeRequired": "Please select a use case type",
|
"useCaseTypeRequired": "Veuillez sélectionner un type de cas d'utilisation",
|
||||||
"firstNameRequired": "First name is required",
|
"firstNameRequired": "Le prénom est requis",
|
||||||
"lastNameRequired": "Last name is required",
|
"lastNameRequired": "Le nom est requis",
|
||||||
"primaryUseRequired": "Please describe your primary use",
|
"primaryUseRequired": "Veuillez décrire votre utilisation principale",
|
||||||
"jobTitleRequiredBusiness": "Job title is required for business use",
|
"jobTitleRequiredBusiness": "Le titre du poste est requis pour un usage professionnel",
|
||||||
"industryRequiredBusiness": "Industry is required for business use",
|
"industryRequiredBusiness": "L'industrie est requise pour une utilisation commerciale",
|
||||||
"stateProvinceRegionRequired": "State/Province/Region is required",
|
"stateProvinceRegionRequired": "État/Province/Région est obligatoire",
|
||||||
"postalZipCodeRequired": "Postal/ZIP Code is required",
|
"postalZipCodeRequired": "Le code postal est requis",
|
||||||
"companyNameRequiredBusiness": "Company name is required for business use",
|
"companyNameRequiredBusiness": "Le nom de la société est requis pour une utilisation commerciale",
|
||||||
"countryOfResidenceRequiredBusiness": "Country of residence is required for business use",
|
"countryOfResidenceRequiredBusiness": "Le pays de résidence est requis pour un usage professionnel",
|
||||||
"countryRequiredPersonal": "Country is required for personal use",
|
"countryRequiredPersonal": "Le pays est requis pour un usage personnel",
|
||||||
"agreeToTermsRequired": "You must agree to the terms",
|
"agreeToTermsRequired": "Vous devez accepter les conditions",
|
||||||
"complianceConfirmationRequired": "You must confirm compliance with the Fossorial Commercial License"
|
"complianceConfirmationRequired": "Vous devez confirmer le respect de la licence commerciale Fossorial"
|
||||||
},
|
},
|
||||||
"useCaseOptions": {
|
"useCaseOptions": {
|
||||||
"personal": {
|
"personal": {
|
||||||
"title": "Personal Use",
|
"title": "Utilisation personnelle",
|
||||||
"description": "For individual, non-commercial use such as learning, personal projects, or experimentation."
|
"description": "Pour une utilisation individuelle et non commerciale telle que l'apprentissage, les projets personnels ou l'expérimentation."
|
||||||
},
|
},
|
||||||
"business": {
|
"business": {
|
||||||
"title": "Business Use",
|
"title": "Utilisation de l'entreprise",
|
||||||
"description": "For use within organizations, companies, or commercial or revenue-generating activities."
|
"description": "Pour utilisation au sein d’organisations, d’entreprises ou d’activités commerciales ou génératrices de revenus."
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"steps": {
|
"steps": {
|
||||||
"emailLicenseType": {
|
"emailLicenseType": {
|
||||||
"title": "Email & License Type",
|
"title": "Email & Type de licence",
|
||||||
"description": "Enter your email and choose your license type"
|
"description": "Entrez votre adresse e-mail et choisissez votre type de licence"
|
||||||
},
|
},
|
||||||
"personalInformation": {
|
"personalInformation": {
|
||||||
"title": "Personal Information",
|
"title": "Informations personnelles",
|
||||||
"description": "Tell us about yourself"
|
"description": "Parlez-nous de vous-même"
|
||||||
},
|
},
|
||||||
"contactInformation": {
|
"contactInformation": {
|
||||||
"title": "Contact Information",
|
"title": "Coordonnées",
|
||||||
"description": "Your contact details"
|
"description": "Vos coordonnées"
|
||||||
},
|
},
|
||||||
"termsGenerate": {
|
"termsGenerate": {
|
||||||
"title": "Terms & Generate",
|
"title": "Termes & Générer",
|
||||||
"description": "Review and accept terms to generate your license"
|
"description": "Examinez et acceptez les conditions pour générer votre licence"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"alerts": {
|
"alerts": {
|
||||||
"commercialUseDisclosure": {
|
"commercialUseDisclosure": {
|
||||||
"title": "Usage Disclosure",
|
"title": "Divulgation d'utilisation",
|
||||||
"description": "Select the license tier that accurately reflects your intended use. The Personal License permits free use of the Software for individual, non-commercial or small-scale commercial activities with annual gross revenue under $100,000 USD. Any use beyond these limits — including use within a business, organization, or other revenue-generating environment — requires a valid Enterprise License and payment of the applicable licensing fee. All users, whether Personal or Enterprise, must comply with the Fossorial Commercial License Terms."
|
"description": "Sélectionnez le niveau de licence qui correspond exactement à votre utilisation prévue. La Licence Personnelle autorise l'utilisation libre du Logiciel pour des activités commerciales individuelles, non commerciales ou à petite échelle avec un revenu annuel brut inférieur à 100 000 USD. Toute utilisation au-delà de ces limites — y compris l'utilisation au sein d'une entreprise, d'une organisation, ou tout autre environnement générateur de revenus — nécessite une licence d’entreprise valide et le paiement des droits de licence applicables. Tous les utilisateurs, qu'ils soient personnels ou d'entreprise, doivent se conformer aux conditions de licence commerciale Fossorial."
|
||||||
},
|
},
|
||||||
"trialPeriodInformation": {
|
"trialPeriodInformation": {
|
||||||
"title": "Trial Period Information",
|
"title": "Informations sur la période d'essai",
|
||||||
"description": "This License Key enables Enterprise features for a 7-day evaluation period. Continued access to Paid Features beyond the evaluation period requires activation under a valid Personal or Enterprise License. For Enterprise licensing, contact sales@fossorial.io."
|
"description": "Cette clé de licence permet aux entreprises de bénéficier de fonctionnalités pour une période d'évaluation de 7 jours. L'accès continu aux fonctionnalités payantes au-delà de la période d'évaluation nécessite une activation sous une licence personnelle ou d'entreprise valide. Pour une licence d'entreprise, contactez sales@pangolin.net."
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"form": {
|
"form": {
|
||||||
"useCaseQuestion": "Are you using Pangolin for personal or business use?",
|
"useCaseQuestion": "Utilisez-vous Pangolin à des fins personnelles ou professionnelles?",
|
||||||
"firstName": "First Name",
|
"firstName": "Prénom",
|
||||||
"lastName": "Last Name",
|
"lastName": "Nom de famille",
|
||||||
"jobTitle": "Job Title",
|
"jobTitle": "Titre du poste",
|
||||||
"primaryUseQuestion": "What do you primarily plan to use Pangolin for?",
|
"primaryUseQuestion": "À quoi comptez-vous avant tout utiliser le Pangolin ?",
|
||||||
"industryQuestion": "What is your industry?",
|
"industryQuestion": "Quelle est votre industrie?",
|
||||||
"prospectiveUsersQuestion": "How many prospective users do you expect to have?",
|
"prospectiveUsersQuestion": "Combien d'utilisateurs vous attendez-vous à avoir ?",
|
||||||
"prospectiveSitesQuestion": "How many prospective sites (tunnels) do you expect to have?",
|
"prospectiveSitesQuestion": "Combien de sites potentiels (tunnels) voulez-vous avoir?",
|
||||||
"companyName": "Company name",
|
"companyName": "Nom de la société",
|
||||||
"countryOfResidence": "Country of residence",
|
"countryOfResidence": "Pays de résidence",
|
||||||
"stateProvinceRegion": "State / Province / Region",
|
"stateProvinceRegion": "Etat / Province / Région",
|
||||||
"postalZipCode": "Postal / ZIP Code",
|
"postalZipCode": "Code postal / ZIP",
|
||||||
"companyWebsite": "Company website",
|
"companyWebsite": "Site web de l'entreprise",
|
||||||
"companyPhoneNumber": "Company phone number",
|
"companyPhoneNumber": "Numéro de téléphone de la société",
|
||||||
"country": "Country",
|
"country": "Pays",
|
||||||
"phoneNumberOptional": "Phone number (optional)",
|
"phoneNumberOptional": "Numéro de téléphone (facultatif)",
|
||||||
"complianceConfirmation": "I confirm that I am in compliance with the Fossorial Commercial License and that reporting inaccurate information or misidentifying use of the product is a violation of the license."
|
"complianceConfirmation": "Je confirme que les renseignements que j'ai fournis sont exacts et que je suis en conformité avec la licence commerciale Fossorial. Signaler des informations inexactes ou une mauvaise identification de l'utilisation du produit constitue une violation de la licence et peut entraîner la révocation de votre clé."
|
||||||
},
|
},
|
||||||
"buttons": {
|
"buttons": {
|
||||||
"close": "Close",
|
"close": "Fermer",
|
||||||
"previous": "Previous",
|
"previous": "Précédent",
|
||||||
"next": "Next",
|
"next": "Suivant",
|
||||||
"generateLicenseKey": "Generate License Key"
|
"generateLicenseKey": "Générer une clé de licence"
|
||||||
},
|
},
|
||||||
"toasts": {
|
"toasts": {
|
||||||
"success": {
|
"success": {
|
||||||
"title": "License key generated successfully",
|
"title": "Clé de licence générée avec succès",
|
||||||
"description": "Your license key has been generated and is ready to use."
|
"description": "Votre clé de licence a été générée et est prête à l'emploi."
|
||||||
},
|
},
|
||||||
"error": {
|
"error": {
|
||||||
"title": "Failed to generate license key",
|
"title": "Impossible de générer la clé de licence",
|
||||||
"description": "An error occurred while generating the license key."
|
"description": "Une erreur s'est produite lors de la génération de la clé de licence."
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"priority": "Priorité",
|
"priority": "Priorité",
|
||||||
"priorityDescription": "Les routes de haute priorité sont évaluées en premier. La priorité = 100 signifie l'ordre automatique (décision du système). Utilisez un autre nombre pour imposer la priorité manuelle.",
|
"priorityDescription": "Les routes de haute priorité sont évaluées en premier. La priorité = 100 signifie l'ordre automatique (décision du système). Utilisez un autre nombre pour imposer la priorité manuelle.",
|
||||||
"instanceName": "Instance Name",
|
"instanceName": "Nom de l'instance",
|
||||||
"pathMatchModalTitle": "Configure Path Matching",
|
"pathMatchModalTitle": "Configurer le chemin correspondant",
|
||||||
"pathMatchModalDescription": "Set up how incoming requests should be matched based on their path.",
|
"pathMatchModalDescription": "Définissez comment les requêtes entrantes doivent être trouvées en fonction de leur chemin.",
|
||||||
"pathMatchType": "Match Type",
|
"pathMatchType": "Type de correspondance",
|
||||||
"pathMatchPrefix": "Prefix",
|
"pathMatchPrefix": "Préfixe",
|
||||||
"pathMatchExact": "Exact",
|
"pathMatchExact": "Exactement",
|
||||||
"pathMatchRegex": "Regex",
|
"pathMatchRegex": "Regex",
|
||||||
"pathMatchValue": "Path Value",
|
"pathMatchValue": "Valeur du chemin",
|
||||||
"clear": "Clear",
|
"clear": "Nettoyer",
|
||||||
"saveChanges": "Save Changes",
|
"saveChanges": "Enregistrer les modifications",
|
||||||
"pathMatchRegexPlaceholder": "^/api/.*",
|
"pathMatchRegexPlaceholder": "^/api/.*",
|
||||||
"pathMatchDefaultPlaceholder": "/path",
|
"pathMatchDefaultPlaceholder": "/chemin d'accès",
|
||||||
"pathMatchPrefixHelp": "Example: /api matches /api, /api/users, etc.",
|
"pathMatchPrefixHelp": "Exemple: /api correspond à /api, /api/users, etc.",
|
||||||
"pathMatchExactHelp": "Example: /api matches only /api",
|
"pathMatchExactHelp": "Exemple: /api ne correspond qu'à /api",
|
||||||
"pathMatchRegexHelp": "Example: ^/api/.* matches /api/anything",
|
"pathMatchRegexHelp": "Exemple: ^/api/.* correspond à /api/anything",
|
||||||
"pathRewriteModalTitle": "Configure Path Rewriting",
|
"pathRewriteModalTitle": "Configurer la réécriture du chemin",
|
||||||
"pathRewriteModalDescription": "Transform the matched path before forwarding to the target.",
|
"pathRewriteModalDescription": "Transformez le chemin correspondant avant de l'envoyer à la cible.",
|
||||||
"pathRewriteType": "Rewrite Type",
|
"pathRewriteType": "Type de réécriture",
|
||||||
"pathRewritePrefixOption": "Prefix - Replace prefix",
|
"pathRewritePrefixOption": "Préfixe - Remplacer le préfixe",
|
||||||
"pathRewriteExactOption": "Exact - Replace entire path",
|
"pathRewriteExactOption": "Exactement - Remplacer le chemin entier",
|
||||||
"pathRewriteRegexOption": "Regex - Pattern replacement",
|
"pathRewriteRegexOption": "Regex - Remplacement de patron",
|
||||||
"pathRewriteStripPrefixOption": "Strip Prefix - Remove prefix",
|
"pathRewriteStripPrefixOption": "Retirer le préfixe - Supprimer le préfixe",
|
||||||
"pathRewriteValue": "Rewrite Value",
|
"pathRewriteValue": "Réécrire la valeur",
|
||||||
"pathRewriteRegexPlaceholder": "/new/$1",
|
"pathRewriteRegexPlaceholder": "/fr/new/$1",
|
||||||
"pathRewriteDefaultPlaceholder": "/new-path",
|
"pathRewriteDefaultPlaceholder": "/fr/new-path",
|
||||||
"pathRewritePrefixHelp": "Replace the matched prefix with this value",
|
"pathRewritePrefixHelp": "Remplacer le préfixe correspondant par cette valeur",
|
||||||
"pathRewriteExactHelp": "Replace the entire path with this value when the path matches exactly",
|
"pathRewriteExactHelp": "Remplacer le chemin entier par cette valeur lorsque le chemin correspond exactement",
|
||||||
"pathRewriteRegexHelp": "Use capture groups like $1, $2 for replacement",
|
"pathRewriteRegexHelp": "Utiliser des groupes de capture comme $1, $2 pour le remplacement",
|
||||||
"pathRewriteStripPrefixHelp": "Leave empty to strip prefix or provide new prefix",
|
"pathRewriteStripPrefixHelp": "Laisser vide pour supprimer le préfixe ou fournir un nouveau préfixe",
|
||||||
"pathRewritePrefix": "Prefix",
|
"pathRewritePrefix": "Préfixe",
|
||||||
"pathRewriteExact": "Exact",
|
"pathRewriteExact": "Exactement",
|
||||||
"pathRewriteRegex": "Regex",
|
"pathRewriteRegex": "Regex",
|
||||||
"pathRewriteStrip": "Strip",
|
"pathRewriteStrip": "Retirer",
|
||||||
"pathRewriteStripLabel": "strip"
|
"pathRewriteStripLabel": "bande",
|
||||||
|
"sidebarEnableEnterpriseLicense": "Activer la licence Entreprise",
|
||||||
|
"cannotbeUndone": "Cela ne peut pas être annulé.",
|
||||||
|
"toConfirm": "pour confirmer",
|
||||||
|
"deleteClientQuestion": "Êtes-vous sûr de vouloir supprimer le client du site et de l'organisation ?",
|
||||||
|
"clientMessageRemove": "Une fois supprimé, le client ne pourra plus se connecter au site.",
|
||||||
|
"sidebarLogs": "Journaux",
|
||||||
|
"request": "Demander",
|
||||||
|
"logs": "Journaux",
|
||||||
|
"logsSettingsDescription": "Surveiller les logs collectés à partir de cette organisation",
|
||||||
|
"searchLogs": "Rechercher dans les journaux...",
|
||||||
|
"action": "Action",
|
||||||
|
"actor": "Acteur",
|
||||||
|
"timestamp": "Horodatage",
|
||||||
|
"accessLogs": "Journaux d'accès",
|
||||||
|
"exportCsv": "Exporter CSV",
|
||||||
|
"actorId": "ID de l'acteur",
|
||||||
|
"allowedByRule": "Autorisé par la règle",
|
||||||
|
"allowedNoAuth": "Aucune authentification autorisée",
|
||||||
|
"validAccessToken": "Jeton d'accès valide",
|
||||||
|
"validHeaderAuth": "Valid header auth",
|
||||||
|
"validPincode": "Valid Pincode",
|
||||||
|
"validPassword": "Mot de passe valide",
|
||||||
|
"validEmail": "Valid email",
|
||||||
|
"validSSO": "Valid SSO",
|
||||||
|
"resourceBlocked": "Ressource bloquée",
|
||||||
|
"droppedByRule": "Abandonné par la règle",
|
||||||
|
"noSessions": "Aucune session",
|
||||||
|
"temporaryRequestToken": "Jeton de requête temporaire",
|
||||||
|
"noMoreAuthMethods": "No Valid Auth",
|
||||||
|
"ip": "IP",
|
||||||
|
"reason": "Raison",
|
||||||
|
"requestLogs": "Journal des requêtes",
|
||||||
|
"host": "Hôte",
|
||||||
|
"location": "Localisation",
|
||||||
|
"actionLogs": "Journaux des actions",
|
||||||
|
"sidebarLogsRequest": "Journal des requêtes",
|
||||||
|
"sidebarLogsAccess": "Journaux d'accès",
|
||||||
|
"sidebarLogsAction": "Journaux des actions",
|
||||||
|
"logRetention": "Journaliser la rétention",
|
||||||
|
"logRetentionDescription": "Gérer la durée de conservation des différents types de logs pour cette organisation ou les désactiver",
|
||||||
|
"requestLogsDescription": "Voir les journaux détaillés des requêtes pour les ressources de cette organisation",
|
||||||
|
"logRetentionRequestLabel": "Demander la rétention des journaux",
|
||||||
|
"logRetentionRequestDescription": "Durée de conservation des journaux de requêtes",
|
||||||
|
"logRetentionAccessLabel": "Rétention du journal d'accès",
|
||||||
|
"logRetentionAccessDescription": "Durée de conservation des journaux d'accès",
|
||||||
|
"logRetentionActionLabel": "Retention du journal des actions",
|
||||||
|
"logRetentionActionDescription": "Durée de conservation du journal des actions",
|
||||||
|
"logRetentionDisabled": "Désactivé",
|
||||||
|
"logRetention3Days": "3 jours",
|
||||||
|
"logRetention7Days": "7 jours",
|
||||||
|
"logRetention14Days": "14 jours",
|
||||||
|
"logRetention30Days": "30 jours",
|
||||||
|
"logRetention90Days": "90 jours",
|
||||||
|
"logRetentionForever": "Pour toujours",
|
||||||
|
"actionLogsDescription": "Voir l'historique des actions effectuées dans cette organisation",
|
||||||
|
"accessLogsDescription": "Voir les demandes d'authentification d'accès aux ressources de cette organisation",
|
||||||
|
"licenseRequiredToUse": "Une licence Entreprise est nécessaire pour utiliser cette fonctionnalité.",
|
||||||
|
"certResolver": "Résolveur de certificat",
|
||||||
|
"certResolverDescription": "Sélectionnez le solveur de certificat à utiliser pour cette ressource.",
|
||||||
|
"selectCertResolver": "Sélectionnez le résolveur de certificat",
|
||||||
|
"enterCustomResolver": "Entrez le résolveur personnalisé",
|
||||||
|
"preferWildcardCert": "Préférez le certificat Wildcard",
|
||||||
|
"unverified": "Non vérifié",
|
||||||
|
"domainSetting": "Paramètres de domaine",
|
||||||
|
"domainSettingDescription": "Configurer les paramètres de votre domaine",
|
||||||
|
"preferWildcardCertDescription": "Tentative de génération d'un certificat générique (nécessite un résolveur de certificat correctement configuré).",
|
||||||
|
"recordName": "Nom de l'enregistrement",
|
||||||
|
"auto": "Automatique",
|
||||||
|
"TTL": "TTC",
|
||||||
|
"howToAddRecords": "Comment ajouter des enregistrements",
|
||||||
|
"dnsRecord": "Enregistrements DNS",
|
||||||
|
"required": "Requis",
|
||||||
|
"domainSettingsUpdated": "Paramètres de domaine mis à jour avec succès",
|
||||||
|
"orgOrDomainIdMissing": "L'organisation ou l'identifiant de domaine est manquant",
|
||||||
|
"loadingDNSRecords": "Chargement des enregistrements DNS...",
|
||||||
|
"olmUpdateAvailableInfo": "Une version mise à jour de Olm est disponible. Veuillez mettre à jour vers la dernière version pour la meilleure expérience.",
|
||||||
|
"client": "Client",
|
||||||
|
"proxyProtocol": "Paramètres du protocole proxy",
|
||||||
|
"proxyProtocolDescription": "Configurer le protocole Proxy pour préserver les adresses IP du client pour les services TCP/UDP.",
|
||||||
|
"enableProxyProtocol": "Activer le protocole Proxy",
|
||||||
|
"proxyProtocolInfo": "Conserver les adresses IP du client pour les backends TCP/UDP",
|
||||||
|
"proxyProtocolVersion": "Version du protocole proxy",
|
||||||
|
"version1": " Version 1 (Recommandé)",
|
||||||
|
"version2": "Version 2",
|
||||||
|
"versionDescription": "La version 1 est basée sur du texte et est largement supportée. La version 2 est binaire et plus efficace mais moins compatible.",
|
||||||
|
"warning": "Avertissement",
|
||||||
|
"proxyProtocolWarning": "Votre application backend doit être configurée pour accepter les connexions Proxy Protocol. Si votre backend ne prend pas en charge le protocole Proxy, activer ceci va casser toutes les connexions. Assurez-vous de configurer votre backend pour faire confiance aux en-têtes du protocole Proxy de Traefik.",
|
||||||
|
"restarting": "Redémarrage...",
|
||||||
|
"manual": "Manuelle",
|
||||||
|
"messageSupport": "Soutien aux messages",
|
||||||
|
"supportNotAvailableTitle": "Support non disponible",
|
||||||
|
"supportNotAvailableDescription": "L'assistance n'est pas disponible pour le moment. Vous pouvez envoyer un e-mail à support@pangolin.net.",
|
||||||
|
"supportRequestSentTitle": "Demande de support envoyée",
|
||||||
|
"supportRequestSentDescription": "Votre message a été envoyé avec succès.",
|
||||||
|
"supportRequestFailedTitle": "Échec de l'envoi de la demande",
|
||||||
|
"supportRequestFailedDescription": "Une erreur s'est produite lors de l'envoi de votre demande d'assistance.",
|
||||||
|
"supportSubjectRequired": "Le sujet est requis",
|
||||||
|
"supportSubjectMaxLength": "Le sujet doit être de 255 caractères ou moins",
|
||||||
|
"supportMessageRequired": "Le message est requis",
|
||||||
|
"supportReplyTo": "Répondre à",
|
||||||
|
"supportSubject": "Sujet",
|
||||||
|
"supportSubjectPlaceholder": "Entrez le sujet",
|
||||||
|
"supportMessage": "Message",
|
||||||
|
"supportMessagePlaceholder": "Entrez votre message",
|
||||||
|
"supportSending": "Envoi...",
|
||||||
|
"supportSend": "Envoyer",
|
||||||
|
"supportMessageSent": "Message envoyé !",
|
||||||
|
"supportWillContact": "Nous vous contacterons sous peu!"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -47,9 +47,8 @@
|
|||||||
"edit": "Modifica",
|
"edit": "Modifica",
|
||||||
"siteConfirmDelete": "Conferma Eliminazione Sito",
|
"siteConfirmDelete": "Conferma Eliminazione Sito",
|
||||||
"siteDelete": "Elimina Sito",
|
"siteDelete": "Elimina Sito",
|
||||||
"siteMessageRemove": "Una volta rimosso, il sito non sarà più accessibile. Anche tutte le risorse e gli obiettivi associati al sito saranno rimossi.",
|
"siteMessageRemove": "Una volta rimosso il sito non sarà più accessibile. Tutti gli obiettivi associati al sito verranno rimossi.",
|
||||||
"siteMessageConfirm": "Per confermare, digita il nome del sito qui sotto.",
|
"siteQuestionRemove": "Sei sicuro di voler rimuovere il sito dall'organizzazione?",
|
||||||
"siteQuestionRemove": "Sei sicuro di voler rimuovere il sito {selectedSite} dall'organizzazione?",
|
|
||||||
"siteManageSites": "Gestisci Siti",
|
"siteManageSites": "Gestisci Siti",
|
||||||
"siteDescription": "Consenti la connettività alla rete attraverso tunnel sicuri",
|
"siteDescription": "Consenti la connettività alla rete attraverso tunnel sicuri",
|
||||||
"siteCreate": "Crea Sito",
|
"siteCreate": "Crea Sito",
|
||||||
@@ -96,7 +95,7 @@
|
|||||||
"siteWgDescription": "Usa qualsiasi client WireGuard per stabilire un tunnel. Impostazione NAT manuale richiesta.",
|
"siteWgDescription": "Usa qualsiasi client WireGuard per stabilire un tunnel. Impostazione NAT manuale richiesta.",
|
||||||
"siteWgDescriptionSaas": "Usa qualsiasi client WireGuard per stabilire un tunnel. Impostazione NAT manuale richiesta. FUNZIONA SOLO SU NODI AUTO-OSPITATI",
|
"siteWgDescriptionSaas": "Usa qualsiasi client WireGuard per stabilire un tunnel. Impostazione NAT manuale richiesta. FUNZIONA SOLO SU NODI AUTO-OSPITATI",
|
||||||
"siteLocalDescription": "Solo risorse locali. Nessun tunneling.",
|
"siteLocalDescription": "Solo risorse locali. Nessun tunneling.",
|
||||||
"siteLocalDescriptionSaas": "Local resources only. No tunneling. Only available on remote nodes.",
|
"siteLocalDescriptionSaas": "Solo risorse locali. Nessun tunneling. Disponibile solo su nodi remoti.",
|
||||||
"siteSeeAll": "Vedi Tutti I Siti",
|
"siteSeeAll": "Vedi Tutti I Siti",
|
||||||
"siteTunnelDescription": "Determina come vuoi connetterti al tuo sito",
|
"siteTunnelDescription": "Determina come vuoi connetterti al tuo sito",
|
||||||
"siteNewtCredentials": "Credenziali Newt",
|
"siteNewtCredentials": "Credenziali Newt",
|
||||||
@@ -154,8 +153,7 @@
|
|||||||
"protected": "Protetto",
|
"protected": "Protetto",
|
||||||
"notProtected": "Non Protetto",
|
"notProtected": "Non Protetto",
|
||||||
"resourceMessageRemove": "Una volta rimossa, la risorsa non sarà più accessibile. Tutti gli obiettivi associati alla risorsa saranno rimossi.",
|
"resourceMessageRemove": "Una volta rimossa, la risorsa non sarà più accessibile. Tutti gli obiettivi associati alla risorsa saranno rimossi.",
|
||||||
"resourceMessageConfirm": "Per confermare, digita il nome della risorsa qui sotto.",
|
"resourceQuestionRemove": "Sei sicuro di voler rimuovere la risorsa dall'organizzazione?",
|
||||||
"resourceQuestionRemove": "Sei sicuro di voler rimuovere la risorsa {selectedResource} dall'organizzazione?",
|
|
||||||
"resourceHTTP": "Risorsa HTTPS",
|
"resourceHTTP": "Risorsa HTTPS",
|
||||||
"resourceHTTPDescription": "Richieste proxy alla tua app tramite HTTPS utilizzando un sottodominio o un dominio di base.",
|
"resourceHTTPDescription": "Richieste proxy alla tua app tramite HTTPS utilizzando un sottodominio o un dominio di base.",
|
||||||
"resourceRaw": "Risorsa Raw TCP/UDP",
|
"resourceRaw": "Risorsa Raw TCP/UDP",
|
||||||
@@ -220,7 +218,7 @@
|
|||||||
"orgDeleteConfirm": "Conferma Elimina Organizzazione",
|
"orgDeleteConfirm": "Conferma Elimina Organizzazione",
|
||||||
"orgMessageRemove": "Questa azione è irreversibile e cancellerà tutti i dati associati.",
|
"orgMessageRemove": "Questa azione è irreversibile e cancellerà tutti i dati associati.",
|
||||||
"orgMessageConfirm": "Per confermare, digita il nome dell'organizzazione qui sotto.",
|
"orgMessageConfirm": "Per confermare, digita il nome dell'organizzazione qui sotto.",
|
||||||
"orgQuestionRemove": "Sei sicuro di voler rimuovere l'organizzazione {selectedOrg}?",
|
"orgQuestionRemove": "Sei sicuro di voler rimuovere l'organizzazione?",
|
||||||
"orgUpdated": "Organizzazione aggiornata",
|
"orgUpdated": "Organizzazione aggiornata",
|
||||||
"orgUpdatedDescription": "L'organizzazione è stata aggiornata.",
|
"orgUpdatedDescription": "L'organizzazione è stata aggiornata.",
|
||||||
"orgErrorUpdate": "Impossibile aggiornare l'organizzazione",
|
"orgErrorUpdate": "Impossibile aggiornare l'organizzazione",
|
||||||
@@ -287,9 +285,8 @@
|
|||||||
"apiKeysAdd": "Genera Chiave API",
|
"apiKeysAdd": "Genera Chiave API",
|
||||||
"apiKeysErrorDelete": "Errore nell'eliminazione della chiave API",
|
"apiKeysErrorDelete": "Errore nell'eliminazione della chiave API",
|
||||||
"apiKeysErrorDeleteMessage": "Errore nell'eliminazione della chiave API",
|
"apiKeysErrorDeleteMessage": "Errore nell'eliminazione della chiave API",
|
||||||
"apiKeysQuestionRemove": "Sei sicuro di voler rimuovere la chiave API {selectedApiKey} dall'organizzazione?",
|
"apiKeysQuestionRemove": "Sei sicuro di voler rimuovere la chiave API dall'organizzazione?",
|
||||||
"apiKeysMessageRemove": "Una volta rimossa, la chiave API non potrà più essere utilizzata.",
|
"apiKeysMessageRemove": "Una volta rimossa, la chiave API non potrà più essere utilizzata.",
|
||||||
"apiKeysMessageConfirm": "Per confermare, digita il nome della chiave API qui sotto.",
|
|
||||||
"apiKeysDeleteConfirm": "Conferma Eliminazione Chiave API",
|
"apiKeysDeleteConfirm": "Conferma Eliminazione Chiave API",
|
||||||
"apiKeysDelete": "Elimina Chiave API",
|
"apiKeysDelete": "Elimina Chiave API",
|
||||||
"apiKeysManage": "Gestisci Chiavi API",
|
"apiKeysManage": "Gestisci Chiavi API",
|
||||||
@@ -305,8 +302,7 @@
|
|||||||
"userDeleteConfirm": "Conferma Eliminazione Utente",
|
"userDeleteConfirm": "Conferma Eliminazione Utente",
|
||||||
"userDeleteServer": "Elimina utente dal server",
|
"userDeleteServer": "Elimina utente dal server",
|
||||||
"userMessageRemove": "L'utente verrà rimosso da tutte le organizzazioni ed essere completamente rimosso dal server.",
|
"userMessageRemove": "L'utente verrà rimosso da tutte le organizzazioni ed essere completamente rimosso dal server.",
|
||||||
"userMessageConfirm": "Per confermare, digita il nome dell'utente qui sotto.",
|
"userQuestionRemove": "Sei sicuro di voler eliminare definitivamente l'utente dal server?",
|
||||||
"userQuestionRemove": "Sei sicuro di voler eliminare definitivamente {selectedUser} dal server?",
|
|
||||||
"licenseKey": "Chiave Di Licenza",
|
"licenseKey": "Chiave Di Licenza",
|
||||||
"valid": "Valido",
|
"valid": "Valido",
|
||||||
"numberOfSites": "Numero di siti",
|
"numberOfSites": "Numero di siti",
|
||||||
@@ -339,7 +335,7 @@
|
|||||||
"fossorialLicense": "Visualizza I Termini Di Licenza Commerciale Fossorial E Abbonamento",
|
"fossorialLicense": "Visualizza I Termini Di Licenza Commerciale Fossorial E Abbonamento",
|
||||||
"licenseMessageRemove": "Questo rimuoverà la chiave di licenza e tutti i permessi associati da essa concessi.",
|
"licenseMessageRemove": "Questo rimuoverà la chiave di licenza e tutti i permessi associati da essa concessi.",
|
||||||
"licenseMessageConfirm": "Per confermare, digitare la chiave di licenza qui sotto.",
|
"licenseMessageConfirm": "Per confermare, digitare la chiave di licenza qui sotto.",
|
||||||
"licenseQuestionRemove": "Sei sicuro di voler eliminare la chiave di licenza {selectedKey}?",
|
"licenseQuestionRemove": "Sei sicuro di voler eliminare la chiave di licenza?",
|
||||||
"licenseKeyDelete": "Elimina Chiave Di Licenza",
|
"licenseKeyDelete": "Elimina Chiave Di Licenza",
|
||||||
"licenseKeyDeleteConfirm": "Conferma Elimina Chiave Di Licenza",
|
"licenseKeyDeleteConfirm": "Conferma Elimina Chiave Di Licenza",
|
||||||
"licenseTitle": "Gestisci Stato Licenza",
|
"licenseTitle": "Gestisci Stato Licenza",
|
||||||
@@ -372,7 +368,7 @@
|
|||||||
"inviteRemoveErrorDescription": "Si è verificato un errore durante la rimozione dell'invito.",
|
"inviteRemoveErrorDescription": "Si è verificato un errore durante la rimozione dell'invito.",
|
||||||
"inviteRemoved": "Invito rimosso",
|
"inviteRemoved": "Invito rimosso",
|
||||||
"inviteRemovedDescription": "L'invito per {email} è stato rimosso.",
|
"inviteRemovedDescription": "L'invito per {email} è stato rimosso.",
|
||||||
"inviteQuestionRemove": "Sei sicuro di voler rimuovere l'invito {email}?",
|
"inviteQuestionRemove": "Sei sicuro di voler rimuovere l'invito?",
|
||||||
"inviteMessageRemove": "Una volta rimosso, questo invito non sarà più valido. Puoi sempre reinvitare l'utente in seguito.",
|
"inviteMessageRemove": "Una volta rimosso, questo invito non sarà più valido. Puoi sempre reinvitare l'utente in seguito.",
|
||||||
"inviteMessageConfirm": "Per confermare, digita l'indirizzo email dell'invito qui sotto.",
|
"inviteMessageConfirm": "Per confermare, digita l'indirizzo email dell'invito qui sotto.",
|
||||||
"inviteQuestionRegenerate": "Sei sicuro di voler rigenerare l'invito {email}? Questo revocherà l'invito precedente.",
|
"inviteQuestionRegenerate": "Sei sicuro di voler rigenerare l'invito {email}? Questo revocherà l'invito precedente.",
|
||||||
@@ -398,9 +394,8 @@
|
|||||||
"userErrorOrgRemoveDescription": "Si è verificato un errore durante la rimozione dell'utente.",
|
"userErrorOrgRemoveDescription": "Si è verificato un errore durante la rimozione dell'utente.",
|
||||||
"userOrgRemoved": "Utente rimosso",
|
"userOrgRemoved": "Utente rimosso",
|
||||||
"userOrgRemovedDescription": "L'utente {email} è stato rimosso dall'organizzazione.",
|
"userOrgRemovedDescription": "L'utente {email} è stato rimosso dall'organizzazione.",
|
||||||
"userQuestionOrgRemove": "Sei sicuro di voler rimuovere {email} dall'organizzazione?",
|
"userQuestionOrgRemove": "Sei sicuro di voler rimuovere questo utente dall'organizzazione?",
|
||||||
"userMessageOrgRemove": "Una volta rimosso, questo utente non avrà più accesso all'organizzazione. Puoi sempre reinvitarlo in seguito, ma dovrà accettare nuovamente l'invito.",
|
"userMessageOrgRemove": "Una volta rimosso, questo utente non avrà più accesso all'organizzazione. Puoi sempre reinvitarlo in seguito, ma dovrà accettare nuovamente l'invito.",
|
||||||
"userMessageOrgConfirm": "Per confermare, digita il nome dell'utente qui sotto.",
|
|
||||||
"userRemoveOrgConfirm": "Conferma Rimozione Utente",
|
"userRemoveOrgConfirm": "Conferma Rimozione Utente",
|
||||||
"userRemoveOrg": "Rimuovi Utente dall'Organizzazione",
|
"userRemoveOrg": "Rimuovi Utente dall'Organizzazione",
|
||||||
"users": "Utenti",
|
"users": "Utenti",
|
||||||
@@ -730,7 +725,7 @@
|
|||||||
"pangolinServerAdmin": "Server Admin - Pangolina",
|
"pangolinServerAdmin": "Server Admin - Pangolina",
|
||||||
"licenseTierProfessional": "Licenza Professional",
|
"licenseTierProfessional": "Licenza Professional",
|
||||||
"licenseTierEnterprise": "Licenza Enterprise",
|
"licenseTierEnterprise": "Licenza Enterprise",
|
||||||
"licenseTierPersonal": "Personal License",
|
"licenseTierPersonal": "Licenza Personale",
|
||||||
"licensed": "Con Licenza",
|
"licensed": "Con Licenza",
|
||||||
"yes": "Sì",
|
"yes": "Sì",
|
||||||
"no": "No",
|
"no": "No",
|
||||||
@@ -742,7 +737,7 @@
|
|||||||
"idpManageDescription": "Visualizza e gestisci i provider di identità nel sistema",
|
"idpManageDescription": "Visualizza e gestisci i provider di identità nel sistema",
|
||||||
"idpDeletedDescription": "Provider di identità eliminato con successo",
|
"idpDeletedDescription": "Provider di identità eliminato con successo",
|
||||||
"idpOidc": "OAuth2/OIDC",
|
"idpOidc": "OAuth2/OIDC",
|
||||||
"idpQuestionRemove": "Sei sicuro di voler eliminare definitivamente il provider di identità {name}?",
|
"idpQuestionRemove": "Sei sicuro di voler eliminare definitivamente il provider di identità?",
|
||||||
"idpMessageRemove": "Questo rimuoverà il provider di identità e tutte le configurazioni associate. Gli utenti che si autenticano tramite questo provider non potranno più accedere.",
|
"idpMessageRemove": "Questo rimuoverà il provider di identità e tutte le configurazioni associate. Gli utenti che si autenticano tramite questo provider non potranno più accedere.",
|
||||||
"idpMessageConfirm": "Per confermare, digita il nome del provider di identità qui sotto.",
|
"idpMessageConfirm": "Per confermare, digita il nome del provider di identità qui sotto.",
|
||||||
"idpConfirmDelete": "Conferma Eliminazione Provider di Identità",
|
"idpConfirmDelete": "Conferma Eliminazione Provider di Identità",
|
||||||
@@ -916,6 +911,18 @@
|
|||||||
"passwordResetCodeDescription": "Controlla la tua email per il codice di reset.",
|
"passwordResetCodeDescription": "Controlla la tua email per il codice di reset.",
|
||||||
"passwordNew": "Nuova Password",
|
"passwordNew": "Nuova Password",
|
||||||
"passwordNewConfirm": "Conferma Nuova Password",
|
"passwordNewConfirm": "Conferma Nuova Password",
|
||||||
|
"changePassword": "Cambia Password",
|
||||||
|
"changePasswordDescription": "Aggiorna la password del tuo account",
|
||||||
|
"oldPassword": "Password Attuale",
|
||||||
|
"newPassword": "Nuova Password",
|
||||||
|
"confirmNewPassword": "Conferma Nuova Password",
|
||||||
|
"changePasswordError": "Impossibile cambiare la password",
|
||||||
|
"changePasswordErrorDescription": "Si è verificato un errore durante la modifica della password",
|
||||||
|
"changePasswordSuccess": "Password Cambiata Con Successo",
|
||||||
|
"changePasswordSuccessDescription": "La password è stata aggiornata con successo",
|
||||||
|
"passwordExpiryRequired": "Scadenza Password Richiesta",
|
||||||
|
"passwordExpiryDescription": "Questa organizzazione richiede di cambiare la password ogni {maxDays} giorni.",
|
||||||
|
"changePasswordNow": "Cambia Password Ora",
|
||||||
"pincodeAuth": "Codice Autenticatore",
|
"pincodeAuth": "Codice Autenticatore",
|
||||||
"pincodeSubmit2": "Invia Codice",
|
"pincodeSubmit2": "Invia Codice",
|
||||||
"passwordResetSubmit": "Richiedi Reset",
|
"passwordResetSubmit": "Richiedi Reset",
|
||||||
@@ -1154,8 +1161,27 @@
|
|||||||
"sidebarAllUsers": "Tutti Gli Utenti",
|
"sidebarAllUsers": "Tutti Gli Utenti",
|
||||||
"sidebarIdentityProviders": "Fornitori Di Identità",
|
"sidebarIdentityProviders": "Fornitori Di Identità",
|
||||||
"sidebarLicense": "Licenza",
|
"sidebarLicense": "Licenza",
|
||||||
"sidebarClients": "Clients",
|
"sidebarClients": "Client",
|
||||||
"sidebarDomains": "Domini",
|
"sidebarDomains": "Domini",
|
||||||
|
"sidebarBluePrints": "Progetti",
|
||||||
|
"blueprints": "Progetti",
|
||||||
|
"blueprintsDescription": "I progetti sono configurazioni YAML dichiarative che definiscono le tue risorse e le loro impostazioni",
|
||||||
|
"blueprintAdd": "Aggiungi Progetto",
|
||||||
|
"blueprintGoBack": "Vedi tutti i progetti",
|
||||||
|
"blueprintCreate": "Crea Progetto",
|
||||||
|
"blueprintCreateDescription2": "Segui i passaggi qui sotto per creare e applicare un nuovo progetto",
|
||||||
|
"blueprintDetails": "Dettagli progetto",
|
||||||
|
"blueprintDetailsDescription": "Vedi i dettagli dell'esecuzione del progetto",
|
||||||
|
"blueprintInfo": "Informazioni Sul Progetto",
|
||||||
|
"message": "Messaggio",
|
||||||
|
"blueprintContentsDescription": "Definisci il contenuto di YAML che descrive la tua infrastruttura",
|
||||||
|
"blueprintErrorCreateDescription": "Si è verificato un errore durante l'applicazione del progetto",
|
||||||
|
"blueprintErrorCreate": "Errore nella creazione del progetto",
|
||||||
|
"searchBlueprintProgress": "Cerca progetti...",
|
||||||
|
"appliedAt": "Applicato Il",
|
||||||
|
"source": "Fonte",
|
||||||
|
"contents": "Contenuti",
|
||||||
|
"parsedContents": "Sommario Analizzato",
|
||||||
"enableDockerSocket": "Abilita Progetto Docker",
|
"enableDockerSocket": "Abilita Progetto Docker",
|
||||||
"enableDockerSocketDescription": "Abilita la raschiatura dell'etichetta Docker Socket per le etichette dei progetti. Il percorso del socket deve essere fornito a Newt.",
|
"enableDockerSocketDescription": "Abilita la raschiatura dell'etichetta Docker Socket per le etichette dei progetti. Il percorso del socket deve essere fornito a Newt.",
|
||||||
"enableDockerSocketLink": "Scopri di più",
|
"enableDockerSocketLink": "Scopri di più",
|
||||||
@@ -1211,9 +1237,8 @@
|
|||||||
"domainCreate": "Crea Dominio",
|
"domainCreate": "Crea Dominio",
|
||||||
"domainCreatedDescription": "Dominio creato con successo",
|
"domainCreatedDescription": "Dominio creato con successo",
|
||||||
"domainDeletedDescription": "Dominio eliminato con successo",
|
"domainDeletedDescription": "Dominio eliminato con successo",
|
||||||
"domainQuestionRemove": "Sei sicuro di voler rimuovere il dominio {domain} dal tuo account?",
|
"domainQuestionRemove": "Sei sicuro di voler rimuovere il dominio dal tuo account?",
|
||||||
"domainMessageRemove": "Una volta rimosso, il dominio non sarà più associato al tuo account.",
|
"domainMessageRemove": "Una volta rimosso, il dominio non sarà più associato al tuo account.",
|
||||||
"domainMessageConfirm": "Per confermare, digita il nome del dominio qui sotto.",
|
|
||||||
"domainConfirmDelete": "Conferma Eliminazione Dominio",
|
"domainConfirmDelete": "Conferma Eliminazione Dominio",
|
||||||
"domainDelete": "Elimina Dominio",
|
"domainDelete": "Elimina Dominio",
|
||||||
"domain": "Dominio",
|
"domain": "Dominio",
|
||||||
@@ -1280,7 +1305,7 @@
|
|||||||
"billingFreeTier": "Piano Gratuito",
|
"billingFreeTier": "Piano Gratuito",
|
||||||
"billingWarningOverLimit": "Avviso: Hai superato uno o più limiti di utilizzo. I tuoi siti non si connetteranno finché non modifichi il tuo abbonamento o non adegui il tuo utilizzo.",
|
"billingWarningOverLimit": "Avviso: Hai superato uno o più limiti di utilizzo. I tuoi siti non si connetteranno finché non modifichi il tuo abbonamento o non adegui il tuo utilizzo.",
|
||||||
"billingUsageLimitsOverview": "Panoramica dei Limiti di Utilizzo",
|
"billingUsageLimitsOverview": "Panoramica dei Limiti di Utilizzo",
|
||||||
"billingMonitorUsage": "Monitora il tuo utilizzo rispetto ai limiti configurati. Se hai bisogno di aumentare i limiti, contattaci all'indirizzo support@fossorial.io.",
|
"billingMonitorUsage": "Monitora il tuo utilizzo rispetto ai limiti configurati. Se hai bisogno di aumentare i limiti, contattaci all'indirizzo support@pangolin.net.",
|
||||||
"billingDataUsage": "Utilizzo dei Dati",
|
"billingDataUsage": "Utilizzo dei Dati",
|
||||||
"billingOnlineTime": "Tempo Online del Sito",
|
"billingOnlineTime": "Tempo Online del Sito",
|
||||||
"billingUsers": "Utenti Attivi",
|
"billingUsers": "Utenti Attivi",
|
||||||
@@ -1346,6 +1371,19 @@
|
|||||||
"securityKeyUnknownError": "Si è verificato un problema con la tua chiave di sicurezza. Riprova.",
|
"securityKeyUnknownError": "Si è verificato un problema con la tua chiave di sicurezza. Riprova.",
|
||||||
"twoFactorRequired": "È richiesta l'autenticazione a due fattori per registrare una chiave di sicurezza.",
|
"twoFactorRequired": "È richiesta l'autenticazione a due fattori per registrare una chiave di sicurezza.",
|
||||||
"twoFactor": "Autenticazione a Due Fattori",
|
"twoFactor": "Autenticazione a Due Fattori",
|
||||||
|
"twoFactorAuthentication": "Autenticazione A Due Fattori",
|
||||||
|
"twoFactorDescription": "Questa organizzazione richiede l'autenticazione a due fattori.",
|
||||||
|
"enableTwoFactor": "Abilita Autenticazione A Due Fattori",
|
||||||
|
"organizationSecurityPolicy": "Politica Di Sicurezza Dell'Organizzazione",
|
||||||
|
"organizationSecurityPolicyDescription": "Questa organizzazione ha requisiti di sicurezza che devono essere soddisfatti prima di poter accedere",
|
||||||
|
"securityRequirements": "Requisiti Di Sicurezza",
|
||||||
|
"allRequirementsMet": "Tutti i requisiti sono stati soddisfatti",
|
||||||
|
"completeRequirementsToContinue": "Completa i requisiti qui sotto per continuare ad accedere a questa organizzazione",
|
||||||
|
"youCanNowAccessOrganization": "Ora puoi accedere a questa organizzazione",
|
||||||
|
"reauthenticationRequired": "Durata Sessione",
|
||||||
|
"reauthenticationDescription": "Questa organizzazione richiede di accedere ogni {maxDays} giorni.",
|
||||||
|
"reauthenticationDescriptionHours": "Questa organizzazione richiede di accedere ogni {maxHours} ore.",
|
||||||
|
"reauthenticateNow": "Accedi Di Nuovo",
|
||||||
"adminEnabled2FaOnYourAccount": "Il tuo amministratore ha abilitato l'autenticazione a due fattori per {email}. Completa il processo di configurazione per continuare.",
|
"adminEnabled2FaOnYourAccount": "Il tuo amministratore ha abilitato l'autenticazione a due fattori per {email}. Completa il processo di configurazione per continuare.",
|
||||||
"securityKeyAdd": "Aggiungi Chiave di Sicurezza",
|
"securityKeyAdd": "Aggiungi Chiave di Sicurezza",
|
||||||
"securityKeyRegisterTitle": "Registra Nuova Chiave di Sicurezza",
|
"securityKeyRegisterTitle": "Registra Nuova Chiave di Sicurezza",
|
||||||
@@ -1558,14 +1596,13 @@
|
|||||||
"autoLoginErrorNoRedirectUrl": "Nessun URL di reindirizzamento ricevuto dal provider di identità.",
|
"autoLoginErrorNoRedirectUrl": "Nessun URL di reindirizzamento ricevuto dal provider di identità.",
|
||||||
"autoLoginErrorGeneratingUrl": "Impossibile generare l'URL di autenticazione.",
|
"autoLoginErrorGeneratingUrl": "Impossibile generare l'URL di autenticazione.",
|
||||||
"remoteExitNodeManageRemoteExitNodes": "Nodi Remoti",
|
"remoteExitNodeManageRemoteExitNodes": "Nodi Remoti",
|
||||||
"remoteExitNodeDescription": "Self-host one or more remote nodes to extend your network connectivity and reduce reliance on the cloud",
|
"remoteExitNodeDescription": "Self-host uno o più nodi remoti per estendere la connettività di rete e ridurre la dipendenza dal cloud",
|
||||||
"remoteExitNodes": "Nodi",
|
"remoteExitNodes": "Nodi",
|
||||||
"searchRemoteExitNodes": "Cerca nodi...",
|
"searchRemoteExitNodes": "Cerca nodi...",
|
||||||
"remoteExitNodeAdd": "Aggiungi Nodo",
|
"remoteExitNodeAdd": "Aggiungi Nodo",
|
||||||
"remoteExitNodeErrorDelete": "Errore nell'eliminare il nodo",
|
"remoteExitNodeErrorDelete": "Errore nell'eliminare il nodo",
|
||||||
"remoteExitNodeQuestionRemove": "Sei sicuro di voler rimuovere il nodo {selectedNode} dall'organizzazione?",
|
"remoteExitNodeQuestionRemove": "Sei sicuro di voler rimuovere il nodo dall'organizzazione?",
|
||||||
"remoteExitNodeMessageRemove": "Una volta rimosso, il nodo non sarà più accessibile.",
|
"remoteExitNodeMessageRemove": "Una volta rimosso, il nodo non sarà più accessibile.",
|
||||||
"remoteExitNodeMessageConfirm": "Per confermare, digita il nome del nodo qui sotto.",
|
|
||||||
"remoteExitNodeConfirmDelete": "Conferma Eliminazione Nodo",
|
"remoteExitNodeConfirmDelete": "Conferma Eliminazione Nodo",
|
||||||
"remoteExitNodeDelete": "Elimina Nodo",
|
"remoteExitNodeDelete": "Elimina Nodo",
|
||||||
"sidebarRemoteExitNodes": "Nodi Remoti",
|
"sidebarRemoteExitNodes": "Nodi Remoti",
|
||||||
@@ -1733,7 +1770,49 @@
|
|||||||
"resourceExposePortsEditFile": "Modifica file: docker-compose.yml",
|
"resourceExposePortsEditFile": "Modifica file: docker-compose.yml",
|
||||||
"emailVerificationRequired": "Verifica via email. Effettua nuovamente il login via {dashboardUrl}/auth/login completa questo passaggio. Quindi, torna qui.",
|
"emailVerificationRequired": "Verifica via email. Effettua nuovamente il login via {dashboardUrl}/auth/login completa questo passaggio. Quindi, torna qui.",
|
||||||
"twoFactorSetupRequired": "È richiesta la configurazione di autenticazione a due fattori. Effettua nuovamente l'accesso tramite {dashboardUrl}/auth/login completa questo passaggio. Quindi, torna qui.",
|
"twoFactorSetupRequired": "È richiesta la configurazione di autenticazione a due fattori. Effettua nuovamente l'accesso tramite {dashboardUrl}/auth/login completa questo passaggio. Quindi, torna qui.",
|
||||||
|
"additionalSecurityRequired": "Necessaria Sicurezza Aggiuntiva",
|
||||||
|
"organizationRequiresAdditionalSteps": "Questa organizzazione richiede ulteriori passi di sicurezza prima di poter accedere alle risorse.",
|
||||||
|
"completeTheseSteps": "Completa questi passaggi",
|
||||||
|
"enableTwoFactorAuthentication": "Abilita autenticazione a due fattori",
|
||||||
|
"completeSecuritySteps": "Passi Di Sicurezza Completa",
|
||||||
|
"securitySettings": "Impostazioni Di Sicurezza",
|
||||||
|
"securitySettingsDescription": "Configura i criteri di sicurezza per la tua organizzazione",
|
||||||
|
"requireTwoFactorForAllUsers": "Richiede l'autenticazione a due fattori per tutti gli utenti",
|
||||||
|
"requireTwoFactorDescription": "Se abilitata, tutti gli utenti interni di questa organizzazione devono avere un'autenticazione a due fattori abilitata per accedere all'organizzazione.",
|
||||||
|
"requireTwoFactorDisabledDescription": "Questa funzione richiede una licenza valida (Enterprise) o un abbonamento attivo (SaaS)",
|
||||||
|
"requireTwoFactorCannotEnableDescription": "Devi abilitare l'autenticazione a due fattori per il tuo account prima di applicarla per tutti gli utenti",
|
||||||
|
"maxSessionLength": "Lunghezza Massima Della Sessione",
|
||||||
|
"maxSessionLengthDescription": "Imposta la durata massima per le sessioni utente. Dopo questo periodo, gli utenti dovranno autenticarsi.",
|
||||||
|
"maxSessionLengthDisabledDescription": "Questa funzione richiede una licenza valida (Enterprise) o un abbonamento attivo (SaaS)",
|
||||||
|
"selectSessionLength": "Seleziona lunghezza sessione",
|
||||||
|
"unenforced": "Non Applicato",
|
||||||
|
"1Hour": "1 ora",
|
||||||
|
"3Hours": "3 ore",
|
||||||
|
"6Hours": "6 ore",
|
||||||
|
"12Hours": "12 ore",
|
||||||
|
"1DaySession": "1 giorno",
|
||||||
|
"3Days": "3 giorni",
|
||||||
|
"7Days": "7 giorni",
|
||||||
|
"14Days": "14 giorni",
|
||||||
|
"30DaysSession": "30 giorni",
|
||||||
|
"90DaysSession": "90 giorni",
|
||||||
|
"180DaysSession": "180 giorni",
|
||||||
|
"passwordExpiryDays": "Scadenza Password",
|
||||||
|
"editPasswordExpiryDescription": "Imposta il numero di giorni prima che gli utenti debbano cambiare la password.",
|
||||||
|
"selectPasswordExpiry": "Seleziona scadenza password",
|
||||||
|
"30Days": "30 giorni",
|
||||||
|
"1Day": "1 giorno",
|
||||||
|
"60Days": "60 giorni",
|
||||||
|
"90Days": "90 giorni",
|
||||||
|
"180Days": "180 giorni",
|
||||||
|
"1Year": "1 anno",
|
||||||
|
"subscriptionBadge": "Abbonamento Richiesto",
|
||||||
|
"securityPolicyChangeWarning": "Avviso Modifica Politica Di Sicurezza",
|
||||||
|
"securityPolicyChangeDescription": "Si sta per modificare le impostazioni dei criteri di sicurezza. Dopo il salvataggio, potrebbe essere necessario autenticarsi nuovamente per conformarsi a questi aggiornamenti dei criteri. Tutti gli utenti che non sono conformi dovranno anche autenticarsi.",
|
||||||
|
"securityPolicyChangeConfirmMessage": "Confermo",
|
||||||
|
"securityPolicyChangeWarningText": "Questo influenzerà tutti gli utenti dell'organizzazione",
|
||||||
"authPageErrorUpdateMessage": "Si è verificato un errore durante l'aggiornamento delle impostazioni della pagina di autenticazione",
|
"authPageErrorUpdateMessage": "Si è verificato un errore durante l'aggiornamento delle impostazioni della pagina di autenticazione",
|
||||||
|
"authPageErrorUpdate": "Impossibile aggiornare la pagina di autenticazione",
|
||||||
"authPageUpdated": "Pagina di autenticazione aggiornata con successo",
|
"authPageUpdated": "Pagina di autenticazione aggiornata con successo",
|
||||||
"healthCheckNotAvailable": "Locale",
|
"healthCheckNotAvailable": "Locale",
|
||||||
"rewritePath": "Riscrivi percorso",
|
"rewritePath": "Riscrivi percorso",
|
||||||
@@ -1745,153 +1824,261 @@
|
|||||||
"resourceHeaderAuthRemoveDescription": "Autenticazione intestazione rimossa con successo.",
|
"resourceHeaderAuthRemoveDescription": "Autenticazione intestazione rimossa con successo.",
|
||||||
"resourceErrorHeaderAuthRemove": "Impossibile rimuovere l'autenticazione dell'intestazione",
|
"resourceErrorHeaderAuthRemove": "Impossibile rimuovere l'autenticazione dell'intestazione",
|
||||||
"resourceErrorHeaderAuthRemoveDescription": "Impossibile rimuovere l'autenticazione dell'intestazione per la risorsa.",
|
"resourceErrorHeaderAuthRemoveDescription": "Impossibile rimuovere l'autenticazione dell'intestazione per la risorsa.",
|
||||||
"resourceHeaderAuthProtectionEnabled": "Header Authentication Enabled",
|
"resourceHeaderAuthProtectionEnabled": "Autenticazione Intestazione Abilitata",
|
||||||
"resourceHeaderAuthProtectionDisabled": "Header Authentication Disabled",
|
"resourceHeaderAuthProtectionDisabled": "Autenticazione Intestazione Disabilitata",
|
||||||
"headerAuthRemove": "Remove Header Auth",
|
"headerAuthRemove": "Rimuovi Autenticazione Intestazione",
|
||||||
"headerAuthAdd": "Add Header Auth",
|
"headerAuthAdd": "Aggiungi Autenticazione Intestazione",
|
||||||
"resourceErrorHeaderAuthSetup": "Impossibile impostare l'autenticazione dell'intestazione",
|
"resourceErrorHeaderAuthSetup": "Impossibile impostare l'autenticazione dell'intestazione",
|
||||||
"resourceErrorHeaderAuthSetupDescription": "Impossibile impostare l'autenticazione dell'intestazione per la risorsa.",
|
"resourceErrorHeaderAuthSetupDescription": "Impossibile impostare l'autenticazione dell'intestazione per la risorsa.",
|
||||||
"resourceHeaderAuthSetup": "Autenticazione intestazione impostata con successo",
|
"resourceHeaderAuthSetup": "Autenticazione intestazione impostata con successo",
|
||||||
"resourceHeaderAuthSetupDescription": "L'autenticazione dell'intestazione è stata impostata correttamente.",
|
"resourceHeaderAuthSetupDescription": "L'autenticazione dell'intestazione è stata impostata correttamente.",
|
||||||
"resourceHeaderAuthSetupTitle": "Imposta Autenticazione Intestazione",
|
"resourceHeaderAuthSetupTitle": "Imposta Autenticazione Intestazione",
|
||||||
"resourceHeaderAuthSetupTitleDescription": "Set the basic auth credentials (username and password) to protect this resource with HTTP Header Authentication. Access it using the format https://username:password@resource.example.com",
|
"resourceHeaderAuthSetupTitleDescription": "Imposta le credenziali di autenticazione di base (nome utente e password) per proteggere questa risorsa con Autenticazione intestazione HTTP. Accedi usando il formato https://username:password@resource.example.com",
|
||||||
"resourceHeaderAuthSubmit": "Imposta Autenticazione Intestazione",
|
"resourceHeaderAuthSubmit": "Imposta Autenticazione Intestazione",
|
||||||
"actionSetResourceHeaderAuth": "Imposta Autenticazione Intestazione",
|
"actionSetResourceHeaderAuth": "Imposta Autenticazione Intestazione",
|
||||||
"enterpriseEdition": "Enterprise Edition",
|
"enterpriseEdition": "Enterprise Edition",
|
||||||
"unlicensed": "Unlicensed",
|
"unlicensed": "Senza Licenza",
|
||||||
"beta": "Beta",
|
"beta": "Beta",
|
||||||
"manageClients": "Manage Clients",
|
"manageClients": "Gestisci Clienti",
|
||||||
"manageClientsDescription": "Clients are devices that can connect to your sites",
|
"manageClientsDescription": "I client sono dispositivi che possono connettersi ai tuoi siti",
|
||||||
"licenseTableValidUntil": "Valid Until",
|
"licenseTableValidUntil": "Valido Fino A",
|
||||||
"saasLicenseKeysSettingsTitle": "Enterprise Licenses",
|
"saasLicenseKeysSettingsTitle": "Licenze Enterprise",
|
||||||
"saasLicenseKeysSettingsDescription": "Generate and manage Enterprise license keys for self-hosted Pangolin instances",
|
"saasLicenseKeysSettingsDescription": "Genera e gestisci le chiavi di licenza Enterprise per le istanze di Pangolin self-hosted",
|
||||||
"sidebarEnterpriseLicenses": "Licenses",
|
"sidebarEnterpriseLicenses": "Licenze",
|
||||||
"generateLicenseKey": "Generate License Key",
|
"generateLicenseKey": "Genera Chiave Di Licenza",
|
||||||
"generateLicenseKeyForm": {
|
"generateLicenseKeyForm": {
|
||||||
"validation": {
|
"validation": {
|
||||||
"emailRequired": "Please enter a valid email address",
|
"emailRequired": "Inserisci un indirizzo email valido",
|
||||||
"useCaseTypeRequired": "Please select a use case type",
|
"useCaseTypeRequired": "Si prega di selezionare un tipo di caso di utilizzo",
|
||||||
"firstNameRequired": "First name is required",
|
"firstNameRequired": "Il nome è obbligatorio",
|
||||||
"lastNameRequired": "Last name is required",
|
"lastNameRequired": "Il cognome è obbligatorio",
|
||||||
"primaryUseRequired": "Please describe your primary use",
|
"primaryUseRequired": "Descrivi il tuo uso primario",
|
||||||
"jobTitleRequiredBusiness": "Job title is required for business use",
|
"jobTitleRequiredBusiness": "Il titolo di lavoro è richiesto per l'uso aziendale",
|
||||||
"industryRequiredBusiness": "Industry is required for business use",
|
"industryRequiredBusiness": "L'industria è richiesta per l'uso commerciale",
|
||||||
"stateProvinceRegionRequired": "State/Province/Region is required",
|
"stateProvinceRegionRequired": "Stato/Provincia/Regione è richiesta",
|
||||||
"postalZipCodeRequired": "Postal/ZIP Code is required",
|
"postalZipCodeRequired": "Codice postale/CAP obbligatorio",
|
||||||
"companyNameRequiredBusiness": "Company name is required for business use",
|
"companyNameRequiredBusiness": "Il nome dell'azienda è richiesto per l'uso aziendale",
|
||||||
"countryOfResidenceRequiredBusiness": "Country of residence is required for business use",
|
"countryOfResidenceRequiredBusiness": "Paese di residenza è richiesto per uso professionale",
|
||||||
"countryRequiredPersonal": "Country is required for personal use",
|
"countryRequiredPersonal": "Il paese è richiesto per uso personale",
|
||||||
"agreeToTermsRequired": "You must agree to the terms",
|
"agreeToTermsRequired": "Devi accettare i termini",
|
||||||
"complianceConfirmationRequired": "You must confirm compliance with the Fossorial Commercial License"
|
"complianceConfirmationRequired": "È necessario confermare la conformità alla licenza commerciale Fossorial"
|
||||||
},
|
},
|
||||||
"useCaseOptions": {
|
"useCaseOptions": {
|
||||||
"personal": {
|
"personal": {
|
||||||
"title": "Personal Use",
|
"title": "Uso Personale",
|
||||||
"description": "For individual, non-commercial use such as learning, personal projects, or experimentation."
|
"description": "Per uso individuale, non commerciale, come l'apprendimento, progetti personali o sperimentazione."
|
||||||
},
|
},
|
||||||
"business": {
|
"business": {
|
||||||
"title": "Business Use",
|
"title": "Uso Aziendale",
|
||||||
"description": "For use within organizations, companies, or commercial or revenue-generating activities."
|
"description": "Da utilizzare all'interno di organizzazioni, aziende o attività commerciali o generatrici di entrate."
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"steps": {
|
"steps": {
|
||||||
"emailLicenseType": {
|
"emailLicenseType": {
|
||||||
"title": "Email & License Type",
|
"title": "Email & Tipo Di Licenza",
|
||||||
"description": "Enter your email and choose your license type"
|
"description": "Inserisci la tua email e scegli il tipo di licenza"
|
||||||
},
|
},
|
||||||
"personalInformation": {
|
"personalInformation": {
|
||||||
"title": "Personal Information",
|
"title": "Informazioni Personali",
|
||||||
"description": "Tell us about yourself"
|
"description": "Raccontaci di te"
|
||||||
},
|
},
|
||||||
"contactInformation": {
|
"contactInformation": {
|
||||||
"title": "Contact Information",
|
"title": "Informazioni Di Contatto",
|
||||||
"description": "Your contact details"
|
"description": "I tuoi dati di contatto"
|
||||||
},
|
},
|
||||||
"termsGenerate": {
|
"termsGenerate": {
|
||||||
"title": "Terms & Generate",
|
"title": "Termini E Genera",
|
||||||
"description": "Review and accept terms to generate your license"
|
"description": "Controlla e accetta i termini per generare la tua licenza"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"alerts": {
|
"alerts": {
|
||||||
"commercialUseDisclosure": {
|
"commercialUseDisclosure": {
|
||||||
"title": "Usage Disclosure",
|
"title": "Trasparenza Di Utilizzo",
|
||||||
"description": "Select the license tier that accurately reflects your intended use. The Personal License permits free use of the Software for individual, non-commercial or small-scale commercial activities with annual gross revenue under $100,000 USD. Any use beyond these limits — including use within a business, organization, or other revenue-generating environment — requires a valid Enterprise License and payment of the applicable licensing fee. All users, whether Personal or Enterprise, must comply with the Fossorial Commercial License Terms."
|
"description": "Seleziona il livello di licenza che rispecchia accuratamente il tuo utilizzo previsto. La Licenza Personale consente l'uso gratuito del Software per le attività commerciali individuali, non commerciali o su piccola scala con entrate lorde annue inferiori a $100.000 USD. Qualsiasi uso oltre questi limiti — compreso l'uso all'interno di un'azienda, organizzazione, o altro ambiente generatore di entrate — richiede una licenza Enterprise valida e il pagamento della tassa di licenza applicabile. Tutti gli utenti, siano essi personali o aziendali, devono rispettare i termini di licenza commerciale Fossorial."
|
||||||
},
|
},
|
||||||
"trialPeriodInformation": {
|
"trialPeriodInformation": {
|
||||||
"title": "Trial Period Information",
|
"title": "Informazioni Periodo Di Prova",
|
||||||
"description": "This License Key enables Enterprise features for a 7-day evaluation period. Continued access to Paid Features beyond the evaluation period requires activation under a valid Personal or Enterprise License. For Enterprise licensing, contact sales@fossorial.io."
|
"description": "Questa chiave di licenza abilita le funzionalità Enterprise per un periodo di valutazione di 7 giorni. L'accesso continuo alle funzionalità a pagamento oltre il periodo di valutazione richiede l'attivazione con una licenza personale o Enterprise valida. Per la licenza Enterprise contatta sales@pangolin.net."
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"form": {
|
"form": {
|
||||||
"useCaseQuestion": "Are you using Pangolin for personal or business use?",
|
"useCaseQuestion": "Stai usando Pangolin per uso personale o di affari?",
|
||||||
"firstName": "First Name",
|
"firstName": "Nome",
|
||||||
"lastName": "Last Name",
|
"lastName": "Cognome",
|
||||||
"jobTitle": "Job Title",
|
"jobTitle": "Titolo Del Lavoro",
|
||||||
"primaryUseQuestion": "What do you primarily plan to use Pangolin for?",
|
"primaryUseQuestion": "Per che cosa hai in primo luogo intenzione di usare Pangolin?",
|
||||||
"industryQuestion": "What is your industry?",
|
"industryQuestion": "Qual è la sua industria?",
|
||||||
"prospectiveUsersQuestion": "How many prospective users do you expect to have?",
|
"prospectiveUsersQuestion": "Quanti potenziali utenti si aspettano di avere?",
|
||||||
"prospectiveSitesQuestion": "How many prospective sites (tunnels) do you expect to have?",
|
"prospectiveSitesQuestion": "Quanti siti potenziali (gallerie) ci si aspetta di avere?",
|
||||||
"companyName": "Company name",
|
"companyName": "Nome della società",
|
||||||
"countryOfResidence": "Country of residence",
|
"countryOfResidence": "Paese di residenza",
|
||||||
"stateProvinceRegion": "State / Province / Region",
|
"stateProvinceRegion": "Stato / Provincia / Regione",
|
||||||
"postalZipCode": "Postal / ZIP Code",
|
"postalZipCode": "Codice Postale / Zip",
|
||||||
"companyWebsite": "Company website",
|
"companyWebsite": "Sito web dell'azienda",
|
||||||
"companyPhoneNumber": "Company phone number",
|
"companyPhoneNumber": "Numero di telefono dell'azienda",
|
||||||
"country": "Country",
|
"country": "Paese",
|
||||||
"phoneNumberOptional": "Phone number (optional)",
|
"phoneNumberOptional": "Numero di telefono (facoltativo)",
|
||||||
"complianceConfirmation": "I confirm that I am in compliance with the Fossorial Commercial License and that reporting inaccurate information or misidentifying use of the product is a violation of the license."
|
"complianceConfirmation": "Confermo che le informazioni che ho fornito sono accurate e che sono in conformità con la Fossorial Commercial License. La segnalazione di informazioni inesatte o l'uso errato del prodotto è una violazione della licenza e può portare alla revoca della chiave."
|
||||||
},
|
},
|
||||||
"buttons": {
|
"buttons": {
|
||||||
"close": "Close",
|
"close": "Chiudi",
|
||||||
"previous": "Previous",
|
"previous": "Precedente",
|
||||||
"next": "Next",
|
"next": "Successivo",
|
||||||
"generateLicenseKey": "Generate License Key"
|
"generateLicenseKey": "Genera Chiave Di Licenza"
|
||||||
},
|
},
|
||||||
"toasts": {
|
"toasts": {
|
||||||
"success": {
|
"success": {
|
||||||
"title": "License key generated successfully",
|
"title": "Chiave di licenza generata con successo",
|
||||||
"description": "Your license key has been generated and is ready to use."
|
"description": "La chiave di licenza è stata generata ed è pronta per l'uso."
|
||||||
},
|
},
|
||||||
"error": {
|
"error": {
|
||||||
"title": "Failed to generate license key",
|
"title": "Impossibile generare la chiave di licenza",
|
||||||
"description": "An error occurred while generating the license key."
|
"description": "Si è verificato un errore nella generazione della chiave di licenza."
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"priority": "Priorità",
|
"priority": "Priorità",
|
||||||
"priorityDescription": "I percorsi prioritari più alti sono valutati prima. Priorità = 100 significa ordinamento automatico (decidi di sistema). Usa un altro numero per applicare la priorità manuale.",
|
"priorityDescription": "I percorsi prioritari più alti sono valutati prima. Priorità = 100 significa ordinamento automatico (decidi di sistema). Usa un altro numero per applicare la priorità manuale.",
|
||||||
"instanceName": "Instance Name",
|
"instanceName": "Nome Istanza",
|
||||||
"pathMatchModalTitle": "Configure Path Matching",
|
"pathMatchModalTitle": "Configura Corrispondenza Percorso",
|
||||||
"pathMatchModalDescription": "Set up how incoming requests should be matched based on their path.",
|
"pathMatchModalDescription": "Impostare come le richieste in arrivo devono essere abbinate in base al loro percorso.",
|
||||||
"pathMatchType": "Match Type",
|
"pathMatchType": "Tipo di Corrispondenza",
|
||||||
"pathMatchPrefix": "Prefix",
|
"pathMatchPrefix": "Prefisso",
|
||||||
"pathMatchExact": "Exact",
|
"pathMatchExact": "Esatto",
|
||||||
"pathMatchRegex": "Regex",
|
"pathMatchRegex": "Regex",
|
||||||
"pathMatchValue": "Path Value",
|
"pathMatchValue": "Valore Percorso",
|
||||||
"clear": "Clear",
|
"clear": "Pulisci",
|
||||||
"saveChanges": "Save Changes",
|
"saveChanges": "Salva Modifiche",
|
||||||
"pathMatchRegexPlaceholder": "^/api/.*",
|
"pathMatchRegexPlaceholder": "^/api/.*",
|
||||||
"pathMatchDefaultPlaceholder": "/path",
|
"pathMatchDefaultPlaceholder": "/path",
|
||||||
"pathMatchPrefixHelp": "Example: /api matches /api, /api/users, etc.",
|
"pathMatchPrefixHelp": "Esempio: /api corrisponde /api, /api/users etc.",
|
||||||
"pathMatchExactHelp": "Example: /api matches only /api",
|
"pathMatchExactHelp": "Esempio: /api corrisponde solo /api",
|
||||||
"pathMatchRegexHelp": "Example: ^/api/.* matches /api/anything",
|
"pathMatchRegexHelp": "Esempio: ^/api/.* corrisponde /api/anything",
|
||||||
"pathRewriteModalTitle": "Configure Path Rewriting",
|
"pathRewriteModalTitle": "Configura La Riscrittura Percorso",
|
||||||
"pathRewriteModalDescription": "Transform the matched path before forwarding to the target.",
|
"pathRewriteModalDescription": "Trasforma il percorso corrispondente prima di inoltrarlo al bersaglio.",
|
||||||
"pathRewriteType": "Rewrite Type",
|
"pathRewriteType": "Tipo Di Riscrittura",
|
||||||
"pathRewritePrefixOption": "Prefix - Replace prefix",
|
"pathRewritePrefixOption": "Prefisso - Sostituisci prefisso",
|
||||||
"pathRewriteExactOption": "Exact - Replace entire path",
|
"pathRewriteExactOption": "Esatto - Sostituisci l'intero percorso",
|
||||||
"pathRewriteRegexOption": "Regex - Pattern replacement",
|
"pathRewriteRegexOption": "Regex - Sostituzione modello",
|
||||||
"pathRewriteStripPrefixOption": "Strip Prefix - Remove prefix",
|
"pathRewriteStripPrefixOption": "Prefisso striscia - Rimuovi prefisso",
|
||||||
"pathRewriteValue": "Rewrite Value",
|
"pathRewriteValue": "Riscrittura Valore",
|
||||||
"pathRewriteRegexPlaceholder": "/new/$1",
|
"pathRewriteRegexPlaceholder": "/new/$1",
|
||||||
"pathRewriteDefaultPlaceholder": "/new-path",
|
"pathRewriteDefaultPlaceholder": "/nuovo-percorso",
|
||||||
"pathRewritePrefixHelp": "Replace the matched prefix with this value",
|
"pathRewritePrefixHelp": "Sostituisci il prefisso abbinato con questo valore",
|
||||||
"pathRewriteExactHelp": "Replace the entire path with this value when the path matches exactly",
|
"pathRewriteExactHelp": "Sostituisci l'intero percorso con questo valore quando il percorso corrisponde esattamente",
|
||||||
"pathRewriteRegexHelp": "Use capture groups like $1, $2 for replacement",
|
"pathRewriteRegexHelp": "Usa gruppi di acquisizione come $1, $2 per la sostituzione",
|
||||||
"pathRewriteStripPrefixHelp": "Leave empty to strip prefix or provide new prefix",
|
"pathRewriteStripPrefixHelp": "Lasciare vuoto per strisciare il prefisso o fornire un nuovo prefisso",
|
||||||
"pathRewritePrefix": "Prefix",
|
"pathRewritePrefix": "Prefisso",
|
||||||
"pathRewriteExact": "Exact",
|
"pathRewriteExact": "Esatto",
|
||||||
"pathRewriteRegex": "Regex",
|
"pathRewriteRegex": "Regex",
|
||||||
"pathRewriteStrip": "Strip",
|
"pathRewriteStrip": "Striscia",
|
||||||
"pathRewriteStripLabel": "strip"
|
"pathRewriteStripLabel": "striscia",
|
||||||
|
"sidebarEnableEnterpriseLicense": "Abilita Licenza Enterprise",
|
||||||
|
"cannotbeUndone": "Questo non può essere annullato.",
|
||||||
|
"toConfirm": "per confermare",
|
||||||
|
"deleteClientQuestion": "Sei sicuro di voler rimuovere il client dal sito e dall'organizzazione?",
|
||||||
|
"clientMessageRemove": "Una volta rimosso, il client non sarà più in grado di connettersi al sito.",
|
||||||
|
"sidebarLogs": "Registri",
|
||||||
|
"request": "Richiesta",
|
||||||
|
"logs": "Registri",
|
||||||
|
"logsSettingsDescription": "Monitora i registri raccolti da questa orginizzazione",
|
||||||
|
"searchLogs": "Cerca registro...",
|
||||||
|
"action": "Azione",
|
||||||
|
"actor": "Attore",
|
||||||
|
"timestamp": "Timestamp",
|
||||||
|
"accessLogs": "Log Accesso",
|
||||||
|
"exportCsv": "Esporta CSV",
|
||||||
|
"actorId": "Id Attore",
|
||||||
|
"allowedByRule": "Consentito dalla regola",
|
||||||
|
"allowedNoAuth": "Non Consentito Auth",
|
||||||
|
"validAccessToken": "Token Di Accesso Valido",
|
||||||
|
"validHeaderAuth": "Valid header auth",
|
||||||
|
"validPincode": "Valid Pincode",
|
||||||
|
"validPassword": "Password Valida",
|
||||||
|
"validEmail": "Valid email",
|
||||||
|
"validSSO": "Valid SSO",
|
||||||
|
"resourceBlocked": "Risorsa Bloccata",
|
||||||
|
"droppedByRule": "Eliminato dalla regola",
|
||||||
|
"noSessions": "Nessuna Sessione",
|
||||||
|
"temporaryRequestToken": "Token Di Richiesta Temporaneo",
|
||||||
|
"noMoreAuthMethods": "No Valid Auth",
|
||||||
|
"ip": "IP",
|
||||||
|
"reason": "Motivo",
|
||||||
|
"requestLogs": "Log Richiesta",
|
||||||
|
"host": "Host",
|
||||||
|
"location": "Posizione",
|
||||||
|
"actionLogs": "Log Azioni",
|
||||||
|
"sidebarLogsRequest": "Log Richiesta",
|
||||||
|
"sidebarLogsAccess": "Log Accesso",
|
||||||
|
"sidebarLogsAction": "Log Azioni",
|
||||||
|
"logRetention": "Ritenzione Registro",
|
||||||
|
"logRetentionDescription": "Gestisci per quanto tempo i diversi tipi di log sono mantenuti per questa organizzazione o disabilitali",
|
||||||
|
"requestLogsDescription": "Visualizza i registri di richiesta dettagliati per le risorse in questa organizzazione",
|
||||||
|
"logRetentionRequestLabel": "Richiedi Ritenzione Log",
|
||||||
|
"logRetentionRequestDescription": "Per quanto tempo conservare i log delle richieste",
|
||||||
|
"logRetentionAccessLabel": "Ritenzione Registro Accesso",
|
||||||
|
"logRetentionAccessDescription": "Per quanto tempo conservare i log di accesso",
|
||||||
|
"logRetentionActionLabel": "Ritenzione Registro Azioni",
|
||||||
|
"logRetentionActionDescription": "Per quanto tempo conservare i log delle azioni",
|
||||||
|
"logRetentionDisabled": "Disabilitato",
|
||||||
|
"logRetention3Days": "3 giorni",
|
||||||
|
"logRetention7Days": "7 giorni",
|
||||||
|
"logRetention14Days": "14 giorni",
|
||||||
|
"logRetention30Days": "30 giorni",
|
||||||
|
"logRetention90Days": "90 giorni",
|
||||||
|
"logRetentionForever": "Per Sempre",
|
||||||
|
"actionLogsDescription": "Visualizza una cronologia delle azioni eseguite in questa organizzazione",
|
||||||
|
"accessLogsDescription": "Visualizza le richieste di autenticazione di accesso per le risorse in questa organizzazione",
|
||||||
|
"licenseRequiredToUse": "Per utilizzare questa funzione è necessaria una licenza Enterprise.",
|
||||||
|
"certResolver": "Risolutore Di Certificato",
|
||||||
|
"certResolverDescription": "Selezionare il risolutore di certificati da usare per questa risorsa.",
|
||||||
|
"selectCertResolver": "Seleziona Risolutore Di Certificato",
|
||||||
|
"enterCustomResolver": "Inserisci Risolutore Personalizzato",
|
||||||
|
"preferWildcardCert": "Preferisci Certificato Wildcard",
|
||||||
|
"unverified": "Non Verificato",
|
||||||
|
"domainSetting": "Impostazioni Dominio",
|
||||||
|
"domainSettingDescription": "Configura le impostazioni per il tuo dominio",
|
||||||
|
"preferWildcardCertDescription": "Tentativo di generare un certificato jolly (richiede un risolutore di certificati correttamente configurato).",
|
||||||
|
"recordName": "Nome Record",
|
||||||
|
"auto": "Automatico",
|
||||||
|
"TTL": "TTL",
|
||||||
|
"howToAddRecords": "Come aggiungere record",
|
||||||
|
"dnsRecord": "Record DNS",
|
||||||
|
"required": "Richiesto",
|
||||||
|
"domainSettingsUpdated": "Impostazioni dominio aggiornate con successo",
|
||||||
|
"orgOrDomainIdMissing": "Manca l'ID dell'organizzazione o del dominio",
|
||||||
|
"loadingDNSRecords": "Caricamento record DNS...",
|
||||||
|
"olmUpdateAvailableInfo": "È disponibile una versione aggiornata di Olm. Si prega di aggiornare all'ultima versione per la migliore esperienza.",
|
||||||
|
"client": "Client",
|
||||||
|
"proxyProtocol": "Impostazioni Protocollo Proxy",
|
||||||
|
"proxyProtocolDescription": "Configurare il protocollo proxy per preservare gli indirizzi IP client per i servizi TCP/UDP.",
|
||||||
|
"enableProxyProtocol": "Abilita Protocollo Proxy",
|
||||||
|
"proxyProtocolInfo": "Conserva gli indirizzi IP del client per i backend TCP/UDP",
|
||||||
|
"proxyProtocolVersion": "Versione Protocollo Proxy",
|
||||||
|
"version1": " Versione 1 (Consigliato)",
|
||||||
|
"version2": "Versione 2",
|
||||||
|
"versionDescription": "La versione 1 è testuale e ampiamente supportata. La versione 2 è binaria e più efficiente, ma meno compatibile.",
|
||||||
|
"warning": "Attenzione",
|
||||||
|
"proxyProtocolWarning": "La tua applicazione backend deve essere configurata per accettare le connessioni del protocollo proxy. Se il tuo backend non supporta il protocollo proxy, abilitando questa opzione si interromperanno tutte le connessioni. Assicurati di configurare il tuo backend per fidarti delle intestazioni del protocollo proxy da Traefik.",
|
||||||
|
"restarting": "Riavvio...",
|
||||||
|
"manual": "Manuale",
|
||||||
|
"messageSupport": "Supporto Messaggio",
|
||||||
|
"supportNotAvailableTitle": "Supporto Non Disponibile",
|
||||||
|
"supportNotAvailableDescription": "Il supporto non è disponibile in questo momento. Puoi inviare un'email a support@pangolin.net.",
|
||||||
|
"supportRequestSentTitle": "Richiesta Di Supporto Inviata",
|
||||||
|
"supportRequestSentDescription": "Il tuo messaggio è stato inviato con successo.",
|
||||||
|
"supportRequestFailedTitle": "Impossibile inviare la richiesta",
|
||||||
|
"supportRequestFailedDescription": "Si è verificato un errore durante l'invio della richiesta di supporto.",
|
||||||
|
"supportSubjectRequired": "L'oggetto è obbligatorio",
|
||||||
|
"supportSubjectMaxLength": "L'oggetto deve contenere almeno 255 caratteri",
|
||||||
|
"supportMessageRequired": "Il messaggio è obbligatorio",
|
||||||
|
"supportReplyTo": "Rispondi A",
|
||||||
|
"supportSubject": "Oggetto",
|
||||||
|
"supportSubjectPlaceholder": "Inserisci oggetto",
|
||||||
|
"supportMessage": "Messaggio",
|
||||||
|
"supportMessagePlaceholder": "Inserisci il tuo messaggio",
|
||||||
|
"supportSending": "Invio...",
|
||||||
|
"supportSend": "Invia",
|
||||||
|
"supportMessageSent": "Messaggio Inviato!",
|
||||||
|
"supportWillContact": "Saremo in contatto a breve!"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -47,9 +47,8 @@
|
|||||||
"edit": "편집",
|
"edit": "편집",
|
||||||
"siteConfirmDelete": "사이트 삭제 확인",
|
"siteConfirmDelete": "사이트 삭제 확인",
|
||||||
"siteDelete": "사이트 삭제",
|
"siteDelete": "사이트 삭제",
|
||||||
"siteMessageRemove": "제거되면 사이트에 더 이상 접근할 수 없습니다. 사이트와 관련된 모든 리소스와 대상도 제거됩니다.",
|
"siteMessageRemove": "삭제되면 사이트에 더 이상 액세스할 수 없습니다. 사이트와 연결된 모든 대상도 삭제됩니다.",
|
||||||
"siteMessageConfirm": "확인을 위해 아래에 사이트 이름을 입력해 주세요.",
|
"siteQuestionRemove": "조직에서 사이트를 제거하시겠습니까?",
|
||||||
"siteQuestionRemove": "조직에서 사이트 {selectedSite}를 제거하시겠습니까?",
|
|
||||||
"siteManageSites": "사이트 관리",
|
"siteManageSites": "사이트 관리",
|
||||||
"siteDescription": "안전한 터널을 통해 네트워크에 연결할 수 있도록 허용",
|
"siteDescription": "안전한 터널을 통해 네트워크에 연결할 수 있도록 허용",
|
||||||
"siteCreate": "사이트 생성",
|
"siteCreate": "사이트 생성",
|
||||||
@@ -96,7 +95,7 @@
|
|||||||
"siteWgDescription": "모든 WireGuard 클라이언트를 사용하여 터널을 설정하세요. 수동 NAT 설정이 필요합니다.",
|
"siteWgDescription": "모든 WireGuard 클라이언트를 사용하여 터널을 설정하세요. 수동 NAT 설정이 필요합니다.",
|
||||||
"siteWgDescriptionSaas": "모든 WireGuard 클라이언트를 사용하여 터널을 설정하세요. 수동 NAT 설정이 필요합니다. 자체 호스팅 노드에서만 작동합니다.",
|
"siteWgDescriptionSaas": "모든 WireGuard 클라이언트를 사용하여 터널을 설정하세요. 수동 NAT 설정이 필요합니다. 자체 호스팅 노드에서만 작동합니다.",
|
||||||
"siteLocalDescription": "로컬 리소스만 사용 가능합니다. 터널링이 없습니다.",
|
"siteLocalDescription": "로컬 리소스만 사용 가능합니다. 터널링이 없습니다.",
|
||||||
"siteLocalDescriptionSaas": "Local resources only. No tunneling. Only available on remote nodes.",
|
"siteLocalDescriptionSaas": "로컬 리소스 전용. 터널링 금지. 원격 노드에서만 사용 가능합니다.",
|
||||||
"siteSeeAll": "모든 사이트 보기",
|
"siteSeeAll": "모든 사이트 보기",
|
||||||
"siteTunnelDescription": "사이트에 연결하는 방법을 결정하세요",
|
"siteTunnelDescription": "사이트에 연결하는 방법을 결정하세요",
|
||||||
"siteNewtCredentials": "Newt 자격 증명",
|
"siteNewtCredentials": "Newt 자격 증명",
|
||||||
@@ -154,8 +153,7 @@
|
|||||||
"protected": "보호됨",
|
"protected": "보호됨",
|
||||||
"notProtected": "보호되지 않음",
|
"notProtected": "보호되지 않음",
|
||||||
"resourceMessageRemove": "제거되면 리소스에 더 이상 접근할 수 없습니다. 리소스와 연결된 모든 대상도 제거됩니다.",
|
"resourceMessageRemove": "제거되면 리소스에 더 이상 접근할 수 없습니다. 리소스와 연결된 모든 대상도 제거됩니다.",
|
||||||
"resourceMessageConfirm": "확인을 위해 아래에 리소스의 이름을 입력하세요.",
|
"resourceQuestionRemove": "조직에서 리소스를 제거하시겠습니까?",
|
||||||
"resourceQuestionRemove": "조직에서 리소스 {selectedResource}를 제거하시겠습니까?",
|
|
||||||
"resourceHTTP": "HTTPS 리소스",
|
"resourceHTTP": "HTTPS 리소스",
|
||||||
"resourceHTTPDescription": "서브도메인 또는 기본 도메인을 사용하여 HTTPS를 통해 앱에 대한 요청을 프록시합니다.",
|
"resourceHTTPDescription": "서브도메인 또는 기본 도메인을 사용하여 HTTPS를 통해 앱에 대한 요청을 프록시합니다.",
|
||||||
"resourceRaw": "원시 TCP/UDP 리소스",
|
"resourceRaw": "원시 TCP/UDP 리소스",
|
||||||
@@ -220,7 +218,7 @@
|
|||||||
"orgDeleteConfirm": "조직 삭제 확인",
|
"orgDeleteConfirm": "조직 삭제 확인",
|
||||||
"orgMessageRemove": "이 작업은 되돌릴 수 없으며 모든 관련 데이터를 삭제합니다.",
|
"orgMessageRemove": "이 작업은 되돌릴 수 없으며 모든 관련 데이터를 삭제합니다.",
|
||||||
"orgMessageConfirm": "확인을 위해 아래에 조직 이름을 입력하십시오.",
|
"orgMessageConfirm": "확인을 위해 아래에 조직 이름을 입력하십시오.",
|
||||||
"orgQuestionRemove": "조직 {selectedOrg}을(를) 제거하시겠습니까?",
|
"orgQuestionRemove": "조직을 삭제하시겠습니까?",
|
||||||
"orgUpdated": "조직이 업데이트되었습니다.",
|
"orgUpdated": "조직이 업데이트되었습니다.",
|
||||||
"orgUpdatedDescription": "조직이 업데이트되었습니다.",
|
"orgUpdatedDescription": "조직이 업데이트되었습니다.",
|
||||||
"orgErrorUpdate": "조직 업데이트에 실패했습니다.",
|
"orgErrorUpdate": "조직 업데이트에 실패했습니다.",
|
||||||
@@ -287,9 +285,8 @@
|
|||||||
"apiKeysAdd": "API 키 생성",
|
"apiKeysAdd": "API 키 생성",
|
||||||
"apiKeysErrorDelete": "API 키 삭제 오류",
|
"apiKeysErrorDelete": "API 키 삭제 오류",
|
||||||
"apiKeysErrorDeleteMessage": "API 키 삭제 오류",
|
"apiKeysErrorDeleteMessage": "API 키 삭제 오류",
|
||||||
"apiKeysQuestionRemove": "조직에서 API 키 {selectedApiKey}를 제거하시겠습니까?",
|
"apiKeysQuestionRemove": "조직에서 API 키를 제거하시겠습니까?",
|
||||||
"apiKeysMessageRemove": "삭제되면 API 키를 더 이상 사용할 수 없습니다.",
|
"apiKeysMessageRemove": "삭제되면 API 키를 더 이상 사용할 수 없습니다.",
|
||||||
"apiKeysMessageConfirm": "확인을 위해 아래에 API 키의 이름을 입력해 주세요.",
|
|
||||||
"apiKeysDeleteConfirm": "API 키 삭제 확인",
|
"apiKeysDeleteConfirm": "API 키 삭제 확인",
|
||||||
"apiKeysDelete": "API 키 삭제",
|
"apiKeysDelete": "API 키 삭제",
|
||||||
"apiKeysManage": "API 키 관리",
|
"apiKeysManage": "API 키 관리",
|
||||||
@@ -305,8 +302,7 @@
|
|||||||
"userDeleteConfirm": "사용자 삭제 확인",
|
"userDeleteConfirm": "사용자 삭제 확인",
|
||||||
"userDeleteServer": "서버에서 사용자 삭제",
|
"userDeleteServer": "서버에서 사용자 삭제",
|
||||||
"userMessageRemove": "사용자가 모든 조직에서 제거되며 서버에서 완전히 삭제됩니다.",
|
"userMessageRemove": "사용자가 모든 조직에서 제거되며 서버에서 완전히 삭제됩니다.",
|
||||||
"userMessageConfirm": "확인을 위해 아래에 사용자 이름을 입력하십시오.",
|
"userQuestionRemove": "서버에서 사용자를 영구적으로 삭제하시겠습니까?",
|
||||||
"userQuestionRemove": "정말로 {selectedUser}를 서버에서 영구적으로 삭제하시겠습니까?",
|
|
||||||
"licenseKey": "라이센스 키",
|
"licenseKey": "라이센스 키",
|
||||||
"valid": "유효",
|
"valid": "유효",
|
||||||
"numberOfSites": "사이트 수",
|
"numberOfSites": "사이트 수",
|
||||||
@@ -339,7 +335,7 @@
|
|||||||
"fossorialLicense": "Fossorial 상업 라이선스 및 구독 약관 보기",
|
"fossorialLicense": "Fossorial 상업 라이선스 및 구독 약관 보기",
|
||||||
"licenseMessageRemove": "이 작업은 라이센스 키와 그에 의해 부여된 모든 관련 권한을 제거합니다.",
|
"licenseMessageRemove": "이 작업은 라이센스 키와 그에 의해 부여된 모든 관련 권한을 제거합니다.",
|
||||||
"licenseMessageConfirm": "확인을 위해 아래에 라이센스 키를 입력하세요.",
|
"licenseMessageConfirm": "확인을 위해 아래에 라이센스 키를 입력하세요.",
|
||||||
"licenseQuestionRemove": "라이센스 키 {selectedKey}를 삭제하시겠습니까?",
|
"licenseQuestionRemove": "라이선스 키를 삭제하시겠습니까?",
|
||||||
"licenseKeyDelete": "라이센스 키 삭제",
|
"licenseKeyDelete": "라이센스 키 삭제",
|
||||||
"licenseKeyDeleteConfirm": "라이센스 키 삭제 확인",
|
"licenseKeyDeleteConfirm": "라이센스 키 삭제 확인",
|
||||||
"licenseTitle": "라이선스 상태 관리",
|
"licenseTitle": "라이선스 상태 관리",
|
||||||
@@ -372,7 +368,7 @@
|
|||||||
"inviteRemoveErrorDescription": "초대를 제거하는 동안 오류가 발생했습니다.",
|
"inviteRemoveErrorDescription": "초대를 제거하는 동안 오류가 발생했습니다.",
|
||||||
"inviteRemoved": "초대가 제거되었습니다.",
|
"inviteRemoved": "초대가 제거되었습니다.",
|
||||||
"inviteRemovedDescription": "{email}에 대한 초대가 삭제되었습니다.",
|
"inviteRemovedDescription": "{email}에 대한 초대가 삭제되었습니다.",
|
||||||
"inviteQuestionRemove": "초대 {email}를 제거하시겠습니까?",
|
"inviteQuestionRemove": "초대를 제거하시겠습니까?",
|
||||||
"inviteMessageRemove": "한 번 제거되면 이 초대는 더 이상 유효하지 않습니다. 나중에 사용자를 다시 초대할 수 있습니다.",
|
"inviteMessageRemove": "한 번 제거되면 이 초대는 더 이상 유효하지 않습니다. 나중에 사용자를 다시 초대할 수 있습니다.",
|
||||||
"inviteMessageConfirm": "확인을 위해 아래 초대의 이메일 주소를 입력해 주세요.",
|
"inviteMessageConfirm": "확인을 위해 아래 초대의 이메일 주소를 입력해 주세요.",
|
||||||
"inviteQuestionRegenerate": "{email}에 대한 초대장을 다시 생성하시겠습니까? 이전 초대장은 취소됩니다.",
|
"inviteQuestionRegenerate": "{email}에 대한 초대장을 다시 생성하시겠습니까? 이전 초대장은 취소됩니다.",
|
||||||
@@ -398,9 +394,8 @@
|
|||||||
"userErrorOrgRemoveDescription": "사용자를 제거하는 동안 오류가 발생했습니다.",
|
"userErrorOrgRemoveDescription": "사용자를 제거하는 동안 오류가 발생했습니다.",
|
||||||
"userOrgRemoved": "사용자가 제거되었습니다.",
|
"userOrgRemoved": "사용자가 제거되었습니다.",
|
||||||
"userOrgRemovedDescription": "사용자 {email}가 조직에서 제거되었습니다.",
|
"userOrgRemovedDescription": "사용자 {email}가 조직에서 제거되었습니다.",
|
||||||
"userQuestionOrgRemove": "{email}을 조직에서 제거하시겠습니까?",
|
"userQuestionOrgRemove": "조직에서 이 사용자를 제거하시겠습니까?",
|
||||||
"userMessageOrgRemove": "이 사용자가 제거되면 더 이상 조직에 접근할 수 없습니다. 나중에 다시 초대할 수 있지만, 초대를 다시 수락해야 합니다.",
|
"userMessageOrgRemove": "이 사용자가 제거되면 더 이상 조직에 접근할 수 없습니다. 나중에 다시 초대할 수 있지만, 초대를 다시 수락해야 합니다.",
|
||||||
"userMessageOrgConfirm": "확인을 위해 아래에 사용자 이름을 입력하세요.",
|
|
||||||
"userRemoveOrgConfirm": "사용자 제거 확인",
|
"userRemoveOrgConfirm": "사용자 제거 확인",
|
||||||
"userRemoveOrg": "조직에서 사용자 제거",
|
"userRemoveOrg": "조직에서 사용자 제거",
|
||||||
"users": "사용자",
|
"users": "사용자",
|
||||||
@@ -730,7 +725,7 @@
|
|||||||
"pangolinServerAdmin": "서버 관리자 - 판골린",
|
"pangolinServerAdmin": "서버 관리자 - 판골린",
|
||||||
"licenseTierProfessional": "전문 라이센스",
|
"licenseTierProfessional": "전문 라이센스",
|
||||||
"licenseTierEnterprise": "기업 라이선스",
|
"licenseTierEnterprise": "기업 라이선스",
|
||||||
"licenseTierPersonal": "Personal License",
|
"licenseTierPersonal": "개인 라이선스",
|
||||||
"licensed": "라이센스",
|
"licensed": "라이센스",
|
||||||
"yes": "예",
|
"yes": "예",
|
||||||
"no": "아니요",
|
"no": "아니요",
|
||||||
@@ -742,7 +737,7 @@
|
|||||||
"idpManageDescription": "시스템에서 ID 제공자를 보고 관리합니다",
|
"idpManageDescription": "시스템에서 ID 제공자를 보고 관리합니다",
|
||||||
"idpDeletedDescription": "신원 공급자가 성공적으로 삭제되었습니다",
|
"idpDeletedDescription": "신원 공급자가 성공적으로 삭제되었습니다",
|
||||||
"idpOidc": "OAuth2/OIDC",
|
"idpOidc": "OAuth2/OIDC",
|
||||||
"idpQuestionRemove": "정말로 아이덴티티 공급자 {name}를 영구적으로 삭제하시겠습니까?",
|
"idpQuestionRemove": "아이덴티티 공급자를 영구적으로 삭제하시겠습니까?",
|
||||||
"idpMessageRemove": "이 작업은 아이덴티티 공급자와 모든 관련 구성을 제거합니다. 이 공급자를 통해 인증하는 사용자는 더 이상 로그인할 수 없습니다.",
|
"idpMessageRemove": "이 작업은 아이덴티티 공급자와 모든 관련 구성을 제거합니다. 이 공급자를 통해 인증하는 사용자는 더 이상 로그인할 수 없습니다.",
|
||||||
"idpMessageConfirm": "확인을 위해 아래에 아이덴티티 제공자의 이름을 입력하세요.",
|
"idpMessageConfirm": "확인을 위해 아래에 아이덴티티 제공자의 이름을 입력하세요.",
|
||||||
"idpConfirmDelete": "신원 제공자 삭제 확인",
|
"idpConfirmDelete": "신원 제공자 삭제 확인",
|
||||||
@@ -916,6 +911,18 @@
|
|||||||
"passwordResetCodeDescription": "재설정 코드를 확인하려면 이메일을 확인하세요.",
|
"passwordResetCodeDescription": "재설정 코드를 확인하려면 이메일을 확인하세요.",
|
||||||
"passwordNew": "새 비밀번호",
|
"passwordNew": "새 비밀번호",
|
||||||
"passwordNewConfirm": "새 비밀번호 확인",
|
"passwordNewConfirm": "새 비밀번호 확인",
|
||||||
|
"changePassword": "비밀번호 변경",
|
||||||
|
"changePasswordDescription": "계정 비밀번호를 업데이트하십시오",
|
||||||
|
"oldPassword": "현재 비밀번호",
|
||||||
|
"newPassword": "새 비밀번호",
|
||||||
|
"confirmNewPassword": "새 비밀번호 확인",
|
||||||
|
"changePasswordError": "비밀번호 변경 실패",
|
||||||
|
"changePasswordErrorDescription": "비밀번호를 변경하는 중 오류가 발생했습니다",
|
||||||
|
"changePasswordSuccess": "비밀번호 변경 완료",
|
||||||
|
"changePasswordSuccessDescription": "비밀번호가 성공적으로 업데이트되었습니다",
|
||||||
|
"passwordExpiryRequired": "비밀번호 만료 필요",
|
||||||
|
"passwordExpiryDescription": "이 조직은 {maxDays}일마다 비밀번호 변경을 요구합니다.",
|
||||||
|
"changePasswordNow": "지금 비밀번호 변경",
|
||||||
"pincodeAuth": "인증 코드",
|
"pincodeAuth": "인증 코드",
|
||||||
"pincodeSubmit2": "코드 제출",
|
"pincodeSubmit2": "코드 제출",
|
||||||
"passwordResetSubmit": "재설정 요청",
|
"passwordResetSubmit": "재설정 요청",
|
||||||
@@ -1154,8 +1161,27 @@
|
|||||||
"sidebarAllUsers": "모든 사용자",
|
"sidebarAllUsers": "모든 사용자",
|
||||||
"sidebarIdentityProviders": "신원 공급자",
|
"sidebarIdentityProviders": "신원 공급자",
|
||||||
"sidebarLicense": "라이선스",
|
"sidebarLicense": "라이선스",
|
||||||
"sidebarClients": "Clients",
|
"sidebarClients": "클라이언트",
|
||||||
"sidebarDomains": "도메인",
|
"sidebarDomains": "도메인",
|
||||||
|
"sidebarBluePrints": "청사진",
|
||||||
|
"blueprints": "청사진",
|
||||||
|
"blueprintsDescription": "청사진은 리소스와 그 설정을 정의하는 선언적인 YAML 구성입니다",
|
||||||
|
"blueprintAdd": "청사진 추가",
|
||||||
|
"blueprintGoBack": "모든 청사진 보기",
|
||||||
|
"blueprintCreate": "청사진 생성",
|
||||||
|
"blueprintCreateDescription2": "새 청사진을 생성하고 적용하려면 아래 단계를 따르십시오",
|
||||||
|
"blueprintDetails": "청사진 세부 사항",
|
||||||
|
"blueprintDetailsDescription": "청사진 실행 세부 정보 보기",
|
||||||
|
"blueprintInfo": "청사진 정보",
|
||||||
|
"message": "메시지",
|
||||||
|
"blueprintContentsDescription": "인프라를 설명하는 YAML 콘텐츠를 정의하십시오",
|
||||||
|
"blueprintErrorCreateDescription": "청사진을 적용하는 중 오류가 발생했습니다",
|
||||||
|
"blueprintErrorCreate": "청사진 생성 오류",
|
||||||
|
"searchBlueprintProgress": "청사진 검색...",
|
||||||
|
"appliedAt": "적용 시점",
|
||||||
|
"source": "출처",
|
||||||
|
"contents": "콘텐츠",
|
||||||
|
"parsedContents": "구문 분석된 콘텐츠",
|
||||||
"enableDockerSocket": "Docker 청사진 활성화",
|
"enableDockerSocket": "Docker 청사진 활성화",
|
||||||
"enableDockerSocketDescription": "블루프린트 레이블을 위한 Docker 소켓 레이블 수집을 활성화합니다. 소켓 경로는 Newt에 제공되어야 합니다.",
|
"enableDockerSocketDescription": "블루프린트 레이블을 위한 Docker 소켓 레이블 수집을 활성화합니다. 소켓 경로는 Newt에 제공되어야 합니다.",
|
||||||
"enableDockerSocketLink": "자세히 알아보기",
|
"enableDockerSocketLink": "자세히 알아보기",
|
||||||
@@ -1211,9 +1237,8 @@
|
|||||||
"domainCreate": "도메인 생성",
|
"domainCreate": "도메인 생성",
|
||||||
"domainCreatedDescription": "도메인이 성공적으로 생성되었습니다",
|
"domainCreatedDescription": "도메인이 성공적으로 생성되었습니다",
|
||||||
"domainDeletedDescription": "도메인이 성공적으로 삭제되었습니다",
|
"domainDeletedDescription": "도메인이 성공적으로 삭제되었습니다",
|
||||||
"domainQuestionRemove": "도메인 {domain}을(를) 계정에서 제거하시겠습니까?",
|
"domainQuestionRemove": "계정에서 도메인을 제거하시겠습니까?",
|
||||||
"domainMessageRemove": "제거되면 도메인이 더 이상 계정과 연관되지 않습니다.",
|
"domainMessageRemove": "제거되면 도메인이 더 이상 계정과 연관되지 않습니다.",
|
||||||
"domainMessageConfirm": "확인하려면 아래에 도메인명을 입력하세요.",
|
|
||||||
"domainConfirmDelete": "도메인 삭제 확인",
|
"domainConfirmDelete": "도메인 삭제 확인",
|
||||||
"domainDelete": "도메인 삭제",
|
"domainDelete": "도메인 삭제",
|
||||||
"domain": "도메인",
|
"domain": "도메인",
|
||||||
@@ -1280,7 +1305,7 @@
|
|||||||
"billingFreeTier": "무료 티어",
|
"billingFreeTier": "무료 티어",
|
||||||
"billingWarningOverLimit": "경고: 하나 이상의 사용 한도를 초과했습니다. 구독을 수정하거나 사용량을 조정하기 전까지 사이트는 연결되지 않습니다.",
|
"billingWarningOverLimit": "경고: 하나 이상의 사용 한도를 초과했습니다. 구독을 수정하거나 사용량을 조정하기 전까지 사이트는 연결되지 않습니다.",
|
||||||
"billingUsageLimitsOverview": "사용 한도 개요",
|
"billingUsageLimitsOverview": "사용 한도 개요",
|
||||||
"billingMonitorUsage": "설정된 한도에 대한 사용량을 모니터링합니다. 한도를 늘려야 하는 경우 support@fossorial.io로 연락하십시오.",
|
"billingMonitorUsage": "설정된 한도에 대한 사용량을 모니터링합니다. 한도를 늘려야 하는 경우 support@pangolin.net로 연락하십시오.",
|
||||||
"billingDataUsage": "데이터 사용량",
|
"billingDataUsage": "데이터 사용량",
|
||||||
"billingOnlineTime": "사이트 온라인 시간",
|
"billingOnlineTime": "사이트 온라인 시간",
|
||||||
"billingUsers": "활성 사용자",
|
"billingUsers": "활성 사용자",
|
||||||
@@ -1346,6 +1371,19 @@
|
|||||||
"securityKeyUnknownError": "보안 키를 사용하는 데 문제가 발생했습니다. 다시 시도하세요.",
|
"securityKeyUnknownError": "보안 키를 사용하는 데 문제가 발생했습니다. 다시 시도하세요.",
|
||||||
"twoFactorRequired": "보안 키를 등록하려면 이중 인증이 필요합니다.",
|
"twoFactorRequired": "보안 키를 등록하려면 이중 인증이 필요합니다.",
|
||||||
"twoFactor": "이중 인증",
|
"twoFactor": "이중 인증",
|
||||||
|
"twoFactorAuthentication": "이중 인증",
|
||||||
|
"twoFactorDescription": "이 조직은 이중 인증을 요구합니다.",
|
||||||
|
"enableTwoFactor": "이중 인증 활성화",
|
||||||
|
"organizationSecurityPolicy": "조직 보안 정책",
|
||||||
|
"organizationSecurityPolicyDescription": "이 조직에는 접근하기 전에 준수해야 하는 보안 요구 사항이 있습니다",
|
||||||
|
"securityRequirements": "보안 요구 사항",
|
||||||
|
"allRequirementsMet": "모든 요구 사항이 충족되었습니다",
|
||||||
|
"completeRequirementsToContinue": "이 조직에 계속 접근하려면 아래 요구 사항을 완료하십시오",
|
||||||
|
"youCanNowAccessOrganization": "이제 이 조직에 접근할 수 있습니다",
|
||||||
|
"reauthenticationRequired": "세션 길이",
|
||||||
|
"reauthenticationDescription": "이 조직은 {maxDays}일마다 로그인하는 것을 요구합니다.",
|
||||||
|
"reauthenticationDescriptionHours": "이 조직은 {maxHours}시간마다 로그인하는 것을 요구합니다.",
|
||||||
|
"reauthenticateNow": "다시 로그인",
|
||||||
"adminEnabled2FaOnYourAccount": "관리자가 {email}에 대한 이중 인증을 활성화했습니다. 계속하려면 설정을 완료하세요.",
|
"adminEnabled2FaOnYourAccount": "관리자가 {email}에 대한 이중 인증을 활성화했습니다. 계속하려면 설정을 완료하세요.",
|
||||||
"securityKeyAdd": "보안 키 추가",
|
"securityKeyAdd": "보안 키 추가",
|
||||||
"securityKeyRegisterTitle": "새 보안 키 등록",
|
"securityKeyRegisterTitle": "새 보안 키 등록",
|
||||||
@@ -1558,14 +1596,13 @@
|
|||||||
"autoLoginErrorNoRedirectUrl": "ID 공급자로부터 리디렉션 URL을 받지 못했습니다.",
|
"autoLoginErrorNoRedirectUrl": "ID 공급자로부터 리디렉션 URL을 받지 못했습니다.",
|
||||||
"autoLoginErrorGeneratingUrl": "인증 URL 생성 실패.",
|
"autoLoginErrorGeneratingUrl": "인증 URL 생성 실패.",
|
||||||
"remoteExitNodeManageRemoteExitNodes": "원격 노드",
|
"remoteExitNodeManageRemoteExitNodes": "원격 노드",
|
||||||
"remoteExitNodeDescription": "Self-host one or more remote nodes to extend your network connectivity and reduce reliance on the cloud",
|
"remoteExitNodeDescription": "네트워크 연결성을 확장하고 클라우드 의존도를 줄이기 위해 하나 이상의 원격 노드를 자체 호스트하십시오.",
|
||||||
"remoteExitNodes": "노드",
|
"remoteExitNodes": "노드",
|
||||||
"searchRemoteExitNodes": "노드 검색...",
|
"searchRemoteExitNodes": "노드 검색...",
|
||||||
"remoteExitNodeAdd": "노드 추가",
|
"remoteExitNodeAdd": "노드 추가",
|
||||||
"remoteExitNodeErrorDelete": "노드 삭제 오류",
|
"remoteExitNodeErrorDelete": "노드 삭제 오류",
|
||||||
"remoteExitNodeQuestionRemove": "조직에서 노드 {selectedNode}를 제거하시겠습니까?",
|
"remoteExitNodeQuestionRemove": "조직에서 노드를 제거하시겠습니까?",
|
||||||
"remoteExitNodeMessageRemove": "한 번 제거되면 더 이상 노드에 접근할 수 없습니다.",
|
"remoteExitNodeMessageRemove": "한 번 제거되면 더 이상 노드에 접근할 수 없습니다.",
|
||||||
"remoteExitNodeMessageConfirm": "확인을 위해 아래에 노드 이름을 입력해 주세요.",
|
|
||||||
"remoteExitNodeConfirmDelete": "노드 삭제 확인",
|
"remoteExitNodeConfirmDelete": "노드 삭제 확인",
|
||||||
"remoteExitNodeDelete": "노드 삭제",
|
"remoteExitNodeDelete": "노드 삭제",
|
||||||
"sidebarRemoteExitNodes": "원격 노드",
|
"sidebarRemoteExitNodes": "원격 노드",
|
||||||
@@ -1733,7 +1770,49 @@
|
|||||||
"resourceExposePortsEditFile": "파일 편집: docker-compose.yml",
|
"resourceExposePortsEditFile": "파일 편집: docker-compose.yml",
|
||||||
"emailVerificationRequired": "이메일 인증이 필요합니다. 이 단계를 완료하려면 {dashboardUrl}/auth/login 통해 다시 로그인하십시오. 그런 다음 여기로 돌아오세요.",
|
"emailVerificationRequired": "이메일 인증이 필요합니다. 이 단계를 완료하려면 {dashboardUrl}/auth/login 통해 다시 로그인하십시오. 그런 다음 여기로 돌아오세요.",
|
||||||
"twoFactorSetupRequired": "이중 인증 설정이 필요합니다. 이 단계를 완료하려면 {dashboardUrl}/auth/login 통해 다시 로그인하십시오. 그런 다음 여기로 돌아오세요.",
|
"twoFactorSetupRequired": "이중 인증 설정이 필요합니다. 이 단계를 완료하려면 {dashboardUrl}/auth/login 통해 다시 로그인하십시오. 그런 다음 여기로 돌아오세요.",
|
||||||
|
"additionalSecurityRequired": "추가 보안 필요",
|
||||||
|
"organizationRequiresAdditionalSteps": "이 조직은 자원에 접근하기 전에 추가 보안 단계를 요구합니다.",
|
||||||
|
"completeTheseSteps": "이 단계를 완료하십시오",
|
||||||
|
"enableTwoFactorAuthentication": "이중 인증 활성화",
|
||||||
|
"completeSecuritySteps": "보안 단계 완료",
|
||||||
|
"securitySettings": "보안 설정",
|
||||||
|
"securitySettingsDescription": "조직에 대한 보안 정책을 구성합니다",
|
||||||
|
"requireTwoFactorForAllUsers": "모든 사용자에 대해 이중 인증 요구",
|
||||||
|
"requireTwoFactorDescription": "활성화되면, 이 조직의 모든 내부 사용자는 조직에 접근하기 위해 이중 인증을 활성화해야 합니다.",
|
||||||
|
"requireTwoFactorDisabledDescription": "이 기능을 사용하려면 유효한 라이선스(Enterprise) 또는 활성 구독(SaaS)가 필요합니다.",
|
||||||
|
"requireTwoFactorCannotEnableDescription": "모든 사용자에게 강제하기 전에 계정에 대해 이중 인증을 활성화해야 합니다",
|
||||||
|
"maxSessionLength": "최대 세션 길이",
|
||||||
|
"maxSessionLengthDescription": "사용자 세션의 최대 지속 시간을 설정합니다. 이 시간이 지나면 사용자는 다시 인증해야 합니다.",
|
||||||
|
"maxSessionLengthDisabledDescription": "이 기능을 사용하려면 유효한 라이선스(Enterprise) 또는 활성 구독(SaaS)가 필요합니다.",
|
||||||
|
"selectSessionLength": "세션 길이 선택",
|
||||||
|
"unenforced": "강제되지 않음",
|
||||||
|
"1Hour": "1 시간",
|
||||||
|
"3Hours": "3 시간",
|
||||||
|
"6Hours": "6 시간",
|
||||||
|
"12Hours": "12 시간",
|
||||||
|
"1DaySession": "1 일",
|
||||||
|
"3Days": "3 일",
|
||||||
|
"7Days": "7 일",
|
||||||
|
"14Days": "14 일",
|
||||||
|
"30DaysSession": "30 일",
|
||||||
|
"90DaysSession": "90 일",
|
||||||
|
"180DaysSession": "180 일",
|
||||||
|
"passwordExpiryDays": "비밀번호 만료",
|
||||||
|
"editPasswordExpiryDescription": "사용자가 비밀번호를 변경해야 하는 날 수를 설정합니다.",
|
||||||
|
"selectPasswordExpiry": "비밀번호 만료 선택",
|
||||||
|
"30Days": "30 일",
|
||||||
|
"1Day": "1 일",
|
||||||
|
"60Days": "60 일",
|
||||||
|
"90Days": "90 일",
|
||||||
|
"180Days": "180 일",
|
||||||
|
"1Year": "1 년",
|
||||||
|
"subscriptionBadge": "구독 필요",
|
||||||
|
"securityPolicyChangeWarning": "보안 정책 변경 경고",
|
||||||
|
"securityPolicyChangeDescription": "보안 정책 설정을 변경하려고 합니다. 저장 후, 정책 업데이트를 준수하기 위해 다시 인증해야 할 수도 있습니다. 규정을 준수하지 않는 모든 사용자도 다시 인증해야 합니다.",
|
||||||
|
"securityPolicyChangeConfirmMessage": "확인합니다",
|
||||||
|
"securityPolicyChangeWarningText": "이 작업은 조직의 모든 사용자에게 영향을 미칩니다",
|
||||||
"authPageErrorUpdateMessage": "인증 페이지 설정을 업데이트하는 동안 오류가 발생했습니다",
|
"authPageErrorUpdateMessage": "인증 페이지 설정을 업데이트하는 동안 오류가 발생했습니다",
|
||||||
|
"authPageErrorUpdate": "인증 페이지를 업데이트할 수 없습니다",
|
||||||
"authPageUpdated": "인증 페이지가 성공적으로 업데이트되었습니다",
|
"authPageUpdated": "인증 페이지가 성공적으로 업데이트되었습니다",
|
||||||
"healthCheckNotAvailable": "로컬",
|
"healthCheckNotAvailable": "로컬",
|
||||||
"rewritePath": "경로 재작성",
|
"rewritePath": "경로 재작성",
|
||||||
@@ -1745,153 +1824,261 @@
|
|||||||
"resourceHeaderAuthRemoveDescription": "헤더 인증이 성공적으로 제거되었습니다.",
|
"resourceHeaderAuthRemoveDescription": "헤더 인증이 성공적으로 제거되었습니다.",
|
||||||
"resourceErrorHeaderAuthRemove": "헤더 인증 제거 실패",
|
"resourceErrorHeaderAuthRemove": "헤더 인증 제거 실패",
|
||||||
"resourceErrorHeaderAuthRemoveDescription": "리소스의 헤더 인증을 제거할 수 없습니다.",
|
"resourceErrorHeaderAuthRemoveDescription": "리소스의 헤더 인증을 제거할 수 없습니다.",
|
||||||
"resourceHeaderAuthProtectionEnabled": "Header Authentication Enabled",
|
"resourceHeaderAuthProtectionEnabled": "헤더 인증 활성화됨",
|
||||||
"resourceHeaderAuthProtectionDisabled": "Header Authentication Disabled",
|
"resourceHeaderAuthProtectionDisabled": "헤더 인증 비활성화됨",
|
||||||
"headerAuthRemove": "Remove Header Auth",
|
"headerAuthRemove": "헤더 인증 삭제",
|
||||||
"headerAuthAdd": "Add Header Auth",
|
"headerAuthAdd": "헤더 인증 추가",
|
||||||
"resourceErrorHeaderAuthSetup": "헤더 인증 설정 실패",
|
"resourceErrorHeaderAuthSetup": "헤더 인증 설정 실패",
|
||||||
"resourceErrorHeaderAuthSetupDescription": "리소스의 헤더 인증을 설정할 수 없습니다.",
|
"resourceErrorHeaderAuthSetupDescription": "리소스의 헤더 인증을 설정할 수 없습니다.",
|
||||||
"resourceHeaderAuthSetup": "헤더 인증이 성공적으로 설정되었습니다.",
|
"resourceHeaderAuthSetup": "헤더 인증이 성공적으로 설정되었습니다.",
|
||||||
"resourceHeaderAuthSetupDescription": "헤더 인증이 성공적으로 설정되었습니다.",
|
"resourceHeaderAuthSetupDescription": "헤더 인증이 성공적으로 설정되었습니다.",
|
||||||
"resourceHeaderAuthSetupTitle": "헤더 인증 설정",
|
"resourceHeaderAuthSetupTitle": "헤더 인증 설정",
|
||||||
"resourceHeaderAuthSetupTitleDescription": "Set the basic auth credentials (username and password) to protect this resource with HTTP Header Authentication. Access it using the format https://username:password@resource.example.com",
|
"resourceHeaderAuthSetupTitleDescription": "이 리소스를 HTTP 헤더 인증으로 보호하기 위해 기본 인증 자격 증명(사용자이름 및 비밀번호)을 설정합니다. 다음과 같은 형식으로 액세스하세요 https://사용자이름:비밀번호@resource.example.com",
|
||||||
"resourceHeaderAuthSubmit": "헤더 인증 설정",
|
"resourceHeaderAuthSubmit": "헤더 인증 설정",
|
||||||
"actionSetResourceHeaderAuth": "헤더 인증 설정",
|
"actionSetResourceHeaderAuth": "헤더 인증 설정",
|
||||||
"enterpriseEdition": "Enterprise Edition",
|
"enterpriseEdition": "엔터프라이즈 에디션",
|
||||||
"unlicensed": "Unlicensed",
|
"unlicensed": "라이선스 없음",
|
||||||
"beta": "Beta",
|
"beta": "베타",
|
||||||
"manageClients": "Manage Clients",
|
"manageClients": "클라이언트 관리",
|
||||||
"manageClientsDescription": "Clients are devices that can connect to your sites",
|
"manageClientsDescription": "클라이언트는 당신의 사이트에 연결할 수 있는 디바이스입니다.",
|
||||||
"licenseTableValidUntil": "Valid Until",
|
"licenseTableValidUntil": "유효 기한",
|
||||||
"saasLicenseKeysSettingsTitle": "Enterprise Licenses",
|
"saasLicenseKeysSettingsTitle": "엔터프라이즈 라이선스",
|
||||||
"saasLicenseKeysSettingsDescription": "Generate and manage Enterprise license keys for self-hosted Pangolin instances",
|
"saasLicenseKeysSettingsDescription": "자체 호스팅된 Pangolin 인스턴스를 위한 엔터프라이즈 라이선스 키를 생성하고 관리합니다.",
|
||||||
"sidebarEnterpriseLicenses": "Licenses",
|
"sidebarEnterpriseLicenses": "라이선스",
|
||||||
"generateLicenseKey": "Generate License Key",
|
"generateLicenseKey": "라이선스 키 생성",
|
||||||
"generateLicenseKeyForm": {
|
"generateLicenseKeyForm": {
|
||||||
"validation": {
|
"validation": {
|
||||||
"emailRequired": "Please enter a valid email address",
|
"emailRequired": "유효한 이메일 주소를 입력하세요",
|
||||||
"useCaseTypeRequired": "Please select a use case type",
|
"useCaseTypeRequired": "사용 사례 유형을 선택하세요",
|
||||||
"firstNameRequired": "First name is required",
|
"firstNameRequired": "이름은 필수입니다.",
|
||||||
"lastNameRequired": "Last name is required",
|
"lastNameRequired": "성은 필수입니다.",
|
||||||
"primaryUseRequired": "Please describe your primary use",
|
"primaryUseRequired": "주요 용도를 설명하세요",
|
||||||
"jobTitleRequiredBusiness": "Job title is required for business use",
|
"jobTitleRequiredBusiness": "사업용 직책은 필수입니다.",
|
||||||
"industryRequiredBusiness": "Industry is required for business use",
|
"industryRequiredBusiness": "사업용 산업은 필수입니다.",
|
||||||
"stateProvinceRegionRequired": "State/Province/Region is required",
|
"stateProvinceRegionRequired": "주/도/지역이 필수입니다.",
|
||||||
"postalZipCodeRequired": "Postal/ZIP Code is required",
|
"postalZipCodeRequired": "우편번호/ZIP 코드가 필수입니다.",
|
||||||
"companyNameRequiredBusiness": "Company name is required for business use",
|
"companyNameRequiredBusiness": "사업용 회사 이름은 필수입니다.",
|
||||||
"countryOfResidenceRequiredBusiness": "Country of residence is required for business use",
|
"countryOfResidenceRequiredBusiness": "사업용 거주 국가는 필수입니다.",
|
||||||
"countryRequiredPersonal": "Country is required for personal use",
|
"countryRequiredPersonal": "개인용 국가가 필수입니다.",
|
||||||
"agreeToTermsRequired": "You must agree to the terms",
|
"agreeToTermsRequired": "약관에 동의해야 합니다.",
|
||||||
"complianceConfirmationRequired": "You must confirm compliance with the Fossorial Commercial License"
|
"complianceConfirmationRequired": "Fossorial 상용 라이선스를 준수함을 확인해야 합니다."
|
||||||
},
|
},
|
||||||
"useCaseOptions": {
|
"useCaseOptions": {
|
||||||
"personal": {
|
"personal": {
|
||||||
"title": "Personal Use",
|
"title": "개인 용도",
|
||||||
"description": "For individual, non-commercial use such as learning, personal projects, or experimentation."
|
"description": "학습, 개인 프로젝트 또는 실험과 같은 개인, 비상업적 용도로 사용합니다."
|
||||||
},
|
},
|
||||||
"business": {
|
"business": {
|
||||||
"title": "Business Use",
|
"title": "사업 용도",
|
||||||
"description": "For use within organizations, companies, or commercial or revenue-generating activities."
|
"description": "조직, 회사 또는 수익 창출 활동 내에서 사용됩니다."
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"steps": {
|
"steps": {
|
||||||
"emailLicenseType": {
|
"emailLicenseType": {
|
||||||
"title": "Email & License Type",
|
"title": "이메일 및 라이선스 유형",
|
||||||
"description": "Enter your email and choose your license type"
|
"description": "이메일을 입력하고 라이선스 유형을 선택하세요"
|
||||||
},
|
},
|
||||||
"personalInformation": {
|
"personalInformation": {
|
||||||
"title": "Personal Information",
|
"title": "개인 정보",
|
||||||
"description": "Tell us about yourself"
|
"description": "자기소개를 해주세요"
|
||||||
},
|
},
|
||||||
"contactInformation": {
|
"contactInformation": {
|
||||||
"title": "Contact Information",
|
"title": "연락처 정보",
|
||||||
"description": "Your contact details"
|
"description": "당신의 연락처 정보"
|
||||||
},
|
},
|
||||||
"termsGenerate": {
|
"termsGenerate": {
|
||||||
"title": "Terms & Generate",
|
"title": "약관 및 생성",
|
||||||
"description": "Review and accept terms to generate your license"
|
"description": "라이선스를 생성하기 위해 약관을 검토하고 수락하세요"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"alerts": {
|
"alerts": {
|
||||||
"commercialUseDisclosure": {
|
"commercialUseDisclosure": {
|
||||||
"title": "Usage Disclosure",
|
"title": "사용 공개",
|
||||||
"description": "Select the license tier that accurately reflects your intended use. The Personal License permits free use of the Software for individual, non-commercial or small-scale commercial activities with annual gross revenue under $100,000 USD. Any use beyond these limits — including use within a business, organization, or other revenue-generating environment — requires a valid Enterprise License and payment of the applicable licensing fee. All users, whether Personal or Enterprise, must comply with the Fossorial Commercial License Terms."
|
"description": "당신의 의도된 사용에 정확히 맞는 라이선스 등급을 선택하세요. 개인 라이선스는 연간 총 수익 100,000 USD 이하의 개인, 비상업적 또는 소규모 상업 활동을 위한 소프트웨어의 무료 사용을 허용합니다. 이러한 제한을 넘는 모든 사용 — 비즈니스, 조직 또는 기타 수익 창출 환경 내에서의 사용 — 은 유효한 엔터프라이즈 라이선스 및 해당 라이선스 수수료의 지불이 필요합니다. 개인 또는 기업 사용자는 모두 Fossorial 상용 라이선스 조건을 준수해야 합니다."
|
||||||
},
|
},
|
||||||
"trialPeriodInformation": {
|
"trialPeriodInformation": {
|
||||||
"title": "Trial Period Information",
|
"title": "시험 기간 정보",
|
||||||
"description": "This License Key enables Enterprise features for a 7-day evaluation period. Continued access to Paid Features beyond the evaluation period requires activation under a valid Personal or Enterprise License. For Enterprise licensing, contact sales@fossorial.io."
|
"description": "이 라이선스 키는 엔터프라이즈 기능을 평가판 기간 동안 7일 동안 활성화합니다. 평가 기간 이후 유료 기능에 대한 계속된 액세스는 유효한 개인 또는 엔터프라이즈 라이선스 하에서 활성화가 필요합니다. 엔터프라이즈 라이선스에 대한 정보는 sales@pangolin.net에 문의하세요."
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"form": {
|
"form": {
|
||||||
"useCaseQuestion": "Are you using Pangolin for personal or business use?",
|
"useCaseQuestion": "개인 또는 사업용으로 Pangolin을 사용하시나요?",
|
||||||
"firstName": "First Name",
|
"firstName": "이름",
|
||||||
"lastName": "Last Name",
|
"lastName": "성",
|
||||||
"jobTitle": "Job Title",
|
"jobTitle": "직책",
|
||||||
"primaryUseQuestion": "What do you primarily plan to use Pangolin for?",
|
"primaryUseQuestion": "Pangolin을 주로 무엇에 사용하려고 계획하시나요?",
|
||||||
"industryQuestion": "What is your industry?",
|
"industryQuestion": "당신의 산업은 무엇입니까?",
|
||||||
"prospectiveUsersQuestion": "How many prospective users do you expect to have?",
|
"prospectiveUsersQuestion": "예상하는 잠재적 사용자는 몇 명입니까?",
|
||||||
"prospectiveSitesQuestion": "How many prospective sites (tunnels) do you expect to have?",
|
"prospectiveSitesQuestion": "예상하는 잠재적 사이트(터널)는 몇 개입니까?",
|
||||||
"companyName": "Company name",
|
"companyName": "회사 이름",
|
||||||
"countryOfResidence": "Country of residence",
|
"countryOfResidence": "거주 국가",
|
||||||
"stateProvinceRegion": "State / Province / Region",
|
"stateProvinceRegion": "주 / 도 / 지역",
|
||||||
"postalZipCode": "Postal / ZIP Code",
|
"postalZipCode": "우편번호 / ZIP 코드",
|
||||||
"companyWebsite": "Company website",
|
"companyWebsite": "회사 웹사이트",
|
||||||
"companyPhoneNumber": "Company phone number",
|
"companyPhoneNumber": "회사 전화번호",
|
||||||
"country": "Country",
|
"country": "국가",
|
||||||
"phoneNumberOptional": "Phone number (optional)",
|
"phoneNumberOptional": "전화번호 (선택 항목)",
|
||||||
"complianceConfirmation": "I confirm that I am in compliance with the Fossorial Commercial License and that reporting inaccurate information or misidentifying use of the product is a violation of the license."
|
"complianceConfirmation": "제가 제공한 정보가 정확하고 Fossorial 상용 라이선스를 준수하는지 확인합니다. 부정확한 정보를 보고하거나 제품 사용을 실수로 식별하는 것은 라이선스 위반이며, 키가 취소될 수 있습니다."
|
||||||
},
|
},
|
||||||
"buttons": {
|
"buttons": {
|
||||||
"close": "Close",
|
"close": "닫기",
|
||||||
"previous": "Previous",
|
"previous": "이전",
|
||||||
"next": "Next",
|
"next": "다음",
|
||||||
"generateLicenseKey": "Generate License Key"
|
"generateLicenseKey": "라이선스 키 생성"
|
||||||
},
|
},
|
||||||
"toasts": {
|
"toasts": {
|
||||||
"success": {
|
"success": {
|
||||||
"title": "License key generated successfully",
|
"title": "라이선스 키가 성공적으로 생성되었습니다",
|
||||||
"description": "Your license key has been generated and is ready to use."
|
"description": "당신의 라이선스 키가 생성되었으며 사용 준비가 되었습니다."
|
||||||
},
|
},
|
||||||
"error": {
|
"error": {
|
||||||
"title": "Failed to generate license key",
|
"title": "라이선스 키 생성에 실패했습니다",
|
||||||
"description": "An error occurred while generating the license key."
|
"description": "라이선스 키를 생성하는 동안 오류가 발생했습니다."
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"priority": "우선순위",
|
"priority": "우선순위",
|
||||||
"priorityDescription": "우선 순위가 높은 경로가 먼저 평가됩니다. 우선 순위 = 100은 자동 정렬(시스템 결정)이 의미합니다. 수동 우선 순위를 적용하려면 다른 숫자를 사용하세요.",
|
"priorityDescription": "우선 순위가 높은 경로가 먼저 평가됩니다. 우선 순위 = 100은 자동 정렬(시스템 결정)이 의미합니다. 수동 우선 순위를 적용하려면 다른 숫자를 사용하세요.",
|
||||||
"instanceName": "Instance Name",
|
"instanceName": "인스턴스 이름",
|
||||||
"pathMatchModalTitle": "Configure Path Matching",
|
"pathMatchModalTitle": "경로 매칭 설정",
|
||||||
"pathMatchModalDescription": "Set up how incoming requests should be matched based on their path.",
|
"pathMatchModalDescription": "경로별로 들어오는 요청을 어떻게 매칭할지 설정합니다.",
|
||||||
"pathMatchType": "Match Type",
|
"pathMatchType": "일치 유형",
|
||||||
"pathMatchPrefix": "Prefix",
|
"pathMatchPrefix": "접두사",
|
||||||
"pathMatchExact": "Exact",
|
"pathMatchExact": "정확하게",
|
||||||
"pathMatchRegex": "Regex",
|
"pathMatchRegex": "정규 표현식",
|
||||||
"pathMatchValue": "Path Value",
|
"pathMatchValue": "경로 값",
|
||||||
"clear": "Clear",
|
"clear": "지우기",
|
||||||
"saveChanges": "Save Changes",
|
"saveChanges": "변경 사항 저장",
|
||||||
"pathMatchRegexPlaceholder": "^/api/.*",
|
"pathMatchRegexPlaceholder": "^/api/.*",
|
||||||
"pathMatchDefaultPlaceholder": "/path",
|
"pathMatchDefaultPlaceholder": "/경로",
|
||||||
"pathMatchPrefixHelp": "Example: /api matches /api, /api/users, etc.",
|
"pathMatchPrefixHelp": "예: /api 는 /api, /api/users 등을 매칭합니다.",
|
||||||
"pathMatchExactHelp": "Example: /api matches only /api",
|
"pathMatchExactHelp": "예: /api 는 /api 만 매칭합니다.",
|
||||||
"pathMatchRegexHelp": "Example: ^/api/.* matches /api/anything",
|
"pathMatchRegexHelp": "예: ^/api/.* 는 /api/anything를 매칭합니다",
|
||||||
"pathRewriteModalTitle": "Configure Path Rewriting",
|
"pathRewriteModalTitle": "경로 재작성 설정",
|
||||||
"pathRewriteModalDescription": "Transform the matched path before forwarding to the target.",
|
"pathRewriteModalDescription": "대상으로 전달하기 전에 매칭된 경로를 변환합니다.",
|
||||||
"pathRewriteType": "Rewrite Type",
|
"pathRewriteType": "재작성 유형",
|
||||||
"pathRewritePrefixOption": "Prefix - Replace prefix",
|
"pathRewritePrefixOption": "접두사 - 접두사 대체",
|
||||||
"pathRewriteExactOption": "Exact - Replace entire path",
|
"pathRewriteExactOption": "정확 - 전체 경로 대체",
|
||||||
"pathRewriteRegexOption": "Regex - Pattern replacement",
|
"pathRewriteRegexOption": "정규 표현식 - 패턴 대체",
|
||||||
"pathRewriteStripPrefixOption": "Strip Prefix - Remove prefix",
|
"pathRewriteStripPrefixOption": "접두사 제거 - 접두사 삭제",
|
||||||
"pathRewriteValue": "Rewrite Value",
|
"pathRewriteValue": "재작성 값",
|
||||||
"pathRewriteRegexPlaceholder": "/new/$1",
|
"pathRewriteRegexPlaceholder": "/new/$1",
|
||||||
"pathRewriteDefaultPlaceholder": "/new-path",
|
"pathRewriteDefaultPlaceholder": "/새-경로",
|
||||||
"pathRewritePrefixHelp": "Replace the matched prefix with this value",
|
"pathRewritePrefixHelp": "일치하는 접두사를 이 값으로 대체합니다",
|
||||||
"pathRewriteExactHelp": "Replace the entire path with this value when the path matches exactly",
|
"pathRewriteExactHelp": "경로가 정확히 일치할 때 전체 경로를 이 값으로 대체합니다",
|
||||||
"pathRewriteRegexHelp": "Use capture groups like $1, $2 for replacement",
|
"pathRewriteRegexHelp": "$1, $2와 같은 캡처 그룹을 사용하여 대체",
|
||||||
"pathRewriteStripPrefixHelp": "Leave empty to strip prefix or provide new prefix",
|
"pathRewriteStripPrefixHelp": "접두사를 제거하거나 새 접두사를 제공하려면 비워 둡니다",
|
||||||
"pathRewritePrefix": "Prefix",
|
"pathRewritePrefix": "접두사",
|
||||||
"pathRewriteExact": "Exact",
|
"pathRewriteExact": "정확하게",
|
||||||
"pathRewriteRegex": "Regex",
|
"pathRewriteRegex": "정규 표현식",
|
||||||
"pathRewriteStrip": "Strip",
|
"pathRewriteStrip": "제거",
|
||||||
"pathRewriteStripLabel": "strip"
|
"pathRewriteStripLabel": "제거",
|
||||||
|
"sidebarEnableEnterpriseLicense": "엔터프라이즈 라이선스 활성화",
|
||||||
|
"cannotbeUndone": "이 작업은 되돌릴 수 없습니다.",
|
||||||
|
"toConfirm": "확인하려면",
|
||||||
|
"deleteClientQuestion": "고객을 사이트와 조직에서 제거하시겠습니까?",
|
||||||
|
"clientMessageRemove": "제거되면 클라이언트는 사이트에 더 이상 연결할 수 없습니다.",
|
||||||
|
"sidebarLogs": "로그",
|
||||||
|
"request": "요청",
|
||||||
|
"logs": "로그",
|
||||||
|
"logsSettingsDescription": "이 조직에서 수집된 로그를 모니터링합니다",
|
||||||
|
"searchLogs": "로그 검색...",
|
||||||
|
"action": "작업",
|
||||||
|
"actor": "행위자",
|
||||||
|
"timestamp": "타임스탬프",
|
||||||
|
"accessLogs": "접근 로그",
|
||||||
|
"exportCsv": "CSV 내보내기",
|
||||||
|
"actorId": "행위자 ID",
|
||||||
|
"allowedByRule": "룰에 의해 허용됨",
|
||||||
|
"allowedNoAuth": "인증 없음 허용됨",
|
||||||
|
"validAccessToken": "유효한 접근 토큰",
|
||||||
|
"validHeaderAuth": "유효한 헤더 인증",
|
||||||
|
"validPincode": "유효한 핀코드",
|
||||||
|
"validPassword": "유효한 비밀번호",
|
||||||
|
"validEmail": "유효한 이메일",
|
||||||
|
"validSSO": "유효한 SSO",
|
||||||
|
"resourceBlocked": "리소스 차단됨",
|
||||||
|
"droppedByRule": "룰에 의해 드롭됨",
|
||||||
|
"noSessions": "세션 없음",
|
||||||
|
"temporaryRequestToken": "임시 요청 토큰",
|
||||||
|
"noMoreAuthMethods": "유효한 인증 없음",
|
||||||
|
"ip": "IP",
|
||||||
|
"reason": "이유",
|
||||||
|
"requestLogs": "요청 로그",
|
||||||
|
"host": "호스트",
|
||||||
|
"location": "위치",
|
||||||
|
"actionLogs": "작업 로그",
|
||||||
|
"sidebarLogsRequest": "요청 로그",
|
||||||
|
"sidebarLogsAccess": "접근 로그",
|
||||||
|
"sidebarLogsAction": "작업 로그",
|
||||||
|
"logRetention": "로그 보관",
|
||||||
|
"logRetentionDescription": "다양한 유형의 로그를 이 조직에 대해 얼마나 오래 보관할지 관리하거나 비활성화합니다",
|
||||||
|
"requestLogsDescription": "이 조직의 자원에 대한 상세한 요청 로그를 봅니다",
|
||||||
|
"logRetentionRequestLabel": "요청 로그 보관",
|
||||||
|
"logRetentionRequestDescription": "요청 로그를 얼마나 오래 보관할지",
|
||||||
|
"logRetentionAccessLabel": "접근 로그 보관",
|
||||||
|
"logRetentionAccessDescription": "접근 로그를 얼마나 오래 보관할지",
|
||||||
|
"logRetentionActionLabel": "작업 로그 보관",
|
||||||
|
"logRetentionActionDescription": "작업 로그를 얼마나 오래 보관할지",
|
||||||
|
"logRetentionDisabled": "비활성화됨",
|
||||||
|
"logRetention3Days": "3 일",
|
||||||
|
"logRetention7Days": "7 일",
|
||||||
|
"logRetention14Days": "14 일",
|
||||||
|
"logRetention30Days": "30 일",
|
||||||
|
"logRetention90Days": "90 일",
|
||||||
|
"logRetentionForever": "영구",
|
||||||
|
"actionLogsDescription": "이 조직에서 수행된 작업의 기록을 봅니다",
|
||||||
|
"accessLogsDescription": "이 조직의 자원에 대한 접근 인증 요청을 확인합니다",
|
||||||
|
"licenseRequiredToUse": "이 기능을 사용하려면 Enterprise 라이선스가 필요합니다.",
|
||||||
|
"certResolver": "인증서 해결사",
|
||||||
|
"certResolverDescription": "이 리소스에 사용할 인증서 해결사를 선택하세요.",
|
||||||
|
"selectCertResolver": "인증서 해결사 선택",
|
||||||
|
"enterCustomResolver": "사용자 정의 해결사 입력",
|
||||||
|
"preferWildcardCert": "와일드카드 인증서 선호",
|
||||||
|
"unverified": "검증되지 않음",
|
||||||
|
"domainSetting": "도메인 설정",
|
||||||
|
"domainSettingDescription": "도메인에 대한 설정을 구성하세요.",
|
||||||
|
"preferWildcardCertDescription": "와일드카드 인증서를 생성하려고 시도합니다 (올바르게 구성된 인증서 해결사가 필요합니다).",
|
||||||
|
"recordName": "레코드 이름",
|
||||||
|
"auto": "자동",
|
||||||
|
"TTL": "TTL",
|
||||||
|
"howToAddRecords": "레코드 추가 방법",
|
||||||
|
"dnsRecord": "DNS 레코드",
|
||||||
|
"required": "필수",
|
||||||
|
"domainSettingsUpdated": "도메인 설정이 성공적으로 업데이트되었습니다",
|
||||||
|
"orgOrDomainIdMissing": "조직 ID 또는 도메인 ID가 누락되었습니다",
|
||||||
|
"loadingDNSRecords": "DNS 레코드를 로드하는 중...",
|
||||||
|
"olmUpdateAvailableInfo": "올름의 새 버전이 이용 가능합니다. 최상의 경험을 위해 최신 버전으로 업데이트하세요.",
|
||||||
|
"client": "클라이언트",
|
||||||
|
"proxyProtocol": "프록시 프로토콜 설정",
|
||||||
|
"proxyProtocolDescription": "프록시 프로토콜을 구성하여 TCP/UDP 서비스에 대한 클라이언트 IP 주소를 보존하십시오.",
|
||||||
|
"enableProxyProtocol": "프록시 프로토콜 활성화",
|
||||||
|
"proxyProtocolInfo": "TCP/UDP 백엔드의 클라이언트 IP 주소를 보존합니다",
|
||||||
|
"proxyProtocolVersion": "프록시 프로토콜 버전",
|
||||||
|
"version1": " 버전 1 (추천)",
|
||||||
|
"version2": "버전 2",
|
||||||
|
"versionDescription": "버전 1은 텍스트 기반으로 널리 지원됩니다. 버전 2는 이진 기반으로 더 효율적이지만 호환성이 낮습니다.",
|
||||||
|
"warning": "경고",
|
||||||
|
"proxyProtocolWarning": "백엔드 애플리케이션이 프록시 프로토콜 연결을 허용하도록 구성되어야 합니다. 백엔드가 프록시 프로토콜을 지원하지 않으면, 이를 활성화하면 모든 연결이 끊어집니다. 트래픽에서 온 프록시 프로토콜 헤더를 백엔드가 신뢰하도록 구성하십시오.",
|
||||||
|
"restarting": "재시작 중...",
|
||||||
|
"manual": "수동",
|
||||||
|
"messageSupport": "지원 메시지",
|
||||||
|
"supportNotAvailableTitle": "지원 불가",
|
||||||
|
"supportNotAvailableDescription": "현재 지원을 받을 수 없습니다. support@pangolin.net으로 이메일을 보낼 수 있습니다.",
|
||||||
|
"supportRequestSentTitle": "지원 요청 전송 완료",
|
||||||
|
"supportRequestSentDescription": "메시지가 성공적으로 전송되었습니다.",
|
||||||
|
"supportRequestFailedTitle": "요청 전송 실패",
|
||||||
|
"supportRequestFailedDescription": "지원 요청을 보내는 중 오류가 발생했습니다.",
|
||||||
|
"supportSubjectRequired": "제목은 필수입니다",
|
||||||
|
"supportSubjectMaxLength": "제목은 255자 이내여야 합니다",
|
||||||
|
"supportMessageRequired": "메시지는 필수입니다",
|
||||||
|
"supportReplyTo": "회신",
|
||||||
|
"supportSubject": "제목",
|
||||||
|
"supportSubjectPlaceholder": "제목 입력",
|
||||||
|
"supportMessage": "메시지",
|
||||||
|
"supportMessagePlaceholder": "메시지를 입력하십시오",
|
||||||
|
"supportSending": "발송 중...",
|
||||||
|
"supportSend": "보내기",
|
||||||
|
"supportMessageSent": "메시지 전송 완료!",
|
||||||
|
"supportWillContact": "곧 연락드리겠습니다!"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -47,9 +47,8 @@
|
|||||||
"edit": "Rediger",
|
"edit": "Rediger",
|
||||||
"siteConfirmDelete": "Bekreft Sletting av Område",
|
"siteConfirmDelete": "Bekreft Sletting av Område",
|
||||||
"siteDelete": "Slett Område",
|
"siteDelete": "Slett Område",
|
||||||
"siteMessageRemove": "Når området slettes, vil det ikke lenger være tilgjengelig. Alle ressurser og mål assosiert med området vil også bli slettet.",
|
"siteMessageRemove": "Når nettstedet er fjernet, vil det ikke lenger være tilgjengelig. Alle målene for nettstedet vil også bli fjernet.",
|
||||||
"siteMessageConfirm": "For å bekrefte, vennligst skriv inn navnet i området nedenfor.",
|
"siteQuestionRemove": "Er du sikker på at du vil fjerne nettstedet fra organisasjonen?",
|
||||||
"siteQuestionRemove": "Er du sikker på at du vil slette området {selectedSite} fra organisasjonen?",
|
|
||||||
"siteManageSites": "Administrer Områder",
|
"siteManageSites": "Administrer Områder",
|
||||||
"siteDescription": "Tillat tilkobling til nettverket ditt gjennom sikre tunneler",
|
"siteDescription": "Tillat tilkobling til nettverket ditt gjennom sikre tunneler",
|
||||||
"siteCreate": "Opprett område",
|
"siteCreate": "Opprett område",
|
||||||
@@ -96,7 +95,7 @@
|
|||||||
"siteWgDescription": "Bruk hvilken som helst WireGuard-klient for å etablere en tunnel. Manuell NAT-oppsett kreves.",
|
"siteWgDescription": "Bruk hvilken som helst WireGuard-klient for å etablere en tunnel. Manuell NAT-oppsett kreves.",
|
||||||
"siteWgDescriptionSaas": "Bruk hvilken som helst WireGuard-klient for å etablere en tunnel. Manuell NAT-oppsett er nødvendig. FUNGERER KUN PÅ SELVHOSTEDE NODER",
|
"siteWgDescriptionSaas": "Bruk hvilken som helst WireGuard-klient for å etablere en tunnel. Manuell NAT-oppsett er nødvendig. FUNGERER KUN PÅ SELVHOSTEDE NODER",
|
||||||
"siteLocalDescription": "Kun lokale ressurser. Ingen tunnelering.",
|
"siteLocalDescription": "Kun lokale ressurser. Ingen tunnelering.",
|
||||||
"siteLocalDescriptionSaas": "Local resources only. No tunneling. Only available on remote nodes.",
|
"siteLocalDescriptionSaas": "Lokale ressurser. Ingen tunnelering. Bare tilgjengelig på eksterne noder.",
|
||||||
"siteSeeAll": "Se alle områder",
|
"siteSeeAll": "Se alle områder",
|
||||||
"siteTunnelDescription": "Bestem hvordan du vil koble deg til ditt område",
|
"siteTunnelDescription": "Bestem hvordan du vil koble deg til ditt område",
|
||||||
"siteNewtCredentials": "Newt påloggingsinformasjon",
|
"siteNewtCredentials": "Newt påloggingsinformasjon",
|
||||||
@@ -154,8 +153,7 @@
|
|||||||
"protected": "Beskyttet",
|
"protected": "Beskyttet",
|
||||||
"notProtected": "Ikke beskyttet",
|
"notProtected": "Ikke beskyttet",
|
||||||
"resourceMessageRemove": "Når den er fjernet, vil ressursen ikke lenger være tilgjengelig. Alle mål knyttet til ressursen vil også bli fjernet.",
|
"resourceMessageRemove": "Når den er fjernet, vil ressursen ikke lenger være tilgjengelig. Alle mål knyttet til ressursen vil også bli fjernet.",
|
||||||
"resourceMessageConfirm": "For å bekrefte, skriv inn navnet på ressursen nedenfor.",
|
"resourceQuestionRemove": "Er du sikker på at du vil fjerne ressursen fra organisasjonen?",
|
||||||
"resourceQuestionRemove": "Er du sikker på at du vil fjerne ressursen {selectedResource} fra organisasjonen?",
|
|
||||||
"resourceHTTP": "HTTPS-ressurs",
|
"resourceHTTP": "HTTPS-ressurs",
|
||||||
"resourceHTTPDescription": "Proxy-forespørsler til appen din over HTTPS ved bruk av et underdomene eller grunndomene.",
|
"resourceHTTPDescription": "Proxy-forespørsler til appen din over HTTPS ved bruk av et underdomene eller grunndomene.",
|
||||||
"resourceRaw": "Rå TCP/UDP-ressurs",
|
"resourceRaw": "Rå TCP/UDP-ressurs",
|
||||||
@@ -220,7 +218,7 @@
|
|||||||
"orgDeleteConfirm": "Bekreft Sletting av Organisasjon",
|
"orgDeleteConfirm": "Bekreft Sletting av Organisasjon",
|
||||||
"orgMessageRemove": "Denne handlingen er irreversibel og vil slette alle tilknyttede data.",
|
"orgMessageRemove": "Denne handlingen er irreversibel og vil slette alle tilknyttede data.",
|
||||||
"orgMessageConfirm": "For å bekrefte, vennligst skriv inn navnet på organisasjonen nedenfor.",
|
"orgMessageConfirm": "For å bekrefte, vennligst skriv inn navnet på organisasjonen nedenfor.",
|
||||||
"orgQuestionRemove": "Er du sikker på at du vil fjerne organisasjonen {selectedOrg}?",
|
"orgQuestionRemove": "Er du sikker på at du vil fjerne organisasjonen?",
|
||||||
"orgUpdated": "Organisasjon oppdatert",
|
"orgUpdated": "Organisasjon oppdatert",
|
||||||
"orgUpdatedDescription": "Organisasjonen har blitt oppdatert.",
|
"orgUpdatedDescription": "Organisasjonen har blitt oppdatert.",
|
||||||
"orgErrorUpdate": "Kunne ikke oppdatere organisasjonen",
|
"orgErrorUpdate": "Kunne ikke oppdatere organisasjonen",
|
||||||
@@ -287,9 +285,8 @@
|
|||||||
"apiKeysAdd": "Generer API-nøkkel",
|
"apiKeysAdd": "Generer API-nøkkel",
|
||||||
"apiKeysErrorDelete": "Feil under sletting av API-nøkkel",
|
"apiKeysErrorDelete": "Feil under sletting av API-nøkkel",
|
||||||
"apiKeysErrorDeleteMessage": "Feil ved sletting av API-nøkkel",
|
"apiKeysErrorDeleteMessage": "Feil ved sletting av API-nøkkel",
|
||||||
"apiKeysQuestionRemove": "Er du sikker på at du vil fjerne API-nøkkelen {selectedApiKey} fra organisasjonen?",
|
"apiKeysQuestionRemove": "Er du sikker på at du vil fjerne API-nøkkelen fra organisasjonen?",
|
||||||
"apiKeysMessageRemove": "Når den er fjernet, vil API-nøkkelen ikke lenger kunne brukes.",
|
"apiKeysMessageRemove": "Når den er fjernet, vil API-nøkkelen ikke lenger kunne brukes.",
|
||||||
"apiKeysMessageConfirm": "For å bekrefte, vennligst skriv inn navnet på API-nøkkelen nedenfor.",
|
|
||||||
"apiKeysDeleteConfirm": "Bekreft sletting av API-nøkkel",
|
"apiKeysDeleteConfirm": "Bekreft sletting av API-nøkkel",
|
||||||
"apiKeysDelete": "Slett API-nøkkel",
|
"apiKeysDelete": "Slett API-nøkkel",
|
||||||
"apiKeysManage": "Administrer API-nøkler",
|
"apiKeysManage": "Administrer API-nøkler",
|
||||||
@@ -305,8 +302,7 @@
|
|||||||
"userDeleteConfirm": "Bekreft sletting av bruker",
|
"userDeleteConfirm": "Bekreft sletting av bruker",
|
||||||
"userDeleteServer": "Slett bruker fra server",
|
"userDeleteServer": "Slett bruker fra server",
|
||||||
"userMessageRemove": "Brukeren vil bli fjernet fra alle organisasjoner og vil bli fullstendig fjernet fra serveren.",
|
"userMessageRemove": "Brukeren vil bli fjernet fra alle organisasjoner og vil bli fullstendig fjernet fra serveren.",
|
||||||
"userMessageConfirm": "For å bekrefte, vennligst skriv inn navnet på brukeren nedenfor.",
|
"userQuestionRemove": "Er du sikker på at du vil slette brukeren permanent fra serveren?",
|
||||||
"userQuestionRemove": "Er du sikker på at du vil slette {selectedUser} permanent fra serveren?",
|
|
||||||
"licenseKey": "Lisensnøkkel",
|
"licenseKey": "Lisensnøkkel",
|
||||||
"valid": "Gyldig",
|
"valid": "Gyldig",
|
||||||
"numberOfSites": "Antall områder",
|
"numberOfSites": "Antall områder",
|
||||||
@@ -339,7 +335,7 @@
|
|||||||
"fossorialLicense": "Vis Fossorial kommersiell lisens og abonnementsvilkår",
|
"fossorialLicense": "Vis Fossorial kommersiell lisens og abonnementsvilkår",
|
||||||
"licenseMessageRemove": "Dette vil fjerne lisensnøkkelen og alle tilknyttede tillatelser gitt av den.",
|
"licenseMessageRemove": "Dette vil fjerne lisensnøkkelen og alle tilknyttede tillatelser gitt av den.",
|
||||||
"licenseMessageConfirm": "For å bekrefte, vennligst skriv inn lisensnøkkelen nedenfor.",
|
"licenseMessageConfirm": "For å bekrefte, vennligst skriv inn lisensnøkkelen nedenfor.",
|
||||||
"licenseQuestionRemove": "Er du sikker på at du vil slette lisensnøkkelen {selectedKey} ?",
|
"licenseQuestionRemove": "Er du sikker på at du vil slette lisensnøkkelen?",
|
||||||
"licenseKeyDelete": "Slett Lisensnøkkel",
|
"licenseKeyDelete": "Slett Lisensnøkkel",
|
||||||
"licenseKeyDeleteConfirm": "Bekreft sletting av lisensnøkkel",
|
"licenseKeyDeleteConfirm": "Bekreft sletting av lisensnøkkel",
|
||||||
"licenseTitle": "Behandle lisensstatus",
|
"licenseTitle": "Behandle lisensstatus",
|
||||||
@@ -372,7 +368,7 @@
|
|||||||
"inviteRemoveErrorDescription": "Det oppstod en feil under fjerning av invitasjonen.",
|
"inviteRemoveErrorDescription": "Det oppstod en feil under fjerning av invitasjonen.",
|
||||||
"inviteRemoved": "Invitasjon fjernet",
|
"inviteRemoved": "Invitasjon fjernet",
|
||||||
"inviteRemovedDescription": "Invitasjonen for {email} er fjernet.",
|
"inviteRemovedDescription": "Invitasjonen for {email} er fjernet.",
|
||||||
"inviteQuestionRemove": "Er du sikker på at du vil fjerne invitasjonen {email}?",
|
"inviteQuestionRemove": "Er du sikker på at du vil fjerne invitasjonen?",
|
||||||
"inviteMessageRemove": "Når fjernet, vil denne invitasjonen ikke lenger være gyldig. Du kan alltid invitere brukeren på nytt senere.",
|
"inviteMessageRemove": "Når fjernet, vil denne invitasjonen ikke lenger være gyldig. Du kan alltid invitere brukeren på nytt senere.",
|
||||||
"inviteMessageConfirm": "For å bekrefte, vennligst tast inn invitasjonens e-postadresse nedenfor.",
|
"inviteMessageConfirm": "For å bekrefte, vennligst tast inn invitasjonens e-postadresse nedenfor.",
|
||||||
"inviteQuestionRegenerate": "Er du sikker på at du vil generere invitasjonen på nytt for {email}? Dette vil ugyldiggjøre den forrige invitasjonen.",
|
"inviteQuestionRegenerate": "Er du sikker på at du vil generere invitasjonen på nytt for {email}? Dette vil ugyldiggjøre den forrige invitasjonen.",
|
||||||
@@ -398,9 +394,8 @@
|
|||||||
"userErrorOrgRemoveDescription": "Det oppstod en feil under fjerning av brukeren.",
|
"userErrorOrgRemoveDescription": "Det oppstod en feil under fjerning av brukeren.",
|
||||||
"userOrgRemoved": "Bruker fjernet",
|
"userOrgRemoved": "Bruker fjernet",
|
||||||
"userOrgRemovedDescription": "Brukeren {email} er fjernet fra organisasjonen.",
|
"userOrgRemovedDescription": "Brukeren {email} er fjernet fra organisasjonen.",
|
||||||
"userQuestionOrgRemove": "Er du sikker på at du vil fjerne {email} fra organisasjonen?",
|
"userQuestionOrgRemove": "Er du sikker på at du vil fjerne denne brukeren fra organisasjonen?",
|
||||||
"userMessageOrgRemove": "Når denne brukeren er fjernet, vil de ikke lenger ha tilgang til organisasjonen. Du kan alltid invitere dem på nytt senere, men de vil måtte godta invitasjonen på nytt.",
|
"userMessageOrgRemove": "Når denne brukeren er fjernet, vil de ikke lenger ha tilgang til organisasjonen. Du kan alltid invitere dem på nytt senere, men de vil måtte godta invitasjonen på nytt.",
|
||||||
"userMessageOrgConfirm": "For å bekrefte, vennligst skriv inn navnet på brukeren nedenfor.",
|
|
||||||
"userRemoveOrgConfirm": "Bekreft fjerning av bruker",
|
"userRemoveOrgConfirm": "Bekreft fjerning av bruker",
|
||||||
"userRemoveOrg": "Fjern bruker fra organisasjon",
|
"userRemoveOrg": "Fjern bruker fra organisasjon",
|
||||||
"users": "Brukere",
|
"users": "Brukere",
|
||||||
@@ -730,7 +725,7 @@
|
|||||||
"pangolinServerAdmin": "Server Admin - Pangolin",
|
"pangolinServerAdmin": "Server Admin - Pangolin",
|
||||||
"licenseTierProfessional": "Profesjonell lisens",
|
"licenseTierProfessional": "Profesjonell lisens",
|
||||||
"licenseTierEnterprise": "Bedriftslisens",
|
"licenseTierEnterprise": "Bedriftslisens",
|
||||||
"licenseTierPersonal": "Personal License",
|
"licenseTierPersonal": "Personlig lisens",
|
||||||
"licensed": "Lisensiert",
|
"licensed": "Lisensiert",
|
||||||
"yes": "Ja",
|
"yes": "Ja",
|
||||||
"no": "Nei",
|
"no": "Nei",
|
||||||
@@ -742,7 +737,7 @@
|
|||||||
"idpManageDescription": "Vis og administrer identitetsleverandører i systemet",
|
"idpManageDescription": "Vis og administrer identitetsleverandører i systemet",
|
||||||
"idpDeletedDescription": "Identitetsleverandør slettet vellykket",
|
"idpDeletedDescription": "Identitetsleverandør slettet vellykket",
|
||||||
"idpOidc": "OAuth2/OIDC",
|
"idpOidc": "OAuth2/OIDC",
|
||||||
"idpQuestionRemove": "Er du sikker på at du vil slette identitetsleverandøren {name} permanent?",
|
"idpQuestionRemove": "Er du sikker på at du vil slette identitetsleverandøren permanent?",
|
||||||
"idpMessageRemove": "Dette vil fjerne identitetsleverandøren og alle tilhørende konfigurasjoner. Brukere som autentiserer seg via denne leverandøren vil ikke lenger kunne logge inn.",
|
"idpMessageRemove": "Dette vil fjerne identitetsleverandøren og alle tilhørende konfigurasjoner. Brukere som autentiserer seg via denne leverandøren vil ikke lenger kunne logge inn.",
|
||||||
"idpMessageConfirm": "For å bekrefte, vennligst skriv inn navnet på identitetsleverandøren nedenfor.",
|
"idpMessageConfirm": "For å bekrefte, vennligst skriv inn navnet på identitetsleverandøren nedenfor.",
|
||||||
"idpConfirmDelete": "Bekreft Sletting av Identitetsleverandør",
|
"idpConfirmDelete": "Bekreft Sletting av Identitetsleverandør",
|
||||||
@@ -916,6 +911,18 @@
|
|||||||
"passwordResetCodeDescription": "Sjekk e-posten din for tilbakestillingskoden.",
|
"passwordResetCodeDescription": "Sjekk e-posten din for tilbakestillingskoden.",
|
||||||
"passwordNew": "Nytt passord",
|
"passwordNew": "Nytt passord",
|
||||||
"passwordNewConfirm": "Bekreft nytt passord",
|
"passwordNewConfirm": "Bekreft nytt passord",
|
||||||
|
"changePassword": "Endre passord",
|
||||||
|
"changePasswordDescription": "Oppdater passordet for din konto",
|
||||||
|
"oldPassword": "Nåværende passord",
|
||||||
|
"newPassword": "Nytt passord",
|
||||||
|
"confirmNewPassword": "Bekreft nytt passord",
|
||||||
|
"changePasswordError": "Kunne ikke endre passord",
|
||||||
|
"changePasswordErrorDescription": "Det oppstod en feil under endring av passordet",
|
||||||
|
"changePasswordSuccess": "Passordet er endret",
|
||||||
|
"changePasswordSuccessDescription": "Ditt passord ble oppdatert",
|
||||||
|
"passwordExpiryRequired": "Passordutløp kreves",
|
||||||
|
"passwordExpiryDescription": "Denne organisasjonen krever at du bytter passord hver {maxDays} dag.",
|
||||||
|
"changePasswordNow": "Bytt passord nå",
|
||||||
"pincodeAuth": "Autentiseringskode",
|
"pincodeAuth": "Autentiseringskode",
|
||||||
"pincodeSubmit2": "Send inn kode",
|
"pincodeSubmit2": "Send inn kode",
|
||||||
"passwordResetSubmit": "Be om tilbakestilling",
|
"passwordResetSubmit": "Be om tilbakestilling",
|
||||||
@@ -1154,8 +1161,27 @@
|
|||||||
"sidebarAllUsers": "Alle brukere",
|
"sidebarAllUsers": "Alle brukere",
|
||||||
"sidebarIdentityProviders": "Identitetsleverandører",
|
"sidebarIdentityProviders": "Identitetsleverandører",
|
||||||
"sidebarLicense": "Lisens",
|
"sidebarLicense": "Lisens",
|
||||||
"sidebarClients": "Clients",
|
"sidebarClients": "Klienter",
|
||||||
"sidebarDomains": "Domener",
|
"sidebarDomains": "Domener",
|
||||||
|
"sidebarBluePrints": "Tegninger",
|
||||||
|
"blueprints": "Tegninger",
|
||||||
|
"blueprintsDescription": "Tegninger er deklarative YAML konfigurasjoner som definerer dine ressurser og deres innstillinger",
|
||||||
|
"blueprintAdd": "Legg til blåkopi",
|
||||||
|
"blueprintGoBack": "Se alle blåkopier",
|
||||||
|
"blueprintCreate": "Opprette mal",
|
||||||
|
"blueprintCreateDescription2": "Følg trinnene nedenfor for å opprette og bruke en ny plantegning",
|
||||||
|
"blueprintDetails": "Blåkopi detaljer",
|
||||||
|
"blueprintDetailsDescription": "Se detaljer om plantegning",
|
||||||
|
"blueprintInfo": "Blåkopi informasjon",
|
||||||
|
"message": "Melding",
|
||||||
|
"blueprintContentsDescription": "Definer innhold av YAML som beskriver din infrastruktur",
|
||||||
|
"blueprintErrorCreateDescription": "Det oppstod en feil da plantegningen ble lagt til",
|
||||||
|
"blueprintErrorCreate": "Feil ved opprettelse av plantegning",
|
||||||
|
"searchBlueprintProgress": "Søk etter plantegninger...",
|
||||||
|
"appliedAt": "Anvendt på",
|
||||||
|
"source": "Kilde",
|
||||||
|
"contents": "Innhold",
|
||||||
|
"parsedContents": "Parket innhold",
|
||||||
"enableDockerSocket": "Aktiver Docker blåkopi",
|
"enableDockerSocket": "Aktiver Docker blåkopi",
|
||||||
"enableDockerSocketDescription": "Aktiver skraping av Docker Socket for blueprint Etiketter. Socket bane må brukes for nye.",
|
"enableDockerSocketDescription": "Aktiver skraping av Docker Socket for blueprint Etiketter. Socket bane må brukes for nye.",
|
||||||
"enableDockerSocketLink": "Lær mer",
|
"enableDockerSocketLink": "Lær mer",
|
||||||
@@ -1211,9 +1237,8 @@
|
|||||||
"domainCreate": "Opprett domene",
|
"domainCreate": "Opprett domene",
|
||||||
"domainCreatedDescription": "Domene ble opprettet",
|
"domainCreatedDescription": "Domene ble opprettet",
|
||||||
"domainDeletedDescription": "Domene ble slettet",
|
"domainDeletedDescription": "Domene ble slettet",
|
||||||
"domainQuestionRemove": "Er du sikker på at du vil fjerne domenet {domain} fra kontoen din?",
|
"domainQuestionRemove": "Er du sikker på at du vil fjerne domenet fra kontoen din?",
|
||||||
"domainMessageRemove": "Når domenet er fjernet, vil det ikke lenger være knyttet til kontoen din.",
|
"domainMessageRemove": "Når domenet er fjernet, vil det ikke lenger være knyttet til kontoen din.",
|
||||||
"domainMessageConfirm": "For å bekrefte, vennligst skriv inn domenenavnet nedenfor.",
|
|
||||||
"domainConfirmDelete": "Bekreft sletting av domene",
|
"domainConfirmDelete": "Bekreft sletting av domene",
|
||||||
"domainDelete": "Slett domene",
|
"domainDelete": "Slett domene",
|
||||||
"domain": "Domene",
|
"domain": "Domene",
|
||||||
@@ -1280,7 +1305,7 @@
|
|||||||
"billingFreeTier": "Gratis nivå",
|
"billingFreeTier": "Gratis nivå",
|
||||||
"billingWarningOverLimit": "Advarsel: Du har overskredet en eller flere bruksgrenser. Nettstedene dine vil ikke koble til før du endrer abonnementet ditt eller justerer bruken.",
|
"billingWarningOverLimit": "Advarsel: Du har overskredet en eller flere bruksgrenser. Nettstedene dine vil ikke koble til før du endrer abonnementet ditt eller justerer bruken.",
|
||||||
"billingUsageLimitsOverview": "Oversikt over bruksgrenser",
|
"billingUsageLimitsOverview": "Oversikt over bruksgrenser",
|
||||||
"billingMonitorUsage": "Overvåk bruken din i forhold til konfigurerte grenser. Hvis du trenger økte grenser, vennligst kontakt support@fossorial.io.",
|
"billingMonitorUsage": "Overvåk bruken din i forhold til konfigurerte grenser. Hvis du trenger økte grenser, vennligst kontakt support@pangolin.net.",
|
||||||
"billingDataUsage": "Databruk",
|
"billingDataUsage": "Databruk",
|
||||||
"billingOnlineTime": "Online tid for nettsteder",
|
"billingOnlineTime": "Online tid for nettsteder",
|
||||||
"billingUsers": "Aktive brukere",
|
"billingUsers": "Aktive brukere",
|
||||||
@@ -1346,6 +1371,19 @@
|
|||||||
"securityKeyUnknownError": "Det oppstod et problem med å bruke sikkerhetsnøkkelen din. Vennligst prøv igjen.",
|
"securityKeyUnknownError": "Det oppstod et problem med å bruke sikkerhetsnøkkelen din. Vennligst prøv igjen.",
|
||||||
"twoFactorRequired": "Tofaktorautentisering er påkrevd for å registrere en sikkerhetsnøkkel.",
|
"twoFactorRequired": "Tofaktorautentisering er påkrevd for å registrere en sikkerhetsnøkkel.",
|
||||||
"twoFactor": "Tofaktorautentisering",
|
"twoFactor": "Tofaktorautentisering",
|
||||||
|
"twoFactorAuthentication": "To-faktor autentisering",
|
||||||
|
"twoFactorDescription": "Denne organisasjonen krever to-faktor-autentisering.",
|
||||||
|
"enableTwoFactor": "Aktiver to-faktor autentisering",
|
||||||
|
"organizationSecurityPolicy": "Retningslinjer for organisasjons sikkerhet",
|
||||||
|
"organizationSecurityPolicyDescription": "Denne organisasjonen har sikkerhetskrav som må oppfylles før du får tilgang til den",
|
||||||
|
"securityRequirements": "Krav Til Sikkerhet",
|
||||||
|
"allRequirementsMet": "Alle krav er oppfylt",
|
||||||
|
"completeRequirementsToContinue": "Fullfør kravene nedenfor for å fortsette tilgangen til denne organisasjonen",
|
||||||
|
"youCanNowAccessOrganization": "Du har nå tilgang til denne organisasjonen",
|
||||||
|
"reauthenticationRequired": "Økt lengde",
|
||||||
|
"reauthenticationDescription": "Denne organisasjonen krever at du logger på alle {maxDays} dager.",
|
||||||
|
"reauthenticationDescriptionHours": "Denne organisasjonen krever at du logger inn hver {maxHours} time.",
|
||||||
|
"reauthenticateNow": "Logg inn igjen",
|
||||||
"adminEnabled2FaOnYourAccount": "Din administrator har aktivert tofaktorautentisering for {email}. Vennligst fullfør oppsettsprosessen for å fortsette.",
|
"adminEnabled2FaOnYourAccount": "Din administrator har aktivert tofaktorautentisering for {email}. Vennligst fullfør oppsettsprosessen for å fortsette.",
|
||||||
"securityKeyAdd": "Legg til sikkerhetsnøkkel",
|
"securityKeyAdd": "Legg til sikkerhetsnøkkel",
|
||||||
"securityKeyRegisterTitle": "Registrer ny sikkerhetsnøkkel",
|
"securityKeyRegisterTitle": "Registrer ny sikkerhetsnøkkel",
|
||||||
@@ -1558,14 +1596,13 @@
|
|||||||
"autoLoginErrorNoRedirectUrl": "Ingen omdirigerings-URL mottatt fra identitetsleverandøren.",
|
"autoLoginErrorNoRedirectUrl": "Ingen omdirigerings-URL mottatt fra identitetsleverandøren.",
|
||||||
"autoLoginErrorGeneratingUrl": "Kunne ikke generere autentiserings-URL.",
|
"autoLoginErrorGeneratingUrl": "Kunne ikke generere autentiserings-URL.",
|
||||||
"remoteExitNodeManageRemoteExitNodes": "Eksterne Noder",
|
"remoteExitNodeManageRemoteExitNodes": "Eksterne Noder",
|
||||||
"remoteExitNodeDescription": "Self-host one or more remote nodes to extend your network connectivity and reduce reliance on the cloud",
|
"remoteExitNodeDescription": "Selvbetjent én eller flere eksterne noder for å utvide nettverkstilkoblingen din og redusere avhengighet på skyen",
|
||||||
"remoteExitNodes": "Noder",
|
"remoteExitNodes": "Noder",
|
||||||
"searchRemoteExitNodes": "Søk noder...",
|
"searchRemoteExitNodes": "Søk noder...",
|
||||||
"remoteExitNodeAdd": "Legg til Node",
|
"remoteExitNodeAdd": "Legg til Node",
|
||||||
"remoteExitNodeErrorDelete": "Feil ved sletting av node",
|
"remoteExitNodeErrorDelete": "Feil ved sletting av node",
|
||||||
"remoteExitNodeQuestionRemove": "Er du sikker på at du vil fjerne noden {selectedNode} fra organisasjonen?",
|
"remoteExitNodeQuestionRemove": "Er du sikker på at du vil fjerne noden fra organisasjonen?",
|
||||||
"remoteExitNodeMessageRemove": "Når noden er fjernet, vil ikke lenger være tilgjengelig.",
|
"remoteExitNodeMessageRemove": "Når noden er fjernet, vil ikke lenger være tilgjengelig.",
|
||||||
"remoteExitNodeMessageConfirm": "For å bekrefte, skriv inn navnet på noden nedenfor.",
|
|
||||||
"remoteExitNodeConfirmDelete": "Bekreft sletting av Node",
|
"remoteExitNodeConfirmDelete": "Bekreft sletting av Node",
|
||||||
"remoteExitNodeDelete": "Slett Node",
|
"remoteExitNodeDelete": "Slett Node",
|
||||||
"sidebarRemoteExitNodes": "Eksterne Noder",
|
"sidebarRemoteExitNodes": "Eksterne Noder",
|
||||||
@@ -1733,7 +1770,49 @@
|
|||||||
"resourceExposePortsEditFile": "Rediger fil: docker-compose.yml",
|
"resourceExposePortsEditFile": "Rediger fil: docker-compose.yml",
|
||||||
"emailVerificationRequired": "E-postbekreftelse er nødvendig. Logg inn på nytt via {dashboardUrl}/auth/login og fullfør dette trinnet. Kom deretter tilbake her.",
|
"emailVerificationRequired": "E-postbekreftelse er nødvendig. Logg inn på nytt via {dashboardUrl}/auth/login og fullfør dette trinnet. Kom deretter tilbake her.",
|
||||||
"twoFactorSetupRequired": "To-faktor autentiseringsoppsett er nødvendig. Vennligst logg inn igjen via {dashboardUrl}/auth/login og fullfør dette steget. Kom deretter tilbake her.",
|
"twoFactorSetupRequired": "To-faktor autentiseringsoppsett er nødvendig. Vennligst logg inn igjen via {dashboardUrl}/auth/login og fullfør dette steget. Kom deretter tilbake her.",
|
||||||
|
"additionalSecurityRequired": "Ekstra sikkerhet kreves",
|
||||||
|
"organizationRequiresAdditionalSteps": "Denne organisasjonen krever ytterligere sikkerhetstrinn før du får tilgang til ressurser.",
|
||||||
|
"completeTheseSteps": "Fullfør disse trinnene",
|
||||||
|
"enableTwoFactorAuthentication": "Aktiver to-faktor autentisering",
|
||||||
|
"completeSecuritySteps": "Fullfør sikkerhetstrinnene",
|
||||||
|
"securitySettings": "Sikkerhet innstillinger",
|
||||||
|
"securitySettingsDescription": "Konfigurere sikkerhetspolicyer for din organisasjon",
|
||||||
|
"requireTwoFactorForAllUsers": "Krev to-faktor autentisering for alle brukere",
|
||||||
|
"requireTwoFactorDescription": "Når aktivert må alle interne brukere i denne organisasjonen ha to-faktorautentisering aktivert for å få tilgang til organisasjonen.",
|
||||||
|
"requireTwoFactorDisabledDescription": "Denne funksjonen krever en gyldig lisens (Enterprise) eller aktivt abonnement (SaaS)",
|
||||||
|
"requireTwoFactorCannotEnableDescription": "Du må aktivere to-faktor-autentisering for din konto før det håndheves for alle brukere",
|
||||||
|
"maxSessionLength": "Maksimal øktlengde",
|
||||||
|
"maxSessionLengthDescription": "Angi maksimal varighet for brukerøkter. Etter denne gangen må brukerne logge inn på nytt.",
|
||||||
|
"maxSessionLengthDisabledDescription": "Denne funksjonen krever en gyldig lisens (Enterprise) eller aktivt abonnement (SaaS)",
|
||||||
|
"selectSessionLength": "Velg øktlengde",
|
||||||
|
"unenforced": "Tvungen",
|
||||||
|
"1Hour": "1 time",
|
||||||
|
"3Hours": "3 timer",
|
||||||
|
"6Hours": "6 timer",
|
||||||
|
"12Hours": "12 timer",
|
||||||
|
"1DaySession": "1 dag",
|
||||||
|
"3Days": "3 dager",
|
||||||
|
"7Days": "7 dager",
|
||||||
|
"14Days": "14 dager",
|
||||||
|
"30DaysSession": "30 dager",
|
||||||
|
"90DaysSession": "90 dager",
|
||||||
|
"180DaysSession": "180 dager",
|
||||||
|
"passwordExpiryDays": "Passord utløper",
|
||||||
|
"editPasswordExpiryDescription": "Angi antall dager før brukere må endre passordet sitt.",
|
||||||
|
"selectPasswordExpiry": "Velg passordutløp",
|
||||||
|
"30Days": "30 dager",
|
||||||
|
"1Day": "1 dag",
|
||||||
|
"60Days": "60 dager",
|
||||||
|
"90Days": "90 dager",
|
||||||
|
"180Days": "180 dager",
|
||||||
|
"1Year": "1 år",
|
||||||
|
"subscriptionBadge": "Abonnement kreves",
|
||||||
|
"securityPolicyChangeWarning": "Sikkerhetsregler forandring advarsel",
|
||||||
|
"securityPolicyChangeDescription": "Du er i ferd med å endre innstillingene for sikkerhetspolicy. Etter å ha spart må du kanskje gjenopplogge deg på for å oppfylle disse policyoppdateringene. Alle brukere som ikke samsvarer vil også måtte autentisere.",
|
||||||
|
"securityPolicyChangeConfirmMessage": "Jeg bekrefter",
|
||||||
|
"securityPolicyChangeWarningText": "Dette vil påvirke alle brukere i organisasjonen",
|
||||||
"authPageErrorUpdateMessage": "Det oppstod en feil under oppdatering av innstillingene for godkjenningssiden",
|
"authPageErrorUpdateMessage": "Det oppstod en feil under oppdatering av innstillingene for godkjenningssiden",
|
||||||
|
"authPageErrorUpdate": "Kunne ikke oppdatere autoriseringssiden",
|
||||||
"authPageUpdated": "Godkjenningsside oppdatert",
|
"authPageUpdated": "Godkjenningsside oppdatert",
|
||||||
"healthCheckNotAvailable": "Lokal",
|
"healthCheckNotAvailable": "Lokal",
|
||||||
"rewritePath": "Omskriv sti",
|
"rewritePath": "Omskriv sti",
|
||||||
@@ -1745,153 +1824,261 @@
|
|||||||
"resourceHeaderAuthRemoveDescription": "Topplinje autentisering fjernet.",
|
"resourceHeaderAuthRemoveDescription": "Topplinje autentisering fjernet.",
|
||||||
"resourceErrorHeaderAuthRemove": "Kunne ikke fjerne topptekst autentisering",
|
"resourceErrorHeaderAuthRemove": "Kunne ikke fjerne topptekst autentisering",
|
||||||
"resourceErrorHeaderAuthRemoveDescription": "Kunne ikke fjerne topptekst autentisering for ressursen.",
|
"resourceErrorHeaderAuthRemoveDescription": "Kunne ikke fjerne topptekst autentisering for ressursen.",
|
||||||
"resourceHeaderAuthProtectionEnabled": "Header Authentication Enabled",
|
"resourceHeaderAuthProtectionEnabled": "Topplinje autentisering aktivert",
|
||||||
"resourceHeaderAuthProtectionDisabled": "Header Authentication Disabled",
|
"resourceHeaderAuthProtectionDisabled": "Topplinje autentisering deaktivert",
|
||||||
"headerAuthRemove": "Remove Header Auth",
|
"headerAuthRemove": "Fjern topptekst Auth",
|
||||||
"headerAuthAdd": "Add Header Auth",
|
"headerAuthAdd": "Legg til topptekst godkjenning",
|
||||||
"resourceErrorHeaderAuthSetup": "Kunne ikke sette topptekst autentisering",
|
"resourceErrorHeaderAuthSetup": "Kunne ikke sette topptekst autentisering",
|
||||||
"resourceErrorHeaderAuthSetupDescription": "Kunne ikke sette topplinje autentisering for ressursen.",
|
"resourceErrorHeaderAuthSetupDescription": "Kunne ikke sette topplinje autentisering for ressursen.",
|
||||||
"resourceHeaderAuthSetup": "Header godkjenningssett var vellykket",
|
"resourceHeaderAuthSetup": "Header godkjenningssett var vellykket",
|
||||||
"resourceHeaderAuthSetupDescription": "Topplinje autentisering har blitt lagret.",
|
"resourceHeaderAuthSetupDescription": "Topplinje autentisering har blitt lagret.",
|
||||||
"resourceHeaderAuthSetupTitle": "Angi topptekst godkjenning",
|
"resourceHeaderAuthSetupTitle": "Angi topptekst godkjenning",
|
||||||
"resourceHeaderAuthSetupTitleDescription": "Set the basic auth credentials (username and password) to protect this resource with HTTP Header Authentication. Access it using the format https://username:password@resource.example.com",
|
"resourceHeaderAuthSetupTitleDescription": "Angi grunnleggende auth legitimasjon (brukernavn og passord) for å beskytte denne ressursen med HTTP Header autentisering. Tilgang til det ved hjelp av formatet https://username:password@resource.example.com",
|
||||||
"resourceHeaderAuthSubmit": "Angi topptekst godkjenning",
|
"resourceHeaderAuthSubmit": "Angi topptekst godkjenning",
|
||||||
"actionSetResourceHeaderAuth": "Angi topptekst godkjenning",
|
"actionSetResourceHeaderAuth": "Angi topptekst godkjenning",
|
||||||
"enterpriseEdition": "Enterprise Edition",
|
"enterpriseEdition": "Enterprise Edition",
|
||||||
"unlicensed": "Unlicensed",
|
"unlicensed": "Ikke lisensiert",
|
||||||
"beta": "Beta",
|
"beta": "beta",
|
||||||
"manageClients": "Manage Clients",
|
"manageClients": "Administrer klienter",
|
||||||
"manageClientsDescription": "Clients are devices that can connect to your sites",
|
"manageClientsDescription": "Klienter er enheter som kan koble seg til nettstedet ditt",
|
||||||
"licenseTableValidUntil": "Valid Until",
|
"licenseTableValidUntil": "Gyldig til",
|
||||||
"saasLicenseKeysSettingsTitle": "Enterprise Licenses",
|
"saasLicenseKeysSettingsTitle": "Bedriftstillatelse Lisenser",
|
||||||
"saasLicenseKeysSettingsDescription": "Generate and manage Enterprise license keys for self-hosted Pangolin instances",
|
"saasLicenseKeysSettingsDescription": "Generer og administrer Enterprise lisensnøkler for selvbetjente Pangolin forekomster",
|
||||||
"sidebarEnterpriseLicenses": "Licenses",
|
"sidebarEnterpriseLicenses": "Lisenser",
|
||||||
"generateLicenseKey": "Generate License Key",
|
"generateLicenseKey": "Generer lisensnøkkel",
|
||||||
"generateLicenseKeyForm": {
|
"generateLicenseKeyForm": {
|
||||||
"validation": {
|
"validation": {
|
||||||
"emailRequired": "Please enter a valid email address",
|
"emailRequired": "Vennligst skriv inn en gyldig e-postadresse",
|
||||||
"useCaseTypeRequired": "Please select a use case type",
|
"useCaseTypeRequired": "Vennligst velg en bruk sakstype",
|
||||||
"firstNameRequired": "First name is required",
|
"firstNameRequired": "Fornavn er påkrevd",
|
||||||
"lastNameRequired": "Last name is required",
|
"lastNameRequired": "Etternavn er påkrevd",
|
||||||
"primaryUseRequired": "Please describe your primary use",
|
"primaryUseRequired": "Beskriv din primære bruk",
|
||||||
"jobTitleRequiredBusiness": "Job title is required for business use",
|
"jobTitleRequiredBusiness": "Jobbtittel er påkrevd for forretningsbruk",
|
||||||
"industryRequiredBusiness": "Industry is required for business use",
|
"industryRequiredBusiness": "Næringslivet må til forretningsbruk",
|
||||||
"stateProvinceRegionRequired": "State/Province/Region is required",
|
"stateProvinceRegionRequired": "Stat/provins/region kreves",
|
||||||
"postalZipCodeRequired": "Postal/ZIP Code is required",
|
"postalZipCodeRequired": "Postnummer er påkrevd",
|
||||||
"companyNameRequiredBusiness": "Company name is required for business use",
|
"companyNameRequiredBusiness": "Firmanavn er påkrevd for bedriftens bruk",
|
||||||
"countryOfResidenceRequiredBusiness": "Country of residence is required for business use",
|
"countryOfResidenceRequiredBusiness": "Land som skal oppholde seg er nødvendig for bruk til forretningsdrift",
|
||||||
"countryRequiredPersonal": "Country is required for personal use",
|
"countryRequiredPersonal": "Land er påkrevd for personlig bruk",
|
||||||
"agreeToTermsRequired": "You must agree to the terms",
|
"agreeToTermsRequired": "Du må godta vilkårene",
|
||||||
"complianceConfirmationRequired": "You must confirm compliance with the Fossorial Commercial License"
|
"complianceConfirmationRequired": "Du må bekrefte at du overholder Fossorial Kommersiell lisens"
|
||||||
},
|
},
|
||||||
"useCaseOptions": {
|
"useCaseOptions": {
|
||||||
"personal": {
|
"personal": {
|
||||||
"title": "Personal Use",
|
"title": "Personlig bruk",
|
||||||
"description": "For individual, non-commercial use such as learning, personal projects, or experimentation."
|
"description": "For enkeltpersoner, ikke-kommersiell bruk som læring, personlige prosjekter eller eksperimentering."
|
||||||
},
|
},
|
||||||
"business": {
|
"business": {
|
||||||
"title": "Business Use",
|
"title": "Forretningsmessig bruk",
|
||||||
"description": "For use within organizations, companies, or commercial or revenue-generating activities."
|
"description": "Til bruk innenfor organisasjoner eller virksomheter eller forretningsmessige inntekter eller aktiviteter."
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"steps": {
|
"steps": {
|
||||||
"emailLicenseType": {
|
"emailLicenseType": {
|
||||||
"title": "Email & License Type",
|
"title": "E-post & lisenstype",
|
||||||
"description": "Enter your email and choose your license type"
|
"description": "Skriv inn e-postadressen din og velg lisenstypen din"
|
||||||
},
|
},
|
||||||
"personalInformation": {
|
"personalInformation": {
|
||||||
"title": "Personal Information",
|
"title": "Personlig Informasjon",
|
||||||
"description": "Tell us about yourself"
|
"description": "Fortell oss om deg selv"
|
||||||
},
|
},
|
||||||
"contactInformation": {
|
"contactInformation": {
|
||||||
"title": "Contact Information",
|
"title": "Kontakt Informasjon",
|
||||||
"description": "Your contact details"
|
"description": "Dine kontaktopplysninger"
|
||||||
},
|
},
|
||||||
"termsGenerate": {
|
"termsGenerate": {
|
||||||
"title": "Terms & Generate",
|
"title": "Vilkår og generere",
|
||||||
"description": "Review and accept terms to generate your license"
|
"description": "Se gjennom og godta vilkårene for å generere lisensen"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"alerts": {
|
"alerts": {
|
||||||
"commercialUseDisclosure": {
|
"commercialUseDisclosure": {
|
||||||
"title": "Usage Disclosure",
|
"title": "Bruk utlevering",
|
||||||
"description": "Select the license tier that accurately reflects your intended use. The Personal License permits free use of the Software for individual, non-commercial or small-scale commercial activities with annual gross revenue under $100,000 USD. Any use beyond these limits — including use within a business, organization, or other revenue-generating environment — requires a valid Enterprise License and payment of the applicable licensing fee. All users, whether Personal or Enterprise, must comply with the Fossorial Commercial License Terms."
|
"description": "Velg lisensnivået som reflekterer nøyaktig din tiltenkte bruk. Personlige lisenser tillater fri bruk av programvare for enkelte, ikke-kommersielle eller småskala kommersielle aktiviteter, med en årlig brutto inntekt på under 100 000 amerikanske dollar. All bruk ut over disse grensene – inkludert bruk innenfor en virksomhet, organisasjon eller andre inntekter miljø - krever en gyldig Enterprise lisens og betaling av gjeldende lisensavgift. Alle brukere, enten personlig eller Enterprise, må overholde de kommersielle tillatelsene på Fossorial."
|
||||||
},
|
},
|
||||||
"trialPeriodInformation": {
|
"trialPeriodInformation": {
|
||||||
"title": "Trial Period Information",
|
"title": "Informasjon om prøveperiode",
|
||||||
"description": "This License Key enables Enterprise features for a 7-day evaluation period. Continued access to Paid Features beyond the evaluation period requires activation under a valid Personal or Enterprise License. For Enterprise licensing, contact sales@fossorial.io."
|
"description": "Denne lisensnøkkelen tillater funksjoner i Enterprise for en 7-dagers evalueringsperiode. Fortsatt tilgang til betalt funksjoner utenfor evalueringsperioden krever aktivering under en gyldig Personlig eller Enterprise License. For Enterprise licensing, kontakt sales@pangolin.net."
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"form": {
|
"form": {
|
||||||
"useCaseQuestion": "Are you using Pangolin for personal or business use?",
|
"useCaseQuestion": "Bruker du Pangolin for personlig eller forretningsbruk?",
|
||||||
"firstName": "First Name",
|
"firstName": "Fornavn",
|
||||||
"lastName": "Last Name",
|
"lastName": "Etternavn (Automatic Translation)",
|
||||||
"jobTitle": "Job Title",
|
"jobTitle": "Jobb tittel",
|
||||||
"primaryUseQuestion": "What do you primarily plan to use Pangolin for?",
|
"primaryUseQuestion": "Hva planlegger du først og fremst å bruke Pangolin for?",
|
||||||
"industryQuestion": "What is your industry?",
|
"industryQuestion": "Hva er din industri?",
|
||||||
"prospectiveUsersQuestion": "How many prospective users do you expect to have?",
|
"prospectiveUsersQuestion": "Hvor mange prospektive brukere forventer du å ha?",
|
||||||
"prospectiveSitesQuestion": "How many prospective sites (tunnels) do you expect to have?",
|
"prospectiveSitesQuestion": "Hvor mange prospektive nettsteder (tunnels) forventer du å ha?",
|
||||||
"companyName": "Company name",
|
"companyName": "Navn på bedrift",
|
||||||
"countryOfResidence": "Country of residence",
|
"countryOfResidence": "Oppholdsland",
|
||||||
"stateProvinceRegion": "State / Province / Region",
|
"stateProvinceRegion": "Fylke / Region",
|
||||||
"postalZipCode": "Postal / ZIP Code",
|
"postalZipCode": "Postnummer / postnummer",
|
||||||
"companyWebsite": "Company website",
|
"companyWebsite": "Firmaets hjemmeside",
|
||||||
"companyPhoneNumber": "Company phone number",
|
"companyPhoneNumber": "Firmaets telefonnummer",
|
||||||
"country": "Country",
|
"country": "Land",
|
||||||
"phoneNumberOptional": "Phone number (optional)",
|
"phoneNumberOptional": "Telefonnummer (valgfritt)",
|
||||||
"complianceConfirmation": "I confirm that I am in compliance with the Fossorial Commercial License and that reporting inaccurate information or misidentifying use of the product is a violation of the license."
|
"complianceConfirmation": "Jeg bekrefter at opplysningene jeg oppga er korrekte og at jeg er i samsvar med Fossorial Kommersiell Lisens. Rapportering av unøyaktig informasjon eller feilidentifisering av bruk av produktet bryter lisensen, og kan føre til at nøkkelen din blir opphevet."
|
||||||
},
|
},
|
||||||
"buttons": {
|
"buttons": {
|
||||||
"close": "Close",
|
"close": "Lukk",
|
||||||
"previous": "Previous",
|
"previous": "Forrige",
|
||||||
"next": "Next",
|
"next": "Neste",
|
||||||
"generateLicenseKey": "Generate License Key"
|
"generateLicenseKey": "Generer lisensnøkkel"
|
||||||
},
|
},
|
||||||
"toasts": {
|
"toasts": {
|
||||||
"success": {
|
"success": {
|
||||||
"title": "License key generated successfully",
|
"title": "Lisensnøkkel ble generert",
|
||||||
"description": "Your license key has been generated and is ready to use."
|
"description": "Din lisensnøkkel har blitt generert og er klar til bruk."
|
||||||
},
|
},
|
||||||
"error": {
|
"error": {
|
||||||
"title": "Failed to generate license key",
|
"title": "Kan ikke generere lisensnøkkel",
|
||||||
"description": "An error occurred while generating the license key."
|
"description": "Det oppstod en feil ved generering av lisensnøkkelen."
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"priority": "Prioritet",
|
"priority": "Prioritet",
|
||||||
"priorityDescription": "Høyere prioriterte ruter evalueres først. Prioritet = 100 betyr automatisk bestilling (systembeslutninger). Bruk et annet nummer til å håndheve manuell prioritet.",
|
"priorityDescription": "Høyere prioriterte ruter evalueres først. Prioritet = 100 betyr automatisk bestilling (systembeslutninger). Bruk et annet nummer til å håndheve manuell prioritet.",
|
||||||
"instanceName": "Instance Name",
|
"instanceName": "Forekomst navn",
|
||||||
"pathMatchModalTitle": "Configure Path Matching",
|
"pathMatchModalTitle": "Konfigurere matching av sti",
|
||||||
"pathMatchModalDescription": "Set up how incoming requests should be matched based on their path.",
|
"pathMatchModalDescription": "Sett opp hvordan innkommende forespørsler skal matches basert på deres bane.",
|
||||||
"pathMatchType": "Match Type",
|
"pathMatchType": "Trefftype",
|
||||||
"pathMatchPrefix": "Prefix",
|
"pathMatchPrefix": "Prefiks",
|
||||||
"pathMatchExact": "Exact",
|
"pathMatchExact": "Nøyaktig",
|
||||||
"pathMatchRegex": "Regex",
|
"pathMatchRegex": "Regex",
|
||||||
"pathMatchValue": "Path Value",
|
"pathMatchValue": "Verdi for sti",
|
||||||
"clear": "Clear",
|
"clear": "Tøm",
|
||||||
"saveChanges": "Save Changes",
|
"saveChanges": "Lagre endringer",
|
||||||
"pathMatchRegexPlaceholder": "^/api/.*",
|
"pathMatchRegexPlaceholder": "^/api/.*",
|
||||||
"pathMatchDefaultPlaceholder": "/path",
|
"pathMatchDefaultPlaceholder": "/sti",
|
||||||
"pathMatchPrefixHelp": "Example: /api matches /api, /api/users, etc.",
|
"pathMatchPrefixHelp": "Eksempel: /api matcher /api, /api/users, etc.",
|
||||||
"pathMatchExactHelp": "Example: /api matches only /api",
|
"pathMatchExactHelp": "Eksempel: /api passer bare /api",
|
||||||
"pathMatchRegexHelp": "Example: ^/api/.* matches /api/anything",
|
"pathMatchRegexHelp": "Eksempel: ^/api/.* matcher /api/alt",
|
||||||
"pathRewriteModalTitle": "Configure Path Rewriting",
|
"pathRewriteModalTitle": "Konfigurer ferdigskriving av sti",
|
||||||
"pathRewriteModalDescription": "Transform the matched path before forwarding to the target.",
|
"pathRewriteModalDescription": "Overfør banen som passet før den videresendes til målet.",
|
||||||
"pathRewriteType": "Rewrite Type",
|
"pathRewriteType": "Omskriv type",
|
||||||
"pathRewritePrefixOption": "Prefix - Replace prefix",
|
"pathRewritePrefixOption": "Prefiks - erstatt prefiks",
|
||||||
"pathRewriteExactOption": "Exact - Replace entire path",
|
"pathRewriteExactOption": "Eksakt - Erstatt hele banen",
|
||||||
"pathRewriteRegexOption": "Regex - Pattern replacement",
|
"pathRewriteRegexOption": "Regex - Ekkobilde",
|
||||||
"pathRewriteStripPrefixOption": "Strip Prefix - Remove prefix",
|
"pathRewriteStripPrefixOption": "Ta bort prefiks - fjern prefiks",
|
||||||
"pathRewriteValue": "Rewrite Value",
|
"pathRewriteValue": "Omskriv verdi",
|
||||||
"pathRewriteRegexPlaceholder": "/new/$1",
|
"pathRewriteRegexPlaceholder": "/ny/$1",
|
||||||
"pathRewriteDefaultPlaceholder": "/new-path",
|
"pathRewriteDefaultPlaceholder": "/ny sti",
|
||||||
"pathRewritePrefixHelp": "Replace the matched prefix with this value",
|
"pathRewritePrefixHelp": "Erstatt det samsvarende prefikset med denne verdien",
|
||||||
"pathRewriteExactHelp": "Replace the entire path with this value when the path matches exactly",
|
"pathRewriteExactHelp": "Erstatt hele banen med denne verdien når stien samsvarer nøyaktig",
|
||||||
"pathRewriteRegexHelp": "Use capture groups like $1, $2 for replacement",
|
"pathRewriteRegexHelp": "Bruk opptaksgrupper som $1, $2 for erstatning",
|
||||||
"pathRewriteStripPrefixHelp": "Leave empty to strip prefix or provide new prefix",
|
"pathRewriteStripPrefixHelp": "La stå tomt for å ta opp prefiks eller legge til nytt prefiks",
|
||||||
"pathRewritePrefix": "Prefix",
|
"pathRewritePrefix": "Prefiks",
|
||||||
"pathRewriteExact": "Exact",
|
"pathRewriteExact": "Nøyaktig",
|
||||||
"pathRewriteRegex": "Regex",
|
"pathRewriteRegex": "Regex",
|
||||||
"pathRewriteStrip": "Strip",
|
"pathRewriteStrip": "Stripe",
|
||||||
"pathRewriteStripLabel": "strip"
|
"pathRewriteStripLabel": "stripe",
|
||||||
|
"sidebarEnableEnterpriseLicense": "Aktiver Enterprise lisens",
|
||||||
|
"cannotbeUndone": "Dette kan ikke angres.",
|
||||||
|
"toConfirm": "å bekrefte",
|
||||||
|
"deleteClientQuestion": "Er du sikker på at du vil fjerne klienten fra nettstedet og organisasjonen?",
|
||||||
|
"clientMessageRemove": "Når klienten er fjernet, kan den ikke lenger koble seg til nettstedet.",
|
||||||
|
"sidebarLogs": "Logger",
|
||||||
|
"request": "Forespørsel",
|
||||||
|
"logs": "Logger",
|
||||||
|
"logsSettingsDescription": "Overvåk logger samlet fra denne orginiasjonen",
|
||||||
|
"searchLogs": "Søk i logger...",
|
||||||
|
"action": "Handling",
|
||||||
|
"actor": "Aktør",
|
||||||
|
"timestamp": "Tidsstempel",
|
||||||
|
"accessLogs": "Tilgangslogger (Automatic Translation)",
|
||||||
|
"exportCsv": "Eksportere CSV",
|
||||||
|
"actorId": "Skuespiller ID",
|
||||||
|
"allowedByRule": "Tillatt etter regel",
|
||||||
|
"allowedNoAuth": "Tillatt Ingen Auth",
|
||||||
|
"validAccessToken": "Gyldig tilgangsnøkkel",
|
||||||
|
"validHeaderAuth": "Valid header auth",
|
||||||
|
"validPincode": "Valid Pincode",
|
||||||
|
"validPassword": "Gyldig passord",
|
||||||
|
"validEmail": "Valid email",
|
||||||
|
"validSSO": "Valid SSO",
|
||||||
|
"resourceBlocked": "Ressurs blokkert",
|
||||||
|
"droppedByRule": "Legg i regelen",
|
||||||
|
"noSessions": "Ingen økter",
|
||||||
|
"temporaryRequestToken": "Midlertidig forespørsel Token",
|
||||||
|
"noMoreAuthMethods": "No Valid Auth",
|
||||||
|
"ip": "IP",
|
||||||
|
"reason": "Grunn",
|
||||||
|
"requestLogs": "Forespørselslogger (Automatic Translation)",
|
||||||
|
"host": "Vert",
|
||||||
|
"location": "Sted",
|
||||||
|
"actionLogs": "Handlingslogger",
|
||||||
|
"sidebarLogsRequest": "Forespørselslogger (Automatic Translation)",
|
||||||
|
"sidebarLogsAccess": "Tilgangslogger (Automatic Translation)",
|
||||||
|
"sidebarLogsAction": "Handlingslogger",
|
||||||
|
"logRetention": "Logg tilbaketrekning",
|
||||||
|
"logRetentionDescription": "Håndter hvor lenge ulike typer logger beholdes for denne organisasjonen, eller deaktiver dem",
|
||||||
|
"requestLogsDescription": "Se detaljerte forespørselslogger for ressurser i denne organisasjonen",
|
||||||
|
"logRetentionRequestLabel": "Be om loggoverføring",
|
||||||
|
"logRetentionRequestDescription": "Hvor lenge du vil beholde forespørselslogger",
|
||||||
|
"logRetentionAccessLabel": "Få tilgang til loggoverføring",
|
||||||
|
"logRetentionAccessDescription": "Hvor lenge du vil beholde adgangslogger",
|
||||||
|
"logRetentionActionLabel": "Handlings logg nytt",
|
||||||
|
"logRetentionActionDescription": "Hvor lenge handlingen skal lagres",
|
||||||
|
"logRetentionDisabled": "Deaktivert",
|
||||||
|
"logRetention3Days": "3 dager",
|
||||||
|
"logRetention7Days": "7 dager",
|
||||||
|
"logRetention14Days": "14 dager",
|
||||||
|
"logRetention30Days": "30 dager",
|
||||||
|
"logRetention90Days": "90 dager",
|
||||||
|
"logRetentionForever": "Alltid",
|
||||||
|
"actionLogsDescription": "Vis historikk for handlinger som er utført i denne organisasjonen",
|
||||||
|
"accessLogsDescription": "Vis autoriseringsforespørsler for ressurser i denne organisasjonen",
|
||||||
|
"licenseRequiredToUse": "En Enterprise lisens er påkrevd for å bruke denne funksjonen.",
|
||||||
|
"certResolver": "Sertifikat løser",
|
||||||
|
"certResolverDescription": "Velg sertifikatløser som skal brukes for denne ressursen.",
|
||||||
|
"selectCertResolver": "Velg sertifikatløser",
|
||||||
|
"enterCustomResolver": "Legg inn egendefinert løser",
|
||||||
|
"preferWildcardCert": "Foretrekk Wildcard sertifikat",
|
||||||
|
"unverified": "Uverifisert",
|
||||||
|
"domainSetting": "Domene innstillinger",
|
||||||
|
"domainSettingDescription": "Konfigurer innstillinger for ditt domene",
|
||||||
|
"preferWildcardCertDescription": "Forsøk på å generere et jokertegn (krever en riktig konfigurert sertifikatløsning).",
|
||||||
|
"recordName": "Lagre navn",
|
||||||
|
"auto": "Automatisk",
|
||||||
|
"TTL": "TTL",
|
||||||
|
"howToAddRecords": "Hvordan legge til poster",
|
||||||
|
"dnsRecord": "DNS registre",
|
||||||
|
"required": "Påkrevd",
|
||||||
|
"domainSettingsUpdated": "Domene innstillinger ble oppdatert",
|
||||||
|
"orgOrDomainIdMissing": "ID for organisasjon eller domene mangler",
|
||||||
|
"loadingDNSRecords": "Laster DNS-poster...",
|
||||||
|
"olmUpdateAvailableInfo": "En oppdatert versjon av Olm er tilgjengelig. Oppdater til den nyeste versjonen for å få den beste opplevelsen.",
|
||||||
|
"client": "Klient",
|
||||||
|
"proxyProtocol": "Protokoll innstillinger for Protokoll",
|
||||||
|
"proxyProtocolDescription": "Konfigurer Proxy-protokoll for å bevare klientens IP-adresser til TCP/UDP tjenester.",
|
||||||
|
"enableProxyProtocol": "Aktiver Proxy-protokoll",
|
||||||
|
"proxyProtocolInfo": "Bevar klientens IP-adresser for TCP/UDP bakover",
|
||||||
|
"proxyProtocolVersion": "Proxy protokoll versjon",
|
||||||
|
"version1": " Versjon 1 (Anbefalt)",
|
||||||
|
"version2": "Versjon 2",
|
||||||
|
"versionDescription": "Versjon 1 er tekstbasert og støttet. Versjon 2 er binært og mer effektivt, men mindre kompatibel.",
|
||||||
|
"warning": "Advarsel",
|
||||||
|
"proxyProtocolWarning": "Din backend applikasjon må være konfigurert for å godta Proxy Protokoller. Hvis din backend ikke støtter Proxy Protocol, vil aktivering av dette bryte alle tilkoblinger. Sørg for å konfigurere backend til å stole på Proxy Protokoll overskrifter fra Traefik.",
|
||||||
|
"restarting": "Restarter...",
|
||||||
|
"manual": "Manuell",
|
||||||
|
"messageSupport": "Støtte for melding",
|
||||||
|
"supportNotAvailableTitle": "Støtte ikke tilgjengelig",
|
||||||
|
"supportNotAvailableDescription": "Støtte er ikke tilgjengelig akkurat nå. Du kan sende en e-post til support@pangolin.net.",
|
||||||
|
"supportRequestSentTitle": "Supportforespørsel sendt",
|
||||||
|
"supportRequestSentDescription": "Din melding er sendt.",
|
||||||
|
"supportRequestFailedTitle": "Kunne ikke sende forespørsel",
|
||||||
|
"supportRequestFailedDescription": "En feil oppstod under sending av din forespørsel om støtte.",
|
||||||
|
"supportSubjectRequired": "Emne er påkrevd",
|
||||||
|
"supportSubjectMaxLength": "Emne må være 255 tegn eller mindre",
|
||||||
|
"supportMessageRequired": "Melding er påkrevd",
|
||||||
|
"supportReplyTo": "Svar til",
|
||||||
|
"supportSubject": "Emne",
|
||||||
|
"supportSubjectPlaceholder": "Angi emne",
|
||||||
|
"supportMessage": "Melding",
|
||||||
|
"supportMessagePlaceholder": "Skriv din melding",
|
||||||
|
"supportSending": "Sender...",
|
||||||
|
"supportSend": "Sende",
|
||||||
|
"supportMessageSent": "Melding sendt!",
|
||||||
|
"supportWillContact": "Vi kommer raskt til å ta kontakt!"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -47,9 +47,8 @@
|
|||||||
"edit": "Bewerken",
|
"edit": "Bewerken",
|
||||||
"siteConfirmDelete": "Verwijderen van site bevestigen",
|
"siteConfirmDelete": "Verwijderen van site bevestigen",
|
||||||
"siteDelete": "Site verwijderen",
|
"siteDelete": "Site verwijderen",
|
||||||
"siteMessageRemove": "Eenmaal verwijderd, zal de site niet langer toegankelijk zijn. Alle bronnen en doelen die aan de site zijn gekoppeld, zullen ook worden verwijderd.",
|
"siteMessageRemove": "Eenmaal verwijderd zal de site niet langer toegankelijk zijn. Alle aan de site gekoppelde doelen zullen ook worden verwijderd.",
|
||||||
"siteMessageConfirm": "Typ ter bevestiging de naam van de site hieronder.",
|
"siteQuestionRemove": "Weet u zeker dat u de site wilt verwijderen uit de organisatie?",
|
||||||
"siteQuestionRemove": "Weet u zeker dat u de site {selectedSite} uit de organisatie wilt verwijderen?",
|
|
||||||
"siteManageSites": "Sites beheren",
|
"siteManageSites": "Sites beheren",
|
||||||
"siteDescription": "Verbindt met uw netwerk via beveiligde tunnels",
|
"siteDescription": "Verbindt met uw netwerk via beveiligde tunnels",
|
||||||
"siteCreate": "Site maken",
|
"siteCreate": "Site maken",
|
||||||
@@ -96,7 +95,7 @@
|
|||||||
"siteWgDescription": "Gebruik een WireGuard client om een tunnel te bouwen. Handmatige NAT installatie vereist.",
|
"siteWgDescription": "Gebruik een WireGuard client om een tunnel te bouwen. Handmatige NAT installatie vereist.",
|
||||||
"siteWgDescriptionSaas": "Gebruik elke WireGuard-client om een tunnel op te zetten. Handmatige NAT-instelling vereist. WERKT ALLEEN OP SELF HOSTED NODES",
|
"siteWgDescriptionSaas": "Gebruik elke WireGuard-client om een tunnel op te zetten. Handmatige NAT-instelling vereist. WERKT ALLEEN OP SELF HOSTED NODES",
|
||||||
"siteLocalDescription": "Alleen lokale bronnen. Geen tunneling.",
|
"siteLocalDescription": "Alleen lokale bronnen. Geen tunneling.",
|
||||||
"siteLocalDescriptionSaas": "Local resources only. No tunneling. Only available on remote nodes.",
|
"siteLocalDescriptionSaas": "Enkel lokale bronnen. Geen tunneling. Alleen beschikbaar op externe knooppunten.",
|
||||||
"siteSeeAll": "Alle sites bekijken",
|
"siteSeeAll": "Alle sites bekijken",
|
||||||
"siteTunnelDescription": "Bepaal hoe u verbinding wilt maken met uw site",
|
"siteTunnelDescription": "Bepaal hoe u verbinding wilt maken met uw site",
|
||||||
"siteNewtCredentials": "Nieuwste aanmeldgegevens",
|
"siteNewtCredentials": "Nieuwste aanmeldgegevens",
|
||||||
@@ -154,8 +153,7 @@
|
|||||||
"protected": "Beschermd",
|
"protected": "Beschermd",
|
||||||
"notProtected": "Niet beveiligd",
|
"notProtected": "Niet beveiligd",
|
||||||
"resourceMessageRemove": "Eenmaal verwijderd, zal het bestand niet langer toegankelijk zijn. Alle doelen die gekoppeld zijn aan het hulpbron, zullen ook verwijderd worden.",
|
"resourceMessageRemove": "Eenmaal verwijderd, zal het bestand niet langer toegankelijk zijn. Alle doelen die gekoppeld zijn aan het hulpbron, zullen ook verwijderd worden.",
|
||||||
"resourceMessageConfirm": "Om te bevestigen, typ de naam van de bron hieronder.",
|
"resourceQuestionRemove": "Weet u zeker dat u het document van de organisatie wilt verwijderen?",
|
||||||
"resourceQuestionRemove": "Weet u zeker dat u de resource {selectedResource} uit de organisatie wilt verwijderen?",
|
|
||||||
"resourceHTTP": "HTTPS bron",
|
"resourceHTTP": "HTTPS bron",
|
||||||
"resourceHTTPDescription": "Proxy verzoeken aan uw app via HTTPS via een subdomein of basisdomein.",
|
"resourceHTTPDescription": "Proxy verzoeken aan uw app via HTTPS via een subdomein of basisdomein.",
|
||||||
"resourceRaw": "TCP/UDP bron",
|
"resourceRaw": "TCP/UDP bron",
|
||||||
@@ -220,7 +218,7 @@
|
|||||||
"orgDeleteConfirm": "Bevestig Verwijderen Organisatie",
|
"orgDeleteConfirm": "Bevestig Verwijderen Organisatie",
|
||||||
"orgMessageRemove": "Deze actie is onomkeerbaar en zal alle bijbehorende gegevens verwijderen.",
|
"orgMessageRemove": "Deze actie is onomkeerbaar en zal alle bijbehorende gegevens verwijderen.",
|
||||||
"orgMessageConfirm": "Om te bevestigen, typ de naam van de onderstaande organisatie in.",
|
"orgMessageConfirm": "Om te bevestigen, typ de naam van de onderstaande organisatie in.",
|
||||||
"orgQuestionRemove": "Weet u zeker dat u de organisatie {selectedOrg} wilt verwijderen?",
|
"orgQuestionRemove": "Weet u zeker dat u de organisatie wilt verwijderen?",
|
||||||
"orgUpdated": "Organisatie bijgewerkt",
|
"orgUpdated": "Organisatie bijgewerkt",
|
||||||
"orgUpdatedDescription": "De organisatie is bijgewerkt.",
|
"orgUpdatedDescription": "De organisatie is bijgewerkt.",
|
||||||
"orgErrorUpdate": "Bijwerken organisatie mislukt",
|
"orgErrorUpdate": "Bijwerken organisatie mislukt",
|
||||||
@@ -287,9 +285,8 @@
|
|||||||
"apiKeysAdd": "API-sleutel genereren",
|
"apiKeysAdd": "API-sleutel genereren",
|
||||||
"apiKeysErrorDelete": "Fout bij verwijderen API-sleutel",
|
"apiKeysErrorDelete": "Fout bij verwijderen API-sleutel",
|
||||||
"apiKeysErrorDeleteMessage": "Fout bij verwijderen API-sleutel",
|
"apiKeysErrorDeleteMessage": "Fout bij verwijderen API-sleutel",
|
||||||
"apiKeysQuestionRemove": "Weet u zeker dat u de API-sleutel {selectedApiKey} van de organisatie wilt verwijderen?",
|
"apiKeysQuestionRemove": "Weet u zeker dat u de API-sleutel van de organisatie wilt verwijderen?",
|
||||||
"apiKeysMessageRemove": "Eenmaal verwijderd, kan de API-sleutel niet meer worden gebruikt.",
|
"apiKeysMessageRemove": "Eenmaal verwijderd, kan de API-sleutel niet meer worden gebruikt.",
|
||||||
"apiKeysMessageConfirm": "Om dit te bevestigen, typt u de naam van de API-sleutel hieronder.",
|
|
||||||
"apiKeysDeleteConfirm": "Bevestig Verwijderen API-sleutel",
|
"apiKeysDeleteConfirm": "Bevestig Verwijderen API-sleutel",
|
||||||
"apiKeysDelete": "API-sleutel verwijderen",
|
"apiKeysDelete": "API-sleutel verwijderen",
|
||||||
"apiKeysManage": "API-sleutels beheren",
|
"apiKeysManage": "API-sleutels beheren",
|
||||||
@@ -305,8 +302,7 @@
|
|||||||
"userDeleteConfirm": "Bevestig verwijderen gebruiker",
|
"userDeleteConfirm": "Bevestig verwijderen gebruiker",
|
||||||
"userDeleteServer": "Gebruiker verwijderen van de server",
|
"userDeleteServer": "Gebruiker verwijderen van de server",
|
||||||
"userMessageRemove": "De gebruiker zal uit alle organisaties verwijderd worden en volledig verwijderd worden van de server.",
|
"userMessageRemove": "De gebruiker zal uit alle organisaties verwijderd worden en volledig verwijderd worden van de server.",
|
||||||
"userMessageConfirm": "Typ de naam van de gebruiker hieronder om te bevestigen.",
|
"userQuestionRemove": "Weet u zeker dat u de gebruiker permanent van de server wilt verwijderen?",
|
||||||
"userQuestionRemove": "Weet je zeker dat je {selectedUser} permanent van de server wilt verwijderen?",
|
|
||||||
"licenseKey": "Licentie sleutel",
|
"licenseKey": "Licentie sleutel",
|
||||||
"valid": "Geldig",
|
"valid": "Geldig",
|
||||||
"numberOfSites": "Aantal sites",
|
"numberOfSites": "Aantal sites",
|
||||||
@@ -339,7 +335,7 @@
|
|||||||
"fossorialLicense": "Fossorial Commerciële licentie- en abonnementsvoorwaarden bekijken",
|
"fossorialLicense": "Fossorial Commerciële licentie- en abonnementsvoorwaarden bekijken",
|
||||||
"licenseMessageRemove": "Dit zal de licentiesleutel en alle bijbehorende machtigingen verwijderen die hierdoor zijn verleend.",
|
"licenseMessageRemove": "Dit zal de licentiesleutel en alle bijbehorende machtigingen verwijderen die hierdoor zijn verleend.",
|
||||||
"licenseMessageConfirm": "Typ de licentiesleutel hieronder om te bevestigen.",
|
"licenseMessageConfirm": "Typ de licentiesleutel hieronder om te bevestigen.",
|
||||||
"licenseQuestionRemove": "Weet u zeker dat u de licentiesleutel {selectedKey} wilt verwijderen?",
|
"licenseQuestionRemove": "Weet u zeker dat u de licentiesleutel wilt verwijderen?",
|
||||||
"licenseKeyDelete": "Licentiesleutel verwijderen",
|
"licenseKeyDelete": "Licentiesleutel verwijderen",
|
||||||
"licenseKeyDeleteConfirm": "Bevestig verwijderen licentiesleutel",
|
"licenseKeyDeleteConfirm": "Bevestig verwijderen licentiesleutel",
|
||||||
"licenseTitle": "Licentiestatus beheren",
|
"licenseTitle": "Licentiestatus beheren",
|
||||||
@@ -372,7 +368,7 @@
|
|||||||
"inviteRemoveErrorDescription": "Er is een fout opgetreden tijdens het verwijderen van de uitnodiging.",
|
"inviteRemoveErrorDescription": "Er is een fout opgetreden tijdens het verwijderen van de uitnodiging.",
|
||||||
"inviteRemoved": "Uitnodiging verwijderd",
|
"inviteRemoved": "Uitnodiging verwijderd",
|
||||||
"inviteRemovedDescription": "De uitnodiging voor {email} is verwijderd.",
|
"inviteRemovedDescription": "De uitnodiging voor {email} is verwijderd.",
|
||||||
"inviteQuestionRemove": "Weet u zeker dat u de uitnodiging {email} wilt verwijderen?",
|
"inviteQuestionRemove": "Weet je zeker dat je de uitnodiging wilt verwijderen?",
|
||||||
"inviteMessageRemove": "Eenmaal verwijderd, zal deze uitnodiging niet meer geldig zijn. U kunt de gebruiker later altijd opnieuw uitnodigen.",
|
"inviteMessageRemove": "Eenmaal verwijderd, zal deze uitnodiging niet meer geldig zijn. U kunt de gebruiker later altijd opnieuw uitnodigen.",
|
||||||
"inviteMessageConfirm": "Om dit te bevestigen, typ dan het e-mailadres van onderstaande uitnodiging.",
|
"inviteMessageConfirm": "Om dit te bevestigen, typ dan het e-mailadres van onderstaande uitnodiging.",
|
||||||
"inviteQuestionRegenerate": "Weet u zeker dat u de uitnodiging voor {email}opnieuw wilt genereren? Dit zal de vorige uitnodiging intrekken.",
|
"inviteQuestionRegenerate": "Weet u zeker dat u de uitnodiging voor {email}opnieuw wilt genereren? Dit zal de vorige uitnodiging intrekken.",
|
||||||
@@ -398,9 +394,8 @@
|
|||||||
"userErrorOrgRemoveDescription": "Er is een fout opgetreden tijdens het verwijderen van de gebruiker.",
|
"userErrorOrgRemoveDescription": "Er is een fout opgetreden tijdens het verwijderen van de gebruiker.",
|
||||||
"userOrgRemoved": "Gebruiker verwijderd",
|
"userOrgRemoved": "Gebruiker verwijderd",
|
||||||
"userOrgRemovedDescription": "De gebruiker {email} is verwijderd uit de organisatie.",
|
"userOrgRemovedDescription": "De gebruiker {email} is verwijderd uit de organisatie.",
|
||||||
"userQuestionOrgRemove": "Weet u zeker dat u {email} wilt verwijderen uit de organisatie?",
|
"userQuestionOrgRemove": "Weet u zeker dat u deze gebruiker wilt verwijderen uit de organisatie?",
|
||||||
"userMessageOrgRemove": "Eenmaal verwijderd, heeft deze gebruiker geen toegang meer tot de organisatie. Je kunt ze later altijd opnieuw uitnodigen, maar ze zullen de uitnodiging opnieuw moeten accepteren.",
|
"userMessageOrgRemove": "Eenmaal verwijderd, heeft deze gebruiker geen toegang meer tot de organisatie. Je kunt ze later altijd opnieuw uitnodigen, maar ze zullen de uitnodiging opnieuw moeten accepteren.",
|
||||||
"userMessageOrgConfirm": "Typ om te bevestigen de naam van de gebruiker hieronder.",
|
|
||||||
"userRemoveOrgConfirm": "Bevestig verwijderen gebruiker",
|
"userRemoveOrgConfirm": "Bevestig verwijderen gebruiker",
|
||||||
"userRemoveOrg": "Gebruiker uit organisatie verwijderen",
|
"userRemoveOrg": "Gebruiker uit organisatie verwijderen",
|
||||||
"users": "Gebruikers",
|
"users": "Gebruikers",
|
||||||
@@ -730,7 +725,7 @@
|
|||||||
"pangolinServerAdmin": "Serverbeheer - Pangolin",
|
"pangolinServerAdmin": "Serverbeheer - Pangolin",
|
||||||
"licenseTierProfessional": "Professionele licentie",
|
"licenseTierProfessional": "Professionele licentie",
|
||||||
"licenseTierEnterprise": "Enterprise Licentie",
|
"licenseTierEnterprise": "Enterprise Licentie",
|
||||||
"licenseTierPersonal": "Personal License",
|
"licenseTierPersonal": "Persoonlijke licentie",
|
||||||
"licensed": "Gelicentieerd",
|
"licensed": "Gelicentieerd",
|
||||||
"yes": "ja",
|
"yes": "ja",
|
||||||
"no": "Neen",
|
"no": "Neen",
|
||||||
@@ -742,7 +737,7 @@
|
|||||||
"idpManageDescription": "Identiteitsaanbieders in het systeem bekijken en beheren",
|
"idpManageDescription": "Identiteitsaanbieders in het systeem bekijken en beheren",
|
||||||
"idpDeletedDescription": "Identity provider succesvol verwijderd",
|
"idpDeletedDescription": "Identity provider succesvol verwijderd",
|
||||||
"idpOidc": "OAuth2/OIDC",
|
"idpOidc": "OAuth2/OIDC",
|
||||||
"idpQuestionRemove": "Weet u zeker dat u de identiteitsprovider {name} permanent wilt verwijderen?",
|
"idpQuestionRemove": "Weet u zeker dat u de identiteitsprovider permanent wilt verwijderen?",
|
||||||
"idpMessageRemove": "Dit zal de identiteitsprovider en alle bijbehorende configuraties verwijderen. Gebruikers die via deze provider authenticeren, kunnen niet langer inloggen.",
|
"idpMessageRemove": "Dit zal de identiteitsprovider en alle bijbehorende configuraties verwijderen. Gebruikers die via deze provider authenticeren, kunnen niet langer inloggen.",
|
||||||
"idpMessageConfirm": "Om dit te bevestigen, typt u de naam van onderstaande identiteitsprovider.",
|
"idpMessageConfirm": "Om dit te bevestigen, typt u de naam van onderstaande identiteitsprovider.",
|
||||||
"idpConfirmDelete": "Bevestig verwijderen identiteit provider",
|
"idpConfirmDelete": "Bevestig verwijderen identiteit provider",
|
||||||
@@ -916,6 +911,18 @@
|
|||||||
"passwordResetCodeDescription": "Controleer je e-mail voor de reset code.",
|
"passwordResetCodeDescription": "Controleer je e-mail voor de reset code.",
|
||||||
"passwordNew": "Nieuw wachtwoord",
|
"passwordNew": "Nieuw wachtwoord",
|
||||||
"passwordNewConfirm": "Bevestig nieuw wachtwoord",
|
"passwordNewConfirm": "Bevestig nieuw wachtwoord",
|
||||||
|
"changePassword": "Wachtwoord wijzigen",
|
||||||
|
"changePasswordDescription": "Uw wachtwoord bijwerken",
|
||||||
|
"oldPassword": "Huidig wachtwoord",
|
||||||
|
"newPassword": "Nieuw wachtwoord",
|
||||||
|
"confirmNewPassword": "Bevestig nieuw wachtwoord",
|
||||||
|
"changePasswordError": "Wachtwoord wijzigen mislukt",
|
||||||
|
"changePasswordErrorDescription": "Er is een fout opgetreden tijdens het wijzigen van uw wachtwoord",
|
||||||
|
"changePasswordSuccess": "Wachtwoord succesvol gewijzigd",
|
||||||
|
"changePasswordSuccessDescription": "Uw wachtwoord is met succes bijgewerkt",
|
||||||
|
"passwordExpiryRequired": "Wachtwoord vervalt verplicht",
|
||||||
|
"passwordExpiryDescription": "Deze organisatie vereist dat u om de {maxDays} dagen uw wachtwoord wijzigt.",
|
||||||
|
"changePasswordNow": "Wijzig wachtwoord nu",
|
||||||
"pincodeAuth": "Authenticatiecode",
|
"pincodeAuth": "Authenticatiecode",
|
||||||
"pincodeSubmit2": "Code indienen",
|
"pincodeSubmit2": "Code indienen",
|
||||||
"passwordResetSubmit": "Opnieuw instellen aanvragen",
|
"passwordResetSubmit": "Opnieuw instellen aanvragen",
|
||||||
@@ -1154,8 +1161,27 @@
|
|||||||
"sidebarAllUsers": "Alle gebruikers",
|
"sidebarAllUsers": "Alle gebruikers",
|
||||||
"sidebarIdentityProviders": "Identiteit aanbieders",
|
"sidebarIdentityProviders": "Identiteit aanbieders",
|
||||||
"sidebarLicense": "Licentie",
|
"sidebarLicense": "Licentie",
|
||||||
"sidebarClients": "Clients",
|
"sidebarClients": "Clienten",
|
||||||
"sidebarDomains": "Domeinen",
|
"sidebarDomains": "Domeinen",
|
||||||
|
"sidebarBluePrints": "Blauwdrukken",
|
||||||
|
"blueprints": "Blauwdrukken",
|
||||||
|
"blueprintsDescription": "Blauwdrukken zijn declaratieve YAML-configuraties die je bronnen en hun instellingen bepalen",
|
||||||
|
"blueprintAdd": "Blauwdruk toevoegen",
|
||||||
|
"blueprintGoBack": "Bekijk alle Blauwdrukken",
|
||||||
|
"blueprintCreate": "Creëer blauwdruk",
|
||||||
|
"blueprintCreateDescription2": "Volg de onderstaande stappen om een nieuwe blauwdruk te maken en toe te passen",
|
||||||
|
"blueprintDetails": "Blauwdruk details",
|
||||||
|
"blueprintDetailsDescription": "Bekijk de blauwdruk run details",
|
||||||
|
"blueprintInfo": "Blauwdruk Informatie",
|
||||||
|
"message": "bericht",
|
||||||
|
"blueprintContentsDescription": "Definieer de YAML content die je infrastructuur beschrijft",
|
||||||
|
"blueprintErrorCreateDescription": "Er is een fout opgetreden bij het toepassen van de blauwdruk",
|
||||||
|
"blueprintErrorCreate": "Fout bij maken blauwdruk",
|
||||||
|
"searchBlueprintProgress": "Blauwdrukken zoeken...",
|
||||||
|
"appliedAt": "Toegepast op",
|
||||||
|
"source": "Bron",
|
||||||
|
"contents": "Inhoud",
|
||||||
|
"parsedContents": "Geparseerde inhoud",
|
||||||
"enableDockerSocket": "Schakel Docker Blauwdruk in",
|
"enableDockerSocket": "Schakel Docker Blauwdruk in",
|
||||||
"enableDockerSocketDescription": "Schakel Docker Socket label in voor blauwdruk labels. Pad naar Nieuw.",
|
"enableDockerSocketDescription": "Schakel Docker Socket label in voor blauwdruk labels. Pad naar Nieuw.",
|
||||||
"enableDockerSocketLink": "Meer informatie",
|
"enableDockerSocketLink": "Meer informatie",
|
||||||
@@ -1211,9 +1237,8 @@
|
|||||||
"domainCreate": "Domein aanmaken",
|
"domainCreate": "Domein aanmaken",
|
||||||
"domainCreatedDescription": "Domein succesvol aangemaakt",
|
"domainCreatedDescription": "Domein succesvol aangemaakt",
|
||||||
"domainDeletedDescription": "Domein succesvol verwijderd",
|
"domainDeletedDescription": "Domein succesvol verwijderd",
|
||||||
"domainQuestionRemove": "Weet je zeker dat je het domein {domain} uit je account wilt verwijderen?",
|
"domainQuestionRemove": "Weet u zeker dat u het domein uit uw account wilt verwijderen?",
|
||||||
"domainMessageRemove": "Na verwijdering zal het domein niet langer aan je account gekoppeld zijn.",
|
"domainMessageRemove": "Na verwijdering zal het domein niet langer aan je account gekoppeld zijn.",
|
||||||
"domainMessageConfirm": "Om te bevestigen, typ hieronder de domeinnaam.",
|
|
||||||
"domainConfirmDelete": "Bevestig verwijdering van domein",
|
"domainConfirmDelete": "Bevestig verwijdering van domein",
|
||||||
"domainDelete": "Domein verwijderen",
|
"domainDelete": "Domein verwijderen",
|
||||||
"domain": "Domein",
|
"domain": "Domein",
|
||||||
@@ -1280,7 +1305,7 @@
|
|||||||
"billingFreeTier": "Gratis Niveau",
|
"billingFreeTier": "Gratis Niveau",
|
||||||
"billingWarningOverLimit": "Waarschuwing: U hebt een of meer gebruikslimieten overschreden. Uw sites maken geen verbinding totdat u uw abonnement aanpast of uw gebruik aanpast.",
|
"billingWarningOverLimit": "Waarschuwing: U hebt een of meer gebruikslimieten overschreden. Uw sites maken geen verbinding totdat u uw abonnement aanpast of uw gebruik aanpast.",
|
||||||
"billingUsageLimitsOverview": "Overzicht gebruikslimieten",
|
"billingUsageLimitsOverview": "Overzicht gebruikslimieten",
|
||||||
"billingMonitorUsage": "Houd uw gebruik in de gaten ten opzichte van de ingestelde limieten. Als u verhoogde limieten nodig heeft, neem dan contact met ons op support@fossorial.io.",
|
"billingMonitorUsage": "Houd uw gebruik in de gaten ten opzichte van de ingestelde limieten. Als u verhoogde limieten nodig heeft, neem dan contact met ons op support@pangolin.net.",
|
||||||
"billingDataUsage": "Gegevensgebruik",
|
"billingDataUsage": "Gegevensgebruik",
|
||||||
"billingOnlineTime": "Site Online Tijd",
|
"billingOnlineTime": "Site Online Tijd",
|
||||||
"billingUsers": "Actieve Gebruikers",
|
"billingUsers": "Actieve Gebruikers",
|
||||||
@@ -1346,6 +1371,19 @@
|
|||||||
"securityKeyUnknownError": "Er was een probleem met het gebruik van je beveiligingssleutel. Probeer het opnieuw.",
|
"securityKeyUnknownError": "Er was een probleem met het gebruik van je beveiligingssleutel. Probeer het opnieuw.",
|
||||||
"twoFactorRequired": "Tweestapsverificatie is vereist om een beveiligingssleutel te registreren.",
|
"twoFactorRequired": "Tweestapsverificatie is vereist om een beveiligingssleutel te registreren.",
|
||||||
"twoFactor": "Tweestapsverificatie",
|
"twoFactor": "Tweestapsverificatie",
|
||||||
|
"twoFactorAuthentication": "Tweestapsverificatie verificatie",
|
||||||
|
"twoFactorDescription": "Deze organisatie vereist tweestapsverificatie.",
|
||||||
|
"enableTwoFactor": "Tweestapsverificatie inschakelen",
|
||||||
|
"organizationSecurityPolicy": "Organisatie Veiligheidsbeleid",
|
||||||
|
"organizationSecurityPolicyDescription": "Deze organisatie heeft beveiligingsvereisten waaraan moet worden voldaan voordat u deze kunt openen",
|
||||||
|
"securityRequirements": "Veiligheidsvereisten",
|
||||||
|
"allRequirementsMet": "Aan alle vereisten is voldaan",
|
||||||
|
"completeRequirementsToContinue": "Voltooi de onderstaande vereisten om toegang te blijven krijgen tot deze organisatie",
|
||||||
|
"youCanNowAccessOrganization": "U heeft nu toegang tot deze organisatie",
|
||||||
|
"reauthenticationRequired": "Sessie Lengte",
|
||||||
|
"reauthenticationDescription": "Deze organisatie vereist dat u elke {maxDays} dagen inlogt.",
|
||||||
|
"reauthenticationDescriptionHours": "Deze organisatie vereist dat u elke {maxHours} uur inlogt.",
|
||||||
|
"reauthenticateNow": "Opnieuw inloggen",
|
||||||
"adminEnabled2FaOnYourAccount": "Je beheerder heeft tweestapsverificatie voor {email} ingeschakeld. Voltooi het instellingsproces om verder te gaan.",
|
"adminEnabled2FaOnYourAccount": "Je beheerder heeft tweestapsverificatie voor {email} ingeschakeld. Voltooi het instellingsproces om verder te gaan.",
|
||||||
"securityKeyAdd": "Beveiligingssleutel toevoegen",
|
"securityKeyAdd": "Beveiligingssleutel toevoegen",
|
||||||
"securityKeyRegisterTitle": "Nieuwe beveiligingssleutel registreren",
|
"securityKeyRegisterTitle": "Nieuwe beveiligingssleutel registreren",
|
||||||
@@ -1558,14 +1596,13 @@
|
|||||||
"autoLoginErrorNoRedirectUrl": "Geen redirect URL ontvangen van de identity provider.",
|
"autoLoginErrorNoRedirectUrl": "Geen redirect URL ontvangen van de identity provider.",
|
||||||
"autoLoginErrorGeneratingUrl": "Genereren van authenticatie-URL mislukt.",
|
"autoLoginErrorGeneratingUrl": "Genereren van authenticatie-URL mislukt.",
|
||||||
"remoteExitNodeManageRemoteExitNodes": "Externe knooppunten",
|
"remoteExitNodeManageRemoteExitNodes": "Externe knooppunten",
|
||||||
"remoteExitNodeDescription": "Self-host one or more remote nodes to extend your network connectivity and reduce reliance on the cloud",
|
"remoteExitNodeDescription": "Zorgt voor één of meer externe knooppunten om de netwerkverbinding uit te breiden en het vertrouwen in de cloud te verminderen",
|
||||||
"remoteExitNodes": "Nodes",
|
"remoteExitNodes": "Nodes",
|
||||||
"searchRemoteExitNodes": "Knooppunten zoeken...",
|
"searchRemoteExitNodes": "Knooppunten zoeken...",
|
||||||
"remoteExitNodeAdd": "Voeg node toe",
|
"remoteExitNodeAdd": "Voeg node toe",
|
||||||
"remoteExitNodeErrorDelete": "Fout bij verwijderen node",
|
"remoteExitNodeErrorDelete": "Fout bij verwijderen node",
|
||||||
"remoteExitNodeQuestionRemove": "Weet u zeker dat u het node {selectedNode} uit de organisatie wilt verwijderen?",
|
"remoteExitNodeQuestionRemove": "Weet u zeker dat u het knooppunt uit de organisatie wilt verwijderen?",
|
||||||
"remoteExitNodeMessageRemove": "Eenmaal verwijderd, zal het knooppunt niet langer toegankelijk zijn.",
|
"remoteExitNodeMessageRemove": "Eenmaal verwijderd, zal het knooppunt niet langer toegankelijk zijn.",
|
||||||
"remoteExitNodeMessageConfirm": "Om te bevestigen, typ de naam van het knooppunt hieronder.",
|
|
||||||
"remoteExitNodeConfirmDelete": "Bevestig verwijderen node",
|
"remoteExitNodeConfirmDelete": "Bevestig verwijderen node",
|
||||||
"remoteExitNodeDelete": "Knoop verwijderen",
|
"remoteExitNodeDelete": "Knoop verwijderen",
|
||||||
"sidebarRemoteExitNodes": "Externe knooppunten",
|
"sidebarRemoteExitNodes": "Externe knooppunten",
|
||||||
@@ -1733,7 +1770,49 @@
|
|||||||
"resourceExposePortsEditFile": "Bestand bewerken: docker-compose.yml",
|
"resourceExposePortsEditFile": "Bestand bewerken: docker-compose.yml",
|
||||||
"emailVerificationRequired": "E-mail verificatie is vereist. Log opnieuw in via {dashboardUrl}/auth/login voltooide deze stap. Kom daarna hier terug.",
|
"emailVerificationRequired": "E-mail verificatie is vereist. Log opnieuw in via {dashboardUrl}/auth/login voltooide deze stap. Kom daarna hier terug.",
|
||||||
"twoFactorSetupRequired": "Tweestapsverificatie instellen is vereist. Log opnieuw in via {dashboardUrl}/auth/login voltooide deze stap. Kom daarna hier terug.",
|
"twoFactorSetupRequired": "Tweestapsverificatie instellen is vereist. Log opnieuw in via {dashboardUrl}/auth/login voltooide deze stap. Kom daarna hier terug.",
|
||||||
|
"additionalSecurityRequired": "Extra beveiliging vereist",
|
||||||
|
"organizationRequiresAdditionalSteps": "Deze organisatie vereist extra beveiligingsstappen voordat u toegang hebt tot de bronnen.",
|
||||||
|
"completeTheseSteps": "Voltooi deze stappen",
|
||||||
|
"enableTwoFactorAuthentication": "Tweestapsverificatie inschakelen",
|
||||||
|
"completeSecuritySteps": "Voltooi beveiligingsstappen",
|
||||||
|
"securitySettings": "Beveiliging instellingen",
|
||||||
|
"securitySettingsDescription": "Beveiligingsbeleid voor uw organisatie configureren",
|
||||||
|
"requireTwoFactorForAllUsers": "Authenticatie in twee stappen vereist voor alle gebruikers",
|
||||||
|
"requireTwoFactorDescription": "Wanneer ingeschakeld, moeten alle interne gebruikers in deze organisatie tweestapsverificatie ingeschakeld hebben om toegang te krijgen tot de organisatie.",
|
||||||
|
"requireTwoFactorDisabledDescription": "Deze functie vereist een geldig licentie (Enterprise) of actief abonnement (SaaS)",
|
||||||
|
"requireTwoFactorCannotEnableDescription": "U moet tweestapsverificatie inschakelen voor uw account voordat u deze voor alle gebruikers kan afdwingen",
|
||||||
|
"maxSessionLength": "Maximale sessielengte",
|
||||||
|
"maxSessionLengthDescription": "Stel de maximale duur van de gebruikerssessies in. Na deze tijd zullen gebruikers opnieuw moeten verifiëren.",
|
||||||
|
"maxSessionLengthDisabledDescription": "Deze functie vereist een geldig licentie (Enterprise) of actief abonnement (SaaS)",
|
||||||
|
"selectSessionLength": "Selecteer sessie lengte",
|
||||||
|
"unenforced": "Onafgedwongen",
|
||||||
|
"1Hour": "1 uur",
|
||||||
|
"3Hours": "3 uur",
|
||||||
|
"6Hours": "6 uur",
|
||||||
|
"12Hours": "12 uur",
|
||||||
|
"1DaySession": "1 dag",
|
||||||
|
"3Days": "3 dagen",
|
||||||
|
"7Days": "7 dagen",
|
||||||
|
"14Days": "14 dagen",
|
||||||
|
"30DaysSession": "30 dagen",
|
||||||
|
"90DaysSession": "90 dagen",
|
||||||
|
"180DaysSession": "180 dagen",
|
||||||
|
"passwordExpiryDays": "Wachtwoord verloopt",
|
||||||
|
"editPasswordExpiryDescription": "Stel het aantal dagen in voordat gebruikers verplicht zijn hun wachtwoord te wijzigen.",
|
||||||
|
"selectPasswordExpiry": "Selecteer wachtwoord vervaldatum",
|
||||||
|
"30Days": "30 dagen",
|
||||||
|
"1Day": "1 dag",
|
||||||
|
"60Days": "60 dagen",
|
||||||
|
"90Days": "90 dagen",
|
||||||
|
"180Days": "180 dagen",
|
||||||
|
"1Year": "1 jaar",
|
||||||
|
"subscriptionBadge": "Abonnement vereist",
|
||||||
|
"securityPolicyChangeWarning": "Waarschuwing wijzigen beveiligingsbeleid",
|
||||||
|
"securityPolicyChangeDescription": "U staat op het punt om de instellingen van het beveiligingsbeleid te wijzigen. Na het opslaan moet u zich opnieuw aanmelden om te voldoen aan deze beleidsupdates. Alle gebruikers die niet aan de voorwaarden voldoen, moeten zich ook opnieuw authenticeren.",
|
||||||
|
"securityPolicyChangeConfirmMessage": "Ik bevestig",
|
||||||
|
"securityPolicyChangeWarningText": "Dit heeft invloed op alle gebruikers in de organisatie",
|
||||||
"authPageErrorUpdateMessage": "Er is een fout opgetreden bij het bijwerken van de instellingen van de auth-pagina",
|
"authPageErrorUpdateMessage": "Er is een fout opgetreden bij het bijwerken van de instellingen van de auth-pagina",
|
||||||
|
"authPageErrorUpdate": "Kan de autorisatiepagina niet bijwerken",
|
||||||
"authPageUpdated": "Auth-pagina succesvol bijgewerkt",
|
"authPageUpdated": "Auth-pagina succesvol bijgewerkt",
|
||||||
"healthCheckNotAvailable": "Lokaal",
|
"healthCheckNotAvailable": "Lokaal",
|
||||||
"rewritePath": "Herschrijf Pad",
|
"rewritePath": "Herschrijf Pad",
|
||||||
@@ -1745,153 +1824,261 @@
|
|||||||
"resourceHeaderAuthRemoveDescription": "Koptekst authenticatie succesvol verwijderd.",
|
"resourceHeaderAuthRemoveDescription": "Koptekst authenticatie succesvol verwijderd.",
|
||||||
"resourceErrorHeaderAuthRemove": "Kan Header-authenticatie niet verwijderen",
|
"resourceErrorHeaderAuthRemove": "Kan Header-authenticatie niet verwijderen",
|
||||||
"resourceErrorHeaderAuthRemoveDescription": "Kon header authenticatie niet verwijderen voor de bron.",
|
"resourceErrorHeaderAuthRemoveDescription": "Kon header authenticatie niet verwijderen voor de bron.",
|
||||||
"resourceHeaderAuthProtectionEnabled": "Header Authentication Enabled",
|
"resourceHeaderAuthProtectionEnabled": "Koptekst authenticatie ingeschakeld",
|
||||||
"resourceHeaderAuthProtectionDisabled": "Header Authentication Disabled",
|
"resourceHeaderAuthProtectionDisabled": "Header authenticatie uitgeschakeld",
|
||||||
"headerAuthRemove": "Remove Header Auth",
|
"headerAuthRemove": "Auth koptekst verwijderen",
|
||||||
"headerAuthAdd": "Add Header Auth",
|
"headerAuthAdd": "Kopsauth toevoegen",
|
||||||
"resourceErrorHeaderAuthSetup": "Kan Header Authenticatie niet instellen",
|
"resourceErrorHeaderAuthSetup": "Kan Header Authenticatie niet instellen",
|
||||||
"resourceErrorHeaderAuthSetupDescription": "Kan geen header authenticatie instellen voor de bron.",
|
"resourceErrorHeaderAuthSetupDescription": "Kan geen header authenticatie instellen voor de bron.",
|
||||||
"resourceHeaderAuthSetup": "Header Authenticatie set succesvol",
|
"resourceHeaderAuthSetup": "Header Authenticatie set succesvol",
|
||||||
"resourceHeaderAuthSetupDescription": "Header authenticatie is met succes ingesteld.",
|
"resourceHeaderAuthSetupDescription": "Header authenticatie is met succes ingesteld.",
|
||||||
"resourceHeaderAuthSetupTitle": "Header Authenticatie instellen",
|
"resourceHeaderAuthSetupTitle": "Header Authenticatie instellen",
|
||||||
"resourceHeaderAuthSetupTitleDescription": "Set the basic auth credentials (username and password) to protect this resource with HTTP Header Authentication. Access it using the format https://username:password@resource.example.com",
|
"resourceHeaderAuthSetupTitleDescription": "Stel de basis authenticatiegegevens (gebruikersnaam en wachtwoord) in om deze bron te beschermen met HTTP Header Authenticatie. Gebruik het formaat https://username:password@resource.example.com",
|
||||||
"resourceHeaderAuthSubmit": "Header Authenticatie instellen",
|
"resourceHeaderAuthSubmit": "Header Authenticatie instellen",
|
||||||
"actionSetResourceHeaderAuth": "Header Authenticatie instellen",
|
"actionSetResourceHeaderAuth": "Header Authenticatie instellen",
|
||||||
"enterpriseEdition": "Enterprise Edition",
|
"enterpriseEdition": "Enterprise Edition",
|
||||||
"unlicensed": "Unlicensed",
|
"unlicensed": "Ongelicentieerd",
|
||||||
"beta": "Beta",
|
"beta": "Bèta",
|
||||||
"manageClients": "Manage Clients",
|
"manageClients": "Beheer Cliënten",
|
||||||
"manageClientsDescription": "Clients are devices that can connect to your sites",
|
"manageClientsDescription": "Klanten zijn apparaten die verbinding kunnen maken met uw sites",
|
||||||
"licenseTableValidUntil": "Valid Until",
|
"licenseTableValidUntil": "Geldig tot",
|
||||||
"saasLicenseKeysSettingsTitle": "Enterprise Licenses",
|
"saasLicenseKeysSettingsTitle": "Enterprise Licenties",
|
||||||
"saasLicenseKeysSettingsDescription": "Generate and manage Enterprise license keys for self-hosted Pangolin instances",
|
"saasLicenseKeysSettingsDescription": "Genereer en beheer de Enterprise licentiesleutels voor zelfgehoste Pangolin instanties",
|
||||||
"sidebarEnterpriseLicenses": "Licenses",
|
"sidebarEnterpriseLicenses": "Licenties",
|
||||||
"generateLicenseKey": "Generate License Key",
|
"generateLicenseKey": "Licentiesleutel genereren",
|
||||||
"generateLicenseKeyForm": {
|
"generateLicenseKeyForm": {
|
||||||
"validation": {
|
"validation": {
|
||||||
"emailRequired": "Please enter a valid email address",
|
"emailRequired": "Voer een geldig e-mailadres in",
|
||||||
"useCaseTypeRequired": "Please select a use case type",
|
"useCaseTypeRequired": "Selecteer een type voor gebruik",
|
||||||
"firstNameRequired": "First name is required",
|
"firstNameRequired": "Voornaam is vereist",
|
||||||
"lastNameRequired": "Last name is required",
|
"lastNameRequired": "Achternaam is vereist",
|
||||||
"primaryUseRequired": "Please describe your primary use",
|
"primaryUseRequired": "Beschrijf uw primaire gebruik",
|
||||||
"jobTitleRequiredBusiness": "Job title is required for business use",
|
"jobTitleRequiredBusiness": "Functitel is vereist voor business gebruik",
|
||||||
"industryRequiredBusiness": "Industry is required for business use",
|
"industryRequiredBusiness": "Industrie is vereist voor zakelijk gebruik",
|
||||||
"stateProvinceRegionRequired": "State/Province/Region is required",
|
"stateProvinceRegionRequired": "Provincie/Regio is vereist",
|
||||||
"postalZipCodeRequired": "Postal/ZIP Code is required",
|
"postalZipCodeRequired": "Postcode is vereist",
|
||||||
"companyNameRequiredBusiness": "Company name is required for business use",
|
"companyNameRequiredBusiness": "Bedrijfsnaam is vereist voor zakelijk gebruik",
|
||||||
"countryOfResidenceRequiredBusiness": "Country of residence is required for business use",
|
"countryOfResidenceRequiredBusiness": "Land van verblijf is vereist voor zakelijk gebruik",
|
||||||
"countryRequiredPersonal": "Country is required for personal use",
|
"countryRequiredPersonal": "Land is vereist voor persoonlijk gebruik",
|
||||||
"agreeToTermsRequired": "You must agree to the terms",
|
"agreeToTermsRequired": "U moet akkoord gaan met de voorwaarden",
|
||||||
"complianceConfirmationRequired": "You must confirm compliance with the Fossorial Commercial License"
|
"complianceConfirmationRequired": "U moet de naleving van de Fossorial Commerciële licentie bevestigen"
|
||||||
},
|
},
|
||||||
"useCaseOptions": {
|
"useCaseOptions": {
|
||||||
"personal": {
|
"personal": {
|
||||||
"title": "Personal Use",
|
"title": "Persoonlijk gebruik",
|
||||||
"description": "For individual, non-commercial use such as learning, personal projects, or experimentation."
|
"description": "Voor individueel, niet-commercieel gebruik, zoals leren, persoonlijke projecten of experimenten."
|
||||||
},
|
},
|
||||||
"business": {
|
"business": {
|
||||||
"title": "Business Use",
|
"title": "Zakelijk gebruik",
|
||||||
"description": "For use within organizations, companies, or commercial or revenue-generating activities."
|
"description": "Voor gebruik binnen organisaties, bedrijven, commerciële of inkomstengenererende activiteiten."
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"steps": {
|
"steps": {
|
||||||
"emailLicenseType": {
|
"emailLicenseType": {
|
||||||
"title": "Email & License Type",
|
"title": "E-mail & Licentie Type",
|
||||||
"description": "Enter your email and choose your license type"
|
"description": "Voer uw e-mailadres in en kies uw licentietype"
|
||||||
},
|
},
|
||||||
"personalInformation": {
|
"personalInformation": {
|
||||||
"title": "Personal Information",
|
"title": "Persoonlijke informatie",
|
||||||
"description": "Tell us about yourself"
|
"description": "Vertel ons over jezelf"
|
||||||
},
|
},
|
||||||
"contactInformation": {
|
"contactInformation": {
|
||||||
"title": "Contact Information",
|
"title": "Contact informatie",
|
||||||
"description": "Your contact details"
|
"description": "Uw contactgegevens"
|
||||||
},
|
},
|
||||||
"termsGenerate": {
|
"termsGenerate": {
|
||||||
"title": "Terms & Generate",
|
"title": "Voorwaarden & Genereer",
|
||||||
"description": "Review and accept terms to generate your license"
|
"description": "Controleer en accepteer termen om uw licentie te genereren"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"alerts": {
|
"alerts": {
|
||||||
"commercialUseDisclosure": {
|
"commercialUseDisclosure": {
|
||||||
"title": "Usage Disclosure",
|
"title": "Disclosure voor gebruik",
|
||||||
"description": "Select the license tier that accurately reflects your intended use. The Personal License permits free use of the Software for individual, non-commercial or small-scale commercial activities with annual gross revenue under $100,000 USD. Any use beyond these limits — including use within a business, organization, or other revenue-generating environment — requires a valid Enterprise License and payment of the applicable licensing fee. All users, whether Personal or Enterprise, must comply with the Fossorial Commercial License Terms."
|
"description": "Selecteer de licentielift die precies overeenkomt met het beoogde gebruik. De Persoonlijke Licentie staat het gratis gebruik van de software toe voor individuele, niet-commerciële of kleinschalige commerciële activiteiten met jaarlijkse bruto inkomsten van minder dan $100.000 USD. Elk gebruik buiten deze grenzen - inclusief gebruik binnen een bedrijf, organisatie, of andere inkomstengenererende omgeving - vereist een geldige Enterprise-licentie en betaling van de toepasselijke licentiekosten. Alle gebruikers, Persoonlijk of Enterprise, moeten voldoen aan de Fossorial Commerciële Licentievoorwaarden."
|
||||||
},
|
},
|
||||||
"trialPeriodInformation": {
|
"trialPeriodInformation": {
|
||||||
"title": "Trial Period Information",
|
"title": "Informatie proefperiode",
|
||||||
"description": "This License Key enables Enterprise features for a 7-day evaluation period. Continued access to Paid Features beyond the evaluation period requires activation under a valid Personal or Enterprise License. For Enterprise licensing, contact sales@fossorial.io."
|
"description": "Deze licentiesleutel maakt bedrijfsfuncties mogelijk voor een evaluatieperiode van 7 dagen. Continue toegang tot betaalde functies na de evaluatieperiode vereist activering onder een geldige Persoonlijke of Enterprise License. Voor een Enterprise licentie, neem contact op met sales@pangolin.net."
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"form": {
|
"form": {
|
||||||
"useCaseQuestion": "Are you using Pangolin for personal or business use?",
|
"useCaseQuestion": "Gebruikt u Pangolin voor persoonlijk of zakelijk gebruik?",
|
||||||
"firstName": "First Name",
|
"firstName": "Voornaam is vereist.",
|
||||||
"lastName": "Last Name",
|
"lastName": "Achternaam is vereist",
|
||||||
"jobTitle": "Job Title",
|
"jobTitle": "Job titel",
|
||||||
"primaryUseQuestion": "What do you primarily plan to use Pangolin for?",
|
"primaryUseQuestion": "Waar bent u primair van plan Pangolin voor te gebruiken?",
|
||||||
"industryQuestion": "What is your industry?",
|
"industryQuestion": "Wat is uw industrie?",
|
||||||
"prospectiveUsersQuestion": "How many prospective users do you expect to have?",
|
"prospectiveUsersQuestion": "Hoeveel potentiële gebruikers verwacht je te hebben?",
|
||||||
"prospectiveSitesQuestion": "How many prospective sites (tunnels) do you expect to have?",
|
"prospectiveSitesQuestion": "Hoeveel potentiële sites (tunnels) verwacht je te hebben?",
|
||||||
"companyName": "Company name",
|
"companyName": "Naam bedrijf",
|
||||||
"countryOfResidence": "Country of residence",
|
"countryOfResidence": "Land van verblijf",
|
||||||
"stateProvinceRegion": "State / Province / Region",
|
"stateProvinceRegion": "Staat / Provincie / Regio",
|
||||||
"postalZipCode": "Postal / ZIP Code",
|
"postalZipCode": "Postcode / postcode",
|
||||||
"companyWebsite": "Company website",
|
"companyWebsite": "Bedrijfs website",
|
||||||
"companyPhoneNumber": "Company phone number",
|
"companyPhoneNumber": "Bedrijfs telefoonnummer",
|
||||||
"country": "Country",
|
"country": "Land",
|
||||||
"phoneNumberOptional": "Phone number (optional)",
|
"phoneNumberOptional": "Telefoonnummer (optioneel)",
|
||||||
"complianceConfirmation": "I confirm that I am in compliance with the Fossorial Commercial License and that reporting inaccurate information or misidentifying use of the product is a violation of the license."
|
"complianceConfirmation": "Ik bevestig dat de door mij verstrekte informatie juist is en dat ik mij aan de Fossorial Commerciële licentie houd. Het melden van onjuiste informatie of het verkeerd identificeren van het gebruik van het product is een schending van de licentie en kan leiden tot het intrekken van uw sleutel."
|
||||||
},
|
},
|
||||||
"buttons": {
|
"buttons": {
|
||||||
"close": "Close",
|
"close": "Sluiten",
|
||||||
"previous": "Previous",
|
"previous": "named@@0",
|
||||||
"next": "Next",
|
"next": "Volgende",
|
||||||
"generateLicenseKey": "Generate License Key"
|
"generateLicenseKey": "Licentiesleutel genereren"
|
||||||
},
|
},
|
||||||
"toasts": {
|
"toasts": {
|
||||||
"success": {
|
"success": {
|
||||||
"title": "License key generated successfully",
|
"title": "Licentiesleutel succesvol gegenereerd",
|
||||||
"description": "Your license key has been generated and is ready to use."
|
"description": "Uw licentiesleutel is gegenereerd en is klaar voor gebruik."
|
||||||
},
|
},
|
||||||
"error": {
|
"error": {
|
||||||
"title": "Failed to generate license key",
|
"title": "Kan licentiesleutel niet genereren",
|
||||||
"description": "An error occurred while generating the license key."
|
"description": "Fout opgetreden tijdens het genereren van de licentiesleutel."
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"priority": "Prioriteit",
|
"priority": "Prioriteit",
|
||||||
"priorityDescription": "routes met hogere prioriteit worden eerst geëvalueerd. Prioriteit = 100 betekent automatisch bestellen (systeem beslist de). Gebruik een ander nummer om handmatige prioriteit af te dwingen.",
|
"priorityDescription": "routes met hogere prioriteit worden eerst geëvalueerd. Prioriteit = 100 betekent automatisch bestellen (systeem beslist de). Gebruik een ander nummer om handmatige prioriteit af te dwingen.",
|
||||||
"instanceName": "Instance Name",
|
"instanceName": "Naam instantie",
|
||||||
"pathMatchModalTitle": "Configure Path Matching",
|
"pathMatchModalTitle": "Configureren van overeenkomende pad",
|
||||||
"pathMatchModalDescription": "Set up how incoming requests should be matched based on their path.",
|
"pathMatchModalDescription": "Stel in hoe inkomende verzoeken moeten worden gekoppeld aan hun pad.",
|
||||||
"pathMatchType": "Match Type",
|
"pathMatchType": "Wedstrijd Type",
|
||||||
"pathMatchPrefix": "Prefix",
|
"pathMatchPrefix": "Voorvoegsel",
|
||||||
"pathMatchExact": "Exact",
|
"pathMatchExact": "Exacte",
|
||||||
"pathMatchRegex": "Regex",
|
"pathMatchRegex": "Regex",
|
||||||
"pathMatchValue": "Path Value",
|
"pathMatchValue": "Pad waarde",
|
||||||
"clear": "Clear",
|
"clear": "Verwijderen",
|
||||||
"saveChanges": "Save Changes",
|
"saveChanges": "Wijzigingen opslaan",
|
||||||
"pathMatchRegexPlaceholder": "^/api/.*",
|
"pathMatchRegexPlaceholder": "^/api/.*",
|
||||||
"pathMatchDefaultPlaceholder": "/path",
|
"pathMatchDefaultPlaceholder": "/Pad",
|
||||||
"pathMatchPrefixHelp": "Example: /api matches /api, /api/users, etc.",
|
"pathMatchPrefixHelp": "Voorbeeld: /api komt overeen met /api, /api/gebruikers, etc.",
|
||||||
"pathMatchExactHelp": "Example: /api matches only /api",
|
"pathMatchExactHelp": "Voorbeeld: /api matcht alleen /api",
|
||||||
"pathMatchRegexHelp": "Example: ^/api/.* matches /api/anything",
|
"pathMatchRegexHelp": "Voorbeeld: ^/api/.* komt overeen met /api/any",
|
||||||
"pathRewriteModalTitle": "Configure Path Rewriting",
|
"pathRewriteModalTitle": "Configureer pad herschrijven",
|
||||||
"pathRewriteModalDescription": "Transform the matched path before forwarding to the target.",
|
"pathRewriteModalDescription": "Verander het overeenstemmende pad voor het doorsturen naar het doel.",
|
||||||
"pathRewriteType": "Rewrite Type",
|
"pathRewriteType": "Herschrijf Type",
|
||||||
"pathRewritePrefixOption": "Prefix - Replace prefix",
|
"pathRewritePrefixOption": "Voorvoegsel - prefix vervangen",
|
||||||
"pathRewriteExactOption": "Exact - Replace entire path",
|
"pathRewriteExactOption": "Exacte - Vervang het gehele pad",
|
||||||
"pathRewriteRegexOption": "Regex - Pattern replacement",
|
"pathRewriteRegexOption": "Regex - Patroon vervanging",
|
||||||
"pathRewriteStripPrefixOption": "Strip Prefix - Remove prefix",
|
"pathRewriteStripPrefixOption": "Voorvoegsel verwijderen - Verwijder voorvoegsel",
|
||||||
"pathRewriteValue": "Rewrite Value",
|
"pathRewriteValue": "Herschrijf Waarde",
|
||||||
"pathRewriteRegexPlaceholder": "/new/$1",
|
"pathRewriteRegexPlaceholder": "/nieuw/$1",
|
||||||
"pathRewriteDefaultPlaceholder": "/new-path",
|
"pathRewriteDefaultPlaceholder": "/nieuwe-pad",
|
||||||
"pathRewritePrefixHelp": "Replace the matched prefix with this value",
|
"pathRewritePrefixHelp": "Vervang de overeenkomstige prefix door deze waarde",
|
||||||
"pathRewriteExactHelp": "Replace the entire path with this value when the path matches exactly",
|
"pathRewriteExactHelp": "Vervang het hele pad met deze waarde wanneer het pad precies overeenkomt",
|
||||||
"pathRewriteRegexHelp": "Use capture groups like $1, $2 for replacement",
|
"pathRewriteRegexHelp": "Gebruik capturegroepen zoals $1, $2 voor vervanging",
|
||||||
"pathRewriteStripPrefixHelp": "Leave empty to strip prefix or provide new prefix",
|
"pathRewriteStripPrefixHelp": "Laat leeg om de voorvoegsel te strippen of geef een nieuw voorvoegsel",
|
||||||
"pathRewritePrefix": "Prefix",
|
"pathRewritePrefix": "Voorvoegsel",
|
||||||
"pathRewriteExact": "Exact",
|
"pathRewriteExact": "Exacte",
|
||||||
"pathRewriteRegex": "Regex",
|
"pathRewriteRegex": "Regex",
|
||||||
"pathRewriteStrip": "Strip",
|
"pathRewriteStrip": "Verwijder",
|
||||||
"pathRewriteStripLabel": "strip"
|
"pathRewriteStripLabel": "strip",
|
||||||
|
"sidebarEnableEnterpriseLicense": "Activeer Enterprise Licentie",
|
||||||
|
"cannotbeUndone": "Dit kan niet ongedaan worden gemaakt.",
|
||||||
|
"toConfirm": "om te bevestigen",
|
||||||
|
"deleteClientQuestion": "Weet u zeker dat u de client van de site en organisatie wilt verwijderen?",
|
||||||
|
"clientMessageRemove": "Eenmaal verwijderd, kan de client geen verbinding meer maken met de site.",
|
||||||
|
"sidebarLogs": "Logboeken",
|
||||||
|
"request": "Aanvragen",
|
||||||
|
"logs": "Logboeken",
|
||||||
|
"logsSettingsDescription": "Monitor logs verzameld van deze orginiatie",
|
||||||
|
"searchLogs": "Logboeken zoeken...",
|
||||||
|
"action": "actie",
|
||||||
|
"actor": "Acteur",
|
||||||
|
"timestamp": "Artikeldatering",
|
||||||
|
"accessLogs": "Toegang tot logboek",
|
||||||
|
"exportCsv": "Exporteren als CSV",
|
||||||
|
"actorId": "Acteur ID",
|
||||||
|
"allowedByRule": "Toegestaan door regel",
|
||||||
|
"allowedNoAuth": "Toegestaan geen authenticatie",
|
||||||
|
"validAccessToken": "Geldige toegangstoken",
|
||||||
|
"validHeaderAuth": "Valid header auth",
|
||||||
|
"validPincode": "Valid Pincode",
|
||||||
|
"validPassword": "Geldig wachtwoord",
|
||||||
|
"validEmail": "Valid email",
|
||||||
|
"validSSO": "Valid SSO",
|
||||||
|
"resourceBlocked": "Bron geblokkeerd",
|
||||||
|
"droppedByRule": "Achtergelaten door regel",
|
||||||
|
"noSessions": "Geen sessies",
|
||||||
|
"temporaryRequestToken": "Tijdelijk verzoek token",
|
||||||
|
"noMoreAuthMethods": "No Valid Auth",
|
||||||
|
"ip": "IP-adres",
|
||||||
|
"reason": "Reden",
|
||||||
|
"requestLogs": "Logboeken aanvragen",
|
||||||
|
"host": "Hostnaam",
|
||||||
|
"location": "Locatie",
|
||||||
|
"actionLogs": "Actie logs",
|
||||||
|
"sidebarLogsRequest": "Logboeken aanvragen",
|
||||||
|
"sidebarLogsAccess": "Toegang tot logboek",
|
||||||
|
"sidebarLogsAction": "Actie logs",
|
||||||
|
"logRetention": "Log bewaring",
|
||||||
|
"logRetentionDescription": "Beheren hoe lang verschillende soorten logs bewaard worden voor deze organisatie of schakel ze uit",
|
||||||
|
"requestLogsDescription": "Bekijk gedetailleerde verzoeklogboeken voor resources in deze organisatie",
|
||||||
|
"logRetentionRequestLabel": "Logboekbewaring aanvragen",
|
||||||
|
"logRetentionRequestDescription": "Hoe lang de aanvraaglogboeken te behouden",
|
||||||
|
"logRetentionAccessLabel": "Toegang logboek bewaring",
|
||||||
|
"logRetentionAccessDescription": "Hoe lang de toegangslogboeken behouden blijven",
|
||||||
|
"logRetentionActionLabel": "Actie log bewaring",
|
||||||
|
"logRetentionActionDescription": "Hoe lang de action logs behouden moeten blijven",
|
||||||
|
"logRetentionDisabled": "Uitgeschakeld",
|
||||||
|
"logRetention3Days": "3 dagen",
|
||||||
|
"logRetention7Days": "7 dagen",
|
||||||
|
"logRetention14Days": "14 dagen",
|
||||||
|
"logRetention30Days": "30 dagen",
|
||||||
|
"logRetention90Days": "90 dagen",
|
||||||
|
"logRetentionForever": "Voor altijd",
|
||||||
|
"actionLogsDescription": "Bekijk een geschiedenis van acties die worden uitgevoerd in deze organisatie",
|
||||||
|
"accessLogsDescription": "Toegangsverificatieverzoeken voor resources in deze organisatie bekijken",
|
||||||
|
"licenseRequiredToUse": "Een Enterprise-licentie is vereist om deze functie te gebruiken.",
|
||||||
|
"certResolver": "Certificaat Resolver",
|
||||||
|
"certResolverDescription": "Selecteer de certificaat resolver die moet worden gebruikt voor deze resource.",
|
||||||
|
"selectCertResolver": "Certificaat Resolver selecteren",
|
||||||
|
"enterCustomResolver": "Aangepaste Oplossing invoeren",
|
||||||
|
"preferWildcardCert": "Bij voorkeur Wildcard Certificaat",
|
||||||
|
"unverified": "Ongeverifieerd",
|
||||||
|
"domainSetting": "Domein instellingen",
|
||||||
|
"domainSettingDescription": "Configureer instellingen voor uw domein",
|
||||||
|
"preferWildcardCertDescription": "Poging om een certificaat met een wildcard te genereren (vereist een correct geconfigureerde certificaatresolver).",
|
||||||
|
"recordName": "Record Naam",
|
||||||
|
"auto": "Automatisch",
|
||||||
|
"TTL": "TTL",
|
||||||
|
"howToAddRecords": "Hoe voeg ik Records toe",
|
||||||
|
"dnsRecord": "DNS Records",
|
||||||
|
"required": "vereist",
|
||||||
|
"domainSettingsUpdated": "Domeininstellingen succesvol bijgewerkt",
|
||||||
|
"orgOrDomainIdMissing": "Organisatie of domein ID ontbreekt",
|
||||||
|
"loadingDNSRecords": "DNS-records laden...",
|
||||||
|
"olmUpdateAvailableInfo": "Er is een bijgewerkte versie van Olm beschikbaar. Update alstublieft naar de nieuwste versie voor de beste ervaring.",
|
||||||
|
"client": "Klant",
|
||||||
|
"proxyProtocol": "Proxy Protocol Instellingen",
|
||||||
|
"proxyProtocolDescription": "Proxyprotocol configureren om de IP-adressen van de client voor TCP/UDP-diensten te bewaren.",
|
||||||
|
"enableProxyProtocol": "Proxy Protocol inschakelen",
|
||||||
|
"proxyProtocolInfo": "Behoud IP adressen van de client voor TCP/UDP backends",
|
||||||
|
"proxyProtocolVersion": "Proxy Protocol Versie",
|
||||||
|
"version1": " Versie 1 (Aanbevolen)",
|
||||||
|
"version2": "Versie 2",
|
||||||
|
"versionDescription": "Versie 1 is text-based en breed ondersteund. Versie 2 is binair en efficiënter maar minder compatibel.",
|
||||||
|
"warning": "Waarschuwing",
|
||||||
|
"proxyProtocolWarning": "Je backend applicatie moet worden geconfigureerd om connecties met Proxy Protocol te accepteren. Als je backend geen Proxy Protocol ondersteunt, zal het inschakelen van dit alle verbindingen verbreken. Zorg ervoor dat je je backend configureert om Proxy Protocol headers van Traefik.",
|
||||||
|
"restarting": "Herstarten...",
|
||||||
|
"manual": "Handleiding",
|
||||||
|
"messageSupport": "Bericht ondersteuning",
|
||||||
|
"supportNotAvailableTitle": "Ondersteuning niet beschikbaar",
|
||||||
|
"supportNotAvailableDescription": "Ondersteuning is momenteel niet beschikbaar. U kunt een e-mail sturen naar support@pangolin.net.",
|
||||||
|
"supportRequestSentTitle": "Ondersteuningsverzoek verzonden",
|
||||||
|
"supportRequestSentDescription": "Uw bericht is succesvol verzonden.",
|
||||||
|
"supportRequestFailedTitle": "Kon aanvraag niet verzenden",
|
||||||
|
"supportRequestFailedDescription": "Er is een fout opgetreden tijdens het verzenden van uw supportverzoek.",
|
||||||
|
"supportSubjectRequired": "Onderwerp is vereist",
|
||||||
|
"supportSubjectMaxLength": "Onderwerp moet 255 tekens of minder lang zijn",
|
||||||
|
"supportMessageRequired": "Bericht is vereist",
|
||||||
|
"supportReplyTo": "Antwoord aan",
|
||||||
|
"supportSubject": "Onderwerp",
|
||||||
|
"supportSubjectPlaceholder": "Onderwerp invoeren",
|
||||||
|
"supportMessage": "bericht",
|
||||||
|
"supportMessagePlaceholder": "Voer uw bericht in",
|
||||||
|
"supportSending": "Verzenden...",
|
||||||
|
"supportSend": "Verzenden",
|
||||||
|
"supportMessageSent": "Bericht verzonden!",
|
||||||
|
"supportWillContact": "We nemen binnenkort contact met u op!"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -47,9 +47,8 @@
|
|||||||
"edit": "Edytuj",
|
"edit": "Edytuj",
|
||||||
"siteConfirmDelete": "Potwierdź usunięcie witryny",
|
"siteConfirmDelete": "Potwierdź usunięcie witryny",
|
||||||
"siteDelete": "Usuń witrynę",
|
"siteDelete": "Usuń witrynę",
|
||||||
"siteMessageRemove": "Po usunięciu, witryna nie będzie już dostępna. Wszystkie zasoby i cele związane z witryną zostaną również usunięte.",
|
"siteMessageRemove": "Po usunięciu witryna nie będzie już dostępna. Wszystkie cele związane z witryną zostaną również usunięte.",
|
||||||
"siteMessageConfirm": "Aby potwierdzić, wpisz nazwę witryny poniżej.",
|
"siteQuestionRemove": "Czy na pewno chcesz usunąć witrynę z organizacji?",
|
||||||
"siteQuestionRemove": "Czy na pewno chcesz usunąć stronę {selectedSite} z organizacji?",
|
|
||||||
"siteManageSites": "Zarządzaj stronami",
|
"siteManageSites": "Zarządzaj stronami",
|
||||||
"siteDescription": "Zezwalaj na połączenie z siecią przez bezpieczne tunele",
|
"siteDescription": "Zezwalaj na połączenie z siecią przez bezpieczne tunele",
|
||||||
"siteCreate": "Utwórz witrynę",
|
"siteCreate": "Utwórz witrynę",
|
||||||
@@ -96,7 +95,7 @@
|
|||||||
"siteWgDescription": "Użyj dowolnego klienta WireGuard do utworzenia tunelu. Wymagana jest ręczna konfiguracja NAT.",
|
"siteWgDescription": "Użyj dowolnego klienta WireGuard do utworzenia tunelu. Wymagana jest ręczna konfiguracja NAT.",
|
||||||
"siteWgDescriptionSaas": "Użyj dowolnego klienta WireGuard do utworzenia tunelu. Wymagana ręczna konfiguracja NAT. DZIAŁA TYLKO NA SAMODZIELNIE HOSTOWANYCH WĘZŁACH",
|
"siteWgDescriptionSaas": "Użyj dowolnego klienta WireGuard do utworzenia tunelu. Wymagana ręczna konfiguracja NAT. DZIAŁA TYLKO NA SAMODZIELNIE HOSTOWANYCH WĘZŁACH",
|
||||||
"siteLocalDescription": "Tylko lokalne zasoby. Brak tunelu.",
|
"siteLocalDescription": "Tylko lokalne zasoby. Brak tunelu.",
|
||||||
"siteLocalDescriptionSaas": "Local resources only. No tunneling. Only available on remote nodes.",
|
"siteLocalDescriptionSaas": "Tylko zasoby lokalne. Brak tunelu. Dostępne tylko w węzłach zdalnych.",
|
||||||
"siteSeeAll": "Zobacz wszystkie witryny",
|
"siteSeeAll": "Zobacz wszystkie witryny",
|
||||||
"siteTunnelDescription": "Określ jak chcesz połączyć się ze swoją stroną",
|
"siteTunnelDescription": "Określ jak chcesz połączyć się ze swoją stroną",
|
||||||
"siteNewtCredentials": "Aktualne dane logowania",
|
"siteNewtCredentials": "Aktualne dane logowania",
|
||||||
@@ -154,8 +153,7 @@
|
|||||||
"protected": "Chronione",
|
"protected": "Chronione",
|
||||||
"notProtected": "Niechronione",
|
"notProtected": "Niechronione",
|
||||||
"resourceMessageRemove": "Po usunięciu, zasób nie będzie już dostępny. Wszystkie cele związane z zasobem zostaną również usunięte.",
|
"resourceMessageRemove": "Po usunięciu, zasób nie będzie już dostępny. Wszystkie cele związane z zasobem zostaną również usunięte.",
|
||||||
"resourceMessageConfirm": "Aby potwierdzić, wpisz nazwę zasobu poniżej.",
|
"resourceQuestionRemove": "Czy na pewno chcesz usunąć zasób z organizacji?",
|
||||||
"resourceQuestionRemove": "Czy na pewno chcesz usunąć zasób {selectedResource} z organizacji?",
|
|
||||||
"resourceHTTP": "Zasób HTTPS",
|
"resourceHTTP": "Zasób HTTPS",
|
||||||
"resourceHTTPDescription": "Proxy do Twojej aplikacji przez HTTPS, przy użyciu poddomeny lub domeny bazowej.",
|
"resourceHTTPDescription": "Proxy do Twojej aplikacji przez HTTPS, przy użyciu poddomeny lub domeny bazowej.",
|
||||||
"resourceRaw": "Surowy zasób TCP/UDP",
|
"resourceRaw": "Surowy zasób TCP/UDP",
|
||||||
@@ -220,7 +218,7 @@
|
|||||||
"orgDeleteConfirm": "Potwierdź usunięcie organizacji",
|
"orgDeleteConfirm": "Potwierdź usunięcie organizacji",
|
||||||
"orgMessageRemove": "Ta akcja jest nieodwracalna i usunie wszystkie powiązane dane.",
|
"orgMessageRemove": "Ta akcja jest nieodwracalna i usunie wszystkie powiązane dane.",
|
||||||
"orgMessageConfirm": "Aby potwierdzić, wpisz nazwę organizacji poniżej.",
|
"orgMessageConfirm": "Aby potwierdzić, wpisz nazwę organizacji poniżej.",
|
||||||
"orgQuestionRemove": "Czy na pewno chcesz usunąć organizację {selectedOrg}?",
|
"orgQuestionRemove": "Czy na pewno chcesz usunąć organizację?",
|
||||||
"orgUpdated": "Organizacja zaktualizowana",
|
"orgUpdated": "Organizacja zaktualizowana",
|
||||||
"orgUpdatedDescription": "Organizacja została zaktualizowana.",
|
"orgUpdatedDescription": "Organizacja została zaktualizowana.",
|
||||||
"orgErrorUpdate": "Nie udało się zaktualizować organizacji",
|
"orgErrorUpdate": "Nie udało się zaktualizować organizacji",
|
||||||
@@ -287,9 +285,8 @@
|
|||||||
"apiKeysAdd": "Generuj klucz API",
|
"apiKeysAdd": "Generuj klucz API",
|
||||||
"apiKeysErrorDelete": "Błąd podczas usuwania klucza API",
|
"apiKeysErrorDelete": "Błąd podczas usuwania klucza API",
|
||||||
"apiKeysErrorDeleteMessage": "Błąd podczas usuwania klucza API",
|
"apiKeysErrorDeleteMessage": "Błąd podczas usuwania klucza API",
|
||||||
"apiKeysQuestionRemove": "Czy na pewno chcesz usunąć klucz API {selectedApiKey} z organizacji?",
|
"apiKeysQuestionRemove": "Czy na pewno chcesz usunąć klucz API z organizacji?",
|
||||||
"apiKeysMessageRemove": "Po usunięciu klucz API nie będzie już mógł być używany.",
|
"apiKeysMessageRemove": "Po usunięciu klucz API nie będzie już mógł być używany.",
|
||||||
"apiKeysMessageConfirm": "Aby potwierdzić, wpisz nazwę klucza API poniżej.",
|
|
||||||
"apiKeysDeleteConfirm": "Potwierdź usunięcie klucza API",
|
"apiKeysDeleteConfirm": "Potwierdź usunięcie klucza API",
|
||||||
"apiKeysDelete": "Usuń klucz API",
|
"apiKeysDelete": "Usuń klucz API",
|
||||||
"apiKeysManage": "Zarządzaj kluczami API",
|
"apiKeysManage": "Zarządzaj kluczami API",
|
||||||
@@ -305,8 +302,7 @@
|
|||||||
"userDeleteConfirm": "Potwierdź usunięcie użytkownika",
|
"userDeleteConfirm": "Potwierdź usunięcie użytkownika",
|
||||||
"userDeleteServer": "Usuń użytkownika z serwera",
|
"userDeleteServer": "Usuń użytkownika z serwera",
|
||||||
"userMessageRemove": "Użytkownik zostanie usunięty ze wszystkich organizacji i całkowicie usunięty z serwera.",
|
"userMessageRemove": "Użytkownik zostanie usunięty ze wszystkich organizacji i całkowicie usunięty z serwera.",
|
||||||
"userMessageConfirm": "Aby potwierdzić, wpisz nazwę użytkownika poniżej.",
|
"userQuestionRemove": "Czy na pewno chcesz trwale usunąć użytkownika z serwera?",
|
||||||
"userQuestionRemove": "Czy na pewno chcesz trwale usunąć {selectedUser} z serwera?",
|
|
||||||
"licenseKey": "Klucz licencyjny",
|
"licenseKey": "Klucz licencyjny",
|
||||||
"valid": "Prawidłowy",
|
"valid": "Prawidłowy",
|
||||||
"numberOfSites": "Liczba witryn",
|
"numberOfSites": "Liczba witryn",
|
||||||
@@ -339,7 +335,7 @@
|
|||||||
"fossorialLicense": "Zobacz Fossorial Commercial License & Subskrypcja",
|
"fossorialLicense": "Zobacz Fossorial Commercial License & Subskrypcja",
|
||||||
"licenseMessageRemove": "Spowoduje to usunięcie klucza licencyjnego i wszystkich przypisanych przez niego uprawnień.",
|
"licenseMessageRemove": "Spowoduje to usunięcie klucza licencyjnego i wszystkich przypisanych przez niego uprawnień.",
|
||||||
"licenseMessageConfirm": "Aby potwierdzić, wpisz klucz licencyjny poniżej.",
|
"licenseMessageConfirm": "Aby potwierdzić, wpisz klucz licencyjny poniżej.",
|
||||||
"licenseQuestionRemove": "Czy na pewno chcesz usunąć klucz licencyjny {selectedKey}?",
|
"licenseQuestionRemove": "Czy na pewno chcesz usunąć klucz licencyjny?",
|
||||||
"licenseKeyDelete": "Usuń klucz licencyjny",
|
"licenseKeyDelete": "Usuń klucz licencyjny",
|
||||||
"licenseKeyDeleteConfirm": "Potwierdź usunięcie klucza licencyjnego",
|
"licenseKeyDeleteConfirm": "Potwierdź usunięcie klucza licencyjnego",
|
||||||
"licenseTitle": "Zarządzaj statusem licencji",
|
"licenseTitle": "Zarządzaj statusem licencji",
|
||||||
@@ -372,7 +368,7 @@
|
|||||||
"inviteRemoveErrorDescription": "Wystąpił błąd podczas usuwania zaproszenia.",
|
"inviteRemoveErrorDescription": "Wystąpił błąd podczas usuwania zaproszenia.",
|
||||||
"inviteRemoved": "Zaproszenie usunięte",
|
"inviteRemoved": "Zaproszenie usunięte",
|
||||||
"inviteRemovedDescription": "Zaproszenie dla {email} zostało usunięte.",
|
"inviteRemovedDescription": "Zaproszenie dla {email} zostało usunięte.",
|
||||||
"inviteQuestionRemove": "Czy na pewno chcesz usunąć zaproszenie {email}?",
|
"inviteQuestionRemove": "Czy na pewno chcesz usunąć zaproszenie?",
|
||||||
"inviteMessageRemove": "Po usunięciu to zaproszenie nie będzie już ważne. Zawsze możesz ponownie zaprosić użytkownika później.",
|
"inviteMessageRemove": "Po usunięciu to zaproszenie nie będzie już ważne. Zawsze możesz ponownie zaprosić użytkownika później.",
|
||||||
"inviteMessageConfirm": "Aby potwierdzić, wpisz poniżej adres email zaproszenia.",
|
"inviteMessageConfirm": "Aby potwierdzić, wpisz poniżej adres email zaproszenia.",
|
||||||
"inviteQuestionRegenerate": "Czy na pewno chcesz ponownie wygenerować zaproszenie {email}? Spowoduje to unieważnienie poprzedniego zaproszenia.",
|
"inviteQuestionRegenerate": "Czy na pewno chcesz ponownie wygenerować zaproszenie {email}? Spowoduje to unieważnienie poprzedniego zaproszenia.",
|
||||||
@@ -398,9 +394,8 @@
|
|||||||
"userErrorOrgRemoveDescription": "Wystąpił błąd podczas usuwania użytkownika.",
|
"userErrorOrgRemoveDescription": "Wystąpił błąd podczas usuwania użytkownika.",
|
||||||
"userOrgRemoved": "Użytkownik usunięty",
|
"userOrgRemoved": "Użytkownik usunięty",
|
||||||
"userOrgRemovedDescription": "Użytkownik {email} został usunięty z organizacji.",
|
"userOrgRemovedDescription": "Użytkownik {email} został usunięty z organizacji.",
|
||||||
"userQuestionOrgRemove": "Czy na pewno chcesz usunąć {email} z organizacji?",
|
"userQuestionOrgRemove": "Czy na pewno chcesz usunąć tego użytkownika z organizacji?",
|
||||||
"userMessageOrgRemove": "Po usunięciu ten użytkownik nie będzie miał już dostępu do organizacji. Zawsze możesz ponownie go zaprosić później, ale będzie musiał ponownie zaakceptować zaproszenie.",
|
"userMessageOrgRemove": "Po usunięciu ten użytkownik nie będzie miał już dostępu do organizacji. Zawsze możesz ponownie go zaprosić później, ale będzie musiał ponownie zaakceptować zaproszenie.",
|
||||||
"userMessageOrgConfirm": "Aby potwierdzić, wpisz nazwę użytkownika poniżej.",
|
|
||||||
"userRemoveOrgConfirm": "Potwierdź usunięcie użytkownika",
|
"userRemoveOrgConfirm": "Potwierdź usunięcie użytkownika",
|
||||||
"userRemoveOrg": "Usuń użytkownika z organizacji",
|
"userRemoveOrg": "Usuń użytkownika z organizacji",
|
||||||
"users": "Użytkownicy",
|
"users": "Użytkownicy",
|
||||||
@@ -730,7 +725,7 @@
|
|||||||
"pangolinServerAdmin": "Administrator serwera - Pangolin",
|
"pangolinServerAdmin": "Administrator serwera - Pangolin",
|
||||||
"licenseTierProfessional": "Licencja Professional",
|
"licenseTierProfessional": "Licencja Professional",
|
||||||
"licenseTierEnterprise": "Licencja Enterprise",
|
"licenseTierEnterprise": "Licencja Enterprise",
|
||||||
"licenseTierPersonal": "Personal License",
|
"licenseTierPersonal": "Licencja osobista",
|
||||||
"licensed": "Licencjonowany",
|
"licensed": "Licencjonowany",
|
||||||
"yes": "Tak",
|
"yes": "Tak",
|
||||||
"no": "Nie",
|
"no": "Nie",
|
||||||
@@ -742,7 +737,7 @@
|
|||||||
"idpManageDescription": "Wyświetl i zarządzaj dostawcami tożsamości w systemie",
|
"idpManageDescription": "Wyświetl i zarządzaj dostawcami tożsamości w systemie",
|
||||||
"idpDeletedDescription": "Dostawca tożsamości został pomyślnie usunięty",
|
"idpDeletedDescription": "Dostawca tożsamości został pomyślnie usunięty",
|
||||||
"idpOidc": "OAuth2/OIDC",
|
"idpOidc": "OAuth2/OIDC",
|
||||||
"idpQuestionRemove": "Czy na pewno chcesz trwale usunąć dostawcę tożsamości {name}?",
|
"idpQuestionRemove": "Czy na pewno chcesz trwale usunąć dostawcę tożsamości?",
|
||||||
"idpMessageRemove": "Spowoduje to usunięcie dostawcy tożsamości i wszystkich powiązanych konfiguracji. Użytkownicy uwierzytelniający się przez tego dostawcę nie będą mogli się już zalogować.",
|
"idpMessageRemove": "Spowoduje to usunięcie dostawcy tożsamości i wszystkich powiązanych konfiguracji. Użytkownicy uwierzytelniający się przez tego dostawcę nie będą mogli się już zalogować.",
|
||||||
"idpMessageConfirm": "Aby potwierdzić, wpisz nazwę dostawcy tożsamości poniżej.",
|
"idpMessageConfirm": "Aby potwierdzić, wpisz nazwę dostawcy tożsamości poniżej.",
|
||||||
"idpConfirmDelete": "Potwierdź usunięcie dostawcy tożsamości",
|
"idpConfirmDelete": "Potwierdź usunięcie dostawcy tożsamości",
|
||||||
@@ -916,6 +911,18 @@
|
|||||||
"passwordResetCodeDescription": "Sprawdź swój e-mail, aby znaleźć kod resetowania.",
|
"passwordResetCodeDescription": "Sprawdź swój e-mail, aby znaleźć kod resetowania.",
|
||||||
"passwordNew": "Nowe hasło",
|
"passwordNew": "Nowe hasło",
|
||||||
"passwordNewConfirm": "Potwierdź nowe hasło",
|
"passwordNewConfirm": "Potwierdź nowe hasło",
|
||||||
|
"changePassword": "Zmień hasło",
|
||||||
|
"changePasswordDescription": "Zaktualizuj hasło do konta",
|
||||||
|
"oldPassword": "Bieżące hasło",
|
||||||
|
"newPassword": "Nowe hasło",
|
||||||
|
"confirmNewPassword": "Potwierdź nowe hasło",
|
||||||
|
"changePasswordError": "Nie udało się zmienić hasła",
|
||||||
|
"changePasswordErrorDescription": "Wystąpił błąd podczas zmiany hasła",
|
||||||
|
"changePasswordSuccess": "Hasło zostało pomyślnie zmienione",
|
||||||
|
"changePasswordSuccessDescription": "Twoje hasło zostało pomyślnie zaktualizowane",
|
||||||
|
"passwordExpiryRequired": "Wymagane hasło wygasające",
|
||||||
|
"passwordExpiryDescription": "Organizacja wymaga zmiany hasła co {maxDays} dni.",
|
||||||
|
"changePasswordNow": "Zmień hasło teraz",
|
||||||
"pincodeAuth": "Kod uwierzytelniający",
|
"pincodeAuth": "Kod uwierzytelniający",
|
||||||
"pincodeSubmit2": "Wyślij kod",
|
"pincodeSubmit2": "Wyślij kod",
|
||||||
"passwordResetSubmit": "Zażądaj resetowania",
|
"passwordResetSubmit": "Zażądaj resetowania",
|
||||||
@@ -1154,8 +1161,27 @@
|
|||||||
"sidebarAllUsers": "Wszyscy użytkownicy",
|
"sidebarAllUsers": "Wszyscy użytkownicy",
|
||||||
"sidebarIdentityProviders": "Dostawcy tożsamości",
|
"sidebarIdentityProviders": "Dostawcy tożsamości",
|
||||||
"sidebarLicense": "Licencja",
|
"sidebarLicense": "Licencja",
|
||||||
"sidebarClients": "Clients",
|
"sidebarClients": "Klientami",
|
||||||
"sidebarDomains": "Domeny",
|
"sidebarDomains": "Domeny",
|
||||||
|
"sidebarBluePrints": "Schematy",
|
||||||
|
"blueprints": "Schematy",
|
||||||
|
"blueprintsDescription": "Plany to deklaratywne konfiguracje YAML, które definiują twoje zasoby i ich ustawienia",
|
||||||
|
"blueprintAdd": "Dodaj schemat",
|
||||||
|
"blueprintGoBack": "Zobacz wszystkie schematy",
|
||||||
|
"blueprintCreate": "Utwórz schemat",
|
||||||
|
"blueprintCreateDescription2": "Wykonaj poniższe kroki, aby utworzyć i zastosować nowy schemat",
|
||||||
|
"blueprintDetails": "Szczegóły projektu",
|
||||||
|
"blueprintDetailsDescription": "Zobacz szczegóły uruchomienia schematu",
|
||||||
|
"blueprintInfo": "Informacje o projekcie",
|
||||||
|
"message": "Wiadomość",
|
||||||
|
"blueprintContentsDescription": "Zdefiniuj zawartość YAML opisującą Twoją infrastrukturę",
|
||||||
|
"blueprintErrorCreateDescription": "Wystąpił błąd podczas stosowania schematu",
|
||||||
|
"blueprintErrorCreate": "Błąd podczas tworzenia schematu",
|
||||||
|
"searchBlueprintProgress": "Szukaj schematów...",
|
||||||
|
"appliedAt": "Zastosowano",
|
||||||
|
"source": "Źródło",
|
||||||
|
"contents": "Treść",
|
||||||
|
"parsedContents": "Przetworzona zawartość",
|
||||||
"enableDockerSocket": "Włącz schemat dokera",
|
"enableDockerSocket": "Włącz schemat dokera",
|
||||||
"enableDockerSocketDescription": "Włącz etykietowanie kieszeni dokującej dla etykiet schematów. Ścieżka do gniazda musi być dostarczona do Newt.",
|
"enableDockerSocketDescription": "Włącz etykietowanie kieszeni dokującej dla etykiet schematów. Ścieżka do gniazda musi być dostarczona do Newt.",
|
||||||
"enableDockerSocketLink": "Dowiedz się więcej",
|
"enableDockerSocketLink": "Dowiedz się więcej",
|
||||||
@@ -1211,9 +1237,8 @@
|
|||||||
"domainCreate": "Utwórz domenę",
|
"domainCreate": "Utwórz domenę",
|
||||||
"domainCreatedDescription": "Domena utworzona pomyślnie",
|
"domainCreatedDescription": "Domena utworzona pomyślnie",
|
||||||
"domainDeletedDescription": "Domena usunięta pomyślnie",
|
"domainDeletedDescription": "Domena usunięta pomyślnie",
|
||||||
"domainQuestionRemove": "Czy na pewno chcesz usunąć domenę {domain} ze swojego konta?",
|
"domainQuestionRemove": "Czy na pewno chcesz usunąć domenę ze swojego konta?",
|
||||||
"domainMessageRemove": "Po usunięciu domena nie będzie już powiązana z twoim kontem.",
|
"domainMessageRemove": "Po usunięciu domena nie będzie już powiązana z twoim kontem.",
|
||||||
"domainMessageConfirm": "Aby potwierdzić, wpisz nazwę domeny poniżej.",
|
|
||||||
"domainConfirmDelete": "Potwierdź usunięcie domeny",
|
"domainConfirmDelete": "Potwierdź usunięcie domeny",
|
||||||
"domainDelete": "Usuń domenę",
|
"domainDelete": "Usuń domenę",
|
||||||
"domain": "Domena",
|
"domain": "Domena",
|
||||||
@@ -1280,7 +1305,7 @@
|
|||||||
"billingFreeTier": "Darmowy pakiet",
|
"billingFreeTier": "Darmowy pakiet",
|
||||||
"billingWarningOverLimit": "Ostrzeżenie: Przekroczyłeś jeden lub więcej limitów użytkowania. Twoje witryny nie połączą się, dopóki nie zmienisz subskrypcji lub nie dostosujesz użytkowania.",
|
"billingWarningOverLimit": "Ostrzeżenie: Przekroczyłeś jeden lub więcej limitów użytkowania. Twoje witryny nie połączą się, dopóki nie zmienisz subskrypcji lub nie dostosujesz użytkowania.",
|
||||||
"billingUsageLimitsOverview": "Przegląd Limitów Użytkowania",
|
"billingUsageLimitsOverview": "Przegląd Limitów Użytkowania",
|
||||||
"billingMonitorUsage": "Monitoruj swoje wykorzystanie w porównaniu do skonfigurowanych limitów. Jeśli potrzebujesz zwiększenia limitów, skontaktuj się z nami pod adresem support@fossorial.io.",
|
"billingMonitorUsage": "Monitoruj swoje wykorzystanie w porównaniu do skonfigurowanych limitów. Jeśli potrzebujesz zwiększenia limitów, skontaktuj się z nami pod adresem support@pangolin.net.",
|
||||||
"billingDataUsage": "Użycie danych",
|
"billingDataUsage": "Użycie danych",
|
||||||
"billingOnlineTime": "Czas Online Strony",
|
"billingOnlineTime": "Czas Online Strony",
|
||||||
"billingUsers": "Aktywni użytkownicy",
|
"billingUsers": "Aktywni użytkownicy",
|
||||||
@@ -1346,6 +1371,19 @@
|
|||||||
"securityKeyUnknownError": "Wystąpił problem z używaniem klucza bezpieczeństwa. Proszę spróbować ponownie.",
|
"securityKeyUnknownError": "Wystąpił problem z używaniem klucza bezpieczeństwa. Proszę spróbować ponownie.",
|
||||||
"twoFactorRequired": "Uwierzytelnianie dwuskładnikowe jest wymagane do zarejestrowania klucza bezpieczeństwa.",
|
"twoFactorRequired": "Uwierzytelnianie dwuskładnikowe jest wymagane do zarejestrowania klucza bezpieczeństwa.",
|
||||||
"twoFactor": "Uwierzytelnianie dwuskładnikowe",
|
"twoFactor": "Uwierzytelnianie dwuskładnikowe",
|
||||||
|
"twoFactorAuthentication": "Uwierzytelnianie dwuetapowe",
|
||||||
|
"twoFactorDescription": "Ta organizacja wymaga uwierzytelniania dwuskładnikowego.",
|
||||||
|
"enableTwoFactor": "Włącz uwierzytelnianie dwuetapowe",
|
||||||
|
"organizationSecurityPolicy": "Polityka bezpieczeństwa organizacji",
|
||||||
|
"organizationSecurityPolicyDescription": "Ta organizacja ma wymagania bezpieczeństwa, które muszą być spełnione, zanim będziesz mógł uzyskać dostęp do niej",
|
||||||
|
"securityRequirements": "Wymogi bezpieczeństwa",
|
||||||
|
"allRequirementsMet": "Wszystkie wymagania zostały spełnione",
|
||||||
|
"completeRequirementsToContinue": "Wypełnij poniższe wymagania, aby kontynuować dostęp do tej organizacji",
|
||||||
|
"youCanNowAccessOrganization": "Teraz możesz uzyskać dostęp do tej organizacji",
|
||||||
|
"reauthenticationRequired": "Długość sesji",
|
||||||
|
"reauthenticationDescription": "Organizacja wymaga logowania co {maxDays} dni.",
|
||||||
|
"reauthenticationDescriptionHours": "Organizacja wymaga logowania co {maxHours} godzin.",
|
||||||
|
"reauthenticateNow": "Zaloguj się ponownie",
|
||||||
"adminEnabled2FaOnYourAccount": "Twój administrator włączył uwierzytelnianie dwuskładnikowe dla {email}. Proszę ukończyć proces konfiguracji, aby kontynuować.",
|
"adminEnabled2FaOnYourAccount": "Twój administrator włączył uwierzytelnianie dwuskładnikowe dla {email}. Proszę ukończyć proces konfiguracji, aby kontynuować.",
|
||||||
"securityKeyAdd": "Dodaj klucz bezpieczeństwa",
|
"securityKeyAdd": "Dodaj klucz bezpieczeństwa",
|
||||||
"securityKeyRegisterTitle": "Zarejestruj nowy klucz bezpieczeństwa",
|
"securityKeyRegisterTitle": "Zarejestruj nowy klucz bezpieczeństwa",
|
||||||
@@ -1558,14 +1596,13 @@
|
|||||||
"autoLoginErrorNoRedirectUrl": "Nie otrzymano URL przekierowania od dostawcy tożsamości.",
|
"autoLoginErrorNoRedirectUrl": "Nie otrzymano URL przekierowania od dostawcy tożsamości.",
|
||||||
"autoLoginErrorGeneratingUrl": "Nie udało się wygenerować URL uwierzytelniania.",
|
"autoLoginErrorGeneratingUrl": "Nie udało się wygenerować URL uwierzytelniania.",
|
||||||
"remoteExitNodeManageRemoteExitNodes": "Zdalne węzły",
|
"remoteExitNodeManageRemoteExitNodes": "Zdalne węzły",
|
||||||
"remoteExitNodeDescription": "Self-host one or more remote nodes to extend your network connectivity and reduce reliance on the cloud",
|
"remoteExitNodeDescription": "Samodzielny host jeden lub więcej węzłów zdalnych, aby rozszerzyć łączność z siecią i zmniejszyć zależność od chmury",
|
||||||
"remoteExitNodes": "Węzły",
|
"remoteExitNodes": "Węzły",
|
||||||
"searchRemoteExitNodes": "Szukaj węzłów...",
|
"searchRemoteExitNodes": "Szukaj węzłów...",
|
||||||
"remoteExitNodeAdd": "Dodaj węzeł",
|
"remoteExitNodeAdd": "Dodaj węzeł",
|
||||||
"remoteExitNodeErrorDelete": "Błąd podczas usuwania węzła",
|
"remoteExitNodeErrorDelete": "Błąd podczas usuwania węzła",
|
||||||
"remoteExitNodeQuestionRemove": "Czy na pewno chcesz usunąć węzeł {selectedNode} z organizacji?",
|
"remoteExitNodeQuestionRemove": "Czy na pewno chcesz usunąć węzeł z organizacji?",
|
||||||
"remoteExitNodeMessageRemove": "Po usunięciu, węzeł nie będzie już dostępny.",
|
"remoteExitNodeMessageRemove": "Po usunięciu, węzeł nie będzie już dostępny.",
|
||||||
"remoteExitNodeMessageConfirm": "Aby potwierdzić, wpisz nazwę węzła poniżej.",
|
|
||||||
"remoteExitNodeConfirmDelete": "Potwierdź usunięcie węzła",
|
"remoteExitNodeConfirmDelete": "Potwierdź usunięcie węzła",
|
||||||
"remoteExitNodeDelete": "Usuń węzeł",
|
"remoteExitNodeDelete": "Usuń węzeł",
|
||||||
"sidebarRemoteExitNodes": "Zdalne węzły",
|
"sidebarRemoteExitNodes": "Zdalne węzły",
|
||||||
@@ -1733,7 +1770,49 @@
|
|||||||
"resourceExposePortsEditFile": "Edytuj plik: docker-compose.yml",
|
"resourceExposePortsEditFile": "Edytuj plik: docker-compose.yml",
|
||||||
"emailVerificationRequired": "Weryfikacja adresu e-mail jest wymagana. Zaloguj się ponownie przez {dashboardUrl}/auth/login zakończył ten krok. Następnie wróć tutaj.",
|
"emailVerificationRequired": "Weryfikacja adresu e-mail jest wymagana. Zaloguj się ponownie przez {dashboardUrl}/auth/login zakończył ten krok. Następnie wróć tutaj.",
|
||||||
"twoFactorSetupRequired": "Konfiguracja uwierzytelniania dwuskładnikowego jest wymagana. Zaloguj się ponownie przez {dashboardUrl}/auth/login dokończ ten krok. Następnie wróć tutaj.",
|
"twoFactorSetupRequired": "Konfiguracja uwierzytelniania dwuskładnikowego jest wymagana. Zaloguj się ponownie przez {dashboardUrl}/auth/login dokończ ten krok. Następnie wróć tutaj.",
|
||||||
|
"additionalSecurityRequired": "Wymagane dodatkowe zabezpieczenie",
|
||||||
|
"organizationRequiresAdditionalSteps": "Ta organizacja wymaga dodatkowych kroków bezpieczeństwa, zanim będziesz mógł uzyskać dostęp do zasobów.",
|
||||||
|
"completeTheseSteps": "Wykonaj te kroki",
|
||||||
|
"enableTwoFactorAuthentication": "Włącz uwierzytelnianie dwuskładnikowe",
|
||||||
|
"completeSecuritySteps": "Zakończ kroki bezpieczeństwa",
|
||||||
|
"securitySettings": "Ustawienia zabezpieczeń",
|
||||||
|
"securitySettingsDescription": "Skonfiguruj politykę bezpieczeństwa dla Twojej organizacji",
|
||||||
|
"requireTwoFactorForAllUsers": "Wymagaj uwierzytelniania dwuetapowego dla wszystkich użytkowników",
|
||||||
|
"requireTwoFactorDescription": "Po włączeniu wszyscy użytkownicy wewnętrzni w tej organizacji muszą mieć włączone uwierzytelnianie dwuskładnikowe, aby uzyskać dostęp do organizacji.",
|
||||||
|
"requireTwoFactorDisabledDescription": "Ta funkcja wymaga poprawnej licencji (Enterprise) lub aktywnej subskrypcji (SaaaS)",
|
||||||
|
"requireTwoFactorCannotEnableDescription": "Musisz włączyć uwierzytelnianie dwuskładnikowe dla swojego konta przed wymuszaniem go dla wszystkich użytkowników",
|
||||||
|
"maxSessionLength": "Maksymalna długość sesji",
|
||||||
|
"maxSessionLengthDescription": "Ustaw maksymalny czas trwania sesji użytkownika. Po tym czasie użytkownicy będą musieli ponownie uwierzytelniać.",
|
||||||
|
"maxSessionLengthDisabledDescription": "Ta funkcja wymaga poprawnej licencji (Enterprise) lub aktywnej subskrypcji (SaaaS)",
|
||||||
|
"selectSessionLength": "Wybierz długość sesji",
|
||||||
|
"unenforced": "Niewymuszony",
|
||||||
|
"1Hour": "1 godzina",
|
||||||
|
"3Hours": "3 godziny",
|
||||||
|
"6Hours": "6 godzin",
|
||||||
|
"12Hours": "12 godzin",
|
||||||
|
"1DaySession": "1 dzień",
|
||||||
|
"3Days": "3 dni",
|
||||||
|
"7Days": "7 dni",
|
||||||
|
"14Days": "14 dni",
|
||||||
|
"30DaysSession": "30 dni",
|
||||||
|
"90DaysSession": "90 dni",
|
||||||
|
"180DaysSession": "180 dni",
|
||||||
|
"passwordExpiryDays": "Hasło wygasa",
|
||||||
|
"editPasswordExpiryDescription": "Ustaw liczbę dni zanim użytkownicy będą musieli zmienić swoje hasło.",
|
||||||
|
"selectPasswordExpiry": "Wybierz wygasanie hasła",
|
||||||
|
"30Days": "30 dni",
|
||||||
|
"1Day": "1 dzień",
|
||||||
|
"60Days": "60 dni",
|
||||||
|
"90Days": "90 dni",
|
||||||
|
"180Days": "180 dni",
|
||||||
|
"1Year": "1 rok",
|
||||||
|
"subscriptionBadge": "Wymagana subskrypcja",
|
||||||
|
"securityPolicyChangeWarning": "Ostrzeżenie o zmianach w polityce bezpieczeństwa",
|
||||||
|
"securityPolicyChangeDescription": "Zamierzasz zmienić ustawienia polityki bezpieczeństwa. Po zapisaniu konieczne może być ponowne uwierzytelnienie w celu zapewnienia zgodności z tymi aktualizacjami polityki. Wszyscy użytkownicy, którzy nie są zgodni, będą również musieli ponownie uwierzytelniać.",
|
||||||
|
"securityPolicyChangeConfirmMessage": "Potwierdzam",
|
||||||
|
"securityPolicyChangeWarningText": "To wpłynie na wszystkich użytkowników w organizacji",
|
||||||
"authPageErrorUpdateMessage": "Wystąpił błąd podczas aktualizacji ustawień strony uwierzytelniania",
|
"authPageErrorUpdateMessage": "Wystąpił błąd podczas aktualizacji ustawień strony uwierzytelniania",
|
||||||
|
"authPageErrorUpdate": "Nie można zaktualizować strony uwierzytelniania",
|
||||||
"authPageUpdated": "Strona uwierzytelniania została pomyślnie zaktualizowana",
|
"authPageUpdated": "Strona uwierzytelniania została pomyślnie zaktualizowana",
|
||||||
"healthCheckNotAvailable": "Lokalny",
|
"healthCheckNotAvailable": "Lokalny",
|
||||||
"rewritePath": "Przepis Ścieżki",
|
"rewritePath": "Przepis Ścieżki",
|
||||||
@@ -1745,153 +1824,261 @@
|
|||||||
"resourceHeaderAuthRemoveDescription": "Uwierzytelnianie nagłówka zostało pomyślnie usunięte.",
|
"resourceHeaderAuthRemoveDescription": "Uwierzytelnianie nagłówka zostało pomyślnie usunięte.",
|
||||||
"resourceErrorHeaderAuthRemove": "Nie udało się usunąć uwierzytelniania nagłówka",
|
"resourceErrorHeaderAuthRemove": "Nie udało się usunąć uwierzytelniania nagłówka",
|
||||||
"resourceErrorHeaderAuthRemoveDescription": "Nie można usunąć uwierzytelniania nagłówka zasobu.",
|
"resourceErrorHeaderAuthRemoveDescription": "Nie można usunąć uwierzytelniania nagłówka zasobu.",
|
||||||
"resourceHeaderAuthProtectionEnabled": "Header Authentication Enabled",
|
"resourceHeaderAuthProtectionEnabled": "Uwierzytelnianie nagłówka włączone",
|
||||||
"resourceHeaderAuthProtectionDisabled": "Header Authentication Disabled",
|
"resourceHeaderAuthProtectionDisabled": "Uwierzytelnianie nagłówka wyłączone",
|
||||||
"headerAuthRemove": "Remove Header Auth",
|
"headerAuthRemove": "Usuń autoryzację nagłówka",
|
||||||
"headerAuthAdd": "Add Header Auth",
|
"headerAuthAdd": "Dodaj Autoryzacja nagłówka",
|
||||||
"resourceErrorHeaderAuthSetup": "Nie udało się ustawić uwierzytelniania nagłówka",
|
"resourceErrorHeaderAuthSetup": "Nie udało się ustawić uwierzytelniania nagłówka",
|
||||||
"resourceErrorHeaderAuthSetupDescription": "Nie można ustawić uwierzytelniania nagłówka dla zasobu.",
|
"resourceErrorHeaderAuthSetupDescription": "Nie można ustawić uwierzytelniania nagłówka dla zasobu.",
|
||||||
"resourceHeaderAuthSetup": "Uwierzytelnianie nagłówka ustawione pomyślnie",
|
"resourceHeaderAuthSetup": "Uwierzytelnianie nagłówka ustawione pomyślnie",
|
||||||
"resourceHeaderAuthSetupDescription": "Uwierzytelnianie nagłówka zostało ustawione.",
|
"resourceHeaderAuthSetupDescription": "Uwierzytelnianie nagłówka zostało ustawione.",
|
||||||
"resourceHeaderAuthSetupTitle": "Ustaw uwierzytelnianie nagłówka",
|
"resourceHeaderAuthSetupTitle": "Ustaw uwierzytelnianie nagłówka",
|
||||||
"resourceHeaderAuthSetupTitleDescription": "Set the basic auth credentials (username and password) to protect this resource with HTTP Header Authentication. Access it using the format https://username:password@resource.example.com",
|
"resourceHeaderAuthSetupTitleDescription": "Ustaw podstawowe dane uwierzytelniające (nazwa użytkownika i hasło), aby chronić ten zasób za pomocą uwierzytelniania nagłówka HTTP. Uzyskaj dostęp za pomocą formatu https://username:password@resource.example.com",
|
||||||
"resourceHeaderAuthSubmit": "Ustaw uwierzytelnianie nagłówka",
|
"resourceHeaderAuthSubmit": "Ustaw uwierzytelnianie nagłówka",
|
||||||
"actionSetResourceHeaderAuth": "Ustaw uwierzytelnianie nagłówka",
|
"actionSetResourceHeaderAuth": "Ustaw uwierzytelnianie nagłówka",
|
||||||
"enterpriseEdition": "Enterprise Edition",
|
"enterpriseEdition": "Edycja Enterprise",
|
||||||
"unlicensed": "Unlicensed",
|
"unlicensed": "Nielicencjonowane",
|
||||||
"beta": "Beta",
|
"beta": "Beta",
|
||||||
"manageClients": "Manage Clients",
|
"manageClients": "Zarządzaj klientami",
|
||||||
"manageClientsDescription": "Clients are devices that can connect to your sites",
|
"manageClientsDescription": "Klienci to urządzenia, które mogą łączyć się z Twoimi witrynami",
|
||||||
"licenseTableValidUntil": "Valid Until",
|
"licenseTableValidUntil": "Ważny do",
|
||||||
"saasLicenseKeysSettingsTitle": "Enterprise Licenses",
|
"saasLicenseKeysSettingsTitle": "Licencje przedsiębiorstwa",
|
||||||
"saasLicenseKeysSettingsDescription": "Generate and manage Enterprise license keys for self-hosted Pangolin instances",
|
"saasLicenseKeysSettingsDescription": "Generuj i zarządzaj kluczami licencyjnymi Enterprise dla samodzielnych instancji Pangolin",
|
||||||
"sidebarEnterpriseLicenses": "Licenses",
|
"sidebarEnterpriseLicenses": "Licencje",
|
||||||
"generateLicenseKey": "Generate License Key",
|
"generateLicenseKey": "Generuj klucz licencyjny",
|
||||||
"generateLicenseKeyForm": {
|
"generateLicenseKeyForm": {
|
||||||
"validation": {
|
"validation": {
|
||||||
"emailRequired": "Please enter a valid email address",
|
"emailRequired": "Wprowadź poprawny adres e-mail",
|
||||||
"useCaseTypeRequired": "Please select a use case type",
|
"useCaseTypeRequired": "Proszę wybrać typ litery",
|
||||||
"firstNameRequired": "First name is required",
|
"firstNameRequired": "Imię jest wymagane",
|
||||||
"lastNameRequired": "Last name is required",
|
"lastNameRequired": "Nazwisko jest wymagane",
|
||||||
"primaryUseRequired": "Please describe your primary use",
|
"primaryUseRequired": "Opisz swoje podstawowe użycie",
|
||||||
"jobTitleRequiredBusiness": "Job title is required for business use",
|
"jobTitleRequiredBusiness": "Tytuł pracy jest wymagany do użytku służbowego",
|
||||||
"industryRequiredBusiness": "Industry is required for business use",
|
"industryRequiredBusiness": "Przemysł jest wymagany do celów biznesowych.",
|
||||||
"stateProvinceRegionRequired": "State/Province/Region is required",
|
"stateProvinceRegionRequired": "Wymagany jest stan/województwo/region",
|
||||||
"postalZipCodeRequired": "Postal/ZIP Code is required",
|
"postalZipCodeRequired": "Kod pocztowy jest wymagany",
|
||||||
"companyNameRequiredBusiness": "Company name is required for business use",
|
"companyNameRequiredBusiness": "Nazwa firmy jest wymagana do użytku służbowego",
|
||||||
"countryOfResidenceRequiredBusiness": "Country of residence is required for business use",
|
"countryOfResidenceRequiredBusiness": "Kraj zamieszkania jest wymagany do celów służbowych",
|
||||||
"countryRequiredPersonal": "Country is required for personal use",
|
"countryRequiredPersonal": "Kraj jest wymagany do użytku osobistego",
|
||||||
"agreeToTermsRequired": "You must agree to the terms",
|
"agreeToTermsRequired": "Musisz zaakceptować regulamin",
|
||||||
"complianceConfirmationRequired": "You must confirm compliance with the Fossorial Commercial License"
|
"complianceConfirmationRequired": "Musisz potwierdzić zgodność z Fossorial Commercial License"
|
||||||
},
|
},
|
||||||
"useCaseOptions": {
|
"useCaseOptions": {
|
||||||
"personal": {
|
"personal": {
|
||||||
"title": "Personal Use",
|
"title": "Użytkowanie osobiste",
|
||||||
"description": "For individual, non-commercial use such as learning, personal projects, or experimentation."
|
"description": "Dla celów indywidualnych, niekomercyjnych, takich jak nauka, projekty osobiste lub eksperymenty."
|
||||||
},
|
},
|
||||||
"business": {
|
"business": {
|
||||||
"title": "Business Use",
|
"title": "Wykorzystanie służbowe",
|
||||||
"description": "For use within organizations, companies, or commercial or revenue-generating activities."
|
"description": "Do użytku w ramach organizacji, przedsiębiorstw lub działalności komercyjnej lub generującej dochody."
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"steps": {
|
"steps": {
|
||||||
"emailLicenseType": {
|
"emailLicenseType": {
|
||||||
"title": "Email & License Type",
|
"title": "Typ adresu e-mail i licencji",
|
||||||
"description": "Enter your email and choose your license type"
|
"description": "Wprowadź swój adres e-mail i wybierz rodzaj licencji"
|
||||||
},
|
},
|
||||||
"personalInformation": {
|
"personalInformation": {
|
||||||
"title": "Personal Information",
|
"title": "Informacje osobiste",
|
||||||
"description": "Tell us about yourself"
|
"description": "Powiedz nam o sobie"
|
||||||
},
|
},
|
||||||
"contactInformation": {
|
"contactInformation": {
|
||||||
"title": "Contact Information",
|
"title": "Informacje kontaktowe",
|
||||||
"description": "Your contact details"
|
"description": "Twoje dane kontaktowe"
|
||||||
},
|
},
|
||||||
"termsGenerate": {
|
"termsGenerate": {
|
||||||
"title": "Terms & Generate",
|
"title": "Reguły i generuj",
|
||||||
"description": "Review and accept terms to generate your license"
|
"description": "Przejrzyj i zaakceptuj warunki generowania licencji"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"alerts": {
|
"alerts": {
|
||||||
"commercialUseDisclosure": {
|
"commercialUseDisclosure": {
|
||||||
"title": "Usage Disclosure",
|
"title": "Ujawnienie użycia",
|
||||||
"description": "Select the license tier that accurately reflects your intended use. The Personal License permits free use of the Software for individual, non-commercial or small-scale commercial activities with annual gross revenue under $100,000 USD. Any use beyond these limits — including use within a business, organization, or other revenue-generating environment — requires a valid Enterprise License and payment of the applicable licensing fee. All users, whether Personal or Enterprise, must comply with the Fossorial Commercial License Terms."
|
"description": "Wybierz poziom licencji, który dokładnie odzwierciedla zamierzone użycie. Licencja osobista pozwala na bezpłatne wykorzystanie oprogramowania do działalności komercyjnej, o charakterze indywidualnym, niekomercyjnym lub na małą skalę, o rocznym dochodzie brutto poniżej 100 000 USD. Wszelkie zastosowania wykraczające poza te ograniczenia – w tym wykorzystanie w przedsiębiorstwie, organizacja, lub inne środowisko generujące dochód – wymaga ważnej licencji przedsiębiorstwa i uiszczenia stosownej opłaty licencyjnej. Wszyscy użytkownicy, niezależnie od tego, czy są prywatni czy przedsiębiorcy, muszą przestrzegać warunków licencji Fossorial Commercial License."
|
||||||
},
|
},
|
||||||
"trialPeriodInformation": {
|
"trialPeriodInformation": {
|
||||||
"title": "Trial Period Information",
|
"title": "Informacje o okresie próbnym",
|
||||||
"description": "This License Key enables Enterprise features for a 7-day evaluation period. Continued access to Paid Features beyond the evaluation period requires activation under a valid Personal or Enterprise License. For Enterprise licensing, contact sales@fossorial.io."
|
"description": "Ten klucz licencyjny umożliwia przedsiębiorstwom funkcje na 7-dniowy okres oceny. Ciągły dostęp do płatnych funkcji po zakończeniu okresu oceny wymaga aktywacji na podstawie ważnej licencji osobistej lub prywatnej. W celu uzyskania licencji przedsiębiorstwa skontaktuj się z sales@pangolin.net."
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"form": {
|
"form": {
|
||||||
"useCaseQuestion": "Are you using Pangolin for personal or business use?",
|
"useCaseQuestion": "Używasz Pangolin do użytku osobistego lub biznesowego?",
|
||||||
"firstName": "First Name",
|
"firstName": "Imię",
|
||||||
"lastName": "Last Name",
|
"lastName": "Nazwisko",
|
||||||
"jobTitle": "Job Title",
|
"jobTitle": "Tytuł zadania",
|
||||||
"primaryUseQuestion": "What do you primarily plan to use Pangolin for?",
|
"primaryUseQuestion": "Na co planujesz przede wszystkim stosować lek Pangolin?",
|
||||||
"industryQuestion": "What is your industry?",
|
"industryQuestion": "Jaki jest twój przemysł?",
|
||||||
"prospectiveUsersQuestion": "How many prospective users do you expect to have?",
|
"prospectiveUsersQuestion": "Ilu potencjalnych użytkowników oczekujesz?",
|
||||||
"prospectiveSitesQuestion": "How many prospective sites (tunnels) do you expect to have?",
|
"prospectiveSitesQuestion": "Ile potencjalnych stron (tuneli) oczekujesz?",
|
||||||
"companyName": "Company name",
|
"companyName": "Nazwa firmy",
|
||||||
"countryOfResidence": "Country of residence",
|
"countryOfResidence": "Kraj zamieszkania",
|
||||||
"stateProvinceRegion": "State / Province / Region",
|
"stateProvinceRegion": "Województwo / Region",
|
||||||
"postalZipCode": "Postal / ZIP Code",
|
"postalZipCode": "Kod pocztowy",
|
||||||
"companyWebsite": "Company website",
|
"companyWebsite": "Strona internetowa firmy",
|
||||||
"companyPhoneNumber": "Company phone number",
|
"companyPhoneNumber": "Numer telefonu firmy",
|
||||||
"country": "Country",
|
"country": "Kraj",
|
||||||
"phoneNumberOptional": "Phone number (optional)",
|
"phoneNumberOptional": "Numer telefonu (opcjonalnie)",
|
||||||
"complianceConfirmation": "I confirm that I am in compliance with the Fossorial Commercial License and that reporting inaccurate information or misidentifying use of the product is a violation of the license."
|
"complianceConfirmation": "Potwierdzam, że podane przeze mnie informacje są dokładne i że jestem zgodny z Fossorial Commercial License. Zgłaszanie nieprawidłowych informacji lub błędne oznaczanie użycia produktu jest naruszeniem licencji i może skutkować cofnięciem klucza."
|
||||||
},
|
},
|
||||||
"buttons": {
|
"buttons": {
|
||||||
"close": "Close",
|
"close": "Zamknij",
|
||||||
"previous": "Previous",
|
"previous": "Poprzedni",
|
||||||
"next": "Next",
|
"next": "Następny",
|
||||||
"generateLicenseKey": "Generate License Key"
|
"generateLicenseKey": "Generuj klucz licencyjny"
|
||||||
},
|
},
|
||||||
"toasts": {
|
"toasts": {
|
||||||
"success": {
|
"success": {
|
||||||
"title": "License key generated successfully",
|
"title": "Klucz licencyjny wygenerowany pomyślnie",
|
||||||
"description": "Your license key has been generated and is ready to use."
|
"description": "Twój klucz licencyjny został wygenerowany i jest gotowy do użycia."
|
||||||
},
|
},
|
||||||
"error": {
|
"error": {
|
||||||
"title": "Failed to generate license key",
|
"title": "Nie udało się wygenerować klucza licencyjnego",
|
||||||
"description": "An error occurred while generating the license key."
|
"description": "Wystąpił błąd podczas generowania klucza licencji."
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"priority": "Priorytet",
|
"priority": "Priorytet",
|
||||||
"priorityDescription": "Najpierw oceniane są trasy priorytetowe. Priorytet = 100 oznacza automatyczne zamawianie (decyzje systemowe). Użyj innego numeru, aby wyegzekwować ręczny priorytet.",
|
"priorityDescription": "Najpierw oceniane są trasy priorytetowe. Priorytet = 100 oznacza automatyczne zamawianie (decyzje systemowe). Użyj innego numeru, aby wyegzekwować ręczny priorytet.",
|
||||||
"instanceName": "Instance Name",
|
"instanceName": "Nazwa instancji",
|
||||||
"pathMatchModalTitle": "Configure Path Matching",
|
"pathMatchModalTitle": "Skonfiguruj dopasowanie ścieżki",
|
||||||
"pathMatchModalDescription": "Set up how incoming requests should be matched based on their path.",
|
"pathMatchModalDescription": "Skonfiguruj sposób dopasowania przychodzących żądań na podstawie ich ścieżki.",
|
||||||
"pathMatchType": "Match Type",
|
"pathMatchType": "Typ dopasowania",
|
||||||
"pathMatchPrefix": "Prefix",
|
"pathMatchPrefix": "Prefiks",
|
||||||
"pathMatchExact": "Exact",
|
"pathMatchExact": "Dokładny",
|
||||||
"pathMatchRegex": "Regex",
|
"pathMatchRegex": "Regex",
|
||||||
"pathMatchValue": "Path Value",
|
"pathMatchValue": "Wartość ścieżki",
|
||||||
"clear": "Clear",
|
"clear": "Wyczyść",
|
||||||
"saveChanges": "Save Changes",
|
"saveChanges": "Zapisz zmiany",
|
||||||
"pathMatchRegexPlaceholder": "^/api/.*",
|
"pathMatchRegexPlaceholder": "^/api/.*",
|
||||||
"pathMatchDefaultPlaceholder": "/path",
|
"pathMatchDefaultPlaceholder": "/ścieżka",
|
||||||
"pathMatchPrefixHelp": "Example: /api matches /api, /api/users, etc.",
|
"pathMatchPrefixHelp": "Przykład: /api pasuje do /api, /api/users itp.",
|
||||||
"pathMatchExactHelp": "Example: /api matches only /api",
|
"pathMatchExactHelp": "Przykład: /api pasuje tylko /api",
|
||||||
"pathMatchRegexHelp": "Example: ^/api/.* matches /api/anything",
|
"pathMatchRegexHelp": "Przykład: ^/api/.* pasuje do /api/cokolwiek",
|
||||||
"pathRewriteModalTitle": "Configure Path Rewriting",
|
"pathRewriteModalTitle": "Konfiguruj Przepisywanie Ścieżki",
|
||||||
"pathRewriteModalDescription": "Transform the matched path before forwarding to the target.",
|
"pathRewriteModalDescription": "Przekształć dopasowaną ścieżkę przed przekierowaniem do celu.",
|
||||||
"pathRewriteType": "Rewrite Type",
|
"pathRewriteType": "Typ przekierowania",
|
||||||
"pathRewritePrefixOption": "Prefix - Replace prefix",
|
"pathRewritePrefixOption": "Prefiks - Zamień prefiks",
|
||||||
"pathRewriteExactOption": "Exact - Replace entire path",
|
"pathRewriteExactOption": "Dokładny - Zamień całą ścieżkę",
|
||||||
"pathRewriteRegexOption": "Regex - Pattern replacement",
|
"pathRewriteRegexOption": "Regex - zamiennik wzoru",
|
||||||
"pathRewriteStripPrefixOption": "Strip Prefix - Remove prefix",
|
"pathRewriteStripPrefixOption": "Prefiks paska - Usuń prefiks",
|
||||||
"pathRewriteValue": "Rewrite Value",
|
"pathRewriteValue": "Przepisz wartość",
|
||||||
"pathRewriteRegexPlaceholder": "/new/$1",
|
"pathRewriteRegexPlaceholder": "/nowy/$1",
|
||||||
"pathRewriteDefaultPlaceholder": "/new-path",
|
"pathRewriteDefaultPlaceholder": "/new-path",
|
||||||
"pathRewritePrefixHelp": "Replace the matched prefix with this value",
|
"pathRewritePrefixHelp": "Zastąp dopasowany prefiks tą wartością",
|
||||||
"pathRewriteExactHelp": "Replace the entire path with this value when the path matches exactly",
|
"pathRewriteExactHelp": "Zastąp całą ścieżkę tą wartością, gdy ścieżka dokładnie pasuje do siebie",
|
||||||
"pathRewriteRegexHelp": "Use capture groups like $1, $2 for replacement",
|
"pathRewriteRegexHelp": "Użyj grup przechwytywania takich jak $1, $2 do zamiany",
|
||||||
"pathRewriteStripPrefixHelp": "Leave empty to strip prefix or provide new prefix",
|
"pathRewriteStripPrefixHelp": "Pozostaw puste, aby usunąć prefiks lub podać nowy prefiks",
|
||||||
"pathRewritePrefix": "Prefix",
|
"pathRewritePrefix": "Prefiks",
|
||||||
"pathRewriteExact": "Exact",
|
"pathRewriteExact": "Dokładny",
|
||||||
"pathRewriteRegex": "Regex",
|
"pathRewriteRegex": "Regex",
|
||||||
"pathRewriteStrip": "Strip",
|
"pathRewriteStrip": "Pasek",
|
||||||
"pathRewriteStripLabel": "strip"
|
"pathRewriteStripLabel": "pasek",
|
||||||
|
"sidebarEnableEnterpriseLicense": "Włącz licencję przedsiębiorstwa",
|
||||||
|
"cannotbeUndone": "Tej operacji nie można cofnąć.",
|
||||||
|
"toConfirm": "potwierdzić",
|
||||||
|
"deleteClientQuestion": "Czy na pewno chcesz usunąć klienta z witryny i organizacji?",
|
||||||
|
"clientMessageRemove": "Po usunięciu, klient nie będzie już mógł połączyć się z witryną.",
|
||||||
|
"sidebarLogs": "Logi",
|
||||||
|
"request": "Żądanie",
|
||||||
|
"logs": "Logi",
|
||||||
|
"logsSettingsDescription": "Monitoruj logi zebrane z tej orginizacji",
|
||||||
|
"searchLogs": "Szukaj dzienników...",
|
||||||
|
"action": "Akcja",
|
||||||
|
"actor": "Aktor",
|
||||||
|
"timestamp": "Znacznik czasu",
|
||||||
|
"accessLogs": "Logi dostępu",
|
||||||
|
"exportCsv": "Eksportuj CSV",
|
||||||
|
"actorId": "Identyfikator podmiotu",
|
||||||
|
"allowedByRule": "Dozwolone przez regułę",
|
||||||
|
"allowedNoAuth": "Dozwolone Brak Auth",
|
||||||
|
"validAccessToken": "Ważny token dostępu",
|
||||||
|
"validHeaderAuth": "Valid header auth",
|
||||||
|
"validPincode": "Valid Pincode",
|
||||||
|
"validPassword": "Prawidłowe hasło",
|
||||||
|
"validEmail": "Valid email",
|
||||||
|
"validSSO": "Valid SSO",
|
||||||
|
"resourceBlocked": "Zasób zablokowany",
|
||||||
|
"droppedByRule": "Upuszczone przez regułę",
|
||||||
|
"noSessions": "Brak sesji",
|
||||||
|
"temporaryRequestToken": "Tymczasowy token żądania",
|
||||||
|
"noMoreAuthMethods": "No Valid Auth",
|
||||||
|
"ip": "IP",
|
||||||
|
"reason": "Powód",
|
||||||
|
"requestLogs": "Dzienniki żądań",
|
||||||
|
"host": "Host",
|
||||||
|
"location": "Lokalizacja",
|
||||||
|
"actionLogs": "Dzienniki działań",
|
||||||
|
"sidebarLogsRequest": "Dzienniki żądań",
|
||||||
|
"sidebarLogsAccess": "Logi dostępu",
|
||||||
|
"sidebarLogsAction": "Dzienniki działań",
|
||||||
|
"logRetention": "Zachowanie dziennika",
|
||||||
|
"logRetentionDescription": "Zarządzaj jak długo różne typy logów są zachowane dla tej organizacji lub wyłącz je",
|
||||||
|
"requestLogsDescription": "Zobacz szczegółowe dzienniki żądań zasobów w tej organizacji",
|
||||||
|
"logRetentionRequestLabel": "Zachowanie dziennika żądań",
|
||||||
|
"logRetentionRequestDescription": "Jak długo zachować dzienniki żądań",
|
||||||
|
"logRetentionAccessLabel": "Zachowanie dziennika dostępu",
|
||||||
|
"logRetentionAccessDescription": "Jak długo zachować dzienniki dostępu",
|
||||||
|
"logRetentionActionLabel": "Zachowanie dziennika akcji",
|
||||||
|
"logRetentionActionDescription": "Jak długo zachować dzienniki akcji",
|
||||||
|
"logRetentionDisabled": "Wyłączone",
|
||||||
|
"logRetention3Days": "3 dni",
|
||||||
|
"logRetention7Days": "7 dni",
|
||||||
|
"logRetention14Days": "14 dni",
|
||||||
|
"logRetention30Days": "30 dni",
|
||||||
|
"logRetention90Days": "90 dni",
|
||||||
|
"logRetentionForever": "Na zawsze",
|
||||||
|
"actionLogsDescription": "Zobacz historię działań wykonywanych w tej organizacji",
|
||||||
|
"accessLogsDescription": "Wyświetl prośby o autoryzację dostępu do zasobów w tej organizacji",
|
||||||
|
"licenseRequiredToUse": "Licencja Enterprise jest wymagana do korzystania z tej funkcji.",
|
||||||
|
"certResolver": "Rozwiązywanie certyfikatów",
|
||||||
|
"certResolverDescription": "Wybierz resolver certyfikatów do użycia dla tego zasobu.",
|
||||||
|
"selectCertResolver": "Wybierz Resolver certyfikatów",
|
||||||
|
"enterCustomResolver": "Wprowadź niestandardowy Resolver",
|
||||||
|
"preferWildcardCert": "Preferuj Certyfikat Wildcard",
|
||||||
|
"unverified": "Niezweryfikowane",
|
||||||
|
"domainSetting": "Ustawienia domeny",
|
||||||
|
"domainSettingDescription": "Skonfiguruj ustawienia domeny",
|
||||||
|
"preferWildcardCertDescription": "Próba wygenerowania certyfikatu wieloznacznego (wymaga poprawnie skonfigurowanego resolwera certyfikatów).",
|
||||||
|
"recordName": "Nazwa rekordu",
|
||||||
|
"auto": "Auto",
|
||||||
|
"TTL": "TTL",
|
||||||
|
"howToAddRecords": "Jak dodać rekordy",
|
||||||
|
"dnsRecord": "Wpisy DNS",
|
||||||
|
"required": "Wymagane",
|
||||||
|
"domainSettingsUpdated": "Ustawienia domeny zaktualizowane pomyślnie",
|
||||||
|
"orgOrDomainIdMissing": "Brakuje identyfikatora organizacji lub domeny",
|
||||||
|
"loadingDNSRecords": "Ładowanie rekordów DNS...",
|
||||||
|
"olmUpdateAvailableInfo": "Dostępna jest zaktualizowana wersja Olm. Zaktualizuj do najnowszej wersji, aby uzyskać najlepsze doświadczenia.",
|
||||||
|
"client": "Klient",
|
||||||
|
"proxyProtocol": "Ustawienia protokołu proxy",
|
||||||
|
"proxyProtocolDescription": "Skonfiguruj protokół Proxy aby zachować adresy IP klienta dla usług TCP/UDP.",
|
||||||
|
"enableProxyProtocol": "Włącz protokół proxy",
|
||||||
|
"proxyProtocolInfo": "Zachowaj adresy IP klienta dla backendów TCP/UDP",
|
||||||
|
"proxyProtocolVersion": "Wersja protokołu proxy",
|
||||||
|
"version1": " Wersja 1 (zalecane)",
|
||||||
|
"version2": "Wersja 2",
|
||||||
|
"versionDescription": "Wersja 1 jest oparta na tekście i szeroko wspierana. Wersja 2 jest binarna i bardziej efektywna, ale mniej kompatybilna.",
|
||||||
|
"warning": "Ostrzeżenie",
|
||||||
|
"proxyProtocolWarning": "Twoja aplikacja backend musi być skonfigurowana tak, aby przyjmować połączenia z protokołem proxy. Jeśli Twój backend nie obsługuje protokołu proxy, włączenie to spowoduje przerwanie wszystkich połączeń. Upewnij się, że konfiguracja twojego backendu do zaufanych nagłówków protokołu proxy z Traefik.",
|
||||||
|
"restarting": "Restartowanie...",
|
||||||
|
"manual": "Ręcznie",
|
||||||
|
"messageSupport": "Obsługa wiadomości",
|
||||||
|
"supportNotAvailableTitle": "Wsparcie niedostępne",
|
||||||
|
"supportNotAvailableDescription": "Wsparcie nie jest teraz dostępne. Możesz wysłać e-mail na adres support@pangolin.net.",
|
||||||
|
"supportRequestSentTitle": "Prośba o wsparcie wysłana",
|
||||||
|
"supportRequestSentDescription": "Wiadomość została wysłana pomyślnie.",
|
||||||
|
"supportRequestFailedTitle": "Nie udało się wysłać żądania",
|
||||||
|
"supportRequestFailedDescription": "Wystąpił błąd podczas wysyłania prośby o wsparcie.",
|
||||||
|
"supportSubjectRequired": "Temat jest wymagany",
|
||||||
|
"supportSubjectMaxLength": "Temat musi mieć 255 znaków lub mniej",
|
||||||
|
"supportMessageRequired": "Wiadomość jest wymagana",
|
||||||
|
"supportReplyTo": "Odpowiedź do",
|
||||||
|
"supportSubject": "Temat",
|
||||||
|
"supportSubjectPlaceholder": "Wprowadź temat",
|
||||||
|
"supportMessage": "Wiadomość",
|
||||||
|
"supportMessagePlaceholder": "Wprowadź swoją wiadomość",
|
||||||
|
"supportSending": "Wysyłanie...",
|
||||||
|
"supportSend": "Wyślij",
|
||||||
|
"supportMessageSent": "Wiadomość wysłana!",
|
||||||
|
"supportWillContact": "Wkrótce będziemy w kontakcie!"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -47,9 +47,8 @@
|
|||||||
"edit": "Alterar",
|
"edit": "Alterar",
|
||||||
"siteConfirmDelete": "Confirmar que pretende apagar o site",
|
"siteConfirmDelete": "Confirmar que pretende apagar o site",
|
||||||
"siteDelete": "Excluir site",
|
"siteDelete": "Excluir site",
|
||||||
"siteMessageRemove": "Uma vez removido, o site não estará mais acessível. Todos os recursos e alvos associados ao site também serão removidos.",
|
"siteMessageRemove": "Uma vez removido, o site não estará mais acessível. Todas as metas associadas ao site também serão removidas.",
|
||||||
"siteMessageConfirm": "Para confirmar, por favor, digite o nome do site abaixo.",
|
"siteQuestionRemove": "Você tem certeza que deseja remover este site da organização?",
|
||||||
"siteQuestionRemove": "Você tem certeza que deseja remover o site {selectedSite} da organização?",
|
|
||||||
"siteManageSites": "Gerir sites",
|
"siteManageSites": "Gerir sites",
|
||||||
"siteDescription": "Permitir conectividade à sua rede através de túneis seguros",
|
"siteDescription": "Permitir conectividade à sua rede através de túneis seguros",
|
||||||
"siteCreate": "Criar site",
|
"siteCreate": "Criar site",
|
||||||
@@ -96,7 +95,7 @@
|
|||||||
"siteWgDescription": "Use qualquer cliente do WireGuard para estabelecer um túnel. Configuração manual NAT é necessária.",
|
"siteWgDescription": "Use qualquer cliente do WireGuard para estabelecer um túnel. Configuração manual NAT é necessária.",
|
||||||
"siteWgDescriptionSaas": "Use qualquer cliente WireGuard para estabelecer um túnel. Configuração manual NAT necessária. SOMENTE FUNCIONA EM NODES AUTO-HOSPEDADOS",
|
"siteWgDescriptionSaas": "Use qualquer cliente WireGuard para estabelecer um túnel. Configuração manual NAT necessária. SOMENTE FUNCIONA EM NODES AUTO-HOSPEDADOS",
|
||||||
"siteLocalDescription": "Recursos locais apenas. Sem túneis.",
|
"siteLocalDescription": "Recursos locais apenas. Sem túneis.",
|
||||||
"siteLocalDescriptionSaas": "Local resources only. No tunneling. Only available on remote nodes.",
|
"siteLocalDescriptionSaas": "Apenas recursos locais. Sem túneis. Apenas disponível em nós remotos.",
|
||||||
"siteSeeAll": "Ver todos os sites",
|
"siteSeeAll": "Ver todos os sites",
|
||||||
"siteTunnelDescription": "Determine como você deseja se conectar ao seu site",
|
"siteTunnelDescription": "Determine como você deseja se conectar ao seu site",
|
||||||
"siteNewtCredentials": "Credenciais Novas",
|
"siteNewtCredentials": "Credenciais Novas",
|
||||||
@@ -154,8 +153,7 @@
|
|||||||
"protected": "Protegido",
|
"protected": "Protegido",
|
||||||
"notProtected": "Não Protegido",
|
"notProtected": "Não Protegido",
|
||||||
"resourceMessageRemove": "Uma vez removido, o recurso não estará mais acessível. Todos os alvos associados ao recurso também serão removidos.",
|
"resourceMessageRemove": "Uma vez removido, o recurso não estará mais acessível. Todos os alvos associados ao recurso também serão removidos.",
|
||||||
"resourceMessageConfirm": "Para confirmar, por favor, digite o nome do recurso abaixo.",
|
"resourceQuestionRemove": "Você tem certeza que deseja remover o recurso da organização?",
|
||||||
"resourceQuestionRemove": "Tem certeza que deseja remover o recurso {selectedResource} da organização?",
|
|
||||||
"resourceHTTP": "Recurso HTTPS",
|
"resourceHTTP": "Recurso HTTPS",
|
||||||
"resourceHTTPDescription": "O proxy solicita ao seu aplicativo via HTTPS usando um subdomínio ou domínio base.",
|
"resourceHTTPDescription": "O proxy solicita ao seu aplicativo via HTTPS usando um subdomínio ou domínio base.",
|
||||||
"resourceRaw": "Recurso TCP/UDP bruto",
|
"resourceRaw": "Recurso TCP/UDP bruto",
|
||||||
@@ -220,7 +218,7 @@
|
|||||||
"orgDeleteConfirm": "Confirmar que pretende apagar a organização",
|
"orgDeleteConfirm": "Confirmar que pretende apagar a organização",
|
||||||
"orgMessageRemove": "Esta ação é irreversível e apagará todos os dados associados.",
|
"orgMessageRemove": "Esta ação é irreversível e apagará todos os dados associados.",
|
||||||
"orgMessageConfirm": "Para confirmar, digite o nome da organização abaixo.",
|
"orgMessageConfirm": "Para confirmar, digite o nome da organização abaixo.",
|
||||||
"orgQuestionRemove": "Tem certeza que deseja remover a organização {selectedOrg}?",
|
"orgQuestionRemove": "Você tem certeza que deseja remover esta organização?",
|
||||||
"orgUpdated": "Organização atualizada",
|
"orgUpdated": "Organização atualizada",
|
||||||
"orgUpdatedDescription": "A organização foi atualizada.",
|
"orgUpdatedDescription": "A organização foi atualizada.",
|
||||||
"orgErrorUpdate": "Falha ao atualizar organização",
|
"orgErrorUpdate": "Falha ao atualizar organização",
|
||||||
@@ -287,9 +285,8 @@
|
|||||||
"apiKeysAdd": "Gerar Chave API",
|
"apiKeysAdd": "Gerar Chave API",
|
||||||
"apiKeysErrorDelete": "Erro ao apagar chave API",
|
"apiKeysErrorDelete": "Erro ao apagar chave API",
|
||||||
"apiKeysErrorDeleteMessage": "Erro ao apagar chave API",
|
"apiKeysErrorDeleteMessage": "Erro ao apagar chave API",
|
||||||
"apiKeysQuestionRemove": "Tem certeza que deseja remover a chave API {selectedApiKey} da organização?",
|
"apiKeysQuestionRemove": "Tem certeza que deseja remover a chave de API da organização?",
|
||||||
"apiKeysMessageRemove": "Uma vez removida, a chave API não poderá mais ser utilizada.",
|
"apiKeysMessageRemove": "Uma vez removida, a chave API não poderá mais ser utilizada.",
|
||||||
"apiKeysMessageConfirm": "Para confirmar, por favor digite o nome da chave API abaixo.",
|
|
||||||
"apiKeysDeleteConfirm": "Confirmar Exclusão da Chave API",
|
"apiKeysDeleteConfirm": "Confirmar Exclusão da Chave API",
|
||||||
"apiKeysDelete": "Excluir Chave API",
|
"apiKeysDelete": "Excluir Chave API",
|
||||||
"apiKeysManage": "Gerir Chaves API",
|
"apiKeysManage": "Gerir Chaves API",
|
||||||
@@ -305,8 +302,7 @@
|
|||||||
"userDeleteConfirm": "Confirmar Exclusão do Usuário",
|
"userDeleteConfirm": "Confirmar Exclusão do Usuário",
|
||||||
"userDeleteServer": "Excluir utilizador do servidor",
|
"userDeleteServer": "Excluir utilizador do servidor",
|
||||||
"userMessageRemove": "O utilizador será removido de todas as organizações e será completamente removido do servidor.",
|
"userMessageRemove": "O utilizador será removido de todas as organizações e será completamente removido do servidor.",
|
||||||
"userMessageConfirm": "Para confirmar, por favor digite o nome do utilizador abaixo.",
|
"userQuestionRemove": "Tem certeza que deseja excluir permanentemente o usuário do servidor?",
|
||||||
"userQuestionRemove": "Tem certeza que deseja apagar o {selectedUser} permanentemente do servidor?",
|
|
||||||
"licenseKey": "Chave de Licença",
|
"licenseKey": "Chave de Licença",
|
||||||
"valid": "Válido",
|
"valid": "Válido",
|
||||||
"numberOfSites": "Número de sites",
|
"numberOfSites": "Número de sites",
|
||||||
@@ -339,7 +335,7 @@
|
|||||||
"fossorialLicense": "Ver Termos e Condições de Assinatura e Licença Fossorial",
|
"fossorialLicense": "Ver Termos e Condições de Assinatura e Licença Fossorial",
|
||||||
"licenseMessageRemove": "Isto irá remover a chave da licença e todas as permissões associadas concedidas por ela.",
|
"licenseMessageRemove": "Isto irá remover a chave da licença e todas as permissões associadas concedidas por ela.",
|
||||||
"licenseMessageConfirm": "Para confirmar, por favor, digite a chave de licença abaixo.",
|
"licenseMessageConfirm": "Para confirmar, por favor, digite a chave de licença abaixo.",
|
||||||
"licenseQuestionRemove": "Tem certeza que deseja apagar a chave de licença {selectedKey}?",
|
"licenseQuestionRemove": "Tem certeza que deseja excluir a chave de licença?",
|
||||||
"licenseKeyDelete": "Excluir Chave de Licença",
|
"licenseKeyDelete": "Excluir Chave de Licença",
|
||||||
"licenseKeyDeleteConfirm": "Confirmar que pretende apagar a chave de licença",
|
"licenseKeyDeleteConfirm": "Confirmar que pretende apagar a chave de licença",
|
||||||
"licenseTitle": "Gerir Status da Licença",
|
"licenseTitle": "Gerir Status da Licença",
|
||||||
@@ -372,7 +368,7 @@
|
|||||||
"inviteRemoveErrorDescription": "Ocorreu um erro ao remover o convite.",
|
"inviteRemoveErrorDescription": "Ocorreu um erro ao remover o convite.",
|
||||||
"inviteRemoved": "Convite removido",
|
"inviteRemoved": "Convite removido",
|
||||||
"inviteRemovedDescription": "O convite para {email} foi removido.",
|
"inviteRemovedDescription": "O convite para {email} foi removido.",
|
||||||
"inviteQuestionRemove": "Tem certeza de que deseja remover o convite {email}?",
|
"inviteQuestionRemove": "Tem certeza de que deseja remover o convite?",
|
||||||
"inviteMessageRemove": "Uma vez removido, este convite não será mais válido. Você sempre pode convidar o utilizador novamente mais tarde.",
|
"inviteMessageRemove": "Uma vez removido, este convite não será mais válido. Você sempre pode convidar o utilizador novamente mais tarde.",
|
||||||
"inviteMessageConfirm": "Para confirmar, digite o endereço de e-mail do convite abaixo.",
|
"inviteMessageConfirm": "Para confirmar, digite o endereço de e-mail do convite abaixo.",
|
||||||
"inviteQuestionRegenerate": "Tem certeza que deseja regenerar o convite{email, plural, ='' {}, other { para #}}? Isso irá revogar o convite anterior.",
|
"inviteQuestionRegenerate": "Tem certeza que deseja regenerar o convite{email, plural, ='' {}, other { para #}}? Isso irá revogar o convite anterior.",
|
||||||
@@ -398,9 +394,8 @@
|
|||||||
"userErrorOrgRemoveDescription": "Ocorreu um erro ao remover o utilizador.",
|
"userErrorOrgRemoveDescription": "Ocorreu um erro ao remover o utilizador.",
|
||||||
"userOrgRemoved": "Usuário removido",
|
"userOrgRemoved": "Usuário removido",
|
||||||
"userOrgRemovedDescription": "O utilizador {email} foi removido da organização.",
|
"userOrgRemovedDescription": "O utilizador {email} foi removido da organização.",
|
||||||
"userQuestionOrgRemove": "Tem certeza que deseja remover {email} da organização?",
|
"userQuestionOrgRemove": "Você tem certeza que deseja remover este usuário da organização?",
|
||||||
"userMessageOrgRemove": "Uma vez removido, este utilizador não terá mais acesso à organização. Você sempre pode reconvidá-lo depois, mas eles precisarão aceitar o convite novamente.",
|
"userMessageOrgRemove": "Uma vez removido, este utilizador não terá mais acesso à organização. Você sempre pode reconvidá-lo depois, mas eles precisarão aceitar o convite novamente.",
|
||||||
"userMessageOrgConfirm": "Para confirmar, digite o nome do utilizador abaixo.",
|
|
||||||
"userRemoveOrgConfirm": "Confirmar Remoção do Usuário",
|
"userRemoveOrgConfirm": "Confirmar Remoção do Usuário",
|
||||||
"userRemoveOrg": "Remover Usuário da Organização",
|
"userRemoveOrg": "Remover Usuário da Organização",
|
||||||
"users": "Utilizadores",
|
"users": "Utilizadores",
|
||||||
@@ -730,7 +725,7 @@
|
|||||||
"pangolinServerAdmin": "Administrador do Servidor - Pangolin",
|
"pangolinServerAdmin": "Administrador do Servidor - Pangolin",
|
||||||
"licenseTierProfessional": "Licença Profissional",
|
"licenseTierProfessional": "Licença Profissional",
|
||||||
"licenseTierEnterprise": "Licença Empresarial",
|
"licenseTierEnterprise": "Licença Empresarial",
|
||||||
"licenseTierPersonal": "Personal License",
|
"licenseTierPersonal": "Licença Pessoal",
|
||||||
"licensed": "Licenciado",
|
"licensed": "Licenciado",
|
||||||
"yes": "Sim",
|
"yes": "Sim",
|
||||||
"no": "Não",
|
"no": "Não",
|
||||||
@@ -742,7 +737,7 @@
|
|||||||
"idpManageDescription": "Visualizar e gerir provedores de identidade no sistema",
|
"idpManageDescription": "Visualizar e gerir provedores de identidade no sistema",
|
||||||
"idpDeletedDescription": "Provedor de identidade eliminado com sucesso",
|
"idpDeletedDescription": "Provedor de identidade eliminado com sucesso",
|
||||||
"idpOidc": "OAuth2/OIDC",
|
"idpOidc": "OAuth2/OIDC",
|
||||||
"idpQuestionRemove": "Tem certeza que deseja eliminar permanentemente o provedor de identidade {name}?",
|
"idpQuestionRemove": "Tem certeza que deseja eliminar permanentemente o provedor de identidade?",
|
||||||
"idpMessageRemove": "Isto irá remover o provedor de identidade e todas as configurações associadas. Os utilizadores que se autenticam através deste provedor não poderão mais fazer login.",
|
"idpMessageRemove": "Isto irá remover o provedor de identidade e todas as configurações associadas. Os utilizadores que se autenticam através deste provedor não poderão mais fazer login.",
|
||||||
"idpMessageConfirm": "Para confirmar, por favor digite o nome do provedor de identidade abaixo.",
|
"idpMessageConfirm": "Para confirmar, por favor digite o nome do provedor de identidade abaixo.",
|
||||||
"idpConfirmDelete": "Confirmar Eliminação do Provedor de Identidade",
|
"idpConfirmDelete": "Confirmar Eliminação do Provedor de Identidade",
|
||||||
@@ -916,6 +911,18 @@
|
|||||||
"passwordResetCodeDescription": "Verifique o seu email para obter o código de redefinição.",
|
"passwordResetCodeDescription": "Verifique o seu email para obter o código de redefinição.",
|
||||||
"passwordNew": "Nova Palavra-passe",
|
"passwordNew": "Nova Palavra-passe",
|
||||||
"passwordNewConfirm": "Confirmar Nova Palavra-passe",
|
"passwordNewConfirm": "Confirmar Nova Palavra-passe",
|
||||||
|
"changePassword": "Mudar a senha",
|
||||||
|
"changePasswordDescription": "Atualize a senha da sua conta",
|
||||||
|
"oldPassword": "Palavra-passe Atual",
|
||||||
|
"newPassword": "Nova Palavra-Passe",
|
||||||
|
"confirmNewPassword": "Confirme a Nova Senha",
|
||||||
|
"changePasswordError": "Falha ao alterar a senha",
|
||||||
|
"changePasswordErrorDescription": "Ocorreu um erro ao alterar sua senha",
|
||||||
|
"changePasswordSuccess": "Senha alterada com sucesso",
|
||||||
|
"changePasswordSuccessDescription": "Sua senha foi atualizada com sucesso",
|
||||||
|
"passwordExpiryRequired": "Expiração de senha necessária",
|
||||||
|
"passwordExpiryDescription": "Esta organização exige que você altere sua senha a cada {maxDays} dias.",
|
||||||
|
"changePasswordNow": "Alterar a senha agora",
|
||||||
"pincodeAuth": "Código do Autenticador",
|
"pincodeAuth": "Código do Autenticador",
|
||||||
"pincodeSubmit2": "Submeter Código",
|
"pincodeSubmit2": "Submeter Código",
|
||||||
"passwordResetSubmit": "Solicitar Redefinição",
|
"passwordResetSubmit": "Solicitar Redefinição",
|
||||||
@@ -1154,8 +1161,27 @@
|
|||||||
"sidebarAllUsers": "Todos os utilizadores",
|
"sidebarAllUsers": "Todos os utilizadores",
|
||||||
"sidebarIdentityProviders": "Provedores de identidade",
|
"sidebarIdentityProviders": "Provedores de identidade",
|
||||||
"sidebarLicense": "Tipo:",
|
"sidebarLicense": "Tipo:",
|
||||||
"sidebarClients": "Clients",
|
"sidebarClients": "Clientes",
|
||||||
"sidebarDomains": "Domínios",
|
"sidebarDomains": "Domínios",
|
||||||
|
"sidebarBluePrints": "Diagramas",
|
||||||
|
"blueprints": "Diagramas",
|
||||||
|
"blueprintsDescription": "Diagramas são configurações declarativas YAML que definem seus recursos e suas configurações",
|
||||||
|
"blueprintAdd": "Adicionar Diagrama",
|
||||||
|
"blueprintGoBack": "Ver todos os Diagramas",
|
||||||
|
"blueprintCreate": "Criar Diagrama",
|
||||||
|
"blueprintCreateDescription2": "Siga as etapas abaixo para criar e aplicar um novo diagrama",
|
||||||
|
"blueprintDetails": "Detalhes do Diagrama",
|
||||||
|
"blueprintDetailsDescription": "Veja os detalhes da execução do diagrama",
|
||||||
|
"blueprintInfo": "Informação do Diagrama",
|
||||||
|
"message": "mensagem",
|
||||||
|
"blueprintContentsDescription": "Defina o conteúdo YAML descrevendo a sua infraestrutura",
|
||||||
|
"blueprintErrorCreateDescription": "Ocorreu um erro ao aplicar o diagrama",
|
||||||
|
"blueprintErrorCreate": "Erro ao criar diagrama",
|
||||||
|
"searchBlueprintProgress": "Pesquisar diagramas...",
|
||||||
|
"appliedAt": "Aplicado em",
|
||||||
|
"source": "fonte",
|
||||||
|
"contents": "Conteúdo",
|
||||||
|
"parsedContents": "Conteúdo analisado",
|
||||||
"enableDockerSocket": "Habilitar o Diagrama Docker",
|
"enableDockerSocket": "Habilitar o Diagrama Docker",
|
||||||
"enableDockerSocketDescription": "Ativar a scraping de rótulo Docker para rótulos de diagramas. Caminho de Socket deve ser fornecido para Newt.",
|
"enableDockerSocketDescription": "Ativar a scraping de rótulo Docker para rótulos de diagramas. Caminho de Socket deve ser fornecido para Newt.",
|
||||||
"enableDockerSocketLink": "Saiba mais",
|
"enableDockerSocketLink": "Saiba mais",
|
||||||
@@ -1211,9 +1237,8 @@
|
|||||||
"domainCreate": "Criar Domínio",
|
"domainCreate": "Criar Domínio",
|
||||||
"domainCreatedDescription": "Domínio criado com sucesso",
|
"domainCreatedDescription": "Domínio criado com sucesso",
|
||||||
"domainDeletedDescription": "Domínio deletado com sucesso",
|
"domainDeletedDescription": "Domínio deletado com sucesso",
|
||||||
"domainQuestionRemove": "Tem certeza de que deseja remover o domínio {domain} da sua conta?",
|
"domainQuestionRemove": "Tem certeza de que deseja remover o domínio da sua conta?",
|
||||||
"domainMessageRemove": "Uma vez removido, o domínio não estará mais associado à sua conta.",
|
"domainMessageRemove": "Uma vez removido, o domínio não estará mais associado à sua conta.",
|
||||||
"domainMessageConfirm": "Para confirmar, digite o nome do domínio abaixo.",
|
|
||||||
"domainConfirmDelete": "Confirmar Exclusão de Domínio",
|
"domainConfirmDelete": "Confirmar Exclusão de Domínio",
|
||||||
"domainDelete": "Excluir Domínio",
|
"domainDelete": "Excluir Domínio",
|
||||||
"domain": "Domínio",
|
"domain": "Domínio",
|
||||||
@@ -1280,7 +1305,7 @@
|
|||||||
"billingFreeTier": "Plano Gratuito",
|
"billingFreeTier": "Plano Gratuito",
|
||||||
"billingWarningOverLimit": "Aviso: Você ultrapassou um ou mais limites de uso. Seus sites não se conectarão até você modificar sua assinatura ou ajustar seu uso.",
|
"billingWarningOverLimit": "Aviso: Você ultrapassou um ou mais limites de uso. Seus sites não se conectarão até você modificar sua assinatura ou ajustar seu uso.",
|
||||||
"billingUsageLimitsOverview": "Visão Geral dos Limites de Uso",
|
"billingUsageLimitsOverview": "Visão Geral dos Limites de Uso",
|
||||||
"billingMonitorUsage": "Monitore seu uso em relação aos limites configurados. Se precisar aumentar esses limites, entre em contato conosco support@fossorial.io.",
|
"billingMonitorUsage": "Monitore seu uso em relação aos limites configurados. Se precisar aumentar esses limites, entre em contato conosco support@pangolin.net.",
|
||||||
"billingDataUsage": "Uso de Dados",
|
"billingDataUsage": "Uso de Dados",
|
||||||
"billingOnlineTime": "Tempo Online do Site",
|
"billingOnlineTime": "Tempo Online do Site",
|
||||||
"billingUsers": "Usuários Ativos",
|
"billingUsers": "Usuários Ativos",
|
||||||
@@ -1346,6 +1371,19 @@
|
|||||||
"securityKeyUnknownError": "Houve um problema ao usar sua chave de segurança. Tente novamente.",
|
"securityKeyUnknownError": "Houve um problema ao usar sua chave de segurança. Tente novamente.",
|
||||||
"twoFactorRequired": "A autenticação de dois fatores é necessária para registrar uma chave de segurança.",
|
"twoFactorRequired": "A autenticação de dois fatores é necessária para registrar uma chave de segurança.",
|
||||||
"twoFactor": "Autenticação de Dois Fatores",
|
"twoFactor": "Autenticação de Dois Fatores",
|
||||||
|
"twoFactorAuthentication": "Autenticação dupla",
|
||||||
|
"twoFactorDescription": "Esta organização requer autenticação de dois fatores.",
|
||||||
|
"enableTwoFactor": "Ativar autenticação dupla",
|
||||||
|
"organizationSecurityPolicy": "Política de Segurança da Organização",
|
||||||
|
"organizationSecurityPolicyDescription": "Esta organização tem requisitos de segurança que precisam ser cumpridos antes que você possa acessá-la",
|
||||||
|
"securityRequirements": "Requisitos De Segurança",
|
||||||
|
"allRequirementsMet": "Todos os requisitos foram cumpridos",
|
||||||
|
"completeRequirementsToContinue": "Preencha os requisitos abaixo para continuar acessando esta organização",
|
||||||
|
"youCanNowAccessOrganization": "Agora você pode acessar esta organização",
|
||||||
|
"reauthenticationRequired": "Comprimento da sessão",
|
||||||
|
"reauthenticationDescription": "Esta organização requer que você faça login a cada {maxDays} dias.",
|
||||||
|
"reauthenticationDescriptionHours": "Esta organização exige que você faça login a cada {maxHours} horas.",
|
||||||
|
"reauthenticateNow": "Iniciar sessão novamente",
|
||||||
"adminEnabled2FaOnYourAccount": "Seu administrador ativou a autenticação de dois fatores para {email}. Complete o processo de configuração para continuar.",
|
"adminEnabled2FaOnYourAccount": "Seu administrador ativou a autenticação de dois fatores para {email}. Complete o processo de configuração para continuar.",
|
||||||
"securityKeyAdd": "Adicionar Chave de Segurança",
|
"securityKeyAdd": "Adicionar Chave de Segurança",
|
||||||
"securityKeyRegisterTitle": "Registrar Nova Chave de Segurança",
|
"securityKeyRegisterTitle": "Registrar Nova Chave de Segurança",
|
||||||
@@ -1558,14 +1596,13 @@
|
|||||||
"autoLoginErrorNoRedirectUrl": "Nenhum URL de redirecionamento recebido do provedor de identidade.",
|
"autoLoginErrorNoRedirectUrl": "Nenhum URL de redirecionamento recebido do provedor de identidade.",
|
||||||
"autoLoginErrorGeneratingUrl": "Falha ao gerar URL de autenticação.",
|
"autoLoginErrorGeneratingUrl": "Falha ao gerar URL de autenticação.",
|
||||||
"remoteExitNodeManageRemoteExitNodes": "Nós remotos",
|
"remoteExitNodeManageRemoteExitNodes": "Nós remotos",
|
||||||
"remoteExitNodeDescription": "Self-host one or more remote nodes to extend your network connectivity and reduce reliance on the cloud",
|
"remoteExitNodeDescription": "Auto-hospedar um ou mais nós remotos para estender sua conectividade de rede e reduzir a dependência da nuvem",
|
||||||
"remoteExitNodes": "Nós",
|
"remoteExitNodes": "Nós",
|
||||||
"searchRemoteExitNodes": "Buscar nós...",
|
"searchRemoteExitNodes": "Buscar nós...",
|
||||||
"remoteExitNodeAdd": "Adicionar node",
|
"remoteExitNodeAdd": "Adicionar node",
|
||||||
"remoteExitNodeErrorDelete": "Erro ao excluir nó",
|
"remoteExitNodeErrorDelete": "Erro ao excluir nó",
|
||||||
"remoteExitNodeQuestionRemove": "Tem certeza que deseja remover o nó {selectedNode} da organização?",
|
"remoteExitNodeQuestionRemove": "Tem certeza de que deseja remover o nó da organização?",
|
||||||
"remoteExitNodeMessageRemove": "Uma vez removido, o nó não estará mais acessível.",
|
"remoteExitNodeMessageRemove": "Uma vez removido, o nó não estará mais acessível.",
|
||||||
"remoteExitNodeMessageConfirm": "Para confirmar, por favor, digite o nome do nó abaixo.",
|
|
||||||
"remoteExitNodeConfirmDelete": "Confirmar exclusão do nó",
|
"remoteExitNodeConfirmDelete": "Confirmar exclusão do nó",
|
||||||
"remoteExitNodeDelete": "Excluir nó",
|
"remoteExitNodeDelete": "Excluir nó",
|
||||||
"sidebarRemoteExitNodes": "Nós remotos",
|
"sidebarRemoteExitNodes": "Nós remotos",
|
||||||
@@ -1733,7 +1770,49 @@
|
|||||||
"resourceExposePortsEditFile": "Editar arquivo: docker-compose.yml",
|
"resourceExposePortsEditFile": "Editar arquivo: docker-compose.yml",
|
||||||
"emailVerificationRequired": "Verificação de e-mail é necessária. Por favor, faça login novamente via {dashboardUrl}/auth/login conclui esta etapa. Em seguida, volte aqui.",
|
"emailVerificationRequired": "Verificação de e-mail é necessária. Por favor, faça login novamente via {dashboardUrl}/auth/login conclui esta etapa. Em seguida, volte aqui.",
|
||||||
"twoFactorSetupRequired": "Configuração de autenticação de dois fatores é necessária. Por favor, entre novamente via {dashboardUrl}/auth/login conclua este passo. Em seguida, volte aqui.",
|
"twoFactorSetupRequired": "Configuração de autenticação de dois fatores é necessária. Por favor, entre novamente via {dashboardUrl}/auth/login conclua este passo. Em seguida, volte aqui.",
|
||||||
|
"additionalSecurityRequired": "Segurança adicional necessária",
|
||||||
|
"organizationRequiresAdditionalSteps": "Esta organização requer etapas de segurança adicionais antes que você possa acessar os recursos.",
|
||||||
|
"completeTheseSteps": "Conclua estas etapas",
|
||||||
|
"enableTwoFactorAuthentication": "Ativar autenticação de dois fatores",
|
||||||
|
"completeSecuritySteps": "Passos de segurança completos",
|
||||||
|
"securitySettings": "Configurações de Segurança",
|
||||||
|
"securitySettingsDescription": "Configurar políticas de segurança para a sua organização",
|
||||||
|
"requireTwoFactorForAllUsers": "Exigir autenticação dupla para todos os usuários",
|
||||||
|
"requireTwoFactorDescription": "Quando ativado, todos os usuários internos nesta organização devem ter a autenticação de dois fatores ativada para acessar a organização.",
|
||||||
|
"requireTwoFactorDisabledDescription": "Este recurso requer uma licença válida (Enterprise) ou assinatura ativa (SaaS)",
|
||||||
|
"requireTwoFactorCannotEnableDescription": "Você deve ativar a autenticação de dois fatores para sua conta antes de aplicá-la para todos os usuários",
|
||||||
|
"maxSessionLength": "Comprimento Máximo da Sessão",
|
||||||
|
"maxSessionLengthDescription": "Definir a duração máxima para as sessões dos usuários. Após esse tempo, os usuários precisarão autenticar novamente.",
|
||||||
|
"maxSessionLengthDisabledDescription": "Este recurso requer uma licença válida (Enterprise) ou assinatura ativa (SaaS)",
|
||||||
|
"selectSessionLength": "Selecionar duração da sessão",
|
||||||
|
"unenforced": "Inforçado",
|
||||||
|
"1Hour": "number@@0 horas",
|
||||||
|
"3Hours": "3 horas",
|
||||||
|
"6Hours": "6 horas",
|
||||||
|
"12Hours": "12 horas",
|
||||||
|
"1DaySession": "1 dia",
|
||||||
|
"3Days": "3 dias",
|
||||||
|
"7Days": "7 dias",
|
||||||
|
"14Days": "14 dias",
|
||||||
|
"30DaysSession": "30 dias",
|
||||||
|
"90DaysSession": "90 dias",
|
||||||
|
"180DaysSession": "180 dias",
|
||||||
|
"passwordExpiryDays": "Expiração da Senha",
|
||||||
|
"editPasswordExpiryDescription": "Defina o número de dias antes que os usuários sejam obrigados a mudar sua senha.",
|
||||||
|
"selectPasswordExpiry": "Selecione a senha expirada",
|
||||||
|
"30Days": "30 dias",
|
||||||
|
"1Day": "1 dia",
|
||||||
|
"60Days": "60 dias",
|
||||||
|
"90Days": "90 dias",
|
||||||
|
"180Days": "180 dias",
|
||||||
|
"1Year": "1 ano",
|
||||||
|
"subscriptionBadge": "Assinatura requerida",
|
||||||
|
"securityPolicyChangeWarning": "Aviso de Mudança da Política de Segurança",
|
||||||
|
"securityPolicyChangeDescription": "Você está prestes a alterar as configurações da política de segurança. Depois de salvar, talvez você precise se autenticar novamente para cumprir estas atualizações de política. Todos os usuários que não estiverem em conformidade também precisarão reautenticar.",
|
||||||
|
"securityPolicyChangeConfirmMessage": "Eu confirmo",
|
||||||
|
"securityPolicyChangeWarningText": "Isso afetará todos os usuários da organização",
|
||||||
"authPageErrorUpdateMessage": "Ocorreu um erro ao atualizar as configurações da página de autenticação",
|
"authPageErrorUpdateMessage": "Ocorreu um erro ao atualizar as configurações da página de autenticação",
|
||||||
|
"authPageErrorUpdate": "Não é possível atualizar a página de autenticação",
|
||||||
"authPageUpdated": "Página de autenticação atualizada com sucesso",
|
"authPageUpdated": "Página de autenticação atualizada com sucesso",
|
||||||
"healthCheckNotAvailable": "Localização",
|
"healthCheckNotAvailable": "Localização",
|
||||||
"rewritePath": "Reescrever Caminho",
|
"rewritePath": "Reescrever Caminho",
|
||||||
@@ -1745,153 +1824,261 @@
|
|||||||
"resourceHeaderAuthRemoveDescription": "Autenticação de cabeçalho removida com sucesso.",
|
"resourceHeaderAuthRemoveDescription": "Autenticação de cabeçalho removida com sucesso.",
|
||||||
"resourceErrorHeaderAuthRemove": "Falha ao remover autenticação de cabeçalho",
|
"resourceErrorHeaderAuthRemove": "Falha ao remover autenticação de cabeçalho",
|
||||||
"resourceErrorHeaderAuthRemoveDescription": "Não foi possível remover a autenticação do cabeçalho para o recurso.",
|
"resourceErrorHeaderAuthRemoveDescription": "Não foi possível remover a autenticação do cabeçalho para o recurso.",
|
||||||
"resourceHeaderAuthProtectionEnabled": "Header Authentication Enabled",
|
"resourceHeaderAuthProtectionEnabled": "Autenticação de Cabeçalho Habilitada",
|
||||||
"resourceHeaderAuthProtectionDisabled": "Header Authentication Disabled",
|
"resourceHeaderAuthProtectionDisabled": "Autenticação de Cabeçalho Desativada",
|
||||||
"headerAuthRemove": "Remove Header Auth",
|
"headerAuthRemove": "Remover autenticação de cabeçalho",
|
||||||
"headerAuthAdd": "Add Header Auth",
|
"headerAuthAdd": "Adicionar Autenticação do Cabeçalho",
|
||||||
"resourceErrorHeaderAuthSetup": "Falha ao definir autenticação de cabeçalho",
|
"resourceErrorHeaderAuthSetup": "Falha ao definir autenticação de cabeçalho",
|
||||||
"resourceErrorHeaderAuthSetupDescription": "Não foi possível definir a autenticação do cabeçalho para o recurso.",
|
"resourceErrorHeaderAuthSetupDescription": "Não foi possível definir a autenticação do cabeçalho para o recurso.",
|
||||||
"resourceHeaderAuthSetup": "Autenticação de Cabeçalho definida com sucesso",
|
"resourceHeaderAuthSetup": "Autenticação de Cabeçalho definida com sucesso",
|
||||||
"resourceHeaderAuthSetupDescription": "Autenticação de cabeçalho foi definida com sucesso.",
|
"resourceHeaderAuthSetupDescription": "Autenticação de cabeçalho foi definida com sucesso.",
|
||||||
"resourceHeaderAuthSetupTitle": "Definir autenticação de cabeçalho",
|
"resourceHeaderAuthSetupTitle": "Definir autenticação de cabeçalho",
|
||||||
"resourceHeaderAuthSetupTitleDescription": "Set the basic auth credentials (username and password) to protect this resource with HTTP Header Authentication. Access it using the format https://username:password@resource.example.com",
|
"resourceHeaderAuthSetupTitleDescription": "Defina as credenciais de autenticação básica (nome de usuário e senha) para proteger este recurso com a Autenticação de Cabeçalho HTTP. Acessá-lo usando o formato https://username:password@resource.example.com",
|
||||||
"resourceHeaderAuthSubmit": "Definir autenticação de cabeçalho",
|
"resourceHeaderAuthSubmit": "Definir autenticação de cabeçalho",
|
||||||
"actionSetResourceHeaderAuth": "Definir autenticação de cabeçalho",
|
"actionSetResourceHeaderAuth": "Definir autenticação de cabeçalho",
|
||||||
"enterpriseEdition": "Enterprise Edition",
|
"enterpriseEdition": "Edição Enterprise",
|
||||||
"unlicensed": "Unlicensed",
|
"unlicensed": "Sem licença",
|
||||||
"beta": "Beta",
|
"beta": "Beta",
|
||||||
"manageClients": "Manage Clients",
|
"manageClients": "Gerenciar Clientes",
|
||||||
"manageClientsDescription": "Clients are devices that can connect to your sites",
|
"manageClientsDescription": "Clientes são dispositivos que podem se conectar aos seus sites",
|
||||||
"licenseTableValidUntil": "Valid Until",
|
"licenseTableValidUntil": "Válido até",
|
||||||
"saasLicenseKeysSettingsTitle": "Enterprise Licenses",
|
"saasLicenseKeysSettingsTitle": "Licenças empresariais",
|
||||||
"saasLicenseKeysSettingsDescription": "Generate and manage Enterprise license keys for self-hosted Pangolin instances",
|
"saasLicenseKeysSettingsDescription": "Gerar e gerenciar chaves de licença Enterprise para instâncias Pangolin auto-hospedadas",
|
||||||
"sidebarEnterpriseLicenses": "Licenses",
|
"sidebarEnterpriseLicenses": "Licenças",
|
||||||
"generateLicenseKey": "Generate License Key",
|
"generateLicenseKey": "Gerar Chave de Licença",
|
||||||
"generateLicenseKeyForm": {
|
"generateLicenseKeyForm": {
|
||||||
"validation": {
|
"validation": {
|
||||||
"emailRequired": "Please enter a valid email address",
|
"emailRequired": "Por favor, insira um endereço de e-mail válido",
|
||||||
"useCaseTypeRequired": "Please select a use case type",
|
"useCaseTypeRequired": "Por favor, selecione um tipo de caso de uso",
|
||||||
"firstNameRequired": "First name is required",
|
"firstNameRequired": "O primeiro nome é obrigatório",
|
||||||
"lastNameRequired": "Last name is required",
|
"lastNameRequired": "Último nome é obrigatório",
|
||||||
"primaryUseRequired": "Please describe your primary use",
|
"primaryUseRequired": "Descreva seu uso primário",
|
||||||
"jobTitleRequiredBusiness": "Job title is required for business use",
|
"jobTitleRequiredBusiness": "O título do trabalho é necessário para o uso de negócios",
|
||||||
"industryRequiredBusiness": "Industry is required for business use",
|
"industryRequiredBusiness": "Indústria é necessária para uso de negócios",
|
||||||
"stateProvinceRegionRequired": "State/Province/Region is required",
|
"stateProvinceRegionRequired": "Estado/Província/Região é necessário",
|
||||||
"postalZipCodeRequired": "Postal/ZIP Code is required",
|
"postalZipCodeRequired": "Código postal/CEP é obrigatório",
|
||||||
"companyNameRequiredBusiness": "Company name is required for business use",
|
"companyNameRequiredBusiness": "O nome da empresa é necessário para uso empresarial",
|
||||||
"countryOfResidenceRequiredBusiness": "Country of residence is required for business use",
|
"countryOfResidenceRequiredBusiness": "O país de residência é necessário para a utilização da empresa",
|
||||||
"countryRequiredPersonal": "Country is required for personal use",
|
"countryRequiredPersonal": "País é necessário para uso pessoal",
|
||||||
"agreeToTermsRequired": "You must agree to the terms",
|
"agreeToTermsRequired": "Você deve concordar com os termos",
|
||||||
"complianceConfirmationRequired": "You must confirm compliance with the Fossorial Commercial License"
|
"complianceConfirmationRequired": "Você deve confirmar o cumprimento da Licença Fossorial Comercial"
|
||||||
},
|
},
|
||||||
"useCaseOptions": {
|
"useCaseOptions": {
|
||||||
"personal": {
|
"personal": {
|
||||||
"title": "Personal Use",
|
"title": "Uso pessoal",
|
||||||
"description": "For individual, non-commercial use such as learning, personal projects, or experimentation."
|
"description": "Para uso individual, não comercial, como aprendizagem, projetos pessoais ou experimentação."
|
||||||
},
|
},
|
||||||
"business": {
|
"business": {
|
||||||
"title": "Business Use",
|
"title": "Uso de Negócios",
|
||||||
"description": "For use within organizations, companies, or commercial or revenue-generating activities."
|
"description": "Para uso em organizações, empresas ou atividades comerciais ou geradoras de receitas."
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"steps": {
|
"steps": {
|
||||||
"emailLicenseType": {
|
"emailLicenseType": {
|
||||||
"title": "Email & License Type",
|
"title": "Tipo de Email e Licença",
|
||||||
"description": "Enter your email and choose your license type"
|
"description": "Digite seu e-mail e escolha seu tipo de licença"
|
||||||
},
|
},
|
||||||
"personalInformation": {
|
"personalInformation": {
|
||||||
"title": "Personal Information",
|
"title": "Informações Pessoais",
|
||||||
"description": "Tell us about yourself"
|
"description": "Conte-nos sobre você"
|
||||||
},
|
},
|
||||||
"contactInformation": {
|
"contactInformation": {
|
||||||
"title": "Contact Information",
|
"title": "Informação do Contato",
|
||||||
"description": "Your contact details"
|
"description": "Suas informações de contato"
|
||||||
},
|
},
|
||||||
"termsGenerate": {
|
"termsGenerate": {
|
||||||
"title": "Terms & Generate",
|
"title": "Termos & Gerar",
|
||||||
"description": "Review and accept terms to generate your license"
|
"description": "Revise e aceite os termos para gerar a sua licença"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"alerts": {
|
"alerts": {
|
||||||
"commercialUseDisclosure": {
|
"commercialUseDisclosure": {
|
||||||
"title": "Usage Disclosure",
|
"title": "Divulgação de uso",
|
||||||
"description": "Select the license tier that accurately reflects your intended use. The Personal License permits free use of the Software for individual, non-commercial or small-scale commercial activities with annual gross revenue under $100,000 USD. Any use beyond these limits — including use within a business, organization, or other revenue-generating environment — requires a valid Enterprise License and payment of the applicable licensing fee. All users, whether Personal or Enterprise, must comply with the Fossorial Commercial License Terms."
|
"description": "Selecione o nível de licença que reflete corretamente seu uso pretendido. A Licença Pessoal permite o uso livre do Software para atividades comerciais individuais, não comerciais ou em pequena escala com rendimento bruto anual inferior a 100.000 USD. Qualquer uso além destes limites — incluindo uso dentro de um negócio, organização, ou outro ambiente gerador de receitas — requer uma Licença Enterprise válida e o pagamento da taxa aplicável de licenciamento. Todos os usuários, pessoais ou empresariais, devem cumprir os Termos da Licença Comercial Fossorial."
|
||||||
},
|
},
|
||||||
"trialPeriodInformation": {
|
"trialPeriodInformation": {
|
||||||
"title": "Trial Period Information",
|
"title": "Informações do Período de Avaliação",
|
||||||
"description": "This License Key enables Enterprise features for a 7-day evaluation period. Continued access to Paid Features beyond the evaluation period requires activation under a valid Personal or Enterprise License. For Enterprise licensing, contact sales@fossorial.io."
|
"description": "Esta Chave de Licença permite recursos da Empresa para um período de avaliação de 7 dias. O acesso contínuo a Recursos Pagos além do período de avaliação requer ativação sob uma Licença Pessoal ou Empresarial válida. Para licenciamento Empresarial, entre em contato com sales@pangolin.net."
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"form": {
|
"form": {
|
||||||
"useCaseQuestion": "Are you using Pangolin for personal or business use?",
|
"useCaseQuestion": "Você está usando o Pangolin para uso pessoal ou empresarial?",
|
||||||
"firstName": "First Name",
|
"firstName": "Primeiro nome",
|
||||||
"lastName": "Last Name",
|
"lastName": "Último Nome",
|
||||||
"jobTitle": "Job Title",
|
"jobTitle": "Título do Cargo",
|
||||||
"primaryUseQuestion": "What do you primarily plan to use Pangolin for?",
|
"primaryUseQuestion": "Para que você pretende usar o Pangolin em primeiro lugar?",
|
||||||
"industryQuestion": "What is your industry?",
|
"industryQuestion": "O que é a sua indústria?",
|
||||||
"prospectiveUsersQuestion": "How many prospective users do you expect to have?",
|
"prospectiveUsersQuestion": "Quantos usuários potenciais você espera?",
|
||||||
"prospectiveSitesQuestion": "How many prospective sites (tunnels) do you expect to have?",
|
"prospectiveSitesQuestion": "Quantos sites (túneis) você espera ter?",
|
||||||
"companyName": "Company name",
|
"companyName": "Nome Empresa",
|
||||||
"countryOfResidence": "Country of residence",
|
"countryOfResidence": "País de residência",
|
||||||
"stateProvinceRegion": "State / Province / Region",
|
"stateProvinceRegion": "Estado / Província / Região",
|
||||||
"postalZipCode": "Postal / ZIP Code",
|
"postalZipCode": "Código Postal / Postal",
|
||||||
"companyWebsite": "Company website",
|
"companyWebsite": "Site da empresa",
|
||||||
"companyPhoneNumber": "Company phone number",
|
"companyPhoneNumber": "Número de telefone empresa",
|
||||||
"country": "Country",
|
"country": "País",
|
||||||
"phoneNumberOptional": "Phone number (optional)",
|
"phoneNumberOptional": "Número de telefone (opcional)",
|
||||||
"complianceConfirmation": "I confirm that I am in compliance with the Fossorial Commercial License and that reporting inaccurate information or misidentifying use of the product is a violation of the license."
|
"complianceConfirmation": "Confirmo que a informação que forneci é correcta e que estou em conformidade com a Licença Comercial Fossorial. Reportar informações imprecisas ou identificar mal o uso do produto é uma violação da licença e pode resultar em sua chave ser revogada."
|
||||||
},
|
},
|
||||||
"buttons": {
|
"buttons": {
|
||||||
"close": "Close",
|
"close": "Fechar",
|
||||||
"previous": "Previous",
|
"previous": "Anterior",
|
||||||
"next": "Next",
|
"next": "Próximo",
|
||||||
"generateLicenseKey": "Generate License Key"
|
"generateLicenseKey": "Gerar Chave de Licença"
|
||||||
},
|
},
|
||||||
"toasts": {
|
"toasts": {
|
||||||
"success": {
|
"success": {
|
||||||
"title": "License key generated successfully",
|
"title": "Chave de licença gerada com sucesso",
|
||||||
"description": "Your license key has been generated and is ready to use."
|
"description": "Sua chave de licença foi gerada e está pronta para ser usada."
|
||||||
},
|
},
|
||||||
"error": {
|
"error": {
|
||||||
"title": "Failed to generate license key",
|
"title": "Falha ao gerar chave de licença",
|
||||||
"description": "An error occurred while generating the license key."
|
"description": "Ocorreu um erro ao gerar a chave da licença."
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"priority": "Prioridade",
|
"priority": "Prioridade",
|
||||||
"priorityDescription": "Rotas de alta prioridade são avaliadas primeiro. Prioridade = 100 significa ordem automática (decisões do sistema). Use outro número para aplicar prioridade manual.",
|
"priorityDescription": "Rotas de alta prioridade são avaliadas primeiro. Prioridade = 100 significa ordem automática (decisões do sistema). Use outro número para aplicar prioridade manual.",
|
||||||
"instanceName": "Instance Name",
|
"instanceName": "Nome da Instância",
|
||||||
"pathMatchModalTitle": "Configure Path Matching",
|
"pathMatchModalTitle": "Configurar Correspondência de Caminho",
|
||||||
"pathMatchModalDescription": "Set up how incoming requests should be matched based on their path.",
|
"pathMatchModalDescription": "Configure como as solicitações de entrada devem ser correspondidas com base no caminho.",
|
||||||
"pathMatchType": "Match Type",
|
"pathMatchType": "Tipo de Correspondência",
|
||||||
"pathMatchPrefix": "Prefix",
|
"pathMatchPrefix": "Prefixo",
|
||||||
"pathMatchExact": "Exact",
|
"pathMatchExact": "Exato",
|
||||||
"pathMatchRegex": "Regex",
|
"pathMatchRegex": "Regex",
|
||||||
"pathMatchValue": "Path Value",
|
"pathMatchValue": "Valor do caminho",
|
||||||
"clear": "Clear",
|
"clear": "Limpar",
|
||||||
"saveChanges": "Save Changes",
|
"saveChanges": "Salvar as alterações",
|
||||||
"pathMatchRegexPlaceholder": "^/api/.*",
|
"pathMatchRegexPlaceholder": "^/api/.*",
|
||||||
"pathMatchDefaultPlaceholder": "/path",
|
"pathMatchDefaultPlaceholder": "/caminho",
|
||||||
"pathMatchPrefixHelp": "Example: /api matches /api, /api/users, etc.",
|
"pathMatchPrefixHelp": "Exemplo: /api matches /api, /api/users, etc.",
|
||||||
"pathMatchExactHelp": "Example: /api matches only /api",
|
"pathMatchExactHelp": "Exemplo: /api match only /api",
|
||||||
"pathMatchRegexHelp": "Example: ^/api/.* matches /api/anything",
|
"pathMatchRegexHelp": "Exemplo: ^/api/.* Corresponde /api/anything",
|
||||||
"pathRewriteModalTitle": "Configure Path Rewriting",
|
"pathRewriteModalTitle": "Configurar Caminho de Reescrita",
|
||||||
"pathRewriteModalDescription": "Transform the matched path before forwarding to the target.",
|
"pathRewriteModalDescription": "Transforme o caminho correspondente antes de encaminhar para o alvo.",
|
||||||
"pathRewriteType": "Rewrite Type",
|
"pathRewriteType": "Reescrever o tipo",
|
||||||
"pathRewritePrefixOption": "Prefix - Replace prefix",
|
"pathRewritePrefixOption": "Prefixo - substituir prefixo",
|
||||||
"pathRewriteExactOption": "Exact - Replace entire path",
|
"pathRewriteExactOption": "Exato - Substituir o caminho inteiro",
|
||||||
"pathRewriteRegexOption": "Regex - Pattern replacement",
|
"pathRewriteRegexOption": "Regex - Substituição de padrão",
|
||||||
"pathRewriteStripPrefixOption": "Strip Prefix - Remove prefix",
|
"pathRewriteStripPrefixOption": "Prefixo do Strip - Remover prefixo",
|
||||||
"pathRewriteValue": "Rewrite Value",
|
"pathRewriteValue": "Reescrever Valor",
|
||||||
"pathRewriteRegexPlaceholder": "/new/$1",
|
"pathRewriteRegexPlaceholder": "/new/$1",
|
||||||
"pathRewriteDefaultPlaceholder": "/new-path",
|
"pathRewriteDefaultPlaceholder": "/novo-caminho",
|
||||||
"pathRewritePrefixHelp": "Replace the matched prefix with this value",
|
"pathRewritePrefixHelp": "Substituir o prefixo correspondente por este valor",
|
||||||
"pathRewriteExactHelp": "Replace the entire path with this value when the path matches exactly",
|
"pathRewriteExactHelp": "Substitua o caminho inteiro por este valor quando o caminho corresponder exatamente",
|
||||||
"pathRewriteRegexHelp": "Use capture groups like $1, $2 for replacement",
|
"pathRewriteRegexHelp": "Usar grupos de captura como $1, $2 para substituição",
|
||||||
"pathRewriteStripPrefixHelp": "Leave empty to strip prefix or provide new prefix",
|
"pathRewriteStripPrefixHelp": "Deixe em branco para remover prefixo ou fornecer novo prefixo",
|
||||||
"pathRewritePrefix": "Prefix",
|
"pathRewritePrefix": "Prefixo",
|
||||||
"pathRewriteExact": "Exact",
|
"pathRewriteExact": "Exato",
|
||||||
"pathRewriteRegex": "Regex",
|
"pathRewriteRegex": "Regex",
|
||||||
"pathRewriteStrip": "Strip",
|
"pathRewriteStrip": "Tirar",
|
||||||
"pathRewriteStripLabel": "strip"
|
"pathRewriteStripLabel": "faixa",
|
||||||
|
"sidebarEnableEnterpriseLicense": "Habilitar Licença Empresarial",
|
||||||
|
"cannotbeUndone": "Isso não pode ser desfeito.",
|
||||||
|
"toConfirm": "para confirmar",
|
||||||
|
"deleteClientQuestion": "Você tem certeza que deseja remover o cliente do site e da organização?",
|
||||||
|
"clientMessageRemove": "Depois de removido, o cliente não poderá mais se conectar ao site.",
|
||||||
|
"sidebarLogs": "Registros",
|
||||||
|
"request": "Pedir",
|
||||||
|
"logs": "Registros",
|
||||||
|
"logsSettingsDescription": "Monitorar logs coletados desta orginização",
|
||||||
|
"searchLogs": "Pesquisar registros...",
|
||||||
|
"action": "Acão",
|
||||||
|
"actor": "Ator",
|
||||||
|
"timestamp": "Timestamp",
|
||||||
|
"accessLogs": "Logs de Acesso",
|
||||||
|
"exportCsv": "Exportar como CSV",
|
||||||
|
"actorId": "ID do ator",
|
||||||
|
"allowedByRule": "Permitido por regra",
|
||||||
|
"allowedNoAuth": "Não Permitido Nenhuma Autenticação",
|
||||||
|
"validAccessToken": "Token de acesso válido",
|
||||||
|
"validHeaderAuth": "Valid header auth",
|
||||||
|
"validPincode": "Valid Pincode",
|
||||||
|
"validPassword": "Senha válida",
|
||||||
|
"validEmail": "Valid email",
|
||||||
|
"validSSO": "Valid SSO",
|
||||||
|
"resourceBlocked": "Recurso bloqueado",
|
||||||
|
"droppedByRule": "Derrubado pela regra",
|
||||||
|
"noSessions": "Sem Sessões",
|
||||||
|
"temporaryRequestToken": "Token de solicitação temporária",
|
||||||
|
"noMoreAuthMethods": "No Valid Auth",
|
||||||
|
"ip": "PI",
|
||||||
|
"reason": "Motivo",
|
||||||
|
"requestLogs": "Registro de pedidos",
|
||||||
|
"host": "Servidor",
|
||||||
|
"location": "Local:",
|
||||||
|
"actionLogs": "Logs de Ações",
|
||||||
|
"sidebarLogsRequest": "Registro de pedidos",
|
||||||
|
"sidebarLogsAccess": "Logs de Acesso",
|
||||||
|
"sidebarLogsAction": "Logs de Ações",
|
||||||
|
"logRetention": "Retenção de Log",
|
||||||
|
"logRetentionDescription": "Gerenciar quanto tempo os diferentes tipos de logs são mantidos para esta organização ou desativá-los",
|
||||||
|
"requestLogsDescription": "Ver registros de pedidos detalhados de recursos nesta organização",
|
||||||
|
"logRetentionRequestLabel": "Solicitar retenção de registro",
|
||||||
|
"logRetentionRequestDescription": "Por quanto tempo manter os registros de pedidos",
|
||||||
|
"logRetentionAccessLabel": "Retenção de Log de Acesso",
|
||||||
|
"logRetentionAccessDescription": "Por quanto tempo manter os registros de acesso",
|
||||||
|
"logRetentionActionLabel": "Ação de Retenção no Log",
|
||||||
|
"logRetentionActionDescription": "Por quanto tempo manter os registros de ação",
|
||||||
|
"logRetentionDisabled": "Desabilitado",
|
||||||
|
"logRetention3Days": "3 dias",
|
||||||
|
"logRetention7Days": "7 dias",
|
||||||
|
"logRetention14Days": "14 dias",
|
||||||
|
"logRetention30Days": "30 dias",
|
||||||
|
"logRetention90Days": "90 dias",
|
||||||
|
"logRetentionForever": "Permanentemente",
|
||||||
|
"actionLogsDescription": "Visualizar histórico de ações realizadas nesta organização",
|
||||||
|
"accessLogsDescription": "Ver solicitações de autenticação de recursos nesta organização",
|
||||||
|
"licenseRequiredToUse": "É necessária uma licença empresarial para usar esse recurso.",
|
||||||
|
"certResolver": "Resolvedor de Certificado",
|
||||||
|
"certResolverDescription": "Selecione o resolvedor de certificados para este recurso.",
|
||||||
|
"selectCertResolver": "Selecionar solucionador de certificado",
|
||||||
|
"enterCustomResolver": "Inserir Resolvedor Personalizado",
|
||||||
|
"preferWildcardCert": "Prefere Certificado Wildcard",
|
||||||
|
"unverified": "Não verificado",
|
||||||
|
"domainSetting": "Configurações do domínio",
|
||||||
|
"domainSettingDescription": "Configure as configurações para o seu domínio",
|
||||||
|
"preferWildcardCertDescription": "Tentativa de gerar um certificado coringa (requer um resolvedor de certificado devidamente configurado).",
|
||||||
|
"recordName": "Nome da gravação",
|
||||||
|
"auto": "Automático",
|
||||||
|
"TTL": "TTL",
|
||||||
|
"howToAddRecords": "Como adicionar registros",
|
||||||
|
"dnsRecord": "Registros DNS",
|
||||||
|
"required": "Obrigatório",
|
||||||
|
"domainSettingsUpdated": "Configurações de domínio atualizadas com sucesso",
|
||||||
|
"orgOrDomainIdMissing": "ID da organização ou domínio está faltando",
|
||||||
|
"loadingDNSRecords": "Carregando registros DNS...",
|
||||||
|
"olmUpdateAvailableInfo": "Uma versão atualizada do Olm está disponível. Atualize para a versão mais recente para ter a melhor experiência.",
|
||||||
|
"client": "Cliente",
|
||||||
|
"proxyProtocol": "Configurações de Protocolo Proxy",
|
||||||
|
"proxyProtocolDescription": "Configurar o protocolo Proxy para preservar endereços IP do cliente para serviços TCP/UDP.",
|
||||||
|
"enableProxyProtocol": "Habilitar protocolo proxy",
|
||||||
|
"proxyProtocolInfo": "Preservar endereços IP do cliente para backends TCP/UDP",
|
||||||
|
"proxyProtocolVersion": "Versão do Protocolo Proxy",
|
||||||
|
"version1": " Versão 1 (recomendado)",
|
||||||
|
"version2": "Versão 2",
|
||||||
|
"versionDescription": "A versão 1 é baseada em texto e amplamente suportada. A versão 2 é binária e mais eficiente, mas menos compatível.",
|
||||||
|
"warning": "ATENÇÃO",
|
||||||
|
"proxyProtocolWarning": "Seu aplicativo de backend deve ser configurado para aceitar conexões de protocolo de proxy. Se o seu backend não suportar o protocolo de protocolo, habilitando isso quebrará todas as conexões. Certifique-se de configurar seu backend para confiar nos cabeçalhos do protocolo proxy no Traefik.",
|
||||||
|
"restarting": "Reiniciando...",
|
||||||
|
"manual": "Manualmente",
|
||||||
|
"messageSupport": "Suporte a Mensagens",
|
||||||
|
"supportNotAvailableTitle": "Suporte Não Disponível",
|
||||||
|
"supportNotAvailableDescription": "Não está disponível no momento. Você pode enviar um e-mail para support@pangolin.net.",
|
||||||
|
"supportRequestSentTitle": "Pedido de suporte enviado",
|
||||||
|
"supportRequestSentDescription": "Sua mensagem foi enviada com sucesso.",
|
||||||
|
"supportRequestFailedTitle": "Falha ao enviar solicitação",
|
||||||
|
"supportRequestFailedDescription": "Ocorreu um erro ao enviar sua solicitação de suporte.",
|
||||||
|
"supportSubjectRequired": "Assunto é necessária",
|
||||||
|
"supportSubjectMaxLength": "O assunto deve ter 255 caracteres ou menos",
|
||||||
|
"supportMessageRequired": "A mensagem é obrigatória",
|
||||||
|
"supportReplyTo": "Responder a",
|
||||||
|
"supportSubject": "Cargo",
|
||||||
|
"supportSubjectPlaceholder": "Digite o assunto",
|
||||||
|
"supportMessage": "mensagem",
|
||||||
|
"supportMessagePlaceholder": "Digite sua mensagem",
|
||||||
|
"supportSending": "Enviando...",
|
||||||
|
"supportSend": "Mandar",
|
||||||
|
"supportMessageSent": "Mensagem enviada!",
|
||||||
|
"supportWillContact": "Entraremos em contato em breve!"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -47,9 +47,8 @@
|
|||||||
"edit": "Редактировать",
|
"edit": "Редактировать",
|
||||||
"siteConfirmDelete": "Подтвердить удаление сайта",
|
"siteConfirmDelete": "Подтвердить удаление сайта",
|
||||||
"siteDelete": "Удалить сайт",
|
"siteDelete": "Удалить сайт",
|
||||||
"siteMessageRemove": "После удаления сайт больше не будет доступен. Все ресурсы и целевые узлы, связанные с сайтом, также будут удалены.",
|
"siteMessageRemove": "После удаления сайт больше не будет доступен. Все цели, связанные с сайтом, также будут удалены.",
|
||||||
"siteMessageConfirm": "Для подтверждения введите название сайта ниже.",
|
"siteQuestionRemove": "Вы уверены, что хотите удалить сайт из организации?",
|
||||||
"siteQuestionRemove": "Вы уверены, что хотите удалить сайт {selectedSite} из организации?",
|
|
||||||
"siteManageSites": "Управление сайтами",
|
"siteManageSites": "Управление сайтами",
|
||||||
"siteDescription": "Обеспечьте подключение к вашей сети через защищённые туннели",
|
"siteDescription": "Обеспечьте подключение к вашей сети через защищённые туннели",
|
||||||
"siteCreate": "Создать сайт",
|
"siteCreate": "Создать сайт",
|
||||||
@@ -96,7 +95,7 @@
|
|||||||
"siteWgDescription": "Используйте любой клиент WireGuard для открытия туннеля. Требуется ручная настройка NAT.",
|
"siteWgDescription": "Используйте любой клиент WireGuard для открытия туннеля. Требуется ручная настройка NAT.",
|
||||||
"siteWgDescriptionSaas": "Используйте любой клиент WireGuard для создания туннеля. Требуется ручная настройка NAT. РАБОТАЕТ ТОЛЬКО НА САМОСТОЯТЕЛЬНО РАЗМЕЩЕННЫХ УЗЛАХ",
|
"siteWgDescriptionSaas": "Используйте любой клиент WireGuard для создания туннеля. Требуется ручная настройка NAT. РАБОТАЕТ ТОЛЬКО НА САМОСТОЯТЕЛЬНО РАЗМЕЩЕННЫХ УЗЛАХ",
|
||||||
"siteLocalDescription": "Только локальные ресурсы. Без туннелирования.",
|
"siteLocalDescription": "Только локальные ресурсы. Без туннелирования.",
|
||||||
"siteLocalDescriptionSaas": "Local resources only. No tunneling. Only available on remote nodes.",
|
"siteLocalDescriptionSaas": "Только локальные ресурсы. Нет туннелей. Только для удаленных узлов.",
|
||||||
"siteSeeAll": "Просмотреть все сайты",
|
"siteSeeAll": "Просмотреть все сайты",
|
||||||
"siteTunnelDescription": "Выберите способ подключения к вашему сайту",
|
"siteTunnelDescription": "Выберите способ подключения к вашему сайту",
|
||||||
"siteNewtCredentials": "Учётные данные Newt",
|
"siteNewtCredentials": "Учётные данные Newt",
|
||||||
@@ -154,8 +153,7 @@
|
|||||||
"protected": "Защищён",
|
"protected": "Защищён",
|
||||||
"notProtected": "Не защищён",
|
"notProtected": "Не защищён",
|
||||||
"resourceMessageRemove": "После удаления ресурс больше не будет доступен. Все целевые узлы, связанные с ресурсом, также будут удалены.",
|
"resourceMessageRemove": "После удаления ресурс больше не будет доступен. Все целевые узлы, связанные с ресурсом, также будут удалены.",
|
||||||
"resourceMessageConfirm": "Для подтверждения введите название ресурса ниже.",
|
"resourceQuestionRemove": "Вы уверены, что хотите удалить ресурс из организации?",
|
||||||
"resourceQuestionRemove": "Вы действительно хотите удалить ресурс {selectedResource} из организации?",
|
|
||||||
"resourceHTTP": "HTTPS-ресурс",
|
"resourceHTTP": "HTTPS-ресурс",
|
||||||
"resourceHTTPDescription": "Проксирование запросов к вашему приложению через HTTPS с использованием поддомена или базового домена.",
|
"resourceHTTPDescription": "Проксирование запросов к вашему приложению через HTTPS с использованием поддомена или базового домена.",
|
||||||
"resourceRaw": "Сырой TCP/UDP-ресурс",
|
"resourceRaw": "Сырой TCP/UDP-ресурс",
|
||||||
@@ -220,7 +218,7 @@
|
|||||||
"orgDeleteConfirm": "Подтвердить удаление",
|
"orgDeleteConfirm": "Подтвердить удаление",
|
||||||
"orgMessageRemove": "Это действие необратимо и удалит все связанные данные.",
|
"orgMessageRemove": "Это действие необратимо и удалит все связанные данные.",
|
||||||
"orgMessageConfirm": "Для подтверждения введите название организации ниже.",
|
"orgMessageConfirm": "Для подтверждения введите название организации ниже.",
|
||||||
"orgQuestionRemove": "Вы действительно хотите удалить организацию {selectedOrg}?",
|
"orgQuestionRemove": "Вы уверены, что хотите удалить организацию?",
|
||||||
"orgUpdated": "Организация обновлена",
|
"orgUpdated": "Организация обновлена",
|
||||||
"orgUpdatedDescription": "Организация была успешно обновлена.",
|
"orgUpdatedDescription": "Организация была успешно обновлена.",
|
||||||
"orgErrorUpdate": "Не удалось обновить организацию",
|
"orgErrorUpdate": "Не удалось обновить организацию",
|
||||||
@@ -287,9 +285,8 @@
|
|||||||
"apiKeysAdd": "Сгенерировать ключ API",
|
"apiKeysAdd": "Сгенерировать ключ API",
|
||||||
"apiKeysErrorDelete": "Ошибка при удалении ключа API",
|
"apiKeysErrorDelete": "Ошибка при удалении ключа API",
|
||||||
"apiKeysErrorDeleteMessage": "Не удалось удалить ключ API",
|
"apiKeysErrorDeleteMessage": "Не удалось удалить ключ API",
|
||||||
"apiKeysQuestionRemove": "Вы действительно хотите удалить ключ API {selectedApiKey} из организации?",
|
"apiKeysQuestionRemove": "Вы уверены, что хотите удалить API ключ из организации?",
|
||||||
"apiKeysMessageRemove": "После удаления ключ API больше сможет быть использован.",
|
"apiKeysMessageRemove": "После удаления ключ API больше сможет быть использован.",
|
||||||
"apiKeysMessageConfirm": "Для подтверждения введите название ключа API ниже.",
|
|
||||||
"apiKeysDeleteConfirm": "Подтвердить удаление",
|
"apiKeysDeleteConfirm": "Подтвердить удаление",
|
||||||
"apiKeysDelete": "Удаление ключа API",
|
"apiKeysDelete": "Удаление ключа API",
|
||||||
"apiKeysManage": "Управление ключами API",
|
"apiKeysManage": "Управление ключами API",
|
||||||
@@ -305,8 +302,7 @@
|
|||||||
"userDeleteConfirm": "Подтвердить удаление",
|
"userDeleteConfirm": "Подтвердить удаление",
|
||||||
"userDeleteServer": "Удаление пользователя с сервера",
|
"userDeleteServer": "Удаление пользователя с сервера",
|
||||||
"userMessageRemove": "Пользователь будет удалён из всех организаций и полностью удалён с сервера.",
|
"userMessageRemove": "Пользователь будет удалён из всех организаций и полностью удалён с сервера.",
|
||||||
"userMessageConfirm": "Для подтверждения введите имя пользователя ниже.",
|
"userQuestionRemove": "Вы уверены, что хотите навсегда удалить пользователя с сервера?",
|
||||||
"userQuestionRemove": "Вы действительно хотите навсегда удалить {selectedUser} с сервера?",
|
|
||||||
"licenseKey": "Лицензионный ключ",
|
"licenseKey": "Лицензионный ключ",
|
||||||
"valid": "Действителен",
|
"valid": "Действителен",
|
||||||
"numberOfSites": "Количество сайтов",
|
"numberOfSites": "Количество сайтов",
|
||||||
@@ -339,7 +335,7 @@
|
|||||||
"fossorialLicense": "Просмотреть коммерческую лицензию Fossorial и условия подписки",
|
"fossorialLicense": "Просмотреть коммерческую лицензию Fossorial и условия подписки",
|
||||||
"licenseMessageRemove": "Это удалит лицензионный ключ и все связанные с ним разрешения.",
|
"licenseMessageRemove": "Это удалит лицензионный ключ и все связанные с ним разрешения.",
|
||||||
"licenseMessageConfirm": "Для подтверждения введите лицензионный ключ ниже.",
|
"licenseMessageConfirm": "Для подтверждения введите лицензионный ключ ниже.",
|
||||||
"licenseQuestionRemove": "Вы уверены, что хотите удалить лицензионный ключ {selectedKey}?",
|
"licenseQuestionRemove": "Вы уверены, что хотите удалить лицензионный ключ?",
|
||||||
"licenseKeyDelete": "Удалить лицензионный ключ",
|
"licenseKeyDelete": "Удалить лицензионный ключ",
|
||||||
"licenseKeyDeleteConfirm": "Подтвердить удаление лицензионного ключа",
|
"licenseKeyDeleteConfirm": "Подтвердить удаление лицензионного ключа",
|
||||||
"licenseTitle": "Управление статусом лицензии",
|
"licenseTitle": "Управление статусом лицензии",
|
||||||
@@ -372,7 +368,7 @@
|
|||||||
"inviteRemoveErrorDescription": "Произошла ошибка при удалении приглашения.",
|
"inviteRemoveErrorDescription": "Произошла ошибка при удалении приглашения.",
|
||||||
"inviteRemoved": "Приглашение удалено",
|
"inviteRemoved": "Приглашение удалено",
|
||||||
"inviteRemovedDescription": "Приглашение для {email} было удалено.",
|
"inviteRemovedDescription": "Приглашение для {email} было удалено.",
|
||||||
"inviteQuestionRemove": "Вы уверены, что хотите удалить приглашение {email}?",
|
"inviteQuestionRemove": "Вы уверены, что хотите удалить приглашение?",
|
||||||
"inviteMessageRemove": "После удаления это приглашение больше не будет действительным. Вы всегда можете пригласить пользователя заново.",
|
"inviteMessageRemove": "После удаления это приглашение больше не будет действительным. Вы всегда можете пригласить пользователя заново.",
|
||||||
"inviteMessageConfirm": "Для подтверждения введите email адрес приглашения ниже.",
|
"inviteMessageConfirm": "Для подтверждения введите email адрес приглашения ниже.",
|
||||||
"inviteQuestionRegenerate": "Вы уверены, что хотите пересоздать приглашение для {email}? Это отзовёт предыдущее приглашение.",
|
"inviteQuestionRegenerate": "Вы уверены, что хотите пересоздать приглашение для {email}? Это отзовёт предыдущее приглашение.",
|
||||||
@@ -398,9 +394,8 @@
|
|||||||
"userErrorOrgRemoveDescription": "Произошла ошибка при удалении пользователя.",
|
"userErrorOrgRemoveDescription": "Произошла ошибка при удалении пользователя.",
|
||||||
"userOrgRemoved": "Пользователь удалён",
|
"userOrgRemoved": "Пользователь удалён",
|
||||||
"userOrgRemovedDescription": "Пользователь {email} был удалён из организации.",
|
"userOrgRemovedDescription": "Пользователь {email} был удалён из организации.",
|
||||||
"userQuestionOrgRemove": "Вы уверены, что хотите удалить {email} из организации?",
|
"userQuestionOrgRemove": "Вы уверены, что хотите удалить этого пользователя из организации?",
|
||||||
"userMessageOrgRemove": "После удаления этот пользователь больше не будет иметь доступ к организации. Вы всегда можете пригласить его заново, но ему нужно будет снова принять приглашение.",
|
"userMessageOrgRemove": "После удаления этот пользователь больше не будет иметь доступ к организации. Вы всегда можете пригласить его заново, но ему нужно будет снова принять приглашение.",
|
||||||
"userMessageOrgConfirm": "Для подтверждения введите имя пользователя ниже.",
|
|
||||||
"userRemoveOrgConfirm": "Подтвердить удаление пользователя",
|
"userRemoveOrgConfirm": "Подтвердить удаление пользователя",
|
||||||
"userRemoveOrg": "Удалить пользователя из организации",
|
"userRemoveOrg": "Удалить пользователя из организации",
|
||||||
"users": "Пользователи",
|
"users": "Пользователи",
|
||||||
@@ -730,7 +725,7 @@
|
|||||||
"pangolinServerAdmin": "Администратор сервера - Pangolin",
|
"pangolinServerAdmin": "Администратор сервера - Pangolin",
|
||||||
"licenseTierProfessional": "Профессиональная лицензия",
|
"licenseTierProfessional": "Профессиональная лицензия",
|
||||||
"licenseTierEnterprise": "Корпоративная лицензия",
|
"licenseTierEnterprise": "Корпоративная лицензия",
|
||||||
"licenseTierPersonal": "Personal License",
|
"licenseTierPersonal": "Личная лицензия",
|
||||||
"licensed": "Лицензировано",
|
"licensed": "Лицензировано",
|
||||||
"yes": "Да",
|
"yes": "Да",
|
||||||
"no": "Нет",
|
"no": "Нет",
|
||||||
@@ -742,7 +737,7 @@
|
|||||||
"idpManageDescription": "Просмотр и управление поставщиками удостоверений в системе",
|
"idpManageDescription": "Просмотр и управление поставщиками удостоверений в системе",
|
||||||
"idpDeletedDescription": "Поставщик удостоверений успешно удалён",
|
"idpDeletedDescription": "Поставщик удостоверений успешно удалён",
|
||||||
"idpOidc": "OAuth2/OIDC",
|
"idpOidc": "OAuth2/OIDC",
|
||||||
"idpQuestionRemove": "Вы уверены, что хотите навсегда удалить поставщика удостоверений {name}?",
|
"idpQuestionRemove": "Вы уверены, что хотите навсегда удалить поставщика удостоверений?",
|
||||||
"idpMessageRemove": "Это удалит поставщика удостоверений и все связанные конфигурации. Пользователи, которые аутентифицируются через этого поставщика, больше не смогут войти.",
|
"idpMessageRemove": "Это удалит поставщика удостоверений и все связанные конфигурации. Пользователи, которые аутентифицируются через этого поставщика, больше не смогут войти.",
|
||||||
"idpMessageConfirm": "Для подтверждения введите имя поставщика удостоверений ниже.",
|
"idpMessageConfirm": "Для подтверждения введите имя поставщика удостоверений ниже.",
|
||||||
"idpConfirmDelete": "Подтвердить удаление поставщика удостоверений",
|
"idpConfirmDelete": "Подтвердить удаление поставщика удостоверений",
|
||||||
@@ -916,6 +911,18 @@
|
|||||||
"passwordResetCodeDescription": "Проверьте вашу почту для получения кода сброса пароля.",
|
"passwordResetCodeDescription": "Проверьте вашу почту для получения кода сброса пароля.",
|
||||||
"passwordNew": "Новый пароль",
|
"passwordNew": "Новый пароль",
|
||||||
"passwordNewConfirm": "Подтвердите новый пароль",
|
"passwordNewConfirm": "Подтвердите новый пароль",
|
||||||
|
"changePassword": "Изменить пароль",
|
||||||
|
"changePasswordDescription": "Обновить пароль учетной записи",
|
||||||
|
"oldPassword": "Текущий пароль",
|
||||||
|
"newPassword": "Новый пароль",
|
||||||
|
"confirmNewPassword": "Подтвердите новый пароль",
|
||||||
|
"changePasswordError": "Не удалось сменить пароль",
|
||||||
|
"changePasswordErrorDescription": "Произошла ошибка при смене пароля",
|
||||||
|
"changePasswordSuccess": "Пароль успешно изменен",
|
||||||
|
"changePasswordSuccessDescription": "Ваш пароль был успешно обновлен",
|
||||||
|
"passwordExpiryRequired": "Требуется срок действия пароля",
|
||||||
|
"passwordExpiryDescription": "Эта организация требует смены пароля каждые {maxDays} дней.",
|
||||||
|
"changePasswordNow": "Изменить пароль сейчас",
|
||||||
"pincodeAuth": "Код аутентификатора",
|
"pincodeAuth": "Код аутентификатора",
|
||||||
"pincodeSubmit2": "Отправить код",
|
"pincodeSubmit2": "Отправить код",
|
||||||
"passwordResetSubmit": "Запросить сброс",
|
"passwordResetSubmit": "Запросить сброс",
|
||||||
@@ -1154,8 +1161,27 @@
|
|||||||
"sidebarAllUsers": "Все пользователи",
|
"sidebarAllUsers": "Все пользователи",
|
||||||
"sidebarIdentityProviders": "Поставщики удостоверений",
|
"sidebarIdentityProviders": "Поставщики удостоверений",
|
||||||
"sidebarLicense": "Лицензия",
|
"sidebarLicense": "Лицензия",
|
||||||
"sidebarClients": "Clients",
|
"sidebarClients": "Клиенты",
|
||||||
"sidebarDomains": "Домены",
|
"sidebarDomains": "Домены",
|
||||||
|
"sidebarBluePrints": "Чертежи",
|
||||||
|
"blueprints": "Чертежи",
|
||||||
|
"blueprintsDescription": "Чертежи являются декларативными конфигурациями YAML, которые определяют ваши ресурсы и их настройки",
|
||||||
|
"blueprintAdd": "Добавить чертёж",
|
||||||
|
"blueprintGoBack": "Посмотреть все чертежи",
|
||||||
|
"blueprintCreate": "Создать чертёж",
|
||||||
|
"blueprintCreateDescription2": "Для создания и применения нового чертежа выполните следующие шаги",
|
||||||
|
"blueprintDetails": "Подробности чертежа",
|
||||||
|
"blueprintDetailsDescription": "Посмотреть детали запуска чертежа",
|
||||||
|
"blueprintInfo": "Информация о чертеже",
|
||||||
|
"message": "Сообщение",
|
||||||
|
"blueprintContentsDescription": "Определите содержимое YAML, описывающее вашу инфраструктуру",
|
||||||
|
"blueprintErrorCreateDescription": "Произошла ошибка при применении чертежа",
|
||||||
|
"blueprintErrorCreate": "Ошибка при создании чертежа",
|
||||||
|
"searchBlueprintProgress": "Поиск чертежей...",
|
||||||
|
"appliedAt": "Заявка на",
|
||||||
|
"source": "Источник",
|
||||||
|
"contents": "Содержание",
|
||||||
|
"parsedContents": "Обработанное содержимое",
|
||||||
"enableDockerSocket": "Включить чертёж Docker",
|
"enableDockerSocket": "Включить чертёж Docker",
|
||||||
"enableDockerSocketDescription": "Включить scraping ярлыка Docker Socket для ярлыков чертежей. Путь к сокету должен быть предоставлен в Newt.",
|
"enableDockerSocketDescription": "Включить scraping ярлыка Docker Socket для ярлыков чертежей. Путь к сокету должен быть предоставлен в Newt.",
|
||||||
"enableDockerSocketLink": "Узнать больше",
|
"enableDockerSocketLink": "Узнать больше",
|
||||||
@@ -1211,9 +1237,8 @@
|
|||||||
"domainCreate": "Создать Домен",
|
"domainCreate": "Создать Домен",
|
||||||
"domainCreatedDescription": "Домен успешно создан",
|
"domainCreatedDescription": "Домен успешно создан",
|
||||||
"domainDeletedDescription": "Домен успешно удален",
|
"domainDeletedDescription": "Домен успешно удален",
|
||||||
"domainQuestionRemove": "Вы уверены, что хотите удалить домен {domain} из вашего аккаунта?",
|
"domainQuestionRemove": "Вы уверены, что хотите удалить домен из вашей учетной записи?",
|
||||||
"domainMessageRemove": "После удаления домен больше не будет связан с вашей учетной записью.",
|
"domainMessageRemove": "После удаления домен больше не будет связан с вашей учетной записью.",
|
||||||
"domainMessageConfirm": "Для подтверждения введите ниже имя домена.",
|
|
||||||
"domainConfirmDelete": "Подтвердить удаление домена",
|
"domainConfirmDelete": "Подтвердить удаление домена",
|
||||||
"domainDelete": "Удалить Домен",
|
"domainDelete": "Удалить Домен",
|
||||||
"domain": "Домен",
|
"domain": "Домен",
|
||||||
@@ -1280,7 +1305,7 @@
|
|||||||
"billingFreeTier": "Бесплатный уровень",
|
"billingFreeTier": "Бесплатный уровень",
|
||||||
"billingWarningOverLimit": "Предупреждение: Вы превысили одну или несколько границ использования. Ваши сайты не подключатся, пока вы не измените подписку или не скорректируете использование.",
|
"billingWarningOverLimit": "Предупреждение: Вы превысили одну или несколько границ использования. Ваши сайты не подключатся, пока вы не измените подписку или не скорректируете использование.",
|
||||||
"billingUsageLimitsOverview": "Обзор лимитов использования",
|
"billingUsageLimitsOverview": "Обзор лимитов использования",
|
||||||
"billingMonitorUsage": "Контролируйте использование в соответствии с установленными лимитами. Если вам требуется увеличение лимитов, пожалуйста, свяжитесь с нами support@fossorial.io.",
|
"billingMonitorUsage": "Контролируйте использование в соответствии с установленными лимитами. Если вам требуется увеличение лимитов, пожалуйста, свяжитесь с нами support@pangolin.net.",
|
||||||
"billingDataUsage": "Использование данных",
|
"billingDataUsage": "Использование данных",
|
||||||
"billingOnlineTime": "Время работы сайта",
|
"billingOnlineTime": "Время работы сайта",
|
||||||
"billingUsers": "Активные пользователи",
|
"billingUsers": "Активные пользователи",
|
||||||
@@ -1346,6 +1371,19 @@
|
|||||||
"securityKeyUnknownError": "Произошла проблема при использовании вашего ключа безопасности. Пожалуйста, попробуйте еще раз.",
|
"securityKeyUnknownError": "Произошла проблема при использовании вашего ключа безопасности. Пожалуйста, попробуйте еще раз.",
|
||||||
"twoFactorRequired": "Для регистрации ключа безопасности требуется двухфакторная аутентификация.",
|
"twoFactorRequired": "Для регистрации ключа безопасности требуется двухфакторная аутентификация.",
|
||||||
"twoFactor": "Двухфакторная аутентификация",
|
"twoFactor": "Двухфакторная аутентификация",
|
||||||
|
"twoFactorAuthentication": "Двухфакторная аутентификация",
|
||||||
|
"twoFactorDescription": "Эта организация требует двухфакторной аутентификации.",
|
||||||
|
"enableTwoFactor": "Включить двухфакторную аутентификацию",
|
||||||
|
"organizationSecurityPolicy": "Политика безопасности Организации",
|
||||||
|
"organizationSecurityPolicyDescription": "У этой организации есть требования безопасности, которые должны быть выполнены, прежде чем вы сможете получить доступ к ней",
|
||||||
|
"securityRequirements": "Требования безопасности",
|
||||||
|
"allRequirementsMet": "Все требования выполнены",
|
||||||
|
"completeRequirementsToContinue": "Выполните следующие требования, чтобы продолжить доступ к этой организации",
|
||||||
|
"youCanNowAccessOrganization": "Теперь вы можете получить доступ к этой организации",
|
||||||
|
"reauthenticationRequired": "Длина сессии",
|
||||||
|
"reauthenticationDescription": "Эта организация требует входа каждый {maxDays} дней.",
|
||||||
|
"reauthenticationDescriptionHours": "Эта организация требует входа в систему каждый {maxHours} часов.",
|
||||||
|
"reauthenticateNow": "Войти снова",
|
||||||
"adminEnabled2FaOnYourAccount": "Ваш администратор включил двухфакторную аутентификацию для {email}. Пожалуйста, завершите процесс настройки, чтобы продолжить.",
|
"adminEnabled2FaOnYourAccount": "Ваш администратор включил двухфакторную аутентификацию для {email}. Пожалуйста, завершите процесс настройки, чтобы продолжить.",
|
||||||
"securityKeyAdd": "Добавить ключ безопасности",
|
"securityKeyAdd": "Добавить ключ безопасности",
|
||||||
"securityKeyRegisterTitle": "Регистрация нового ключа безопасности",
|
"securityKeyRegisterTitle": "Регистрация нового ключа безопасности",
|
||||||
@@ -1558,14 +1596,13 @@
|
|||||||
"autoLoginErrorNoRedirectUrl": "URL-адрес перенаправления не получен от провайдера удостоверения.",
|
"autoLoginErrorNoRedirectUrl": "URL-адрес перенаправления не получен от провайдера удостоверения.",
|
||||||
"autoLoginErrorGeneratingUrl": "Не удалось сгенерировать URL-адрес аутентификации.",
|
"autoLoginErrorGeneratingUrl": "Не удалось сгенерировать URL-адрес аутентификации.",
|
||||||
"remoteExitNodeManageRemoteExitNodes": "Удаленные узлы",
|
"remoteExitNodeManageRemoteExitNodes": "Удаленные узлы",
|
||||||
"remoteExitNodeDescription": "Self-host one or more remote nodes to extend your network connectivity and reduce reliance on the cloud",
|
"remoteExitNodeDescription": "Самохост-один или несколько удаленных узлов для расширения сетевого подключения и уменьшения зависимости от облака",
|
||||||
"remoteExitNodes": "Узлы",
|
"remoteExitNodes": "Узлы",
|
||||||
"searchRemoteExitNodes": "Поиск узлов...",
|
"searchRemoteExitNodes": "Поиск узлов...",
|
||||||
"remoteExitNodeAdd": "Добавить узел",
|
"remoteExitNodeAdd": "Добавить узел",
|
||||||
"remoteExitNodeErrorDelete": "Ошибка удаления узла",
|
"remoteExitNodeErrorDelete": "Ошибка удаления узла",
|
||||||
"remoteExitNodeQuestionRemove": "Вы уверены, что хотите удалить узел {selectedNode} из организации?",
|
"remoteExitNodeQuestionRemove": "Вы уверены, что хотите удалить узел из организации?",
|
||||||
"remoteExitNodeMessageRemove": "После удаления узел больше не будет доступен.",
|
"remoteExitNodeMessageRemove": "После удаления узел больше не будет доступен.",
|
||||||
"remoteExitNodeMessageConfirm": "Для подтверждения введите имя узла ниже.",
|
|
||||||
"remoteExitNodeConfirmDelete": "Подтвердите удаление узла",
|
"remoteExitNodeConfirmDelete": "Подтвердите удаление узла",
|
||||||
"remoteExitNodeDelete": "Удалить узел",
|
"remoteExitNodeDelete": "Удалить узел",
|
||||||
"sidebarRemoteExitNodes": "Удаленные узлы",
|
"sidebarRemoteExitNodes": "Удаленные узлы",
|
||||||
@@ -1733,7 +1770,49 @@
|
|||||||
"resourceExposePortsEditFile": "Редактировать файл: docker-compose.yml",
|
"resourceExposePortsEditFile": "Редактировать файл: docker-compose.yml",
|
||||||
"emailVerificationRequired": "Требуется подтверждение адреса электронной почты. Пожалуйста, войдите снова через {dashboardUrl}/auth/login завершить этот шаг. Затем вернитесь сюда.",
|
"emailVerificationRequired": "Требуется подтверждение адреса электронной почты. Пожалуйста, войдите снова через {dashboardUrl}/auth/login завершить этот шаг. Затем вернитесь сюда.",
|
||||||
"twoFactorSetupRequired": "Требуется настройка двухфакторной аутентификации. Пожалуйста, войдите снова через {dashboardUrl}/auth/login завершить этот шаг. Затем вернитесь сюда.",
|
"twoFactorSetupRequired": "Требуется настройка двухфакторной аутентификации. Пожалуйста, войдите снова через {dashboardUrl}/auth/login завершить этот шаг. Затем вернитесь сюда.",
|
||||||
|
"additionalSecurityRequired": "Требуется дополнительная безопасность",
|
||||||
|
"organizationRequiresAdditionalSteps": "Эта организация требует дополнительных шагов безопасности, прежде чем вы сможете получить доступ к ресурсам.",
|
||||||
|
"completeTheseSteps": "Выполните эти шаги",
|
||||||
|
"enableTwoFactorAuthentication": "Включить двухфакторную аутентификацию",
|
||||||
|
"completeSecuritySteps": "Пройти шаги безопасности",
|
||||||
|
"securitySettings": "Настройки безопасности",
|
||||||
|
"securitySettingsDescription": "Настройка политик безопасности для вашей организации",
|
||||||
|
"requireTwoFactorForAllUsers": "Требовать двухфакторную аутентификацию для всех пользователей",
|
||||||
|
"requireTwoFactorDescription": "Когда включено, все внутренние пользователи в этой организации должны иметь двухфакторную аутентификацию для доступа к организации.",
|
||||||
|
"requireTwoFactorDisabledDescription": "Эта функция требует действительной лицензии (Enterprise) или активной подписки (SaaS)",
|
||||||
|
"requireTwoFactorCannotEnableDescription": "Вы должны включить двухфакторную аутентификацию для вашей учетной записи, прежде чем принудительно ее применять для всех пользователей",
|
||||||
|
"maxSessionLength": "Максимальная длина сессии",
|
||||||
|
"maxSessionLengthDescription": "Установите максимальную длительность сессий пользователя. После этого времени, пользователям нужно будет пройти повторную аутентификацию.",
|
||||||
|
"maxSessionLengthDisabledDescription": "Эта функция требует действительной лицензии (Enterprise) или активной подписки (SaaS)",
|
||||||
|
"selectSessionLength": "Выберите длину сеанса",
|
||||||
|
"unenforced": "Не применено",
|
||||||
|
"1Hour": "1 час",
|
||||||
|
"3Hours": "3 часа",
|
||||||
|
"6Hours": "6 часов",
|
||||||
|
"12Hours": "12 часов",
|
||||||
|
"1DaySession": "1 день",
|
||||||
|
"3Days": "3 дня",
|
||||||
|
"7Days": "7 дней",
|
||||||
|
"14Days": "14 дней",
|
||||||
|
"30DaysSession": "30 дней",
|
||||||
|
"90DaysSession": "90 дней",
|
||||||
|
"180DaysSession": "180 дней",
|
||||||
|
"passwordExpiryDays": "Срок действия пароля",
|
||||||
|
"editPasswordExpiryDescription": "Установите количество дней, прежде чем пользователи должны изменить свой пароль.",
|
||||||
|
"selectPasswordExpiry": "Выберите срок действия пароля",
|
||||||
|
"30Days": "30 дней",
|
||||||
|
"1Day": "1 день",
|
||||||
|
"60Days": "60 дней",
|
||||||
|
"90Days": "90 дней",
|
||||||
|
"180Days": "180 дней",
|
||||||
|
"1Year": "1 год",
|
||||||
|
"subscriptionBadge": "Требуется подписка",
|
||||||
|
"securityPolicyChangeWarning": "Предупреждение об изменении политики безопасности",
|
||||||
|
"securityPolicyChangeDescription": "Вы собираетесь изменить настройки политики безопасности. После сохранения вам может потребоваться повторная аутентификация, чтобы соответствовать этим обновлениям. Все пользователи, которые не соответствуют установленным правилам, также должны пройти процедуру повторной аутентификации.",
|
||||||
|
"securityPolicyChangeConfirmMessage": "Подтверждаю",
|
||||||
|
"securityPolicyChangeWarningText": "Это повлияет на всех пользователей организации",
|
||||||
"authPageErrorUpdateMessage": "Произошла ошибка при обновлении настроек страницы авторизации",
|
"authPageErrorUpdateMessage": "Произошла ошибка при обновлении настроек страницы авторизации",
|
||||||
|
"authPageErrorUpdate": "Не удалось обновить страницу авторизации",
|
||||||
"authPageUpdated": "Страница авторизации успешно обновлена",
|
"authPageUpdated": "Страница авторизации успешно обновлена",
|
||||||
"healthCheckNotAvailable": "Локальный",
|
"healthCheckNotAvailable": "Локальный",
|
||||||
"rewritePath": "Переписать путь",
|
"rewritePath": "Переписать путь",
|
||||||
@@ -1745,153 +1824,261 @@
|
|||||||
"resourceHeaderAuthRemoveDescription": "Проверка подлинности заголовка успешно удалена.",
|
"resourceHeaderAuthRemoveDescription": "Проверка подлинности заголовка успешно удалена.",
|
||||||
"resourceErrorHeaderAuthRemove": "Не удалось удалить аутентификацию заголовка",
|
"resourceErrorHeaderAuthRemove": "Не удалось удалить аутентификацию заголовка",
|
||||||
"resourceErrorHeaderAuthRemoveDescription": "Не удалось удалить проверку подлинности заголовка ресурса.",
|
"resourceErrorHeaderAuthRemoveDescription": "Не удалось удалить проверку подлинности заголовка ресурса.",
|
||||||
"resourceHeaderAuthProtectionEnabled": "Header Authentication Enabled",
|
"resourceHeaderAuthProtectionEnabled": "Заголовок аутентификации включен",
|
||||||
"resourceHeaderAuthProtectionDisabled": "Header Authentication Disabled",
|
"resourceHeaderAuthProtectionDisabled": "Проверка подлинности заголовка отключена",
|
||||||
"headerAuthRemove": "Remove Header Auth",
|
"headerAuthRemove": "Удалить проверку подлинности заголовка",
|
||||||
"headerAuthAdd": "Add Header Auth",
|
"headerAuthAdd": "Добавить заголовок аутентификации",
|
||||||
"resourceErrorHeaderAuthSetup": "Не удалось установить аутентификацию заголовка",
|
"resourceErrorHeaderAuthSetup": "Не удалось установить аутентификацию заголовка",
|
||||||
"resourceErrorHeaderAuthSetupDescription": "Не удалось установить проверку подлинности заголовка ресурса.",
|
"resourceErrorHeaderAuthSetupDescription": "Не удалось установить проверку подлинности заголовка ресурса.",
|
||||||
"resourceHeaderAuthSetup": "Проверка подлинности заголовка успешно установлена",
|
"resourceHeaderAuthSetup": "Проверка подлинности заголовка успешно установлена",
|
||||||
"resourceHeaderAuthSetupDescription": "Проверка подлинности заголовка успешно установлена.",
|
"resourceHeaderAuthSetupDescription": "Проверка подлинности заголовка успешно установлена.",
|
||||||
"resourceHeaderAuthSetupTitle": "Установить проверку подлинности заголовка",
|
"resourceHeaderAuthSetupTitle": "Установить проверку подлинности заголовка",
|
||||||
"resourceHeaderAuthSetupTitleDescription": "Set the basic auth credentials (username and password) to protect this resource with HTTP Header Authentication. Access it using the format https://username:password@resource.example.com",
|
"resourceHeaderAuthSetupTitleDescription": "Установите основные учетные данные авторизации (имя пользователя и пароль), чтобы защитить этот ресурс с помощью заголовка HTTP. Получите доступ к нему с помощью формата https://username:password@resource.example.com",
|
||||||
"resourceHeaderAuthSubmit": "Установить проверку подлинности заголовка",
|
"resourceHeaderAuthSubmit": "Установить проверку подлинности заголовка",
|
||||||
"actionSetResourceHeaderAuth": "Установить проверку подлинности заголовка",
|
"actionSetResourceHeaderAuth": "Установить проверку подлинности заголовка",
|
||||||
"enterpriseEdition": "Enterprise Edition",
|
"enterpriseEdition": "Корпоративная версия",
|
||||||
"unlicensed": "Unlicensed",
|
"unlicensed": "Нелицензированный",
|
||||||
"beta": "Beta",
|
"beta": "Бета",
|
||||||
"manageClients": "Manage Clients",
|
"manageClients": "Управление клиентами",
|
||||||
"manageClientsDescription": "Clients are devices that can connect to your sites",
|
"manageClientsDescription": "Клиенты - это устройства, которые могут подключаться к вашим сайтам",
|
||||||
"licenseTableValidUntil": "Valid Until",
|
"licenseTableValidUntil": "Действителен до",
|
||||||
"saasLicenseKeysSettingsTitle": "Enterprise Licenses",
|
"saasLicenseKeysSettingsTitle": "Корпоративные лицензии",
|
||||||
"saasLicenseKeysSettingsDescription": "Generate and manage Enterprise license keys for self-hosted Pangolin instances",
|
"saasLicenseKeysSettingsDescription": "Генерировать и управлять лицензионными ключами Enterprise для копий Pangolin",
|
||||||
"sidebarEnterpriseLicenses": "Licenses",
|
"sidebarEnterpriseLicenses": "Лицензии",
|
||||||
"generateLicenseKey": "Generate License Key",
|
"generateLicenseKey": "Сгенерировать лицензионный ключ",
|
||||||
"generateLicenseKeyForm": {
|
"generateLicenseKeyForm": {
|
||||||
"validation": {
|
"validation": {
|
||||||
"emailRequired": "Please enter a valid email address",
|
"emailRequired": "Пожалуйста, введите действительный адрес электронной почты",
|
||||||
"useCaseTypeRequired": "Please select a use case type",
|
"useCaseTypeRequired": "Пожалуйста, выберите тип варианта использования",
|
||||||
"firstNameRequired": "First name is required",
|
"firstNameRequired": "Требуется имя",
|
||||||
"lastNameRequired": "Last name is required",
|
"lastNameRequired": "Требуется фамилия",
|
||||||
"primaryUseRequired": "Please describe your primary use",
|
"primaryUseRequired": "Пожалуйста, опишите ваше основное использование",
|
||||||
"jobTitleRequiredBusiness": "Job title is required for business use",
|
"jobTitleRequiredBusiness": "Должность требуется для коммерческого использования",
|
||||||
"industryRequiredBusiness": "Industry is required for business use",
|
"industryRequiredBusiness": "Промышленность необходима для коммерческого использования",
|
||||||
"stateProvinceRegionRequired": "State/Province/Region is required",
|
"stateProvinceRegionRequired": "Регион/Область обязательно",
|
||||||
"postalZipCodeRequired": "Postal/ZIP Code is required",
|
"postalZipCodeRequired": "Почтовый индекс требуется",
|
||||||
"companyNameRequiredBusiness": "Company name is required for business use",
|
"companyNameRequiredBusiness": "Название компании обязательно для бизнес-использования",
|
||||||
"countryOfResidenceRequiredBusiness": "Country of residence is required for business use",
|
"countryOfResidenceRequiredBusiness": "Страна проживания необходима для коммерческого использования",
|
||||||
"countryRequiredPersonal": "Country is required for personal use",
|
"countryRequiredPersonal": "Страна необходима для личного использования",
|
||||||
"agreeToTermsRequired": "You must agree to the terms",
|
"agreeToTermsRequired": "Вы должны принять условия",
|
||||||
"complianceConfirmationRequired": "You must confirm compliance with the Fossorial Commercial License"
|
"complianceConfirmationRequired": "Вы должны подтвердить соответствие с Fossorial Commercial License"
|
||||||
},
|
},
|
||||||
"useCaseOptions": {
|
"useCaseOptions": {
|
||||||
"personal": {
|
"personal": {
|
||||||
"title": "Personal Use",
|
"title": "Личное использование",
|
||||||
"description": "For individual, non-commercial use such as learning, personal projects, or experimentation."
|
"description": "Для индивидуального, некоммерческого использования, например, обучения, личных проектов или экспериментов."
|
||||||
},
|
},
|
||||||
"business": {
|
"business": {
|
||||||
"title": "Business Use",
|
"title": "Бизнес-использование",
|
||||||
"description": "For use within organizations, companies, or commercial or revenue-generating activities."
|
"description": "Для использования в организациях, компаниях или коммерческих или приносящих доход видах деятельности."
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"steps": {
|
"steps": {
|
||||||
"emailLicenseType": {
|
"emailLicenseType": {
|
||||||
"title": "Email & License Type",
|
"title": "Email и тип лицензии",
|
||||||
"description": "Enter your email and choose your license type"
|
"description": "Введите адрес электронной почты и выберите тип лицензии"
|
||||||
},
|
},
|
||||||
"personalInformation": {
|
"personalInformation": {
|
||||||
"title": "Personal Information",
|
"title": "Личная информация",
|
||||||
"description": "Tell us about yourself"
|
"description": "Расскажите нам о себе"
|
||||||
},
|
},
|
||||||
"contactInformation": {
|
"contactInformation": {
|
||||||
"title": "Contact Information",
|
"title": "Контактная информация",
|
||||||
"description": "Your contact details"
|
"description": "Ваши контактные данные"
|
||||||
},
|
},
|
||||||
"termsGenerate": {
|
"termsGenerate": {
|
||||||
"title": "Terms & Generate",
|
"title": "Условия и Сгенерировать",
|
||||||
"description": "Review and accept terms to generate your license"
|
"description": "Просмотрите и примите условия для создания вашей лицензии"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"alerts": {
|
"alerts": {
|
||||||
"commercialUseDisclosure": {
|
"commercialUseDisclosure": {
|
||||||
"title": "Usage Disclosure",
|
"title": "Раскрытие",
|
||||||
"description": "Select the license tier that accurately reflects your intended use. The Personal License permits free use of the Software for individual, non-commercial or small-scale commercial activities with annual gross revenue under $100,000 USD. Any use beyond these limits — including use within a business, organization, or other revenue-generating environment — requires a valid Enterprise License and payment of the applicable licensing fee. All users, whether Personal or Enterprise, must comply with the Fossorial Commercial License Terms."
|
"description": "Выберите уровень лицензии, который точно отражает ваше предполагаемое использование. Личная Лицензия разрешает свободное использование Программного Обеспечения для частной, некоммерческой или малой коммерческой деятельности с годовым валовым доходом до $100 000 USD. Любое использование сверх этих пределов — включая использование в бизнесе, организацию, или другой приносящей доход среде — требует действительной лицензии предприятия и уплаты соответствующей лицензионной платы. Все пользователи, будь то Личные или Предприятия, обязаны соблюдать условия коммерческой лицензии Fossoral."
|
||||||
},
|
},
|
||||||
"trialPeriodInformation": {
|
"trialPeriodInformation": {
|
||||||
"title": "Trial Period Information",
|
"title": "Информация о пробном периоде",
|
||||||
"description": "This License Key enables Enterprise features for a 7-day evaluation period. Continued access to Paid Features beyond the evaluation period requires activation under a valid Personal or Enterprise License. For Enterprise licensing, contact sales@fossorial.io."
|
"description": "Этот лицензионный ключ позволяет корпоративным функциям на 7-дневный период оценки. Для продолжения доступа к платным функциям за пределами ознакомительного периода требуется активация в рамках действующей лицензии Личного или Предприятия. Для получения лицензии свяжитесь с sales@pangolin.net."
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"form": {
|
"form": {
|
||||||
"useCaseQuestion": "Are you using Pangolin for personal or business use?",
|
"useCaseQuestion": "Вы используете Pangolin для личного или делового использования?",
|
||||||
"firstName": "First Name",
|
"firstName": "First Name",
|
||||||
"lastName": "Last Name",
|
"lastName": "Фамилия",
|
||||||
"jobTitle": "Job Title",
|
"jobTitle": "Заголовок",
|
||||||
"primaryUseQuestion": "What do you primarily plan to use Pangolin for?",
|
"primaryUseQuestion": "Что вы планируете использовать Панголин в первую очередь?",
|
||||||
"industryQuestion": "What is your industry?",
|
"industryQuestion": "Какая у вас отрасль?",
|
||||||
"prospectiveUsersQuestion": "How many prospective users do you expect to have?",
|
"prospectiveUsersQuestion": "Сколько у вас потенциальных пользователей?",
|
||||||
"prospectiveSitesQuestion": "How many prospective sites (tunnels) do you expect to have?",
|
"prospectiveSitesQuestion": "Сколько потенциальных сайтов (туннелей) вы ожидаете?",
|
||||||
"companyName": "Company name",
|
"companyName": "Название компании",
|
||||||
"countryOfResidence": "Country of residence",
|
"countryOfResidence": "Страна проживания",
|
||||||
"stateProvinceRegion": "State / Province / Region",
|
"stateProvinceRegion": "Область / регион",
|
||||||
"postalZipCode": "Postal / ZIP Code",
|
"postalZipCode": "Почтовый индекс",
|
||||||
"companyWebsite": "Company website",
|
"companyWebsite": "Веб-сайт компании",
|
||||||
"companyPhoneNumber": "Company phone number",
|
"companyPhoneNumber": "Телефон компании",
|
||||||
"country": "Country",
|
"country": "Страна",
|
||||||
"phoneNumberOptional": "Phone number (optional)",
|
"phoneNumberOptional": "Номер телефона (необязательно)",
|
||||||
"complianceConfirmation": "I confirm that I am in compliance with the Fossorial Commercial License and that reporting inaccurate information or misidentifying use of the product is a violation of the license."
|
"complianceConfirmation": "Я подтверждаю, что информация, которую я предоставляю, является точной и что я в соответствии с коммерческой лицензии Fossorial. Сообщение о неточной информации или неправильно идентифицирующем использовании продукта является нарушением лицензии и может привести к аннулированию вашего ключа."
|
||||||
},
|
},
|
||||||
"buttons": {
|
"buttons": {
|
||||||
"close": "Close",
|
"close": "Закрыть",
|
||||||
"previous": "Previous",
|
"previous": "Предыдущий",
|
||||||
"next": "Next",
|
"next": "Следующий",
|
||||||
"generateLicenseKey": "Generate License Key"
|
"generateLicenseKey": "Сгенерировать лицензионный ключ"
|
||||||
},
|
},
|
||||||
"toasts": {
|
"toasts": {
|
||||||
"success": {
|
"success": {
|
||||||
"title": "License key generated successfully",
|
"title": "Лицензионный ключ успешно создан",
|
||||||
"description": "Your license key has been generated and is ready to use."
|
"description": "Ваш лицензионный ключ сгенерирован и готов к использованию."
|
||||||
},
|
},
|
||||||
"error": {
|
"error": {
|
||||||
"title": "Failed to generate license key",
|
"title": "Не удалось сгенерировать лицензионный ключ",
|
||||||
"description": "An error occurred while generating the license key."
|
"description": "Произошла ошибка при генерации лицензионного ключа."
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"priority": "Приоритет",
|
"priority": "Приоритет",
|
||||||
"priorityDescription": "Маршруты с более высоким приоритетом оцениваются первым. Приоритет = 100 означает автоматическое упорядочение (решение системы). Используйте другой номер для обеспечения ручного приоритета.",
|
"priorityDescription": "Маршруты с более высоким приоритетом оцениваются первым. Приоритет = 100 означает автоматическое упорядочение (решение системы). Используйте другой номер для обеспечения ручного приоритета.",
|
||||||
"instanceName": "Instance Name",
|
"instanceName": "Имя экземпляра",
|
||||||
"pathMatchModalTitle": "Configure Path Matching",
|
"pathMatchModalTitle": "Настроить соответствие пути",
|
||||||
"pathMatchModalDescription": "Set up how incoming requests should be matched based on their path.",
|
"pathMatchModalDescription": "Настройка соответствия входящих запросов на основе их пути.",
|
||||||
"pathMatchType": "Match Type",
|
"pathMatchType": "Тип совпадения",
|
||||||
"pathMatchPrefix": "Prefix",
|
"pathMatchPrefix": "Префикс",
|
||||||
"pathMatchExact": "Exact",
|
"pathMatchExact": "Точно",
|
||||||
"pathMatchRegex": "Regex",
|
"pathMatchRegex": "Регенерация",
|
||||||
"pathMatchValue": "Path Value",
|
"pathMatchValue": "Значение пути",
|
||||||
"clear": "Clear",
|
"clear": "Очистить",
|
||||||
"saveChanges": "Save Changes",
|
"saveChanges": "Сохранить изменения",
|
||||||
"pathMatchRegexPlaceholder": "^/api/.*",
|
"pathMatchRegexPlaceholder": "^/api/.*",
|
||||||
"pathMatchDefaultPlaceholder": "/path",
|
"pathMatchDefaultPlaceholder": "/путь",
|
||||||
"pathMatchPrefixHelp": "Example: /api matches /api, /api/users, etc.",
|
"pathMatchPrefixHelp": "Пример: /api matches /api, /api/users, etc.",
|
||||||
"pathMatchExactHelp": "Example: /api matches only /api",
|
"pathMatchExactHelp": "Пример: /api соответствует только /api",
|
||||||
"pathMatchRegexHelp": "Example: ^/api/.* matches /api/anything",
|
"pathMatchRegexHelp": "Пример: ^/api/.* совпадает с /api/anything",
|
||||||
"pathRewriteModalTitle": "Configure Path Rewriting",
|
"pathRewriteModalTitle": "Настроить перезапись пути",
|
||||||
"pathRewriteModalDescription": "Transform the matched path before forwarding to the target.",
|
"pathRewriteModalDescription": "Преобразовать соответствующий путь перед пересылкой к цели.",
|
||||||
"pathRewriteType": "Rewrite Type",
|
"pathRewriteType": "Тип перезаписи",
|
||||||
"pathRewritePrefixOption": "Prefix - Replace prefix",
|
"pathRewritePrefixOption": "Префикс - Замена префикса",
|
||||||
"pathRewriteExactOption": "Exact - Replace entire path",
|
"pathRewriteExactOption": "Точно - Заменить весь путь",
|
||||||
"pathRewriteRegexOption": "Regex - Pattern replacement",
|
"pathRewriteRegexOption": "Regex - замена шаблона",
|
||||||
"pathRewriteStripPrefixOption": "Strip Prefix - Remove prefix",
|
"pathRewriteStripPrefixOption": "Префикс вырезать - Удалить префикс",
|
||||||
"pathRewriteValue": "Rewrite Value",
|
"pathRewriteValue": "Перезаписать значение",
|
||||||
"pathRewriteRegexPlaceholder": "/new/$1",
|
"pathRewriteRegexPlaceholder": "/new/$1",
|
||||||
"pathRewriteDefaultPlaceholder": "/new-path",
|
"pathRewriteDefaultPlaceholder": "/new-path",
|
||||||
"pathRewritePrefixHelp": "Replace the matched prefix with this value",
|
"pathRewritePrefixHelp": "Заменить соответствующий префикс этим значением",
|
||||||
"pathRewriteExactHelp": "Replace the entire path with this value when the path matches exactly",
|
"pathRewriteExactHelp": "Замените весь путь этим значением, когда путь точно соответствует",
|
||||||
"pathRewriteRegexHelp": "Use capture groups like $1, $2 for replacement",
|
"pathRewriteRegexHelp": "Использовать группы захвата типа $1, $2 для замены",
|
||||||
"pathRewriteStripPrefixHelp": "Leave empty to strip prefix or provide new prefix",
|
"pathRewriteStripPrefixHelp": "Оставьте пустым для префикса полосы или укажите новый префикс",
|
||||||
"pathRewritePrefix": "Prefix",
|
"pathRewritePrefix": "Префикс",
|
||||||
"pathRewriteExact": "Exact",
|
"pathRewriteExact": "Точно",
|
||||||
"pathRewriteRegex": "Regex",
|
"pathRewriteRegex": "Регенерация",
|
||||||
"pathRewriteStrip": "Strip",
|
"pathRewriteStrip": "Вырезать",
|
||||||
"pathRewriteStripLabel": "strip"
|
"pathRewriteStripLabel": "полоса",
|
||||||
|
"sidebarEnableEnterpriseLicense": "Включить корпоративную лицензию",
|
||||||
|
"cannotbeUndone": "Это действие не может быть отменено.",
|
||||||
|
"toConfirm": "для подтверждения",
|
||||||
|
"deleteClientQuestion": "Вы уверены, что хотите удалить клиента из сайта и организации?",
|
||||||
|
"clientMessageRemove": "После удаления клиент больше не сможет подключиться к сайту.",
|
||||||
|
"sidebarLogs": "Логи",
|
||||||
|
"request": "Запросить",
|
||||||
|
"logs": "Логи",
|
||||||
|
"logsSettingsDescription": "Отслеживать журналы, собранные в этой организации",
|
||||||
|
"searchLogs": "Поиск журналов...",
|
||||||
|
"action": "Действие",
|
||||||
|
"actor": "Актер",
|
||||||
|
"timestamp": "Отметка времени",
|
||||||
|
"accessLogs": "Журналы доступа",
|
||||||
|
"exportCsv": "Экспорт CSV",
|
||||||
|
"actorId": "ID актера",
|
||||||
|
"allowedByRule": "Разрешено правилом",
|
||||||
|
"allowedNoAuth": "Разрешено без авторизации",
|
||||||
|
"validAccessToken": "Действительный маркер доступа",
|
||||||
|
"validHeaderAuth": "Valid header auth",
|
||||||
|
"validPincode": "Valid Pincode",
|
||||||
|
"validPassword": "Допустимый пароль",
|
||||||
|
"validEmail": "Valid email",
|
||||||
|
"validSSO": "Valid SSO",
|
||||||
|
"resourceBlocked": "Ресурс заблокирован",
|
||||||
|
"droppedByRule": "Отброшено по правилам",
|
||||||
|
"noSessions": "Нет сессий",
|
||||||
|
"temporaryRequestToken": "Временный токен запроса",
|
||||||
|
"noMoreAuthMethods": "No Valid Auth",
|
||||||
|
"ip": "IP",
|
||||||
|
"reason": "Причина",
|
||||||
|
"requestLogs": "Запросить журналы",
|
||||||
|
"host": "Хост",
|
||||||
|
"location": "Местоположение",
|
||||||
|
"actionLogs": "Журнал действий",
|
||||||
|
"sidebarLogsRequest": "Запросить журналы",
|
||||||
|
"sidebarLogsAccess": "Журналы доступа",
|
||||||
|
"sidebarLogsAction": "Журнал действий",
|
||||||
|
"logRetention": "Сохранение журнала",
|
||||||
|
"logRetentionDescription": "Управление сохранением различных типов журналов для этой организации или отключение их",
|
||||||
|
"requestLogsDescription": "Просмотреть подробные журналы запроса ресурсов в этой организации",
|
||||||
|
"logRetentionRequestLabel": "Запросить сохранение журнала",
|
||||||
|
"logRetentionRequestDescription": "Как долго сохранять журналы запросов",
|
||||||
|
"logRetentionAccessLabel": "Хранение журнала доступа",
|
||||||
|
"logRetentionAccessDescription": "Как долго сохранять журналы доступа",
|
||||||
|
"logRetentionActionLabel": "Сохранение журнала действий",
|
||||||
|
"logRetentionActionDescription": "Как долго хранить журналы действий",
|
||||||
|
"logRetentionDisabled": "Отключено",
|
||||||
|
"logRetention3Days": "3 дня",
|
||||||
|
"logRetention7Days": "7 дней",
|
||||||
|
"logRetention14Days": "14 дней",
|
||||||
|
"logRetention30Days": "30 дней",
|
||||||
|
"logRetention90Days": "90 дней",
|
||||||
|
"logRetentionForever": "Всегда",
|
||||||
|
"actionLogsDescription": "Просмотр истории действий, выполненных в этой организации",
|
||||||
|
"accessLogsDescription": "Просмотр запросов авторизации доступа к ресурсам этой организации",
|
||||||
|
"licenseRequiredToUse": "Для использования этой функции требуется лицензия предприятия.",
|
||||||
|
"certResolver": "Резольвер сертификата",
|
||||||
|
"certResolverDescription": "Выберите резолвер сертификата, который будет использоваться для этого ресурса.",
|
||||||
|
"selectCertResolver": "Выберите резолвер сертификата",
|
||||||
|
"enterCustomResolver": "Введите пользовательский резолвер",
|
||||||
|
"preferWildcardCert": "Предпочитать сертификат Wildcard",
|
||||||
|
"unverified": "Не подтверждено",
|
||||||
|
"domainSetting": "Настройки домена",
|
||||||
|
"domainSettingDescription": "Настройка параметров для вашего домена",
|
||||||
|
"preferWildcardCertDescription": "Попытка создания шаблона сертификата (требуется должным образом сконфигурированный резолвер сертификата).",
|
||||||
|
"recordName": "Имя записи",
|
||||||
|
"auto": "Авто",
|
||||||
|
"TTL": "TTL",
|
||||||
|
"howToAddRecords": "Как добавить записи",
|
||||||
|
"dnsRecord": "DNS записи",
|
||||||
|
"required": "Требуется",
|
||||||
|
"domainSettingsUpdated": "Настройки домена успешно обновлены",
|
||||||
|
"orgOrDomainIdMissing": "Отсутствует организация или ID домена",
|
||||||
|
"loadingDNSRecords": "Загрузка записей DNS...",
|
||||||
|
"olmUpdateAvailableInfo": "Доступна обновленная версия Олма. Пожалуйста, обновитесь до последней версии.",
|
||||||
|
"client": "Клиент",
|
||||||
|
"proxyProtocol": "Настройки протокола прокси",
|
||||||
|
"proxyProtocolDescription": "Настроить Прокси-протокол для сохранения IP-адресов клиента для служб TCP/UDP.",
|
||||||
|
"enableProxyProtocol": "Включить Прокси Протокол",
|
||||||
|
"proxyProtocolInfo": "Сохранять IP-адреса клиента для кэша TCP/UDP",
|
||||||
|
"proxyProtocolVersion": "Версия протокола прокси",
|
||||||
|
"version1": " Версия 1 (рекомендуется)",
|
||||||
|
"version2": "Версия 2",
|
||||||
|
"versionDescription": "Версия 1 основана на тексте и широко поддерживается. Версия 2 является бинарной и более эффективной, но менее совместимой.",
|
||||||
|
"warning": "Предупреждение",
|
||||||
|
"proxyProtocolWarning": "Бэкэнд приложение должно быть сконфигурировано для принятия прокси-соединений. Если ваш бэкэнд не поддерживает Прокси-протокол, это нарушит все соединения. Обязательно настройте вашего бэкэнда на доверие заголовкам Proxy Protocol от Traefik.",
|
||||||
|
"restarting": "Перезапуск...",
|
||||||
|
"manual": "Ручной",
|
||||||
|
"messageSupport": "Поддержка сообщений",
|
||||||
|
"supportNotAvailableTitle": "Поддержка недоступна",
|
||||||
|
"supportNotAvailableDescription": "Поддержка сейчас недоступна. Вы можете отправить письмо по адресу support@pangolin.net.",
|
||||||
|
"supportRequestSentTitle": "Запрос на поддержку отправлен",
|
||||||
|
"supportRequestSentDescription": "Ваше сообщение успешно отправлено.",
|
||||||
|
"supportRequestFailedTitle": "Не удалось отправить запрос",
|
||||||
|
"supportRequestFailedDescription": "Произошла ошибка при отправке запроса поддержки.",
|
||||||
|
"supportSubjectRequired": "Необходимо ввести тему",
|
||||||
|
"supportSubjectMaxLength": "Тема должна быть 255 символов или меньше",
|
||||||
|
"supportMessageRequired": "Требуется сообщение",
|
||||||
|
"supportReplyTo": "Ответить",
|
||||||
|
"supportSubject": "Тема",
|
||||||
|
"supportSubjectPlaceholder": "Введите тему",
|
||||||
|
"supportMessage": "Сообщение",
|
||||||
|
"supportMessagePlaceholder": "Введите ваше сообщение",
|
||||||
|
"supportSending": "Отправка...",
|
||||||
|
"supportSend": "Отправить",
|
||||||
|
"supportMessageSent": "Сообщение отправлено!",
|
||||||
|
"supportWillContact": "Мы скоро свяжемся с Вами!"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -47,9 +47,8 @@
|
|||||||
"edit": "Düzenle",
|
"edit": "Düzenle",
|
||||||
"siteConfirmDelete": "Site Silmeyi Onayla",
|
"siteConfirmDelete": "Site Silmeyi Onayla",
|
||||||
"siteDelete": "Siteyi Sil",
|
"siteDelete": "Siteyi Sil",
|
||||||
"siteMessageRemove": "Kaldırıldıktan sonra site artık erişilebilir olmayacak. Siteyle ilişkili tüm kaynaklar ve hedefler de kaldırılacaktır.",
|
"siteMessageRemove": "Kaldırıldıktan sonra site artık erişilebilir olmayacaktır. Siteyle ilişkilendirilmiş tüm hedefler de kaldırılacaktır.",
|
||||||
"siteMessageConfirm": "Onaylamak için lütfen aşağıya sitenin adını yazın.",
|
"siteQuestionRemove": "Siteyi organizasyondan kaldırmak istediğinizden emin misiniz?",
|
||||||
"siteQuestionRemove": "{selectedSite} sitesini organizasyondan kaldırmak istediğinizden emin misiniz?",
|
|
||||||
"siteManageSites": "Siteleri Yönet",
|
"siteManageSites": "Siteleri Yönet",
|
||||||
"siteDescription": "Ağınıza güvenli tüneller üzerinden bağlantı izni verin",
|
"siteDescription": "Ağınıza güvenli tüneller üzerinden bağlantı izni verin",
|
||||||
"siteCreate": "Site Oluştur",
|
"siteCreate": "Site Oluştur",
|
||||||
@@ -96,7 +95,7 @@
|
|||||||
"siteWgDescription": "Bir tünel oluşturmak için herhangi bir WireGuard istemcisi kullanın. Manuel NAT kurulumu gereklidir.",
|
"siteWgDescription": "Bir tünel oluşturmak için herhangi bir WireGuard istemcisi kullanın. Manuel NAT kurulumu gereklidir.",
|
||||||
"siteWgDescriptionSaas": "Bir tünel oluşturmak için herhangi bir WireGuard istemcisi kullanın. Manuel NAT kurulumu gereklidir. YALNIZCA SELF HOSTED DÜĞÜMLERDE ÇALIŞIR",
|
"siteWgDescriptionSaas": "Bir tünel oluşturmak için herhangi bir WireGuard istemcisi kullanın. Manuel NAT kurulumu gereklidir. YALNIZCA SELF HOSTED DÜĞÜMLERDE ÇALIŞIR",
|
||||||
"siteLocalDescription": "Yalnızca yerel kaynaklar. Tünelleme yok.",
|
"siteLocalDescription": "Yalnızca yerel kaynaklar. Tünelleme yok.",
|
||||||
"siteLocalDescriptionSaas": "Local resources only. No tunneling. Only available on remote nodes.",
|
"siteLocalDescriptionSaas": "Yerel kaynaklar yalnızca. Tünel oluşturma yok. Yalnızca uzak düğümlerde mevcuttur.",
|
||||||
"siteSeeAll": "Tüm Siteleri Gör",
|
"siteSeeAll": "Tüm Siteleri Gör",
|
||||||
"siteTunnelDescription": "Sitenize nasıl bağlanmak istediğinizi belirleyin",
|
"siteTunnelDescription": "Sitenize nasıl bağlanmak istediğinizi belirleyin",
|
||||||
"siteNewtCredentials": "Newt Kimlik Bilgileri",
|
"siteNewtCredentials": "Newt Kimlik Bilgileri",
|
||||||
@@ -154,8 +153,7 @@
|
|||||||
"protected": "Korunan",
|
"protected": "Korunan",
|
||||||
"notProtected": "Korunmayan",
|
"notProtected": "Korunmayan",
|
||||||
"resourceMessageRemove": "Kaldırıldıktan sonra kaynak artık erişilebilir olmayacaktır. Kaynakla ilişkili tüm hedefler de kaldırılacaktır.",
|
"resourceMessageRemove": "Kaldırıldıktan sonra kaynak artık erişilebilir olmayacaktır. Kaynakla ilişkili tüm hedefler de kaldırılacaktır.",
|
||||||
"resourceMessageConfirm": "Onaylamak için lütfen aşağıya kaynağın adını yazın.",
|
"resourceQuestionRemove": "Kaynağı organizasyondan kaldırmak istediğinizden emin misiniz?",
|
||||||
"resourceQuestionRemove": "{selectedResource} kaynağını organizasyondan kaldırmak istediğinizden emin misiniz?",
|
|
||||||
"resourceHTTP": "HTTPS Kaynağı",
|
"resourceHTTP": "HTTPS Kaynağı",
|
||||||
"resourceHTTPDescription": "Bir alt alan adı veya temel alan adı kullanarak uygulamanıza HTTPS üzerinden vekil istek gönderin.",
|
"resourceHTTPDescription": "Bir alt alan adı veya temel alan adı kullanarak uygulamanıza HTTPS üzerinden vekil istek gönderin.",
|
||||||
"resourceRaw": "Ham TCP/UDP Kaynağı",
|
"resourceRaw": "Ham TCP/UDP Kaynağı",
|
||||||
@@ -220,7 +218,7 @@
|
|||||||
"orgDeleteConfirm": "Organizasyon Silmeyi Onayla",
|
"orgDeleteConfirm": "Organizasyon Silmeyi Onayla",
|
||||||
"orgMessageRemove": "Bu işlem geri alınamaz ve tüm ilişkili verileri silecektir.",
|
"orgMessageRemove": "Bu işlem geri alınamaz ve tüm ilişkili verileri silecektir.",
|
||||||
"orgMessageConfirm": "Onaylamak için lütfen aşağıya organizasyonun adını yazın.",
|
"orgMessageConfirm": "Onaylamak için lütfen aşağıya organizasyonun adını yazın.",
|
||||||
"orgQuestionRemove": "{selectedOrg} organizasyonunu kaldırmak istediğinizden emin misiniz?",
|
"orgQuestionRemove": "Organizasyondan kaldırmak istediğinizden emin misiniz?",
|
||||||
"orgUpdated": "Organizasyon güncellendi",
|
"orgUpdated": "Organizasyon güncellendi",
|
||||||
"orgUpdatedDescription": "Organizasyon güncellendi.",
|
"orgUpdatedDescription": "Organizasyon güncellendi.",
|
||||||
"orgErrorUpdate": "Organizasyon güncellenemedi",
|
"orgErrorUpdate": "Organizasyon güncellenemedi",
|
||||||
@@ -287,9 +285,8 @@
|
|||||||
"apiKeysAdd": "API Anahtarı Oluştur",
|
"apiKeysAdd": "API Anahtarı Oluştur",
|
||||||
"apiKeysErrorDelete": "API anahtarı silinirken bir hata oluştu",
|
"apiKeysErrorDelete": "API anahtarı silinirken bir hata oluştu",
|
||||||
"apiKeysErrorDeleteMessage": "API anahtarı silinirken bir hata oluştu",
|
"apiKeysErrorDeleteMessage": "API anahtarı silinirken bir hata oluştu",
|
||||||
"apiKeysQuestionRemove": "{selectedApiKey} API anahtarını organizasyondan kaldırmak istediğinizden emin misiniz?",
|
"apiKeysQuestionRemove": "API anahtarını organizasyondan kaldırmak istediğinizden emin misiniz?",
|
||||||
"apiKeysMessageRemove": "Kaldırıldığında, API anahtarı artık kullanılamayacaktır.",
|
"apiKeysMessageRemove": "Kaldırıldığında, API anahtarı artık kullanılamayacaktır.",
|
||||||
"apiKeysMessageConfirm": "Onaylamak için lütfen aşağıya API anahtarının adını yazın.",
|
|
||||||
"apiKeysDeleteConfirm": "API Anahtarının Silinmesini Onaylayın",
|
"apiKeysDeleteConfirm": "API Anahtarının Silinmesini Onaylayın",
|
||||||
"apiKeysDelete": "API Anahtarını Sil",
|
"apiKeysDelete": "API Anahtarını Sil",
|
||||||
"apiKeysManage": "API Anahtarlarını Yönet",
|
"apiKeysManage": "API Anahtarlarını Yönet",
|
||||||
@@ -305,8 +302,7 @@
|
|||||||
"userDeleteConfirm": "Kullanıcı Silinmesini Onayla",
|
"userDeleteConfirm": "Kullanıcı Silinmesini Onayla",
|
||||||
"userDeleteServer": "Kullanıcıyı Sunucudan Sil",
|
"userDeleteServer": "Kullanıcıyı Sunucudan Sil",
|
||||||
"userMessageRemove": "Kullanıcı tüm organizasyonlardan çıkarılacak ve tamamen sunucudan kaldırılacaktır.",
|
"userMessageRemove": "Kullanıcı tüm organizasyonlardan çıkarılacak ve tamamen sunucudan kaldırılacaktır.",
|
||||||
"userMessageConfirm": "Onaylamak için lütfen aşağıya kullanıcının adını yazın.",
|
"userQuestionRemove": "Kullanıcıyı sunucudan kalıcı olarak silmek istediğinizden emin misiniz?",
|
||||||
"userQuestionRemove": "{selectedUser} kullanıcısını sunucudan kalıcı olarak silmek istediğinizden emin misiniz?",
|
|
||||||
"licenseKey": "Lisans Anahtarı",
|
"licenseKey": "Lisans Anahtarı",
|
||||||
"valid": "Geçerli",
|
"valid": "Geçerli",
|
||||||
"numberOfSites": "Site Sayısı",
|
"numberOfSites": "Site Sayısı",
|
||||||
@@ -339,7 +335,7 @@
|
|||||||
"fossorialLicense": "Fossorial Ticari Lisans ve Abonelik Koşullarını Gör",
|
"fossorialLicense": "Fossorial Ticari Lisans ve Abonelik Koşullarını Gör",
|
||||||
"licenseMessageRemove": "Bu, lisans anahtarını ve onun tarafından verilen tüm izinleri kaldıracaktır.",
|
"licenseMessageRemove": "Bu, lisans anahtarını ve onun tarafından verilen tüm izinleri kaldıracaktır.",
|
||||||
"licenseMessageConfirm": "Onaylamak için lütfen aşağıya lisans anahtarını yazın.",
|
"licenseMessageConfirm": "Onaylamak için lütfen aşağıya lisans anahtarını yazın.",
|
||||||
"licenseQuestionRemove": "{selectedKey} lisans anahtarını silmek istediğinizden emin misiniz?",
|
"licenseQuestionRemove": "Lisans anahtarını silmek istediğinizden emin misiniz?",
|
||||||
"licenseKeyDelete": "Lisans Anahtarını Sil",
|
"licenseKeyDelete": "Lisans Anahtarını Sil",
|
||||||
"licenseKeyDeleteConfirm": "Lisans Anahtarının Silinmesini Onaylayın",
|
"licenseKeyDeleteConfirm": "Lisans Anahtarının Silinmesini Onaylayın",
|
||||||
"licenseTitle": "Lisans Durumunu Yönet",
|
"licenseTitle": "Lisans Durumunu Yönet",
|
||||||
@@ -372,7 +368,7 @@
|
|||||||
"inviteRemoveErrorDescription": "Daveti kaldırırken bir hata oluştu.",
|
"inviteRemoveErrorDescription": "Daveti kaldırırken bir hata oluştu.",
|
||||||
"inviteRemoved": "Davetiye kaldırıldı",
|
"inviteRemoved": "Davetiye kaldırıldı",
|
||||||
"inviteRemovedDescription": "{email} için olan davetiye kaldırıldı.",
|
"inviteRemovedDescription": "{email} için olan davetiye kaldırıldı.",
|
||||||
"inviteQuestionRemove": "{email} davetini kaldırmak istediğinizden emin misiniz?",
|
"inviteQuestionRemove": "Davetiyeyi kaldırmak istediğinizden emin misiniz?",
|
||||||
"inviteMessageRemove": "Kaldırıldıktan sonra bu davetiye artık geçerli olmayacak. Kullanıcı tekrar davet edilebilir.",
|
"inviteMessageRemove": "Kaldırıldıktan sonra bu davetiye artık geçerli olmayacak. Kullanıcı tekrar davet edilebilir.",
|
||||||
"inviteMessageConfirm": "Onaylamak için lütfen aşağıya davetiyenin e-posta adresini yazın.",
|
"inviteMessageConfirm": "Onaylamak için lütfen aşağıya davetiyenin e-posta adresini yazın.",
|
||||||
"inviteQuestionRegenerate": "Are you sure you want to regenerate the invitation for{email, plural, ='' {}, other { for #}}? This will revoke the previous invitation.",
|
"inviteQuestionRegenerate": "Are you sure you want to regenerate the invitation for{email, plural, ='' {}, other { for #}}? This will revoke the previous invitation.",
|
||||||
@@ -398,9 +394,8 @@
|
|||||||
"userErrorOrgRemoveDescription": "Kullanıcı kaldırılırken bir hata oluştu.",
|
"userErrorOrgRemoveDescription": "Kullanıcı kaldırılırken bir hata oluştu.",
|
||||||
"userOrgRemoved": "Kullanıcı kaldırıldı",
|
"userOrgRemoved": "Kullanıcı kaldırıldı",
|
||||||
"userOrgRemovedDescription": "{email} kullanıcı organizasyondan kaldırılmıştır.",
|
"userOrgRemovedDescription": "{email} kullanıcı organizasyondan kaldırılmıştır.",
|
||||||
"userQuestionOrgRemove": "{email} adresini organizasyondan kaldırmak istediğinizden emin misiniz?",
|
"userQuestionOrgRemove": "Kullanıcıyı organizasyondan kaldırmak istediğinizden emin misiniz?",
|
||||||
"userMessageOrgRemove": "Kaldırıldığında, bu kullanıcı organizasyona artık erişim sağlayamayacak. Kullanıcı tekrar davet edilebilir, ancak daveti kabul etmesi gerekecek.",
|
"userMessageOrgRemove": "Kaldırıldığında, bu kullanıcı organizasyona artık erişim sağlayamayacak. Kullanıcı tekrar davet edilebilir, ancak daveti kabul etmesi gerekecek.",
|
||||||
"userMessageOrgConfirm": "Onaylamak için lütfen aşağıya kullanıcının adını yazın.",
|
|
||||||
"userRemoveOrgConfirm": "Kullanıcıyı Kaldırmayı Onayla",
|
"userRemoveOrgConfirm": "Kullanıcıyı Kaldırmayı Onayla",
|
||||||
"userRemoveOrg": "Kullanıcıyı Organizasyondan Kaldır",
|
"userRemoveOrg": "Kullanıcıyı Organizasyondan Kaldır",
|
||||||
"users": "Kullanıcılar",
|
"users": "Kullanıcılar",
|
||||||
@@ -730,7 +725,7 @@
|
|||||||
"pangolinServerAdmin": "Sunucu Yöneticisi - Pangolin",
|
"pangolinServerAdmin": "Sunucu Yöneticisi - Pangolin",
|
||||||
"licenseTierProfessional": "Profesyonel Lisans",
|
"licenseTierProfessional": "Profesyonel Lisans",
|
||||||
"licenseTierEnterprise": "Kurumsal Lisans",
|
"licenseTierEnterprise": "Kurumsal Lisans",
|
||||||
"licenseTierPersonal": "Personal License",
|
"licenseTierPersonal": "Kişisel Lisans",
|
||||||
"licensed": "Lisanslı",
|
"licensed": "Lisanslı",
|
||||||
"yes": "Evet",
|
"yes": "Evet",
|
||||||
"no": "Hayır",
|
"no": "Hayır",
|
||||||
@@ -742,7 +737,7 @@
|
|||||||
"idpManageDescription": "Sistem içindeki kimlik sağlayıcıları görün ve yönetin",
|
"idpManageDescription": "Sistem içindeki kimlik sağlayıcıları görün ve yönetin",
|
||||||
"idpDeletedDescription": "Kimlik sağlayıcı başarıyla silindi",
|
"idpDeletedDescription": "Kimlik sağlayıcı başarıyla silindi",
|
||||||
"idpOidc": "OAuth2/OIDC",
|
"idpOidc": "OAuth2/OIDC",
|
||||||
"idpQuestionRemove": "Kimlik sağlayıcıyı kalıcı olarak silmek istediğinizden emin misiniz? {name}",
|
"idpQuestionRemove": "Kimlik sağlayıcısını kalıcı olarak silmek istediğinizden emin misiniz?",
|
||||||
"idpMessageRemove": "Bu, kimlik sağlayıcıyı ve tüm ilişkili yapılandırmaları kaldıracaktır. Bu sağlayıcıdan kimlik doğrulayan kullanıcılar artık giriş yapamayacaktır.",
|
"idpMessageRemove": "Bu, kimlik sağlayıcıyı ve tüm ilişkili yapılandırmaları kaldıracaktır. Bu sağlayıcıdan kimlik doğrulayan kullanıcılar artık giriş yapamayacaktır.",
|
||||||
"idpMessageConfirm": "Onaylamak için lütfen aşağıya kimlik sağlayıcının adını yazın.",
|
"idpMessageConfirm": "Onaylamak için lütfen aşağıya kimlik sağlayıcının adını yazın.",
|
||||||
"idpConfirmDelete": "Kimlik Sağlayıcıyı Silme Onayı",
|
"idpConfirmDelete": "Kimlik Sağlayıcıyı Silme Onayı",
|
||||||
@@ -765,7 +760,7 @@
|
|||||||
"idpDisplayName": "Bu kimlik sağlayıcı için bir görüntü adı",
|
"idpDisplayName": "Bu kimlik sağlayıcı için bir görüntü adı",
|
||||||
"idpAutoProvisionUsers": "Kullanıcıları Otomatik Sağla",
|
"idpAutoProvisionUsers": "Kullanıcıları Otomatik Sağla",
|
||||||
"idpAutoProvisionUsersDescription": "Etkinleştirildiğinde, kullanıcılar rol ve organizasyonlara eşleme yeteneğiyle birlikte sistemde otomatik olarak oluşturulacak.",
|
"idpAutoProvisionUsersDescription": "Etkinleştirildiğinde, kullanıcılar rol ve organizasyonlara eşleme yeteneğiyle birlikte sistemde otomatik olarak oluşturulacak.",
|
||||||
"licenseBadge": "EE",
|
"licenseBadge": " ",
|
||||||
"idpType": "Sağlayıcı Türü",
|
"idpType": "Sağlayıcı Türü",
|
||||||
"idpTypeDescription": "Yapılandırmak istediğiniz kimlik sağlayıcısı türünü seçin",
|
"idpTypeDescription": "Yapılandırmak istediğiniz kimlik sağlayıcısı türünü seçin",
|
||||||
"idpOidcConfigure": "OAuth2/OIDC Yapılandırması",
|
"idpOidcConfigure": "OAuth2/OIDC Yapılandırması",
|
||||||
@@ -916,6 +911,18 @@
|
|||||||
"passwordResetCodeDescription": "E-posta gelen kutunuzda sıfırlama kodunu kontrol edin.",
|
"passwordResetCodeDescription": "E-posta gelen kutunuzda sıfırlama kodunu kontrol edin.",
|
||||||
"passwordNew": "Yeni Şifre",
|
"passwordNew": "Yeni Şifre",
|
||||||
"passwordNewConfirm": "Yeni Şifreyi Onayla",
|
"passwordNewConfirm": "Yeni Şifreyi Onayla",
|
||||||
|
"changePassword": "Parola Değiştir",
|
||||||
|
"changePasswordDescription": "Hesap şifrenizi güncelleyin",
|
||||||
|
"oldPassword": "Mevcut Şifre",
|
||||||
|
"newPassword": "Yeni Şifre",
|
||||||
|
"confirmNewPassword": "Yeni Şifreyi Onayla",
|
||||||
|
"changePasswordError": "Parola değiştirme başarısız oldu",
|
||||||
|
"changePasswordErrorDescription": "Parolanız değiştiriliyor.",
|
||||||
|
"changePasswordSuccess": "Şifre Başarıyla Değiştirildi",
|
||||||
|
"changePasswordSuccessDescription": "Parolanız başarıyla güncellendi",
|
||||||
|
"passwordExpiryRequired": "Şifre Süresi Gereklidir",
|
||||||
|
"passwordExpiryDescription": "Bu kuruluş, parolanızı {maxDays} günde bir değiştirmenizi gerektirir.",
|
||||||
|
"changePasswordNow": "Şifrenizi Şimdi Değiştirin",
|
||||||
"pincodeAuth": "Kimlik Doğrulama Kodu",
|
"pincodeAuth": "Kimlik Doğrulama Kodu",
|
||||||
"pincodeSubmit2": "Kodu Gönder",
|
"pincodeSubmit2": "Kodu Gönder",
|
||||||
"passwordResetSubmit": "Sıfırlama İsteği",
|
"passwordResetSubmit": "Sıfırlama İsteği",
|
||||||
@@ -1154,8 +1161,27 @@
|
|||||||
"sidebarAllUsers": "Tüm Kullanıcılar",
|
"sidebarAllUsers": "Tüm Kullanıcılar",
|
||||||
"sidebarIdentityProviders": "Kimlik Sağlayıcılar",
|
"sidebarIdentityProviders": "Kimlik Sağlayıcılar",
|
||||||
"sidebarLicense": "Lisans",
|
"sidebarLicense": "Lisans",
|
||||||
"sidebarClients": "Clients",
|
"sidebarClients": "İstemciler",
|
||||||
"sidebarDomains": "Alan Adları",
|
"sidebarDomains": "Alan Adları",
|
||||||
|
"sidebarBluePrints": "Planlar",
|
||||||
|
"blueprints": "Planlar",
|
||||||
|
"blueprintsDescription": "Planlar, kaynaklarınızı ve ayarlarını tanımlayan bildirimsel YAML yapılandırmalarıdır",
|
||||||
|
"blueprintAdd": "Plan Ekle",
|
||||||
|
"blueprintGoBack": "Tüm Planları Gör",
|
||||||
|
"blueprintCreate": "Plan Oluştur",
|
||||||
|
"blueprintCreateDescription2": "Yeni bir plan oluşturup uygulamak için aşağıdaki adımları izleyin",
|
||||||
|
"blueprintDetails": "Plan Detayları",
|
||||||
|
"blueprintDetailsDescription": "Plan çalıştırma detaylarını görün",
|
||||||
|
"blueprintInfo": "Plan Bilgileri",
|
||||||
|
"message": "Mesaj",
|
||||||
|
"blueprintContentsDescription": "Altyapınızı tanımlayan YAML içeriğini tanımlayın",
|
||||||
|
"blueprintErrorCreateDescription": "Plan uygulanırken bir hata oluştu",
|
||||||
|
"blueprintErrorCreate": "Plan oluşturulurken hata oluştu",
|
||||||
|
"searchBlueprintProgress": "Planlarda ara...",
|
||||||
|
"appliedAt": "Uygulama Zamanı",
|
||||||
|
"source": "Kaynak",
|
||||||
|
"contents": "İçerik",
|
||||||
|
"parsedContents": "Ayrıştırılmış İçerik",
|
||||||
"enableDockerSocket": "Docker Soketini Etkinleştir",
|
"enableDockerSocket": "Docker Soketini Etkinleştir",
|
||||||
"enableDockerSocketDescription": "Plan etiketleri için Docker Socket etiket toplamasını etkinleştirin. Newt'e soket yolu sağlanmalıdır.",
|
"enableDockerSocketDescription": "Plan etiketleri için Docker Socket etiket toplamasını etkinleştirin. Newt'e soket yolu sağlanmalıdır.",
|
||||||
"enableDockerSocketLink": "Daha fazla bilgi",
|
"enableDockerSocketLink": "Daha fazla bilgi",
|
||||||
@@ -1211,9 +1237,8 @@
|
|||||||
"domainCreate": "Alan Adı Oluştur",
|
"domainCreate": "Alan Adı Oluştur",
|
||||||
"domainCreatedDescription": "Alan adı başarıyla oluşturuldu",
|
"domainCreatedDescription": "Alan adı başarıyla oluşturuldu",
|
||||||
"domainDeletedDescription": "Alan adı başarıyla silindi",
|
"domainDeletedDescription": "Alan adı başarıyla silindi",
|
||||||
"domainQuestionRemove": "{domain} alan adını hesabınızdan kaldırmak istediğinizden emin misiniz?",
|
"domainQuestionRemove": "Alan adını hesabınızdan kaldırmak istediğinizden emin misiniz?",
|
||||||
"domainMessageRemove": "Kaldırıldığında, alan adı hesabınızla ilişkilendirilmeyecek.",
|
"domainMessageRemove": "Kaldırıldığında, alan adı hesabınızla ilişkilendirilmeyecek.",
|
||||||
"domainMessageConfirm": "Onaylamak için lütfen aşağıya alan adını yazın.",
|
|
||||||
"domainConfirmDelete": "Alan Adı Silinmesini Onayla",
|
"domainConfirmDelete": "Alan Adı Silinmesini Onayla",
|
||||||
"domainDelete": "Alan Adını Sil",
|
"domainDelete": "Alan Adını Sil",
|
||||||
"domain": "Alan Adı",
|
"domain": "Alan Adı",
|
||||||
@@ -1280,7 +1305,7 @@
|
|||||||
"billingFreeTier": "Ücretsiz Dilim",
|
"billingFreeTier": "Ücretsiz Dilim",
|
||||||
"billingWarningOverLimit": "Uyarı: Bir veya daha fazla kullanım limitini aştınız. Aboneliğinizi değiştirmediğiniz veya kullanımı ayarlamadığınız sürece siteleriniz bağlanmayacaktır.",
|
"billingWarningOverLimit": "Uyarı: Bir veya daha fazla kullanım limitini aştınız. Aboneliğinizi değiştirmediğiniz veya kullanımı ayarlamadığınız sürece siteleriniz bağlanmayacaktır.",
|
||||||
"billingUsageLimitsOverview": "Kullanım Limitleri Genel Görünümü",
|
"billingUsageLimitsOverview": "Kullanım Limitleri Genel Görünümü",
|
||||||
"billingMonitorUsage": "Kullanımınızı yapılandırılmış limitlerle karşılaştırın. Limitlerin artırılmasına ihtiyacınız varsa, lütfen support@fossorial.io adresinden bizimle iletişime geçin.",
|
"billingMonitorUsage": "Kullanımınızı yapılandırılmış limitlerle karşılaştırın. Limitlerin artırılmasına ihtiyacınız varsa, lütfen support@pangolin.net adresinden bizimle iletişime geçin.",
|
||||||
"billingDataUsage": "Veri Kullanımı",
|
"billingDataUsage": "Veri Kullanımı",
|
||||||
"billingOnlineTime": "Site Çevrimiçi Süresi",
|
"billingOnlineTime": "Site Çevrimiçi Süresi",
|
||||||
"billingUsers": "Aktif Kullanıcılar",
|
"billingUsers": "Aktif Kullanıcılar",
|
||||||
@@ -1346,6 +1371,19 @@
|
|||||||
"securityKeyUnknownError": "Güvenlik anahtarınızı kullanırken bir sorun oluştu. Lütfen tekrar deneyin.",
|
"securityKeyUnknownError": "Güvenlik anahtarınızı kullanırken bir sorun oluştu. Lütfen tekrar deneyin.",
|
||||||
"twoFactorRequired": "Güvenlik anahtarını kaydetmek için iki faktörlü kimlik doğrulama gereklidir.",
|
"twoFactorRequired": "Güvenlik anahtarını kaydetmek için iki faktörlü kimlik doğrulama gereklidir.",
|
||||||
"twoFactor": "İki Faktörlü Kimlik Doğrulama",
|
"twoFactor": "İki Faktörlü Kimlik Doğrulama",
|
||||||
|
"twoFactorAuthentication": "İki Faktörlü Kimlik Doğrulama",
|
||||||
|
"twoFactorDescription": "Bu kuruluş iki faktörlü kimlik doğrulama gerektirir.",
|
||||||
|
"enableTwoFactor": "İki Faktörlü Kimlik Doğrulamayı Etkinleştir",
|
||||||
|
"organizationSecurityPolicy": "Kuruluş Güvenlik Politikası",
|
||||||
|
"organizationSecurityPolicyDescription": "Bu kuruluşun güvenlik gereksinimlerine erişmeden önce karşılanması gereken güvenlik gereksinimleri vardır.",
|
||||||
|
"securityRequirements": "Güvenlik Gereksinimleri",
|
||||||
|
"allRequirementsMet": "Tüm gereksinimler karşılandı",
|
||||||
|
"completeRequirementsToContinue": "Bu kuruluşa erişmeye devam etmek için aşağıdaki gereksinimleri tamamlayın",
|
||||||
|
"youCanNowAccessOrganization": "Artık bu kuruluşa erişebilirsiniz",
|
||||||
|
"reauthenticationRequired": "Oturum Süresi",
|
||||||
|
"reauthenticationDescription": "Bu kuruluş, {maxDays} günde bir oturum açmanızı gerektirir.",
|
||||||
|
"reauthenticationDescriptionHours": "Bu kuruluş, {maxHours} saatte bir oturum açmanızı gerektirir.",
|
||||||
|
"reauthenticateNow": "Tekrar Giriş Yap",
|
||||||
"adminEnabled2FaOnYourAccount": "Yöneticiniz {email} için iki faktörlü kimlik doğrulamayı etkinleştirdi. Devam etmek için kurulum işlemini tamamlayın.",
|
"adminEnabled2FaOnYourAccount": "Yöneticiniz {email} için iki faktörlü kimlik doğrulamayı etkinleştirdi. Devam etmek için kurulum işlemini tamamlayın.",
|
||||||
"securityKeyAdd": "Güvenlik Anahtarı Ekle",
|
"securityKeyAdd": "Güvenlik Anahtarı Ekle",
|
||||||
"securityKeyRegisterTitle": "Yeni Güvenlik Anahtarı Kaydet",
|
"securityKeyRegisterTitle": "Yeni Güvenlik Anahtarı Kaydet",
|
||||||
@@ -1558,14 +1596,13 @@
|
|||||||
"autoLoginErrorNoRedirectUrl": "Kimlik sağlayıcıdan yönlendirme URL'si alınamadı.",
|
"autoLoginErrorNoRedirectUrl": "Kimlik sağlayıcıdan yönlendirme URL'si alınamadı.",
|
||||||
"autoLoginErrorGeneratingUrl": "Kimlik doğrulama URL'si oluşturulamadı.",
|
"autoLoginErrorGeneratingUrl": "Kimlik doğrulama URL'si oluşturulamadı.",
|
||||||
"remoteExitNodeManageRemoteExitNodes": "Uzak Düğümler",
|
"remoteExitNodeManageRemoteExitNodes": "Uzak Düğümler",
|
||||||
"remoteExitNodeDescription": "Self-host one or more remote nodes to extend your network connectivity and reduce reliance on the cloud",
|
"remoteExitNodeDescription": "Kendi konum ağlarınızdan bir veya daha fazlasını barındırarak, bağlantı kurulumları için buluta bağımlılığı azaltın.",
|
||||||
"remoteExitNodes": "Düğümler",
|
"remoteExitNodes": "Düğümler",
|
||||||
"searchRemoteExitNodes": "Düğüm ara...",
|
"searchRemoteExitNodes": "Düğüm ara...",
|
||||||
"remoteExitNodeAdd": "Düğüm Ekle",
|
"remoteExitNodeAdd": "Düğüm Ekle",
|
||||||
"remoteExitNodeErrorDelete": "Düğüm silinirken hata oluştu",
|
"remoteExitNodeErrorDelete": "Düğüm silinirken hata oluştu",
|
||||||
"remoteExitNodeQuestionRemove": "{selectedNode} düğümünü organizasyondan kaldırmak istediğinizden emin misiniz?",
|
"remoteExitNodeQuestionRemove": "Düğümü organizasyondan kaldırmak istediğinizden emin misiniz?",
|
||||||
"remoteExitNodeMessageRemove": "Kaldırıldığında, düğüm artık erişilebilir olmayacaktır.",
|
"remoteExitNodeMessageRemove": "Kaldırıldığında, düğüm artık erişilebilir olmayacaktır.",
|
||||||
"remoteExitNodeMessageConfirm": "Onaylamak için lütfen aşağıya düğümün adını yazın.",
|
|
||||||
"remoteExitNodeConfirmDelete": "Düğüm Silmeyi Onayla",
|
"remoteExitNodeConfirmDelete": "Düğüm Silmeyi Onayla",
|
||||||
"remoteExitNodeDelete": "Düğümü Sil",
|
"remoteExitNodeDelete": "Düğümü Sil",
|
||||||
"sidebarRemoteExitNodes": "Uzak Düğümler",
|
"sidebarRemoteExitNodes": "Uzak Düğümler",
|
||||||
@@ -1733,7 +1770,49 @@
|
|||||||
"resourceExposePortsEditFile": "Dosyayı düzenle: docker-compose.yml",
|
"resourceExposePortsEditFile": "Dosyayı düzenle: docker-compose.yml",
|
||||||
"emailVerificationRequired": "E-posta doğrulaması gereklidir. Bu adımı tamamlamak için lütfen tekrar {dashboardUrl}/auth/login üzerinden oturum açın. Sonra buraya geri dönün.",
|
"emailVerificationRequired": "E-posta doğrulaması gereklidir. Bu adımı tamamlamak için lütfen tekrar {dashboardUrl}/auth/login üzerinden oturum açın. Sonra buraya geri dönün.",
|
||||||
"twoFactorSetupRequired": "İki faktörlü kimlik doğrulama ayarı gereklidir. Bu adımı tamamlamak için lütfen tekrar {dashboardUrl}/auth/login üzerinden oturum açın. Sonra buraya geri dönün.",
|
"twoFactorSetupRequired": "İki faktörlü kimlik doğrulama ayarı gereklidir. Bu adımı tamamlamak için lütfen tekrar {dashboardUrl}/auth/login üzerinden oturum açın. Sonra buraya geri dönün.",
|
||||||
|
"additionalSecurityRequired": "Ek Güvenlik Gereklidir",
|
||||||
|
"organizationRequiresAdditionalSteps": "Bu kuruluş, kaynaklara erişmeden önce ek güvenlik adımları gerektirir.",
|
||||||
|
"completeTheseSteps": "Bu adımları tamamlayın",
|
||||||
|
"enableTwoFactorAuthentication": "İki faktörlü kimlik doğrulamayı etkinleştir",
|
||||||
|
"completeSecuritySteps": "Güvenlik Adımlarını Tamamla",
|
||||||
|
"securitySettings": "Güvenlik Ayarları",
|
||||||
|
"securitySettingsDescription": "Kuruluşunuz için güvenlik politikalarını yapılandırın",
|
||||||
|
"requireTwoFactorForAllUsers": "Tüm Kullanıcılar için İki Faktörlü Kimlik Doğrulama Gerektir",
|
||||||
|
"requireTwoFactorDescription": "Etkinleştirildiğinde, bu kuruluştaki tüm dahili kullanıcıların, kuruluşa erişmek için iki faktörlü kimlik doğrulama etkinleştirilmiş olmalıdır.",
|
||||||
|
"requireTwoFactorDisabledDescription": "Bu özellik, geçerli bir lisans (Kurumsal) veya aktif bir abonelik (SaaS) gerektirir",
|
||||||
|
"requireTwoFactorCannotEnableDescription": "Tüm kullanıcılar için etkinleştirilmeden önce hesabınızda iki faktörlü kimlik doğrulamayı etkinleştirmeniz gerekir",
|
||||||
|
"maxSessionLength": "Maksimum Oturum Süresi",
|
||||||
|
"maxSessionLengthDescription": "Kullanıcı oturumları için maksimum süreyi ayarlayın. Bu süre sonra kullanıcıların tekrar kimlik doğrulaması gerekecektir.",
|
||||||
|
"maxSessionLengthDisabledDescription": "Bu özellik, geçerli bir lisans (Kurumsal) veya aktif bir abonelik (SaaS) gerektirir",
|
||||||
|
"selectSessionLength": "Oturum süresini seçin",
|
||||||
|
"unenforced": "Zorunlu Değil",
|
||||||
|
"1Hour": "1 saat",
|
||||||
|
"3Hours": "3 saat",
|
||||||
|
"6Hours": "6 saat",
|
||||||
|
"12Hours": "12 saat",
|
||||||
|
"1DaySession": "1 gün",
|
||||||
|
"3Days": "3 gün",
|
||||||
|
"7Days": "7 gün",
|
||||||
|
"14Days": "14 gün",
|
||||||
|
"30DaysSession": "30 gün",
|
||||||
|
"90DaysSession": "90 gün",
|
||||||
|
"180DaysSession": "180 gün",
|
||||||
|
"passwordExpiryDays": "Şifre Sona Ermesi",
|
||||||
|
"editPasswordExpiryDescription": "Kullanıcıların parolalarını değiştirmeleri gereken gün sayısını ayarlayın.",
|
||||||
|
"selectPasswordExpiry": "Şifre sona ermesini seçin",
|
||||||
|
"30Days": "30 gün",
|
||||||
|
"1Day": "1 gün",
|
||||||
|
"60Days": "60 gün",
|
||||||
|
"90Days": "90 gün",
|
||||||
|
"180Days": "180 gün",
|
||||||
|
"1Year": "1 yıl",
|
||||||
|
"subscriptionBadge": "Abonelik Gerekiyor",
|
||||||
|
"securityPolicyChangeWarning": "Güvenlik Politikası Değişiklik Uyarısı",
|
||||||
|
"securityPolicyChangeDescription": "Güvenlik politikası ayarlarını değiştirmek üzeresiniz. Değişiklikleri kaydettikten sonra, bu politika güncellemelerine uyum sağlamak amacıyla tekrar kimlik doğrulamanız gerekebilir. Uyum sağlamayan tüm kullanıcıların da tekrar kimlik doğrulaması gerekecektir.",
|
||||||
|
"securityPolicyChangeConfirmMessage": "Onaylıyorum",
|
||||||
|
"securityPolicyChangeWarningText": "Bu, organizasyondaki tüm kullanıcıları etkileyecektir",
|
||||||
"authPageErrorUpdateMessage": "Kimlik doğrulama sayfası ayarları güncellenirken bir hata oluştu.",
|
"authPageErrorUpdateMessage": "Kimlik doğrulama sayfası ayarları güncellenirken bir hata oluştu.",
|
||||||
|
"authPageErrorUpdate": "Kimlik doğrulama sayfası güncellenemedi",
|
||||||
"authPageUpdated": "Kimlik doğrulama sayfası başarıyla güncellendi",
|
"authPageUpdated": "Kimlik doğrulama sayfası başarıyla güncellendi",
|
||||||
"healthCheckNotAvailable": "Yerel",
|
"healthCheckNotAvailable": "Yerel",
|
||||||
"rewritePath": "Yolu Yeniden Yaz",
|
"rewritePath": "Yolu Yeniden Yaz",
|
||||||
@@ -1745,153 +1824,261 @@
|
|||||||
"resourceHeaderAuthRemoveDescription": "Başlık kimlik doğrulama başarıyla kaldırıldı.",
|
"resourceHeaderAuthRemoveDescription": "Başlık kimlik doğrulama başarıyla kaldırıldı.",
|
||||||
"resourceErrorHeaderAuthRemove": "Başlık Kimlik Doğrulama kaldırılamadı",
|
"resourceErrorHeaderAuthRemove": "Başlık Kimlik Doğrulama kaldırılamadı",
|
||||||
"resourceErrorHeaderAuthRemoveDescription": "Kaynak için başlık kimlik doğrulaması kaldırılamadı.",
|
"resourceErrorHeaderAuthRemoveDescription": "Kaynak için başlık kimlik doğrulaması kaldırılamadı.",
|
||||||
"resourceHeaderAuthProtectionEnabled": "Header Authentication Enabled",
|
"resourceHeaderAuthProtectionEnabled": "Başlık Doğrulaması Etkin",
|
||||||
"resourceHeaderAuthProtectionDisabled": "Header Authentication Disabled",
|
"resourceHeaderAuthProtectionDisabled": "Başlık Doğrulaması Devre Dışı",
|
||||||
"headerAuthRemove": "Remove Header Auth",
|
"headerAuthRemove": "Başlık Doğrulaması Kaldır",
|
||||||
"headerAuthAdd": "Add Header Auth",
|
"headerAuthAdd": "Başlık Doğrulaması Ekle",
|
||||||
"resourceErrorHeaderAuthSetup": "Başlık Kimlik Doğrulama ayarlanamadı",
|
"resourceErrorHeaderAuthSetup": "Başlık Kimlik Doğrulama ayarlanamadı",
|
||||||
"resourceErrorHeaderAuthSetupDescription": "Kaynak için başlık kimlik doğrulaması ayarlanamadı.",
|
"resourceErrorHeaderAuthSetupDescription": "Kaynak için başlık kimlik doğrulaması ayarlanamadı.",
|
||||||
"resourceHeaderAuthSetup": "Başlık Kimlik Doğrulama başarıyla ayarlandı",
|
"resourceHeaderAuthSetup": "Başlık Kimlik Doğrulama başarıyla ayarlandı",
|
||||||
"resourceHeaderAuthSetupDescription": "Başlık kimlik doğrulaması başarıyla ayarlandı.",
|
"resourceHeaderAuthSetupDescription": "Başlık kimlik doğrulaması başarıyla ayarlandı.",
|
||||||
"resourceHeaderAuthSetupTitle": "Başlık Kimlik Doğrulama Ayarla",
|
"resourceHeaderAuthSetupTitle": "Başlık Kimlik Doğrulama Ayarla",
|
||||||
"resourceHeaderAuthSetupTitleDescription": "Set the basic auth credentials (username and password) to protect this resource with HTTP Header Authentication. Access it using the format https://username:password@resource.example.com",
|
"resourceHeaderAuthSetupTitleDescription": "Bu kaynağı HTTP Başlık Kimlik Doğrulaması ile korumak için temel kimlik bilgilerini (kullanıcı adı ve şifre) ayarlayın. Kaynağa erişim için https://username:password@resource.example.com formatını kullanın.",
|
||||||
"resourceHeaderAuthSubmit": "Başlık Kimlik Doğrulama Ayarla",
|
"resourceHeaderAuthSubmit": "Başlık Kimlik Doğrulama Ayarla",
|
||||||
"actionSetResourceHeaderAuth": "Başlık Kimlik Doğrulama Ayarla",
|
"actionSetResourceHeaderAuth": "Başlık Kimlik Doğrulama Ayarla",
|
||||||
"enterpriseEdition": "Enterprise Edition",
|
"enterpriseEdition": "Kurumsal Sürüm",
|
||||||
"unlicensed": "Unlicensed",
|
"unlicensed": "Lisansız",
|
||||||
"beta": "Beta",
|
"beta": "Beta",
|
||||||
"manageClients": "Manage Clients",
|
"manageClients": "Müşteri Yönetimi",
|
||||||
"manageClientsDescription": "Clients are devices that can connect to your sites",
|
"manageClientsDescription": "Müşteriler, sitelerinize bağlanabilen cihazlardır.",
|
||||||
"licenseTableValidUntil": "Valid Until",
|
"licenseTableValidUntil": "Geçerli İki Tarih Kadar",
|
||||||
"saasLicenseKeysSettingsTitle": "Enterprise Licenses",
|
"saasLicenseKeysSettingsTitle": "Kurumsal Lisanslar",
|
||||||
"saasLicenseKeysSettingsDescription": "Generate and manage Enterprise license keys for self-hosted Pangolin instances",
|
"saasLicenseKeysSettingsDescription": "Kendi barındırdığınız Pangolin örnekleri için kurumsal lisans anahtarları oluşturun ve yönetin.",
|
||||||
"sidebarEnterpriseLicenses": "Licenses",
|
"sidebarEnterpriseLicenses": "Lisanslar",
|
||||||
"generateLicenseKey": "Generate License Key",
|
"generateLicenseKey": "Lisans Anahtarı Oluştur",
|
||||||
"generateLicenseKeyForm": {
|
"generateLicenseKeyForm": {
|
||||||
"validation": {
|
"validation": {
|
||||||
"emailRequired": "Please enter a valid email address",
|
"emailRequired": "Lütfen geçerli bir e-posta adresi girin.",
|
||||||
"useCaseTypeRequired": "Please select a use case type",
|
"useCaseTypeRequired": "Lütfen bir kullanım alanı türü seçin.",
|
||||||
"firstNameRequired": "First name is required",
|
"firstNameRequired": "İsim gereklidir.",
|
||||||
"lastNameRequired": "Last name is required",
|
"lastNameRequired": "Soyisim gereklidir.",
|
||||||
"primaryUseRequired": "Please describe your primary use",
|
"primaryUseRequired": "Lütfen öncelikli kullanımınızı açıklayın.",
|
||||||
"jobTitleRequiredBusiness": "Job title is required for business use",
|
"jobTitleRequiredBusiness": "İş kullanımı için iş unvanı gereklidir.",
|
||||||
"industryRequiredBusiness": "Industry is required for business use",
|
"industryRequiredBusiness": "İş kullanımı için sektör gereklidir.",
|
||||||
"stateProvinceRegionRequired": "State/Province/Region is required",
|
"stateProvinceRegionRequired": "Eyalet/İl/Bölge gereklidir.",
|
||||||
"postalZipCodeRequired": "Postal/ZIP Code is required",
|
"postalZipCodeRequired": "Posta/ZIP kodu gereklidir.",
|
||||||
"companyNameRequiredBusiness": "Company name is required for business use",
|
"companyNameRequiredBusiness": "İş kullanımı için şirket ismi gereklidir.",
|
||||||
"countryOfResidenceRequiredBusiness": "Country of residence is required for business use",
|
"countryOfResidenceRequiredBusiness": "İş kullanımı için ikamet edilen ülke gereklidir.",
|
||||||
"countryRequiredPersonal": "Country is required for personal use",
|
"countryRequiredPersonal": "Kişisel kullanım için ülke gereklidir.",
|
||||||
"agreeToTermsRequired": "You must agree to the terms",
|
"agreeToTermsRequired": "Şartları kabul etmelisiniz.",
|
||||||
"complianceConfirmationRequired": "You must confirm compliance with the Fossorial Commercial License"
|
"complianceConfirmationRequired": "Fossorial Ticari Lisans ile uyumluluğu doğrulamalısınız."
|
||||||
},
|
},
|
||||||
"useCaseOptions": {
|
"useCaseOptions": {
|
||||||
"personal": {
|
"personal": {
|
||||||
"title": "Personal Use",
|
"title": "Kişisel Kullanım",
|
||||||
"description": "For individual, non-commercial use such as learning, personal projects, or experimentation."
|
"description": "Bireysel, ticari olmayan kullanım için öğrenme, kişisel projeler veya denemeler gibi."
|
||||||
},
|
},
|
||||||
"business": {
|
"business": {
|
||||||
"title": "Business Use",
|
"title": "İş Kullanımı",
|
||||||
"description": "For use within organizations, companies, or commercial or revenue-generating activities."
|
"description": "Kuruluşlar, şirketler veya ticari veya gelir getirici faaliyetler bünyesinde kullanım için."
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"steps": {
|
"steps": {
|
||||||
"emailLicenseType": {
|
"emailLicenseType": {
|
||||||
"title": "Email & License Type",
|
"title": "E-posta ve Lisans Türü",
|
||||||
"description": "Enter your email and choose your license type"
|
"description": "E-posta adresinizi girin ve lisans türünüzü seçin."
|
||||||
},
|
},
|
||||||
"personalInformation": {
|
"personalInformation": {
|
||||||
"title": "Personal Information",
|
"title": "Kişisel Bilgiler",
|
||||||
"description": "Tell us about yourself"
|
"description": "Kendinizden bahsedin."
|
||||||
},
|
},
|
||||||
"contactInformation": {
|
"contactInformation": {
|
||||||
"title": "Contact Information",
|
"title": "İletişim Bilgileri",
|
||||||
"description": "Your contact details"
|
"description": "İletişim detaylarınız."
|
||||||
},
|
},
|
||||||
"termsGenerate": {
|
"termsGenerate": {
|
||||||
"title": "Terms & Generate",
|
"title": "Şartlar ve Lisans Üret",
|
||||||
"description": "Review and accept terms to generate your license"
|
"description": "Lisansınızı oluşturmak için şartları inceleyin ve kabul edin."
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"alerts": {
|
"alerts": {
|
||||||
"commercialUseDisclosure": {
|
"commercialUseDisclosure": {
|
||||||
"title": "Usage Disclosure",
|
"title": "Kullanım Açıklaması",
|
||||||
"description": "Select the license tier that accurately reflects your intended use. The Personal License permits free use of the Software for individual, non-commercial or small-scale commercial activities with annual gross revenue under $100,000 USD. Any use beyond these limits — including use within a business, organization, or other revenue-generating environment — requires a valid Enterprise License and payment of the applicable licensing fee. All users, whether Personal or Enterprise, must comply with the Fossorial Commercial License Terms."
|
"description": "Kullanım amacınızı doğru bir şekilde yansıtan lisans seviyesini seçin. Kişisel Lisans, yazılımın bireysel, ticari olmayan veya yıllık geliri 100,000 ABD Dolarının altında olan küçük ölçekli ticari faaliyetlerde ücretsiz kullanılmasına izin verir. Bu sınırların ötesinde kullanım — bir işletme, organizasyon veya diğer gelir getirici ortamlarda kullanım dahil olmak üzere — geçerli bir Kurumsal Lisans ve ilgili lisans ücretinin ödenmesini gerektirir. Tüm kullanıcılar, ister Kişisel ister Kurumsal, Fossorial Ticari Lisans Şartlarına uymalıdır."
|
||||||
},
|
},
|
||||||
"trialPeriodInformation": {
|
"trialPeriodInformation": {
|
||||||
"title": "Trial Period Information",
|
"title": "Deneme Süresi Bilgileri",
|
||||||
"description": "This License Key enables Enterprise features for a 7-day evaluation period. Continued access to Paid Features beyond the evaluation period requires activation under a valid Personal or Enterprise License. For Enterprise licensing, contact sales@fossorial.io."
|
"description": "Bu Lisans Anahtarı, Kurumsal özellikleri 7 günlük bir değerlendirme süresi için etkinleştirir. Değerlendirme süresi bittikten sonra, Ücretli Özelliklere devam eden erişim, geçerli bir Kişisel veya Kurumsal Lisans altında etkinleşmeyi gerektirir. Kurumsal lisanslama için sales@pangolin.net ile iletişime geçin."
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"form": {
|
"form": {
|
||||||
"useCaseQuestion": "Are you using Pangolin for personal or business use?",
|
"useCaseQuestion": "Pangolin'i kişisel veya iş kullanımı için mi kullanıyorsunuz?",
|
||||||
"firstName": "First Name",
|
"firstName": "İsim",
|
||||||
"lastName": "Last Name",
|
"lastName": "Soyisim",
|
||||||
"jobTitle": "Job Title",
|
"jobTitle": "İş Unvanı",
|
||||||
"primaryUseQuestion": "What do you primarily plan to use Pangolin for?",
|
"primaryUseQuestion": "Pangolin'i öncelikli olarak ne amacıyla kullanmayı planlıyorsunuz?",
|
||||||
"industryQuestion": "What is your industry?",
|
"industryQuestion": "Hangi sektördesiniz?",
|
||||||
"prospectiveUsersQuestion": "How many prospective users do you expect to have?",
|
"prospectiveUsersQuestion": "Kaç potansiyel kullanıcı öngörüyorsunuz?",
|
||||||
"prospectiveSitesQuestion": "How many prospective sites (tunnels) do you expect to have?",
|
"prospectiveSitesQuestion": "Kaç potansiyel site (tünel) öngörüyorsunuz?",
|
||||||
"companyName": "Company name",
|
"companyName": "Şirket İsmi",
|
||||||
"countryOfResidence": "Country of residence",
|
"countryOfResidence": "İkamet edilen ülke",
|
||||||
"stateProvinceRegion": "State / Province / Region",
|
"stateProvinceRegion": "Eyalet / İl / Bölge",
|
||||||
"postalZipCode": "Postal / ZIP Code",
|
"postalZipCode": "Posta / ZIP Kodu",
|
||||||
"companyWebsite": "Company website",
|
"companyWebsite": "Şirket web sitesi",
|
||||||
"companyPhoneNumber": "Company phone number",
|
"companyPhoneNumber": "Şirket telefon numarası",
|
||||||
"country": "Country",
|
"country": "Ülke",
|
||||||
"phoneNumberOptional": "Phone number (optional)",
|
"phoneNumberOptional": "Telefon numarası (isteğe bağlı)",
|
||||||
"complianceConfirmation": "I confirm that I am in compliance with the Fossorial Commercial License and that reporting inaccurate information or misidentifying use of the product is a violation of the license."
|
"complianceConfirmation": "Sağladığım bilgilerin doğru olduğunu ve Fossorial Ticari Lisans ile uyumlu olduğumu teyit ederim. Yanlış bilgi raporlamak veya ürün kullanımını yanlış tanımlamak lisans ihlalidir ve anahtarınızın iptal edilmesine neden olabilir."
|
||||||
},
|
},
|
||||||
"buttons": {
|
"buttons": {
|
||||||
"close": "Close",
|
"close": "Kapat",
|
||||||
"previous": "Previous",
|
"previous": "Önceki",
|
||||||
"next": "Next",
|
"next": "Sonraki",
|
||||||
"generateLicenseKey": "Generate License Key"
|
"generateLicenseKey": "Lisans Anahtarı Oluştur"
|
||||||
},
|
},
|
||||||
"toasts": {
|
"toasts": {
|
||||||
"success": {
|
"success": {
|
||||||
"title": "License key generated successfully",
|
"title": "Lisans anahtarı başarıyla oluşturuldu",
|
||||||
"description": "Your license key has been generated and is ready to use."
|
"description": "Lisans anahtarınız oluşturuldu ve kullanıma hazır."
|
||||||
},
|
},
|
||||||
"error": {
|
"error": {
|
||||||
"title": "Failed to generate license key",
|
"title": "Lisans anahtarı oluşturulamadı",
|
||||||
"description": "An error occurred while generating the license key."
|
"description": "Lisans anahtarı oluşturulurken bir hata oluştu."
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"priority": "Öncelik",
|
"priority": "Öncelik",
|
||||||
"priorityDescription": "Daha yüksek öncelikli rotalar önce değerlendirilir. Öncelik = 100, otomatik sıralama anlamına gelir (sistem karar verir). Manuel öncelik uygulamak için başka bir numara kullanın.",
|
"priorityDescription": "Daha yüksek öncelikli rotalar önce değerlendirilir. Öncelik = 100, otomatik sıralama anlamına gelir (sistem karar verir). Manuel öncelik uygulamak için başka bir numara kullanın.",
|
||||||
"instanceName": "Instance Name",
|
"instanceName": "Örnek İsmi",
|
||||||
"pathMatchModalTitle": "Configure Path Matching",
|
"pathMatchModalTitle": "Yol Eşleşmesini Yapılandır",
|
||||||
"pathMatchModalDescription": "Set up how incoming requests should be matched based on their path.",
|
"pathMatchModalDescription": "Gelen isteklerin yolu temel alarak nasıl eşleştirilmesi gerektiğini ayarlayın.",
|
||||||
"pathMatchType": "Match Type",
|
"pathMatchType": "Eşleşme Türü",
|
||||||
"pathMatchPrefix": "Prefix",
|
"pathMatchPrefix": "Önek",
|
||||||
"pathMatchExact": "Exact",
|
"pathMatchExact": "Tam",
|
||||||
"pathMatchRegex": "Regex",
|
"pathMatchRegex": "Regex",
|
||||||
"pathMatchValue": "Path Value",
|
"pathMatchValue": "Yol Değeri",
|
||||||
"clear": "Clear",
|
"clear": "Temizle",
|
||||||
"saveChanges": "Save Changes",
|
"saveChanges": "Değişiklikleri Kaydet",
|
||||||
"pathMatchRegexPlaceholder": "^/api/.*",
|
"pathMatchRegexPlaceholder": "^/api/.*",
|
||||||
"pathMatchDefaultPlaceholder": "/path",
|
"pathMatchDefaultPlaceholder": "/path",
|
||||||
"pathMatchPrefixHelp": "Example: /api matches /api, /api/users, etc.",
|
"pathMatchPrefixHelp": "Örnek: /api, /api/users vb.'ni eşleştirir.",
|
||||||
"pathMatchExactHelp": "Example: /api matches only /api",
|
"pathMatchExactHelp": "Örnek: /api yalnızca /api'yi eşleştirir",
|
||||||
"pathMatchRegexHelp": "Example: ^/api/.* matches /api/anything",
|
"pathMatchRegexHelp": "Örnek: ^/api/.* her şeyi eşleştirir /api/anything",
|
||||||
"pathRewriteModalTitle": "Configure Path Rewriting",
|
"pathRewriteModalTitle": "Yolu Yeniden Yazmayı Yapılandır",
|
||||||
"pathRewriteModalDescription": "Transform the matched path before forwarding to the target.",
|
"pathRewriteModalDescription": "Hedefe iletilmeden önce eşleşen yolu dönüştürün.",
|
||||||
"pathRewriteType": "Rewrite Type",
|
"pathRewriteType": "Yeniden Yazma Türü",
|
||||||
"pathRewritePrefixOption": "Prefix - Replace prefix",
|
"pathRewritePrefixOption": "Önek - Ön ek değiştirme",
|
||||||
"pathRewriteExactOption": "Exact - Replace entire path",
|
"pathRewriteExactOption": "Tam - Tüm yolu değiştir",
|
||||||
"pathRewriteRegexOption": "Regex - Pattern replacement",
|
"pathRewriteRegexOption": "Regex - Desen değiştirme",
|
||||||
"pathRewriteStripPrefixOption": "Strip Prefix - Remove prefix",
|
"pathRewriteStripPrefixOption": "Ön Ek Kaldır - Ön eki sil",
|
||||||
"pathRewriteValue": "Rewrite Value",
|
"pathRewriteValue": "Yeniden Yazma Değeri",
|
||||||
"pathRewriteRegexPlaceholder": "/new/$1",
|
"pathRewriteRegexPlaceholder": "/new/$1",
|
||||||
"pathRewriteDefaultPlaceholder": "/new-path",
|
"pathRewriteDefaultPlaceholder": "/new-path",
|
||||||
"pathRewritePrefixHelp": "Replace the matched prefix with this value",
|
"pathRewritePrefixHelp": "Eşleşen öneki bu değerle değiştir",
|
||||||
"pathRewriteExactHelp": "Replace the entire path with this value when the path matches exactly",
|
"pathRewriteExactHelp": "Yol tam olarak eşleştiğinde, yolun tamamını bu değerle değiştir",
|
||||||
"pathRewriteRegexHelp": "Use capture groups like $1, $2 for replacement",
|
"pathRewriteRegexHelp": "Değiştirme için $1, $2 gibi yakalama gruplarını kullan",
|
||||||
"pathRewriteStripPrefixHelp": "Leave empty to strip prefix or provide new prefix",
|
"pathRewriteStripPrefixHelp": "Öneki silmek veya yeni bir ön ek sağlamak için boş bırakın",
|
||||||
"pathRewritePrefix": "Prefix",
|
"pathRewritePrefix": "Önek",
|
||||||
"pathRewriteExact": "Exact",
|
"pathRewriteExact": "Tam",
|
||||||
"pathRewriteRegex": "Regex",
|
"pathRewriteRegex": "Regex",
|
||||||
"pathRewriteStrip": "Strip",
|
"pathRewriteStrip": "Sil",
|
||||||
"pathRewriteStripLabel": "strip"
|
"pathRewriteStripLabel": "sil",
|
||||||
|
"sidebarEnableEnterpriseLicense": "Kurumsal Lisans Etkinleştir",
|
||||||
|
"cannotbeUndone": "Bu geri alınamaz.",
|
||||||
|
"toConfirm": "doğrulamak için",
|
||||||
|
"deleteClientQuestion": "Müşteriyi siteden ve organizasyondan kaldırmak istediğinizden emin misiniz?",
|
||||||
|
"clientMessageRemove": "Kaldırıldıktan sonra müşteri siteye bağlanamayacaktır.",
|
||||||
|
"sidebarLogs": "Kayıtlar",
|
||||||
|
"request": "İstek",
|
||||||
|
"logs": "Günlükler",
|
||||||
|
"logsSettingsDescription": "Bu organizasyondan toplanan günlükleri izleyin",
|
||||||
|
"searchLogs": "Günlüklerde ara...",
|
||||||
|
"action": "Eylem",
|
||||||
|
"actor": "Aktör",
|
||||||
|
"timestamp": "Zaman damgası",
|
||||||
|
"accessLogs": "Erişim Günlükleri",
|
||||||
|
"exportCsv": "CSV Dışa Aktar",
|
||||||
|
"actorId": "Aktör Kimliği",
|
||||||
|
"allowedByRule": "Kurallara Göre İzin Verildi",
|
||||||
|
"allowedNoAuth": "Kimlik Doğrulama Yok İzin Verildi",
|
||||||
|
"validAccessToken": "Geçerli Erişim Jetonu",
|
||||||
|
"validHeaderAuth": "Geçerli Başlık Doğrulama",
|
||||||
|
"validPincode": "Geçerli Pincode",
|
||||||
|
"validPassword": "Geçerli Şifre",
|
||||||
|
"validEmail": "Geçerli E-posta",
|
||||||
|
"validSSO": "Geçerli SSO",
|
||||||
|
"resourceBlocked": "Kaynak Engellendi",
|
||||||
|
"droppedByRule": "Kurallara Göre Çıkartıldı",
|
||||||
|
"noSessions": "Oturum Yok",
|
||||||
|
"temporaryRequestToken": "Geçici İstek Jetonu",
|
||||||
|
"noMoreAuthMethods": "Daha Fazla Kimlik Doğrulama Yöntemi Yok",
|
||||||
|
"ip": "IP",
|
||||||
|
"reason": "Sebep",
|
||||||
|
"requestLogs": "İstek Günlükleri",
|
||||||
|
"host": "Sunucu",
|
||||||
|
"location": "Konum",
|
||||||
|
"actionLogs": "Eylem Günlükleri",
|
||||||
|
"sidebarLogsRequest": "İstek Günlükleri",
|
||||||
|
"sidebarLogsAccess": "Erişim Günlükleri",
|
||||||
|
"sidebarLogsAction": "Eylem Günlükleri",
|
||||||
|
"logRetention": "Kayıt Saklama",
|
||||||
|
"logRetentionDescription": "Bu organizasyon için farklı türdeki günlüklerin ne kadar süre saklanacağını yönetin veya devre dışı bırakın",
|
||||||
|
"requestLogsDescription": "Bu organizasyondaki kaynaklar için ayrıntılı istek günlüklerini görüntüleyin",
|
||||||
|
"logRetentionRequestLabel": "İstek Günlüğü Saklama",
|
||||||
|
"logRetentionRequestDescription": "İstek günlüklerini ne kadar süre tutacağını belirle",
|
||||||
|
"logRetentionAccessLabel": "Erişim Günlüğü Saklama",
|
||||||
|
"logRetentionAccessDescription": "Erişim günlüklerini ne kadar süre tutacağını belirle",
|
||||||
|
"logRetentionActionLabel": "Eylem Günlüğü Saklama",
|
||||||
|
"logRetentionActionDescription": "Eylem günlüklerini ne kadar süre tutacağını belirle",
|
||||||
|
"logRetentionDisabled": "Devre Dışı",
|
||||||
|
"logRetention3Days": "3 gün",
|
||||||
|
"logRetention7Days": "7 gün",
|
||||||
|
"logRetention14Days": "14 gün",
|
||||||
|
"logRetention30Days": "30 gün",
|
||||||
|
"logRetention90Days": "90 gün",
|
||||||
|
"logRetentionForever": "Sonsuza kadar",
|
||||||
|
"actionLogsDescription": "Bu organizasyondaki eylemler geçmişini görüntüleyin",
|
||||||
|
"accessLogsDescription": "Bu organizasyondaki kaynaklar için erişim kimlik doğrulama isteklerini görüntüleyin",
|
||||||
|
"licenseRequiredToUse": "Bu özelliği kullanmak için bir kurumsal lisans gereklidir.",
|
||||||
|
"certResolver": "Sertifika Çözücü",
|
||||||
|
"certResolverDescription": "Bu kaynak için kullanılacak sertifika çözücüsünü seçin.",
|
||||||
|
"selectCertResolver": "Sertifika Çözücü Seçin",
|
||||||
|
"enterCustomResolver": "Özel Çözücü Girin",
|
||||||
|
"preferWildcardCert": "Joker Sertifikayı Tercih Et",
|
||||||
|
"unverified": "Doğrulanmadı",
|
||||||
|
"domainSetting": "Alan Adı Ayarları",
|
||||||
|
"domainSettingDescription": "Alan adınız için ayarları yapılandırın",
|
||||||
|
"preferWildcardCertDescription": "Joker sertifika üretmeye çalışın (doğru yapılandırılmış bir sertifika çözücü gereklidir).",
|
||||||
|
"recordName": "Kayıt Adı",
|
||||||
|
"auto": "Otomatik",
|
||||||
|
"TTL": "TTL",
|
||||||
|
"howToAddRecords": "Kayıtları Nasıl Ekleyebilirsiniz",
|
||||||
|
"dnsRecord": "DNS Kayıtları",
|
||||||
|
"required": "Gerekli",
|
||||||
|
"domainSettingsUpdated": "Alan adına yönelik ayarlar başarıyla güncellendi",
|
||||||
|
"orgOrDomainIdMissing": "Organizasyon veya Alan Adı Kimliği eksik",
|
||||||
|
"loadingDNSRecords": "DNS kayıtları yükleniyor...",
|
||||||
|
"olmUpdateAvailableInfo": "Olm'nin güncellenmiş bir sürümü mevcut. En iyi deneyim için lütfen en son sürüme güncelleyin.",
|
||||||
|
"client": "İstemci",
|
||||||
|
"proxyProtocol": "Proxy Protokol Ayarları",
|
||||||
|
"proxyProtocolDescription": "TCP/UDP hizmetleri için istemci IP adreslerini korumak için Proxy Protokolünü yapılandırın.",
|
||||||
|
"enableProxyProtocol": "Proxy Protokolünü Etkinleştir",
|
||||||
|
"proxyProtocolInfo": "TCP/UDP arka uçları için istemci IP adreslerini koruyun",
|
||||||
|
"proxyProtocolVersion": "Proxy Protokol Versiyonu",
|
||||||
|
"version1": " Versiyon 1 (Önerilen)",
|
||||||
|
"version2": "Versiyon 2",
|
||||||
|
"versionDescription": "Versiyon 1 metin tabanlı ve yaygın olarak desteklenir. Versiyon 2 ise ikili ve daha verimlidir ama daha az uyumludur.",
|
||||||
|
"warning": "Uyarı",
|
||||||
|
"proxyProtocolWarning": "Arka uç uygulamanız, Proxy Protokol bağlantılarını kabul etmek üzere yapılandırılmalıdır. Arka ucunuz Proxy Protokolünü desteklemiyorsa, bunu etkinleştirmek tüm bağlantıları koparır. Traefik'ten gelen Proxy Protokol başlıklarına güvenecek şekilde arka ucunuzu yapılandırdığınızdan emin olun.",
|
||||||
|
"restarting": "Yeniden Başlatılıyor...",
|
||||||
|
"manual": "Manuel",
|
||||||
|
"messageSupport": "Destek Mesajı Gönder",
|
||||||
|
"supportNotAvailableTitle": "Destek Yok",
|
||||||
|
"supportNotAvailableDescription": "Destek şu anda mevcut değil. Destek'e bir e-posta gönderebilirsiniz: support@pangolin.net.",
|
||||||
|
"supportRequestSentTitle": "Destek İsteği Gönderildi",
|
||||||
|
"supportRequestSentDescription": "Mesajınız başarıyla gönderildi.",
|
||||||
|
"supportRequestFailedTitle": "İsteği Gönderme Başarısız",
|
||||||
|
"supportRequestFailedDescription": "Destek isteği gönderilirken bir hata oluştu.",
|
||||||
|
"supportSubjectRequired": "Konu gerekli",
|
||||||
|
"supportSubjectMaxLength": "Konu en fazla 255 karakter olabilir",
|
||||||
|
"supportMessageRequired": "Mesaj gerekli",
|
||||||
|
"supportReplyTo": "Yanıtla",
|
||||||
|
"supportSubject": "Konu",
|
||||||
|
"supportSubjectPlaceholder": "Konu girin",
|
||||||
|
"supportMessage": "Mesaj",
|
||||||
|
"supportMessagePlaceholder": "Mesajınızı girin",
|
||||||
|
"supportSending": "Gönderiliyor...",
|
||||||
|
"supportSend": "Gönder",
|
||||||
|
"supportMessageSent": "Mesaj Gönderildi!",
|
||||||
|
"supportWillContact": "En kısa sürede size geri döneceğiz!"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -47,9 +47,8 @@
|
|||||||
"edit": "编辑",
|
"edit": "编辑",
|
||||||
"siteConfirmDelete": "确认删除站点",
|
"siteConfirmDelete": "确认删除站点",
|
||||||
"siteDelete": "删除站点",
|
"siteDelete": "删除站点",
|
||||||
"siteMessageRemove": "一旦删除,该站点将无法访问。与该站点相关的所有资源和目标也将被删除。",
|
"siteMessageRemove": "一旦移除,站点将无法访问。与站点相关的所有目标也将被移除。",
|
||||||
"siteMessageConfirm": "请在下面输入站点名称以确认。",
|
"siteQuestionRemove": "您确定要从组织中删除该站点吗?",
|
||||||
"siteQuestionRemove": "您确定要从组织中删除 {selectedSite} 站点吗?",
|
|
||||||
"siteManageSites": "管理站点",
|
"siteManageSites": "管理站点",
|
||||||
"siteDescription": "允许通过安全隧道连接到您的网络",
|
"siteDescription": "允许通过安全隧道连接到您的网络",
|
||||||
"siteCreate": "创建站点",
|
"siteCreate": "创建站点",
|
||||||
@@ -96,7 +95,7 @@
|
|||||||
"siteWgDescription": "使用任何 WireGuard 客户端来建立隧道。需要手动配置 NAT。",
|
"siteWgDescription": "使用任何 WireGuard 客户端来建立隧道。需要手动配置 NAT。",
|
||||||
"siteWgDescriptionSaas": "使用任何WireGuard客户端建立隧道。需要手动配置NAT。仅适用于自托管节点。",
|
"siteWgDescriptionSaas": "使用任何WireGuard客户端建立隧道。需要手动配置NAT。仅适用于自托管节点。",
|
||||||
"siteLocalDescription": "仅限本地资源。不需要隧道。",
|
"siteLocalDescription": "仅限本地资源。不需要隧道。",
|
||||||
"siteLocalDescriptionSaas": "Local resources only. No tunneling. Only available on remote nodes.",
|
"siteLocalDescriptionSaas": "仅本地资源。没有隧道。仅在远程节点上可用。",
|
||||||
"siteSeeAll": "查看所有站点",
|
"siteSeeAll": "查看所有站点",
|
||||||
"siteTunnelDescription": "确定如何连接到您的网站",
|
"siteTunnelDescription": "确定如何连接到您的网站",
|
||||||
"siteNewtCredentials": "Newt 凭据",
|
"siteNewtCredentials": "Newt 凭据",
|
||||||
@@ -154,8 +153,7 @@
|
|||||||
"protected": "受到保护",
|
"protected": "受到保护",
|
||||||
"notProtected": "未受到保护",
|
"notProtected": "未受到保护",
|
||||||
"resourceMessageRemove": "一旦删除,资源将不再可访问。与该资源相关的所有目标也将被删除。",
|
"resourceMessageRemove": "一旦删除,资源将不再可访问。与该资源相关的所有目标也将被删除。",
|
||||||
"resourceMessageConfirm": "请在下面输入资源名称以确认。",
|
"resourceQuestionRemove": "您确定要从组织中删除资源吗?",
|
||||||
"resourceQuestionRemove": "您确定要从组织中删除 {selectedResource} 吗?",
|
|
||||||
"resourceHTTP": "HTTPS 资源",
|
"resourceHTTP": "HTTPS 资源",
|
||||||
"resourceHTTPDescription": "使用子域或根域名通过 HTTPS 向您的应用程序提出代理请求。",
|
"resourceHTTPDescription": "使用子域或根域名通过 HTTPS 向您的应用程序提出代理请求。",
|
||||||
"resourceRaw": "TCP/UDP 资源",
|
"resourceRaw": "TCP/UDP 资源",
|
||||||
@@ -220,7 +218,7 @@
|
|||||||
"orgDeleteConfirm": "确认删除组织",
|
"orgDeleteConfirm": "确认删除组织",
|
||||||
"orgMessageRemove": "此操作不可逆,这将删除所有相关数据。",
|
"orgMessageRemove": "此操作不可逆,这将删除所有相关数据。",
|
||||||
"orgMessageConfirm": "要确认,请在下面输入组织名称。",
|
"orgMessageConfirm": "要确认,请在下面输入组织名称。",
|
||||||
"orgQuestionRemove": "你确定要删除 \"{selectedOrg}\" 组织吗?",
|
"orgQuestionRemove": "您确定要删除组织吗?",
|
||||||
"orgUpdated": "组织已更新",
|
"orgUpdated": "组织已更新",
|
||||||
"orgUpdatedDescription": "组织已更新。",
|
"orgUpdatedDescription": "组织已更新。",
|
||||||
"orgErrorUpdate": "更新组织失败",
|
"orgErrorUpdate": "更新组织失败",
|
||||||
@@ -287,9 +285,8 @@
|
|||||||
"apiKeysAdd": "生成 API 密钥",
|
"apiKeysAdd": "生成 API 密钥",
|
||||||
"apiKeysErrorDelete": "删除 API 密钥出错",
|
"apiKeysErrorDelete": "删除 API 密钥出错",
|
||||||
"apiKeysErrorDeleteMessage": "删除 API 密钥出错",
|
"apiKeysErrorDeleteMessage": "删除 API 密钥出错",
|
||||||
"apiKeysQuestionRemove": "您确定要从组织中删除 \"{selectedApiKey}\" API密钥吗?",
|
"apiKeysQuestionRemove": "您确定要从组织中删除 API 密钥吗?",
|
||||||
"apiKeysMessageRemove": "一旦删除,此API密钥将无法被使用。",
|
"apiKeysMessageRemove": "一旦删除,此API密钥将无法被使用。",
|
||||||
"apiKeysMessageConfirm": "要确认,请在下方输入API密钥名称。",
|
|
||||||
"apiKeysDeleteConfirm": "确认删除 API 密钥",
|
"apiKeysDeleteConfirm": "确认删除 API 密钥",
|
||||||
"apiKeysDelete": "删除 API 密钥",
|
"apiKeysDelete": "删除 API 密钥",
|
||||||
"apiKeysManage": "管理 API 密钥",
|
"apiKeysManage": "管理 API 密钥",
|
||||||
@@ -305,8 +302,7 @@
|
|||||||
"userDeleteConfirm": "确认删除用户",
|
"userDeleteConfirm": "确认删除用户",
|
||||||
"userDeleteServer": "从服务器删除用户",
|
"userDeleteServer": "从服务器删除用户",
|
||||||
"userMessageRemove": "该用户将被从所有组织中删除并完全从服务器中删除。",
|
"userMessageRemove": "该用户将被从所有组织中删除并完全从服务器中删除。",
|
||||||
"userMessageConfirm": "请在下面输入用户名称以确认。",
|
"userQuestionRemove": "您确定要从服务器永久删除用户吗?",
|
||||||
"userQuestionRemove": "您确定要从服务器中永久删除 {selectedUser} 吗?",
|
|
||||||
"licenseKey": "许可证密钥",
|
"licenseKey": "许可证密钥",
|
||||||
"valid": "有效",
|
"valid": "有效",
|
||||||
"numberOfSites": "站点数量",
|
"numberOfSites": "站点数量",
|
||||||
@@ -339,7 +335,7 @@
|
|||||||
"fossorialLicense": "查看Fossorial Commercial License和订阅条款",
|
"fossorialLicense": "查看Fossorial Commercial License和订阅条款",
|
||||||
"licenseMessageRemove": "这将删除许可证密钥和它授予的所有相关权限。",
|
"licenseMessageRemove": "这将删除许可证密钥和它授予的所有相关权限。",
|
||||||
"licenseMessageConfirm": "要确认,请在下面输入许可证密钥。",
|
"licenseMessageConfirm": "要确认,请在下面输入许可证密钥。",
|
||||||
"licenseQuestionRemove": "您确定要删除 {selectedKey} 的邀请吗?",
|
"licenseQuestionRemove": "您确定要删除许可证密钥?",
|
||||||
"licenseKeyDelete": "删除许可证密钥",
|
"licenseKeyDelete": "删除许可证密钥",
|
||||||
"licenseKeyDeleteConfirm": "确认删除许可证密钥",
|
"licenseKeyDeleteConfirm": "确认删除许可证密钥",
|
||||||
"licenseTitle": "管理许可证状态",
|
"licenseTitle": "管理许可证状态",
|
||||||
@@ -372,7 +368,7 @@
|
|||||||
"inviteRemoveErrorDescription": "删除邀请时出错。",
|
"inviteRemoveErrorDescription": "删除邀请时出错。",
|
||||||
"inviteRemoved": "邀请已删除",
|
"inviteRemoved": "邀请已删除",
|
||||||
"inviteRemovedDescription": "为 {email} 创建的邀请已删除",
|
"inviteRemovedDescription": "为 {email} 创建的邀请已删除",
|
||||||
"inviteQuestionRemove": "您确定要删除 {email} 的邀请吗?",
|
"inviteQuestionRemove": "您确定要删除邀请吗?",
|
||||||
"inviteMessageRemove": "一旦删除,这个邀请将不再有效。",
|
"inviteMessageRemove": "一旦删除,这个邀请将不再有效。",
|
||||||
"inviteMessageConfirm": "要确认,请在下面输入邀请的电子邮件地址。",
|
"inviteMessageConfirm": "要确认,请在下面输入邀请的电子邮件地址。",
|
||||||
"inviteQuestionRegenerate": "您确定要重新邀请 {email} 吗?这将会撤销掉之前的邀请",
|
"inviteQuestionRegenerate": "您确定要重新邀请 {email} 吗?这将会撤销掉之前的邀请",
|
||||||
@@ -398,9 +394,8 @@
|
|||||||
"userErrorOrgRemoveDescription": "删除用户时出错。",
|
"userErrorOrgRemoveDescription": "删除用户时出错。",
|
||||||
"userOrgRemoved": "用户已删除",
|
"userOrgRemoved": "用户已删除",
|
||||||
"userOrgRemovedDescription": "已将 {email} 从组织中移除。",
|
"userOrgRemovedDescription": "已将 {email} 从组织中移除。",
|
||||||
"userQuestionOrgRemove": "你确定要将 {email} 从组织中移除吗?",
|
"userQuestionOrgRemove": "您确定要从组织中删除此用户吗?",
|
||||||
"userMessageOrgRemove": "一旦删除,这个用户将不再能够访问组织。 你总是可以稍后重新邀请他们,但他们需要再次接受邀请。",
|
"userMessageOrgRemove": "一旦删除,这个用户将不再能够访问组织。 你总是可以稍后重新邀请他们,但他们需要再次接受邀请。",
|
||||||
"userMessageOrgConfirm": "请在下面输入用户名称以确认。",
|
|
||||||
"userRemoveOrgConfirm": "确认删除用户",
|
"userRemoveOrgConfirm": "确认删除用户",
|
||||||
"userRemoveOrg": "从组织中删除用户",
|
"userRemoveOrg": "从组织中删除用户",
|
||||||
"users": "用户",
|
"users": "用户",
|
||||||
@@ -730,7 +725,7 @@
|
|||||||
"pangolinServerAdmin": "服务器管理员 - Pangolin",
|
"pangolinServerAdmin": "服务器管理员 - Pangolin",
|
||||||
"licenseTierProfessional": "专业许可证",
|
"licenseTierProfessional": "专业许可证",
|
||||||
"licenseTierEnterprise": "企业许可证",
|
"licenseTierEnterprise": "企业许可证",
|
||||||
"licenseTierPersonal": "Personal License",
|
"licenseTierPersonal": "个人许可证",
|
||||||
"licensed": "已授权",
|
"licensed": "已授权",
|
||||||
"yes": "是",
|
"yes": "是",
|
||||||
"no": "否",
|
"no": "否",
|
||||||
@@ -742,7 +737,7 @@
|
|||||||
"idpManageDescription": "查看和管理系统中的身份提供商",
|
"idpManageDescription": "查看和管理系统中的身份提供商",
|
||||||
"idpDeletedDescription": "身份提供商删除成功",
|
"idpDeletedDescription": "身份提供商删除成功",
|
||||||
"idpOidc": "OAuth2/OIDC",
|
"idpOidc": "OAuth2/OIDC",
|
||||||
"idpQuestionRemove": "你确定要永久删除 \"{name}\" 这个身份提供商吗?",
|
"idpQuestionRemove": "您确定要永久删除身份提供者吗?",
|
||||||
"idpMessageRemove": "这将删除身份提供者和所有相关的配置。通过此提供者进行身份验证的用户将无法登录。",
|
"idpMessageRemove": "这将删除身份提供者和所有相关的配置。通过此提供者进行身份验证的用户将无法登录。",
|
||||||
"idpMessageConfirm": "要确认,请在下面输入身份提供者的名称。",
|
"idpMessageConfirm": "要确认,请在下面输入身份提供者的名称。",
|
||||||
"idpConfirmDelete": "确认删除身份提供商",
|
"idpConfirmDelete": "确认删除身份提供商",
|
||||||
@@ -916,6 +911,18 @@
|
|||||||
"passwordResetCodeDescription": "请检查您的电子邮件以获取验证码。",
|
"passwordResetCodeDescription": "请检查您的电子邮件以获取验证码。",
|
||||||
"passwordNew": "新密码",
|
"passwordNew": "新密码",
|
||||||
"passwordNewConfirm": "确认新密码",
|
"passwordNewConfirm": "确认新密码",
|
||||||
|
"changePassword": "更改密码",
|
||||||
|
"changePasswordDescription": "更新您的帐户密码",
|
||||||
|
"oldPassword": "当前密码",
|
||||||
|
"newPassword": "新密码",
|
||||||
|
"confirmNewPassword": "确认新密码",
|
||||||
|
"changePasswordError": "更改密码失败",
|
||||||
|
"changePasswordErrorDescription": "更改您的密码时出错",
|
||||||
|
"changePasswordSuccess": "密码修改成功",
|
||||||
|
"changePasswordSuccessDescription": "您的密码已成功更新",
|
||||||
|
"passwordExpiryRequired": "需要密码过期",
|
||||||
|
"passwordExpiryDescription": "该机构要求您每 {maxDays} 天更改一次密码。",
|
||||||
|
"changePasswordNow": "现在更改密码",
|
||||||
"pincodeAuth": "验证器代码",
|
"pincodeAuth": "验证器代码",
|
||||||
"pincodeSubmit2": "提交代码",
|
"pincodeSubmit2": "提交代码",
|
||||||
"passwordResetSubmit": "请求重置",
|
"passwordResetSubmit": "请求重置",
|
||||||
@@ -1154,8 +1161,27 @@
|
|||||||
"sidebarAllUsers": "所有用户",
|
"sidebarAllUsers": "所有用户",
|
||||||
"sidebarIdentityProviders": "身份提供商",
|
"sidebarIdentityProviders": "身份提供商",
|
||||||
"sidebarLicense": "证书",
|
"sidebarLicense": "证书",
|
||||||
"sidebarClients": "Clients",
|
"sidebarClients": "客户端",
|
||||||
"sidebarDomains": "域",
|
"sidebarDomains": "域",
|
||||||
|
"sidebarBluePrints": "蓝图",
|
||||||
|
"blueprints": "蓝图",
|
||||||
|
"blueprintsDescription": "蓝图是用于定义资源及其设置的 YAML 声明配置",
|
||||||
|
"blueprintAdd": "添加蓝图",
|
||||||
|
"blueprintGoBack": "查看所有蓝图",
|
||||||
|
"blueprintCreate": "创建蓝图",
|
||||||
|
"blueprintCreateDescription2": "按照下面的步骤创建和应用新的蓝图",
|
||||||
|
"blueprintDetails": "蓝图详细信息",
|
||||||
|
"blueprintDetailsDescription": "查看蓝图运行详情",
|
||||||
|
"blueprintInfo": "蓝图信息",
|
||||||
|
"message": "留言",
|
||||||
|
"blueprintContentsDescription": "定义描述您基础设施的 YAML 内容",
|
||||||
|
"blueprintErrorCreateDescription": "应用蓝图时出错",
|
||||||
|
"blueprintErrorCreate": "创建蓝图时出错",
|
||||||
|
"searchBlueprintProgress": "搜索蓝图...",
|
||||||
|
"appliedAt": "应用于",
|
||||||
|
"source": "来源",
|
||||||
|
"contents": "目录",
|
||||||
|
"parsedContents": "解析内容",
|
||||||
"enableDockerSocket": "启用 Docker 蓝图",
|
"enableDockerSocket": "启用 Docker 蓝图",
|
||||||
"enableDockerSocketDescription": "启用 Docker Socket 标签擦除蓝图标签。套接字路径必须提供给新的。",
|
"enableDockerSocketDescription": "启用 Docker Socket 标签擦除蓝图标签。套接字路径必须提供给新的。",
|
||||||
"enableDockerSocketLink": "了解更多",
|
"enableDockerSocketLink": "了解更多",
|
||||||
@@ -1211,9 +1237,8 @@
|
|||||||
"domainCreate": "创建域",
|
"domainCreate": "创建域",
|
||||||
"domainCreatedDescription": "域创建成功",
|
"domainCreatedDescription": "域创建成功",
|
||||||
"domainDeletedDescription": "成功删除域",
|
"domainDeletedDescription": "成功删除域",
|
||||||
"domainQuestionRemove": "您确定要从您的账户中移除域{domain}吗?",
|
"domainQuestionRemove": "您确定要从您的帐户中删除域名吗?",
|
||||||
"domainMessageRemove": "移除后,该域将不再与您的账户关联。",
|
"domainMessageRemove": "移除后,该域将不再与您的账户关联。",
|
||||||
"domainMessageConfirm": "要确认,请在下方输入域名。",
|
|
||||||
"domainConfirmDelete": "确认删除域",
|
"domainConfirmDelete": "确认删除域",
|
||||||
"domainDelete": "删除域",
|
"domainDelete": "删除域",
|
||||||
"domain": "域",
|
"domain": "域",
|
||||||
@@ -1280,7 +1305,7 @@
|
|||||||
"billingFreeTier": "免费层",
|
"billingFreeTier": "免费层",
|
||||||
"billingWarningOverLimit": "警告:您已超出一个或多个使用限制。在您修改订阅或调整使用情况之前,您的站点将无法连接。",
|
"billingWarningOverLimit": "警告:您已超出一个或多个使用限制。在您修改订阅或调整使用情况之前,您的站点将无法连接。",
|
||||||
"billingUsageLimitsOverview": "使用限制概览",
|
"billingUsageLimitsOverview": "使用限制概览",
|
||||||
"billingMonitorUsage": "监控您的使用情况以对比已配置的限制。如需提高限制请联系我们 support@fossorial.io。",
|
"billingMonitorUsage": "监控您的使用情况以对比已配置的限制。如需提高限制请联系我们 support@pangolin.net。",
|
||||||
"billingDataUsage": "数据使用情况",
|
"billingDataUsage": "数据使用情况",
|
||||||
"billingOnlineTime": "站点在线时间",
|
"billingOnlineTime": "站点在线时间",
|
||||||
"billingUsers": "活跃用户",
|
"billingUsers": "活跃用户",
|
||||||
@@ -1346,6 +1371,19 @@
|
|||||||
"securityKeyUnknownError": "使用安全密钥时出现问题。请再试一次。",
|
"securityKeyUnknownError": "使用安全密钥时出现问题。请再试一次。",
|
||||||
"twoFactorRequired": "注册安全密钥需要两步验证。",
|
"twoFactorRequired": "注册安全密钥需要两步验证。",
|
||||||
"twoFactor": "两步验证",
|
"twoFactor": "两步验证",
|
||||||
|
"twoFactorAuthentication": "两步验证",
|
||||||
|
"twoFactorDescription": "这个组织需要双重身份验证。",
|
||||||
|
"enableTwoFactor": "启用两步验证",
|
||||||
|
"organizationSecurityPolicy": "组织安全政策",
|
||||||
|
"organizationSecurityPolicyDescription": "此机构拥有安全要求,您必须先满足才能访问",
|
||||||
|
"securityRequirements": "安全要求",
|
||||||
|
"allRequirementsMet": "已满足所有要求",
|
||||||
|
"completeRequirementsToContinue": "完成下面的要求以继续访问此组织",
|
||||||
|
"youCanNowAccessOrganization": "您现在可以访问此组织",
|
||||||
|
"reauthenticationRequired": "会话长度",
|
||||||
|
"reauthenticationDescription": "该机构要求您每 {maxDays} 天登录一次。",
|
||||||
|
"reauthenticationDescriptionHours": "该机构要求您每 {maxHours} 小时登录一次。",
|
||||||
|
"reauthenticateNow": "再次登录",
|
||||||
"adminEnabled2FaOnYourAccount": "管理员已为{email}启用两步验证。请完成设置以继续。",
|
"adminEnabled2FaOnYourAccount": "管理员已为{email}启用两步验证。请完成设置以继续。",
|
||||||
"securityKeyAdd": "添加安全密钥",
|
"securityKeyAdd": "添加安全密钥",
|
||||||
"securityKeyRegisterTitle": "注册新安全密钥",
|
"securityKeyRegisterTitle": "注册新安全密钥",
|
||||||
@@ -1558,14 +1596,13 @@
|
|||||||
"autoLoginErrorNoRedirectUrl": "未从身份提供商收到重定向URL。",
|
"autoLoginErrorNoRedirectUrl": "未从身份提供商收到重定向URL。",
|
||||||
"autoLoginErrorGeneratingUrl": "生成身份验证URL失败。",
|
"autoLoginErrorGeneratingUrl": "生成身份验证URL失败。",
|
||||||
"remoteExitNodeManageRemoteExitNodes": "远程节点",
|
"remoteExitNodeManageRemoteExitNodes": "远程节点",
|
||||||
"remoteExitNodeDescription": "Self-host one or more remote nodes to extend your network connectivity and reduce reliance on the cloud",
|
"remoteExitNodeDescription": "自我主机一个或多个远程节点来扩展您的网络连接并减少对云的依赖性",
|
||||||
"remoteExitNodes": "节点",
|
"remoteExitNodes": "节点",
|
||||||
"searchRemoteExitNodes": "搜索节点...",
|
"searchRemoteExitNodes": "搜索节点...",
|
||||||
"remoteExitNodeAdd": "添加节点",
|
"remoteExitNodeAdd": "添加节点",
|
||||||
"remoteExitNodeErrorDelete": "删除节点时出错",
|
"remoteExitNodeErrorDelete": "删除节点时出错",
|
||||||
"remoteExitNodeQuestionRemove": "您确定要从组织中删除 {selectedNode} 节点吗?",
|
"remoteExitNodeQuestionRemove": "您确定要从组织中删除该节点吗?",
|
||||||
"remoteExitNodeMessageRemove": "一旦删除,该节点将不再能够访问。",
|
"remoteExitNodeMessageRemove": "一旦删除,该节点将不再能够访问。",
|
||||||
"remoteExitNodeMessageConfirm": "要确认,请输入以下节点的名称。",
|
|
||||||
"remoteExitNodeConfirmDelete": "确认删除节点",
|
"remoteExitNodeConfirmDelete": "确认删除节点",
|
||||||
"remoteExitNodeDelete": "删除节点",
|
"remoteExitNodeDelete": "删除节点",
|
||||||
"sidebarRemoteExitNodes": "远程节点",
|
"sidebarRemoteExitNodes": "远程节点",
|
||||||
@@ -1733,7 +1770,49 @@
|
|||||||
"resourceExposePortsEditFile": "编辑文件:docker-compose.yml",
|
"resourceExposePortsEditFile": "编辑文件:docker-compose.yml",
|
||||||
"emailVerificationRequired": "需要电子邮件验证。 请通过 {dashboardUrl}/auth/login 再次登录以完成此步骤。 然后,回到这里。",
|
"emailVerificationRequired": "需要电子邮件验证。 请通过 {dashboardUrl}/auth/login 再次登录以完成此步骤。 然后,回到这里。",
|
||||||
"twoFactorSetupRequired": "需要设置双因素身份验证。 请通过 {dashboardUrl}/auth/login 再次登录以完成此步骤。 然后,回到这里。",
|
"twoFactorSetupRequired": "需要设置双因素身份验证。 请通过 {dashboardUrl}/auth/login 再次登录以完成此步骤。 然后,回到这里。",
|
||||||
|
"additionalSecurityRequired": "需要额外的安全",
|
||||||
|
"organizationRequiresAdditionalSteps": "这个组织需要额外的安全步骤才能访问资源。",
|
||||||
|
"completeTheseSteps": "完成这些步骤",
|
||||||
|
"enableTwoFactorAuthentication": "启用两步验证",
|
||||||
|
"completeSecuritySteps": "完成安全步骤",
|
||||||
|
"securitySettings": "安全设置",
|
||||||
|
"securitySettingsDescription": "配置您组织的安全策略",
|
||||||
|
"requireTwoFactorForAllUsers": "所有用户需要两步验证",
|
||||||
|
"requireTwoFactorDescription": "如果启用,此组织的所有内部用户必须启用双重身份验证才能访问组织。",
|
||||||
|
"requireTwoFactorDisabledDescription": "此功能需要有效的许可证(企业)或活动订阅(SaS)",
|
||||||
|
"requireTwoFactorCannotEnableDescription": "您必须为您的帐户启用双重身份验证才能对所有用户",
|
||||||
|
"maxSessionLength": "最大会话长度",
|
||||||
|
"maxSessionLengthDescription": "设置用户会话的最长时间。此后用户需要重新验证。",
|
||||||
|
"maxSessionLengthDisabledDescription": "此功能需要有效的许可证(企业)或活动订阅(SaS)",
|
||||||
|
"selectSessionLength": "选择会话长度",
|
||||||
|
"unenforced": "未执行",
|
||||||
|
"1Hour": "1 小时",
|
||||||
|
"3Hours": "3 小时",
|
||||||
|
"6Hours": "6 小时",
|
||||||
|
"12Hours": "12 小时",
|
||||||
|
"1DaySession": "1天",
|
||||||
|
"3Days": "3 天",
|
||||||
|
"7Days": "7 天",
|
||||||
|
"14Days": "14 天",
|
||||||
|
"30DaysSession": "30 天",
|
||||||
|
"90DaysSession": "90 天",
|
||||||
|
"180DaysSession": "180天",
|
||||||
|
"passwordExpiryDays": "密码过期",
|
||||||
|
"editPasswordExpiryDescription": "设置用户需要更改密码之前的天数。",
|
||||||
|
"selectPasswordExpiry": "选择密码过期",
|
||||||
|
"30Days": "30 天",
|
||||||
|
"1Day": "1天",
|
||||||
|
"60Days": "60天",
|
||||||
|
"90Days": "90 天",
|
||||||
|
"180Days": "180天",
|
||||||
|
"1Year": "1 年",
|
||||||
|
"subscriptionBadge": "需要订阅",
|
||||||
|
"securityPolicyChangeWarning": "安全政策更改警告",
|
||||||
|
"securityPolicyChangeDescription": "您即将更改安全政策设置。保存后,您可能需要重新认证以遵守这些政策更新。 所有不符合要求的用户也需要重新认证。",
|
||||||
|
"securityPolicyChangeConfirmMessage": "我确认",
|
||||||
|
"securityPolicyChangeWarningText": "这将影响组织中的所有用户",
|
||||||
"authPageErrorUpdateMessage": "更新身份验证页面设置时出错",
|
"authPageErrorUpdateMessage": "更新身份验证页面设置时出错",
|
||||||
|
"authPageErrorUpdate": "无法更新认证页面",
|
||||||
"authPageUpdated": "身份验证页面更新成功",
|
"authPageUpdated": "身份验证页面更新成功",
|
||||||
"healthCheckNotAvailable": "本地的",
|
"healthCheckNotAvailable": "本地的",
|
||||||
"rewritePath": "重写路径",
|
"rewritePath": "重写路径",
|
||||||
@@ -1745,153 +1824,261 @@
|
|||||||
"resourceHeaderAuthRemoveDescription": "已成功删除头部身份验证。",
|
"resourceHeaderAuthRemoveDescription": "已成功删除头部身份验证。",
|
||||||
"resourceErrorHeaderAuthRemove": "删除头部身份验证失败",
|
"resourceErrorHeaderAuthRemove": "删除头部身份验证失败",
|
||||||
"resourceErrorHeaderAuthRemoveDescription": "无法删除资源的头部身份验证。",
|
"resourceErrorHeaderAuthRemoveDescription": "无法删除资源的头部身份验证。",
|
||||||
"resourceHeaderAuthProtectionEnabled": "Header Authentication Enabled",
|
"resourceHeaderAuthProtectionEnabled": "头部认证已启用",
|
||||||
"resourceHeaderAuthProtectionDisabled": "Header Authentication Disabled",
|
"resourceHeaderAuthProtectionDisabled": "头部身份验证已禁用",
|
||||||
"headerAuthRemove": "Remove Header Auth",
|
"headerAuthRemove": "删除头部认证",
|
||||||
"headerAuthAdd": "Add Header Auth",
|
"headerAuthAdd": "添加页眉认证",
|
||||||
"resourceErrorHeaderAuthSetup": "设置页眉认证失败",
|
"resourceErrorHeaderAuthSetup": "设置页眉认证失败",
|
||||||
"resourceErrorHeaderAuthSetupDescription": "无法设置资源的头部身份验证。",
|
"resourceErrorHeaderAuthSetupDescription": "无法设置资源的头部身份验证。",
|
||||||
"resourceHeaderAuthSetup": "头部认证设置成功",
|
"resourceHeaderAuthSetup": "头部认证设置成功",
|
||||||
"resourceHeaderAuthSetupDescription": "头部认证已成功设置。",
|
"resourceHeaderAuthSetupDescription": "头部认证已成功设置。",
|
||||||
"resourceHeaderAuthSetupTitle": "设置头部身份验证",
|
"resourceHeaderAuthSetupTitle": "设置头部身份验证",
|
||||||
"resourceHeaderAuthSetupTitleDescription": "Set the basic auth credentials (username and password) to protect this resource with HTTP Header Authentication. Access it using the format https://username:password@resource.example.com",
|
"resourceHeaderAuthSetupTitleDescription": "使用HTTP 头身份验证来设置基本身份验证信息(用户名和密码)。使用 https://username:password@resource.example.com 访问它",
|
||||||
"resourceHeaderAuthSubmit": "设置头部身份验证",
|
"resourceHeaderAuthSubmit": "设置头部身份验证",
|
||||||
"actionSetResourceHeaderAuth": "设置头部身份验证",
|
"actionSetResourceHeaderAuth": "设置头部身份验证",
|
||||||
"enterpriseEdition": "Enterprise Edition",
|
"enterpriseEdition": "企业版",
|
||||||
"unlicensed": "Unlicensed",
|
"unlicensed": "未授权",
|
||||||
"beta": "Beta",
|
"beta": "测试版",
|
||||||
"manageClients": "Manage Clients",
|
"manageClients": "管理客户端",
|
||||||
"manageClientsDescription": "Clients are devices that can connect to your sites",
|
"manageClientsDescription": "客户端是可以连接到您的站点的设备",
|
||||||
"licenseTableValidUntil": "Valid Until",
|
"licenseTableValidUntil": "有效期至",
|
||||||
"saasLicenseKeysSettingsTitle": "Enterprise Licenses",
|
"saasLicenseKeysSettingsTitle": "企业许可证",
|
||||||
"saasLicenseKeysSettingsDescription": "Generate and manage Enterprise license keys for self-hosted Pangolin instances",
|
"saasLicenseKeysSettingsDescription": "为自我托管的 Pangolin 实例生成和管理企业许可证密钥",
|
||||||
"sidebarEnterpriseLicenses": "Licenses",
|
"sidebarEnterpriseLicenses": "许可协议",
|
||||||
"generateLicenseKey": "Generate License Key",
|
"generateLicenseKey": "生成许可证密钥",
|
||||||
"generateLicenseKeyForm": {
|
"generateLicenseKeyForm": {
|
||||||
"validation": {
|
"validation": {
|
||||||
"emailRequired": "Please enter a valid email address",
|
"emailRequired": "请输入一个有效的电子邮件地址",
|
||||||
"useCaseTypeRequired": "Please select a use case type",
|
"useCaseTypeRequired": "请选择一个使用的案例类型",
|
||||||
"firstNameRequired": "First name is required",
|
"firstNameRequired": "必填名",
|
||||||
"lastNameRequired": "Last name is required",
|
"lastNameRequired": "姓氏是必填项",
|
||||||
"primaryUseRequired": "Please describe your primary use",
|
"primaryUseRequired": "请描述您的主要使用",
|
||||||
"jobTitleRequiredBusiness": "Job title is required for business use",
|
"jobTitleRequiredBusiness": "企业使用必须有职位头衔。",
|
||||||
"industryRequiredBusiness": "Industry is required for business use",
|
"industryRequiredBusiness": "商业使用需要工业",
|
||||||
"stateProvinceRegionRequired": "State/Province/Region is required",
|
"stateProvinceRegionRequired": "州/省/地区是必填项",
|
||||||
"postalZipCodeRequired": "Postal/ZIP Code is required",
|
"postalZipCodeRequired": "邮政编码是必需的",
|
||||||
"companyNameRequiredBusiness": "Company name is required for business use",
|
"companyNameRequiredBusiness": "企业使用需要公司名称",
|
||||||
"countryOfResidenceRequiredBusiness": "Country of residence is required for business use",
|
"countryOfResidenceRequiredBusiness": "商业使用必须是居住国",
|
||||||
"countryRequiredPersonal": "Country is required for personal use",
|
"countryRequiredPersonal": "国家需要个人使用",
|
||||||
"agreeToTermsRequired": "You must agree to the terms",
|
"agreeToTermsRequired": "您必须同意条款",
|
||||||
"complianceConfirmationRequired": "You must confirm compliance with the Fossorial Commercial License"
|
"complianceConfirmationRequired": "您必须确认遵守Fossorial Commercial License"
|
||||||
},
|
},
|
||||||
"useCaseOptions": {
|
"useCaseOptions": {
|
||||||
"personal": {
|
"personal": {
|
||||||
"title": "Personal Use",
|
"title": "个人使用",
|
||||||
"description": "For individual, non-commercial use such as learning, personal projects, or experimentation."
|
"description": "个人非商业用途,如学习、个人项目或实验。"
|
||||||
},
|
},
|
||||||
"business": {
|
"business": {
|
||||||
"title": "Business Use",
|
"title": "商业使用",
|
||||||
"description": "For use within organizations, companies, or commercial or revenue-generating activities."
|
"description": "供组织、公司或商业或创收活动使用。"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"steps": {
|
"steps": {
|
||||||
"emailLicenseType": {
|
"emailLicenseType": {
|
||||||
"title": "Email & License Type",
|
"title": "电子邮件和许可证类型",
|
||||||
"description": "Enter your email and choose your license type"
|
"description": "输入您的电子邮件并选择您的许可证类型"
|
||||||
},
|
},
|
||||||
"personalInformation": {
|
"personalInformation": {
|
||||||
"title": "Personal Information",
|
"title": "个人信息",
|
||||||
"description": "Tell us about yourself"
|
"description": "告诉我们自己的信息"
|
||||||
},
|
},
|
||||||
"contactInformation": {
|
"contactInformation": {
|
||||||
"title": "Contact Information",
|
"title": "联系信息",
|
||||||
"description": "Your contact details"
|
"description": "您的联系信息"
|
||||||
},
|
},
|
||||||
"termsGenerate": {
|
"termsGenerate": {
|
||||||
"title": "Terms & Generate",
|
"title": "条款并生成",
|
||||||
"description": "Review and accept terms to generate your license"
|
"description": "审阅并接受条款生成您的许可证"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"alerts": {
|
"alerts": {
|
||||||
"commercialUseDisclosure": {
|
"commercialUseDisclosure": {
|
||||||
"title": "Usage Disclosure",
|
"title": "使用情况披露",
|
||||||
"description": "Select the license tier that accurately reflects your intended use. The Personal License permits free use of the Software for individual, non-commercial or small-scale commercial activities with annual gross revenue under $100,000 USD. Any use beyond these limits — including use within a business, organization, or other revenue-generating environment — requires a valid Enterprise License and payment of the applicable licensing fee. All users, whether Personal or Enterprise, must comply with the Fossorial Commercial License Terms."
|
"description": "选择能准确反映您预定用途的许可等级。 个人许可证允许对个人、非商业性或小型商业活动免费使用软件,年收入毛额不到100 000美元。 超出这些限度的任何用途,包括在企业、组织内的用途。 或其他创收环境——需要有效的企业许可证和支付适用的许可证费用。 所有用户,不论是个人还是企业,都必须遵守寄养商业许可证条款。"
|
||||||
},
|
},
|
||||||
"trialPeriodInformation": {
|
"trialPeriodInformation": {
|
||||||
"title": "Trial Period Information",
|
"title": "试用期信息",
|
||||||
"description": "This License Key enables Enterprise features for a 7-day evaluation period. Continued access to Paid Features beyond the evaluation period requires activation under a valid Personal or Enterprise License. For Enterprise licensing, contact sales@fossorial.io."
|
"description": "此许可证密钥使企业特性能够持续7天的评价。 在评估期过后继续访问付费功能需要在有效的个人或企业许可证下激活。对于企业许可证,请联系Sales@pangolin.net。"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"form": {
|
"form": {
|
||||||
"useCaseQuestion": "Are you using Pangolin for personal or business use?",
|
"useCaseQuestion": "您是否正在使用 Pangolin 进行个人或商业使用?",
|
||||||
"firstName": "First Name",
|
"firstName": "名字",
|
||||||
"lastName": "Last Name",
|
"lastName": "名字",
|
||||||
"jobTitle": "Job Title",
|
"jobTitle": "工作头衔:",
|
||||||
"primaryUseQuestion": "What do you primarily plan to use Pangolin for?",
|
"primaryUseQuestion": "您主要计划使用 Pangolin 吗?",
|
||||||
"industryQuestion": "What is your industry?",
|
"industryQuestion": "您的行业是什么?",
|
||||||
"prospectiveUsersQuestion": "How many prospective users do you expect to have?",
|
"prospectiveUsersQuestion": "您期望有多少预期用户?",
|
||||||
"prospectiveSitesQuestion": "How many prospective sites (tunnels) do you expect to have?",
|
"prospectiveSitesQuestion": "您期望有多少站点(隧道)?",
|
||||||
"companyName": "Company name",
|
"companyName": "公司名称",
|
||||||
"countryOfResidence": "Country of residence",
|
"countryOfResidence": "居住国",
|
||||||
"stateProvinceRegion": "State / Province / Region",
|
"stateProvinceRegion": "州/省/地区",
|
||||||
"postalZipCode": "Postal / ZIP Code",
|
"postalZipCode": "邮政编码",
|
||||||
"companyWebsite": "Company website",
|
"companyWebsite": "公司网站",
|
||||||
"companyPhoneNumber": "Company phone number",
|
"companyPhoneNumber": "公司电话号码",
|
||||||
"country": "Country",
|
"country": "国家",
|
||||||
"phoneNumberOptional": "Phone number (optional)",
|
"phoneNumberOptional": "电话号码 (可选)",
|
||||||
"complianceConfirmation": "I confirm that I am in compliance with the Fossorial Commercial License and that reporting inaccurate information or misidentifying use of the product is a violation of the license."
|
"complianceConfirmation": "我确认我提供的资料是准确的,我遵守了寄养商业许可证。 报告不准确的信息或错误的产品使用是违反许可证的行为,可能导致您的密钥被撤销。"
|
||||||
},
|
},
|
||||||
"buttons": {
|
"buttons": {
|
||||||
"close": "Close",
|
"close": "关闭",
|
||||||
"previous": "Previous",
|
"previous": "上一个",
|
||||||
"next": "Next",
|
"next": "下一个",
|
||||||
"generateLicenseKey": "Generate License Key"
|
"generateLicenseKey": "生成许可证密钥"
|
||||||
},
|
},
|
||||||
"toasts": {
|
"toasts": {
|
||||||
"success": {
|
"success": {
|
||||||
"title": "License key generated successfully",
|
"title": "许可证密钥生成成功",
|
||||||
"description": "Your license key has been generated and is ready to use."
|
"description": "您的许可证密钥已经生成并准备使用。"
|
||||||
},
|
},
|
||||||
"error": {
|
"error": {
|
||||||
"title": "Failed to generate license key",
|
"title": "生成许可证密钥失败",
|
||||||
"description": "An error occurred while generating the license key."
|
"description": "生成许可证密钥时出错。"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"priority": "优先权",
|
"priority": "优先权",
|
||||||
"priorityDescription": "先评估更高优先级线路。优先级 = 100意味着自动排序(系统决定). 使用另一个数字强制执行手动优先级。",
|
"priorityDescription": "先评估更高优先级线路。优先级 = 100意味着自动排序(系统决定). 使用另一个数字强制执行手动优先级。",
|
||||||
"instanceName": "Instance Name",
|
"instanceName": "实例名称",
|
||||||
"pathMatchModalTitle": "Configure Path Matching",
|
"pathMatchModalTitle": "配置路径匹配",
|
||||||
"pathMatchModalDescription": "Set up how incoming requests should be matched based on their path.",
|
"pathMatchModalDescription": "根据传入请求的路径设置匹配方式。",
|
||||||
"pathMatchType": "Match Type",
|
"pathMatchType": "匹配类型",
|
||||||
"pathMatchPrefix": "Prefix",
|
"pathMatchPrefix": "前缀",
|
||||||
"pathMatchExact": "Exact",
|
"pathMatchExact": "精准的",
|
||||||
"pathMatchRegex": "Regex",
|
"pathMatchRegex": "正则表达式",
|
||||||
"pathMatchValue": "Path Value",
|
"pathMatchValue": "路径值",
|
||||||
"clear": "Clear",
|
"clear": "清空",
|
||||||
"saveChanges": "Save Changes",
|
"saveChanges": "保存更改",
|
||||||
"pathMatchRegexPlaceholder": "^/api/.*",
|
"pathMatchRegexPlaceholder": "^/api/.*",
|
||||||
"pathMatchDefaultPlaceholder": "/path",
|
"pathMatchDefaultPlaceholder": "/路径",
|
||||||
"pathMatchPrefixHelp": "Example: /api matches /api, /api/users, etc.",
|
"pathMatchPrefixHelp": "示例: /api 匹配/api, /api/users 等。",
|
||||||
"pathMatchExactHelp": "Example: /api matches only /api",
|
"pathMatchExactHelp": "示例:/api 匹配仅限/api",
|
||||||
"pathMatchRegexHelp": "Example: ^/api/.* matches /api/anything",
|
"pathMatchRegexHelp": "例如:^/api/.* 匹配/api/why",
|
||||||
"pathRewriteModalTitle": "Configure Path Rewriting",
|
"pathRewriteModalTitle": "配置路径重写",
|
||||||
"pathRewriteModalDescription": "Transform the matched path before forwarding to the target.",
|
"pathRewriteModalDescription": "在转发到目标之前变换匹配的路径。",
|
||||||
"pathRewriteType": "Rewrite Type",
|
"pathRewriteType": "重写类型",
|
||||||
"pathRewritePrefixOption": "Prefix - Replace prefix",
|
"pathRewritePrefixOption": "前缀 - 替换前缀",
|
||||||
"pathRewriteExactOption": "Exact - Replace entire path",
|
"pathRewriteExactOption": "精确-替换整个路径",
|
||||||
"pathRewriteRegexOption": "Regex - Pattern replacement",
|
"pathRewriteRegexOption": "正则表达式 - 替换模式",
|
||||||
"pathRewriteStripPrefixOption": "Strip Prefix - Remove prefix",
|
"pathRewriteStripPrefixOption": "删除前缀 - 删除前缀",
|
||||||
"pathRewriteValue": "Rewrite Value",
|
"pathRewriteValue": "重写值",
|
||||||
"pathRewriteRegexPlaceholder": "/new/$1",
|
"pathRewriteRegexPlaceholder": "/new/$1",
|
||||||
"pathRewriteDefaultPlaceholder": "/new-path",
|
"pathRewriteDefaultPlaceholder": "/new-path",
|
||||||
"pathRewritePrefixHelp": "Replace the matched prefix with this value",
|
"pathRewritePrefixHelp": "用此值替换匹配的前缀",
|
||||||
"pathRewriteExactHelp": "Replace the entire path with this value when the path matches exactly",
|
"pathRewriteExactHelp": "当路径匹配时用此值替换整个路径",
|
||||||
"pathRewriteRegexHelp": "Use capture groups like $1, $2 for replacement",
|
"pathRewriteRegexHelp": "使用抓取组,如$1,$2来替换",
|
||||||
"pathRewriteStripPrefixHelp": "Leave empty to strip prefix or provide new prefix",
|
"pathRewriteStripPrefixHelp": "留空以脱离前缀或提供新的前缀",
|
||||||
"pathRewritePrefix": "Prefix",
|
"pathRewritePrefix": "前缀",
|
||||||
"pathRewriteExact": "Exact",
|
"pathRewriteExact": "精准的",
|
||||||
"pathRewriteRegex": "Regex",
|
"pathRewriteRegex": "正则表达式",
|
||||||
"pathRewriteStrip": "Strip",
|
"pathRewriteStrip": "带状图",
|
||||||
"pathRewriteStripLabel": "strip"
|
"pathRewriteStripLabel": "条形图",
|
||||||
|
"sidebarEnableEnterpriseLicense": "启用企业许可证",
|
||||||
|
"cannotbeUndone": "无法撤消。",
|
||||||
|
"toConfirm": "确认",
|
||||||
|
"deleteClientQuestion": "您确定要从站点和组织中删除客户吗?",
|
||||||
|
"clientMessageRemove": "一旦删除,客户端将无法连接到站点。",
|
||||||
|
"sidebarLogs": "日志",
|
||||||
|
"request": "请求",
|
||||||
|
"logs": "日志",
|
||||||
|
"logsSettingsDescription": "监视从此orginization中收集的日志",
|
||||||
|
"searchLogs": "搜索日志...",
|
||||||
|
"action": "行 动",
|
||||||
|
"actor": "执行者",
|
||||||
|
"timestamp": "时间戳",
|
||||||
|
"accessLogs": "访问日志",
|
||||||
|
"exportCsv": "导出CSV",
|
||||||
|
"actorId": "执行者ID",
|
||||||
|
"allowedByRule": "根据规则允许",
|
||||||
|
"allowedNoAuth": "无认证",
|
||||||
|
"validAccessToken": "有效访问令牌",
|
||||||
|
"validHeaderAuth": "Valid header auth",
|
||||||
|
"validPincode": "Valid Pincode",
|
||||||
|
"validPassword": "有效密码",
|
||||||
|
"validEmail": "Valid email",
|
||||||
|
"validSSO": "Valid SSO",
|
||||||
|
"resourceBlocked": "资源被阻止",
|
||||||
|
"droppedByRule": "被规则删除",
|
||||||
|
"noSessions": "无会话",
|
||||||
|
"temporaryRequestToken": "临时请求令牌",
|
||||||
|
"noMoreAuthMethods": "No Valid Auth",
|
||||||
|
"ip": "IP",
|
||||||
|
"reason": "原因",
|
||||||
|
"requestLogs": "请求日志",
|
||||||
|
"host": "主机",
|
||||||
|
"location": "地点",
|
||||||
|
"actionLogs": "操作日志",
|
||||||
|
"sidebarLogsRequest": "请求日志",
|
||||||
|
"sidebarLogsAccess": "访问日志",
|
||||||
|
"sidebarLogsAction": "操作日志",
|
||||||
|
"logRetention": "日志保留",
|
||||||
|
"logRetentionDescription": "管理不同类型的日志为这个机构保留多长时间或禁用这些日志",
|
||||||
|
"requestLogsDescription": "查看此机构资源的详细请求日志",
|
||||||
|
"logRetentionRequestLabel": "请求日志保留",
|
||||||
|
"logRetentionRequestDescription": "保留请求日志的时间",
|
||||||
|
"logRetentionAccessLabel": "访问日志保留",
|
||||||
|
"logRetentionAccessDescription": "保留访问日志的时间",
|
||||||
|
"logRetentionActionLabel": "动作日志保留",
|
||||||
|
"logRetentionActionDescription": "保留操作日志的时间",
|
||||||
|
"logRetentionDisabled": "已禁用",
|
||||||
|
"logRetention3Days": "3 天",
|
||||||
|
"logRetention7Days": "7 天",
|
||||||
|
"logRetention14Days": "14 天",
|
||||||
|
"logRetention30Days": "30 天",
|
||||||
|
"logRetention90Days": "90 天",
|
||||||
|
"logRetentionForever": "永远的",
|
||||||
|
"actionLogsDescription": "查看此机构执行的操作历史",
|
||||||
|
"accessLogsDescription": "查看此机构资源的访问认证请求",
|
||||||
|
"licenseRequiredToUse": "需要企业许可证才能使用此功能。",
|
||||||
|
"certResolver": "证书解决器",
|
||||||
|
"certResolverDescription": "选择用于此资源的证书解析器。",
|
||||||
|
"selectCertResolver": "选择证书解析",
|
||||||
|
"enterCustomResolver": "输入自定义解析器",
|
||||||
|
"preferWildcardCert": "喜欢通配符证书",
|
||||||
|
"unverified": "未验证",
|
||||||
|
"domainSetting": "域设置",
|
||||||
|
"domainSettingDescription": "配置您的域的设置",
|
||||||
|
"preferWildcardCertDescription": "尝试生成通配符证书(需要正确配置的证书解析器)。",
|
||||||
|
"recordName": "记录名称",
|
||||||
|
"auto": "自动操作",
|
||||||
|
"TTL": "TTL",
|
||||||
|
"howToAddRecords": "如何添加记录",
|
||||||
|
"dnsRecord": "DNS记录",
|
||||||
|
"required": "必填",
|
||||||
|
"domainSettingsUpdated": "域设置更新成功",
|
||||||
|
"orgOrDomainIdMissing": "缺少机构或域 ID",
|
||||||
|
"loadingDNSRecords": "正在载入DNS记录...",
|
||||||
|
"olmUpdateAvailableInfo": "有最新版本的 Olm 可用。请更新到最新版本以获取最佳体验。",
|
||||||
|
"client": "客户端:",
|
||||||
|
"proxyProtocol": "代理协议设置",
|
||||||
|
"proxyProtocolDescription": "配置代理协议以保留TCP/UDP 服务的客户端IP地址。",
|
||||||
|
"enableProxyProtocol": "启用代理协议",
|
||||||
|
"proxyProtocolInfo": "为TCP/UDP 后端保留客户端IP地址",
|
||||||
|
"proxyProtocolVersion": "代理协议版本",
|
||||||
|
"version1": " 版本 1 (推荐)",
|
||||||
|
"version2": "版本 2",
|
||||||
|
"versionDescription": "版本 1 是基于文本和广泛支持的版本。版本 2 是二进制和更有效率但不那么兼容。",
|
||||||
|
"warning": "警告",
|
||||||
|
"proxyProtocolWarning": "您的后端应用程序必须配置为接受代理协议连接。如果您的后端不支持代理协议,启用这将会中断所有连接。 请务必从Traefik配置您的后端到信任代理协议标题。",
|
||||||
|
"restarting": "正在重启...",
|
||||||
|
"manual": "手动模式",
|
||||||
|
"messageSupport": "消息支持",
|
||||||
|
"supportNotAvailableTitle": "支持不可用",
|
||||||
|
"supportNotAvailableDescription": "支持现在不可用。您可以发送电子邮件到 support@pangolin.net。",
|
||||||
|
"supportRequestSentTitle": "支持请求已发送",
|
||||||
|
"supportRequestSentDescription": "您的消息已成功发送。",
|
||||||
|
"supportRequestFailedTitle": "发送请求失败",
|
||||||
|
"supportRequestFailedDescription": "发送您的支持请求时出错。",
|
||||||
|
"supportSubjectRequired": "主题是必填项",
|
||||||
|
"supportSubjectMaxLength": "主题必须是255个或更少的字符",
|
||||||
|
"supportMessageRequired": "消息是必填项",
|
||||||
|
"supportReplyTo": "回复给",
|
||||||
|
"supportSubject": "议 题",
|
||||||
|
"supportSubjectPlaceholder": "输入主题",
|
||||||
|
"supportMessage": "留言",
|
||||||
|
"supportMessagePlaceholder": "输入您的消息",
|
||||||
|
"supportSending": "正在发送...",
|
||||||
|
"supportSend": "发送",
|
||||||
|
"supportMessageSent": "消息已发送!",
|
||||||
|
"supportWillContact": "我们很快就会联系起来!"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -7,7 +7,8 @@ const nextConfig = {
|
|||||||
eslint: {
|
eslint: {
|
||||||
ignoreDuringBuilds: true
|
ignoreDuringBuilds: true
|
||||||
},
|
},
|
||||||
output: "standalone"
|
output: "standalone",
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
export default withNextIntl(nextConfig);
|
export default withNextIntl(nextConfig);
|
||||||
|
|||||||
1639
package-lock.json
generated
1639
package-lock.json
generated
File diff suppressed because it is too large
Load Diff
52
package.json
52
package.json
@@ -35,6 +35,7 @@
|
|||||||
"@asteasolutions/zod-to-openapi": "^7.3.4",
|
"@asteasolutions/zod-to-openapi": "^7.3.4",
|
||||||
"@aws-sdk/client-s3": "3.908.0",
|
"@aws-sdk/client-s3": "3.908.0",
|
||||||
"@hookform/resolvers": "5.2.2",
|
"@hookform/resolvers": "5.2.2",
|
||||||
|
"@monaco-editor/react": "^4.7.0",
|
||||||
"@node-rs/argon2": "^2.0.2",
|
"@node-rs/argon2": "^2.0.2",
|
||||||
"@oslojs/crypto": "1.0.1",
|
"@oslojs/crypto": "1.0.1",
|
||||||
"@oslojs/encoding": "1.1.0",
|
"@oslojs/encoding": "1.1.0",
|
||||||
@@ -56,7 +57,7 @@
|
|||||||
"@radix-ui/react-tabs": "1.1.13",
|
"@radix-ui/react-tabs": "1.1.13",
|
||||||
"@radix-ui/react-toast": "1.2.15",
|
"@radix-ui/react-toast": "1.2.15",
|
||||||
"@radix-ui/react-tooltip": "^1.2.8",
|
"@radix-ui/react-tooltip": "^1.2.8",
|
||||||
"@react-email/components": "0.5.6",
|
"@react-email/components": "0.5.7",
|
||||||
"@react-email/render": "^1.3.2",
|
"@react-email/render": "^1.3.2",
|
||||||
"@react-email/tailwind": "1.2.2",
|
"@react-email/tailwind": "1.2.2",
|
||||||
"@simplewebauthn/browser": "^13.2.2",
|
"@simplewebauthn/browser": "^13.2.2",
|
||||||
@@ -66,7 +67,7 @@
|
|||||||
"arctic": "^3.7.0",
|
"arctic": "^3.7.0",
|
||||||
"axios": "^1.12.2",
|
"axios": "^1.12.2",
|
||||||
"better-sqlite3": "11.7.0",
|
"better-sqlite3": "11.7.0",
|
||||||
"canvas-confetti": "1.9.3",
|
"canvas-confetti": "1.9.4",
|
||||||
"class-variance-authority": "^0.7.1",
|
"class-variance-authority": "^0.7.1",
|
||||||
"clsx": "2.1.1",
|
"clsx": "2.1.1",
|
||||||
"cmdk": "1.1.1",
|
"cmdk": "1.1.1",
|
||||||
@@ -75,9 +76,10 @@
|
|||||||
"cookies": "^0.9.1",
|
"cookies": "^0.9.1",
|
||||||
"cors": "2.8.5",
|
"cors": "2.8.5",
|
||||||
"crypto-js": "^4.2.0",
|
"crypto-js": "^4.2.0",
|
||||||
"drizzle-orm": "0.44.6",
|
"date-fns": "4.1.0",
|
||||||
|
"drizzle-orm": "0.44.7",
|
||||||
"eslint": "9.37.0",
|
"eslint": "9.37.0",
|
||||||
"eslint-config-next": "15.5.4",
|
"eslint-config-next": "15.5.6",
|
||||||
"express": "5.1.0",
|
"express": "5.1.0",
|
||||||
"express-rate-limit": "8.1.0",
|
"express-rate-limit": "8.1.0",
|
||||||
"glob": "11.0.3",
|
"glob": "11.0.3",
|
||||||
@@ -85,25 +87,28 @@
|
|||||||
"http-errors": "2.0.0",
|
"http-errors": "2.0.0",
|
||||||
"i": "^0.3.7",
|
"i": "^0.3.7",
|
||||||
"input-otp": "1.4.2",
|
"input-otp": "1.4.2",
|
||||||
"ioredis": "5.8.1",
|
"ioredis": "5.8.2",
|
||||||
"jmespath": "^0.16.0",
|
"jmespath": "^0.16.0",
|
||||||
"js-yaml": "4.1.0",
|
"js-yaml": "4.1.0",
|
||||||
"jsonwebtoken": "^9.0.2",
|
"jsonwebtoken": "^9.0.2",
|
||||||
"lucide-react": "^0.545.0",
|
"lucide-react": "^0.545.0",
|
||||||
"maxmind": "5.0.0",
|
"maxmind": "5.0.0",
|
||||||
"moment": "2.30.1",
|
"moment": "2.30.1",
|
||||||
"next": "15.5.4",
|
"next": "15.5.6",
|
||||||
"next-intl": "^4.3.12",
|
"next-intl": "^4.3.12",
|
||||||
"next-themes": "0.4.6",
|
"next-themes": "0.4.6",
|
||||||
|
"nextjs-toploader": "^3.9.17",
|
||||||
"node-cache": "5.1.2",
|
"node-cache": "5.1.2",
|
||||||
"node-fetch": "3.3.2",
|
"node-fetch": "3.3.2",
|
||||||
"nodemailer": "7.0.9",
|
"nodemailer": "7.0.10",
|
||||||
"npm": "^11.6.2",
|
"npm": "^11.6.2",
|
||||||
|
"nprogress": "^0.2.0",
|
||||||
"oslo": "1.2.1",
|
"oslo": "1.2.1",
|
||||||
"pg": "^8.16.2",
|
"pg": "^8.16.2",
|
||||||
"posthog-node": "^5.9.5",
|
"posthog-node": "^5.10.4",
|
||||||
"qrcode.react": "4.2.0",
|
"qrcode.react": "4.2.0",
|
||||||
"react": "19.2.0",
|
"react": "19.2.0",
|
||||||
|
"react-day-picker": "9.11.1",
|
||||||
"react-dom": "19.2.0",
|
"react-dom": "19.2.0",
|
||||||
"react-easy-sort": "^1.8.0",
|
"react-easy-sort": "^1.8.0",
|
||||||
"react-hook-form": "7.65.0",
|
"react-hook-form": "7.65.0",
|
||||||
@@ -121,43 +126,46 @@
|
|||||||
"winston": "3.18.3",
|
"winston": "3.18.3",
|
||||||
"winston-daily-rotate-file": "5.0.0",
|
"winston-daily-rotate-file": "5.0.0",
|
||||||
"ws": "8.18.3",
|
"ws": "8.18.3",
|
||||||
|
"yaml": "^2.8.1",
|
||||||
"yargs": "18.0.0",
|
"yargs": "18.0.0",
|
||||||
"zod": "3.25.76",
|
"zod": "3.25.76",
|
||||||
"zod-validation-error": "3.5.2"
|
"zod-validation-error": "3.5.2",
|
||||||
|
"@faker-js/faker": "^10.1.0"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@dotenvx/dotenvx": "1.51.0",
|
"@dotenvx/dotenvx": "1.51.0",
|
||||||
"@esbuild-plugins/tsconfig-paths": "0.1.2",
|
"@esbuild-plugins/tsconfig-paths": "0.1.2",
|
||||||
"@react-email/preview-server": "4.3.0",
|
"@react-email/preview-server": "4.3.2",
|
||||||
"@tailwindcss/postcss": "^4.1.14",
|
"@tailwindcss/postcss": "^4.1.16",
|
||||||
"@types/better-sqlite3": "7.6.12",
|
"@types/better-sqlite3": "7.6.12",
|
||||||
"@types/cookie-parser": "1.4.9",
|
"@types/cookie-parser": "1.4.10",
|
||||||
"@types/cors": "2.8.19",
|
"@types/cors": "2.8.19",
|
||||||
"@types/crypto-js": "^4.2.2",
|
"@types/crypto-js": "^4.2.2",
|
||||||
"@types/express": "5.0.3",
|
"@types/express": "5.0.5",
|
||||||
"@types/express-session": "^1.18.2",
|
"@types/express-session": "^1.18.2",
|
||||||
"@types/jmespath": "^0.15.2",
|
"@types/jmespath": "^0.15.2",
|
||||||
"@types/js-yaml": "4.0.9",
|
"@types/js-yaml": "4.0.9",
|
||||||
"@types/jsonwebtoken": "^9.0.10",
|
"@types/jsonwebtoken": "^9.0.10",
|
||||||
"@types/node": "24.7.2",
|
"@types/nprogress": "^0.2.3",
|
||||||
"@types/nodemailer": "7.0.2",
|
"@types/node": "24.9.2",
|
||||||
"@types/pg": "8.15.5",
|
"@types/nodemailer": "7.0.3",
|
||||||
|
"@types/pg": "8.15.6",
|
||||||
"@types/react": "19.2.2",
|
"@types/react": "19.2.2",
|
||||||
"@types/react-dom": "19.2.1",
|
"@types/react-dom": "19.2.2",
|
||||||
"@types/semver": "^7.7.1",
|
"@types/semver": "^7.7.1",
|
||||||
"@types/swagger-ui-express": "^4.1.8",
|
"@types/swagger-ui-express": "^4.1.8",
|
||||||
"@types/ws": "8.18.1",
|
"@types/ws": "8.18.1",
|
||||||
"@types/yargs": "17.0.33",
|
"@types/yargs": "17.0.34",
|
||||||
"drizzle-kit": "0.31.5",
|
"drizzle-kit": "0.31.6",
|
||||||
"esbuild": "0.25.10",
|
"esbuild": "0.25.11",
|
||||||
"esbuild-node-externals": "1.18.0",
|
"esbuild-node-externals": "1.18.0",
|
||||||
"postcss": "^8",
|
"postcss": "^8",
|
||||||
"react-email": "4.3.0",
|
"react-email": "4.3.2",
|
||||||
"tailwindcss": "^4.1.4",
|
"tailwindcss": "^4.1.4",
|
||||||
"tsc-alias": "1.8.16",
|
"tsc-alias": "1.8.16",
|
||||||
"tsx": "4.20.6",
|
"tsx": "4.20.6",
|
||||||
"typescript": "^5",
|
"typescript": "^5",
|
||||||
"typescript-eslint": "^8.46.0"
|
"typescript-eslint": "^8.46.2"
|
||||||
},
|
},
|
||||||
"overrides": {
|
"overrides": {
|
||||||
"emblor": {
|
"emblor": {
|
||||||
|
|||||||
@@ -81,6 +81,9 @@ export enum ActionsEnum {
|
|||||||
listClients = "listClients",
|
listClients = "listClients",
|
||||||
getClient = "getClient",
|
getClient = "getClient",
|
||||||
listOrgDomains = "listOrgDomains",
|
listOrgDomains = "listOrgDomains",
|
||||||
|
getDomain = "getDomain",
|
||||||
|
updateOrgDomain = "updateOrgDomain",
|
||||||
|
getDNSRecords = "getDNSRecords",
|
||||||
createNewt = "createNewt",
|
createNewt = "createNewt",
|
||||||
createIdp = "createIdp",
|
createIdp = "createIdp",
|
||||||
updateIdp = "updateIdp",
|
updateIdp = "updateIdp",
|
||||||
@@ -116,7 +119,11 @@ export enum ActionsEnum {
|
|||||||
updateLoginPage = "updateLoginPage",
|
updateLoginPage = "updateLoginPage",
|
||||||
getLoginPage = "getLoginPage",
|
getLoginPage = "getLoginPage",
|
||||||
deleteLoginPage = "deleteLoginPage",
|
deleteLoginPage = "deleteLoginPage",
|
||||||
applyBlueprint = "applyBlueprint"
|
listBlueprints = "listBlueprints",
|
||||||
|
getBlueprint = "getBlueprint",
|
||||||
|
applyBlueprint = "applyBlueprint",
|
||||||
|
viewLogs = "viewLogs",
|
||||||
|
exportLogs = "exportLogs"
|
||||||
}
|
}
|
||||||
|
|
||||||
export async function checkUserActionPermission(
|
export async function checkUserActionPermission(
|
||||||
@@ -193,7 +200,6 @@ export async function checkUserActionPermission(
|
|||||||
.limit(1);
|
.limit(1);
|
||||||
|
|
||||||
return roleActionPermission.length > 0;
|
return roleActionPermission.length > 0;
|
||||||
|
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error("Error checking user action permission:", error);
|
console.error("Error checking user action permission:", error);
|
||||||
throw createHttpError(
|
throw createHttpError(
|
||||||
|
|||||||
@@ -39,7 +39,8 @@ export async function createSession(
|
|||||||
const session: Session = {
|
const session: Session = {
|
||||||
sessionId: sessionId,
|
sessionId: sessionId,
|
||||||
userId,
|
userId,
|
||||||
expiresAt: new Date(Date.now() + SESSION_COOKIE_EXPIRES).getTime()
|
expiresAt: new Date(Date.now() + SESSION_COOKIE_EXPIRES).getTime(),
|
||||||
|
issuedAt: new Date().getTime()
|
||||||
};
|
};
|
||||||
await db.insert(sessions).values(session);
|
await db.insert(sessions).values(session);
|
||||||
return session;
|
return session;
|
||||||
|
|||||||
@@ -50,7 +50,8 @@ export async function createResourceSession(opts: {
|
|||||||
doNotExtend: opts.doNotExtend || false,
|
doNotExtend: opts.doNotExtend || false,
|
||||||
accessTokenId: opts.accessTokenId || null,
|
accessTokenId: opts.accessTokenId || null,
|
||||||
isRequestToken: opts.isRequestToken || false,
|
isRequestToken: opts.isRequestToken || false,
|
||||||
userSessionId: opts.userSessionId || null
|
userSessionId: opts.userSessionId || null,
|
||||||
|
issuedAt: new Date().getTime()
|
||||||
};
|
};
|
||||||
|
|
||||||
await db.insert(resourceSessions).values(session);
|
await db.insert(resourceSessions).values(session);
|
||||||
|
|||||||
@@ -6,7 +6,8 @@ import {
|
|||||||
integer,
|
integer,
|
||||||
bigint,
|
bigint,
|
||||||
real,
|
real,
|
||||||
text
|
text,
|
||||||
|
index
|
||||||
} from "drizzle-orm/pg-core";
|
} from "drizzle-orm/pg-core";
|
||||||
import { InferSelectModel } from "drizzle-orm";
|
import { InferSelectModel } from "drizzle-orm";
|
||||||
import { domains, orgs, targets, users, exitNodes, sessions } from "./schema";
|
import { domains, orgs, targets, users, exitNodes, sessions } from "./schema";
|
||||||
@@ -166,6 +167,7 @@ export const remoteExitNodes = pgTable("remoteExitNode", {
|
|||||||
secretHash: varchar("secretHash").notNull(),
|
secretHash: varchar("secretHash").notNull(),
|
||||||
dateCreated: varchar("dateCreated").notNull(),
|
dateCreated: varchar("dateCreated").notNull(),
|
||||||
version: varchar("version"),
|
version: varchar("version"),
|
||||||
|
secondaryVersion: varchar("secondaryVersion"), // This is to detect the new nodes after the transition to pangolin-node
|
||||||
exitNodeId: integer("exitNodeId").references(() => exitNodes.exitNodeId, {
|
exitNodeId: integer("exitNodeId").references(() => exitNodes.exitNodeId, {
|
||||||
onDelete: "cascade"
|
onDelete: "cascade"
|
||||||
})
|
})
|
||||||
@@ -213,6 +215,43 @@ export const sessionTransferToken = pgTable("sessionTransferToken", {
|
|||||||
expiresAt: bigint("expiresAt", { mode: "number" }).notNull()
|
expiresAt: bigint("expiresAt", { mode: "number" }).notNull()
|
||||||
});
|
});
|
||||||
|
|
||||||
|
export const actionAuditLog = pgTable("actionAuditLog", {
|
||||||
|
id: serial("id").primaryKey(),
|
||||||
|
timestamp: bigint("timestamp", { mode: "number" }).notNull(), // this is EPOCH time in seconds
|
||||||
|
orgId: varchar("orgId")
|
||||||
|
.notNull()
|
||||||
|
.references(() => orgs.orgId, { onDelete: "cascade" }),
|
||||||
|
actorType: varchar("actorType", { length: 50 }).notNull(),
|
||||||
|
actor: varchar("actor", { length: 255 }).notNull(),
|
||||||
|
actorId: varchar("actorId", { length: 255 }).notNull(),
|
||||||
|
action: varchar("action", { length: 100 }).notNull(),
|
||||||
|
metadata: text("metadata")
|
||||||
|
}, (table) => ([
|
||||||
|
index("idx_actionAuditLog_timestamp").on(table.timestamp),
|
||||||
|
index("idx_actionAuditLog_org_timestamp").on(table.orgId, table.timestamp)
|
||||||
|
]));
|
||||||
|
|
||||||
|
export const accessAuditLog = pgTable("accessAuditLog", {
|
||||||
|
id: serial("id").primaryKey(),
|
||||||
|
timestamp: bigint("timestamp", { mode: "number" }).notNull(), // this is EPOCH time in seconds
|
||||||
|
orgId: varchar("orgId")
|
||||||
|
.notNull()
|
||||||
|
.references(() => orgs.orgId, { onDelete: "cascade" }),
|
||||||
|
actorType: varchar("actorType", { length: 50 }),
|
||||||
|
actor: varchar("actor", { length: 255 }),
|
||||||
|
actorId: varchar("actorId", { length: 255 }),
|
||||||
|
resourceId: integer("resourceId"),
|
||||||
|
ip: varchar("ip", { length: 45 }),
|
||||||
|
type: varchar("type", { length: 100 }).notNull(),
|
||||||
|
action: boolean("action").notNull(),
|
||||||
|
location: text("location"),
|
||||||
|
userAgent: text("userAgent"),
|
||||||
|
metadata: text("metadata")
|
||||||
|
}, (table) => ([
|
||||||
|
index("idx_identityAuditLog_timestamp").on(table.timestamp),
|
||||||
|
index("idx_identityAuditLog_org_timestamp").on(table.orgId, table.timestamp)
|
||||||
|
]));
|
||||||
|
|
||||||
export type Limit = InferSelectModel<typeof limits>;
|
export type Limit = InferSelectModel<typeof limits>;
|
||||||
export type Account = InferSelectModel<typeof account>;
|
export type Account = InferSelectModel<typeof account>;
|
||||||
export type Certificate = InferSelectModel<typeof certificates>;
|
export type Certificate = InferSelectModel<typeof certificates>;
|
||||||
@@ -230,3 +269,5 @@ export type RemoteExitNodeSession = InferSelectModel<
|
|||||||
>;
|
>;
|
||||||
export type ExitNodeOrg = InferSelectModel<typeof exitNodeOrgs>;
|
export type ExitNodeOrg = InferSelectModel<typeof exitNodeOrgs>;
|
||||||
export type LoginPage = InferSelectModel<typeof loginPage>;
|
export type LoginPage = InferSelectModel<typeof loginPage>;
|
||||||
|
export type ActionAuditLog = InferSelectModel<typeof actionAuditLog>;
|
||||||
|
export type AccessAuditLog = InferSelectModel<typeof accessAuditLog>;
|
||||||
@@ -6,7 +6,8 @@ import {
|
|||||||
integer,
|
integer,
|
||||||
bigint,
|
bigint,
|
||||||
real,
|
real,
|
||||||
text
|
text,
|
||||||
|
index
|
||||||
} from "drizzle-orm/pg-core";
|
} from "drizzle-orm/pg-core";
|
||||||
import { InferSelectModel } from "drizzle-orm";
|
import { InferSelectModel } from "drizzle-orm";
|
||||||
import { randomUUID } from "crypto";
|
import { randomUUID } from "crypto";
|
||||||
@@ -18,7 +19,21 @@ export const domains = pgTable("domains", {
|
|||||||
type: varchar("type"), // "ns", "cname", "wildcard"
|
type: varchar("type"), // "ns", "cname", "wildcard"
|
||||||
verified: boolean("verified").notNull().default(false),
|
verified: boolean("verified").notNull().default(false),
|
||||||
failed: boolean("failed").notNull().default(false),
|
failed: boolean("failed").notNull().default(false),
|
||||||
tries: integer("tries").notNull().default(0)
|
tries: integer("tries").notNull().default(0),
|
||||||
|
certResolver: varchar("certResolver"),
|
||||||
|
customCertResolver: varchar("customCertResolver"),
|
||||||
|
preferWildcardCert: boolean("preferWildcardCert")
|
||||||
|
});
|
||||||
|
|
||||||
|
export const dnsRecords = pgTable("dnsRecords", {
|
||||||
|
id: serial("id").primaryKey(),
|
||||||
|
domainId: varchar("domainId")
|
||||||
|
.notNull()
|
||||||
|
.references(() => domains.domainId, { onDelete: "cascade" }),
|
||||||
|
recordType: varchar("recordType").notNull(), // "NS" | "CNAME" | "A" | "TXT"
|
||||||
|
baseDomain: varchar("baseDomain"),
|
||||||
|
value: varchar("value").notNull(),
|
||||||
|
verified: boolean("verified").notNull().default(false)
|
||||||
});
|
});
|
||||||
|
|
||||||
export const orgs = pgTable("orgs", {
|
export const orgs = pgTable("orgs", {
|
||||||
@@ -26,7 +41,18 @@ export const orgs = pgTable("orgs", {
|
|||||||
name: varchar("name").notNull(),
|
name: varchar("name").notNull(),
|
||||||
subnet: varchar("subnet"),
|
subnet: varchar("subnet"),
|
||||||
createdAt: text("createdAt"),
|
createdAt: text("createdAt"),
|
||||||
settings: text("settings") // JSON blob of org-specific settings
|
requireTwoFactor: boolean("requireTwoFactor"),
|
||||||
|
maxSessionLengthHours: integer("maxSessionLengthHours"),
|
||||||
|
passwordExpiryDays: integer("passwordExpiryDays"),
|
||||||
|
settingsLogRetentionDaysRequest: integer("settingsLogRetentionDaysRequest") // where 0 = dont keep logs and -1 = keep forever
|
||||||
|
.notNull()
|
||||||
|
.default(7),
|
||||||
|
settingsLogRetentionDaysAccess: integer("settingsLogRetentionDaysAccess")
|
||||||
|
.notNull()
|
||||||
|
.default(0),
|
||||||
|
settingsLogRetentionDaysAction: integer("settingsLogRetentionDaysAction")
|
||||||
|
.notNull()
|
||||||
|
.default(0)
|
||||||
});
|
});
|
||||||
|
|
||||||
export const orgDomains = pgTable("orgDomains", {
|
export const orgDomains = pgTable("orgDomains", {
|
||||||
@@ -100,9 +126,11 @@ export const resources = pgTable("resources", {
|
|||||||
setHostHeader: varchar("setHostHeader"),
|
setHostHeader: varchar("setHostHeader"),
|
||||||
enableProxy: boolean("enableProxy").default(true),
|
enableProxy: boolean("enableProxy").default(true),
|
||||||
skipToIdpId: integer("skipToIdpId").references(() => idp.idpId, {
|
skipToIdpId: integer("skipToIdpId").references(() => idp.idpId, {
|
||||||
onDelete: "cascade"
|
onDelete: "set null"
|
||||||
}),
|
}),
|
||||||
headers: text("headers") // comma-separated list of headers to add to the request
|
headers: text("headers"), // comma-separated list of headers to add to the request
|
||||||
|
proxyProtocol: boolean("proxyProtocol").notNull().default(false),
|
||||||
|
proxyProtocolVersion: integer("proxyProtocolVersion").default(1)
|
||||||
});
|
});
|
||||||
|
|
||||||
export const targets = pgTable("targets", {
|
export const targets = pgTable("targets", {
|
||||||
@@ -200,7 +228,8 @@ export const users = pgTable("user", {
|
|||||||
dateCreated: varchar("dateCreated").notNull(),
|
dateCreated: varchar("dateCreated").notNull(),
|
||||||
termsAcceptedTimestamp: varchar("termsAcceptedTimestamp"),
|
termsAcceptedTimestamp: varchar("termsAcceptedTimestamp"),
|
||||||
termsVersion: varchar("termsVersion"),
|
termsVersion: varchar("termsVersion"),
|
||||||
serverAdmin: boolean("serverAdmin").notNull().default(false)
|
serverAdmin: boolean("serverAdmin").notNull().default(false),
|
||||||
|
lastPasswordChange: bigint("lastPasswordChange", { mode: "number" })
|
||||||
});
|
});
|
||||||
|
|
||||||
export const newts = pgTable("newt", {
|
export const newts = pgTable("newt", {
|
||||||
@@ -226,7 +255,8 @@ export const sessions = pgTable("session", {
|
|||||||
userId: varchar("userId")
|
userId: varchar("userId")
|
||||||
.notNull()
|
.notNull()
|
||||||
.references(() => users.userId, { onDelete: "cascade" }),
|
.references(() => users.userId, { onDelete: "cascade" }),
|
||||||
expiresAt: bigint("expiresAt", { mode: "number" }).notNull()
|
expiresAt: bigint("expiresAt", { mode: "number" }).notNull(),
|
||||||
|
issuedAt: bigint("issuedAt", { mode: "number" })
|
||||||
});
|
});
|
||||||
|
|
||||||
export const newtSessions = pgTable("newtSession", {
|
export const newtSessions = pgTable("newtSession", {
|
||||||
@@ -443,7 +473,8 @@ export const resourceSessions = pgTable("resourceSessions", {
|
|||||||
{
|
{
|
||||||
onDelete: "cascade"
|
onDelete: "cascade"
|
||||||
}
|
}
|
||||||
)
|
),
|
||||||
|
issuedAt: bigint("issuedAt", { mode: "number" })
|
||||||
});
|
});
|
||||||
|
|
||||||
export const resourceWhitelist = pgTable("resourceWhitelist", {
|
export const resourceWhitelist = pgTable("resourceWhitelist", {
|
||||||
@@ -671,6 +702,57 @@ export const setupTokens = pgTable("setupTokens", {
|
|||||||
dateUsed: varchar("dateUsed")
|
dateUsed: varchar("dateUsed")
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// Blueprint runs
|
||||||
|
export const blueprints = pgTable("blueprints", {
|
||||||
|
blueprintId: serial("blueprintId").primaryKey(),
|
||||||
|
orgId: text("orgId")
|
||||||
|
.references(() => orgs.orgId, {
|
||||||
|
onDelete: "cascade"
|
||||||
|
})
|
||||||
|
.notNull(),
|
||||||
|
name: varchar("name").notNull(),
|
||||||
|
source: varchar("source").notNull(),
|
||||||
|
createdAt: integer("createdAt").notNull(),
|
||||||
|
succeeded: boolean("succeeded").notNull(),
|
||||||
|
contents: text("contents").notNull(),
|
||||||
|
message: text("message")
|
||||||
|
});
|
||||||
|
export const requestAuditLog = pgTable(
|
||||||
|
"requestAuditLog",
|
||||||
|
{
|
||||||
|
id: serial("id").primaryKey(),
|
||||||
|
timestamp: integer("timestamp").notNull(), // this is EPOCH time in seconds
|
||||||
|
orgId: text("orgId").references(() => orgs.orgId, {
|
||||||
|
onDelete: "cascade"
|
||||||
|
}),
|
||||||
|
action: boolean("action").notNull(),
|
||||||
|
reason: integer("reason").notNull(),
|
||||||
|
actorType: text("actorType"),
|
||||||
|
actor: text("actor"),
|
||||||
|
actorId: text("actorId"),
|
||||||
|
resourceId: integer("resourceId"),
|
||||||
|
ip: text("ip"),
|
||||||
|
location: text("location"),
|
||||||
|
userAgent: text("userAgent"),
|
||||||
|
metadata: text("metadata"),
|
||||||
|
headers: text("headers"), // JSON blob
|
||||||
|
query: text("query"), // JSON blob
|
||||||
|
originalRequestURL: text("originalRequestURL"),
|
||||||
|
scheme: text("scheme"),
|
||||||
|
host: text("host"),
|
||||||
|
path: text("path"),
|
||||||
|
method: text("method"),
|
||||||
|
tls: boolean("tls")
|
||||||
|
},
|
||||||
|
(table) => [
|
||||||
|
index("idx_requestAuditLog_timestamp").on(table.timestamp),
|
||||||
|
index("idx_requestAuditLog_org_timestamp").on(
|
||||||
|
table.orgId,
|
||||||
|
table.timestamp
|
||||||
|
)
|
||||||
|
]
|
||||||
|
);
|
||||||
|
|
||||||
export type Org = InferSelectModel<typeof orgs>;
|
export type Org = InferSelectModel<typeof orgs>;
|
||||||
export type User = InferSelectModel<typeof users>;
|
export type User = InferSelectModel<typeof users>;
|
||||||
export type Site = InferSelectModel<typeof sites>;
|
export type Site = InferSelectModel<typeof sites>;
|
||||||
@@ -722,3 +804,8 @@ export type SetupToken = InferSelectModel<typeof setupTokens>;
|
|||||||
export type HostMeta = InferSelectModel<typeof hostMeta>;
|
export type HostMeta = InferSelectModel<typeof hostMeta>;
|
||||||
export type TargetHealthCheck = InferSelectModel<typeof targetHealthCheck>;
|
export type TargetHealthCheck = InferSelectModel<typeof targetHealthCheck>;
|
||||||
export type IdpOidcConfig = InferSelectModel<typeof idpOidcConfig>;
|
export type IdpOidcConfig = InferSelectModel<typeof idpOidcConfig>;
|
||||||
|
export type Blueprint = InferSelectModel<typeof blueprints>;
|
||||||
|
export type LicenseKey = InferSelectModel<typeof licenseKey>;
|
||||||
|
export type SecurityKey = InferSelectModel<typeof securityKeys>;
|
||||||
|
export type WebauthnChallenge = InferSelectModel<typeof webauthnChallenge>;
|
||||||
|
export type RequestAuditLog = InferSelectModel<typeof requestAuditLog>;
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import { db, loginPage, LoginPage, loginPageOrg } from "@server/db";
|
import { db, loginPage, LoginPage, loginPageOrg, Org, orgs } from "@server/db";
|
||||||
import {
|
import {
|
||||||
Resource,
|
Resource,
|
||||||
ResourcePassword,
|
ResourcePassword,
|
||||||
@@ -23,6 +23,7 @@ export type ResourceWithAuth = {
|
|||||||
pincode: ResourcePincode | null;
|
pincode: ResourcePincode | null;
|
||||||
password: ResourcePassword | null;
|
password: ResourcePassword | null;
|
||||||
headerAuth: ResourceHeaderAuth | null;
|
headerAuth: ResourceHeaderAuth | null;
|
||||||
|
org: Org;
|
||||||
};
|
};
|
||||||
|
|
||||||
export type UserSessionWithUser = {
|
export type UserSessionWithUser = {
|
||||||
@@ -51,6 +52,10 @@ export async function getResourceByDomain(
|
|||||||
resourceHeaderAuth,
|
resourceHeaderAuth,
|
||||||
eq(resourceHeaderAuth.resourceId, resources.resourceId)
|
eq(resourceHeaderAuth.resourceId, resources.resourceId)
|
||||||
)
|
)
|
||||||
|
.innerJoin(
|
||||||
|
orgs,
|
||||||
|
eq(orgs.orgId, resources.orgId)
|
||||||
|
)
|
||||||
.where(eq(resources.fullDomain, domain))
|
.where(eq(resources.fullDomain, domain))
|
||||||
.limit(1);
|
.limit(1);
|
||||||
|
|
||||||
@@ -62,7 +67,8 @@ export async function getResourceByDomain(
|
|||||||
resource: result.resources,
|
resource: result.resources,
|
||||||
pincode: result.resourcePincode,
|
pincode: result.resourcePincode,
|
||||||
password: result.resourcePassword,
|
password: result.resourcePassword,
|
||||||
headerAuth: result.resourceHeaderAuth
|
headerAuth: result.resourceHeaderAuth,
|
||||||
|
org: result.orgs
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -13,12 +13,16 @@ bootstrapVolume();
|
|||||||
|
|
||||||
function createDb() {
|
function createDb() {
|
||||||
const sqlite = new Database(location);
|
const sqlite = new Database(location);
|
||||||
return DrizzleSqlite(sqlite, { schema });
|
return DrizzleSqlite(sqlite, {
|
||||||
|
schema
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
export const db = createDb();
|
export const db = createDb();
|
||||||
export default db;
|
export default db;
|
||||||
export type Transaction = Parameters<Parameters<typeof db["transaction"]>[0]>[0];
|
export type Transaction = Parameters<
|
||||||
|
Parameters<(typeof db)["transaction"]>[0]
|
||||||
|
>[0];
|
||||||
|
|
||||||
function checkFileExists(filePath: string): boolean {
|
function checkFileExists(filePath: string): boolean {
|
||||||
try {
|
try {
|
||||||
|
|||||||
@@ -2,10 +2,12 @@ import {
|
|||||||
sqliteTable,
|
sqliteTable,
|
||||||
integer,
|
integer,
|
||||||
text,
|
text,
|
||||||
real
|
real,
|
||||||
|
index
|
||||||
} from "drizzle-orm/sqlite-core";
|
} from "drizzle-orm/sqlite-core";
|
||||||
import { InferSelectModel } from "drizzle-orm";
|
import { InferSelectModel } from "drizzle-orm";
|
||||||
import { domains, orgs, targets, users, exitNodes, sessions } from "./schema";
|
import { domains, orgs, targets, users, exitNodes, sessions } from "./schema";
|
||||||
|
import { metadata } from "@app/app/[orgId]/settings/layout";
|
||||||
|
|
||||||
export const certificates = sqliteTable("certificates", {
|
export const certificates = sqliteTable("certificates", {
|
||||||
certId: integer("certId").primaryKey({ autoIncrement: true }),
|
certId: integer("certId").primaryKey({ autoIncrement: true }),
|
||||||
@@ -160,6 +162,7 @@ export const remoteExitNodes = sqliteTable("remoteExitNode", {
|
|||||||
secretHash: text("secretHash").notNull(),
|
secretHash: text("secretHash").notNull(),
|
||||||
dateCreated: text("dateCreated").notNull(),
|
dateCreated: text("dateCreated").notNull(),
|
||||||
version: text("version"),
|
version: text("version"),
|
||||||
|
secondaryVersion: text("secondaryVersion"), // This is to detect the new nodes after the transition to pangolin-node
|
||||||
exitNodeId: integer("exitNodeId").references(() => exitNodes.exitNodeId, {
|
exitNodeId: integer("exitNodeId").references(() => exitNodes.exitNodeId, {
|
||||||
onDelete: "cascade"
|
onDelete: "cascade"
|
||||||
})
|
})
|
||||||
@@ -207,6 +210,43 @@ export const sessionTransferToken = sqliteTable("sessionTransferToken", {
|
|||||||
expiresAt: integer("expiresAt").notNull()
|
expiresAt: integer("expiresAt").notNull()
|
||||||
});
|
});
|
||||||
|
|
||||||
|
export const actionAuditLog = sqliteTable("actionAuditLog", {
|
||||||
|
id: integer("id").primaryKey({ autoIncrement: true }),
|
||||||
|
timestamp: integer("timestamp").notNull(), // this is EPOCH time in seconds
|
||||||
|
orgId: text("orgId")
|
||||||
|
.notNull()
|
||||||
|
.references(() => orgs.orgId, { onDelete: "cascade" }),
|
||||||
|
actorType: text("actorType").notNull(),
|
||||||
|
actor: text("actor").notNull(),
|
||||||
|
actorId: text("actorId").notNull(),
|
||||||
|
action: text("action").notNull(),
|
||||||
|
metadata: text("metadata")
|
||||||
|
}, (table) => ([
|
||||||
|
index("idx_actionAuditLog_timestamp").on(table.timestamp),
|
||||||
|
index("idx_actionAuditLog_org_timestamp").on(table.orgId, table.timestamp)
|
||||||
|
]));
|
||||||
|
|
||||||
|
export const accessAuditLog = sqliteTable("accessAuditLog", {
|
||||||
|
id: integer("id").primaryKey({ autoIncrement: true }),
|
||||||
|
timestamp: integer("timestamp").notNull(), // this is EPOCH time in seconds
|
||||||
|
orgId: text("orgId")
|
||||||
|
.notNull()
|
||||||
|
.references(() => orgs.orgId, { onDelete: "cascade" }),
|
||||||
|
actorType: text("actorType"),
|
||||||
|
actor: text("actor"),
|
||||||
|
actorId: text("actorId"),
|
||||||
|
resourceId: integer("resourceId"),
|
||||||
|
ip: text("ip"),
|
||||||
|
location: text("location"),
|
||||||
|
type: text("type").notNull(),
|
||||||
|
action: integer("action", { mode: "boolean" }).notNull(),
|
||||||
|
userAgent: text("userAgent"),
|
||||||
|
metadata: text("metadata")
|
||||||
|
}, (table) => ([
|
||||||
|
index("idx_identityAuditLog_timestamp").on(table.timestamp),
|
||||||
|
index("idx_identityAuditLog_org_timestamp").on(table.orgId, table.timestamp)
|
||||||
|
]));
|
||||||
|
|
||||||
export type Limit = InferSelectModel<typeof limits>;
|
export type Limit = InferSelectModel<typeof limits>;
|
||||||
export type Account = InferSelectModel<typeof account>;
|
export type Account = InferSelectModel<typeof account>;
|
||||||
export type Certificate = InferSelectModel<typeof certificates>;
|
export type Certificate = InferSelectModel<typeof certificates>;
|
||||||
@@ -224,3 +264,5 @@ export type RemoteExitNodeSession = InferSelectModel<
|
|||||||
>;
|
>;
|
||||||
export type ExitNodeOrg = InferSelectModel<typeof exitNodeOrgs>;
|
export type ExitNodeOrg = InferSelectModel<typeof exitNodeOrgs>;
|
||||||
export type LoginPage = InferSelectModel<typeof loginPage>;
|
export type LoginPage = InferSelectModel<typeof loginPage>;
|
||||||
|
export type ActionAuditLog = InferSelectModel<typeof actionAuditLog>;
|
||||||
|
export type AccessAuditLog = InferSelectModel<typeof accessAuditLog>;
|
||||||
@@ -1,6 +1,7 @@
|
|||||||
import { randomUUID } from "crypto";
|
import { randomUUID } from "crypto";
|
||||||
import { InferSelectModel } from "drizzle-orm";
|
import { InferSelectModel } from "drizzle-orm";
|
||||||
import { sqliteTable, text, integer } from "drizzle-orm/sqlite-core";
|
import { sqliteTable, text, integer, index } from "drizzle-orm/sqlite-core";
|
||||||
|
import { boolean } from "yargs";
|
||||||
|
|
||||||
export const domains = sqliteTable("domains", {
|
export const domains = sqliteTable("domains", {
|
||||||
domainId: text("domainId").primaryKey(),
|
domainId: text("domainId").primaryKey(),
|
||||||
@@ -11,15 +12,41 @@ export const domains = sqliteTable("domains", {
|
|||||||
type: text("type"), // "ns", "cname", "wildcard"
|
type: text("type"), // "ns", "cname", "wildcard"
|
||||||
verified: integer("verified", { mode: "boolean" }).notNull().default(false),
|
verified: integer("verified", { mode: "boolean" }).notNull().default(false),
|
||||||
failed: integer("failed", { mode: "boolean" }).notNull().default(false),
|
failed: integer("failed", { mode: "boolean" }).notNull().default(false),
|
||||||
tries: integer("tries").notNull().default(0)
|
tries: integer("tries").notNull().default(0),
|
||||||
|
certResolver: text("certResolver"),
|
||||||
|
preferWildcardCert: integer("preferWildcardCert", { mode: "boolean" })
|
||||||
});
|
});
|
||||||
|
|
||||||
|
export const dnsRecords = sqliteTable("dnsRecords", {
|
||||||
|
id: integer("id").primaryKey({ autoIncrement: true }),
|
||||||
|
domainId: text("domainId")
|
||||||
|
.notNull()
|
||||||
|
.references(() => domains.domainId, { onDelete: "cascade" }),
|
||||||
|
|
||||||
|
recordType: text("recordType").notNull(), // "NS" | "CNAME" | "A" | "TXT"
|
||||||
|
baseDomain: text("baseDomain"),
|
||||||
|
value: text("value").notNull(),
|
||||||
|
verified: integer("verified", { mode: "boolean" }).notNull().default(false),
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
export const orgs = sqliteTable("orgs", {
|
export const orgs = sqliteTable("orgs", {
|
||||||
orgId: text("orgId").primaryKey(),
|
orgId: text("orgId").primaryKey(),
|
||||||
name: text("name").notNull(),
|
name: text("name").notNull(),
|
||||||
subnet: text("subnet"),
|
subnet: text("subnet"),
|
||||||
createdAt: text("createdAt"),
|
createdAt: text("createdAt"),
|
||||||
settings: text("settings") // JSON blob of org-specific settings
|
requireTwoFactor: integer("requireTwoFactor", { mode: "boolean" }),
|
||||||
|
maxSessionLengthHours: integer("maxSessionLengthHours"), // hours
|
||||||
|
passwordExpiryDays: integer("passwordExpiryDays"), // days
|
||||||
|
settingsLogRetentionDaysRequest: integer("settingsLogRetentionDaysRequest") // where 0 = dont keep logs and -1 = keep forever
|
||||||
|
.notNull()
|
||||||
|
.default(7),
|
||||||
|
settingsLogRetentionDaysAccess: integer("settingsLogRetentionDaysAccess")
|
||||||
|
.notNull()
|
||||||
|
.default(0),
|
||||||
|
settingsLogRetentionDaysAction: integer("settingsLogRetentionDaysAction")
|
||||||
|
.notNull()
|
||||||
|
.default(0)
|
||||||
});
|
});
|
||||||
|
|
||||||
export const userDomains = sqliteTable("userDomains", {
|
export const userDomains = sqliteTable("userDomains", {
|
||||||
@@ -112,9 +139,12 @@ export const resources = sqliteTable("resources", {
|
|||||||
setHostHeader: text("setHostHeader"),
|
setHostHeader: text("setHostHeader"),
|
||||||
enableProxy: integer("enableProxy", { mode: "boolean" }).default(true),
|
enableProxy: integer("enableProxy", { mode: "boolean" }).default(true),
|
||||||
skipToIdpId: integer("skipToIdpId").references(() => idp.idpId, {
|
skipToIdpId: integer("skipToIdpId").references(() => idp.idpId, {
|
||||||
onDelete: "cascade"
|
onDelete: "set null"
|
||||||
}),
|
}),
|
||||||
headers: text("headers") // comma-separated list of headers to add to the request
|
headers: text("headers"), // comma-separated list of headers to add to the request
|
||||||
|
proxyProtocol: integer("proxyProtocol", { mode: "boolean" }).notNull().default(false),
|
||||||
|
proxyProtocolVersion: integer("proxyProtocolVersion").default(1)
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
export const targets = sqliteTable("targets", {
|
export const targets = sqliteTable("targets", {
|
||||||
@@ -142,11 +172,15 @@ export const targets = sqliteTable("targets", {
|
|||||||
});
|
});
|
||||||
|
|
||||||
export const targetHealthCheck = sqliteTable("targetHealthCheck", {
|
export const targetHealthCheck = sqliteTable("targetHealthCheck", {
|
||||||
targetHealthCheckId: integer("targetHealthCheckId").primaryKey({ autoIncrement: true }),
|
targetHealthCheckId: integer("targetHealthCheckId").primaryKey({
|
||||||
|
autoIncrement: true
|
||||||
|
}),
|
||||||
targetId: integer("targetId")
|
targetId: integer("targetId")
|
||||||
.notNull()
|
.notNull()
|
||||||
.references(() => targets.targetId, { onDelete: "cascade" }),
|
.references(() => targets.targetId, { onDelete: "cascade" }),
|
||||||
hcEnabled: integer("hcEnabled", { mode: "boolean" }).notNull().default(false),
|
hcEnabled: integer("hcEnabled", { mode: "boolean" })
|
||||||
|
.notNull()
|
||||||
|
.default(false),
|
||||||
hcPath: text("hcPath"),
|
hcPath: text("hcPath"),
|
||||||
hcScheme: text("hcScheme"),
|
hcScheme: text("hcScheme"),
|
||||||
hcMode: text("hcMode").default("http"),
|
hcMode: text("hcMode").default("http"),
|
||||||
@@ -156,7 +190,9 @@ export const targetHealthCheck = sqliteTable("targetHealthCheck", {
|
|||||||
hcUnhealthyInterval: integer("hcUnhealthyInterval").default(30), // in seconds
|
hcUnhealthyInterval: integer("hcUnhealthyInterval").default(30), // in seconds
|
||||||
hcTimeout: integer("hcTimeout").default(5), // in seconds
|
hcTimeout: integer("hcTimeout").default(5), // in seconds
|
||||||
hcHeaders: text("hcHeaders"),
|
hcHeaders: text("hcHeaders"),
|
||||||
hcFollowRedirects: integer("hcFollowRedirects", { mode: "boolean" }).default(true),
|
hcFollowRedirects: integer("hcFollowRedirects", {
|
||||||
|
mode: "boolean"
|
||||||
|
}).default(true),
|
||||||
hcMethod: text("hcMethod").default("GET"),
|
hcMethod: text("hcMethod").default("GET"),
|
||||||
hcStatus: integer("hcStatus"), // http code
|
hcStatus: integer("hcStatus"), // http code
|
||||||
hcHealth: text("hcHealth").default("unknown") // "unknown", "healthy", "unhealthy"
|
hcHealth: text("hcHealth").default("unknown") // "unknown", "healthy", "unhealthy"
|
||||||
@@ -222,7 +258,8 @@ export const users = sqliteTable("user", {
|
|||||||
termsVersion: text("termsVersion"),
|
termsVersion: text("termsVersion"),
|
||||||
serverAdmin: integer("serverAdmin", { mode: "boolean" })
|
serverAdmin: integer("serverAdmin", { mode: "boolean" })
|
||||||
.notNull()
|
.notNull()
|
||||||
.default(false)
|
.default(false),
|
||||||
|
lastPasswordChange: integer("lastPasswordChange")
|
||||||
});
|
});
|
||||||
|
|
||||||
export const securityKeys = sqliteTable("webauthnCredentials", {
|
export const securityKeys = sqliteTable("webauthnCredentials", {
|
||||||
@@ -327,7 +364,8 @@ export const sessions = sqliteTable("session", {
|
|||||||
userId: text("userId")
|
userId: text("userId")
|
||||||
.notNull()
|
.notNull()
|
||||||
.references(() => users.userId, { onDelete: "cascade" }),
|
.references(() => users.userId, { onDelete: "cascade" }),
|
||||||
expiresAt: integer("expiresAt").notNull()
|
expiresAt: integer("expiresAt").notNull(),
|
||||||
|
issuedAt: integer("issuedAt")
|
||||||
});
|
});
|
||||||
|
|
||||||
export const newtSessions = sqliteTable("newtSession", {
|
export const newtSessions = sqliteTable("newtSession", {
|
||||||
@@ -577,7 +615,8 @@ export const resourceSessions = sqliteTable("resourceSessions", {
|
|||||||
{
|
{
|
||||||
onDelete: "cascade"
|
onDelete: "cascade"
|
||||||
}
|
}
|
||||||
)
|
),
|
||||||
|
issuedAt: integer("issuedAt")
|
||||||
});
|
});
|
||||||
|
|
||||||
export const resourceWhitelist = sqliteTable("resourceWhitelist", {
|
export const resourceWhitelist = sqliteTable("resourceWhitelist", {
|
||||||
@@ -710,6 +749,59 @@ export const idpOrg = sqliteTable("idpOrg", {
|
|||||||
orgMapping: text("orgMapping")
|
orgMapping: text("orgMapping")
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// Blueprint runs
|
||||||
|
export const blueprints = sqliteTable("blueprints", {
|
||||||
|
blueprintId: integer("blueprintId").primaryKey({
|
||||||
|
autoIncrement: true
|
||||||
|
}),
|
||||||
|
orgId: text("orgId")
|
||||||
|
.references(() => orgs.orgId, {
|
||||||
|
onDelete: "cascade"
|
||||||
|
})
|
||||||
|
.notNull(),
|
||||||
|
name: text("name").notNull(),
|
||||||
|
source: text("source").notNull(),
|
||||||
|
createdAt: integer("createdAt").notNull(),
|
||||||
|
succeeded: integer("succeeded", { mode: "boolean" }).notNull(),
|
||||||
|
contents: text("contents").notNull(),
|
||||||
|
message: text("message")
|
||||||
|
});
|
||||||
|
export const requestAuditLog = sqliteTable(
|
||||||
|
"requestAuditLog",
|
||||||
|
{
|
||||||
|
id: integer("id").primaryKey({ autoIncrement: true }),
|
||||||
|
timestamp: integer("timestamp").notNull(), // this is EPOCH time in seconds
|
||||||
|
orgId: text("orgId").references(() => orgs.orgId, {
|
||||||
|
onDelete: "cascade"
|
||||||
|
}),
|
||||||
|
action: integer("action", { mode: "boolean" }).notNull(),
|
||||||
|
reason: integer("reason").notNull(),
|
||||||
|
actorType: text("actorType"),
|
||||||
|
actor: text("actor"),
|
||||||
|
actorId: text("actorId"),
|
||||||
|
resourceId: integer("resourceId"),
|
||||||
|
ip: text("ip"),
|
||||||
|
location: text("location"),
|
||||||
|
userAgent: text("userAgent"),
|
||||||
|
metadata: text("metadata"),
|
||||||
|
headers: text("headers"), // JSON blob
|
||||||
|
query: text("query"), // JSON blob
|
||||||
|
originalRequestURL: text("originalRequestURL"),
|
||||||
|
scheme: text("scheme"),
|
||||||
|
host: text("host"),
|
||||||
|
path: text("path"),
|
||||||
|
method: text("method"),
|
||||||
|
tls: integer("tls", { mode: "boolean" })
|
||||||
|
},
|
||||||
|
(table) => [
|
||||||
|
index("idx_requestAuditLog_timestamp").on(table.timestamp),
|
||||||
|
index("idx_requestAuditLog_org_timestamp").on(
|
||||||
|
table.orgId,
|
||||||
|
table.timestamp
|
||||||
|
)
|
||||||
|
]
|
||||||
|
);
|
||||||
|
|
||||||
export type Org = InferSelectModel<typeof orgs>;
|
export type Org = InferSelectModel<typeof orgs>;
|
||||||
export type User = InferSelectModel<typeof users>;
|
export type User = InferSelectModel<typeof users>;
|
||||||
export type Site = InferSelectModel<typeof sites>;
|
export type Site = InferSelectModel<typeof sites>;
|
||||||
@@ -746,6 +838,7 @@ export type ResourceWhitelist = InferSelectModel<typeof resourceWhitelist>;
|
|||||||
export type VersionMigration = InferSelectModel<typeof versionMigrations>;
|
export type VersionMigration = InferSelectModel<typeof versionMigrations>;
|
||||||
export type ResourceRule = InferSelectModel<typeof resourceRules>;
|
export type ResourceRule = InferSelectModel<typeof resourceRules>;
|
||||||
export type Domain = InferSelectModel<typeof domains>;
|
export type Domain = InferSelectModel<typeof domains>;
|
||||||
|
export type DnsRecord = InferSelectModel<typeof dnsRecords>;
|
||||||
export type Client = InferSelectModel<typeof clients>;
|
export type Client = InferSelectModel<typeof clients>;
|
||||||
export type ClientSite = InferSelectModel<typeof clientSites>;
|
export type ClientSite = InferSelectModel<typeof clientSites>;
|
||||||
export type RoleClient = InferSelectModel<typeof roleClients>;
|
export type RoleClient = InferSelectModel<typeof roleClients>;
|
||||||
@@ -761,3 +854,8 @@ export type SetupToken = InferSelectModel<typeof setupTokens>;
|
|||||||
export type HostMeta = InferSelectModel<typeof hostMeta>;
|
export type HostMeta = InferSelectModel<typeof hostMeta>;
|
||||||
export type TargetHealthCheck = InferSelectModel<typeof targetHealthCheck>;
|
export type TargetHealthCheck = InferSelectModel<typeof targetHealthCheck>;
|
||||||
export type IdpOidcConfig = InferSelectModel<typeof idpOidcConfig>;
|
export type IdpOidcConfig = InferSelectModel<typeof idpOidcConfig>;
|
||||||
|
export type Blueprint = InferSelectModel<typeof blueprints>;
|
||||||
|
export type LicenseKey = InferSelectModel<typeof licenseKey>;
|
||||||
|
export type SecurityKey = InferSelectModel<typeof securityKeys>;
|
||||||
|
export type WebauthnChallenge = InferSelectModel<typeof webauthnChallenge>;
|
||||||
|
export type RequestAuditLog = InferSelectModel<typeof requestAuditLog>;
|
||||||
|
|||||||
56
server/emails/templates/SupportEmail.tsx
Normal file
56
server/emails/templates/SupportEmail.tsx
Normal file
@@ -0,0 +1,56 @@
|
|||||||
|
import React from "react";
|
||||||
|
import { Body, Head, Html, Preview, Tailwind } from "@react-email/components";
|
||||||
|
import { themeColors } from "./lib/theme";
|
||||||
|
import {
|
||||||
|
EmailContainer,
|
||||||
|
EmailGreeting,
|
||||||
|
EmailLetterHead,
|
||||||
|
EmailText
|
||||||
|
} from "./components/Email";
|
||||||
|
|
||||||
|
interface SupportEmailProps {
|
||||||
|
email: string;
|
||||||
|
username: string;
|
||||||
|
subject: string;
|
||||||
|
body: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
export const SupportEmail = ({
|
||||||
|
username,
|
||||||
|
email,
|
||||||
|
body,
|
||||||
|
subject
|
||||||
|
}: SupportEmailProps) => {
|
||||||
|
const previewText = subject;
|
||||||
|
|
||||||
|
return (
|
||||||
|
<Html>
|
||||||
|
<Head />
|
||||||
|
<Preview>{previewText}</Preview>
|
||||||
|
<Tailwind config={themeColors}>
|
||||||
|
<Body className="font-sans bg-gray-50">
|
||||||
|
<EmailContainer>
|
||||||
|
<EmailLetterHead />
|
||||||
|
|
||||||
|
<EmailGreeting>Hi support,</EmailGreeting>
|
||||||
|
|
||||||
|
<EmailText>
|
||||||
|
You have received a new support request from{" "}
|
||||||
|
<strong>{username}</strong> ({email}).
|
||||||
|
</EmailText>
|
||||||
|
|
||||||
|
<EmailText>
|
||||||
|
<strong>Subject:</strong> {subject}
|
||||||
|
</EmailText>
|
||||||
|
|
||||||
|
<EmailText>
|
||||||
|
<strong>Message:</strong> {body}
|
||||||
|
</EmailText>
|
||||||
|
</EmailContainer>
|
||||||
|
</Body>
|
||||||
|
</Tailwind>
|
||||||
|
</Html>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
export default SupportEmail;
|
||||||
@@ -88,7 +88,7 @@ export const WelcomeQuickStart = ({
|
|||||||
To learn how to use Newt, including more
|
To learn how to use Newt, including more
|
||||||
installation methods, visit the{" "}
|
installation methods, visit the{" "}
|
||||||
<a
|
<a
|
||||||
href="https://docs.digpangolin.com/manage/sites/install-site"
|
href="https://docs.pangolin.net/manage/sites/install-site"
|
||||||
className="underline"
|
className="underline"
|
||||||
>
|
>
|
||||||
docs
|
docs
|
||||||
|
|||||||
@@ -89,7 +89,7 @@ export function EmailFooter({ children }: { children: React.ReactNode }) {
|
|||||||
<p className="text-xs text-gray-400 mt-4">
|
<p className="text-xs text-gray-400 mt-4">
|
||||||
For any questions or support, please contact us at:
|
For any questions or support, please contact us at:
|
||||||
<br />
|
<br />
|
||||||
support@fossorial.io
|
support@pangolin.net
|
||||||
</p>
|
</p>
|
||||||
<p className="text-xs text-gray-300 text-center mt-4">
|
<p className="text-xs text-gray-300 text-center mt-4">
|
||||||
© {new Date().getFullYear()} Fossorial, Inc. All
|
© {new Date().getFullYear()} Fossorial, Inc. All
|
||||||
|
|||||||
@@ -5,6 +5,7 @@ import { runSetupFunctions } from "./setup";
|
|||||||
import { createApiServer } from "./apiServer";
|
import { createApiServer } from "./apiServer";
|
||||||
import { createNextServer } from "./nextServer";
|
import { createNextServer } from "./nextServer";
|
||||||
import { createInternalServer } from "./internalServer";
|
import { createInternalServer } from "./internalServer";
|
||||||
|
import { createIntegrationApiServer } from "./integrationApiServer";
|
||||||
import {
|
import {
|
||||||
ApiKey,
|
ApiKey,
|
||||||
ApiKeyOrg,
|
ApiKeyOrg,
|
||||||
@@ -13,13 +14,14 @@ import {
|
|||||||
User,
|
User,
|
||||||
UserOrg
|
UserOrg
|
||||||
} from "@server/db";
|
} from "@server/db";
|
||||||
import { createIntegrationApiServer } from "./integrationApiServer";
|
|
||||||
import config from "@server/lib/config";
|
import config from "@server/lib/config";
|
||||||
import { setHostMeta } from "@server/lib/hostMeta";
|
import { setHostMeta } from "@server/lib/hostMeta";
|
||||||
import { initTelemetryClient } from "./lib/telemetry.js";
|
import { initTelemetryClient } from "@server/lib/telemetry";
|
||||||
import { TraefikConfigManager } from "./lib/traefik/TraefikConfigManager.js";
|
import { TraefikConfigManager } from "@server/lib/traefik/TraefikConfigManager";
|
||||||
import { initCleanup } from "#dynamic/cleanup";
|
import { initCleanup } from "#dynamic/cleanup";
|
||||||
import license from "#dynamic/license/license";
|
import license from "#dynamic/license/license";
|
||||||
|
import { initLogCleanupInterval } from "@server/lib/cleanupLogs";
|
||||||
|
import { fetchServerIp } from "@server/lib/serverIpService";
|
||||||
|
|
||||||
async function startServers() {
|
async function startServers() {
|
||||||
await setHostMeta();
|
await setHostMeta();
|
||||||
@@ -31,14 +33,17 @@ async function startServers() {
|
|||||||
|
|
||||||
await runSetupFunctions();
|
await runSetupFunctions();
|
||||||
|
|
||||||
|
await fetchServerIp();
|
||||||
|
|
||||||
initTelemetryClient();
|
initTelemetryClient();
|
||||||
|
|
||||||
|
initLogCleanupInterval();
|
||||||
|
|
||||||
// Start all servers
|
// Start all servers
|
||||||
const apiServer = createApiServer();
|
const apiServer = createApiServer();
|
||||||
const internalServer = createInternalServer();
|
const internalServer = createInternalServer();
|
||||||
|
|
||||||
let nextServer;
|
const nextServer = await createNextServer();
|
||||||
nextServer = await createNextServer();
|
|
||||||
if (config.getRawConfig().traefik.file_mode) {
|
if (config.getRawConfig().traefik.file_mode) {
|
||||||
const monitor = new TraefikConfigManager();
|
const monitor = new TraefikConfigManager();
|
||||||
await monitor.start();
|
await monitor.start();
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
export async function getOrgTierData(
|
export async function getOrgTierData(
|
||||||
orgId: string
|
orgId: string
|
||||||
): Promise<{ tier: string | null; active: boolean }> {
|
): Promise<{ tier: string | null; active: boolean }> {
|
||||||
let tier = null;
|
const tier = null;
|
||||||
let active = false;
|
const active = false;
|
||||||
|
|
||||||
return { tier, active };
|
return { tier, active };
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
import { eq, sql, and } from "drizzle-orm";
|
import { eq, sql, and } from "drizzle-orm";
|
||||||
import NodeCache from "node-cache";
|
|
||||||
import { v4 as uuidv4 } from "uuid";
|
import { v4 as uuidv4 } from "uuid";
|
||||||
import { PutObjectCommand } from "@aws-sdk/client-s3";
|
import { PutObjectCommand } from "@aws-sdk/client-s3";
|
||||||
import * as fs from "fs/promises";
|
import * as fs from "fs/promises";
|
||||||
@@ -20,6 +19,7 @@ import logger from "@server/logger";
|
|||||||
import { sendToClient } from "#dynamic/routers/ws";
|
import { sendToClient } from "#dynamic/routers/ws";
|
||||||
import { build } from "@server/build";
|
import { build } from "@server/build";
|
||||||
import { s3Client } from "@server/lib/s3";
|
import { s3Client } from "@server/lib/s3";
|
||||||
|
import cache from "@server/lib/cache";
|
||||||
|
|
||||||
interface StripeEvent {
|
interface StripeEvent {
|
||||||
identifier?: string;
|
identifier?: string;
|
||||||
@@ -43,7 +43,6 @@ export function noop() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
export class UsageService {
|
export class UsageService {
|
||||||
private cache: NodeCache;
|
|
||||||
private bucketName: string | undefined;
|
private bucketName: string | undefined;
|
||||||
private currentEventFile: string | null = null;
|
private currentEventFile: string | null = null;
|
||||||
private currentFileStartTime: number = 0;
|
private currentFileStartTime: number = 0;
|
||||||
@@ -51,7 +50,6 @@ export class UsageService {
|
|||||||
private uploadingFiles: Set<string> = new Set();
|
private uploadingFiles: Set<string> = new Set();
|
||||||
|
|
||||||
constructor() {
|
constructor() {
|
||||||
this.cache = new NodeCache({ stdTTL: 300 }); // 5 minute TTL
|
|
||||||
if (noop()) {
|
if (noop()) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -399,7 +397,7 @@ export class UsageService {
|
|||||||
featureId: FeatureId
|
featureId: FeatureId
|
||||||
): Promise<string | null> {
|
): Promise<string | null> {
|
||||||
const cacheKey = `customer_${orgId}_${featureId}`;
|
const cacheKey = `customer_${orgId}_${featureId}`;
|
||||||
const cached = this.cache.get<string>(cacheKey);
|
const cached = cache.get<string>(cacheKey);
|
||||||
|
|
||||||
if (cached) {
|
if (cached) {
|
||||||
return cached;
|
return cached;
|
||||||
@@ -422,7 +420,7 @@ export class UsageService {
|
|||||||
const customerId = customer.customerId;
|
const customerId = customer.customerId;
|
||||||
|
|
||||||
// Cache the result
|
// Cache the result
|
||||||
this.cache.set(cacheKey, customerId);
|
cache.set(cacheKey, customerId, 300); // 5 minute TTL
|
||||||
|
|
||||||
return customerId;
|
return customerId;
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
@@ -612,7 +610,8 @@ export class UsageService {
|
|||||||
|
|
||||||
public async getUsage(
|
public async getUsage(
|
||||||
orgId: string,
|
orgId: string,
|
||||||
featureId: FeatureId
|
featureId: FeatureId,
|
||||||
|
trx: Transaction | typeof db = db
|
||||||
): Promise<Usage | null> {
|
): Promise<Usage | null> {
|
||||||
if (noop()) {
|
if (noop()) {
|
||||||
return null;
|
return null;
|
||||||
@@ -621,7 +620,7 @@ export class UsageService {
|
|||||||
const usageId = `${orgId}-${featureId}`;
|
const usageId = `${orgId}-${featureId}`;
|
||||||
|
|
||||||
try {
|
try {
|
||||||
const [result] = await db
|
const [result] = await trx
|
||||||
.select()
|
.select()
|
||||||
.from(usage)
|
.from(usage)
|
||||||
.where(eq(usage.usageId, usageId))
|
.where(eq(usage.usageId, usageId))
|
||||||
@@ -635,7 +634,7 @@ export class UsageService {
|
|||||||
const meterId = getFeatureMeterId(featureId);
|
const meterId = getFeatureMeterId(featureId);
|
||||||
|
|
||||||
try {
|
try {
|
||||||
const [newUsage] = await db
|
const [newUsage] = await trx
|
||||||
.insert(usage)
|
.insert(usage)
|
||||||
.values({
|
.values({
|
||||||
usageId,
|
usageId,
|
||||||
@@ -652,7 +651,7 @@ export class UsageService {
|
|||||||
return newUsage;
|
return newUsage;
|
||||||
} else {
|
} else {
|
||||||
// Record was created by another process, fetch it
|
// Record was created by another process, fetch it
|
||||||
const [existingUsage] = await db
|
const [existingUsage] = await trx
|
||||||
.select()
|
.select()
|
||||||
.from(usage)
|
.from(usage)
|
||||||
.where(eq(usage.usageId, usageId))
|
.where(eq(usage.usageId, usageId))
|
||||||
@@ -665,7 +664,7 @@ export class UsageService {
|
|||||||
`Insert failed for ${orgId}/${featureId}, attempting to fetch existing record:`,
|
`Insert failed for ${orgId}/${featureId}, attempting to fetch existing record:`,
|
||||||
insertError
|
insertError
|
||||||
);
|
);
|
||||||
const [existingUsage] = await db
|
const [existingUsage] = await trx
|
||||||
.select()
|
.select()
|
||||||
.from(usage)
|
.from(usage)
|
||||||
.where(eq(usage.usageId, usageId))
|
.where(eq(usage.usageId, usageId))
|
||||||
@@ -699,10 +698,6 @@ export class UsageService {
|
|||||||
await this.uploadFileToS3();
|
await this.uploadFileToS3();
|
||||||
}
|
}
|
||||||
|
|
||||||
public clearCache(): void {
|
|
||||||
this.cache.flushAll();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Scan the events directory for files older than 1 minute and upload them if not empty.
|
* Scan the events directory for files older than 1 minute and upload them if not empty.
|
||||||
*/
|
*/
|
||||||
@@ -812,7 +807,8 @@ export class UsageService {
|
|||||||
orgId: string,
|
orgId: string,
|
||||||
kickSites = false,
|
kickSites = false,
|
||||||
featureId?: FeatureId,
|
featureId?: FeatureId,
|
||||||
usage?: Usage
|
usage?: Usage,
|
||||||
|
trx: Transaction | typeof db = db
|
||||||
): Promise<boolean> {
|
): Promise<boolean> {
|
||||||
if (noop()) {
|
if (noop()) {
|
||||||
return false;
|
return false;
|
||||||
@@ -825,7 +821,7 @@ export class UsageService {
|
|||||||
let orgLimits: Limit[] = [];
|
let orgLimits: Limit[] = [];
|
||||||
if (featureId) {
|
if (featureId) {
|
||||||
// Get all limits set for this organization
|
// Get all limits set for this organization
|
||||||
orgLimits = await db
|
orgLimits = await trx
|
||||||
.select()
|
.select()
|
||||||
.from(limits)
|
.from(limits)
|
||||||
.where(
|
.where(
|
||||||
@@ -836,7 +832,7 @@ export class UsageService {
|
|||||||
);
|
);
|
||||||
} else {
|
} else {
|
||||||
// Get all limits set for this organization
|
// Get all limits set for this organization
|
||||||
orgLimits = await db
|
orgLimits = await trx
|
||||||
.select()
|
.select()
|
||||||
.from(limits)
|
.from(limits)
|
||||||
.where(eq(limits.orgId, orgId));
|
.where(eq(limits.orgId, orgId));
|
||||||
@@ -855,7 +851,8 @@ export class UsageService {
|
|||||||
} else {
|
} else {
|
||||||
currentUsage = await this.getUsage(
|
currentUsage = await this.getUsage(
|
||||||
orgId,
|
orgId,
|
||||||
limit.featureId as FeatureId
|
limit.featureId as FeatureId,
|
||||||
|
trx
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -890,7 +887,7 @@ export class UsageService {
|
|||||||
);
|
);
|
||||||
|
|
||||||
// Get all sites for this organization
|
// Get all sites for this organization
|
||||||
const orgSites = await db
|
const orgSites = await trx
|
||||||
.select()
|
.select()
|
||||||
.from(sites)
|
.from(sites)
|
||||||
.where(eq(sites.orgId, orgId));
|
.where(eq(sites.orgId, orgId));
|
||||||
@@ -902,7 +899,7 @@ export class UsageService {
|
|||||||
// Send termination messages to newt sites
|
// Send termination messages to newt sites
|
||||||
for (const site of orgSites) {
|
for (const site of orgSites) {
|
||||||
if (site.type === "newt") {
|
if (site.type === "newt") {
|
||||||
const [newt] = await db
|
const [newt] = await trx
|
||||||
.select()
|
.select()
|
||||||
.from(newts)
|
.from(newts)
|
||||||
.where(eq(newts.siteId, site.siteId))
|
.where(eq(newts.siteId, site.siteId))
|
||||||
@@ -917,7 +914,7 @@ export class UsageService {
|
|||||||
};
|
};
|
||||||
|
|
||||||
// Don't await to prevent blocking
|
// Don't await to prevent blocking
|
||||||
sendToClient(newt.newtId, payload).catch(
|
await sendToClient(newt.newtId, payload).catch(
|
||||||
(error: any) => {
|
(error: any) => {
|
||||||
logger.error(
|
logger.error(
|
||||||
`Failed to send termination message to newt ${newt.newtId}:`,
|
`Failed to send termination message to newt ${newt.newtId}:`,
|
||||||
|
|||||||
@@ -1,22 +1,35 @@
|
|||||||
import { db, newts, Target } from "@server/db";
|
import { db, newts, blueprints, Blueprint } from "@server/db";
|
||||||
import { Config, ConfigSchema } from "./types";
|
import { Config, ConfigSchema } from "./types";
|
||||||
import { ProxyResourcesResults, updateProxyResources } from "./proxyResources";
|
import { ProxyResourcesResults, updateProxyResources } from "./proxyResources";
|
||||||
import { fromError } from "zod-validation-error";
|
import { fromError } from "zod-validation-error";
|
||||||
import logger from "@server/logger";
|
import logger from "@server/logger";
|
||||||
import { resources, targets, sites } from "@server/db";
|
import { sites } from "@server/db";
|
||||||
import { eq, and, asc, or, ne, count, isNotNull } from "drizzle-orm";
|
import { eq, and, isNotNull } from "drizzle-orm";
|
||||||
import { addTargets as addProxyTargets } from "@server/routers/newt/targets";
|
import { addTargets as addProxyTargets } from "@server/routers/newt/targets";
|
||||||
import { addTargets as addClientTargets } from "@server/routers/client/targets";
|
import { addTargets as addClientTargets } from "@server/routers/client/targets";
|
||||||
import {
|
import {
|
||||||
ClientResourcesResults,
|
ClientResourcesResults,
|
||||||
updateClientResources
|
updateClientResources
|
||||||
} from "./clientResources";
|
} from "./clientResources";
|
||||||
|
import { BlueprintSource } from "@server/routers/blueprints/types";
|
||||||
|
import { stringify as stringifyYaml } from "yaml";
|
||||||
|
import { faker } from "@faker-js/faker";
|
||||||
|
|
||||||
export async function applyBlueprint(
|
type ApplyBlueprintArgs = {
|
||||||
orgId: string,
|
orgId: string;
|
||||||
configData: unknown,
|
configData: unknown;
|
||||||
siteId?: number
|
name?: string;
|
||||||
): Promise<void> {
|
siteId?: number;
|
||||||
|
source?: BlueprintSource;
|
||||||
|
};
|
||||||
|
|
||||||
|
export async function applyBlueprint({
|
||||||
|
orgId,
|
||||||
|
configData,
|
||||||
|
siteId,
|
||||||
|
name,
|
||||||
|
source = "API"
|
||||||
|
}: ApplyBlueprintArgs): Promise<Blueprint> {
|
||||||
// Validate the input data
|
// Validate the input data
|
||||||
const validationResult = ConfigSchema.safeParse(configData);
|
const validationResult = ConfigSchema.safeParse(configData);
|
||||||
if (!validationResult.success) {
|
if (!validationResult.success) {
|
||||||
@@ -24,6 +37,9 @@ export async function applyBlueprint(
|
|||||||
}
|
}
|
||||||
|
|
||||||
const config: Config = validationResult.data;
|
const config: Config = validationResult.data;
|
||||||
|
let blueprintSucceeded: boolean = false;
|
||||||
|
let blueprintMessage: string;
|
||||||
|
let error: any | null = null;
|
||||||
|
|
||||||
try {
|
try {
|
||||||
let proxyResourcesResults: ProxyResourcesResults = [];
|
let proxyResourcesResults: ProxyResourcesResults = [];
|
||||||
@@ -120,10 +136,42 @@ export async function applyBlueprint(
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} catch (error) {
|
|
||||||
logger.error(`Failed to update database from config: ${error}`);
|
blueprintSucceeded = true;
|
||||||
throw error;
|
blueprintMessage = "Blueprint applied successfully";
|
||||||
|
} catch (err) {
|
||||||
|
blueprintSucceeded = false;
|
||||||
|
blueprintMessage = `Blueprint applied with errors: ${err}`;
|
||||||
|
logger.error(blueprintMessage);
|
||||||
|
error = err;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
let blueprint: Blueprint | null = null;
|
||||||
|
await db.transaction(async (trx) => {
|
||||||
|
const newBlueprint = await trx
|
||||||
|
.insert(blueprints)
|
||||||
|
.values({
|
||||||
|
orgId,
|
||||||
|
name:
|
||||||
|
name ??
|
||||||
|
`${faker.word.adjective()} ${faker.word.adjective()} ${faker.word.noun()}`,
|
||||||
|
contents: stringifyYaml(configData),
|
||||||
|
createdAt: Math.floor(Date.now() / 1000),
|
||||||
|
succeeded: blueprintSucceeded,
|
||||||
|
message: blueprintMessage,
|
||||||
|
source
|
||||||
|
})
|
||||||
|
.returning();
|
||||||
|
|
||||||
|
blueprint = newBlueprint[0];
|
||||||
|
});
|
||||||
|
|
||||||
|
if (!blueprint || (source !== "UI" && !blueprintSucceeded)) {
|
||||||
|
// ^^^^^^^^^^^^^^^ The UI considers a failed blueprint as a valid response
|
||||||
|
throw error ?? "Unknown Server Error";
|
||||||
|
}
|
||||||
|
|
||||||
|
return blueprint;
|
||||||
}
|
}
|
||||||
|
|
||||||
// await updateDatabaseFromConfig("org_i21aifypnlyxur2", {
|
// await updateDatabaseFromConfig("org_i21aifypnlyxur2", {
|
||||||
@@ -139,8 +187,8 @@ export async function applyBlueprint(
|
|||||||
// password: "sadfasdfadsf",
|
// password: "sadfasdfadsf",
|
||||||
// "sso-enabled": true,
|
// "sso-enabled": true,
|
||||||
// "sso-roles": ["Member"],
|
// "sso-roles": ["Member"],
|
||||||
// "sso-users": ["owen@fossorial.io"],
|
// "sso-users": ["owen@pangolin.net"],
|
||||||
// "whitelist-users": ["owen@fossorial.io"]
|
// "whitelist-users": ["owen@pangolin.net"]
|
||||||
// },
|
// },
|
||||||
// targets: [
|
// targets: [
|
||||||
// {
|
// {
|
||||||
|
|||||||
@@ -29,15 +29,29 @@ export async function applyNewtDockerBlueprint(
|
|||||||
|
|
||||||
logger.debug(`Received Docker blueprint: ${JSON.stringify(blueprint)}`);
|
logger.debug(`Received Docker blueprint: ${JSON.stringify(blueprint)}`);
|
||||||
|
|
||||||
|
// make sure this is not an empty object
|
||||||
|
if (isEmptyObject(blueprint)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isEmptyObject(blueprint["proxy-resources"]) && isEmptyObject(blueprint["client-resources"])) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
// Update the blueprint in the database
|
// Update the blueprint in the database
|
||||||
await applyBlueprint(site.orgId, blueprint, site.siteId);
|
await applyBlueprint({
|
||||||
|
orgId: site.orgId,
|
||||||
|
configData: blueprint,
|
||||||
|
siteId: site.siteId,
|
||||||
|
source: "NEWT"
|
||||||
|
});
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
logger.error(`Failed to update database from config: ${error}`);
|
logger.error(`Failed to update database from config: ${error}`);
|
||||||
await sendToClient(newtId, {
|
await sendToClient(newtId, {
|
||||||
type: "newt/blueprint/results",
|
type: "newt/blueprint/results",
|
||||||
data: {
|
data: {
|
||||||
success: false,
|
success: false,
|
||||||
message: `Failed to update database from config: ${error}`
|
message: `Failed to apply blueprint from config: ${error}`
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
return;
|
return;
|
||||||
@@ -51,3 +65,10 @@ export async function applyNewtDockerBlueprint(
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function isEmptyObject(obj: any) {
|
||||||
|
if (obj === null || obj === undefined) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return Object.keys(obj).length === 0 && obj.constructor === Object;
|
||||||
|
}
|
||||||
|
|||||||
@@ -87,8 +87,8 @@ export function convertValue(value: string): any {
|
|||||||
// "resources.resource-nice-id.auth.password": "sadfasdfadsf",
|
// "resources.resource-nice-id.auth.password": "sadfasdfadsf",
|
||||||
// "resources.resource-nice-id.auth.sso-enabled": "true",
|
// "resources.resource-nice-id.auth.sso-enabled": "true",
|
||||||
// "resources.resource-nice-id.auth.sso-roles[0]": "Member",
|
// "resources.resource-nice-id.auth.sso-roles[0]": "Member",
|
||||||
// "resources.resource-nice-id.auth.sso-users[0]": "owen@fossorial.io",
|
// "resources.resource-nice-id.auth.sso-users[0]": "owen@pangolin.net",
|
||||||
// "resources.resource-nice-id.auth.whitelist-users[0]": "owen@fossorial.io",
|
// "resources.resource-nice-id.auth.whitelist-users[0]": "owen@pangolin.net",
|
||||||
// "resources.resource-nice-id.targets[0].hostname": "localhost",
|
// "resources.resource-nice-id.targets[0].hostname": "localhost",
|
||||||
// "resources.resource-nice-id.targets[0].method": "http",
|
// "resources.resource-nice-id.targets[0].method": "http",
|
||||||
// "resources.resource-nice-id.targets[0].port": "8000",
|
// "resources.resource-nice-id.targets[0].port": "8000",
|
||||||
|
|||||||
@@ -114,7 +114,12 @@ export async function updateProxyResources(
|
|||||||
internalPort: internalPortToCreate,
|
internalPort: internalPortToCreate,
|
||||||
path: targetData.path,
|
path: targetData.path,
|
||||||
pathMatchType: targetData["path-match"],
|
pathMatchType: targetData["path-match"],
|
||||||
rewritePath: targetData.rewritePath,
|
rewritePath:
|
||||||
|
targetData.rewritePath ||
|
||||||
|
targetData["rewrite-path"] ||
|
||||||
|
(targetData["rewrite-match"] === "stripPrefix"
|
||||||
|
? "/"
|
||||||
|
: undefined),
|
||||||
rewritePathType: targetData["rewrite-match"],
|
rewritePathType: targetData["rewrite-match"],
|
||||||
priority: targetData.priority
|
priority: targetData.priority
|
||||||
})
|
})
|
||||||
@@ -139,10 +144,14 @@ export async function updateProxyResources(
|
|||||||
hcHostname: healthcheckData?.hostname,
|
hcHostname: healthcheckData?.hostname,
|
||||||
hcPort: healthcheckData?.port,
|
hcPort: healthcheckData?.port,
|
||||||
hcInterval: healthcheckData?.interval,
|
hcInterval: healthcheckData?.interval,
|
||||||
hcUnhealthyInterval: healthcheckData?.unhealthyInterval,
|
hcUnhealthyInterval:
|
||||||
|
healthcheckData?.unhealthyInterval ||
|
||||||
|
healthcheckData?.["unhealthy-interval"],
|
||||||
hcTimeout: healthcheckData?.timeout,
|
hcTimeout: healthcheckData?.timeout,
|
||||||
hcHeaders: hcHeaders,
|
hcHeaders: hcHeaders,
|
||||||
hcFollowRedirects: healthcheckData?.followRedirects,
|
hcFollowRedirects:
|
||||||
|
healthcheckData?.followRedirects ||
|
||||||
|
healthcheckData?.["follow-redirects"],
|
||||||
hcMethod: healthcheckData?.method,
|
hcMethod: healthcheckData?.method,
|
||||||
hcStatus: healthcheckData?.status,
|
hcStatus: healthcheckData?.status,
|
||||||
hcHealth: "unknown"
|
hcHealth: "unknown"
|
||||||
@@ -392,7 +401,12 @@ export async function updateProxyResources(
|
|||||||
enabled: targetData.enabled,
|
enabled: targetData.enabled,
|
||||||
path: targetData.path,
|
path: targetData.path,
|
||||||
pathMatchType: targetData["path-match"],
|
pathMatchType: targetData["path-match"],
|
||||||
rewritePath: targetData.rewritePath,
|
rewritePath:
|
||||||
|
targetData.rewritePath ||
|
||||||
|
targetData["rewrite-path"] ||
|
||||||
|
(targetData["rewrite-match"] === "stripPrefix"
|
||||||
|
? "/"
|
||||||
|
: undefined),
|
||||||
rewritePathType: targetData["rewrite-match"],
|
rewritePathType: targetData["rewrite-match"],
|
||||||
priority: targetData.priority
|
priority: targetData.priority
|
||||||
})
|
})
|
||||||
@@ -452,10 +466,13 @@ export async function updateProxyResources(
|
|||||||
hcPort: healthcheckData?.port,
|
hcPort: healthcheckData?.port,
|
||||||
hcInterval: healthcheckData?.interval,
|
hcInterval: healthcheckData?.interval,
|
||||||
hcUnhealthyInterval:
|
hcUnhealthyInterval:
|
||||||
healthcheckData?.unhealthyInterval,
|
healthcheckData?.unhealthyInterval ||
|
||||||
|
healthcheckData?.["unhealthy-interval"],
|
||||||
hcTimeout: healthcheckData?.timeout,
|
hcTimeout: healthcheckData?.timeout,
|
||||||
hcHeaders: hcHeaders,
|
hcHeaders: hcHeaders,
|
||||||
hcFollowRedirects: healthcheckData?.followRedirects,
|
hcFollowRedirects:
|
||||||
|
healthcheckData?.followRedirects ||
|
||||||
|
healthcheckData?.["follow-redirects"],
|
||||||
hcMethod: healthcheckData?.method,
|
hcMethod: healthcheckData?.method,
|
||||||
hcStatus: healthcheckData?.status
|
hcStatus: healthcheckData?.status
|
||||||
})
|
})
|
||||||
@@ -527,7 +544,7 @@ export async function updateProxyResources(
|
|||||||
if (
|
if (
|
||||||
existingRule.action !== getRuleAction(rule.action) ||
|
existingRule.action !== getRuleAction(rule.action) ||
|
||||||
existingRule.match !== rule.match.toUpperCase() ||
|
existingRule.match !== rule.match.toUpperCase() ||
|
||||||
existingRule.value !== rule.value
|
existingRule.value !== rule.value.toUpperCase()
|
||||||
) {
|
) {
|
||||||
validateRule(rule);
|
validateRule(rule);
|
||||||
await trx
|
await trx
|
||||||
@@ -535,7 +552,7 @@ export async function updateProxyResources(
|
|||||||
.set({
|
.set({
|
||||||
action: getRuleAction(rule.action),
|
action: getRuleAction(rule.action),
|
||||||
match: rule.match.toUpperCase(),
|
match: rule.match.toUpperCase(),
|
||||||
value: rule.value
|
value: rule.value.toUpperCase()
|
||||||
})
|
})
|
||||||
.where(
|
.where(
|
||||||
eq(resourceRules.ruleId, existingRule.ruleId)
|
eq(resourceRules.ruleId, existingRule.ruleId)
|
||||||
@@ -547,7 +564,7 @@ export async function updateProxyResources(
|
|||||||
resourceId: existingResource.resourceId,
|
resourceId: existingResource.resourceId,
|
||||||
action: getRuleAction(rule.action),
|
action: getRuleAction(rule.action),
|
||||||
match: rule.match.toUpperCase(),
|
match: rule.match.toUpperCase(),
|
||||||
value: rule.value,
|
value: rule.value.toUpperCase(),
|
||||||
priority: index + 1 // start priorities at 1
|
priority: index + 1 // start priorities at 1
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@@ -705,7 +722,7 @@ export async function updateProxyResources(
|
|||||||
resourceId: newResource.resourceId,
|
resourceId: newResource.resourceId,
|
||||||
action: getRuleAction(rule.action),
|
action: getRuleAction(rule.action),
|
||||||
match: rule.match.toUpperCase(),
|
match: rule.match.toUpperCase(),
|
||||||
value: rule.value,
|
value: rule.value.toUpperCase(),
|
||||||
priority: index + 1 // start priorities at 1
|
priority: index + 1 // start priorities at 1
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -13,10 +13,12 @@ export const TargetHealthCheckSchema = z.object({
|
|||||||
scheme: z.string().optional(),
|
scheme: z.string().optional(),
|
||||||
mode: z.string().default("http"),
|
mode: z.string().default("http"),
|
||||||
interval: z.number().int().default(30),
|
interval: z.number().int().default(30),
|
||||||
unhealthyInterval: z.number().int().default(30),
|
"unhealthy-interval": z.number().int().default(30),
|
||||||
|
unhealthyInterval: z.number().int().optional(), // deprecated alias
|
||||||
timeout: z.number().int().default(5),
|
timeout: z.number().int().default(5),
|
||||||
headers: z.array(z.object({ name: z.string(), value: z.string() })).nullable().optional().default(null),
|
headers: z.array(z.object({ name: z.string(), value: z.string() })).nullable().optional().default(null),
|
||||||
followRedirects: z.boolean().default(true),
|
"follow-redirects": z.boolean().default(true),
|
||||||
|
followRedirects: z.boolean().optional(), // deprecated alias
|
||||||
method: z.string().default("GET"),
|
method: z.string().default("GET"),
|
||||||
status: z.number().int().optional()
|
status: z.number().int().optional()
|
||||||
});
|
});
|
||||||
@@ -32,7 +34,8 @@ export const TargetSchema = z.object({
|
|||||||
path: z.string().optional(),
|
path: z.string().optional(),
|
||||||
"path-match": z.enum(["exact", "prefix", "regex"]).optional().nullable(),
|
"path-match": z.enum(["exact", "prefix", "regex"]).optional().nullable(),
|
||||||
healthcheck: TargetHealthCheckSchema.optional(),
|
healthcheck: TargetHealthCheckSchema.optional(),
|
||||||
rewritePath: z.string().optional(),
|
rewritePath: z.string().optional(), // deprecated alias
|
||||||
|
"rewrite-path": z.string().optional(),
|
||||||
"rewrite-match": z.enum(["exact", "prefix", "regex", "stripPrefix"]).optional().nullable(),
|
"rewrite-match": z.enum(["exact", "prefix", "regex", "stripPrefix"]).optional().nullable(),
|
||||||
priority: z.number().int().min(1).max(1000).optional().default(100)
|
priority: z.number().int().min(1).max(1000).optional().default(100)
|
||||||
});
|
});
|
||||||
@@ -275,24 +278,26 @@ export const ConfigSchema = z
|
|||||||
}
|
}
|
||||||
)
|
)
|
||||||
.refine(
|
.refine(
|
||||||
// Enforce proxy-port uniqueness within proxy-resources
|
// Enforce proxy-port uniqueness within proxy-resources per protocol
|
||||||
(config) => {
|
(config) => {
|
||||||
const proxyPortMap = new Map<number, string[]>();
|
const protocolPortMap = new Map<string, string[]>();
|
||||||
|
|
||||||
Object.entries(config["proxy-resources"]).forEach(
|
Object.entries(config["proxy-resources"]).forEach(
|
||||||
([resourceKey, resource]) => {
|
([resourceKey, resource]) => {
|
||||||
const proxyPort = resource["proxy-port"];
|
const proxyPort = resource["proxy-port"];
|
||||||
if (proxyPort !== undefined) {
|
const protocol = resource.protocol;
|
||||||
if (!proxyPortMap.has(proxyPort)) {
|
if (proxyPort !== undefined && protocol !== undefined) {
|
||||||
proxyPortMap.set(proxyPort, []);
|
const key = `${protocol}:${proxyPort}`;
|
||||||
|
if (!protocolPortMap.has(key)) {
|
||||||
|
protocolPortMap.set(key, []);
|
||||||
}
|
}
|
||||||
proxyPortMap.get(proxyPort)!.push(resourceKey);
|
protocolPortMap.get(key)!.push(resourceKey);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
// Find duplicates
|
// Find duplicates
|
||||||
const duplicates = Array.from(proxyPortMap.entries()).filter(
|
const duplicates = Array.from(protocolPortMap.entries()).filter(
|
||||||
([_, resourceKeys]) => resourceKeys.length > 1
|
([_, resourceKeys]) => resourceKeys.length > 1
|
||||||
);
|
);
|
||||||
|
|
||||||
@@ -300,25 +305,29 @@ export const ConfigSchema = z
|
|||||||
},
|
},
|
||||||
(config) => {
|
(config) => {
|
||||||
// Extract duplicates for error message
|
// Extract duplicates for error message
|
||||||
const proxyPortMap = new Map<number, string[]>();
|
const protocolPortMap = new Map<string, string[]>();
|
||||||
|
|
||||||
Object.entries(config["proxy-resources"]).forEach(
|
Object.entries(config["proxy-resources"]).forEach(
|
||||||
([resourceKey, resource]) => {
|
([resourceKey, resource]) => {
|
||||||
const proxyPort = resource["proxy-port"];
|
const proxyPort = resource["proxy-port"];
|
||||||
if (proxyPort !== undefined) {
|
const protocol = resource.protocol;
|
||||||
if (!proxyPortMap.has(proxyPort)) {
|
if (proxyPort !== undefined && protocol !== undefined) {
|
||||||
proxyPortMap.set(proxyPort, []);
|
const key = `${protocol}:${proxyPort}`;
|
||||||
|
if (!protocolPortMap.has(key)) {
|
||||||
|
protocolPortMap.set(key, []);
|
||||||
}
|
}
|
||||||
proxyPortMap.get(proxyPort)!.push(resourceKey);
|
protocolPortMap.get(key)!.push(resourceKey);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
const duplicates = Array.from(proxyPortMap.entries())
|
const duplicates = Array.from(protocolPortMap.entries())
|
||||||
.filter(([_, resourceKeys]) => resourceKeys.length > 1)
|
.filter(([_, resourceKeys]) => resourceKeys.length > 1)
|
||||||
.map(
|
.map(
|
||||||
([proxyPort, resourceKeys]) =>
|
([protocolPort, resourceKeys]) => {
|
||||||
`port ${proxyPort} used by proxy-resources: ${resourceKeys.join(", ")}`
|
const [protocol, port] = protocolPort.split(':');
|
||||||
|
return `${protocol.toUpperCase()} port ${port} used by proxy-resources: ${resourceKeys.join(", ")}`;
|
||||||
|
}
|
||||||
)
|
)
|
||||||
.join("; ");
|
.join("; ");
|
||||||
|
|
||||||
|
|||||||
5
server/lib/cache.ts
Normal file
5
server/lib/cache.ts
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
import NodeCache from "node-cache";
|
||||||
|
|
||||||
|
export const cache = new NodeCache({ stdTTL: 3600, checkperiod: 120 });
|
||||||
|
|
||||||
|
export default cache;
|
||||||
41
server/lib/checkOrgAccessPolicy.ts
Normal file
41
server/lib/checkOrgAccessPolicy.ts
Normal file
@@ -0,0 +1,41 @@
|
|||||||
|
import { Org, ResourceSession, Session, User } from "@server/db";
|
||||||
|
|
||||||
|
export type CheckOrgAccessPolicyProps = {
|
||||||
|
orgId?: string;
|
||||||
|
org?: Org;
|
||||||
|
userId?: string;
|
||||||
|
user?: User;
|
||||||
|
sessionId?: string;
|
||||||
|
session?: Session;
|
||||||
|
};
|
||||||
|
|
||||||
|
export type CheckOrgAccessPolicyResult = {
|
||||||
|
allowed: boolean;
|
||||||
|
error?: string;
|
||||||
|
policies?: {
|
||||||
|
requiredTwoFactor?: boolean;
|
||||||
|
maxSessionLength?: {
|
||||||
|
compliant: boolean;
|
||||||
|
maxSessionLengthHours: number;
|
||||||
|
sessionAgeHours: number;
|
||||||
|
};
|
||||||
|
passwordAge?: {
|
||||||
|
compliant: boolean;
|
||||||
|
maxPasswordAgeDays: number;
|
||||||
|
passwordAgeDays: number;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
export async function enforceResourceSessionLength(
|
||||||
|
resourceSession: ResourceSession,
|
||||||
|
org: Org
|
||||||
|
): Promise<{ valid: boolean; error?: string }> {
|
||||||
|
return { valid: true };
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function checkOrgAccessPolicy(
|
||||||
|
props: CheckOrgAccessPolicyProps
|
||||||
|
): Promise<CheckOrgAccessPolicyResult> {
|
||||||
|
return { allowed: true };
|
||||||
|
}
|
||||||
62
server/lib/cleanupLogs.ts
Normal file
62
server/lib/cleanupLogs.ts
Normal file
@@ -0,0 +1,62 @@
|
|||||||
|
import { db, orgs } from "@server/db";
|
||||||
|
import { cleanUpOldLogs as cleanUpOldAccessLogs } from "#dynamic/lib/logAccessAudit";
|
||||||
|
import { cleanUpOldLogs as cleanUpOldActionLogs } from "#dynamic/middlewares/logActionAudit";
|
||||||
|
import { cleanUpOldLogs as cleanUpOldRequestLogs } from "@server/routers/badger/logRequestAudit";
|
||||||
|
import { gt, or } from "drizzle-orm";
|
||||||
|
|
||||||
|
export function initLogCleanupInterval() {
|
||||||
|
return setInterval(
|
||||||
|
async () => {
|
||||||
|
const orgsToClean = await db
|
||||||
|
.select({
|
||||||
|
orgId: orgs.orgId,
|
||||||
|
settingsLogRetentionDaysAction:
|
||||||
|
orgs.settingsLogRetentionDaysAction,
|
||||||
|
settingsLogRetentionDaysAccess:
|
||||||
|
orgs.settingsLogRetentionDaysAccess,
|
||||||
|
settingsLogRetentionDaysRequest:
|
||||||
|
orgs.settingsLogRetentionDaysRequest
|
||||||
|
})
|
||||||
|
.from(orgs)
|
||||||
|
.where(
|
||||||
|
or(
|
||||||
|
gt(orgs.settingsLogRetentionDaysAction, 0),
|
||||||
|
gt(orgs.settingsLogRetentionDaysAccess, 0),
|
||||||
|
gt(orgs.settingsLogRetentionDaysRequest, 0)
|
||||||
|
)
|
||||||
|
);
|
||||||
|
|
||||||
|
for (const org of orgsToClean) {
|
||||||
|
const {
|
||||||
|
orgId,
|
||||||
|
settingsLogRetentionDaysAction,
|
||||||
|
settingsLogRetentionDaysAccess,
|
||||||
|
settingsLogRetentionDaysRequest
|
||||||
|
} = org;
|
||||||
|
|
||||||
|
if (settingsLogRetentionDaysAction > 0) {
|
||||||
|
await cleanUpOldActionLogs(
|
||||||
|
orgId,
|
||||||
|
settingsLogRetentionDaysRequest
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (settingsLogRetentionDaysAccess > 0) {
|
||||||
|
await cleanUpOldAccessLogs(
|
||||||
|
orgId,
|
||||||
|
settingsLogRetentionDaysRequest
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (settingsLogRetentionDaysRequest > 0) {
|
||||||
|
await cleanUpOldRequestLogs(
|
||||||
|
orgId,
|
||||||
|
settingsLogRetentionDaysRequest
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
// 3 * 60 * 60 * 1000
|
||||||
|
60 * 1000 // for testing
|
||||||
|
); // every 3 hours
|
||||||
|
}
|
||||||
@@ -2,7 +2,7 @@ import path from "path";
|
|||||||
import { fileURLToPath } from "url";
|
import { fileURLToPath } from "url";
|
||||||
|
|
||||||
// This is a placeholder value replaced by the build process
|
// This is a placeholder value replaced by the build process
|
||||||
export const APP_VERSION = "1.11.0";
|
export const APP_VERSION = "1.12.0-rc.0";
|
||||||
|
|
||||||
export const __FILENAME = fileURLToPath(import.meta.url);
|
export const __FILENAME = fileURLToPath(import.meta.url);
|
||||||
export const __DIRNAME = path.dirname(__FILENAME);
|
export const __DIRNAME = path.dirname(__FILENAME);
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import { db, exitNodes } from "@server/db";
|
import { db, exitNodes, Transaction } from "@server/db";
|
||||||
import logger from "@server/logger";
|
import logger from "@server/logger";
|
||||||
import { ExitNodePingResult } from "@server/routers/newt";
|
import { ExitNodePingResult } from "@server/routers/newt";
|
||||||
import { eq } from "drizzle-orm";
|
import { eq } from "drizzle-orm";
|
||||||
@@ -59,7 +59,11 @@ export function selectBestExitNode(
|
|||||||
return pingResults[0];
|
return pingResults[0];
|
||||||
}
|
}
|
||||||
|
|
||||||
export async function checkExitNodeOrg(exitNodeId: number, orgId: string) {
|
export async function checkExitNodeOrg(
|
||||||
|
exitNodeId: number,
|
||||||
|
orgId: string,
|
||||||
|
trx?: Transaction | typeof db
|
||||||
|
): Promise<boolean> {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ export async function getCountryCodeForIp(
|
|||||||
): Promise<string | undefined> {
|
): Promise<string | undefined> {
|
||||||
try {
|
try {
|
||||||
if (!maxmindLookup) {
|
if (!maxmindLookup) {
|
||||||
logger.warn(
|
logger.debug(
|
||||||
"MaxMind DB path not configured, cannot perform GeoIP lookup"
|
"MaxMind DB path not configured, cannot perform GeoIP lookup"
|
||||||
);
|
);
|
||||||
return;
|
return;
|
||||||
|
|||||||
17
server/lib/logAccessAudit.ts
Normal file
17
server/lib/logAccessAudit.ts
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
export async function cleanUpOldLogs(orgId: string, retentionDays: number) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function logAccessAudit(data: {
|
||||||
|
action: boolean;
|
||||||
|
type: string;
|
||||||
|
orgId: string;
|
||||||
|
resourceId?: number;
|
||||||
|
user?: { username: string; userId: string };
|
||||||
|
apiKey?: { name: string | null; apiKeyId: string };
|
||||||
|
metadata?: any;
|
||||||
|
userAgent?: string;
|
||||||
|
requestIp?: string;
|
||||||
|
}) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
@@ -50,7 +50,7 @@ export const configSchema = z
|
|||||||
.string()
|
.string()
|
||||||
.nonempty("base_domain must not be empty")
|
.nonempty("base_domain must not be empty")
|
||||||
.transform((url) => url.toLowerCase()),
|
.transform((url) => url.toLowerCase()),
|
||||||
cert_resolver: z.string().optional().default("letsencrypt"),
|
cert_resolver: z.string().optional(), // null falls back to traefik.cert_resolver
|
||||||
prefer_wildcard_cert: z.boolean().optional().default(false)
|
prefer_wildcard_cert: z.boolean().optional().default(false)
|
||||||
})
|
})
|
||||||
)
|
)
|
||||||
@@ -204,7 +204,8 @@ export const configSchema = z
|
|||||||
.optional()
|
.optional()
|
||||||
.default(["newt", "wireguard", "local"]),
|
.default(["newt", "wireguard", "local"]),
|
||||||
allow_raw_resources: z.boolean().optional().default(true),
|
allow_raw_resources: z.boolean().optional().default(true),
|
||||||
file_mode: z.boolean().optional().default(false)
|
file_mode: z.boolean().optional().default(false),
|
||||||
|
pp_transport_prefix: z.string().optional().default("pp-transport-v")
|
||||||
})
|
})
|
||||||
.optional()
|
.optional()
|
||||||
.default({}),
|
.default({}),
|
||||||
@@ -314,14 +315,11 @@ export const configSchema = z
|
|||||||
nameservers: z
|
nameservers: z
|
||||||
.array(z.string().optional().optional())
|
.array(z.string().optional().optional())
|
||||||
.optional()
|
.optional()
|
||||||
.default(["ns1.fossorial.io", "ns2.fossorial.io"]),
|
.default(["ns1.pangolin.net", "ns2.pangolin.net", "ns3.pangolin.net"]),
|
||||||
cname_extension: z.string().optional().default("fossorial.io")
|
cname_extension: z.string().optional().default("cname.pangolin.net")
|
||||||
})
|
})
|
||||||
.optional()
|
.optional()
|
||||||
.default({
|
.default({})
|
||||||
nameservers: ["ns1.fossorial.io", "ns2.fossorial.io"],
|
|
||||||
cname_extension: "fossorial.io"
|
|
||||||
})
|
|
||||||
})
|
})
|
||||||
.refine(
|
.refine(
|
||||||
(data) => {
|
(data) => {
|
||||||
@@ -392,7 +390,7 @@ export function readConfigFile() {
|
|||||||
|
|
||||||
if (!environment) {
|
if (!environment) {
|
||||||
throw new Error(
|
throw new Error(
|
||||||
"No configuration file found. Please create one. https://docs.digpangolin.com/self-host/advanced/config-file"
|
"No configuration file found. Please create one. https://docs.pangolin.net/self-host/advanced/config-file"
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,8 @@
|
|||||||
export enum AudienceIds {
|
export enum AudienceIds {
|
||||||
General = "",
|
SignUps = "",
|
||||||
Subscribed = "",
|
Subscribed = "",
|
||||||
Churned = ""
|
Churned = "",
|
||||||
|
Newsletter = ""
|
||||||
}
|
}
|
||||||
|
|
||||||
let resend;
|
let resend;
|
||||||
@@ -12,4 +13,4 @@ export async function moveEmailToAudience(
|
|||||||
audienceId: AudienceIds
|
audienceId: AudienceIds
|
||||||
) {
|
) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|||||||
29
server/lib/serverIpService.ts
Normal file
29
server/lib/serverIpService.ts
Normal file
@@ -0,0 +1,29 @@
|
|||||||
|
import logger from "@server/logger";
|
||||||
|
import axios from "axios";
|
||||||
|
|
||||||
|
let serverIp: string | null = null;
|
||||||
|
|
||||||
|
const services = [
|
||||||
|
"https://checkip.amazonaws.com",
|
||||||
|
"https://ifconfig.io/ip",
|
||||||
|
"https://api.ipify.org",
|
||||||
|
];
|
||||||
|
|
||||||
|
export async function fetchServerIp() {
|
||||||
|
for (const url of services) {
|
||||||
|
try {
|
||||||
|
const response = await axios.get(url, { timeout: 5000 });
|
||||||
|
serverIp = response.data.trim();
|
||||||
|
logger.debug("Detected public IP: " + serverIp);
|
||||||
|
return;
|
||||||
|
} catch (err: any) {
|
||||||
|
console.warn(`Failed to fetch server IP from ${url}: ${err.message || err.code}`);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
console.error("All attempts to fetch server IP failed.");
|
||||||
|
}
|
||||||
|
|
||||||
|
export function getServerIp() {
|
||||||
|
return serverIp;
|
||||||
|
}
|
||||||
@@ -33,7 +33,7 @@ class TelemetryClient {
|
|||||||
this.client = new PostHog(
|
this.client = new PostHog(
|
||||||
"phc_QYuATSSZt6onzssWcYJbXLzQwnunIpdGGDTYhzK3VjX",
|
"phc_QYuATSSZt6onzssWcYJbXLzQwnunIpdGGDTYhzK3VjX",
|
||||||
{
|
{
|
||||||
host: "https://digpangolin.com/relay-O7yI"
|
host: "https://pangolin.net/relay-O7yI"
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
@@ -48,11 +48,11 @@ class TelemetryClient {
|
|||||||
this.startAnalyticsInterval();
|
this.startAnalyticsInterval();
|
||||||
|
|
||||||
logger.info(
|
logger.info(
|
||||||
"Pangolin now gathers anonymous usage data to help us better understand how the software is used and guide future improvements and feature development. You can find more details, including instructions for opting out of this anonymous data collection, at: https://docs.digpangolin.com/telemetry"
|
"Pangolin now gathers anonymous usage data to help us better understand how the software is used and guide future improvements and feature development. You can find more details, including instructions for opting out of this anonymous data collection, at: https://docs.pangolin.net/telemetry"
|
||||||
);
|
);
|
||||||
} else if (!this.enabled) {
|
} else if (!this.enabled) {
|
||||||
logger.info(
|
logger.info(
|
||||||
"Analytics usage statistics collection is disabled. If you enable this, you can help us make Pangolin better for everyone. Learn more at: https://docs.digpangolin.com/telemetry"
|
"Analytics usage statistics collection is disabled. If you enable this, you can help us make Pangolin better for everyone. Learn more at: https://docs.pangolin.net/telemetry"
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -200,10 +200,7 @@ class TelemetryClient {
|
|||||||
event: "supporter_status",
|
event: "supporter_status",
|
||||||
properties: {
|
properties: {
|
||||||
valid: stats.supporterStatus.valid,
|
valid: stats.supporterStatus.valid,
|
||||||
tier: stats.supporterStatus.tier,
|
tier: stats.supporterStatus.tier
|
||||||
github_username: stats.supporterStatus.githubUsername
|
|
||||||
? this.anon(stats.supporterStatus.githubUsername)
|
|
||||||
: "None"
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@@ -217,21 +214,6 @@ class TelemetryClient {
|
|||||||
install_timestamp: hostMeta.createdAt
|
install_timestamp: hostMeta.createdAt
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
for (const email of stats.adminUsers) {
|
|
||||||
// There should only be on admin user, but just in case
|
|
||||||
if (email) {
|
|
||||||
this.client.capture({
|
|
||||||
distinctId: this.anon(email),
|
|
||||||
event: "admin_user",
|
|
||||||
properties: {
|
|
||||||
host_id: hostMeta.hostMetaId,
|
|
||||||
app_version: stats.appVersion,
|
|
||||||
hashed_email: this.anon(email)
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private async collectAndSendAnalytics() {
|
private async collectAndSendAnalytics() {
|
||||||
@@ -262,19 +244,38 @@ class TelemetryClient {
|
|||||||
num_clients: stats.numClients,
|
num_clients: stats.numClients,
|
||||||
num_identity_providers: stats.numIdentityProviders,
|
num_identity_providers: stats.numIdentityProviders,
|
||||||
num_sites_online: stats.numSitesOnline,
|
num_sites_online: stats.numSitesOnline,
|
||||||
resources: stats.resources.map((r) => ({
|
num_resources_sso_enabled: stats.resources.filter(
|
||||||
name: this.anon(r.name),
|
(r) => r.sso
|
||||||
sso_enabled: r.sso,
|
).length,
|
||||||
protocol: r.protocol,
|
num_resources_non_http: stats.resources.filter(
|
||||||
http_enabled: r.http
|
(r) => !r.http
|
||||||
})),
|
).length,
|
||||||
sites: stats.sites.map((s) => ({
|
num_newt_sites: stats.sites.filter((s) => s.type === "newt")
|
||||||
site_name: this.anon(s.siteName),
|
.length,
|
||||||
megabytes_in: s.megabytesIn,
|
num_local_sites: stats.sites.filter(
|
||||||
megabytes_out: s.megabytesOut,
|
(s) => s.type === "local"
|
||||||
type: s.type,
|
).length,
|
||||||
online: s.online
|
num_wg_sites: stats.sites.filter(
|
||||||
})),
|
(s) => s.type === "wireguard"
|
||||||
|
).length,
|
||||||
|
avg_megabytes_in:
|
||||||
|
stats.sites.length > 0
|
||||||
|
? Math.round(
|
||||||
|
stats.sites.reduce(
|
||||||
|
(sum, s) => sum + (s.megabytesIn ?? 0),
|
||||||
|
0
|
||||||
|
) / stats.sites.length
|
||||||
|
)
|
||||||
|
: 0,
|
||||||
|
avg_megabytes_out:
|
||||||
|
stats.sites.length > 0
|
||||||
|
? Math.round(
|
||||||
|
stats.sites.reduce(
|
||||||
|
(sum, s) => sum + (s.megabytesOut ?? 0),
|
||||||
|
0
|
||||||
|
) / stats.sites.length
|
||||||
|
)
|
||||||
|
: 0,
|
||||||
num_api_keys: stats.numApiKeys,
|
num_api_keys: stats.numApiKeys,
|
||||||
num_custom_roles: stats.numCustomRoles
|
num_custom_roles: stats.numCustomRoles
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -309,10 +309,7 @@ export class TraefikConfigManager {
|
|||||||
this.lastActiveDomains = new Set(domains);
|
this.lastActiveDomains = new Set(domains);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (
|
if (process.env.USE_PANGOLIN_DNS === "true" && build != "oss") {
|
||||||
process.env.USE_PANGOLIN_DNS === "true" &&
|
|
||||||
build != "oss"
|
|
||||||
) {
|
|
||||||
// Scan current local certificate state
|
// Scan current local certificate state
|
||||||
this.lastLocalCertificateState =
|
this.lastLocalCertificateState =
|
||||||
await this.scanLocalCertificateState();
|
await this.scanLocalCertificateState();
|
||||||
@@ -450,7 +447,8 @@ export class TraefikConfigManager {
|
|||||||
currentExitNode,
|
currentExitNode,
|
||||||
config.getRawConfig().traefik.site_types,
|
config.getRawConfig().traefik.site_types,
|
||||||
build == "oss", // filter out the namespace domains in open source
|
build == "oss", // filter out the namespace domains in open source
|
||||||
build != "oss" // generate the login pages on the cloud and hybrid
|
build != "oss", // generate the login pages on the cloud and hybrid,
|
||||||
|
build == "saas" ? false : config.getRawConfig().traefik.allow_raw_resources // dont allow raw resources on saas otherwise use config
|
||||||
);
|
);
|
||||||
|
|
||||||
const domains = new Set<string>();
|
const domains = new Set<string>();
|
||||||
@@ -502,6 +500,25 @@ export class TraefikConfigManager {
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// tcp:
|
||||||
|
// serversTransports:
|
||||||
|
// pp-transport-v1:
|
||||||
|
// proxyProtocol:
|
||||||
|
// version: 1
|
||||||
|
// pp-transport-v2:
|
||||||
|
// proxyProtocol:
|
||||||
|
// version: 2
|
||||||
|
|
||||||
|
if (build != "saas") {
|
||||||
|
// add the serversTransports section if not present
|
||||||
|
if (traefikConfig.tcp && !traefikConfig.tcp.serversTransports) {
|
||||||
|
traefikConfig.tcp.serversTransports = {
|
||||||
|
"pp-transport-v1": { proxyProtocol: { version: 1 } },
|
||||||
|
"pp-transport-v2": { proxyProtocol: { version: 2 } }
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return { domains, traefikConfig };
|
return { domains, traefikConfig };
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
// pull data out of the axios error to log
|
// pull data out of the axios error to log
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import { db, targetHealthCheck } from "@server/db";
|
import { db, targetHealthCheck, domains } from "@server/db";
|
||||||
import {
|
import {
|
||||||
and,
|
and,
|
||||||
eq,
|
eq,
|
||||||
@@ -23,7 +23,8 @@ export async function getTraefikConfig(
|
|||||||
exitNodeId: number,
|
exitNodeId: number,
|
||||||
siteTypes: string[],
|
siteTypes: string[],
|
||||||
filterOutNamespaceDomains = false,
|
filterOutNamespaceDomains = false,
|
||||||
generateLoginPageRouters = false
|
generateLoginPageRouters = false,
|
||||||
|
allowRawResources = true
|
||||||
): Promise<any> {
|
): Promise<any> {
|
||||||
// Define extended target type with site information
|
// Define extended target type with site information
|
||||||
type TargetWithSite = Target & {
|
type TargetWithSite = Target & {
|
||||||
@@ -56,6 +57,8 @@ export async function getTraefikConfig(
|
|||||||
setHostHeader: resources.setHostHeader,
|
setHostHeader: resources.setHostHeader,
|
||||||
enableProxy: resources.enableProxy,
|
enableProxy: resources.enableProxy,
|
||||||
headers: resources.headers,
|
headers: resources.headers,
|
||||||
|
proxyProtocol: resources.proxyProtocol,
|
||||||
|
proxyProtocolVersion: resources.proxyProtocolVersion,
|
||||||
// Target fields
|
// Target fields
|
||||||
targetId: targets.targetId,
|
targetId: targets.targetId,
|
||||||
targetEnabled: targets.enabled,
|
targetEnabled: targets.enabled,
|
||||||
@@ -75,11 +78,14 @@ export async function getTraefikConfig(
|
|||||||
siteType: sites.type,
|
siteType: sites.type,
|
||||||
siteOnline: sites.online,
|
siteOnline: sites.online,
|
||||||
subnet: sites.subnet,
|
subnet: sites.subnet,
|
||||||
exitNodeId: sites.exitNodeId
|
exitNodeId: sites.exitNodeId,
|
||||||
|
// Domain cert resolver fields
|
||||||
|
domainCertResolver: domains.certResolver
|
||||||
})
|
})
|
||||||
.from(sites)
|
.from(sites)
|
||||||
.innerJoin(targets, eq(targets.siteId, sites.siteId))
|
.innerJoin(targets, eq(targets.siteId, sites.siteId))
|
||||||
.innerJoin(resources, eq(resources.resourceId, targets.resourceId))
|
.innerJoin(resources, eq(resources.resourceId, targets.resourceId))
|
||||||
|
.leftJoin(domains, eq(domains.domainId, resources.domainId))
|
||||||
.leftJoin(
|
.leftJoin(
|
||||||
targetHealthCheck,
|
targetHealthCheck,
|
||||||
eq(targetHealthCheck.targetId, targets.targetId)
|
eq(targetHealthCheck.targetId, targets.targetId)
|
||||||
@@ -92,7 +98,8 @@ export async function getTraefikConfig(
|
|||||||
eq(sites.exitNodeId, exitNodeId),
|
eq(sites.exitNodeId, exitNodeId),
|
||||||
and(
|
and(
|
||||||
isNull(sites.exitNodeId),
|
isNull(sites.exitNodeId),
|
||||||
sql`(${siteTypes.includes("local") ? 1 : 0} = 1)` // only allow local sites if "local" is in siteTypes
|
sql`(${siteTypes.includes("local") ? 1 : 0} = 1)`, // only allow local sites if "local" is in siteTypes
|
||||||
|
eq(sites.type, "local")
|
||||||
)
|
)
|
||||||
),
|
),
|
||||||
or(
|
or(
|
||||||
@@ -100,7 +107,7 @@ export async function getTraefikConfig(
|
|||||||
isNull(targetHealthCheck.hcHealth) // Include targets with no health check record
|
isNull(targetHealthCheck.hcHealth) // Include targets with no health check record
|
||||||
),
|
),
|
||||||
inArray(sites.type, siteTypes),
|
inArray(sites.type, siteTypes),
|
||||||
config.getRawConfig().traefik.allow_raw_resources
|
allowRawResources
|
||||||
? isNotNull(resources.http) // ignore the http check if allow_raw_resources is true
|
? isNotNull(resources.http) // ignore the http check if allow_raw_resources is true
|
||||||
: eq(resources.http, true)
|
: eq(resources.http, true)
|
||||||
)
|
)
|
||||||
@@ -163,11 +170,15 @@ export async function getTraefikConfig(
|
|||||||
enableProxy: row.enableProxy,
|
enableProxy: row.enableProxy,
|
||||||
targets: [],
|
targets: [],
|
||||||
headers: row.headers,
|
headers: row.headers,
|
||||||
|
proxyProtocol: row.proxyProtocol,
|
||||||
|
proxyProtocolVersion: row.proxyProtocolVersion ?? 1,
|
||||||
path: row.path, // the targets will all have the same path
|
path: row.path, // the targets will all have the same path
|
||||||
pathMatchType: row.pathMatchType, // the targets will all have the same pathMatchType
|
pathMatchType: row.pathMatchType, // the targets will all have the same pathMatchType
|
||||||
rewritePath: row.rewritePath,
|
rewritePath: row.rewritePath,
|
||||||
rewritePathType: row.rewritePathType,
|
rewritePathType: row.rewritePathType,
|
||||||
priority: priority // may be null, we fallback later
|
priority: priority,
|
||||||
|
// Store domain cert resolver fields
|
||||||
|
domainCertResolver: row.domainCertResolver
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -246,21 +257,35 @@ export async function getTraefikConfig(
|
|||||||
wildCard = resource.fullDomain;
|
wildCard = resource.fullDomain;
|
||||||
}
|
}
|
||||||
|
|
||||||
const configDomain = config.getDomain(resource.domainId);
|
const globalDefaultResolver =
|
||||||
|
config.getRawConfig().traefik.cert_resolver;
|
||||||
|
const globalDefaultPreferWildcard =
|
||||||
|
config.getRawConfig().traefik.prefer_wildcard_cert;
|
||||||
|
|
||||||
let certResolver: string, preferWildcardCert: boolean;
|
const domainCertResolver = resource.domainCertResolver;
|
||||||
if (!configDomain) {
|
const preferWildcardCert = resource.preferWildcardCert;
|
||||||
certResolver = config.getRawConfig().traefik.cert_resolver;
|
|
||||||
preferWildcardCert =
|
let resolverName: string | undefined;
|
||||||
config.getRawConfig().traefik.prefer_wildcard_cert;
|
let preferWildcard: boolean | undefined;
|
||||||
|
// Handle both letsencrypt & custom cases
|
||||||
|
if (domainCertResolver) {
|
||||||
|
resolverName = domainCertResolver.trim();
|
||||||
} else {
|
} else {
|
||||||
certResolver = configDomain.cert_resolver;
|
resolverName = globalDefaultResolver;
|
||||||
preferWildcardCert = configDomain.prefer_wildcard_cert;
|
}
|
||||||
|
|
||||||
|
if (
|
||||||
|
preferWildcardCert !== undefined &&
|
||||||
|
preferWildcardCert !== null
|
||||||
|
) {
|
||||||
|
preferWildcard = preferWildcardCert;
|
||||||
|
} else {
|
||||||
|
preferWildcard = globalDefaultPreferWildcard;
|
||||||
}
|
}
|
||||||
|
|
||||||
const tls = {
|
const tls = {
|
||||||
certResolver: certResolver,
|
certResolver: resolverName,
|
||||||
...(preferWildcardCert
|
...(preferWildcard
|
||||||
? {
|
? {
|
||||||
domains: [
|
domains: [
|
||||||
{
|
{
|
||||||
@@ -561,6 +586,8 @@ export async function getTraefikConfig(
|
|||||||
...(protocol === "tcp" ? { rule: "HostSNI(`*`)" } : {})
|
...(protocol === "tcp" ? { rule: "HostSNI(`*`)" } : {})
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const ppPrefix = config.getRawConfig().traefik.pp_transport_prefix;
|
||||||
|
|
||||||
config_output[protocol].services[serviceName] = {
|
config_output[protocol].services[serviceName] = {
|
||||||
loadBalancer: {
|
loadBalancer: {
|
||||||
servers: (() => {
|
servers: (() => {
|
||||||
@@ -614,6 +641,11 @@ export async function getTraefikConfig(
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
})(),
|
})(),
|
||||||
|
...(resource.proxyProtocol && protocol == "tcp"
|
||||||
|
? {
|
||||||
|
serversTransport: `${ppPrefix}${resource.proxyProtocolVersion || 1}@file` // TODO: does @file here cause issues?
|
||||||
|
}
|
||||||
|
: {}),
|
||||||
...(resource.stickySession
|
...(resource.stickySession
|
||||||
? {
|
? {
|
||||||
sticky: {
|
sticky: {
|
||||||
|
|||||||
@@ -40,6 +40,10 @@ export class License {
|
|||||||
public setServerSecret(secret: string) {
|
public setServerSecret(secret: string) {
|
||||||
this.serverSecret = secret;
|
this.serverSecret = secret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public async isUnlocked() {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
await setHostMeta();
|
await setHostMeta();
|
||||||
|
|||||||
@@ -27,3 +27,4 @@ export * from "./verifyDomainAccess";
|
|||||||
export * from "./verifyClientsEnabled";
|
export * from "./verifyClientsEnabled";
|
||||||
export * from "./verifyUserIsOrgOwner";
|
export * from "./verifyUserIsOrgOwner";
|
||||||
export * from "./verifySiteResourceAccess";
|
export * from "./verifySiteResourceAccess";
|
||||||
|
export * from "./logActionAudit";
|
||||||
16
server/middlewares/logActionAudit.ts
Normal file
16
server/middlewares/logActionAudit.ts
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
import { ActionsEnum } from "@server/auth/actions";
|
||||||
|
import { Request, Response, NextFunction } from "express";
|
||||||
|
|
||||||
|
export function logActionAudit(action: ActionsEnum) {
|
||||||
|
return async function (
|
||||||
|
req: Request,
|
||||||
|
res: Response,
|
||||||
|
next: NextFunction
|
||||||
|
): Promise<any> {
|
||||||
|
next();
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function cleanUpOldLogs(orgId: string, retentionDays: number) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
@@ -1,9 +1,11 @@
|
|||||||
import { Request, Response, NextFunction } from "express";
|
import { Request, Response, NextFunction } from "express";
|
||||||
import { db } from "@server/db";
|
import { db, orgs } from "@server/db";
|
||||||
import { userOrgs } from "@server/db";
|
import { userOrgs } from "@server/db";
|
||||||
import { and, eq } from "drizzle-orm";
|
import { and, eq } from "drizzle-orm";
|
||||||
import createHttpError from "http-errors";
|
import createHttpError from "http-errors";
|
||||||
import HttpCode from "@server/types/HttpCode";
|
import HttpCode from "@server/types/HttpCode";
|
||||||
|
import { checkOrgAccessPolicy } from "#dynamic/lib/checkOrgAccessPolicy";
|
||||||
|
import logger from "@server/logger";
|
||||||
|
|
||||||
export async function verifyOrgAccess(
|
export async function verifyOrgAccess(
|
||||||
req: Request,
|
req: Request,
|
||||||
@@ -43,12 +45,30 @@ export async function verifyOrgAccess(
|
|||||||
"User does not have access to this organization"
|
"User does not have access to this organization"
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
} else {
|
|
||||||
// User has access, attach the user's role to the request for potential future use
|
|
||||||
req.userOrgRoleId = req.userOrg.roleId;
|
|
||||||
req.userOrgId = orgId;
|
|
||||||
return next();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const policyCheck = await checkOrgAccessPolicy({
|
||||||
|
orgId,
|
||||||
|
userId,
|
||||||
|
session: req.session
|
||||||
|
});
|
||||||
|
|
||||||
|
logger.debug("Org check policy result", { policyCheck });
|
||||||
|
|
||||||
|
if (!policyCheck.allowed || policyCheck.error) {
|
||||||
|
return next(
|
||||||
|
createHttpError(
|
||||||
|
HttpCode.FORBIDDEN,
|
||||||
|
"Failed organization access policy check: " +
|
||||||
|
(policyCheck.error || "Unknown error")
|
||||||
|
)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
// User has access, attach the user's role to the request for potential future use
|
||||||
|
req.userOrgRoleId = req.userOrg.roleId;
|
||||||
|
req.userOrgId = orgId;
|
||||||
|
return next();
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
return next(
|
return next(
|
||||||
createHttpError(
|
createHttpError(
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ const nextPort = config.getRawConfig().server.next_port;
|
|||||||
|
|
||||||
export async function createNextServer() {
|
export async function createNextServer() {
|
||||||
// const app = next({ dev });
|
// const app = next({ dev });
|
||||||
const app = next({ dev: process.env.ENVIRONMENT !== "prod" });
|
const app = next({ dev: process.env.ENVIRONMENT !== "prod", turbopack: true });
|
||||||
const handle = app.getRequestHandler();
|
const handle = app.getRequestHandler();
|
||||||
|
|
||||||
await app.prepare();
|
await app.prepare();
|
||||||
|
|||||||
@@ -15,5 +15,6 @@ export enum OpenAPITags {
|
|||||||
Idp = "Identity Provider",
|
Idp = "Identity Provider",
|
||||||
Client = "Client",
|
Client = "Client",
|
||||||
ApiKey = "API Key",
|
ApiKey = "API Key",
|
||||||
Domain = "Domain"
|
Domain = "Domain",
|
||||||
|
Blueprint = "Blueprint"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -16,8 +16,8 @@ import { certificates, db } from "@server/db";
|
|||||||
import { and, eq, isNotNull, or, inArray, sql } from "drizzle-orm";
|
import { and, eq, isNotNull, or, inArray, sql } from "drizzle-orm";
|
||||||
import { decryptData } from "@server/lib/encryption";
|
import { decryptData } from "@server/lib/encryption";
|
||||||
import * as fs from "fs";
|
import * as fs from "fs";
|
||||||
import NodeCache from "node-cache";
|
|
||||||
import logger from "@server/logger";
|
import logger from "@server/logger";
|
||||||
|
import cache from "@server/lib/cache";
|
||||||
|
|
||||||
let encryptionKeyPath = "";
|
let encryptionKeyPath = "";
|
||||||
let encryptionKeyHex = "";
|
let encryptionKeyHex = "";
|
||||||
@@ -51,9 +51,6 @@ export type CertificateResult = {
|
|||||||
updatedAt?: number | null;
|
updatedAt?: number | null;
|
||||||
};
|
};
|
||||||
|
|
||||||
// --- In-Memory Cache Implementation ---
|
|
||||||
const certificateCache = new NodeCache({ stdTTL: 180 }); // Cache for 3 minutes (180 seconds)
|
|
||||||
|
|
||||||
export async function getValidCertificatesForDomains(
|
export async function getValidCertificatesForDomains(
|
||||||
domains: Set<string>,
|
domains: Set<string>,
|
||||||
useCache: boolean = true
|
useCache: boolean = true
|
||||||
@@ -67,7 +64,8 @@ export async function getValidCertificatesForDomains(
|
|||||||
// 1. Check cache first if enabled
|
// 1. Check cache first if enabled
|
||||||
if (useCache) {
|
if (useCache) {
|
||||||
for (const domain of domains) {
|
for (const domain of domains) {
|
||||||
const cachedCert = certificateCache.get<CertificateResult>(domain);
|
const cacheKey = `cert:${domain}`;
|
||||||
|
const cachedCert = cache.get<CertificateResult>(cacheKey);
|
||||||
if (cachedCert) {
|
if (cachedCert) {
|
||||||
finalResults.push(cachedCert); // Valid cache hit
|
finalResults.push(cachedCert); // Valid cache hit
|
||||||
} else {
|
} else {
|
||||||
@@ -180,7 +178,8 @@ export async function getValidCertificatesForDomains(
|
|||||||
|
|
||||||
// Add to cache for future requests, using the *requested domain* as the key
|
// Add to cache for future requests, using the *requested domain* as the key
|
||||||
if (useCache) {
|
if (useCache) {
|
||||||
certificateCache.set(domain, resultCert);
|
const cacheKey = `cert:${domain}`;
|
||||||
|
cache.set(cacheKey, resultCert, 180);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
201
server/private/lib/checkOrgAccessPolicy.ts
Normal file
201
server/private/lib/checkOrgAccessPolicy.ts
Normal file
@@ -0,0 +1,201 @@
|
|||||||
|
/*
|
||||||
|
* This file is part of a proprietary work.
|
||||||
|
*
|
||||||
|
* Copyright (c) 2025 Fossorial, Inc.
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* This file is licensed under the Fossorial Commercial License.
|
||||||
|
* You may not use this file except in compliance with the License.
|
||||||
|
* Unauthorized use, copying, modification, or distribution is strictly prohibited.
|
||||||
|
*
|
||||||
|
* This file is not licensed under the AGPLv3.
|
||||||
|
*/
|
||||||
|
|
||||||
|
import { build } from "@server/build";
|
||||||
|
import {
|
||||||
|
db,
|
||||||
|
Org,
|
||||||
|
orgs,
|
||||||
|
ResourceSession,
|
||||||
|
sessions,
|
||||||
|
users
|
||||||
|
} from "@server/db";
|
||||||
|
import { getOrgTierData } from "#private/lib/billing";
|
||||||
|
import { TierId } from "@server/lib/billing/tiers";
|
||||||
|
import license from "#private/license/license";
|
||||||
|
import { eq } from "drizzle-orm";
|
||||||
|
import {
|
||||||
|
CheckOrgAccessPolicyProps,
|
||||||
|
CheckOrgAccessPolicyResult
|
||||||
|
} from "@server/lib/checkOrgAccessPolicy";
|
||||||
|
import { UserType } from "@server/types/UserTypes";
|
||||||
|
|
||||||
|
export async function enforceResourceSessionLength(
|
||||||
|
resourceSession: ResourceSession,
|
||||||
|
org: Org
|
||||||
|
): Promise<{ valid: boolean; error?: string }> {
|
||||||
|
if (org.maxSessionLengthHours) {
|
||||||
|
const sessionIssuedAt = resourceSession.issuedAt; // may be null
|
||||||
|
const maxSessionLengthHours = org.maxSessionLengthHours;
|
||||||
|
|
||||||
|
if (sessionIssuedAt) {
|
||||||
|
const maxSessionLengthMs = maxSessionLengthHours * 60 * 60 * 1000;
|
||||||
|
const sessionAgeMs = Date.now() - sessionIssuedAt;
|
||||||
|
|
||||||
|
if (sessionAgeMs > maxSessionLengthMs) {
|
||||||
|
return {
|
||||||
|
valid: false,
|
||||||
|
error: `Resource session has expired due to organization policy (max session length: ${maxSessionLengthHours} hours)`
|
||||||
|
};
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
return {
|
||||||
|
valid: false,
|
||||||
|
error: `Resource session is invalid due to organization policy (max session length: ${maxSessionLengthHours} hours)`
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return { valid: true };
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function checkOrgAccessPolicy(
|
||||||
|
props: CheckOrgAccessPolicyProps
|
||||||
|
): Promise<CheckOrgAccessPolicyResult> {
|
||||||
|
const userId = props.userId || props.user?.userId;
|
||||||
|
const orgId = props.orgId || props.org?.orgId;
|
||||||
|
const sessionId = props.sessionId || props.session?.sessionId;
|
||||||
|
|
||||||
|
if (!orgId) {
|
||||||
|
return {
|
||||||
|
allowed: false,
|
||||||
|
error: "Organization ID is required"
|
||||||
|
};
|
||||||
|
}
|
||||||
|
if (!userId) {
|
||||||
|
return { allowed: false, error: "User ID is required" };
|
||||||
|
}
|
||||||
|
if (!sessionId) {
|
||||||
|
return { allowed: false, error: "Session ID is required" };
|
||||||
|
}
|
||||||
|
|
||||||
|
if (build === "enterprise") {
|
||||||
|
const isUnlocked = await license.isUnlocked();
|
||||||
|
// if not licensed, don't check the policies
|
||||||
|
if (!isUnlocked) {
|
||||||
|
return { allowed: true };
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// get the needed data
|
||||||
|
|
||||||
|
if (!props.org) {
|
||||||
|
const [orgQuery] = await db
|
||||||
|
.select()
|
||||||
|
.from(orgs)
|
||||||
|
.where(eq(orgs.orgId, orgId));
|
||||||
|
props.org = orgQuery;
|
||||||
|
if (!props.org) {
|
||||||
|
return { allowed: false, error: "Organization not found" };
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!props.user) {
|
||||||
|
const [userQuery] = await db
|
||||||
|
.select()
|
||||||
|
.from(users)
|
||||||
|
.where(eq(users.userId, userId));
|
||||||
|
props.user = userQuery;
|
||||||
|
if (!props.user) {
|
||||||
|
return { allowed: false, error: "User not found" };
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!props.session) {
|
||||||
|
const [sessionQuery] = await db
|
||||||
|
.select()
|
||||||
|
.from(sessions)
|
||||||
|
.where(eq(sessions.sessionId, sessionId));
|
||||||
|
props.session = sessionQuery;
|
||||||
|
if (!props.session) {
|
||||||
|
return { allowed: false, error: "Session not found" };
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (props.session.userId !== props.user.userId) {
|
||||||
|
return {
|
||||||
|
allowed: false,
|
||||||
|
error: "Session does not belong to the user"
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
// now check the policies
|
||||||
|
const policies: CheckOrgAccessPolicyResult["policies"] = {};
|
||||||
|
|
||||||
|
// only applies to internal users; oidc users 2fa is managed by the IDP
|
||||||
|
if (props.user.type === UserType.Internal && props.org.requireTwoFactor) {
|
||||||
|
policies.requiredTwoFactor = props.user.twoFactorEnabled || false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// applies to all users
|
||||||
|
if (props.org.maxSessionLengthHours) {
|
||||||
|
const sessionIssuedAt = props.session.issuedAt; // may be null
|
||||||
|
const maxSessionLengthHours = props.org.maxSessionLengthHours;
|
||||||
|
|
||||||
|
if (sessionIssuedAt) {
|
||||||
|
const maxSessionLengthMs = maxSessionLengthHours * 60 * 60 * 1000;
|
||||||
|
const sessionAgeMs = Date.now() - sessionIssuedAt;
|
||||||
|
policies.maxSessionLength = {
|
||||||
|
compliant: sessionAgeMs <= maxSessionLengthMs,
|
||||||
|
maxSessionLengthHours,
|
||||||
|
sessionAgeHours: sessionAgeMs / (60 * 60 * 1000)
|
||||||
|
};
|
||||||
|
} else {
|
||||||
|
policies.maxSessionLength = {
|
||||||
|
compliant: false,
|
||||||
|
maxSessionLengthHours,
|
||||||
|
sessionAgeHours: maxSessionLengthHours
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// only applies to internal users; oidc users don't have passwords
|
||||||
|
if (props.user.type === UserType.Internal && props.org.passwordExpiryDays) {
|
||||||
|
if (props.user.lastPasswordChange) {
|
||||||
|
const passwordExpiryDays = props.org.passwordExpiryDays;
|
||||||
|
const passwordAgeMs = Date.now() - props.user.lastPasswordChange;
|
||||||
|
const passwordAgeDays = passwordAgeMs / (24 * 60 * 60 * 1000);
|
||||||
|
|
||||||
|
policies.passwordAge = {
|
||||||
|
compliant: passwordAgeDays <= passwordExpiryDays,
|
||||||
|
maxPasswordAgeDays: passwordExpiryDays,
|
||||||
|
passwordAgeDays: passwordAgeDays
|
||||||
|
};
|
||||||
|
} else {
|
||||||
|
policies.passwordAge = {
|
||||||
|
compliant: false,
|
||||||
|
maxPasswordAgeDays: props.org.passwordExpiryDays,
|
||||||
|
passwordAgeDays: props.org.passwordExpiryDays // Treat as expired
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
let allowed = true;
|
||||||
|
if (policies.requiredTwoFactor === false) {
|
||||||
|
allowed = false;
|
||||||
|
}
|
||||||
|
if (
|
||||||
|
policies.maxSessionLength &&
|
||||||
|
policies.maxSessionLength.compliant === false
|
||||||
|
) {
|
||||||
|
allowed = false;
|
||||||
|
}
|
||||||
|
if (policies.passwordAge && policies.passwordAge.compliant === false) {
|
||||||
|
allowed = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return {
|
||||||
|
allowed,
|
||||||
|
policies
|
||||||
|
};
|
||||||
|
}
|
||||||
@@ -18,7 +18,8 @@ import {
|
|||||||
resources,
|
resources,
|
||||||
targets,
|
targets,
|
||||||
sites,
|
sites,
|
||||||
targetHealthCheck
|
targetHealthCheck,
|
||||||
|
Transaction
|
||||||
} from "@server/db";
|
} from "@server/db";
|
||||||
import logger from "@server/logger";
|
import logger from "@server/logger";
|
||||||
import { ExitNodePingResult } from "@server/routers/newt";
|
import { ExitNodePingResult } from "@server/routers/newt";
|
||||||
@@ -333,8 +334,8 @@ export function selectBestExitNode(
|
|||||||
return fallbackNode;
|
return fallbackNode;
|
||||||
}
|
}
|
||||||
|
|
||||||
export async function checkExitNodeOrg(exitNodeId: number, orgId: string) {
|
export async function checkExitNodeOrg(exitNodeId: number, orgId: string, trx: Transaction | typeof db = db) {
|
||||||
const [exitNodeOrg] = await db
|
const [exitNodeOrg] = await trx
|
||||||
.select()
|
.select()
|
||||||
.from(exitNodeOrgs)
|
.from(exitNodeOrgs)
|
||||||
.where(
|
.where(
|
||||||
|
|||||||
170
server/private/lib/logAccessAudit.ts
Normal file
170
server/private/lib/logAccessAudit.ts
Normal file
@@ -0,0 +1,170 @@
|
|||||||
|
/*
|
||||||
|
* This file is part of a proprietary work.
|
||||||
|
*
|
||||||
|
* Copyright (c) 2025 Fossorial, Inc.
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* This file is licensed under the Fossorial Commercial License.
|
||||||
|
* You may not use this file except in compliance with the License.
|
||||||
|
* Unauthorized use, copying, modification, or distribution is strictly prohibited.
|
||||||
|
*
|
||||||
|
* This file is not licensed under the AGPLv3.
|
||||||
|
*/
|
||||||
|
|
||||||
|
import { accessAuditLog, db, orgs } from "@server/db";
|
||||||
|
import { getCountryCodeForIp } from "@server/lib/geoip";
|
||||||
|
import logger from "@server/logger";
|
||||||
|
import { and, eq, lt } from "drizzle-orm";
|
||||||
|
import cache from "@server/lib/cache";
|
||||||
|
|
||||||
|
async function getAccessDays(orgId: string): Promise<number> {
|
||||||
|
// check cache first
|
||||||
|
const cached = cache.get<number>(`org_${orgId}_accessDays`);
|
||||||
|
if (cached !== undefined) {
|
||||||
|
return cached;
|
||||||
|
}
|
||||||
|
|
||||||
|
const [org] = await db
|
||||||
|
.select({
|
||||||
|
settingsLogRetentionDaysAction: orgs.settingsLogRetentionDaysAction
|
||||||
|
})
|
||||||
|
.from(orgs)
|
||||||
|
.where(eq(orgs.orgId, orgId))
|
||||||
|
.limit(1);
|
||||||
|
|
||||||
|
if (!org) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// store the result in cache
|
||||||
|
cache.set(
|
||||||
|
`org_${orgId}_accessDays`,
|
||||||
|
org.settingsLogRetentionDaysAction,
|
||||||
|
300
|
||||||
|
);
|
||||||
|
|
||||||
|
return org.settingsLogRetentionDaysAction;
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function cleanUpOldLogs(orgId: string, retentionDays: number) {
|
||||||
|
const now = Math.floor(Date.now() / 1000);
|
||||||
|
|
||||||
|
const cutoffTimestamp = now - retentionDays * 24 * 60 * 60;
|
||||||
|
|
||||||
|
try {
|
||||||
|
await db
|
||||||
|
.delete(accessAuditLog)
|
||||||
|
.where(
|
||||||
|
and(
|
||||||
|
lt(accessAuditLog.timestamp, cutoffTimestamp),
|
||||||
|
eq(accessAuditLog.orgId, orgId)
|
||||||
|
)
|
||||||
|
);
|
||||||
|
|
||||||
|
logger.debug(
|
||||||
|
`Cleaned up access audit logs older than ${retentionDays} days`
|
||||||
|
);
|
||||||
|
} catch (error) {
|
||||||
|
logger.error("Error cleaning up old action audit logs:", error);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function logAccessAudit(data: {
|
||||||
|
action: boolean;
|
||||||
|
type: string;
|
||||||
|
orgId: string;
|
||||||
|
resourceId?: number;
|
||||||
|
user?: { username: string; userId: string };
|
||||||
|
apiKey?: { name: string | null; apiKeyId: string };
|
||||||
|
metadata?: any;
|
||||||
|
userAgent?: string;
|
||||||
|
requestIp?: string;
|
||||||
|
}) {
|
||||||
|
try {
|
||||||
|
const retentionDays = await getAccessDays(data.orgId);
|
||||||
|
if (retentionDays === 0) {
|
||||||
|
// do not log
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
let actorType: string | undefined;
|
||||||
|
let actor: string | undefined;
|
||||||
|
let actorId: string | undefined;
|
||||||
|
|
||||||
|
const user = data.user;
|
||||||
|
if (user) {
|
||||||
|
actorType = "user";
|
||||||
|
actor = user.username;
|
||||||
|
actorId = user.userId;
|
||||||
|
}
|
||||||
|
const apiKey = data.apiKey;
|
||||||
|
if (apiKey) {
|
||||||
|
actorType = "apiKey";
|
||||||
|
actor = apiKey.name || apiKey.apiKeyId;
|
||||||
|
actorId = apiKey.apiKeyId;
|
||||||
|
}
|
||||||
|
|
||||||
|
// if (!actorType || !actor || !actorId) {
|
||||||
|
// logger.warn("logRequestAudit: Incomplete actor information");
|
||||||
|
// return;
|
||||||
|
// }
|
||||||
|
|
||||||
|
const timestamp = Math.floor(Date.now() / 1000);
|
||||||
|
|
||||||
|
let metadata = null;
|
||||||
|
if (metadata) {
|
||||||
|
metadata = JSON.stringify(metadata);
|
||||||
|
}
|
||||||
|
|
||||||
|
const clientIp = data.requestIp
|
||||||
|
? (() => {
|
||||||
|
if (
|
||||||
|
data.requestIp.startsWith("[") &&
|
||||||
|
data.requestIp.includes("]")
|
||||||
|
) {
|
||||||
|
// if brackets are found, extract the IPv6 address from between the brackets
|
||||||
|
const ipv6Match = data.requestIp.match(/\[(.*?)\]/);
|
||||||
|
if (ipv6Match) {
|
||||||
|
return ipv6Match[1];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return data.requestIp;
|
||||||
|
})()
|
||||||
|
: undefined;
|
||||||
|
|
||||||
|
const countryCode = data.requestIp
|
||||||
|
? await getCountryCodeFromIp(data.requestIp)
|
||||||
|
: undefined;
|
||||||
|
|
||||||
|
await db.insert(accessAuditLog).values({
|
||||||
|
timestamp: timestamp,
|
||||||
|
orgId: data.orgId,
|
||||||
|
actorType,
|
||||||
|
actor,
|
||||||
|
actorId,
|
||||||
|
action: data.action,
|
||||||
|
type: data.type,
|
||||||
|
metadata,
|
||||||
|
resourceId: data.resourceId,
|
||||||
|
userAgent: data.userAgent,
|
||||||
|
ip: clientIp,
|
||||||
|
location: countryCode
|
||||||
|
});
|
||||||
|
} catch (error) {
|
||||||
|
logger.error(error);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async function getCountryCodeFromIp(ip: string): Promise<string | undefined> {
|
||||||
|
const geoIpCacheKey = `geoip_access:${ip}`;
|
||||||
|
|
||||||
|
let cachedCountryCode: string | undefined = cache.get(geoIpCacheKey);
|
||||||
|
|
||||||
|
if (!cachedCountryCode) {
|
||||||
|
cachedCountryCode = await getCountryCodeForIp(ip); // do it locally
|
||||||
|
// Cache for longer since IP geolocation doesn't change frequently
|
||||||
|
cache.set(geoIpCacheKey, cachedCountryCode, 300); // 5 minutes
|
||||||
|
}
|
||||||
|
|
||||||
|
return cachedCountryCode;
|
||||||
|
}
|
||||||
@@ -76,7 +76,7 @@ export const privateConfigSchema = z.object({
|
|||||||
local_exit_node_reachable_at: z
|
local_exit_node_reachable_at: z
|
||||||
.string()
|
.string()
|
||||||
.optional()
|
.optional()
|
||||||
.default("http://gerbil:3003")
|
.default("http://gerbil:3004")
|
||||||
})
|
})
|
||||||
.optional()
|
.optional()
|
||||||
.default({}),
|
.default({}),
|
||||||
|
|||||||
@@ -16,9 +16,10 @@ import privateConfig from "#private/lib/config";
|
|||||||
import logger from "@server/logger";
|
import logger from "@server/logger";
|
||||||
|
|
||||||
export enum AudienceIds {
|
export enum AudienceIds {
|
||||||
General = "5cfbf99b-c592-40a9-9b8a-577a4681c158",
|
SignUps = "5cfbf99b-c592-40a9-9b8a-577a4681c158",
|
||||||
Subscribed = "870b43fd-387f-44de-8fc1-707335f30b20",
|
Subscribed = "870b43fd-387f-44de-8fc1-707335f30b20",
|
||||||
Churned = "f3ae92bd-2fdb-4d77-8746-2118afd62549"
|
Churned = "f3ae92bd-2fdb-4d77-8746-2118afd62549",
|
||||||
|
Newsletter = "5500c431-191c-42f0-a5d4-8b6d445b4ea0"
|
||||||
}
|
}
|
||||||
|
|
||||||
const resend = new Resend(
|
const resend = new Resend(
|
||||||
|
|||||||
@@ -15,6 +15,7 @@ import {
|
|||||||
certificates,
|
certificates,
|
||||||
db,
|
db,
|
||||||
domainNamespaces,
|
domainNamespaces,
|
||||||
|
domains,
|
||||||
exitNodes,
|
exitNodes,
|
||||||
loginPage,
|
loginPage,
|
||||||
targetHealthCheck
|
targetHealthCheck
|
||||||
@@ -40,6 +41,7 @@ import {
|
|||||||
CertificateResult,
|
CertificateResult,
|
||||||
getValidCertificatesForDomains
|
getValidCertificatesForDomains
|
||||||
} from "#private/lib/certificates";
|
} from "#private/lib/certificates";
|
||||||
|
import { build } from "@server/build";
|
||||||
|
|
||||||
const redirectHttpsMiddlewareName = "redirect-to-https";
|
const redirectHttpsMiddlewareName = "redirect-to-https";
|
||||||
const redirectToRootMiddlewareName = "redirect-to-root";
|
const redirectToRootMiddlewareName = "redirect-to-root";
|
||||||
@@ -49,7 +51,8 @@ export async function getTraefikConfig(
|
|||||||
exitNodeId: number,
|
exitNodeId: number,
|
||||||
siteTypes: string[],
|
siteTypes: string[],
|
||||||
filterOutNamespaceDomains = false,
|
filterOutNamespaceDomains = false,
|
||||||
generateLoginPageRouters = false
|
generateLoginPageRouters = false,
|
||||||
|
allowRawResources = true
|
||||||
): Promise<any> {
|
): Promise<any> {
|
||||||
// Define extended target type with site information
|
// Define extended target type with site information
|
||||||
type TargetWithSite = Target & {
|
type TargetWithSite = Target & {
|
||||||
@@ -82,6 +85,8 @@ export async function getTraefikConfig(
|
|||||||
setHostHeader: resources.setHostHeader,
|
setHostHeader: resources.setHostHeader,
|
||||||
enableProxy: resources.enableProxy,
|
enableProxy: resources.enableProxy,
|
||||||
headers: resources.headers,
|
headers: resources.headers,
|
||||||
|
proxyProtocol: resources.proxyProtocol,
|
||||||
|
proxyProtocolVersion: resources.proxyProtocolVersion,
|
||||||
// Target fields
|
// Target fields
|
||||||
targetId: targets.targetId,
|
targetId: targets.targetId,
|
||||||
targetEnabled: targets.enabled,
|
targetEnabled: targets.enabled,
|
||||||
@@ -103,11 +108,16 @@ export async function getTraefikConfig(
|
|||||||
subnet: sites.subnet,
|
subnet: sites.subnet,
|
||||||
exitNodeId: sites.exitNodeId,
|
exitNodeId: sites.exitNodeId,
|
||||||
// Namespace
|
// Namespace
|
||||||
domainNamespaceId: domainNamespaces.domainNamespaceId
|
domainNamespaceId: domainNamespaces.domainNamespaceId,
|
||||||
|
// Certificate
|
||||||
|
certificateStatus: certificates.status,
|
||||||
|
domainCertResolver: domains.certResolver
|
||||||
})
|
})
|
||||||
.from(sites)
|
.from(sites)
|
||||||
.innerJoin(targets, eq(targets.siteId, sites.siteId))
|
.innerJoin(targets, eq(targets.siteId, sites.siteId))
|
||||||
.innerJoin(resources, eq(resources.resourceId, targets.resourceId))
|
.innerJoin(resources, eq(resources.resourceId, targets.resourceId))
|
||||||
|
.leftJoin(certificates, eq(certificates.domainId, resources.domainId))
|
||||||
|
.leftJoin(domains, eq(domains.domainId, resources.domainId))
|
||||||
.leftJoin(
|
.leftJoin(
|
||||||
targetHealthCheck,
|
targetHealthCheck,
|
||||||
eq(targetHealthCheck.targetId, targets.targetId)
|
eq(targetHealthCheck.targetId, targets.targetId)
|
||||||
@@ -124,7 +134,9 @@ export async function getTraefikConfig(
|
|||||||
eq(sites.exitNodeId, exitNodeId),
|
eq(sites.exitNodeId, exitNodeId),
|
||||||
and(
|
and(
|
||||||
isNull(sites.exitNodeId),
|
isNull(sites.exitNodeId),
|
||||||
sql`(${siteTypes.includes("local") ? 1 : 0} = 1)` // only allow local sites if "local" is in siteTypes
|
sql`(${siteTypes.includes("local") ? 1 : 0} = 1)`, // only allow local sites if "local" is in siteTypes
|
||||||
|
eq(sites.type, "local"),
|
||||||
|
sql`(${build != "saas" ? 1 : 0} = 1)` // Dont allow undefined local sites in cloud
|
||||||
)
|
)
|
||||||
),
|
),
|
||||||
or(
|
or(
|
||||||
@@ -132,8 +144,7 @@ export async function getTraefikConfig(
|
|||||||
isNull(targetHealthCheck.hcHealth) // Include targets with no health check record
|
isNull(targetHealthCheck.hcHealth) // Include targets with no health check record
|
||||||
),
|
),
|
||||||
inArray(sites.type, siteTypes),
|
inArray(sites.type, siteTypes),
|
||||||
// lets rewrite this using sql
|
allowRawResources
|
||||||
config.getRawConfig().traefik.allow_raw_resources
|
|
||||||
? isNotNull(resources.http) // ignore the http check if allow_raw_resources is true
|
? isNotNull(resources.http) // ignore the http check if allow_raw_resources is true
|
||||||
: eq(resources.http, true)
|
: eq(resources.http, true)
|
||||||
)
|
)
|
||||||
@@ -200,11 +211,14 @@ export async function getTraefikConfig(
|
|||||||
enableProxy: row.enableProxy,
|
enableProxy: row.enableProxy,
|
||||||
targets: [],
|
targets: [],
|
||||||
headers: row.headers,
|
headers: row.headers,
|
||||||
|
proxyProtocol: row.proxyProtocol,
|
||||||
|
proxyProtocolVersion: row.proxyProtocolVersion ?? 1,
|
||||||
path: row.path, // the targets will all have the same path
|
path: row.path, // the targets will all have the same path
|
||||||
pathMatchType: row.pathMatchType, // the targets will all have the same pathMatchType
|
pathMatchType: row.pathMatchType, // the targets will all have the same pathMatchType
|
||||||
rewritePath: row.rewritePath,
|
rewritePath: row.rewritePath,
|
||||||
rewritePathType: row.rewritePathType,
|
rewritePathType: row.rewritePathType,
|
||||||
priority: priority // may be null, we fallback later
|
priority: priority, // may be null, we fallback later
|
||||||
|
domainCertResolver: row.domainCertResolver
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -238,7 +252,7 @@ export async function getTraefikConfig(
|
|||||||
}
|
}
|
||||||
// get the valid certs for these domains
|
// get the valid certs for these domains
|
||||||
validCerts = await getValidCertificatesForDomains(domains, true); // we are caching here because this is called often
|
validCerts = await getValidCertificatesForDomains(domains, true); // we are caching here because this is called often
|
||||||
logger.debug(`Valid certs for domains: ${JSON.stringify(validCerts)}`);
|
// logger.debug(`Valid certs for domains: ${JSON.stringify(validCerts)}`);
|
||||||
}
|
}
|
||||||
|
|
||||||
const config_output: any = {
|
const config_output: any = {
|
||||||
@@ -292,6 +306,20 @@ export async function getTraefikConfig(
|
|||||||
config_output.http.services = {};
|
config_output.http.services = {};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const domainParts = fullDomain.split(".");
|
||||||
|
let wildCard;
|
||||||
|
if (domainParts.length <= 2) {
|
||||||
|
wildCard = `*.${domainParts.join(".")}`;
|
||||||
|
} else {
|
||||||
|
wildCard = `*.${domainParts.slice(1).join(".")}`;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!resource.subdomain) {
|
||||||
|
wildCard = resource.fullDomain;
|
||||||
|
}
|
||||||
|
|
||||||
|
const configDomain = config.getDomain(resource.domainId);
|
||||||
|
|
||||||
let tls = {};
|
let tls = {};
|
||||||
if (!privateConfig.getRawPrivateConfig().flags.use_pangolin_dns) {
|
if (!privateConfig.getRawPrivateConfig().flags.use_pangolin_dns) {
|
||||||
const domainParts = fullDomain.split(".");
|
const domainParts = fullDomain.split(".");
|
||||||
@@ -306,21 +334,35 @@ export async function getTraefikConfig(
|
|||||||
wildCard = resource.fullDomain;
|
wildCard = resource.fullDomain;
|
||||||
}
|
}
|
||||||
|
|
||||||
const configDomain = config.getDomain(resource.domainId);
|
const globalDefaultResolver =
|
||||||
|
config.getRawConfig().traefik.cert_resolver;
|
||||||
|
const globalDefaultPreferWildcard =
|
||||||
|
config.getRawConfig().traefik.prefer_wildcard_cert;
|
||||||
|
|
||||||
let certResolver: string, preferWildcardCert: boolean;
|
const domainCertResolver = resource.domainCertResolver;
|
||||||
if (!configDomain) {
|
const preferWildcardCert = resource.preferWildcardCert;
|
||||||
certResolver = config.getRawConfig().traefik.cert_resolver;
|
|
||||||
preferWildcardCert =
|
let resolverName: string | undefined;
|
||||||
config.getRawConfig().traefik.prefer_wildcard_cert;
|
let preferWildcard: boolean | undefined;
|
||||||
|
// Handle both letsencrypt & custom cases
|
||||||
|
if (domainCertResolver) {
|
||||||
|
resolverName = domainCertResolver.trim();
|
||||||
} else {
|
} else {
|
||||||
certResolver = configDomain.cert_resolver;
|
resolverName = globalDefaultResolver;
|
||||||
preferWildcardCert = configDomain.prefer_wildcard_cert;
|
}
|
||||||
|
|
||||||
|
if (
|
||||||
|
preferWildcardCert !== undefined &&
|
||||||
|
preferWildcardCert !== null
|
||||||
|
) {
|
||||||
|
preferWildcard = preferWildcardCert;
|
||||||
|
} else {
|
||||||
|
preferWildcard = globalDefaultPreferWildcard;
|
||||||
}
|
}
|
||||||
|
|
||||||
tls = {
|
tls = {
|
||||||
certResolver: certResolver,
|
certResolver: resolverName,
|
||||||
...(preferWildcardCert
|
...(preferWildcard
|
||||||
? {
|
? {
|
||||||
domains: [
|
domains: [
|
||||||
{
|
{
|
||||||
@@ -336,7 +378,7 @@ export async function getTraefikConfig(
|
|||||||
(cert) => cert.queriedDomain === resource.fullDomain
|
(cert) => cert.queriedDomain === resource.fullDomain
|
||||||
);
|
);
|
||||||
if (!matchingCert) {
|
if (!matchingCert) {
|
||||||
logger.warn(
|
logger.debug(
|
||||||
`No matching certificate found for domain: ${resource.fullDomain}`
|
`No matching certificate found for domain: ${resource.fullDomain}`
|
||||||
);
|
);
|
||||||
continue;
|
continue;
|
||||||
@@ -633,6 +675,8 @@ export async function getTraefikConfig(
|
|||||||
...(protocol === "tcp" ? { rule: "HostSNI(`*`)" } : {})
|
...(protocol === "tcp" ? { rule: "HostSNI(`*`)" } : {})
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const ppPrefix = config.getRawConfig().traefik.pp_transport_prefix;
|
||||||
|
|
||||||
config_output[protocol].services[serviceName] = {
|
config_output[protocol].services[serviceName] = {
|
||||||
loadBalancer: {
|
loadBalancer: {
|
||||||
servers: (() => {
|
servers: (() => {
|
||||||
@@ -686,6 +730,11 @@ export async function getTraefikConfig(
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
})(),
|
})(),
|
||||||
|
...(resource.proxyProtocol && protocol == "tcp" // proxy protocol only works for tcp
|
||||||
|
? {
|
||||||
|
serversTransport: `${ppPrefix}${resource.proxyProtocolVersion || 1}@file` // TODO: does @file here cause issues?
|
||||||
|
}
|
||||||
|
: {}),
|
||||||
...(resource.stickySession
|
...(resource.stickySession
|
||||||
? {
|
? {
|
||||||
sticky: {
|
sticky: {
|
||||||
@@ -761,7 +810,7 @@ export async function getTraefikConfig(
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
let tls = {};
|
const tls = {};
|
||||||
if (
|
if (
|
||||||
!privateConfig.getRawPrivateConfig().flags.use_pangolin_dns
|
!privateConfig.getRawPrivateConfig().flags.use_pangolin_dns
|
||||||
) {
|
) {
|
||||||
|
|||||||
@@ -15,4 +15,5 @@ export * from "./verifyCertificateAccess";
|
|||||||
export * from "./verifyRemoteExitNodeAccess";
|
export * from "./verifyRemoteExitNodeAccess";
|
||||||
export * from "./verifyIdpAccess";
|
export * from "./verifyIdpAccess";
|
||||||
export * from "./verifyLoginPageAccess";
|
export * from "./verifyLoginPageAccess";
|
||||||
export * from "../../lib/corsWithLoginPage";
|
export * from "./logActionAudit";
|
||||||
|
export * from "./verifySubscription";
|
||||||
145
server/private/middlewares/logActionAudit.ts
Normal file
145
server/private/middlewares/logActionAudit.ts
Normal file
@@ -0,0 +1,145 @@
|
|||||||
|
/*
|
||||||
|
* This file is part of a proprietary work.
|
||||||
|
*
|
||||||
|
* Copyright (c) 2025 Fossorial, Inc.
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* This file is licensed under the Fossorial Commercial License.
|
||||||
|
* You may not use this file except in compliance with the License.
|
||||||
|
* Unauthorized use, copying, modification, or distribution is strictly prohibited.
|
||||||
|
*
|
||||||
|
* This file is not licensed under the AGPLv3.
|
||||||
|
*/
|
||||||
|
|
||||||
|
import { ActionsEnum } from "@server/auth/actions";
|
||||||
|
import { actionAuditLog, db, orgs } from "@server/db";
|
||||||
|
import logger from "@server/logger";
|
||||||
|
import HttpCode from "@server/types/HttpCode";
|
||||||
|
import { Request, Response, NextFunction } from "express";
|
||||||
|
import createHttpError from "http-errors";
|
||||||
|
import { and, eq, lt } from "drizzle-orm";
|
||||||
|
import cache from "@server/lib/cache";
|
||||||
|
|
||||||
|
async function getActionDays(orgId: string): Promise<number> {
|
||||||
|
// check cache first
|
||||||
|
const cached = cache.get<number>(`org_${orgId}_actionDays`);
|
||||||
|
if (cached !== undefined) {
|
||||||
|
return cached;
|
||||||
|
}
|
||||||
|
|
||||||
|
const [org] = await db
|
||||||
|
.select({
|
||||||
|
settingsLogRetentionDaysAction: orgs.settingsLogRetentionDaysAction
|
||||||
|
})
|
||||||
|
.from(orgs)
|
||||||
|
.where(eq(orgs.orgId, orgId))
|
||||||
|
.limit(1);
|
||||||
|
|
||||||
|
if (!org) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// store the result in cache
|
||||||
|
cache.set(`org_${orgId}_actionDays`, org.settingsLogRetentionDaysAction, 300);
|
||||||
|
|
||||||
|
return org.settingsLogRetentionDaysAction;
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function cleanUpOldLogs(orgId: string, retentionDays: number) {
|
||||||
|
const now = Math.floor(Date.now() / 1000);
|
||||||
|
|
||||||
|
const cutoffTimestamp = now - retentionDays * 24 * 60 * 60;
|
||||||
|
|
||||||
|
try {
|
||||||
|
await db
|
||||||
|
.delete(actionAuditLog)
|
||||||
|
.where(
|
||||||
|
and(
|
||||||
|
lt(actionAuditLog.timestamp, cutoffTimestamp),
|
||||||
|
eq(actionAuditLog.orgId, orgId)
|
||||||
|
)
|
||||||
|
);
|
||||||
|
|
||||||
|
logger.debug(
|
||||||
|
`Cleaned up action audit logs older than ${retentionDays} days`
|
||||||
|
);
|
||||||
|
} catch (error) {
|
||||||
|
logger.error("Error cleaning up old action audit logs:", error);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export function logActionAudit(action: ActionsEnum) {
|
||||||
|
return async function (
|
||||||
|
req: Request,
|
||||||
|
res: Response,
|
||||||
|
next: NextFunction
|
||||||
|
): Promise<any> {
|
||||||
|
try {
|
||||||
|
let orgId;
|
||||||
|
let actorType;
|
||||||
|
let actor;
|
||||||
|
let actorId;
|
||||||
|
|
||||||
|
const user = req.user;
|
||||||
|
if (user) {
|
||||||
|
const userOrg = req.userOrg;
|
||||||
|
orgId = userOrg?.orgId;
|
||||||
|
actorType = "user";
|
||||||
|
actor = user.username;
|
||||||
|
actorId = user.userId;
|
||||||
|
}
|
||||||
|
const apiKey = req.apiKey;
|
||||||
|
if (apiKey) {
|
||||||
|
const apiKeyOrg = req.apiKeyOrg;
|
||||||
|
orgId = apiKeyOrg?.orgId;
|
||||||
|
actorType = "apiKey";
|
||||||
|
actor = apiKey.name;
|
||||||
|
actorId = apiKey.apiKeyId;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!orgId) {
|
||||||
|
logger.warn("logActionAudit: No organization context found");
|
||||||
|
return next();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!actorType || !actor || !actorId) {
|
||||||
|
logger.warn("logActionAudit: Incomplete actor information");
|
||||||
|
return next();
|
||||||
|
}
|
||||||
|
|
||||||
|
const retentionDays = await getActionDays(orgId);
|
||||||
|
if (retentionDays === 0) {
|
||||||
|
// do not log
|
||||||
|
return next();
|
||||||
|
}
|
||||||
|
|
||||||
|
const timestamp = Math.floor(Date.now() / 1000);
|
||||||
|
|
||||||
|
let metadata = null;
|
||||||
|
if (req.params) {
|
||||||
|
metadata = JSON.stringify(req.params);
|
||||||
|
}
|
||||||
|
|
||||||
|
await db.insert(actionAuditLog).values({
|
||||||
|
timestamp,
|
||||||
|
orgId,
|
||||||
|
actorType,
|
||||||
|
actor,
|
||||||
|
actorId,
|
||||||
|
action,
|
||||||
|
metadata
|
||||||
|
});
|
||||||
|
|
||||||
|
return next();
|
||||||
|
} catch (error) {
|
||||||
|
logger.error(error);
|
||||||
|
return next(
|
||||||
|
createHttpError(
|
||||||
|
HttpCode.INTERNAL_SERVER_ERROR,
|
||||||
|
"Error verifying logging action"
|
||||||
|
)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
50
server/private/middlewares/verifySubscription.ts
Normal file
50
server/private/middlewares/verifySubscription.ts
Normal file
@@ -0,0 +1,50 @@
|
|||||||
|
/*
|
||||||
|
* This file is part of a proprietary work.
|
||||||
|
*
|
||||||
|
* Copyright (c) 2025 Fossorial, Inc.
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* This file is licensed under the Fossorial Commercial License.
|
||||||
|
* You may not use this file except in compliance with the License.
|
||||||
|
* Unauthorized use, copying, modification, or distribution is strictly prohibited.
|
||||||
|
*
|
||||||
|
* This file is not licensed under the AGPLv3.
|
||||||
|
*/
|
||||||
|
|
||||||
|
import { Request, Response, NextFunction } from "express";
|
||||||
|
import createHttpError from "http-errors";
|
||||||
|
import HttpCode from "@server/types/HttpCode";
|
||||||
|
import { build } from "@server/build";
|
||||||
|
import { getOrgTierData } from "#private/lib/billing";
|
||||||
|
|
||||||
|
export async function verifyValidSubscription(
|
||||||
|
req: Request,
|
||||||
|
res: Response,
|
||||||
|
next: NextFunction
|
||||||
|
) {
|
||||||
|
try {
|
||||||
|
if (build != "saas") {
|
||||||
|
return next();
|
||||||
|
}
|
||||||
|
|
||||||
|
const tier = await getOrgTierData(req.params.orgId);
|
||||||
|
|
||||||
|
if (!tier.active) {
|
||||||
|
return next(
|
||||||
|
createHttpError(
|
||||||
|
HttpCode.FORBIDDEN,
|
||||||
|
"Organization does not have an active subscription"
|
||||||
|
)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
return next();
|
||||||
|
} catch (e) {
|
||||||
|
return next(
|
||||||
|
createHttpError(
|
||||||
|
HttpCode.INTERNAL_SERVER_ERROR,
|
||||||
|
"Error verifying subscription"
|
||||||
|
)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,3 +1,16 @@
|
|||||||
|
/*
|
||||||
|
* This file is part of a proprietary work.
|
||||||
|
*
|
||||||
|
* Copyright (c) 2025 Fossorial, Inc.
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* This file is licensed under the Fossorial Commercial License.
|
||||||
|
* You may not use this file except in compliance with the License.
|
||||||
|
* Unauthorized use, copying, modification, or distribution is strictly prohibited.
|
||||||
|
*
|
||||||
|
* This file is not licensed under the AGPLv3.
|
||||||
|
*/
|
||||||
|
|
||||||
import { Request, Response, NextFunction } from "express";
|
import { Request, Response, NextFunction } from "express";
|
||||||
import createHttpError from "http-errors";
|
import createHttpError from "http-errors";
|
||||||
import HttpCode from "@server/types/HttpCode";
|
import HttpCode from "@server/types/HttpCode";
|
||||||
|
|||||||
81
server/private/routers/auditLogs/exportAccessAuditLog.ts
Normal file
81
server/private/routers/auditLogs/exportAccessAuditLog.ts
Normal file
@@ -0,0 +1,81 @@
|
|||||||
|
/*
|
||||||
|
* This file is part of a proprietary work.
|
||||||
|
*
|
||||||
|
* Copyright (c) 2025 Fossorial, Inc.
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* This file is licensed under the Fossorial Commercial License.
|
||||||
|
* You may not use this file except in compliance with the License.
|
||||||
|
* Unauthorized use, copying, modification, or distribution is strictly prohibited.
|
||||||
|
*
|
||||||
|
* This file is not licensed under the AGPLv3.
|
||||||
|
*/
|
||||||
|
|
||||||
|
import { registry } from "@server/openApi";
|
||||||
|
import { NextFunction } from "express";
|
||||||
|
import { Request, Response } from "express";
|
||||||
|
import { OpenAPITags } from "@server/openApi";
|
||||||
|
import createHttpError from "http-errors";
|
||||||
|
import HttpCode from "@server/types/HttpCode";
|
||||||
|
import { fromError } from "zod-validation-error";
|
||||||
|
import logger from "@server/logger";
|
||||||
|
import { queryAccessAuditLogsParams, queryAccessAuditLogsQuery, queryAccess } from "./queryAccessAuditLog";
|
||||||
|
import { generateCSV } from "@server/routers/auditLogs/generateCSV";
|
||||||
|
|
||||||
|
registry.registerPath({
|
||||||
|
method: "get",
|
||||||
|
path: "/org/{orgId}/logs/access/export",
|
||||||
|
description: "Export the access audit log for an organization as CSV",
|
||||||
|
tags: [OpenAPITags.Org],
|
||||||
|
request: {
|
||||||
|
query: queryAccessAuditLogsQuery,
|
||||||
|
params: queryAccessAuditLogsParams
|
||||||
|
},
|
||||||
|
responses: {}
|
||||||
|
});
|
||||||
|
|
||||||
|
export async function exportAccessAuditLogs(
|
||||||
|
req: Request,
|
||||||
|
res: Response,
|
||||||
|
next: NextFunction
|
||||||
|
): Promise<any> {
|
||||||
|
try {
|
||||||
|
const parsedQuery = queryAccessAuditLogsQuery.safeParse(req.query);
|
||||||
|
if (!parsedQuery.success) {
|
||||||
|
return next(
|
||||||
|
createHttpError(
|
||||||
|
HttpCode.BAD_REQUEST,
|
||||||
|
fromError(parsedQuery.error)
|
||||||
|
)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
const parsedParams = queryAccessAuditLogsParams.safeParse(req.params);
|
||||||
|
if (!parsedParams.success) {
|
||||||
|
return next(
|
||||||
|
createHttpError(
|
||||||
|
HttpCode.BAD_REQUEST,
|
||||||
|
fromError(parsedParams.error)
|
||||||
|
)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
const data = { ...parsedQuery.data, ...parsedParams.data };
|
||||||
|
|
||||||
|
const baseQuery = queryAccess(data);
|
||||||
|
|
||||||
|
const log = await baseQuery.limit(data.limit).offset(data.offset);
|
||||||
|
|
||||||
|
const csvData = generateCSV(log);
|
||||||
|
|
||||||
|
res.setHeader('Content-Type', 'text/csv');
|
||||||
|
res.setHeader('Content-Disposition', `attachment; filename="access-audit-logs-${data.orgId}-${Date.now()}.csv"`);
|
||||||
|
|
||||||
|
return res.send(csvData);
|
||||||
|
} catch (error) {
|
||||||
|
logger.error(error);
|
||||||
|
return next(
|
||||||
|
createHttpError(HttpCode.INTERNAL_SERVER_ERROR, "An error occurred")
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
81
server/private/routers/auditLogs/exportActionAuditLog.ts
Normal file
81
server/private/routers/auditLogs/exportActionAuditLog.ts
Normal file
@@ -0,0 +1,81 @@
|
|||||||
|
/*
|
||||||
|
* This file is part of a proprietary work.
|
||||||
|
*
|
||||||
|
* Copyright (c) 2025 Fossorial, Inc.
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* This file is licensed under the Fossorial Commercial License.
|
||||||
|
* You may not use this file except in compliance with the License.
|
||||||
|
* Unauthorized use, copying, modification, or distribution is strictly prohibited.
|
||||||
|
*
|
||||||
|
* This file is not licensed under the AGPLv3.
|
||||||
|
*/
|
||||||
|
|
||||||
|
import { registry } from "@server/openApi";
|
||||||
|
import { NextFunction } from "express";
|
||||||
|
import { Request, Response } from "express";
|
||||||
|
import { OpenAPITags } from "@server/openApi";
|
||||||
|
import createHttpError from "http-errors";
|
||||||
|
import HttpCode from "@server/types/HttpCode";
|
||||||
|
import { fromError } from "zod-validation-error";
|
||||||
|
import logger from "@server/logger";
|
||||||
|
import { queryActionAuditLogsParams, queryActionAuditLogsQuery, queryAction } from "./queryActionAuditLog";
|
||||||
|
import { generateCSV } from "@server/routers/auditLogs/generateCSV";
|
||||||
|
|
||||||
|
registry.registerPath({
|
||||||
|
method: "get",
|
||||||
|
path: "/org/{orgId}/logs/action/export",
|
||||||
|
description: "Export the action audit log for an organization as CSV",
|
||||||
|
tags: [OpenAPITags.Org],
|
||||||
|
request: {
|
||||||
|
query: queryActionAuditLogsQuery,
|
||||||
|
params: queryActionAuditLogsParams
|
||||||
|
},
|
||||||
|
responses: {}
|
||||||
|
});
|
||||||
|
|
||||||
|
export async function exportActionAuditLogs(
|
||||||
|
req: Request,
|
||||||
|
res: Response,
|
||||||
|
next: NextFunction
|
||||||
|
): Promise<any> {
|
||||||
|
try {
|
||||||
|
const parsedQuery = queryActionAuditLogsQuery.safeParse(req.query);
|
||||||
|
if (!parsedQuery.success) {
|
||||||
|
return next(
|
||||||
|
createHttpError(
|
||||||
|
HttpCode.BAD_REQUEST,
|
||||||
|
fromError(parsedQuery.error)
|
||||||
|
)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
const parsedParams = queryActionAuditLogsParams.safeParse(req.params);
|
||||||
|
if (!parsedParams.success) {
|
||||||
|
return next(
|
||||||
|
createHttpError(
|
||||||
|
HttpCode.BAD_REQUEST,
|
||||||
|
fromError(parsedParams.error)
|
||||||
|
)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
const data = { ...parsedQuery.data, ...parsedParams.data };
|
||||||
|
|
||||||
|
const baseQuery = queryAction(data);
|
||||||
|
|
||||||
|
const log = await baseQuery.limit(data.limit).offset(data.offset);
|
||||||
|
|
||||||
|
const csvData = generateCSV(log);
|
||||||
|
|
||||||
|
res.setHeader('Content-Type', 'text/csv');
|
||||||
|
res.setHeader('Content-Disposition', `attachment; filename="action-audit-logs-${data.orgId}-${Date.now()}.csv"`);
|
||||||
|
|
||||||
|
return res.send(csvData);
|
||||||
|
} catch (error) {
|
||||||
|
logger.error(error);
|
||||||
|
return next(
|
||||||
|
createHttpError(HttpCode.INTERNAL_SERVER_ERROR, "An error occurred")
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
17
server/private/routers/auditLogs/index.ts
Normal file
17
server/private/routers/auditLogs/index.ts
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
/*
|
||||||
|
* This file is part of a proprietary work.
|
||||||
|
*
|
||||||
|
* Copyright (c) 2025 Fossorial, Inc.
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* This file is licensed under the Fossorial Commercial License.
|
||||||
|
* You may not use this file except in compliance with the License.
|
||||||
|
* Unauthorized use, copying, modification, or distribution is strictly prohibited.
|
||||||
|
*
|
||||||
|
* This file is not licensed under the AGPLv3.
|
||||||
|
*/
|
||||||
|
|
||||||
|
export * from "./queryActionAuditLog";
|
||||||
|
export * from "./exportActionAuditLog";
|
||||||
|
export * from "./queryAccessAuditLog";
|
||||||
|
export * from "./exportAccessAuditLog";
|
||||||
258
server/private/routers/auditLogs/queryAccessAuditLog.ts
Normal file
258
server/private/routers/auditLogs/queryAccessAuditLog.ts
Normal file
@@ -0,0 +1,258 @@
|
|||||||
|
/*
|
||||||
|
* This file is part of a proprietary work.
|
||||||
|
*
|
||||||
|
* Copyright (c) 2025 Fossorial, Inc.
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* This file is licensed under the Fossorial Commercial License.
|
||||||
|
* You may not use this file except in compliance with the License.
|
||||||
|
* Unauthorized use, copying, modification, or distribution is strictly prohibited.
|
||||||
|
*
|
||||||
|
* This file is not licensed under the AGPLv3.
|
||||||
|
*/
|
||||||
|
|
||||||
|
import { accessAuditLog, db, resources } from "@server/db";
|
||||||
|
import { registry } from "@server/openApi";
|
||||||
|
import { NextFunction } from "express";
|
||||||
|
import { Request, Response } from "express";
|
||||||
|
import { eq, gt, lt, and, count, desc } from "drizzle-orm";
|
||||||
|
import { OpenAPITags } from "@server/openApi";
|
||||||
|
import { z } from "zod";
|
||||||
|
import createHttpError from "http-errors";
|
||||||
|
import HttpCode from "@server/types/HttpCode";
|
||||||
|
import { fromError } from "zod-validation-error";
|
||||||
|
import { QueryAccessAuditLogResponse } from "@server/routers/auditLogs/types";
|
||||||
|
import response from "@server/lib/response";
|
||||||
|
import logger from "@server/logger";
|
||||||
|
|
||||||
|
export const queryAccessAuditLogsQuery = z.object({
|
||||||
|
// iso string just validate its a parseable date
|
||||||
|
timeStart: z
|
||||||
|
.string()
|
||||||
|
.refine((val) => !isNaN(Date.parse(val)), {
|
||||||
|
message: "timeStart must be a valid ISO date string"
|
||||||
|
})
|
||||||
|
.transform((val) => Math.floor(new Date(val).getTime() / 1000)),
|
||||||
|
timeEnd: z
|
||||||
|
.string()
|
||||||
|
.refine((val) => !isNaN(Date.parse(val)), {
|
||||||
|
message: "timeEnd must be a valid ISO date string"
|
||||||
|
})
|
||||||
|
.transform((val) => Math.floor(new Date(val).getTime() / 1000))
|
||||||
|
.optional()
|
||||||
|
.default(new Date().toISOString()),
|
||||||
|
action: z
|
||||||
|
.union([z.boolean(), z.string()])
|
||||||
|
.transform((val) => (typeof val === "string" ? val === "true" : val))
|
||||||
|
.optional(),
|
||||||
|
actorType: z.string().optional(),
|
||||||
|
actorId: z.string().optional(),
|
||||||
|
resourceId: z
|
||||||
|
.string()
|
||||||
|
.optional()
|
||||||
|
.transform(Number)
|
||||||
|
.pipe(z.number().int().positive())
|
||||||
|
.optional(),
|
||||||
|
actor: z.string().optional(),
|
||||||
|
type: z.string().optional(),
|
||||||
|
location: z.string().optional(),
|
||||||
|
limit: z
|
||||||
|
.string()
|
||||||
|
.optional()
|
||||||
|
.default("1000")
|
||||||
|
.transform(Number)
|
||||||
|
.pipe(z.number().int().positive()),
|
||||||
|
offset: z
|
||||||
|
.string()
|
||||||
|
.optional()
|
||||||
|
.default("0")
|
||||||
|
.transform(Number)
|
||||||
|
.pipe(z.number().int().nonnegative())
|
||||||
|
});
|
||||||
|
|
||||||
|
export const queryAccessAuditLogsParams = z.object({
|
||||||
|
orgId: z.string()
|
||||||
|
});
|
||||||
|
|
||||||
|
export const queryAccessAuditLogsCombined = queryAccessAuditLogsQuery.merge(
|
||||||
|
queryAccessAuditLogsParams
|
||||||
|
);
|
||||||
|
type Q = z.infer<typeof queryAccessAuditLogsCombined>;
|
||||||
|
|
||||||
|
function getWhere(data: Q) {
|
||||||
|
return and(
|
||||||
|
gt(accessAuditLog.timestamp, data.timeStart),
|
||||||
|
lt(accessAuditLog.timestamp, data.timeEnd),
|
||||||
|
eq(accessAuditLog.orgId, data.orgId),
|
||||||
|
data.resourceId
|
||||||
|
? eq(accessAuditLog.resourceId, data.resourceId)
|
||||||
|
: undefined,
|
||||||
|
data.actor ? eq(accessAuditLog.actor, data.actor) : undefined,
|
||||||
|
data.actorType
|
||||||
|
? eq(accessAuditLog.actorType, data.actorType)
|
||||||
|
: undefined,
|
||||||
|
data.actorId ? eq(accessAuditLog.actorId, data.actorId) : undefined,
|
||||||
|
data.location ? eq(accessAuditLog.location, data.location) : undefined,
|
||||||
|
data.type ? eq(accessAuditLog.type, data.type) : undefined,
|
||||||
|
data.action !== undefined
|
||||||
|
? eq(accessAuditLog.action, data.action)
|
||||||
|
: undefined
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
export function queryAccess(data: Q) {
|
||||||
|
return db
|
||||||
|
.select({
|
||||||
|
orgId: accessAuditLog.orgId,
|
||||||
|
action: accessAuditLog.action,
|
||||||
|
actorType: accessAuditLog.actorType,
|
||||||
|
actorId: accessAuditLog.actorId,
|
||||||
|
resourceId: accessAuditLog.resourceId,
|
||||||
|
resourceName: resources.name,
|
||||||
|
resourceNiceId: resources.niceId,
|
||||||
|
ip: accessAuditLog.ip,
|
||||||
|
location: accessAuditLog.location,
|
||||||
|
userAgent: accessAuditLog.userAgent,
|
||||||
|
metadata: accessAuditLog.metadata,
|
||||||
|
type: accessAuditLog.type,
|
||||||
|
timestamp: accessAuditLog.timestamp,
|
||||||
|
actor: accessAuditLog.actor
|
||||||
|
})
|
||||||
|
.from(accessAuditLog)
|
||||||
|
.leftJoin(
|
||||||
|
resources,
|
||||||
|
eq(accessAuditLog.resourceId, resources.resourceId)
|
||||||
|
)
|
||||||
|
.where(getWhere(data))
|
||||||
|
.orderBy(desc(accessAuditLog.timestamp), desc(accessAuditLog.id));
|
||||||
|
}
|
||||||
|
|
||||||
|
export function countAccessQuery(data: Q) {
|
||||||
|
const countQuery = db
|
||||||
|
.select({ count: count() })
|
||||||
|
.from(accessAuditLog)
|
||||||
|
.where(getWhere(data));
|
||||||
|
return countQuery;
|
||||||
|
}
|
||||||
|
|
||||||
|
async function queryUniqueFilterAttributes(
|
||||||
|
timeStart: number,
|
||||||
|
timeEnd: number,
|
||||||
|
orgId: string
|
||||||
|
) {
|
||||||
|
const baseConditions = and(
|
||||||
|
gt(accessAuditLog.timestamp, timeStart),
|
||||||
|
lt(accessAuditLog.timestamp, timeEnd),
|
||||||
|
eq(accessAuditLog.orgId, orgId)
|
||||||
|
);
|
||||||
|
|
||||||
|
// Get unique actors
|
||||||
|
const uniqueActors = await db
|
||||||
|
.selectDistinct({
|
||||||
|
actor: accessAuditLog.actor
|
||||||
|
})
|
||||||
|
.from(accessAuditLog)
|
||||||
|
.where(baseConditions);
|
||||||
|
|
||||||
|
// Get unique locations
|
||||||
|
const uniqueLocations = await db
|
||||||
|
.selectDistinct({
|
||||||
|
locations: accessAuditLog.location
|
||||||
|
})
|
||||||
|
.from(accessAuditLog)
|
||||||
|
.where(baseConditions);
|
||||||
|
|
||||||
|
// Get unique resources with names
|
||||||
|
const uniqueResources = await db
|
||||||
|
.selectDistinct({
|
||||||
|
id: accessAuditLog.resourceId,
|
||||||
|
name: resources.name
|
||||||
|
})
|
||||||
|
.from(accessAuditLog)
|
||||||
|
.leftJoin(
|
||||||
|
resources,
|
||||||
|
eq(accessAuditLog.resourceId, resources.resourceId)
|
||||||
|
)
|
||||||
|
.where(baseConditions);
|
||||||
|
|
||||||
|
return {
|
||||||
|
actors: uniqueActors.map(row => row.actor).filter((actor): actor is string => actor !== null),
|
||||||
|
resources: uniqueResources.filter((row): row is { id: number; name: string | null } => row.id !== null),
|
||||||
|
locations: uniqueLocations.map(row => row.locations).filter((location): location is string => location !== null)
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
registry.registerPath({
|
||||||
|
method: "get",
|
||||||
|
path: "/org/{orgId}/logs/access",
|
||||||
|
description: "Query the access audit log for an organization",
|
||||||
|
tags: [OpenAPITags.Org],
|
||||||
|
request: {
|
||||||
|
query: queryAccessAuditLogsQuery,
|
||||||
|
params: queryAccessAuditLogsParams
|
||||||
|
},
|
||||||
|
responses: {}
|
||||||
|
});
|
||||||
|
|
||||||
|
export async function queryAccessAuditLogs(
|
||||||
|
req: Request,
|
||||||
|
res: Response,
|
||||||
|
next: NextFunction
|
||||||
|
): Promise<any> {
|
||||||
|
try {
|
||||||
|
const parsedQuery = queryAccessAuditLogsQuery.safeParse(req.query);
|
||||||
|
if (!parsedQuery.success) {
|
||||||
|
return next(
|
||||||
|
createHttpError(
|
||||||
|
HttpCode.BAD_REQUEST,
|
||||||
|
fromError(parsedQuery.error)
|
||||||
|
)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
const parsedParams = queryAccessAuditLogsParams.safeParse(req.params);
|
||||||
|
if (!parsedParams.success) {
|
||||||
|
return next(
|
||||||
|
createHttpError(
|
||||||
|
HttpCode.BAD_REQUEST,
|
||||||
|
fromError(parsedParams.error)
|
||||||
|
)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
const data = { ...parsedQuery.data, ...parsedParams.data };
|
||||||
|
|
||||||
|
const baseQuery = queryAccess(data);
|
||||||
|
|
||||||
|
const log = await baseQuery.limit(data.limit).offset(data.offset);
|
||||||
|
|
||||||
|
const totalCountResult = await countAccessQuery(data);
|
||||||
|
const totalCount = totalCountResult[0].count;
|
||||||
|
|
||||||
|
const filterAttributes = await queryUniqueFilterAttributes(
|
||||||
|
data.timeStart,
|
||||||
|
data.timeEnd,
|
||||||
|
data.orgId
|
||||||
|
);
|
||||||
|
|
||||||
|
return response<QueryAccessAuditLogResponse>(res, {
|
||||||
|
data: {
|
||||||
|
log: log,
|
||||||
|
pagination: {
|
||||||
|
total: totalCount,
|
||||||
|
limit: data.limit,
|
||||||
|
offset: data.offset
|
||||||
|
},
|
||||||
|
filterAttributes
|
||||||
|
},
|
||||||
|
success: true,
|
||||||
|
error: false,
|
||||||
|
message: "Access audit logs retrieved successfully",
|
||||||
|
status: HttpCode.OK
|
||||||
|
});
|
||||||
|
} catch (error) {
|
||||||
|
logger.error(error);
|
||||||
|
return next(
|
||||||
|
createHttpError(HttpCode.INTERNAL_SERVER_ERROR, "An error occurred")
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
211
server/private/routers/auditLogs/queryActionAuditLog.ts
Normal file
211
server/private/routers/auditLogs/queryActionAuditLog.ts
Normal file
@@ -0,0 +1,211 @@
|
|||||||
|
/*
|
||||||
|
* This file is part of a proprietary work.
|
||||||
|
*
|
||||||
|
* Copyright (c) 2025 Fossorial, Inc.
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* This file is licensed under the Fossorial Commercial License.
|
||||||
|
* You may not use this file except in compliance with the License.
|
||||||
|
* Unauthorized use, copying, modification, or distribution is strictly prohibited.
|
||||||
|
*
|
||||||
|
* This file is not licensed under the AGPLv3.
|
||||||
|
*/
|
||||||
|
|
||||||
|
import { actionAuditLog, db } from "@server/db";
|
||||||
|
import { registry } from "@server/openApi";
|
||||||
|
import { NextFunction } from "express";
|
||||||
|
import { Request, Response } from "express";
|
||||||
|
import { eq, gt, lt, and, count, desc } from "drizzle-orm";
|
||||||
|
import { OpenAPITags } from "@server/openApi";
|
||||||
|
import { z } from "zod";
|
||||||
|
import createHttpError from "http-errors";
|
||||||
|
import HttpCode from "@server/types/HttpCode";
|
||||||
|
import { fromError } from "zod-validation-error";
|
||||||
|
import { QueryActionAuditLogResponse } from "@server/routers/auditLogs/types";
|
||||||
|
import response from "@server/lib/response";
|
||||||
|
import logger from "@server/logger";
|
||||||
|
|
||||||
|
export const queryActionAuditLogsQuery = z.object({
|
||||||
|
// iso string just validate its a parseable date
|
||||||
|
timeStart: z
|
||||||
|
.string()
|
||||||
|
.refine((val) => !isNaN(Date.parse(val)), {
|
||||||
|
message: "timeStart must be a valid ISO date string"
|
||||||
|
})
|
||||||
|
.transform((val) => Math.floor(new Date(val).getTime() / 1000)),
|
||||||
|
timeEnd: z
|
||||||
|
.string()
|
||||||
|
.refine((val) => !isNaN(Date.parse(val)), {
|
||||||
|
message: "timeEnd must be a valid ISO date string"
|
||||||
|
})
|
||||||
|
.transform((val) => Math.floor(new Date(val).getTime() / 1000))
|
||||||
|
.optional()
|
||||||
|
.default(new Date().toISOString()),
|
||||||
|
action: z.string().optional(),
|
||||||
|
actorType: z.string().optional(),
|
||||||
|
actorId: z.string().optional(),
|
||||||
|
actor: z.string().optional(),
|
||||||
|
limit: z
|
||||||
|
.string()
|
||||||
|
.optional()
|
||||||
|
.default("1000")
|
||||||
|
.transform(Number)
|
||||||
|
.pipe(z.number().int().positive()),
|
||||||
|
offset: z
|
||||||
|
.string()
|
||||||
|
.optional()
|
||||||
|
.default("0")
|
||||||
|
.transform(Number)
|
||||||
|
.pipe(z.number().int().nonnegative())
|
||||||
|
});
|
||||||
|
|
||||||
|
export const queryActionAuditLogsParams = z.object({
|
||||||
|
orgId: z.string()
|
||||||
|
});
|
||||||
|
|
||||||
|
export const queryActionAuditLogsCombined =
|
||||||
|
queryActionAuditLogsQuery.merge(queryActionAuditLogsParams);
|
||||||
|
type Q = z.infer<typeof queryActionAuditLogsCombined>;
|
||||||
|
|
||||||
|
function getWhere(data: Q) {
|
||||||
|
return and(
|
||||||
|
gt(actionAuditLog.timestamp, data.timeStart),
|
||||||
|
lt(actionAuditLog.timestamp, data.timeEnd),
|
||||||
|
eq(actionAuditLog.orgId, data.orgId),
|
||||||
|
data.actor ? eq(actionAuditLog.actor, data.actor) : undefined,
|
||||||
|
data.actorType ? eq(actionAuditLog.actorType, data.actorType) : undefined,
|
||||||
|
data.actorId ? eq(actionAuditLog.actorId, data.actorId) : undefined,
|
||||||
|
data.action ? eq(actionAuditLog.action, data.action) : undefined
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
export function queryAction(data: Q) {
|
||||||
|
return db
|
||||||
|
.select({
|
||||||
|
orgId: actionAuditLog.orgId,
|
||||||
|
action: actionAuditLog.action,
|
||||||
|
actorType: actionAuditLog.actorType,
|
||||||
|
metadata: actionAuditLog.metadata,
|
||||||
|
actorId: actionAuditLog.actorId,
|
||||||
|
timestamp: actionAuditLog.timestamp,
|
||||||
|
actor: actionAuditLog.actor
|
||||||
|
})
|
||||||
|
.from(actionAuditLog)
|
||||||
|
.where(getWhere(data))
|
||||||
|
.orderBy(desc(actionAuditLog.timestamp), desc(actionAuditLog.id));
|
||||||
|
}
|
||||||
|
|
||||||
|
export function countActionQuery(data: Q) {
|
||||||
|
const countQuery = db
|
||||||
|
.select({ count: count() })
|
||||||
|
.from(actionAuditLog)
|
||||||
|
.where(getWhere(data));
|
||||||
|
return countQuery;
|
||||||
|
}
|
||||||
|
|
||||||
|
async function queryUniqueFilterAttributes(
|
||||||
|
timeStart: number,
|
||||||
|
timeEnd: number,
|
||||||
|
orgId: string
|
||||||
|
) {
|
||||||
|
const baseConditions = and(
|
||||||
|
gt(actionAuditLog.timestamp, timeStart),
|
||||||
|
lt(actionAuditLog.timestamp, timeEnd),
|
||||||
|
eq(actionAuditLog.orgId, orgId)
|
||||||
|
);
|
||||||
|
|
||||||
|
// Get unique actors
|
||||||
|
const uniqueActors = await db
|
||||||
|
.selectDistinct({
|
||||||
|
actor: actionAuditLog.actor
|
||||||
|
})
|
||||||
|
.from(actionAuditLog)
|
||||||
|
.where(baseConditions);
|
||||||
|
|
||||||
|
const uniqueActions = await db
|
||||||
|
.selectDistinct({
|
||||||
|
action: actionAuditLog.action
|
||||||
|
})
|
||||||
|
.from(actionAuditLog)
|
||||||
|
.where(baseConditions);
|
||||||
|
|
||||||
|
return {
|
||||||
|
actors: uniqueActors.map(row => row.actor).filter((actor): actor is string => actor !== null),
|
||||||
|
actions: uniqueActions.map(row => row.action).filter((action): action is string => action !== null),
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
registry.registerPath({
|
||||||
|
method: "get",
|
||||||
|
path: "/org/{orgId}/logs/action",
|
||||||
|
description: "Query the action audit log for an organization",
|
||||||
|
tags: [OpenAPITags.Org],
|
||||||
|
request: {
|
||||||
|
query: queryActionAuditLogsQuery,
|
||||||
|
params: queryActionAuditLogsParams
|
||||||
|
},
|
||||||
|
responses: {}
|
||||||
|
});
|
||||||
|
|
||||||
|
export async function queryActionAuditLogs(
|
||||||
|
req: Request,
|
||||||
|
res: Response,
|
||||||
|
next: NextFunction
|
||||||
|
): Promise<any> {
|
||||||
|
try {
|
||||||
|
const parsedQuery = queryActionAuditLogsQuery.safeParse(req.query);
|
||||||
|
if (!parsedQuery.success) {
|
||||||
|
return next(
|
||||||
|
createHttpError(
|
||||||
|
HttpCode.BAD_REQUEST,
|
||||||
|
fromError(parsedQuery.error)
|
||||||
|
)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
const parsedParams = queryActionAuditLogsParams.safeParse(req.params);
|
||||||
|
if (!parsedParams.success) {
|
||||||
|
return next(
|
||||||
|
createHttpError(
|
||||||
|
HttpCode.BAD_REQUEST,
|
||||||
|
fromError(parsedParams.error)
|
||||||
|
)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
const data = { ...parsedQuery.data, ...parsedParams.data };
|
||||||
|
|
||||||
|
const baseQuery = queryAction(data);
|
||||||
|
|
||||||
|
const log = await baseQuery.limit(data.limit).offset(data.offset);
|
||||||
|
|
||||||
|
const totalCountResult = await countActionQuery(data);
|
||||||
|
const totalCount = totalCountResult[0].count;
|
||||||
|
|
||||||
|
const filterAttributes = await queryUniqueFilterAttributes(
|
||||||
|
data.timeStart,
|
||||||
|
data.timeEnd,
|
||||||
|
data.orgId
|
||||||
|
);
|
||||||
|
|
||||||
|
return response<QueryActionAuditLogResponse>(res, {
|
||||||
|
data: {
|
||||||
|
log: log,
|
||||||
|
pagination: {
|
||||||
|
total: totalCount,
|
||||||
|
limit: data.limit,
|
||||||
|
offset: data.offset
|
||||||
|
},
|
||||||
|
filterAttributes
|
||||||
|
},
|
||||||
|
success: true,
|
||||||
|
error: false,
|
||||||
|
message: "Action audit logs retrieved successfully",
|
||||||
|
status: HttpCode.OK
|
||||||
|
});
|
||||||
|
} catch (error) {
|
||||||
|
logger.error(error);
|
||||||
|
return next(
|
||||||
|
createHttpError(HttpCode.INTERNAL_SERVER_ERROR, "An error occurred")
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -21,20 +21,22 @@ import * as domain from "#private/routers/domain";
|
|||||||
import * as auth from "#private/routers/auth";
|
import * as auth from "#private/routers/auth";
|
||||||
import * as license from "#private/routers/license";
|
import * as license from "#private/routers/license";
|
||||||
import * as generateLicense from "./generatedLicense";
|
import * as generateLicense from "./generatedLicense";
|
||||||
|
import * as logs from "#private/routers/auditLogs";
|
||||||
|
import * as misc from "#private/routers/misc";
|
||||||
|
|
||||||
import { Router } from "express";
|
|
||||||
import {
|
import {
|
||||||
verifyOrgAccess,
|
verifyOrgAccess,
|
||||||
verifyUserHasAction,
|
verifyUserHasAction,
|
||||||
verifyUserIsOrgOwner,
|
|
||||||
verifyUserIsServerAdmin
|
verifyUserIsServerAdmin
|
||||||
} from "@server/middlewares";
|
} from "@server/middlewares";
|
||||||
import { ActionsEnum } from "@server/auth/actions";
|
import { ActionsEnum } from "@server/auth/actions";
|
||||||
import {
|
import {
|
||||||
|
logActionAudit,
|
||||||
verifyCertificateAccess,
|
verifyCertificateAccess,
|
||||||
verifyIdpAccess,
|
verifyIdpAccess,
|
||||||
verifyLoginPageAccess,
|
verifyLoginPageAccess,
|
||||||
verifyRemoteExitNodeAccess
|
verifyRemoteExitNodeAccess,
|
||||||
|
verifyValidSubscription
|
||||||
} from "#private/middlewares";
|
} from "#private/middlewares";
|
||||||
import rateLimit, { ipKeyGenerator } from "express-rate-limit";
|
import rateLimit, { ipKeyGenerator } from "express-rate-limit";
|
||||||
import createHttpError from "http-errors";
|
import createHttpError from "http-errors";
|
||||||
@@ -72,6 +74,7 @@ authenticated.put(
|
|||||||
verifyValidLicense,
|
verifyValidLicense,
|
||||||
verifyOrgAccess,
|
verifyOrgAccess,
|
||||||
verifyUserHasAction(ActionsEnum.createIdp),
|
verifyUserHasAction(ActionsEnum.createIdp),
|
||||||
|
logActionAudit(ActionsEnum.createIdp),
|
||||||
orgIdp.createOrgOidcIdp
|
orgIdp.createOrgOidcIdp
|
||||||
);
|
);
|
||||||
|
|
||||||
@@ -81,6 +84,7 @@ authenticated.post(
|
|||||||
verifyOrgAccess,
|
verifyOrgAccess,
|
||||||
verifyIdpAccess,
|
verifyIdpAccess,
|
||||||
verifyUserHasAction(ActionsEnum.updateIdp),
|
verifyUserHasAction(ActionsEnum.updateIdp),
|
||||||
|
logActionAudit(ActionsEnum.updateIdp),
|
||||||
orgIdp.updateOrgOidcIdp
|
orgIdp.updateOrgOidcIdp
|
||||||
);
|
);
|
||||||
|
|
||||||
@@ -90,6 +94,7 @@ authenticated.delete(
|
|||||||
verifyOrgAccess,
|
verifyOrgAccess,
|
||||||
verifyIdpAccess,
|
verifyIdpAccess,
|
||||||
verifyUserHasAction(ActionsEnum.deleteIdp),
|
verifyUserHasAction(ActionsEnum.deleteIdp),
|
||||||
|
logActionAudit(ActionsEnum.deleteIdp),
|
||||||
orgIdp.deleteOrgIdp
|
orgIdp.deleteOrgIdp
|
||||||
);
|
);
|
||||||
|
|
||||||
@@ -127,6 +132,7 @@ authenticated.post(
|
|||||||
verifyOrgAccess,
|
verifyOrgAccess,
|
||||||
verifyCertificateAccess,
|
verifyCertificateAccess,
|
||||||
verifyUserHasAction(ActionsEnum.restartCertificate),
|
verifyUserHasAction(ActionsEnum.restartCertificate),
|
||||||
|
logActionAudit(ActionsEnum.restartCertificate),
|
||||||
certificates.restartCertificate
|
certificates.restartCertificate
|
||||||
);
|
);
|
||||||
|
|
||||||
@@ -152,6 +158,7 @@ if (build === "saas") {
|
|||||||
"/org/:orgId/billing/create-checkout-session",
|
"/org/:orgId/billing/create-checkout-session",
|
||||||
verifyOrgAccess,
|
verifyOrgAccess,
|
||||||
verifyUserHasAction(ActionsEnum.billing),
|
verifyUserHasAction(ActionsEnum.billing),
|
||||||
|
logActionAudit(ActionsEnum.billing),
|
||||||
billing.createCheckoutSession
|
billing.createCheckoutSession
|
||||||
);
|
);
|
||||||
|
|
||||||
@@ -159,6 +166,7 @@ if (build === "saas") {
|
|||||||
"/org/:orgId/billing/create-portal-session",
|
"/org/:orgId/billing/create-portal-session",
|
||||||
verifyOrgAccess,
|
verifyOrgAccess,
|
||||||
verifyUserHasAction(ActionsEnum.billing),
|
verifyUserHasAction(ActionsEnum.billing),
|
||||||
|
logActionAudit(ActionsEnum.billing),
|
||||||
billing.createPortalSession
|
billing.createPortalSession
|
||||||
);
|
);
|
||||||
|
|
||||||
@@ -187,6 +195,24 @@ if (build === "saas") {
|
|||||||
verifyOrgAccess,
|
verifyOrgAccess,
|
||||||
generateLicense.generateNewLicense
|
generateLicense.generateNewLicense
|
||||||
);
|
);
|
||||||
|
|
||||||
|
authenticated.post(
|
||||||
|
"/send-support-request",
|
||||||
|
rateLimit({
|
||||||
|
windowMs: 15 * 60 * 1000,
|
||||||
|
max: 3,
|
||||||
|
keyGenerator: (req) =>
|
||||||
|
`sendSupportRequest:${req.user?.userId || ipKeyGenerator(req.ip || "")}`,
|
||||||
|
handler: (req, res, next) => {
|
||||||
|
const message = `You can only send 3 support requests every 15 minutes. Please try again later.`;
|
||||||
|
return next(
|
||||||
|
createHttpError(HttpCode.TOO_MANY_REQUESTS, message)
|
||||||
|
);
|
||||||
|
},
|
||||||
|
store: createStore()
|
||||||
|
}),
|
||||||
|
misc.sendSupportEmail
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
authenticated.get(
|
authenticated.get(
|
||||||
@@ -206,6 +232,7 @@ authenticated.put(
|
|||||||
verifyValidLicense,
|
verifyValidLicense,
|
||||||
verifyOrgAccess,
|
verifyOrgAccess,
|
||||||
verifyUserHasAction(ActionsEnum.createRemoteExitNode),
|
verifyUserHasAction(ActionsEnum.createRemoteExitNode),
|
||||||
|
logActionAudit(ActionsEnum.createRemoteExitNode),
|
||||||
remoteExitNode.createRemoteExitNode
|
remoteExitNode.createRemoteExitNode
|
||||||
);
|
);
|
||||||
|
|
||||||
@@ -240,6 +267,7 @@ authenticated.delete(
|
|||||||
verifyOrgAccess,
|
verifyOrgAccess,
|
||||||
verifyRemoteExitNodeAccess,
|
verifyRemoteExitNodeAccess,
|
||||||
verifyUserHasAction(ActionsEnum.deleteRemoteExitNode),
|
verifyUserHasAction(ActionsEnum.deleteRemoteExitNode),
|
||||||
|
logActionAudit(ActionsEnum.deleteRemoteExitNode),
|
||||||
remoteExitNode.deleteRemoteExitNode
|
remoteExitNode.deleteRemoteExitNode
|
||||||
);
|
);
|
||||||
|
|
||||||
@@ -248,6 +276,7 @@ authenticated.put(
|
|||||||
verifyValidLicense,
|
verifyValidLicense,
|
||||||
verifyOrgAccess,
|
verifyOrgAccess,
|
||||||
verifyUserHasAction(ActionsEnum.createLoginPage),
|
verifyUserHasAction(ActionsEnum.createLoginPage),
|
||||||
|
logActionAudit(ActionsEnum.createLoginPage),
|
||||||
loginPage.createLoginPage
|
loginPage.createLoginPage
|
||||||
);
|
);
|
||||||
|
|
||||||
@@ -257,6 +286,7 @@ authenticated.post(
|
|||||||
verifyOrgAccess,
|
verifyOrgAccess,
|
||||||
verifyLoginPageAccess,
|
verifyLoginPageAccess,
|
||||||
verifyUserHasAction(ActionsEnum.updateLoginPage),
|
verifyUserHasAction(ActionsEnum.updateLoginPage),
|
||||||
|
logActionAudit(ActionsEnum.updateLoginPage),
|
||||||
loginPage.updateLoginPage
|
loginPage.updateLoginPage
|
||||||
);
|
);
|
||||||
|
|
||||||
@@ -266,6 +296,7 @@ authenticated.delete(
|
|||||||
verifyOrgAccess,
|
verifyOrgAccess,
|
||||||
verifyLoginPageAccess,
|
verifyLoginPageAccess,
|
||||||
verifyUserHasAction(ActionsEnum.deleteLoginPage),
|
verifyUserHasAction(ActionsEnum.deleteLoginPage),
|
||||||
|
logActionAudit(ActionsEnum.deleteLoginPage),
|
||||||
loginPage.deleteLoginPage
|
loginPage.deleteLoginPage
|
||||||
);
|
);
|
||||||
|
|
||||||
@@ -334,3 +365,41 @@ authenticated.post(
|
|||||||
verifyUserIsServerAdmin,
|
verifyUserIsServerAdmin,
|
||||||
license.recheckStatus
|
license.recheckStatus
|
||||||
);
|
);
|
||||||
|
|
||||||
|
authenticated.get(
|
||||||
|
"/org/:orgId/logs/action",
|
||||||
|
verifyValidLicense,
|
||||||
|
verifyValidSubscription,
|
||||||
|
verifyOrgAccess,
|
||||||
|
verifyUserHasAction(ActionsEnum.exportLogs),
|
||||||
|
logs.queryActionAuditLogs
|
||||||
|
);
|
||||||
|
|
||||||
|
authenticated.get(
|
||||||
|
"/org/:orgId/logs/action/export",
|
||||||
|
verifyValidLicense,
|
||||||
|
verifyValidSubscription,
|
||||||
|
verifyOrgAccess,
|
||||||
|
verifyUserHasAction(ActionsEnum.exportLogs),
|
||||||
|
logActionAudit(ActionsEnum.exportLogs),
|
||||||
|
logs.exportActionAuditLogs
|
||||||
|
);
|
||||||
|
|
||||||
|
authenticated.get(
|
||||||
|
"/org/:orgId/logs/access",
|
||||||
|
verifyValidLicense,
|
||||||
|
verifyValidSubscription,
|
||||||
|
verifyOrgAccess,
|
||||||
|
verifyUserHasAction(ActionsEnum.exportLogs),
|
||||||
|
logs.queryAccessAuditLogs
|
||||||
|
);
|
||||||
|
|
||||||
|
authenticated.get(
|
||||||
|
"/org/:orgId/logs/access/export",
|
||||||
|
verifyValidLicense,
|
||||||
|
verifyValidSubscription,
|
||||||
|
verifyOrgAccess,
|
||||||
|
verifyUserHasAction(ActionsEnum.exportLogs),
|
||||||
|
logActionAudit(ActionsEnum.exportLogs),
|
||||||
|
logs.exportAccessAuditLogs
|
||||||
|
);
|
||||||
|
|||||||
@@ -1,9 +1,22 @@
|
|||||||
|
/*
|
||||||
|
* This file is part of a proprietary work.
|
||||||
|
*
|
||||||
|
* Copyright (c) 2025 Fossorial, Inc.
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* This file is licensed under the Fossorial Commercial License.
|
||||||
|
* You may not use this file except in compliance with the License.
|
||||||
|
* Unauthorized use, copying, modification, or distribution is strictly prohibited.
|
||||||
|
*
|
||||||
|
* This file is not licensed under the AGPLv3.
|
||||||
|
*/
|
||||||
|
|
||||||
import { Request, Response, NextFunction } from "express";
|
import { Request, Response, NextFunction } from "express";
|
||||||
import HttpCode from "@server/types/HttpCode";
|
import HttpCode from "@server/types/HttpCode";
|
||||||
import createHttpError from "http-errors";
|
import createHttpError from "http-errors";
|
||||||
import logger from "@server/logger";
|
import logger from "@server/logger";
|
||||||
import { response as sendResponse } from "@server/lib/response";
|
import { response as sendResponse } from "@server/lib/response";
|
||||||
import privateConfig from "@server/private/lib/config";
|
import privateConfig from "#private/lib/config";
|
||||||
import { GenerateNewLicenseResponse } from "@server/routers/generatedLicense/types";
|
import { GenerateNewLicenseResponse } from "@server/routers/generatedLicense/types";
|
||||||
|
|
||||||
async function createNewLicense(orgId: string, licenseData: any): Promise<any> {
|
async function createNewLicense(orgId: string, licenseData: any): Promise<any> {
|
||||||
|
|||||||
@@ -1,2 +1,15 @@
|
|||||||
|
/*
|
||||||
|
* This file is part of a proprietary work.
|
||||||
|
*
|
||||||
|
* Copyright (c) 2025 Fossorial, Inc.
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* This file is licensed under the Fossorial Commercial License.
|
||||||
|
* You may not use this file except in compliance with the License.
|
||||||
|
* Unauthorized use, copying, modification, or distribution is strictly prohibited.
|
||||||
|
*
|
||||||
|
* This file is not licensed under the AGPLv3.
|
||||||
|
*/
|
||||||
|
|
||||||
export * from "./listGeneratedLicenses";
|
export * from "./listGeneratedLicenses";
|
||||||
export * from "./generateNewLicense";
|
export * from "./generateNewLicense";
|
||||||
|
|||||||
@@ -1,9 +1,22 @@
|
|||||||
|
/*
|
||||||
|
* This file is part of a proprietary work.
|
||||||
|
*
|
||||||
|
* Copyright (c) 2025 Fossorial, Inc.
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* This file is licensed under the Fossorial Commercial License.
|
||||||
|
* You may not use this file except in compliance with the License.
|
||||||
|
* Unauthorized use, copying, modification, or distribution is strictly prohibited.
|
||||||
|
*
|
||||||
|
* This file is not licensed under the AGPLv3.
|
||||||
|
*/
|
||||||
|
|
||||||
import { Request, Response, NextFunction } from "express";
|
import { Request, Response, NextFunction } from "express";
|
||||||
import HttpCode from "@server/types/HttpCode";
|
import HttpCode from "@server/types/HttpCode";
|
||||||
import createHttpError from "http-errors";
|
import createHttpError from "http-errors";
|
||||||
import logger from "@server/logger";
|
import logger from "@server/logger";
|
||||||
import { response as sendResponse } from "@server/lib/response";
|
import { response as sendResponse } from "@server/lib/response";
|
||||||
import privateConfig from "@server/private/lib/config";
|
import privateConfig from "#private/lib/config";
|
||||||
import { GeneratedLicenseKey, ListGeneratedLicenseKeysResponse } from "@server/routers/generatedLicense/types";
|
import { GeneratedLicenseKey, ListGeneratedLicenseKeysResponse } from "@server/routers/generatedLicense/types";
|
||||||
|
|
||||||
async function fetchLicenseKeys(orgId: string): Promise<any> {
|
async function fetchLicenseKeys(orgId: string): Promise<any> {
|
||||||
|
|||||||
@@ -65,10 +65,12 @@ export async function createExitNode(
|
|||||||
[exitNode] = await db
|
[exitNode] = await db
|
||||||
.update(exitNodes)
|
.update(exitNodes)
|
||||||
.set({
|
.set({
|
||||||
reachableAt
|
reachableAt,
|
||||||
|
online: true
|
||||||
})
|
})
|
||||||
.where(eq(exitNodes.exitNodeId, exitNodeQuery.exitNodeId))
|
.where(eq(exitNodes.exitNodeId, exitNodeQuery.exitNodeId))
|
||||||
.returning();
|
.returning();
|
||||||
|
|
||||||
logger.info(`Updated exit node reachableAt to ${reachableAt}`);
|
logger.info(`Updated exit node reachableAt to ${reachableAt}`);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user