Compare commits
236 Commits
v0.108.0-b
...
ADG-1-util
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
ac8a0ec570 | ||
|
|
3255efcaf3 | ||
|
|
bf9be98c71 | ||
|
|
0ed2cd04b2 | ||
|
|
66fba942c8 | ||
|
|
7f9cef948c | ||
|
|
3be90f7b75 | ||
|
|
64994c7fcb | ||
|
|
4b0db6d397 | ||
|
|
777b310a4b | ||
|
|
148a407f6c | ||
|
|
ed947a048e | ||
|
|
74640fb06c | ||
|
|
0d2163c1d6 | ||
|
|
318bd2901a | ||
|
|
61fe269cb8 | ||
|
|
8b2ab8ea87 | ||
|
|
0389515ee3 | ||
|
|
cd5dd1eb16 | ||
|
|
d8ce5b453c | ||
|
|
782a1a9820 | ||
|
|
54cc8f506f | ||
|
|
64fe768725 | ||
|
|
e9d4e76828 | ||
|
|
4d2eba0f29 | ||
|
|
4c65b03844 | ||
|
|
1e0873aa71 | ||
|
|
a5b073d070 | ||
|
|
9c5a7a5544 | ||
|
|
da8132e127 | ||
|
|
2fe2d254b5 | ||
|
|
b92a3cfb89 | ||
|
|
d3dea0f46c | ||
|
|
cc2006f616 | ||
|
|
91270d0b61 | ||
|
|
a4ea6c2233 | ||
|
|
c7b65fa522 | ||
|
|
1a95161784 | ||
|
|
84d72cb842 | ||
|
|
acbad67f47 | ||
|
|
6633ad6304 | ||
|
|
dfa28af907 | ||
|
|
8f75c6ac9d | ||
|
|
446f21a511 | ||
|
|
0211a952ea | ||
|
|
f3161d0c05 | ||
|
|
0c72cde4c3 | ||
|
|
b1657c2b2a | ||
|
|
0b25119c52 | ||
|
|
20e56b7171 | ||
|
|
261c1599a5 | ||
|
|
21945c6058 | ||
|
|
5c15d1bb16 | ||
|
|
efe2ed1304 | ||
|
|
fe07786d2d | ||
|
|
2b55e56306 | ||
|
|
dedbadafc4 | ||
|
|
d3cc2dc930 | ||
|
|
8f53f6505b | ||
|
|
dab608292a | ||
|
|
11dfc7a3e8 | ||
|
|
c234e5dc31 | ||
|
|
3895cfb4f0 | ||
|
|
37b16bcf79 | ||
|
|
4d470f9484 | ||
|
|
a8431297f7 | ||
|
|
9789e5b0fe | ||
|
|
4a49c4db96 | ||
|
|
d578c713ff | ||
|
|
d4ca14806e | ||
|
|
abb738013a | ||
|
|
098cbab7e6 | ||
|
|
d96e65cb0c | ||
|
|
1d6d85cff4 | ||
|
|
ac5a96fada | ||
|
|
6673bb175a | ||
|
|
b1a0f4fa44 | ||
|
|
d06b18a493 | ||
|
|
80ec01dd49 | ||
|
|
47dfa44cf6 | ||
|
|
1d2026bf7e | ||
|
|
e77de2e67d | ||
|
|
e529d29e8a | ||
|
|
41cce62597 | ||
|
|
5b45f6d508 | ||
|
|
73ff401b0f | ||
|
|
6363f8a2e7 | ||
|
|
2c64ab5a51 | ||
|
|
df097341c3 | ||
|
|
4919630ccc | ||
|
|
b32b8f9c7e | ||
|
|
355cec1d7b | ||
|
|
5b5b397132 | ||
|
|
5578987884 | ||
|
|
54a975f584 | ||
|
|
d40de33316 | ||
|
|
e338214ad5 | ||
|
|
a74c32f742 | ||
|
|
cbae07e8e6 | ||
|
|
6fe4b9440d | ||
|
|
b443cf35c4 | ||
|
|
76344f9785 | ||
|
|
aab6769fa2 | ||
|
|
0b8bf13453 | ||
|
|
738958d90a | ||
|
|
30c0bbe5cc | ||
|
|
184f476bdc | ||
|
|
cdf970fcbf | ||
|
|
1a6ec30bd7 | ||
|
|
edfa8c147f | ||
|
|
b6ed769652 | ||
|
|
bc6d20ff10 | ||
|
|
9ea4838c07 | ||
|
|
0e459a7369 | ||
|
|
c48cc980fc | ||
|
|
2af8595363 | ||
|
|
af0f43c0f8 | ||
|
|
d860764498 | ||
|
|
bf1101b460 | ||
|
|
5c2ecfaa41 | ||
|
|
f29a1cf23a | ||
|
|
42c7cd6f8e | ||
|
|
c0a33ce708 | ||
|
|
130560b104 | ||
|
|
e269260fbe | ||
|
|
9a6dd0dc55 | ||
|
|
9a29aa9232 | ||
|
|
93e4005125 | ||
|
|
beeb8f0522 | ||
|
|
0e5e8e4dde | ||
|
|
fcdebfa4d4 | ||
|
|
9d1c45fd94 | ||
|
|
3993f4c476 | ||
|
|
a1a31cd916 | ||
|
|
65b7d232ab | ||
|
|
6472140920 | ||
|
|
08d863dd3a | ||
|
|
28a6c24db2 | ||
|
|
66877c92d9 | ||
|
|
1c82be2950 | ||
|
|
8432593be1 | ||
|
|
bed86d57f3 | ||
|
|
1afe226ce8 | ||
|
|
1085d59a65 | ||
|
|
e04775c4fa | ||
|
|
4392255d7e | ||
|
|
b69890b8fe | ||
|
|
9496610779 | ||
|
|
7c002e1a99 | ||
|
|
a030dd45d8 | ||
|
|
1be34ab963 | ||
|
|
bcda80bee7 | ||
|
|
ec059dd236 | ||
|
|
71c44fa40c | ||
|
|
1a62ce471e | ||
|
|
17c4eeb646 | ||
|
|
c05bce7a3f | ||
|
|
2383ab57c6 | ||
|
|
b18fe84c5c | ||
|
|
10f11b9725 | ||
|
|
6dabfb463f | ||
|
|
b9d5e5ba0f | ||
|
|
c1ee2c7e5e | ||
|
|
856cc40cf3 | ||
|
|
0cff3dbcda | ||
|
|
60f48e2d00 | ||
|
|
f85d048315 | ||
|
|
762ef4a6db | ||
|
|
48c6242a7b | ||
|
|
6f7d5cc4be | ||
|
|
201ac73cf0 | ||
|
|
df7f19eb8c | ||
|
|
36986a8beb | ||
|
|
ff7c715c5f | ||
|
|
9f319d5c51 | ||
|
|
6f36ebc06c | ||
|
|
82247d764a | ||
|
|
fd25dcacbd | ||
|
|
ee619b2dbd | ||
|
|
0e1e568899 | ||
|
|
5cc05e2c4b | ||
|
|
d4fff41b3a | ||
|
|
d951692aca | ||
|
|
7d9f33b2f0 | ||
|
|
9305c45813 | ||
|
|
2611534de0 | ||
|
|
70c88f2ba2 | ||
|
|
2e5595defd | ||
|
|
3b12ff2cc2 | ||
|
|
54f77c0101 | ||
|
|
0542339623 | ||
|
|
c64a36c94d | ||
|
|
ee0144185f | ||
|
|
4e3b53f1b7 | ||
|
|
bcd1430680 | ||
|
|
3608a2def2 | ||
|
|
14c6be3b1f | ||
|
|
6409011510 | ||
|
|
28a6b9f303 | ||
|
|
36f9fecaed | ||
|
|
5388ad55ab | ||
|
|
5df1d32fba | ||
|
|
98bcadd00c | ||
|
|
5565b9e1c1 | ||
|
|
7f24fc7ccc | ||
|
|
da2cf75480 | ||
|
|
499dcaa115 | ||
|
|
31c3d7d302 | ||
|
|
560758b812 | ||
|
|
9276afd79d | ||
|
|
4605e7c90e | ||
|
|
6fd0a624ca | ||
|
|
bd99e3e09d | ||
|
|
fede297942 | ||
|
|
37736289e2 | ||
|
|
2a546aa609 | ||
|
|
d338451faf | ||
|
|
7f83707449 | ||
|
|
24baee0f8e | ||
|
|
a13d120317 | ||
|
|
32bd78347c | ||
|
|
332621f268 | ||
|
|
02ea4a362c | ||
|
|
56b98080ff | ||
|
|
bf38a7ce40 | ||
|
|
34aa81ca99 | ||
|
|
b98e093157 | ||
|
|
60a978c9a6 | ||
|
|
2c055fea11 | ||
|
|
aa872dfe98 | ||
|
|
713901c2a0 | ||
|
|
8936c95eca | ||
|
|
6178ad5762 | ||
|
|
ea620d76be | ||
|
|
136c028600 | ||
|
|
bb2f1b4eb4 |
3
.github/ISSUE_TEMPLATE/bug.yml
vendored
3
.github/ISSUE_TEMPLATE/bug.yml
vendored
@@ -102,6 +102,9 @@
|
|||||||
the best way. For crashes, please provide a full failure log.
|
the best way. For crashes, please provide a full failure log.
|
||||||
'label': 'Action'
|
'label': 'Action'
|
||||||
'value': |
|
'value': |
|
||||||
|
Replace the following command with the one you're calling or a
|
||||||
|
description of the failing action:
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
nslookup -debug -type=a 'www.example.com' '$YOUR_AGH_ADDRESS'
|
nslookup -debug -type=a 'www.example.com' '$YOUR_AGH_ADDRESS'
|
||||||
```
|
```
|
||||||
|
|||||||
23
.github/workflows/build.yml
vendored
23
.github/workflows/build.yml
vendored
@@ -1,8 +1,8 @@
|
|||||||
'name': 'build'
|
'name': 'build'
|
||||||
|
|
||||||
'env':
|
'env':
|
||||||
'GO_VERSION': '1.20.12'
|
'GO_VERSION': '1.24.1'
|
||||||
'NODE_VERSION': '16'
|
'NODE_VERSION': '18'
|
||||||
|
|
||||||
'on':
|
'on':
|
||||||
'push':
|
'push':
|
||||||
@@ -39,7 +39,7 @@
|
|||||||
'with':
|
'with':
|
||||||
'node-version': '${{ env.NODE_VERSION }}'
|
'node-version': '${{ env.NODE_VERSION }}'
|
||||||
- 'name': 'Set up Go modules cache'
|
- 'name': 'Set up Go modules cache'
|
||||||
'uses': 'actions/cache@v2'
|
'uses': 'actions/cache@v4'
|
||||||
'with':
|
'with':
|
||||||
'path': '~/go/pkg/mod'
|
'path': '~/go/pkg/mod'
|
||||||
'key': "${{ runner.os }}-go-${{ hashFiles('go.sum') }}"
|
'key': "${{ runner.os }}-go-${{ hashFiles('go.sum') }}"
|
||||||
@@ -48,14 +48,14 @@
|
|||||||
'id': 'npm-cache'
|
'id': 'npm-cache'
|
||||||
'run': 'echo "::set-output name=dir::$( npm config get cache )"'
|
'run': 'echo "::set-output name=dir::$( npm config get cache )"'
|
||||||
- 'name': 'Set up npm cache'
|
- 'name': 'Set up npm cache'
|
||||||
'uses': 'actions/cache@v2'
|
'uses': 'actions/cache@v4'
|
||||||
'with':
|
'with':
|
||||||
'path': '${{ steps.npm-cache.outputs.dir }}'
|
'path': '${{ steps.npm-cache.outputs.dir }}'
|
||||||
'key': "${{ runner.os }}-node-${{ hashFiles('client/package-lock.json') }}"
|
'key': "${{ runner.os }}-node-${{ hashFiles('client/package-lock.json') }}"
|
||||||
'restore-keys': '${{ runner.os }}-node-'
|
'restore-keys': '${{ runner.os }}-node-'
|
||||||
- 'name': 'Run make ci'
|
- 'name': 'Run tests'
|
||||||
'shell': 'bash'
|
'shell': 'bash'
|
||||||
'run': 'make VERBOSE=1 ci'
|
'run': 'make VERBOSE=1 deps test go-bench go-fuzz'
|
||||||
- 'name': 'Upload coverage'
|
- 'name': 'Upload coverage'
|
||||||
'uses': 'codecov/codecov-action@v1'
|
'uses': 'codecov/codecov-action@v1'
|
||||||
'if': "success() && matrix.os == 'ubuntu-latest'"
|
'if': "success() && matrix.os == 'ubuntu-latest'"
|
||||||
@@ -80,7 +80,7 @@
|
|||||||
'with':
|
'with':
|
||||||
'node-version': '${{ env.NODE_VERSION }}'
|
'node-version': '${{ env.NODE_VERSION }}'
|
||||||
- 'name': 'Set up Go modules cache'
|
- 'name': 'Set up Go modules cache'
|
||||||
'uses': 'actions/cache@v2'
|
'uses': 'actions/cache@v4'
|
||||||
'with':
|
'with':
|
||||||
'path': '~/go/pkg/mod'
|
'path': '~/go/pkg/mod'
|
||||||
'key': "${{ runner.os }}-go-${{ hashFiles('go.sum') }}"
|
'key': "${{ runner.os }}-go-${{ hashFiles('go.sum') }}"
|
||||||
@@ -89,19 +89,22 @@
|
|||||||
'id': 'npm-cache'
|
'id': 'npm-cache'
|
||||||
'run': 'echo "::set-output name=dir::$(npm config get cache)"'
|
'run': 'echo "::set-output name=dir::$(npm config get cache)"'
|
||||||
- 'name': 'Set up npm cache'
|
- 'name': 'Set up npm cache'
|
||||||
'uses': 'actions/cache@v2'
|
'uses': 'actions/cache@v4'
|
||||||
'with':
|
'with':
|
||||||
'path': '${{ steps.npm-cache.outputs.dir }}'
|
'path': '${{ steps.npm-cache.outputs.dir }}'
|
||||||
'key': "${{ runner.os }}-node-${{ hashFiles('client/package-lock.json') }}"
|
'key': "${{ runner.os }}-node-${{ hashFiles('client/package-lock.json') }}"
|
||||||
'restore-keys': '${{ runner.os }}-node-'
|
'restore-keys': '${{ runner.os }}-node-'
|
||||||
- 'name': 'Set up Snapcraft'
|
- 'name': 'Set up Snapcraft'
|
||||||
'run': 'sudo apt-get -yq --no-install-suggests --no-install-recommends install snapcraft'
|
'run': 'sudo snap install snapcraft --classic'
|
||||||
- 'name': 'Set up QEMU'
|
- 'name': 'Set up QEMU'
|
||||||
'uses': 'docker/setup-qemu-action@v1'
|
'uses': 'docker/setup-qemu-action@v1'
|
||||||
- 'name': 'Set up Docker Buildx'
|
- 'name': 'Set up Docker Buildx'
|
||||||
'uses': 'docker/setup-buildx-action@v1'
|
'uses': 'docker/setup-buildx-action@v1'
|
||||||
- 'name': 'Run snapshot build'
|
- 'name': 'Run snapshot build'
|
||||||
'run': 'make SIGN=0 VERBOSE=1 build-release build-docker'
|
# Set a custom version string, since the checkout@v2 action does not seem
|
||||||
|
# to know about the master branch, while the version script uses it to
|
||||||
|
# count the number of commits within the branch.
|
||||||
|
'run': 'make SIGN=0 VERBOSE=1 VERSION="v0.0.0-github" build-release build-docker'
|
||||||
|
|
||||||
'notify':
|
'notify':
|
||||||
'needs':
|
'needs':
|
||||||
|
|||||||
2
.github/workflows/lint.yml
vendored
2
.github/workflows/lint.yml
vendored
@@ -1,7 +1,7 @@
|
|||||||
'name': 'lint'
|
'name': 'lint'
|
||||||
|
|
||||||
'env':
|
'env':
|
||||||
'GO_VERSION': '1.20.12'
|
'GO_VERSION': '1.24.1'
|
||||||
|
|
||||||
'on':
|
'on':
|
||||||
'push':
|
'push':
|
||||||
|
|||||||
11
.gitignore
vendored
11
.gitignore
vendored
@@ -1,3 +1,8 @@
|
|||||||
|
# This comment is used to simplify checking local copies of the file. Bump
|
||||||
|
# this number every time a significant change is made to this file.
|
||||||
|
#
|
||||||
|
# AdGuard-Project-Version: 1
|
||||||
|
|
||||||
# Please, DO NOT put your text editors' temporary files here. The more are
|
# Please, DO NOT put your text editors' temporary files here. The more are
|
||||||
# added, the harder it gets to maintain and manage projects' gitignores. Put
|
# added, the harder it gets to maintain and manage projects' gitignores. Put
|
||||||
# them into your global gitignore file instead.
|
# them into your global gitignore file instead.
|
||||||
@@ -8,11 +13,16 @@
|
|||||||
# bottom to make sure they take effect.
|
# bottom to make sure they take effect.
|
||||||
*.db
|
*.db
|
||||||
*.log
|
*.log
|
||||||
|
*.out
|
||||||
*.snap
|
*.snap
|
||||||
*.test
|
*.test
|
||||||
/agh-backup/
|
/agh-backup/
|
||||||
/bin/
|
/bin/
|
||||||
/build/*
|
/build/*
|
||||||
|
/client/blob-report/
|
||||||
|
/client/playwright-report/
|
||||||
|
/client/playwright/.cache/
|
||||||
|
/client/test-results/
|
||||||
/data/
|
/data/
|
||||||
/dist/
|
/dist/
|
||||||
/filtering/tests/filtering.TestLotsOfRules*.pprof
|
/filtering/tests/filtering.TestLotsOfRules*.pprof
|
||||||
@@ -21,6 +31,7 @@
|
|||||||
/launchpad_credentials
|
/launchpad_credentials
|
||||||
/querylog.json*
|
/querylog.json*
|
||||||
/snapcraft_login
|
/snapcraft_login
|
||||||
|
/test-reports/
|
||||||
AdGuardHome
|
AdGuardHome
|
||||||
AdGuardHome.exe
|
AdGuardHome.exe
|
||||||
AdGuardHome.yaml*
|
AdGuardHome.yaml*
|
||||||
|
|||||||
25
.markdownlint.json
Normal file
25
.markdownlint.json
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
{
|
||||||
|
"ul-indent": {
|
||||||
|
"indent": 4
|
||||||
|
},
|
||||||
|
"ul-style": {
|
||||||
|
"style": "dash"
|
||||||
|
},
|
||||||
|
"emphasis-style": {
|
||||||
|
"style": "asterisk"
|
||||||
|
},
|
||||||
|
"no-duplicate-heading": {
|
||||||
|
"siblings_only": true
|
||||||
|
},
|
||||||
|
"no-inline-html": {
|
||||||
|
"allowed_elements": [
|
||||||
|
"a"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"no-trailing-spaces": {
|
||||||
|
"br_spaces": 0
|
||||||
|
},
|
||||||
|
"line-length": false,
|
||||||
|
"no-bare-urls": false,
|
||||||
|
"link-fragments": false
|
||||||
|
}
|
||||||
2549
CHANGELOG.md
2549
CHANGELOG.md
File diff suppressed because it is too large
Load Diff
@@ -1,89 +1,57 @@
|
|||||||
# Contributing to AdGuard Home
|
# Contributing to AdGuard Home
|
||||||
|
|
||||||
If you want to contribute to AdGuard Home by filing or commenting on an issue or
|
If you want to contribute to AdGuard Home by filing or commenting on an issue or opening a pull request, please follow the instructions below.
|
||||||
opening a pull request, please follow the instructions below.
|
|
||||||
|
|
||||||
|
## General recommendations
|
||||||
|
|
||||||
|
Please don’t:
|
||||||
|
|
||||||
## General recommendations
|
- post comments like “+1” or “this”. Use the :+1: reaction on the issue instead, as this allows us to actually see the level of support for issues.
|
||||||
|
|
||||||
Please don't:
|
- file issues about localization errors or send localization updates as PRs. We’re using [CrowdIn] to manage our translations and we generally update them before each Beta and Release build. You can learn more about translating AdGuard products [in our Knowledge Base][kb-trans].
|
||||||
|
|
||||||
* post comments like “+1” or “this”. Use the :+1: reaction on the issue
|
- file issues about a particular filtering-rule list misbehaving. These are tracked through the [separate form for filtering issues][form].
|
||||||
instead, as this allows us to actually see the level of support for issues.
|
|
||||||
|
|
||||||
* file issues about localization errors or send localization updates as PRs.
|
- send or request updates to filtering-rule lists, such as the ones for the Blocked Services feature or the list of approved filtering-rule lists. We update them from the [separate repository][hostlist] once before each Beta and Release build.
|
||||||
We're using [CrowdIn] to manage our translations and we generally update
|
|
||||||
them before each Beta and Release build. You can learn more about
|
|
||||||
translating AdGuard products [in our Knowledge Base][kb-trans].
|
|
||||||
|
|
||||||
* file issues about a particular filtering-rule list misbehaving. These are
|
|
||||||
tracked through the [separate form for filtering issues][form].
|
|
||||||
|
|
||||||
* send updates to filtering-rule lists, such as the ones for the Blocked
|
|
||||||
Services feature or the list of approved filtering-rule lists. We update
|
|
||||||
them once before each Beta and Release build.
|
|
||||||
|
|
||||||
Please do:
|
Please do:
|
||||||
|
|
||||||
* follow the template instructions and provide data for reproducing issues.
|
- follow the template instructions and provide data for reproducing issues.
|
||||||
|
|
||||||
* write the title of your issue or pull request in English. Any language is
|
- write the title of your issue or pull request in English. Any language is fine in the body, but it is important to keep the title in English to make it easier for people and bots to look up duplicated issues.
|
||||||
fine in the body, but it is important to keep the title in English to make
|
|
||||||
it easier for people and bots to look up duplicated issues.
|
|
||||||
|
|
||||||
[CrowdIn]: https://crowdin.com/project/adguard-applications/en#/adguard-home
|
[CrowdIn]: https://crowdin.com/project/adguard-applications/en#/adguard-home
|
||||||
[form]: https://link.adtidy.org/forward.html?action=report&app=home&from=github
|
[form]: https://link.adtidy.org/forward.html?action=report&app=home&from=github
|
||||||
|
[hostlist]: https://github.com/AdguardTeam/HostlistsRegistry
|
||||||
[kb-trans]: https://kb.adguard.com/en/general/adguard-translations
|
[kb-trans]: https://kb.adguard.com/en/general/adguard-translations
|
||||||
|
|
||||||
|
## Issues
|
||||||
|
|
||||||
|
### Search first
|
||||||
|
|
||||||
## Issues
|
Please make sure that the issue is not a duplicate or a question. If it’s a duplicate, please react to the original issue with a thumbs up. If it’s a question, please look through our [Wiki] and, if you haven’t found the answer, post it to the GitHub [Discussions] page.
|
||||||
|
|
||||||
### Search first
|
|
||||||
|
|
||||||
Please make sure that the issue is not a duplicate or a question. If it's a
|
|
||||||
duplicate, please react to the original issue with a thumbs up. If it's a
|
|
||||||
question, please look through our [Wiki] and, if you haven't found the answer,
|
|
||||||
post it to the GitHub [Discussions] page.
|
|
||||||
|
|
||||||
[Discussions]: https://github.com/AdguardTeam/AdGuardHome/discussions/categories/q-a
|
[Discussions]: https://github.com/AdguardTeam/AdGuardHome/discussions/categories/q-a
|
||||||
[Wiki]: https://github.com/AdguardTeam/AdGuardHome/wiki
|
[Wiki]: https://github.com/AdguardTeam/AdGuardHome/wiki
|
||||||
|
|
||||||
|
### Follow the issue template
|
||||||
|
|
||||||
|
Developers need to be able to reproduce the faulty behavior in order to fix an issue, so please make sure that you follow the instructions in the issue template carefully.
|
||||||
|
|
||||||
### Follow the issue template
|
## Pull requests
|
||||||
|
|
||||||
Developers need to be able to reproduce the faulty behavior in order to fix an
|
### Discuss your changes first
|
||||||
issue, so please make sure that you follow the instructions in the issue
|
|
||||||
template carefully.
|
|
||||||
|
|
||||||
|
Please discuss your changes by opening an issue. The maintainers should evaluate your proposal, and it’s generally better if that’s done before any code is written.
|
||||||
|
|
||||||
|
### Review your changes for style
|
||||||
|
|
||||||
## Pull requests
|
We have a set of [code guidelines][hacking] that we expect the code to follow. Please make sure you follow it.
|
||||||
|
|
||||||
### Discuss your changes first
|
|
||||||
|
|
||||||
Please discuss your changes by opening an issue. The maintainers should
|
|
||||||
evaluate your proposal, and it's generally better if that's done before any code
|
|
||||||
is written.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
### Review your changes for style
|
|
||||||
|
|
||||||
We have a set of [code guidelines][hacking] that we expect the code to follow.
|
|
||||||
Please make sure you follow it.
|
|
||||||
|
|
||||||
[hacking]: https://github.com/AdguardTeam/CodeGuidelines/blob/master/Go/Go.md
|
[hacking]: https://github.com/AdguardTeam/CodeGuidelines/blob/master/Go/Go.md
|
||||||
|
|
||||||
|
### Test your changes
|
||||||
|
|
||||||
|
Make sure that it passes linters and tests by running the corresponding Make targets. For backend changes, it’s `make go-check`. For frontend, run `make js-lint`.
|
||||||
|
|
||||||
### Test your changes
|
Additionally, a manual test is often required. While we’re constantly working on improving our test suites, they’re still not as good as we’d like them to be.
|
||||||
|
|
||||||
Make sure that it passes linters and tests by running the corresponding Make
|
|
||||||
targets. For backend changes, it's `make go-check`. For frontend, run
|
|
||||||
`make js-lint`.
|
|
||||||
|
|
||||||
Additionally, a manual test is often required. While we're constantly working
|
|
||||||
on improving our test suites, they're still not as good as we'd like them to be.
|
|
||||||
|
|||||||
53
HACKING.md
53
HACKING.md
@@ -1,65 +1,56 @@
|
|||||||
# AdGuard Home Developer Guidelines
|
# AdGuard Home developer guidelines
|
||||||
|
|
||||||
This document was moved to the [AdGuard Code Guidelines repository][repo]. All
|
This document was moved to the [AdGuard Code Guidelines repository][repo]. All sections with IDs now only have links to the corresponding files and sections in that repository.
|
||||||
sections with IDs now only have links to the corresponding files and sections in
|
|
||||||
that repository.
|
|
||||||
|
|
||||||
## <a href="#git" id="git" name="git">Git</a>
|
## <a href="#git" id="git" name="git">Git</a>
|
||||||
|
|
||||||
This section was moved to [its own document][git].
|
This section was moved to [its own document][git].
|
||||||
|
|
||||||
## <a href="#go" id="go" name="go">Go</a>
|
## <a href="#go" id="go" name="go">Go</a>
|
||||||
|
|
||||||
This section was moved to [its own document][go].
|
This section was moved to [its own document][go].
|
||||||
|
|
||||||
### <a href="#code" id="code" name="code">Code</a>
|
### <a href="#code" id="code" name="code">Code</a>
|
||||||
|
|
||||||
This subsection was moved to the [corresponding section][code] of the Go
|
This subsection was moved to the [corresponding section][code] of the Go guidelines document.
|
||||||
guidelines document.
|
|
||||||
|
|
||||||
### <a href="#commenting" id="commenting" name="commenting">Commenting</a>
|
### <a href="#commenting" id="commenting" name="commenting">Commenting</a>
|
||||||
|
|
||||||
This subsection was moved to the [corresponding section][cmnt] of the Go
|
This subsection was moved to the [corresponding section][cmnt] of the Go guidelines document.
|
||||||
guidelines document.
|
|
||||||
|
|
||||||
### <a href="#formatting" id="formatting" name="formatting">Formatting</a>
|
### <a href="#formatting" id="formatting" name="formatting">Formatting</a>
|
||||||
|
|
||||||
This subsection was moved to the [corresponding section][fmt] of the Go
|
This subsection was moved to the [corresponding section][fmt] of the Go guidelines document.
|
||||||
guidelines document.
|
|
||||||
|
|
||||||
### <a href="#naming" id="naming" name="naming">Naming</a>
|
### <a href="#naming" id="naming" name="naming">Naming</a>
|
||||||
|
|
||||||
This subsection was moved to the [corresponding section][name] of the Go
|
This subsection was moved to the [corresponding section][name] of the Go guidelines document.
|
||||||
guidelines document.
|
|
||||||
|
|
||||||
### <a href="#testing" id="testing" name="testing">Testing</a>
|
### <a href="#testing" id="testing" name="testing">Testing</a>
|
||||||
|
|
||||||
This subsection was moved to the [corresponding section][test] of the Go
|
This subsection was moved to the [corresponding section][test] of the Go guidelines document.
|
||||||
guidelines document.
|
|
||||||
|
|
||||||
### <a href="#recommended-reading" id="recommended-reading" name="recommended-reading">Recommended Reading</a>
|
### <a href="#recommended-reading" id="recommended-reading" name="recommended-reading">Recommended Reading</a>
|
||||||
|
|
||||||
This subsection was moved to the [corresponding section][read] of the Go
|
This subsection was moved to the [corresponding section][read] of the Go guidelines document.
|
||||||
guidelines document.
|
|
||||||
|
|
||||||
## <a href="#markdown" id="markdown" name="markdown">Markdown</a>
|
## <a href="#markdown" id="markdown" name="markdown">Markdown</a>
|
||||||
|
|
||||||
This section was moved to [its own document][md].
|
This section was moved to [its own document][md].
|
||||||
|
|
||||||
## <a href="#shell-scripting" id="shell-scripting" name="shell-scripting">Shell Scripting</a>
|
## <a href="#shell-scripting" id="shell-scripting" name="shell-scripting">Shell Scripting</a>
|
||||||
|
|
||||||
This section was moved to [its own document][sh].
|
This section was moved to [its own document][sh].
|
||||||
|
|
||||||
### <a href="#shell-conditionals" id="shell-conditionals" name="shell-conditionals">Shell Conditionals</a>
|
### <a href="#shell-conditionals" id="shell-conditionals" name="shell-conditionals">Shell Conditionals</a>
|
||||||
|
|
||||||
This subsection was moved to the [corresponding section][cond] of the Shell
|
This subsection was moved to the [corresponding section][cond] of the Shell guidelines document.
|
||||||
guidelines document.
|
|
||||||
|
|
||||||
## <a href="#text-including-comments" id="text-including-comments" name="text-including-comments">Text, Including Comments</a>
|
## <a href="#text-including-comments" id="text-including-comments" name="text-including-comments">Text, Including Comments</a>
|
||||||
|
|
||||||
This section was moved to [its own document][txt].
|
This section was moved to [its own document][txt].
|
||||||
|
|
||||||
## <a href="#yaml" id="yaml" name="yaml">YAML</a>
|
## <a href="#yaml" id="yaml" name="yaml">YAML</a>
|
||||||
|
|
||||||
This section was moved to [its own document][yaml].
|
This section was moved to [its own document][yaml].
|
||||||
|
|
||||||
|
|||||||
106
Makefile
106
Makefile
@@ -1,14 +1,14 @@
|
|||||||
# Keep the Makefile POSIX-compliant. We currently allow hyphens in
|
# Keep the Makefile POSIX-compliant. We currently allow hyphens in
|
||||||
# target names, but that may change in the future.
|
# target names, but that may change in the future.
|
||||||
#
|
#
|
||||||
# See https://pubs.opengroup.org/onlinepubs/9699919799/utilities/make.html.
|
# See https://pubs.opengroup.org/onlinepubs/9799919799/utilities/make.html.
|
||||||
.POSIX:
|
.POSIX:
|
||||||
|
|
||||||
# This comment is used to simplify checking local copies of the
|
# This comment is used to simplify checking local copies of the
|
||||||
# Makefile. Bump this number every time a significant change is made to
|
# Makefile. Bump this number every time a significant change is made to
|
||||||
# this Makefile.
|
# this Makefile.
|
||||||
#
|
#
|
||||||
# AdGuard-Project-Version: 2
|
# AdGuard-Project-Version: 9
|
||||||
|
|
||||||
# Don't name these macros "GO" etc., because GNU Make apparently makes
|
# Don't name these macros "GO" etc., because GNU Make apparently makes
|
||||||
# them exported environment variables with the literal value of
|
# them exported environment variables with the literal value of
|
||||||
@@ -22,19 +22,21 @@ VERBOSE.MACRO = $${VERBOSE:-0}
|
|||||||
|
|
||||||
CHANNEL = development
|
CHANNEL = development
|
||||||
CLIENT_DIR = client
|
CLIENT_DIR = client
|
||||||
COMMIT = $$( git rev-parse --short HEAD )
|
DEPLOY_SCRIPT_PATH = not/a/real/path
|
||||||
DIST_DIR = dist
|
DIST_DIR = dist
|
||||||
GOAMD64 = v1
|
GOAMD64 = v1
|
||||||
GOPROXY = https://goproxy.cn|https://proxy.golang.org|direct
|
GOPROXY = https://proxy.golang.org|direct
|
||||||
GOSUMDB = sum.golang.google.cn
|
GOTELEMETRY = off
|
||||||
|
GOTOOLCHAIN = go1.24.1
|
||||||
GPG_KEY = devteam@adguard.com
|
GPG_KEY = devteam@adguard.com
|
||||||
GPG_KEY_PASSPHRASE = not-a-real-password
|
GPG_KEY_PASSPHRASE = not-a-real-password
|
||||||
NPM = npm
|
NPM = npm
|
||||||
NPM_FLAGS = --prefix $(CLIENT_DIR)
|
NPM_FLAGS = --prefix $(CLIENT_DIR)
|
||||||
NPM_INSTALL_FLAGS = $(NPM_FLAGS) --quiet --no-progress --ignore-engines\
|
NPM_INSTALL_FLAGS = $(NPM_FLAGS) --quiet --no-progress
|
||||||
--ignore-optional --ignore-platform --ignore-scripts
|
|
||||||
RACE = 0
|
RACE = 0
|
||||||
|
REVISION = $${REVISION:-$$(git rev-parse --short HEAD)}
|
||||||
SIGN = 1
|
SIGN = 1
|
||||||
|
SIGNER_API_KEY = not-a-real-key
|
||||||
VERSION = v0.0.0
|
VERSION = v0.0.0
|
||||||
YARN = yarn
|
YARN = yarn
|
||||||
|
|
||||||
@@ -56,21 +58,30 @@ BUILD_RELEASE_DEPS_0 = deps js-build
|
|||||||
BUILD_RELEASE_DEPS_1 = go-deps
|
BUILD_RELEASE_DEPS_1 = go-deps
|
||||||
|
|
||||||
ENV = env\
|
ENV = env\
|
||||||
COMMIT='$(COMMIT)'\
|
|
||||||
CHANNEL='$(CHANNEL)'\
|
CHANNEL='$(CHANNEL)'\
|
||||||
GPG_KEY='$(GPG_KEY)'\
|
DEPLOY_SCRIPT_PATH='$(DEPLOY_SCRIPT_PATH)' \
|
||||||
GPG_KEY_PASSPHRASE='$(GPG_KEY_PASSPHRASE)'\
|
|
||||||
DIST_DIR='$(DIST_DIR)'\
|
DIST_DIR='$(DIST_DIR)'\
|
||||||
GO="$(GO.MACRO)"\
|
GO="$(GO.MACRO)"\
|
||||||
GOAMD64="$(GOAMD64)"\
|
GOAMD64='$(GOAMD64)'\
|
||||||
GOPROXY='$(GOPROXY)'\
|
GOPROXY='$(GOPROXY)'\
|
||||||
GOSUMDB='$(GOSUMDB)'\
|
GOTELEMETRY='$(GOTELEMETRY)'\
|
||||||
|
GOTOOLCHAIN='$(GOTOOLCHAIN)'\
|
||||||
|
GPG_KEY='$(GPG_KEY)'\
|
||||||
|
GPG_KEY_PASSPHRASE='$(GPG_KEY_PASSPHRASE)'\
|
||||||
|
NEXTAPI='$(NEXTAPI)'\
|
||||||
PATH="$${PWD}/bin:$$( "$(GO.MACRO)" env GOPATH )/bin:$${PATH}"\
|
PATH="$${PWD}/bin:$$( "$(GO.MACRO)" env GOPATH )/bin:$${PATH}"\
|
||||||
RACE='$(RACE)'\
|
RACE='$(RACE)'\
|
||||||
|
REVISION='$(REVISION)'\
|
||||||
SIGN='$(SIGN)'\
|
SIGN='$(SIGN)'\
|
||||||
NEXTAPI='$(NEXTAPI)'\
|
SIGNER_API_KEY='$(SIGNER_API_KEY)' \
|
||||||
|
VERBOSE="$(VERBOSE.MACRO)"\
|
||||||
|
VERSION="$(VERSION)"\
|
||||||
|
|
||||||
|
# Keep the line above blank.
|
||||||
|
|
||||||
|
ENV_MISC = env\
|
||||||
|
PATH="$${PWD}/bin:$$("$(GO.MACRO)" env GOPATH)/bin:$${PATH}"\
|
||||||
VERBOSE="$(VERBOSE.MACRO)"\
|
VERBOSE="$(VERBOSE.MACRO)"\
|
||||||
VERSION='$(VERSION)'\
|
|
||||||
|
|
||||||
# Keep the line above blank.
|
# Keep the line above blank.
|
||||||
|
|
||||||
@@ -78,9 +89,9 @@ ENV = env\
|
|||||||
# full build.
|
# full build.
|
||||||
build: deps quick-build
|
build: deps quick-build
|
||||||
|
|
||||||
quick-build: js-build go-build
|
init: ; git config core.hooksPath ./scripts/hooks
|
||||||
|
|
||||||
ci: deps test go-bench go-fuzz
|
quick-build: js-build go-build
|
||||||
|
|
||||||
deps: js-deps go-deps
|
deps: js-deps go-deps
|
||||||
lint: js-lint go-lint
|
lint: js-lint go-lint
|
||||||
@@ -93,49 +104,40 @@ build-docker: ; $(ENV) "$(SHELL)" ./scripts/make/build-docker.sh
|
|||||||
build-release: $(BUILD_RELEASE_DEPS_$(FRONTEND_PREBUILT))
|
build-release: $(BUILD_RELEASE_DEPS_$(FRONTEND_PREBUILT))
|
||||||
$(ENV) "$(SHELL)" ./scripts/make/build-release.sh
|
$(ENV) "$(SHELL)" ./scripts/make/build-release.sh
|
||||||
|
|
||||||
clean: ; $(ENV) "$(SHELL)" ./scripts/make/clean.sh
|
js-build: ; $(NPM) $(NPM_FLAGS) run build-prod
|
||||||
init: ; git config core.hooksPath ./scripts/hooks
|
js-deps: ; $(NPM) $(NPM_INSTALL_FLAGS) ci
|
||||||
|
js-typecheck: ; $(NPM) $(NPM_FLAGS) run typecheck
|
||||||
js-build:
|
js-lint: ; $(NPM) $(NPM_FLAGS) run lint
|
||||||
$(NPM) $(NPM_FLAGS) run build-prod
|
js-test: ; $(NPM) $(NPM_FLAGS) run test
|
||||||
js-deps:
|
js-test-e2e: ; $(NPM) $(NPM_FLAGS) run test:e2e
|
||||||
$(NPM) $(NPM_INSTALL_FLAGS) ci
|
|
||||||
|
|
||||||
# TODO(a.garipov): Remove the legacy client tasks support once the new
|
|
||||||
# client is done and the old one is removed.
|
|
||||||
js-lint: ; $(NPM) $(NPM_FLAGS) run lint
|
|
||||||
js-test: ; $(NPM) $(NPM_FLAGS) run test
|
|
||||||
|
|
||||||
go-bench: ; $(ENV) "$(SHELL)" ./scripts/make/go-bench.sh
|
|
||||||
go-build: ; $(ENV) "$(SHELL)" ./scripts/make/go-build.sh
|
|
||||||
go-deps: ; $(ENV) "$(SHELL)" ./scripts/make/go-deps.sh
|
|
||||||
go-fuzz: ; $(ENV) "$(SHELL)" ./scripts/make/go-fuzz.sh
|
|
||||||
go-lint: ; $(ENV) "$(SHELL)" ./scripts/make/go-lint.sh
|
|
||||||
go-tools: ; $(ENV) "$(SHELL)" ./scripts/make/go-tools.sh
|
|
||||||
|
|
||||||
|
go-bench: ; $(ENV) "$(SHELL)" ./scripts/make/go-bench.sh
|
||||||
|
go-build: ; $(ENV) "$(SHELL)" ./scripts/make/go-build.sh
|
||||||
|
go-deps: ; $(ENV) "$(SHELL)" ./scripts/make/go-deps.sh
|
||||||
|
go-env: ; $(ENV) "$(GO.MACRO)" env
|
||||||
|
go-fuzz: ; $(ENV) "$(SHELL)" ./scripts/make/go-fuzz.sh
|
||||||
|
go-lint: ; $(ENV) "$(SHELL)" ./scripts/make/go-lint.sh
|
||||||
# TODO(a.garipov): Think about making RACE='1' the default for all
|
# TODO(a.garipov): Think about making RACE='1' the default for all
|
||||||
# targets.
|
# targets.
|
||||||
go-test: ; $(ENV) RACE='1' "$(SHELL)" ./scripts/make/go-test.sh
|
go-test: ; $(ENV) RACE='1' "$(SHELL)" ./scripts/make/go-test.sh
|
||||||
|
go-tools: ; $(ENV) "$(SHELL)" ./scripts/make/go-tools.sh
|
||||||
|
go-upd-tools: ; $(ENV) "$(SHELL)" ./scripts/make/go-upd-tools.sh
|
||||||
|
|
||||||
go-check: go-tools go-lint go-test
|
go-check: go-tools go-lint go-test
|
||||||
|
|
||||||
# A quick check to make sure that all supported operating systems can be
|
# A quick check to make sure that all operating systems relevant to the
|
||||||
# typechecked and built successfully.
|
# development of the project can be typechecked and built successfully.
|
||||||
go-os-check:
|
go-os-check:
|
||||||
env GOOS='darwin' "$(GO.MACRO)" vet ./internal/...
|
$(ENV) GOOS='darwin' "$(GO.MACRO)" vet ./internal/...
|
||||||
env GOOS='freebsd' "$(GO.MACRO)" vet ./internal/...
|
$(ENV) GOOS='freebsd' "$(GO.MACRO)" vet ./internal/...
|
||||||
env GOOS='openbsd' "$(GO.MACRO)" vet ./internal/...
|
$(ENV) GOOS='openbsd' "$(GO.MACRO)" vet ./internal/...
|
||||||
env GOOS='linux' "$(GO.MACRO)" vet ./internal/...
|
$(ENV) GOOS='linux' "$(GO.MACRO)" vet ./internal/...
|
||||||
env GOOS='windows' "$(GO.MACRO)" vet ./internal/...
|
$(ENV) GOOS='windows' "$(GO.MACRO)" vet ./internal/...
|
||||||
|
|
||||||
openapi-lint: ; cd ./openapi/ && $(YARN) test
|
|
||||||
openapi-show: ; cd ./openapi/ && $(YARN) start
|
|
||||||
|
|
||||||
txt-lint: ; $(ENV) "$(SHELL)" ./scripts/make/txt-lint.sh
|
txt-lint: ; $(ENV) "$(SHELL)" ./scripts/make/txt-lint.sh
|
||||||
|
|
||||||
# TODO(a.garipov): Consider adding to scripts/ and the common project
|
md-lint: ; $(ENV_MISC) "$(SHELL)" ./scripts/make/md-lint.sh
|
||||||
# structure.
|
sh-lint: ; $(ENV_MISC) "$(SHELL)" ./scripts/make/sh-lint.sh
|
||||||
go-upd-tools:
|
|
||||||
cd ./internal/tools/ &&\
|
openapi-lint: ; cd ./openapi/ && $(YARN) test
|
||||||
"$(GO.MACRO)" get -u &&\
|
openapi-show: ; cd ./openapi/ && $(YARN) start
|
||||||
"$(GO.MACRO)" mod tidy
|
|
||||||
|
|||||||
487
README.md
487
README.md
@@ -1,85 +1,75 @@
|
|||||||
|
|
||||||
<p align="center">
|
<p align="center">
|
||||||
<picture>
|
<picture>
|
||||||
<source media="(prefers-color-scheme: dark)" srcset="doc/adguard_home_darkmode.svg">
|
<source media="(prefers-color-scheme: dark)" srcset="doc/adguard_home_darkmode.svg">
|
||||||
<img alt="AdGuard Home" src="doc/adguard_home_lightmode.svg" width="300px">
|
<img alt="AdGuard Home" src="doc/adguard_home_lightmode.svg" width="300px">
|
||||||
</picture>
|
</picture>
|
||||||
</p>
|
</p>
|
||||||
<h3 align="center">Privacy protection center for you and your devices</h3>
|
<h3 align="center">Privacy protection center for you and your devices</h3>
|
||||||
<p align="center">
|
<p align="center">
|
||||||
Free and open source, powerful network-wide ads & trackers blocking DNS
|
Free and open source, powerful network-wide ads & trackers blocking DNS server.
|
||||||
server.
|
|
||||||
</p>
|
</p>
|
||||||
<p align="center">
|
<p align="center">
|
||||||
<a href="https://adguard.com/">AdGuard.com</a> |
|
<a href="https://adguard.com/">AdGuard.com</a> |
|
||||||
<a href="https://github.com/AdguardTeam/AdGuardHome/wiki">Wiki</a> |
|
<a href="https://github.com/AdguardTeam/AdGuardHome/wiki">Wiki</a> |
|
||||||
<a href="https://reddit.com/r/Adguard">Reddit</a> |
|
<a href="https://reddit.com/r/Adguard">Reddit</a> |
|
||||||
<a href="https://twitter.com/AdGuard">Twitter</a> |
|
<a href="https://twitter.com/AdGuard">Twitter</a> |
|
||||||
<a href="https://t.me/adguard_en">Telegram</a>
|
<a href="https://t.me/adguard_en">Telegram</a>
|
||||||
<br/><br/>
|
<br/><br/>
|
||||||
<a href="https://codecov.io/github/AdguardTeam/AdGuardHome?branch=master">
|
<a href="https://codecov.io/github/AdguardTeam/AdGuardHome?branch=master">
|
||||||
<img src="https://img.shields.io/codecov/c/github/AdguardTeam/AdGuardHome/master.svg" alt="Code Coverage"/>
|
<img src="https://img.shields.io/codecov/c/github/AdguardTeam/AdGuardHome/master.svg" alt="Code Coverage"/>
|
||||||
</a>
|
</a>
|
||||||
<a href="https://goreportcard.com/report/AdguardTeam/AdGuardHome">
|
<a href="https://goreportcard.com/report/AdguardTeam/AdGuardHome">
|
||||||
<img src="https://goreportcard.com/badge/github.com/AdguardTeam/AdGuardHome" alt="Go Report Card"/>
|
<img src="https://goreportcard.com/badge/github.com/AdguardTeam/AdGuardHome" alt="Go Report Card"/>
|
||||||
</a>
|
</a>
|
||||||
<a href="https://hub.docker.com/r/adguard/adguardhome">
|
<a href="https://hub.docker.com/r/adguard/adguardhome">
|
||||||
<img alt="Docker Pulls" src="https://img.shields.io/docker/pulls/adguard/adguardhome.svg?maxAge=604800"/>
|
<img alt="Docker Pulls" src="https://img.shields.io/docker/pulls/adguard/adguardhome.svg?maxAge=604800"/>
|
||||||
</a>
|
</a>
|
||||||
<br/>
|
<br/>
|
||||||
<a href="https://github.com/AdguardTeam/AdGuardHome/releases">
|
<a href="https://github.com/AdguardTeam/AdGuardHome/releases">
|
||||||
<img src="https://img.shields.io/github/release/AdguardTeam/AdGuardHome/all.svg" alt="Latest release"/>
|
<img src="https://img.shields.io/github/release/AdguardTeam/AdGuardHome/all.svg" alt="Latest release"/>
|
||||||
</a>
|
</a>
|
||||||
<a href="https://snapcraft.io/adguard-home">
|
<a href="https://snapcraft.io/adguard-home">
|
||||||
<img alt="adguard-home" src="https://snapcraft.io/adguard-home/badge.svg"/>
|
<img alt="adguard-home" src="https://snapcraft.io/adguard-home/badge.svg"/>
|
||||||
</a>
|
</a>
|
||||||
</p>
|
</p>
|
||||||
<br/>
|
<br/>
|
||||||
<p align="center">
|
<p align="center">
|
||||||
<img src="https://cdn.adtidy.org/public/Adguard/Common/adguard_home.gif" width="800"/>
|
<img src="https://cdn.adtidy.org/public/Adguard/Common/adguard_home.gif" width="800"/>
|
||||||
</p>
|
</p>
|
||||||
<hr/>
|
<hr/>
|
||||||
|
|
||||||
AdGuard Home is a network-wide software for blocking ads and tracking. After you
|
AdGuard Home is a network-wide software for blocking ads and tracking. After you set it up, it'll cover ALL your home devices, and you don't need any client-side software for that.
|
||||||
set it up, it'll cover ALL your home devices, and you don't need any client-side
|
|
||||||
software for that.
|
|
||||||
|
|
||||||
It operates as a DNS server that re-routes tracking domains to a “black hole”,
|
It operates as a DNS server that re-routes tracking domains to a “black hole”, thus preventing your devices from connecting to those servers. It's based on software we use for our public [AdGuard DNS] servers, and both share a lot of code.
|
||||||
thus preventing your devices from connecting to those servers. It's based on
|
|
||||||
software we use for our public [AdGuard DNS] servers, and both share a lot of
|
|
||||||
code.
|
|
||||||
|
|
||||||
[AdGuard DNS]: https://adguard-dns.io/
|
[AdGuard DNS]: https://adguard-dns.io/
|
||||||
|
|
||||||
|
- [Getting Started](#getting-started)
|
||||||
|
- [Automated install (Linux/Unix/MacOS/FreeBSD/OpenBSD)](#automated-install-linux-and-mac)
|
||||||
|
- [Alternative methods](#alternative-methods)
|
||||||
|
- [Guides](#guides)
|
||||||
|
- [API](#api)
|
||||||
|
- [Comparing AdGuard Home to other solutions](#comparison)
|
||||||
|
- [How is this different from public AdGuard DNS servers?](#comparison-adguard-dns)
|
||||||
|
- [How does AdGuard Home compare to Pi-Hole](#comparison-pi-hole)
|
||||||
|
- [How does AdGuard Home compare to traditional ad blockers](#comparison-adblock)
|
||||||
|
- [Known limitations](#comparison-limitations)
|
||||||
|
- [How to build from source](#how-to-build)
|
||||||
|
- [Prerequisites](#prerequisites)
|
||||||
|
- [Building](#building)
|
||||||
|
- [Contributing](#contributing)
|
||||||
|
- [Test unstable versions](#test-unstable-versions)
|
||||||
|
- [Reporting issues](#reporting-issues)
|
||||||
|
- [Help with translations](#translate)
|
||||||
|
- [Other](#help-other)
|
||||||
|
- [Projects that use AdGuard Home](#uses)
|
||||||
|
- [Acknowledgments](#acknowledgments)
|
||||||
|
- [Privacy](#privacy)
|
||||||
|
|
||||||
|
## <a href="#getting-started" id="getting-started" name="getting-started">Getting Started</a>
|
||||||
|
|
||||||
* [Getting Started](#getting-started)
|
### <a href="#automated-install-linux-and-mac" id="automated-install-linux-and-mac" name="automated-install-linux-and-mac">Automated install (Linux/Unix/MacOS/FreeBSD/OpenBSD)</a>
|
||||||
* [Automated install (Linux/Unix/MacOS/FreeBSD/OpenBSD)](#automated-install-linux-and-mac)
|
|
||||||
* [Alternative methods](#alternative-methods)
|
|
||||||
* [Guides](#guides)
|
|
||||||
* [API](#api)
|
|
||||||
* [Comparing AdGuard Home to other solutions](#comparison)
|
|
||||||
* [How is this different from public AdGuard DNS servers?](#comparison-adguard-dns)
|
|
||||||
* [How does AdGuard Home compare to Pi-Hole](#comparison-pi-hole)
|
|
||||||
* [How does AdGuard Home compare to traditional ad blockers](#comparison-adblock)
|
|
||||||
* [Known limitations](#comparison-limitations)
|
|
||||||
* [How to build from source](#how-to-build)
|
|
||||||
* [Prerequisites](#prerequisites)
|
|
||||||
* [Building](#building)
|
|
||||||
* [Contributing](#contributing)
|
|
||||||
* [Test unstable versions](#test-unstable-versions)
|
|
||||||
* [Reporting issues](#reporting-issues)
|
|
||||||
* [Help with translations](#translate)
|
|
||||||
* [Other](#help-other)
|
|
||||||
* [Projects that use AdGuard Home](#uses)
|
|
||||||
* [Acknowledgments](#acknowledgments)
|
|
||||||
* [Privacy](#privacy)
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
## <a href="#getting-started" id="getting-started" name="getting-started">Getting Started</a>
|
|
||||||
|
|
||||||
### <a href="#automated-install-linux-and-mac" id="automated-install-linux-and-mac" name="automated-install-linux-and-mac">Automated install (Linux/Unix/MacOS/FreeBSD/OpenBSD)</a>
|
|
||||||
|
|
||||||
To install with `curl` run the following command:
|
To install with `curl` run the following command:
|
||||||
|
|
||||||
@@ -101,95 +91,70 @@ fetch -o - https://raw.githubusercontent.com/AdguardTeam/AdGuardHome/master/scri
|
|||||||
|
|
||||||
The script also accepts some options:
|
The script also accepts some options:
|
||||||
|
|
||||||
* `-c <channel>` to use specified channel;
|
- `-c <channel>` to use specified channel;
|
||||||
* `-r` to reinstall AdGuard Home;
|
- `-r` to reinstall AdGuard Home;
|
||||||
* `-u` to uninstall AdGuard Home;
|
- `-u` to uninstall AdGuard Home;
|
||||||
* `-v` for verbose output.
|
- `-v` for verbose output.
|
||||||
|
|
||||||
Note that options `-r` and `-u` are mutually exclusive.
|
Note that options `-r` and `-u` are mutually exclusive.
|
||||||
|
|
||||||
|
### <a href="#alternative-methods" id="alternative-methods" name="alternative-methods">Alternative methods</a>
|
||||||
|
|
||||||
|
#### <a href="#manual-installation" id="manual-installation" name="manual-installation">Manual installation</a>
|
||||||
|
|
||||||
### <a href="#alternative-methods" id="alternative-methods" name="alternative-methods">Alternative methods</a>
|
Please read the **[Getting Started][wiki-start]** article on our Wiki to learn how to install AdGuard Home manually, and how to configure your devices to use it.
|
||||||
|
|
||||||
#### <a href="#manual-installation" id="manual-installation" name="manual-installation">Manual installation</a>
|
#### <a href="#docker" id="docker" name="docker">Docker</a>
|
||||||
|
|
||||||
Please read the **[Getting Started][wiki-start]** article on our Wiki to learn
|
|
||||||
how to install AdGuard Home manually, and how to configure your devices to use
|
|
||||||
it.
|
|
||||||
|
|
||||||
#### <a href="#docker" id="docker" name="docker">Docker</a>
|
|
||||||
|
|
||||||
You can use our official Docker image on [Docker Hub].
|
You can use our official Docker image on [Docker Hub].
|
||||||
|
|
||||||
#### <a href="#snap-store" id="snap-store" name="snap-store">Snap Store</a>
|
#### <a href="#snap-store" id="snap-store" name="snap-store">Snap Store</a>
|
||||||
|
|
||||||
If you're running **Linux,** there's a secure and easy way to install AdGuard
|
If you're running **Linux,** there's a secure and easy way to install AdGuard Home: get it from the [Snap Store].
|
||||||
Home: get it from the [Snap Store].
|
|
||||||
|
|
||||||
[Docker Hub]: https://hub.docker.com/r/adguard/adguardhome
|
[Docker Hub]: https://hub.docker.com/r/adguard/adguardhome
|
||||||
[Snap Store]: https://snapcraft.io/adguard-home
|
[Snap Store]: https://snapcraft.io/adguard-home
|
||||||
[wiki-start]: https://github.com/AdguardTeam/AdGuardHome/wiki/Getting-Started
|
[wiki-start]: https://adguard-dns.io/kb/adguard-home/getting-started/
|
||||||
|
|
||||||
|
### <a href="#guides" id="guides" name="guides">Guides</a>
|
||||||
|
|
||||||
### <a href="#guides" id="guides" name="guides">Guides</a>
|
|
||||||
|
|
||||||
See our [Wiki][wiki].
|
See our [Wiki][wiki].
|
||||||
|
|
||||||
[wiki]: https://github.com/AdguardTeam/AdGuardHome/wiki
|
[wiki]: https://github.com/AdguardTeam/AdGuardHome/wiki
|
||||||
|
|
||||||
|
### <a href="#api" id="api" name="api">API</a>
|
||||||
|
|
||||||
|
If you want to integrate with AdGuard Home, you can use our [REST API][openapi]. Alternatively, you can use this [python client][pyclient], which is used to build the [AdGuard Home Hass.io Add-on][hassio].
|
||||||
### <a href="#api" id="api" name="api">API</a>
|
|
||||||
|
|
||||||
If you want to integrate with AdGuard Home, you can use our [REST API][openapi].
|
|
||||||
Alternatively, you can use this [python client][pyclient], which is used to
|
|
||||||
build the [AdGuard Home Hass.io Add-on][hassio].
|
|
||||||
|
|
||||||
[hassio]: https://www.home-assistant.io/integrations/adguard/
|
[hassio]: https://www.home-assistant.io/integrations/adguard/
|
||||||
[openapi]: https://github.com/AdguardTeam/AdGuardHome/tree/master/openapi
|
[openapi]: https://github.com/AdguardTeam/AdGuardHome/tree/master/openapi
|
||||||
[pyclient]: https://pypi.org/project/adguardhome/
|
[pyclient]: https://pypi.org/project/adguardhome/
|
||||||
|
|
||||||
|
## <a href="#comparison" id="comparison" name="comparison">Comparing AdGuard Home to other solutions</a>
|
||||||
|
|
||||||
|
### <a href="#comparison-adguard-dns" id="comparison-adguard-dns" name="comparison-adguard-dns">How is this different from public AdGuard DNS servers?</a>
|
||||||
|
|
||||||
## <a href="#comparison" id="comparison" name="comparison">Comparing AdGuard Home to other solutions</a>
|
Running your own AdGuard Home server allows you to do much more than using a public DNS server. It's a completely different level. See for yourself:
|
||||||
|
|
||||||
### <a href="#comparison-adguard-dns" id="comparison-adguard-dns" name="comparison-adguard-dns">How is this different from public AdGuard DNS servers?</a>
|
- Choose what exactly the server blocks and permits.
|
||||||
|
|
||||||
Running your own AdGuard Home server allows you to do much more than using a
|
- Monitor your network activity.
|
||||||
public DNS server. It's a completely different level. See for yourself:
|
|
||||||
|
|
||||||
* Choose what exactly the server blocks and permits.
|
- Add your own custom filtering rules.
|
||||||
|
|
||||||
* Monitor your network activity.
|
- **Most importantly, it's your own server, and you are the only one who's in control.**
|
||||||
|
|
||||||
* Add your own custom filtering rules.
|
### <a href="#comparison-pi-hole" id="comparison-pi-hole" name="comparison-pi-hole">How does AdGuard Home compare to Pi-Hole</a>
|
||||||
|
|
||||||
* **Most importantly, it's your own server, and you are the only one who's in
|
At this point, AdGuard Home has a lot in common with Pi-Hole. Both block ads and trackers using the so-called “DNS sinkholing” method and both allow customizing what's blocked.
|
||||||
control.**
|
|
||||||
|
|
||||||
|
> [!NOTE]
|
||||||
|
> We're not going to stop here. DNS sinkholing is not a bad starting point, but this is just the beginning.
|
||||||
|
|
||||||
|
AdGuard Home provides a lot of features out-of-the-box with no need to install and configure additional software. We want it to be simple to the point when even casual users can set it up with minimal effort.
|
||||||
|
|
||||||
### <a href="#comparison-pi-hole" id="comparison-pi-hole" name="comparison-pi-hole">How does AdGuard Home compare to Pi-Hole</a>
|
> [!NOTE]
|
||||||
|
> Some of the listed features can be added to Pi-Hole by installing additional software or by manually using SSH terminal and reconfiguring one of the utilities Pi-Hole consists of. However, in our opinion, this cannot be legitimately counted as a Pi-Hole's feature.
|
||||||
At this point, AdGuard Home has a lot in common with Pi-Hole. Both block ads
|
|
||||||
and trackers using the so-called “DNS sinkholing” method and both allow
|
|
||||||
customizing what's blocked.
|
|
||||||
|
|
||||||
<aside>
|
|
||||||
We're not going to stop here. DNS sinkholing is not a bad starting point, but
|
|
||||||
this is just the beginning.
|
|
||||||
</aside>
|
|
||||||
|
|
||||||
AdGuard Home provides a lot of features out-of-the-box with no need to install
|
|
||||||
and configure additional software. We want it to be simple to the point when
|
|
||||||
even casual users can set it up with minimal effort.
|
|
||||||
|
|
||||||
**Disclaimer:** some of the listed features can be added to Pi-Hole by
|
|
||||||
installing additional software or by manually using SSH terminal and
|
|
||||||
reconfiguring one of the utilities Pi-Hole consists of. However, in our
|
|
||||||
opinion, this cannot be legitimately counted as a Pi-Hole's feature.
|
|
||||||
|
|
||||||
| Feature | AdGuard Home | Pi-Hole |
|
| Feature | AdGuard Home | Pi-Hole |
|
||||||
|-------------------------------------------------------------------------|-------------------|-----------------------------------------------------------|
|
|-------------------------------------------------------------------------|-------------------|-----------------------------------------------------------|
|
||||||
@@ -207,68 +172,44 @@ opinion, this cannot be legitimately counted as a Pi-Hole's feature.
|
|||||||
| Access settings (choose who can use AGH DNS) | ✅ | ❌ |
|
| Access settings (choose who can use AGH DNS) | ✅ | ❌ |
|
||||||
| Running [without root privileges][wiki-noroot] | ✅ | ❌ |
|
| Running [without root privileges][wiki-noroot] | ✅ | ❌ |
|
||||||
|
|
||||||
[wiki-noroot]: https://github.com/AdguardTeam/AdGuardHome/wiki/Getting-Started#running-without-superuser
|
[wiki-noroot]: https://adguard-dns.io/kb/adguard-home/getting-started/#running-without-superuser
|
||||||
|
|
||||||
|
### <a href="#comparison-adblock" id="comparison-adblock" name="comparison-adblock">How does AdGuard Home compare to traditional ad blockers</a>
|
||||||
|
|
||||||
### <a href="#comparison-adblock" id="comparison-adblock" name="comparison-adblock">How does AdGuard Home compare to traditional ad blockers</a>
|
|
||||||
|
|
||||||
It depends.
|
It depends.
|
||||||
|
|
||||||
DNS sinkholing is capable of blocking a big percentage of ads, but it lacks
|
DNS sinkholing is capable of blocking a big percentage of ads, but it lacks the flexibility and the power of traditional ad blockers. You can get a good impression about the difference between these methods by reading [this article][blog-adaway], which compares AdGuard for Android (a traditional ad blocker) to hosts-level ad blockers (which are almost identical to DNS-based blockers in their capabilities). This level of protection is enough for some users.
|
||||||
the flexibility and the power of traditional ad blockers. You can get a good
|
|
||||||
impression about the difference between these methods by reading [this
|
|
||||||
article][blog-adaway], which compares AdGuard for Android (a traditional ad
|
|
||||||
blocker) to hosts-level ad blockers (which are almost identical to DNS-based
|
|
||||||
blockers in their capabilities). This level of protection is enough for some
|
|
||||||
users.
|
|
||||||
|
|
||||||
Additionally, using a DNS-based blocker can help to block ads, tracking and
|
Additionally, using a DNS-based blocker can help to block ads, tracking and analytics requests on other types of devices, such as SmartTVs, smart speakers or other kinds of IoT devices (on which you can't install traditional ad blockers).
|
||||||
analytics requests on other types of devices, such as SmartTVs, smart speakers
|
|
||||||
or other kinds of IoT devices (on which you can't install traditional ad
|
|
||||||
blockers).
|
|
||||||
|
|
||||||
|
### <a href="#comparison-limitations" id="comparison-limitations" name="comparison-limitations">Known limitations</a>
|
||||||
|
|
||||||
### <a href="#comparison-limitations" id="comparison-limitations" name="comparison-limitations">Known limitations</a>
|
|
||||||
|
|
||||||
Here are some examples of what cannot be blocked by a DNS-level blocker:
|
Here are some examples of what cannot be blocked by a DNS-level blocker:
|
||||||
|
|
||||||
* YouTube, Twitch ads;
|
- YouTube, Twitch ads;
|
||||||
|
|
||||||
* Facebook, Twitter, Instagram sponsored posts.
|
- Facebook, Twitter, Instagram sponsored posts.
|
||||||
|
|
||||||
Essentially, any advertising that shares a domain with content cannot be blocked
|
Essentially, any advertising that shares a domain with content cannot be blocked by a DNS-level blocker.
|
||||||
by a DNS-level blocker.
|
|
||||||
|
|
||||||
Is there a chance to handle this in the future? DNS will never be enough to do
|
Is there a chance to handle this in the future? DNS will never be enough to do this. Our only option is to use a content blocking proxy like what we do in the standalone AdGuard applications. We're [going to bring][issue-1228] this feature support to AdGuard Home in the future. Unfortunately, even in this case, there still will be cases when this won't be enough or would require quite a complicated configuration.
|
||||||
this. Our only option is to use a content blocking proxy like what we do in the
|
|
||||||
standalone AdGuard applications. We're [going to bring][issue-1228] this
|
|
||||||
feature support to AdGuard Home in the future. Unfortunately, even in this
|
|
||||||
case, there still will be cases when this won't be enough or would require quite
|
|
||||||
a complicated configuration.
|
|
||||||
|
|
||||||
[blog-adaway]: https://adguard.com/blog/adguard-vs-adaway-dns66.html
|
[blog-adaway]: https://adguard.com/blog/adguard-vs-adaway-dns66.html
|
||||||
[issue-1228]: https://github.com/AdguardTeam/AdGuardHome/issues/1228
|
[issue-1228]: https://github.com/AdguardTeam/AdGuardHome/issues/1228
|
||||||
|
|
||||||
|
## <a href="#how-to-build" id="how-to-build" name="how-to-build">How to build from source</a>
|
||||||
|
|
||||||
|
### <a href="#prerequisites" id="prerequisites" name="prerequisites">Prerequisites</a>
|
||||||
## <a href="#how-to-build" id="how-to-build" name="how-to-build">How to build from source</a>
|
|
||||||
|
|
||||||
### <a href="#prerequisites" id="prerequisites" name="prerequisites">Prerequisites</a>
|
|
||||||
|
|
||||||
Run `make init` to prepare the development environment.
|
Run `make init` to prepare the development environment.
|
||||||
|
|
||||||
You will need this to build AdGuard Home:
|
You will need this to build AdGuard Home:
|
||||||
|
|
||||||
* [Go](https://golang.org/dl/) v1.20 or later;
|
- [Go](https://golang.org/dl/) v1.23 or later;
|
||||||
* [Node.js](https://nodejs.org/en/download/) v16 or later;
|
- [Node.js](https://nodejs.org/en/download/) v18.18 or later;
|
||||||
* [npm](https://www.npmjs.com/) v8 or later;
|
- [npm](https://www.npmjs.com/) v8 or later;
|
||||||
* [yarn](https://yarnpkg.com/) v1.22.5 or later.
|
|
||||||
|
|
||||||
|
### <a href="#building" id="building" name="building">Building</a>
|
||||||
|
|
||||||
### <a href="#building" id="building" name="building">Building</a>
|
|
||||||
|
|
||||||
Open your terminal and execute these commands:
|
Open your terminal and execute these commands:
|
||||||
|
|
||||||
@@ -278,27 +219,14 @@ cd AdGuardHome
|
|||||||
make
|
make
|
||||||
```
|
```
|
||||||
|
|
||||||
#### <a href="#building-node" id="building-node" name="building-node">Building with Node.js 17 and later</a>
|
> [!WARNING]
|
||||||
|
> The non-standard `-j` flag is currently not supported, so building with `make -j 4` or setting your `MAKEFLAGS` to include, for example, `-j 4` is likely to break the build. If you do have your `MAKEFLAGS` set to that, and you don't want to change it, you can override it by running `make -j 1`.
|
||||||
In order to build AdGuard Home with Node.js 17 and later, specify
|
|
||||||
`--openssl-legacy-provider` option.
|
|
||||||
|
|
||||||
```sh
|
|
||||||
export NODE_OPTIONS=--openssl-legacy-provider
|
|
||||||
```
|
|
||||||
|
|
||||||
**NOTE:** The non-standard `-j` flag is currently not supported, so building
|
|
||||||
with `make -j 4` or setting your `MAKEFLAGS` to include, for example, `-j 4` is
|
|
||||||
likely to break the build. If you do have your `MAKEFLAGS` set to that, and you
|
|
||||||
don't want to change it, you can override it by running `make -j 1`.
|
|
||||||
|
|
||||||
Check the [`Makefile`][src-makefile] to learn about other commands.
|
Check the [`Makefile`][src-makefile] to learn about other commands.
|
||||||
|
|
||||||
#### <a href="#building-cross" id="building-cross" name="building-cross">Building for a different platform</a>
|
#### <a href="#building-cross" id="building-cross" name="building-cross">Building for a different platform</a>
|
||||||
|
|
||||||
You can build AdGuard Home for any OS/ARCH that Go supports. In order to do
|
You can build AdGuard Home for any OS/ARCH that Go supports. In order to do this, specify `GOOS` and `GOARCH` environment variables as macros when running `make`.
|
||||||
this, specify `GOOS` and `GOARCH` environment variables as macros when running
|
|
||||||
`make`.
|
|
||||||
|
|
||||||
For example:
|
For example:
|
||||||
|
|
||||||
@@ -312,10 +240,9 @@ or:
|
|||||||
make GOOS='linux' GOARCH='arm64'
|
make GOOS='linux' GOARCH='arm64'
|
||||||
```
|
```
|
||||||
|
|
||||||
#### <a href="#preparing-releases" id="preparing-releases" name="preparing-releases">Preparing releases</a>
|
#### <a href="#preparing-releases" id="preparing-releases" name="preparing-releases">Preparing releases</a>
|
||||||
|
|
||||||
You'll need [`snapcraft`] to prepare a release build. Once installed, run the
|
You'll need [`snapcraft`] to prepare a release build. Once installed, run the following command:
|
||||||
following command:
|
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
make build-release CHANNEL='...' VERSION='...'
|
make build-release CHANNEL='...' VERSION='...'
|
||||||
@@ -323,47 +250,39 @@ make build-release CHANNEL='...' VERSION='...'
|
|||||||
|
|
||||||
See the [`build-release` target documentation][targ-release].
|
See the [`build-release` target documentation][targ-release].
|
||||||
|
|
||||||
#### <a href="#docker-image" id="docker-image" name="docker-image">Docker image</a>
|
#### <a href="#docker-image" id="docker-image" name="docker-image">Docker image</a>
|
||||||
|
|
||||||
Run `make build-docker` to build the Docker image locally (the one that we
|
Run `make build-docker` to build the Docker image locally (the one that we publish to DockerHub). Please note, that we're using [Docker Buildx][buildx] to build our official image.
|
||||||
publish to DockerHub). Please note, that we're using [Docker Buildx][buildx] to
|
|
||||||
build our official image.
|
|
||||||
|
|
||||||
You may need to prepare before using these builds:
|
You may need to prepare before using these builds:
|
||||||
|
|
||||||
* (Linux-only) Install Qemu:
|
- (Linux-only) Install Qemu:
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
docker run --rm --privileged multiarch/qemu-user-static --reset -p yes --credential yes
|
docker run --rm --privileged multiarch/qemu-user-static --reset -p yes --credential yes
|
||||||
```
|
```
|
||||||
|
|
||||||
* Prepare the builder:
|
- Prepare the builder:
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
docker buildx create --name buildx-builder --driver docker-container --use
|
docker buildx create --name buildx-builder --driver docker-container --use
|
||||||
```
|
```
|
||||||
|
|
||||||
See the [`build-docker` target documentation][targ-docker].
|
See the [`build-docker` target documentation][targ-docker].
|
||||||
|
|
||||||
#### <a href="#debugging-the-frontend" id="debugging-the-frontend" name="debugging-the-frontend">Debugging the frontend</a>
|
#### <a href="#debugging-the-frontend" id="debugging-the-frontend" name="debugging-the-frontend">Debugging the frontend</a>
|
||||||
|
|
||||||
When you need to debug the frontend without recompiling the production version
|
When you need to debug the frontend without recompiling the production version every time, for example to check how your labels would look on a form, you can run the frontend build a development environment.
|
||||||
every time, for example to check how your labels would look on a form, you can
|
|
||||||
run the frontend build a development environment.
|
|
||||||
|
|
||||||
1. In a separate terminal, run:
|
1. In a separate terminal, run:
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
( cd ./client/ && env NODE_ENV='development' npm run watch )
|
( cd ./client/ && env NODE_ENV='development' npm run watch )
|
||||||
```
|
```
|
||||||
|
|
||||||
2. Run your `AdGuardHome` binary with the `--local-frontend` flag, which
|
2. Run your `AdGuardHome` binary with the `--local-frontend` flag, which instructs AdGuard Home to ignore the built-in frontend files and use those from the `./build/` directory.
|
||||||
instructs AdGuard Home to ignore the built-in frontend files and use those
|
|
||||||
from the `./build/` directory.
|
|
||||||
|
|
||||||
3. Now any changes you make in the `./client/` directory should be recompiled
|
3. Now any changes you make in the `./client/` directory should be recompiled and become available on the web UI. Make sure that you disable the browser cache to make sure that you actually get the recompiled version.
|
||||||
and become available on the web UI. Make sure that you disable the browser
|
|
||||||
cache to make sure that you actually get the recompiled version.
|
|
||||||
|
|
||||||
[`snapcraft`]: https://snapcraft.io/
|
[`snapcraft`]: https://snapcraft.io/
|
||||||
[buildx]: https://docs.docker.com/buildx/working-with-buildx/
|
[buildx]: https://docs.docker.com/buildx/working-with-buildx/
|
||||||
@@ -371,166 +290,136 @@ run the frontend build a development environment.
|
|||||||
[targ-docker]: https://github.com/AdguardTeam/AdGuardHome/tree/master/scripts#build-dockersh-build-a-multi-architecture-docker-image
|
[targ-docker]: https://github.com/AdguardTeam/AdGuardHome/tree/master/scripts#build-dockersh-build-a-multi-architecture-docker-image
|
||||||
[targ-release]: https://github.com/AdguardTeam/AdGuardHome/tree/master/scripts#build-releasesh-build-a-release-for-all-platforms
|
[targ-release]: https://github.com/AdguardTeam/AdGuardHome/tree/master/scripts#build-releasesh-build-a-release-for-all-platforms
|
||||||
|
|
||||||
|
#### <a href="#e2e-frontend-tests" id="e2e-frontend-tests" name="e2e-frontend-tests">End-to-End (E2E) Frontend Tests</a>
|
||||||
|
|
||||||
|
AdGuard Home uses [Playwright](https://playwright.dev) for E2E testing. Tests are located in `tests/e2e`.
|
||||||
|
|
||||||
|
**Running Tests:**
|
||||||
|
- `npm run test:e2e` – run all tests (headless).
|
||||||
|
- `npm run test:e2e:interactive` – run tests interactively.
|
||||||
|
- `npm run test:e2e:debug` – run tests in debug mode.
|
||||||
|
- `npm run test:e2e:codegen` – generate new test code.
|
||||||
|
|
||||||
|
**Setup:**
|
||||||
|
1. Run `npm install` to install dependencies.
|
||||||
|
2. Run `npx playwright install` to set up required browsers.
|
||||||
|
|
||||||
|
> **Warning:** Playwright will download and install its own browser binaries for testing, which may differ from the browsers installed on your system.
|
||||||
|
|
||||||
## <a href="#contributing" id="contributing" name="contributing">Contributing</a>
|
## <a href="#contributing" id="contributing" name="contributing">Contributing</a>
|
||||||
|
|
||||||
You are welcome to fork this repository, make your changes and [submit a pull
|
You are welcome to fork this repository, make your changes and [submit a pull request][pr]. Please make sure you follow our [code guidelines][guide] though.
|
||||||
request][pr]. Please make sure you follow our [code guidelines][guide] though.
|
|
||||||
|
|
||||||
Please note that we don't expect people to contribute to both UI and backend
|
Please note that we don't expect people to contribute to both UI and backend parts of the program simultaneously. Ideally, the backend part is implemented first, i.e. configuration, API, and the functionality itself. The UI part can be implemented later in a different pull request by a different person.
|
||||||
parts of the program simultaneously. Ideally, the backend part is implemented
|
|
||||||
first, i.e. configuration, API, and the functionality itself. The UI part can
|
|
||||||
be implemented later in a different pull request by a different person.
|
|
||||||
|
|
||||||
[guide]: https://github.com/AdguardTeam/CodeGuidelines/
|
[guide]: https://github.com/AdguardTeam/CodeGuidelines/
|
||||||
[pr]: https://github.com/AdguardTeam/AdGuardHome/pulls
|
[pr]: https://github.com/AdguardTeam/AdGuardHome/pulls
|
||||||
|
|
||||||
|
### <a href="#test-unstable-versions" id="test-unstable-versions" name="test-unstable-versions">Test unstable versions</a>
|
||||||
|
|
||||||
### <a href="#test-unstable-versions" id="test-unstable-versions" name="test-unstable-versions">Test unstable versions</a>
|
|
||||||
|
|
||||||
There are two update channels that you can use:
|
There are two update channels that you can use:
|
||||||
|
|
||||||
* `beta`: beta versions of AdGuard Home. More or less stable versions,
|
- `beta`: beta versions of AdGuard Home. More or less stable versions, usually released every two weeks or more often.
|
||||||
usually released every two weeks or more often.
|
|
||||||
|
|
||||||
* `edge`: the newest version of AdGuard Home from the development branch. New
|
- `edge`: the newest version of AdGuard Home from the development branch. New updates are pushed to this channel daily.
|
||||||
updates are pushed to this channel daily.
|
|
||||||
|
|
||||||
There are three options how you can install an unstable version:
|
There are three options how you can install an unstable version:
|
||||||
|
|
||||||
1. [Snap Store]: look for the `beta` and `edge` channels.
|
1. [Snap Store]: look for the `beta` and `edge` channels.
|
||||||
|
|
||||||
2. [Docker Hub]: look for the `beta` and `edge` tags.
|
2. [Docker Hub]: look for the `beta` and `edge` tags.
|
||||||
|
|
||||||
3. Standalone builds. Use the automated installation script or look for the
|
3. Standalone builds. Use the automated installation script or look for the available builds [on the Wiki][wiki-platf].
|
||||||
available builds [on the Wiki][wiki-platf].
|
|
||||||
|
|
||||||
Script to install a beta version:
|
Script to install a beta version:
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
curl -s -S -L https://raw.githubusercontent.com/AdguardTeam/AdGuardHome/master/scripts/install.sh | sh -s -- -c beta
|
curl -s -S -L https://raw.githubusercontent.com/AdguardTeam/AdGuardHome/master/scripts/install.sh | sh -s -- -c beta
|
||||||
```
|
```
|
||||||
|
|
||||||
Script to install an edge version:
|
Script to install an edge version:
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
curl -s -S -L https://raw.githubusercontent.com/AdguardTeam/AdGuardHome/master/scripts/install.sh | sh -s -- -c edge
|
curl -s -S -L https://raw.githubusercontent.com/AdguardTeam/AdGuardHome/master/scripts/install.sh | sh -s -- -c edge
|
||||||
```
|
```
|
||||||
|
|
||||||
[wiki-platf]: https://github.com/AdguardTeam/AdGuardHome/wiki/Platforms
|
[wiki-platf]: https://github.com/AdguardTeam/AdGuardHome/wiki/Platforms
|
||||||
|
|
||||||
|
### <a href="#reporting-issues" id="reporting-issues" name="reporting-issues">Report issues</a>
|
||||||
|
|
||||||
|
If you run into any problem or have a suggestion, head to [this page][iss] and click on the “New issue” button. Please follow the instructions in the issue form carefully and don't forget to start by searching for duplicates.
|
||||||
### <a href="#reporting-issues" id="reporting-issues" name="reporting-issues">Report issues</a>
|
|
||||||
|
|
||||||
If you run into any problem or have a suggestion, head to [this page][iss] and
|
|
||||||
click on the “New issue” button. Please follow the instructions in the issue
|
|
||||||
form carefully and don't forget to start by searching for duplicates.
|
|
||||||
|
|
||||||
[iss]: https://github.com/AdguardTeam/AdGuardHome/issues
|
[iss]: https://github.com/AdguardTeam/AdGuardHome/issues
|
||||||
|
|
||||||
|
### <a href="#translate" id="translate" name="translate">Help with translations</a>
|
||||||
|
|
||||||
|
If you want to help with AdGuard Home translations, please learn more about translating AdGuard products [in our Knowledge Base][kb-trans]. You can contribute to the [AdGuardHome project on CrowdIn][crowdin].
|
||||||
### <a href="#translate" id="translate" name="translate">Help with translations</a>
|
|
||||||
|
|
||||||
If you want to help with AdGuard Home translations, please learn more about
|
|
||||||
translating AdGuard products [in our Knowledge Base][kb-trans]. You can
|
|
||||||
contribute to the [AdGuardHome project on CrowdIn][crowdin].
|
|
||||||
|
|
||||||
[crowdin]: https://crowdin.com/project/adguard-applications/en#/adguard-home
|
[crowdin]: https://crowdin.com/project/adguard-applications/en#/adguard-home
|
||||||
[kb-trans]: https://kb.adguard.com/en/general/adguard-translations
|
[kb-trans]: https://kb.adguard.com/en/general/adguard-translations
|
||||||
|
|
||||||
|
### <a href="#help-other" id="help-other" name="help-other">Other</a>
|
||||||
|
|
||||||
|
Another way you can contribute is by [looking for issues][iss-help] marked as `help wanted`, asking if the issue is up for grabs, and sending a PR fixing the bug or implementing the feature.
|
||||||
### <a href="#help-other" id="help-other" name="help-other">Other</a>
|
|
||||||
|
|
||||||
Another way you can contribute is by [looking for issues][iss-help] marked as
|
|
||||||
`help wanted`, asking if the issue is up for grabs, and sending a PR fixing the
|
|
||||||
bug or implementing the feature.
|
|
||||||
|
|
||||||
[iss-help]: https://github.com/AdguardTeam/AdGuardHome/issues?q=is%3Aissue+is%3Aopen+label%3A%22help+wanted%22
|
[iss-help]: https://github.com/AdguardTeam/AdGuardHome/issues?q=is%3Aissue+is%3Aopen+label%3A%22help+wanted%22
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
## <a href="#uses" id="uses" name="uses">Projects that use AdGuard Home</a>
|
## <a href="#uses" id="uses" name="uses">Projects that use AdGuard Home</a>
|
||||||
|
|
||||||
<!--
|
Please note that these projects are not affiliated with AdGuard, but are made by third-party developers and fans.
|
||||||
TODO(a.garipov): Use reference links.
|
|
||||||
-->
|
|
||||||
|
|
||||||
* [AdGuard Home Remote](https://apps.apple.com/app/apple-store/id1543143740):
|
- [AdGuard Home Remote](https://apps.apple.com/app/apple-store/id1543143740): iOS app by [Joost](https://rocketscience-it.nl/).
|
||||||
iOS app by [Joost](https://rocketscience-it.nl/).
|
|
||||||
|
|
||||||
* [Python library](https://github.com/frenck/python-adguardhome) by
|
- [Python library](https://github.com/frenck/python-adguardhome) by [@frenck](https://github.com/frenck).
|
||||||
[@frenck](https://github.com/frenck).
|
|
||||||
|
|
||||||
* [Home Assistant add-on](https://github.com/hassio-addons/addon-adguard-home)
|
- [Home Assistant add-on](https://github.com/hassio-addons/addon-adguard-home) by [@frenck](https://github.com/frenck).
|
||||||
by [@frenck](https://github.com/frenck).
|
|
||||||
|
|
||||||
* [OpenWrt LUCI app](https://github.com/kongfl888/luci-app-adguardhome) by
|
- [OpenWrt LUCI app](https://github.com/kongfl888/luci-app-adguardhome) by [@kongfl888](https://github.com/kongfl888) (originally by [@rufengsuixing](https://github.com/rufengsuixing)).
|
||||||
[@kongfl888](https://github.com/kongfl888) (originally by
|
|
||||||
[@rufengsuixing](https://github.com/rufengsuixing)).
|
|
||||||
|
|
||||||
* [Terminal-based, real-time traffic monitoring and statistics for your AdGuard Home
|
- [AdGuardHome sync](https://github.com/bakito/adguardhome-sync) by [@bakito](https://github.com/bakito).
|
||||||
instance](https://github.com/Lissy93/AdGuardian-Term) by
|
|
||||||
[@Lissy93](https://github.com/Lissy93)
|
|
||||||
|
|
||||||
* [AdGuard Home on GLInet
|
- [Terminal-based, real-time traffic monitoring and statistics for your AdGuard Home instance](https://github.com/Lissy93/AdGuardian-Term) by [@Lissy93](https://github.com/Lissy93)
|
||||||
routers](https://forum.gl-inet.com/t/adguardhome-on-gl-routers/10664) by
|
|
||||||
[Gl-Inet](https://gl-inet.com/).
|
|
||||||
|
|
||||||
* [Cloudron app](https://git.cloudron.io/cloudron/adguard-home-app) by
|
- [AdGuard Home on GLInet routers](https://forum.gl-inet.com/t/adguardhome-on-gl-routers/10664) by [Gl-Inet](https://gl-inet.com/).
|
||||||
[@gramakri](https://github.com/gramakri).
|
|
||||||
|
|
||||||
* [Asuswrt-Merlin-AdGuardHome-Installer](https://github.com/jumpsmm7/Asuswrt-Merlin-AdGuardHome-Installer)
|
- [Cloudron app](https://git.cloudron.io/cloudron/adguard-home-app) by [@gramakri](https://github.com/gramakri).
|
||||||
by [@jumpsmm7](https://github.com/jumpsmm7) aka
|
|
||||||
[@SomeWhereOverTheRainBow](https://www.snbforums.com/members/somewhereovertherainbow.64179/).
|
|
||||||
|
|
||||||
* [Node.js library](https://github.com/Andrea055/AdguardHomeAPI) by
|
- [Asuswrt-Merlin-AdGuardHome-Installer](https://github.com/jumpsmm7/Asuswrt-Merlin-AdGuardHome-Installer) by [@jumpsmm7](https://github.com/jumpsmm7) aka [@SomeWhereOverTheRainBow](https://www.snbforums.com/members/somewhereovertherainbow.64179/).
|
||||||
[@Andrea055](https://github.com/Andrea055/).
|
|
||||||
|
|
||||||
|
- [Node.js library](https://github.com/Andrea055/AdguardHomeAPI) by [@Andrea055](https://github.com/Andrea055/).
|
||||||
|
|
||||||
|
- [Browser Extension](https://github.com/satheshshiva/Adguard-Home-Browser-Ext) by [@satheshshiva](https://github.com/satheshshiva/).
|
||||||
|
|
||||||
|
- [Zabbix Template for AdGuard Home](https://github.com/diasdmhub/AdGuard_Home_Zabbix_Template) by [@diasdmhub](https://github.com/diasdmhub).
|
||||||
|
|
||||||
|
- [Chocolatey package](https://community.chocolatey.org/packages/adguardhome/) by [niks255](https://community.chocolatey.org/profiles/niks255).
|
||||||
|
|
||||||
## <a href="#acknowledgments" id="acknowledgments" name="acknowledgments">Acknowledgments</a>
|
## <a href="#acknowledgments" id="acknowledgments" name="acknowledgments">Acknowledgments</a>
|
||||||
|
|
||||||
<!--
|
|
||||||
TODO(a.garipov): Use reference links.
|
|
||||||
-->
|
|
||||||
|
|
||||||
This software wouldn't have been possible without:
|
This software wouldn't have been possible without:
|
||||||
|
|
||||||
* [Go](https://golang.org/dl/) and its libraries:
|
- [Go](https://golang.org/dl/) and its libraries:
|
||||||
* [gcache](https://github.com/bluele/gcache)
|
- [gcache](https://github.com/bluele/gcache)
|
||||||
* [miekg's dns](https://github.com/miekg/dns)
|
- [miekg's dns](https://github.com/miekg/dns)
|
||||||
* [go-yaml](https://github.com/go-yaml/yaml)
|
- [go-yaml](https://github.com/go-yaml/yaml)
|
||||||
* [service](https://godoc.org/github.com/kardianos/service)
|
- [service](https://godoc.org/github.com/kardianos/service)
|
||||||
* [dnsproxy](https://github.com/AdguardTeam/dnsproxy)
|
- [dnsproxy](https://github.com/AdguardTeam/dnsproxy)
|
||||||
* [urlfilter](https://github.com/AdguardTeam/urlfilter)
|
- [urlfilter](https://github.com/AdguardTeam/urlfilter)
|
||||||
* [Node.js](https://nodejs.org/) and its libraries:
|
- [Node.js](https://nodejs.org/) and its libraries:
|
||||||
* And many more Node.js packages.
|
- [React.js](https://reactjs.org)
|
||||||
* [React.js](https://reactjs.org)
|
- [Tabler](https://github.com/tabler/tabler)
|
||||||
* [Tabler](https://github.com/tabler/tabler)
|
- And many more Node.js packages.
|
||||||
* [whotracks.me data](https://github.com/cliqz-oss/whotracks.me)
|
- [whotracks.me data](https://github.com/cliqz-oss/whotracks.me)
|
||||||
|
|
||||||
You might have seen that [CoreDNS] was mentioned here before, but we've stopped
|
You might have seen that [CoreDNS] was mentioned here before, but we've stopped using it in AdGuard Home.
|
||||||
using it in AdGuard Home.
|
|
||||||
|
|
||||||
For the full list of all Node.js packages in use, please take a look at
|
For the full list of all Node.js packages in use, please take a look at [`client/package.json`][src-packagejson] file.
|
||||||
[`client/package.json`][src-packagejson] file.
|
|
||||||
|
|
||||||
[CoreDNS]: https://coredns.io
|
[CoreDNS]: https://coredns.io
|
||||||
[src-packagejson]: https://github.com/AdguardTeam/AdGuardHome/blob/master/client/package.json
|
[src-packagejson]: https://github.com/AdguardTeam/AdGuardHome/blob/master/client/package.json
|
||||||
|
|
||||||
|
## <a href="#privacy" id="privacy" name="privacy">Privacy</a>
|
||||||
|
|
||||||
|
Our main idea is that you are the one, who should be in control of your data. So it is only natural, that AdGuard Home does not collect any usage statistics, and does not use any web services unless you configure it to do so. See also the [full privacy policy][privacy] with every bit that *could in theory be sent* by AdGuard Home is available.
|
||||||
## <a href="#privacy" id="privacy" name="privacy">Privacy</a>
|
|
||||||
|
|
||||||
Our main idea is that you are the one, who should be in control of your data.
|
|
||||||
So it is only natural, that AdGuard Home does not collect any usage statistics,
|
|
||||||
and does not use any web services unless you configure it to do so. See also
|
|
||||||
the [full privacy policy][privacy] with every bit that *could in theory be sent*
|
|
||||||
by AdGuard Home is available.
|
|
||||||
|
|
||||||
[privacy]: https://adguard.com/en/privacy/home.html
|
[privacy]: https://adguard.com/en/privacy/home.html
|
||||||
|
|||||||
19
SECURITY.md
19
SECURITY.md
@@ -1,18 +1,13 @@
|
|||||||
# Security Policy
|
# Security Policy
|
||||||
|
|
||||||
## Reporting a Vulnerability
|
## Reporting vulnerabilities
|
||||||
|
|
||||||
Please send your vulnerability reports to <security@adguard.com>. To make sure
|
Please send your vulnerability reports to <security@adguard.com>. To make sure that your report reaches us, please:
|
||||||
that your report reaches us, please:
|
|
||||||
|
|
||||||
1. Include the words “AdGuard Home” and “vulnerability” to the subject line as
|
1. Include the words “AdGuard Home” and “vulnerability” to the subject line as well as a short description of the vulnerability. For example:
|
||||||
well as a short description of the vulnerability. For example:
|
|
||||||
|
|
||||||
> AdGuard Home API vulnerability: possible XSS attack
|
> AdGuard Home API vulnerability: possible XSS attack
|
||||||
|
|
||||||
2. Make sure that the message body contains a clear description of the
|
1. Make sure that the message body contains a clear description of the vulnerability.
|
||||||
vulnerability.
|
|
||||||
|
|
||||||
If you have not received a reply to your email within 7 days, please make sure
|
If you have not received a reply to your email within 7 days, please make sure to follow up with us again at <security@adguard.com>. Once again, make sure that the word “vulnerability” is in the subject line.
|
||||||
to follow up with us again at <security@adguard.com>. Once again, make sure
|
|
||||||
that the word “vulnerability” is in the subject line.
|
|
||||||
|
|||||||
@@ -7,7 +7,8 @@
|
|||||||
# Make sure to sync any changes with the branch overrides below.
|
# Make sure to sync any changes with the branch overrides below.
|
||||||
'variables':
|
'variables':
|
||||||
'channel': 'edge'
|
'channel': 'edge'
|
||||||
'dockerGo': 'adguard/golang-ubuntu:7.6'
|
'dockerFrontend': 'adguard/home-js-builder:2.1-bullseye'
|
||||||
|
'dockerGo': 'adguard/go-builder:1.24.1--1'
|
||||||
|
|
||||||
'stages':
|
'stages':
|
||||||
- 'Build frontend':
|
- 'Build frontend':
|
||||||
@@ -41,8 +42,13 @@
|
|||||||
- 'Publish to GitHub Releases'
|
- 'Publish to GitHub Releases'
|
||||||
|
|
||||||
'Build frontend':
|
'Build frontend':
|
||||||
|
'artifacts':
|
||||||
|
- 'name': 'AdGuardHome frontend'
|
||||||
|
'pattern': 'build/**'
|
||||||
|
'shared': true
|
||||||
|
'required': true
|
||||||
'docker':
|
'docker':
|
||||||
'image': '${bamboo.dockerGo}'
|
'image': '${bamboo.dockerFrontend}'
|
||||||
'volumes':
|
'volumes':
|
||||||
'${system.YARN_DIR}': '${bamboo.cacheYarn}'
|
'${system.YARN_DIR}': '${bamboo.cacheYarn}'
|
||||||
'key': 'BF'
|
'key': 'BF'
|
||||||
@@ -59,19 +65,21 @@
|
|||||||
|
|
||||||
set -e -f -u -x
|
set -e -f -u -x
|
||||||
|
|
||||||
# Explicitly checkout the revision that we need.
|
make\
|
||||||
git checkout "${bamboo.repository.revision.number}"
|
VERBOSE=1\
|
||||||
|
js-deps js-build
|
||||||
make js-deps js-build
|
|
||||||
'artifacts':
|
|
||||||
- 'name': 'AdGuardHome frontend'
|
|
||||||
'pattern': 'build/**'
|
|
||||||
'shared': true
|
|
||||||
'required': true
|
|
||||||
'requirements':
|
'requirements':
|
||||||
- 'adg-docker': 'true'
|
- 'adg-docker': 'true'
|
||||||
|
|
||||||
'Make release':
|
'Make release':
|
||||||
|
'artifact-subscriptions':
|
||||||
|
- 'artifact': 'AdGuardHome frontend'
|
||||||
|
# TODO(a.garipov): Use more fine-grained artifact rules.
|
||||||
|
'artifacts':
|
||||||
|
- 'name': 'AdGuardHome dists'
|
||||||
|
'pattern': 'dist/**'
|
||||||
|
'shared': true
|
||||||
|
'required': true
|
||||||
'docker':
|
'docker':
|
||||||
'image': '${bamboo.dockerGo}'
|
'image': '${bamboo.dockerGo}'
|
||||||
'volumes':
|
'volumes':
|
||||||
@@ -83,6 +91,11 @@
|
|||||||
'tasks':
|
'tasks':
|
||||||
- 'checkout':
|
- 'checkout':
|
||||||
'force-clean-build': true
|
'force-clean-build': true
|
||||||
|
- 'checkout':
|
||||||
|
'repository': 'bamboo-deploy-publisher'
|
||||||
|
# The paths are always relative to the working directory.
|
||||||
|
'path': 'bamboo-deploy-publisher'
|
||||||
|
'force-clean-build': true
|
||||||
- 'script':
|
- 'script':
|
||||||
'interpreter': 'SHELL'
|
'interpreter': 'SHELL'
|
||||||
'scripts':
|
'scripts':
|
||||||
@@ -102,16 +115,12 @@
|
|||||||
make\
|
make\
|
||||||
CHANNEL=${bamboo.channel}\
|
CHANNEL=${bamboo.channel}\
|
||||||
GPG_KEY_PASSPHRASE=${bamboo.gpgPassword}\
|
GPG_KEY_PASSPHRASE=${bamboo.gpgPassword}\
|
||||||
|
DEPLOY_SCRIPT_PATH="./bamboo-deploy-publisher/deploy.sh"\
|
||||||
|
SIGNER_API_KEY="${bamboo.adguardHomeWinSignerSecretApiKey}"\
|
||||||
FRONTEND_PREBUILT=1\
|
FRONTEND_PREBUILT=1\
|
||||||
PARALLELISM=1\
|
PARALLELISM=1\
|
||||||
VERBOSE=2\
|
VERBOSE=2\
|
||||||
build-release
|
build-release
|
||||||
# TODO(a.garipov): Use more fine-grained artifact rules.
|
|
||||||
'artifacts':
|
|
||||||
- 'name': 'AdGuardHome dists'
|
|
||||||
'pattern': 'dist/**'
|
|
||||||
'shared': true
|
|
||||||
'required': true
|
|
||||||
'requirements':
|
'requirements':
|
||||||
- 'adg-docker': 'true'
|
- 'adg-docker': 'true'
|
||||||
|
|
||||||
@@ -130,23 +139,18 @@
|
|||||||
|
|
||||||
set -e -f -u -x
|
set -e -f -u -x
|
||||||
|
|
||||||
COMMIT="${bamboo.repository.revision.number}"
|
|
||||||
export COMMIT
|
|
||||||
readonly COMMIT
|
|
||||||
|
|
||||||
# Explicitly checkout the revision that we need.
|
|
||||||
git checkout "$COMMIT"
|
|
||||||
|
|
||||||
# Install Qemu, create builder.
|
# Install Qemu, create builder.
|
||||||
docker version -f '{{ .Server.Experimental }}'
|
docker version -f '{{ .Server.Experimental }}'
|
||||||
docker buildx rm buildx-builder || :
|
docker buildx rm buildx-builder || :
|
||||||
docker buildx create --name buildx-builder --driver docker-container\
|
docker buildx create \
|
||||||
--use
|
--name buildx-builder \
|
||||||
|
--driver docker-container \
|
||||||
|
--use
|
||||||
docker buildx inspect --bootstrap
|
docker buildx inspect --bootstrap
|
||||||
|
|
||||||
# Login to DockerHub.
|
# Login to DockerHub.
|
||||||
docker login -u="${bamboo.dockerHubUsername}"\
|
docker login -u="${bamboo.dockerHubUsername}" \
|
||||||
-p="${bamboo.dockerHubPassword}"
|
-p="${bamboo.dockerHubPassword}"
|
||||||
|
|
||||||
# Boot the builder.
|
# Boot the builder.
|
||||||
docker buildx inspect --bootstrap
|
docker buildx inspect --bootstrap
|
||||||
@@ -155,13 +159,14 @@
|
|||||||
docker info
|
docker info
|
||||||
|
|
||||||
# Prepare and push the build.
|
# Prepare and push the build.
|
||||||
env\
|
env \
|
||||||
CHANNEL="${bamboo.channel}"\
|
CHANNEL="${bamboo.channel}" \
|
||||||
DIST_DIR='dist'\
|
REVISION="${bamboo.repository.revision.number}" \
|
||||||
DOCKER_IMAGE_NAME='adguard/adguardhome'\
|
DIST_DIR='dist' \
|
||||||
DOCKER_OUTPUT="type=image,name=adguard/adguardhome,push=true"\
|
DOCKER_IMAGE_NAME='adguard/adguardhome' \
|
||||||
VERBOSE='1'\
|
DOCKER_OUTPUT="type=image,name=adguard/adguardhome,push=true" \
|
||||||
sh ./scripts/make/build-docker.sh
|
VERBOSE='1' \
|
||||||
|
sh ./scripts/make/build-docker.sh
|
||||||
'environment':
|
'environment':
|
||||||
DOCKER_CLI_EXPERIMENTAL=enabled
|
DOCKER_CLI_EXPERIMENTAL=enabled
|
||||||
'final-tasks':
|
'final-tasks':
|
||||||
@@ -256,7 +261,7 @@
|
|||||||
'recipients':
|
'recipients':
|
||||||
- 'webhook':
|
- 'webhook':
|
||||||
'name': 'Build webhook'
|
'name': 'Build webhook'
|
||||||
'url': 'http://prod.jirahub.service.eu.consul/v1/webhook/bamboo?channel=adguard-qa'
|
'url': 'http://prod.jirahub.service.eu.consul/v1/webhook/bamboo?channel=adguard-qa-dns-builds'
|
||||||
|
|
||||||
'labels': []
|
'labels': []
|
||||||
'other':
|
'other':
|
||||||
@@ -272,7 +277,8 @@
|
|||||||
# need to build a few of these.
|
# need to build a few of these.
|
||||||
'variables':
|
'variables':
|
||||||
'channel': 'beta'
|
'channel': 'beta'
|
||||||
'dockerGo': 'adguard/golang-ubuntu:7.6'
|
'dockerFrontend': 'adguard/home-js-builder:2.1-bullseye'
|
||||||
|
'dockerGo': 'adguard/go-builder:1.24.1--1'
|
||||||
# release-vX.Y.Z branches are the branches from which the actual final
|
# release-vX.Y.Z branches are the branches from which the actual final
|
||||||
# release is built.
|
# release is built.
|
||||||
- '^release-v[0-9]+\.[0-9]+\.[0-9]+':
|
- '^release-v[0-9]+\.[0-9]+\.[0-9]+':
|
||||||
@@ -287,4 +293,5 @@
|
|||||||
# are the ones that actually get released.
|
# are the ones that actually get released.
|
||||||
'variables':
|
'variables':
|
||||||
'channel': 'release'
|
'channel': 'release'
|
||||||
'dockerGo': 'adguard/golang-ubuntu:7.6'
|
'dockerFrontend': 'adguard/home-js-builder:2.1-bullseye'
|
||||||
|
'dockerGo': 'adguard/go-builder:1.24.1--1'
|
||||||
|
|||||||
@@ -10,7 +10,7 @@
|
|||||||
# Make sure to sync any changes with the branch overrides below.
|
# Make sure to sync any changes with the branch overrides below.
|
||||||
'variables':
|
'variables':
|
||||||
'channel': 'edge'
|
'channel': 'edge'
|
||||||
'dockerGo': 'adguard/golang-ubuntu:7.6'
|
'dockerSnap': 'adguard/snap-builder:1.1'
|
||||||
'snapcraftChannel': 'edge'
|
'snapcraftChannel': 'edge'
|
||||||
|
|
||||||
'stages':
|
'stages':
|
||||||
@@ -53,7 +53,7 @@
|
|||||||
'shared': true
|
'shared': true
|
||||||
'required': true
|
'required': true
|
||||||
'docker':
|
'docker':
|
||||||
'image': '${bamboo.dockerGo}'
|
'image': '${bamboo.dockerSnap}'
|
||||||
'key': 'DR'
|
'key': 'DR'
|
||||||
'other':
|
'other':
|
||||||
'clean-working-dir': true
|
'clean-working-dir': true
|
||||||
@@ -99,7 +99,7 @@
|
|||||||
'shared': true
|
'shared': true
|
||||||
'required': true
|
'required': true
|
||||||
'docker':
|
'docker':
|
||||||
'image': '${bamboo.dockerGo}'
|
'image': '${bamboo.dockerSnap}'
|
||||||
'key': 'BP'
|
'key': 'BP'
|
||||||
'other':
|
'other':
|
||||||
'clean-working-dir': true
|
'clean-working-dir': true
|
||||||
@@ -127,7 +127,7 @@
|
|||||||
- 'artifact': 'armhf_snap'
|
- 'artifact': 'armhf_snap'
|
||||||
- 'artifact': 'arm64_snap'
|
- 'artifact': 'arm64_snap'
|
||||||
'docker':
|
'docker':
|
||||||
'image': '${bamboo.dockerGo}'
|
'image': '${bamboo.dockerSnap}'
|
||||||
'key': 'PTS'
|
'key': 'PTS'
|
||||||
'other':
|
'other':
|
||||||
'clean-working-dir': true
|
'clean-working-dir': true
|
||||||
@@ -175,7 +175,7 @@
|
|||||||
'recipients':
|
'recipients':
|
||||||
- 'webhook':
|
- 'webhook':
|
||||||
'name': 'Build webhook'
|
'name': 'Build webhook'
|
||||||
'url': 'http://prod.jirahub.service.eu.consul/v1/webhook/bamboo?channel=adguard-qa'
|
'url': 'http://prod.jirahub.service.eu.consul/v1/webhook/bamboo?channel=adguard-qa-dns-builds'
|
||||||
|
|
||||||
'labels': []
|
'labels': []
|
||||||
'other':
|
'other':
|
||||||
@@ -191,7 +191,7 @@
|
|||||||
# need to build a few of these.
|
# need to build a few of these.
|
||||||
'variables':
|
'variables':
|
||||||
'channel': 'beta'
|
'channel': 'beta'
|
||||||
'dockerGo': 'adguard/golang-ubuntu:7.6'
|
'dockerSnap': 'adguard/snap-builder:1.1'
|
||||||
'snapcraftChannel': 'beta'
|
'snapcraftChannel': 'beta'
|
||||||
# release-vX.Y.Z branches are the branches from which the actual final
|
# release-vX.Y.Z branches are the branches from which the actual final
|
||||||
# release is built.
|
# release is built.
|
||||||
@@ -207,5 +207,5 @@
|
|||||||
# are the ones that actually get released.
|
# are the ones that actually get released.
|
||||||
'variables':
|
'variables':
|
||||||
'channel': 'release'
|
'channel': 'release'
|
||||||
'dockerGo': 'adguard/golang-ubuntu:7.6'
|
'dockerSnap': 'adguard/snap-builder:1.1'
|
||||||
'snapcraftChannel': 'candidate'
|
'snapcraftChannel': 'candidate'
|
||||||
|
|||||||
@@ -5,14 +5,23 @@
|
|||||||
'key': 'AHBRTSPECS'
|
'key': 'AHBRTSPECS'
|
||||||
'name': 'AdGuard Home - Build and run tests'
|
'name': 'AdGuard Home - Build and run tests'
|
||||||
'variables':
|
'variables':
|
||||||
'dockerGo': 'adguard/golang-ubuntu:7.6'
|
'dockerFrontend': 'adguard/home-js-builder:2.1-bullseye'
|
||||||
|
'dockerGo': 'adguard/go-builder:1.24.1--1'
|
||||||
|
'channel': 'development'
|
||||||
|
|
||||||
'stages':
|
'stages':
|
||||||
- 'Tests':
|
- 'Tests':
|
||||||
'manual': false
|
'manual': false
|
||||||
'final': false
|
'final': false
|
||||||
'jobs':
|
'jobs':
|
||||||
- 'Test'
|
- 'Test frontend'
|
||||||
|
- 'Test backend'
|
||||||
|
|
||||||
|
- 'Frontend':
|
||||||
|
manual: false
|
||||||
|
final: false
|
||||||
|
jobs:
|
||||||
|
- 'Build frontend'
|
||||||
|
|
||||||
- 'Artifact':
|
- 'Artifact':
|
||||||
manual: false
|
manual: false
|
||||||
@@ -20,14 +29,18 @@
|
|||||||
jobs:
|
jobs:
|
||||||
- 'Artifact'
|
- 'Artifact'
|
||||||
|
|
||||||
'Test':
|
- 'E2E':
|
||||||
|
manual: false
|
||||||
|
final: false
|
||||||
|
jobs:
|
||||||
|
- 'Test e2e'
|
||||||
|
|
||||||
|
'Test frontend':
|
||||||
'docker':
|
'docker':
|
||||||
'image': '${bamboo.dockerGo}'
|
'image': '${bamboo.dockerFrontend}'
|
||||||
'volumes':
|
'volumes':
|
||||||
'${system.YARN_DIR}': '${bamboo.cacheYarn}'
|
'${system.YARN_DIR}': '${bamboo.cacheYarn}'
|
||||||
'${system.GO_CACHE_DIR}': '${bamboo.cacheGo}'
|
'key': 'JSTEST'
|
||||||
'${system.GO_PKG_CACHE_DIR}': '${bamboo.cacheGoPkg}'
|
|
||||||
'key': 'TEST'
|
|
||||||
'other':
|
'other':
|
||||||
'clean-working-dir': true
|
'clean-working-dir': true
|
||||||
'tasks':
|
'tasks':
|
||||||
@@ -41,13 +54,92 @@
|
|||||||
|
|
||||||
set -e -f -u -x
|
set -e -f -u -x
|
||||||
|
|
||||||
make VERBOSE=1 ci go-tools lint
|
make VERBOSE=1 js-deps js-typecheck js-lint js-test
|
||||||
'final-tasks':
|
'final-tasks':
|
||||||
- 'clean'
|
- 'clean'
|
||||||
'requirements':
|
'requirements':
|
||||||
- 'adg-docker': 'true'
|
- 'adg-docker': 'true'
|
||||||
|
|
||||||
|
# TODO(e.burkov): Add the linting stage for markdown docs and shell scripts.
|
||||||
|
'Test backend':
|
||||||
|
'docker':
|
||||||
|
'image': '${bamboo.dockerGo}'
|
||||||
|
'volumes':
|
||||||
|
'${system.GO_CACHE_DIR}': '${bamboo.cacheGo}'
|
||||||
|
'${system.GO_PKG_CACHE_DIR}': '${bamboo.cacheGoPkg}'
|
||||||
|
'key': 'GOTEST'
|
||||||
|
'other':
|
||||||
|
'clean-working-dir': true
|
||||||
|
'tasks':
|
||||||
|
- 'checkout':
|
||||||
|
'force-clean-build': true
|
||||||
|
- 'script':
|
||||||
|
'interpreter': 'SHELL'
|
||||||
|
'scripts':
|
||||||
|
- |
|
||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
set -e -f -u -x
|
||||||
|
|
||||||
|
make\
|
||||||
|
GOMAXPROCS=1\
|
||||||
|
VERBOSE=1\
|
||||||
|
go-deps go-tools go-lint
|
||||||
|
|
||||||
|
make\
|
||||||
|
VERBOSE=1\
|
||||||
|
go-test
|
||||||
|
'final-tasks':
|
||||||
|
- 'clean'
|
||||||
|
'requirements':
|
||||||
|
- 'adg-docker': 'true'
|
||||||
|
|
||||||
|
'Build frontend':
|
||||||
|
'artifacts':
|
||||||
|
- 'name': 'AdGuardHome frontend'
|
||||||
|
'pattern': 'build/**'
|
||||||
|
'shared': true
|
||||||
|
'required': true
|
||||||
|
'docker':
|
||||||
|
'image': '${bamboo.dockerFrontend}'
|
||||||
|
'volumes':
|
||||||
|
'${system.YARN_DIR}': '${bamboo.cacheYarn}'
|
||||||
|
'key': 'BF'
|
||||||
|
'other':
|
||||||
|
'clean-working-dir': true
|
||||||
|
'tasks':
|
||||||
|
- 'checkout':
|
||||||
|
'force-clean-build': true
|
||||||
|
- 'script':
|
||||||
|
'interpreter': 'SHELL'
|
||||||
|
'scripts':
|
||||||
|
- |-
|
||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
set -e -f -u -x
|
||||||
|
|
||||||
|
make\
|
||||||
|
VERBOSE=1\
|
||||||
|
js-deps js-build
|
||||||
|
'requirements':
|
||||||
|
- 'adg-docker': 'true'
|
||||||
|
|
||||||
'Artifact':
|
'Artifact':
|
||||||
|
'artifact-subscriptions':
|
||||||
|
- 'artifact': 'AdGuardHome frontend'
|
||||||
|
'artifacts':
|
||||||
|
- 'name': 'AdGuardHome_windows_amd64'
|
||||||
|
'pattern': 'dist/AdGuardHome_windows_amd64.zip'
|
||||||
|
'shared': true
|
||||||
|
'required': true
|
||||||
|
- 'name': 'AdGuardHome_darwin_amd64'
|
||||||
|
'pattern': 'dist/AdGuardHome_darwin_amd64.zip'
|
||||||
|
'shared': true
|
||||||
|
'required': true
|
||||||
|
- 'name': 'AdGuardHome_linux_amd64'
|
||||||
|
'pattern': 'dist/AdGuardHome_linux_amd64.tar.gz'
|
||||||
|
'shared': true
|
||||||
|
'required': true
|
||||||
'docker':
|
'docker':
|
||||||
'image': '${bamboo.dockerGo}'
|
'image': '${bamboo.dockerGo}'
|
||||||
'volumes':
|
'volumes':
|
||||||
@@ -67,30 +159,47 @@
|
|||||||
|
|
||||||
set -e -f -u -x
|
set -e -f -u -x
|
||||||
|
|
||||||
# Explicitly checkout the revision that we need.
|
|
||||||
git checkout "${bamboo.repository.revision.number}"
|
|
||||||
|
|
||||||
make\
|
make\
|
||||||
ARCH="amd64"\
|
ARCH="amd64"\
|
||||||
|
CHANNEL=${bamboo.channel}\
|
||||||
|
FRONTEND_PREBUILT=1\
|
||||||
OS="windows darwin linux"\
|
OS="windows darwin linux"\
|
||||||
CHANNEL="development"\
|
|
||||||
SIGN=0\
|
|
||||||
PARALLELISM=1\
|
PARALLELISM=1\
|
||||||
|
SIGN=0\
|
||||||
VERBOSE=2\
|
VERBOSE=2\
|
||||||
build-release
|
build-release
|
||||||
'artifacts':
|
'requirements':
|
||||||
- 'name': 'AdGuardHome_windows_amd64'
|
- 'adg-docker': 'true'
|
||||||
'pattern': 'dist/AdGuardHome_windows_amd64.zip'
|
|
||||||
'shared': true
|
'Test e2e':
|
||||||
'required': true
|
'artifact-subscriptions':
|
||||||
- 'name': 'AdGuardHome_darwin_amd64'
|
- 'artifact': 'AdGuardHome_linux_amd64'
|
||||||
'pattern': 'dist/AdGuardHome_darwin_amd64.zip'
|
- 'artifact': 'AdGuardHome frontend'
|
||||||
'shared': true
|
'docker':
|
||||||
'required': true
|
'image': '${bamboo.dockerFrontend}'
|
||||||
- 'name': 'AdGuardHome_linux_amd64'
|
'volumes':
|
||||||
'pattern': 'dist/AdGuardHome_linux_amd64.tar.gz'
|
'${system.YARN_DIR}': '${bamboo.cacheYarn}'
|
||||||
'shared': true
|
'key': 'E2ETEST'
|
||||||
'required': true
|
'other':
|
||||||
|
'clean-working-dir': true
|
||||||
|
'tasks':
|
||||||
|
- 'checkout':
|
||||||
|
'force-clean-build': true
|
||||||
|
- 'script':
|
||||||
|
'interpreter': 'SHELL'
|
||||||
|
'scripts':
|
||||||
|
- |
|
||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
set -e -f -u -x
|
||||||
|
|
||||||
|
export CI=true
|
||||||
|
|
||||||
|
tar -xzf dist/AdGuardHome_linux_amd64.tar.gz -C /tmp
|
||||||
|
|
||||||
|
mv /tmp/AdGuardHome/AdGuardHome ./AdGuardHome
|
||||||
|
|
||||||
|
make VERBOSE=1 js-deps js-test-e2e
|
||||||
'requirements':
|
'requirements':
|
||||||
- 'adg-docker': 'true'
|
- 'adg-docker': 'true'
|
||||||
|
|
||||||
@@ -115,3 +224,15 @@
|
|||||||
'labels': []
|
'labels': []
|
||||||
'other':
|
'other':
|
||||||
'concurrent-build-plugin': 'system-default'
|
'concurrent-build-plugin': 'system-default'
|
||||||
|
|
||||||
|
'branch-overrides':
|
||||||
|
# rc-vX.Y.Z branches are the release candidate branches. They are created
|
||||||
|
# from the release branch and are used to build the release candidate
|
||||||
|
# images.
|
||||||
|
- '^rc-v[0-9]+\.[0-9]+\.[0-9]+':
|
||||||
|
# Set the default release channel on the release branch to beta, as we
|
||||||
|
# may need to build a few of these.
|
||||||
|
'variables':
|
||||||
|
'dockerFrontend': 'adguard/home-js-builder:2.1-bullseye'
|
||||||
|
'dockerGo': 'adguard/go-builder:1.24.1--1'
|
||||||
|
'channel': 'candidate'
|
||||||
|
|||||||
72
client/.eslintrc.json
vendored
72
client/.eslintrc.json
vendored
@@ -1,9 +1,15 @@
|
|||||||
{
|
{
|
||||||
"parser": "babel-eslint",
|
"plugins": [
|
||||||
"extends": [
|
"prettier"
|
||||||
"plugin:react/recommended",
|
|
||||||
"airbnb-base"
|
|
||||||
],
|
],
|
||||||
|
"extends": [
|
||||||
|
"airbnb-base",
|
||||||
|
"prettier",
|
||||||
|
"eslint:recommended",
|
||||||
|
"plugin:react/recommended",
|
||||||
|
"plugin:@typescript-eslint/recommended"
|
||||||
|
],
|
||||||
|
"parser": "@typescript-eslint/parser",
|
||||||
"env": {
|
"env": {
|
||||||
"jest": true,
|
"jest": true,
|
||||||
"node": true,
|
"node": true,
|
||||||
@@ -16,50 +22,32 @@
|
|||||||
"version": "16.4"
|
"version": "16.4"
|
||||||
},
|
},
|
||||||
"import/resolver": {
|
"import/resolver": {
|
||||||
"webpack": {
|
"node": {
|
||||||
"config": "webpack.common.js"
|
"extensions": [
|
||||||
|
".js",
|
||||||
|
".jsx",
|
||||||
|
".ts",
|
||||||
|
".tsx"
|
||||||
|
]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"rules": {
|
"rules": {
|
||||||
"indent": [
|
"@typescript-eslint/no-explicit-any": "off",
|
||||||
|
"@typescript-eslint/no-unused-vars": [
|
||||||
"error",
|
"error",
|
||||||
4,
|
|
||||||
{
|
{
|
||||||
"SwitchCase": 1,
|
"argsIgnorePattern": "^_"
|
||||||
"VariableDeclarator": 1,
|
}
|
||||||
"outerIIFEBody": 1,
|
],
|
||||||
"FunctionDeclaration": {
|
"import/extensions": [
|
||||||
"parameters": 1,
|
"error",
|
||||||
"body": 1
|
"ignorePackages",
|
||||||
},
|
{
|
||||||
"FunctionExpression": {
|
"js": "never",
|
||||||
"parameters": 1,
|
"jsx": "never",
|
||||||
"body": 1
|
"ts": "never",
|
||||||
},
|
"tsx": "never"
|
||||||
"CallExpression": {
|
|
||||||
"arguments": 1
|
|
||||||
},
|
|
||||||
"ArrayExpression": 1,
|
|
||||||
"ObjectExpression": 1,
|
|
||||||
"ImportDeclaration": 1,
|
|
||||||
"flatTernaryExpressions": false,
|
|
||||||
"ignoredNodes": [
|
|
||||||
"JSXElement",
|
|
||||||
"JSXElement > *",
|
|
||||||
"JSXAttribute",
|
|
||||||
"JSXIdentifier",
|
|
||||||
"JSXNamespacedName",
|
|
||||||
"JSXMemberExpression",
|
|
||||||
"JSXSpreadAttribute",
|
|
||||||
"JSXExpressionContainer",
|
|
||||||
"JSXOpeningElement",
|
|
||||||
"JSXClosingElement",
|
|
||||||
"JSXText",
|
|
||||||
"JSXEmptyExpression",
|
|
||||||
"JSXSpreadChild"
|
|
||||||
],
|
|
||||||
"ignoreComments": false
|
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"class-methods-use-this": "off",
|
"class-methods-use-this": "off",
|
||||||
|
|||||||
2
client/.gitattributes
vendored
2
client/.gitattributes
vendored
@@ -1 +1 @@
|
|||||||
*.js text eol=lf
|
*.ts text eol=lf
|
||||||
|
|||||||
10
client/.prettierrc
vendored
Normal file
10
client/.prettierrc
vendored
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
{
|
||||||
|
"printWidth": 120,
|
||||||
|
"singleQuote": true,
|
||||||
|
"trailingComma": "all",
|
||||||
|
"bracketSpacing": true,
|
||||||
|
"bracketSameLine": true,
|
||||||
|
"tabWidth": 4,
|
||||||
|
"semi": true,
|
||||||
|
"arrowParens": "always",
|
||||||
|
}
|
||||||
46
client/.stylelintrc
vendored
46
client/.stylelintrc
vendored
@@ -1,46 +0,0 @@
|
|||||||
{
|
|
||||||
"defaultSeverity": "warning",
|
|
||||||
"rules": {
|
|
||||||
"block-closing-brace-empty-line-before": "never",
|
|
||||||
"block-no-empty": true,
|
|
||||||
"block-opening-brace-newline-after": "always",
|
|
||||||
"block-opening-brace-space-before": "always",
|
|
||||||
"color-hex-case": "lower",
|
|
||||||
"color-named": "never",
|
|
||||||
"color-no-invalid-hex": true,
|
|
||||||
"length-zero-no-unit": true,
|
|
||||||
"declaration-block-trailing-semicolon": "always",
|
|
||||||
"custom-property-empty-line-before": ["always", {
|
|
||||||
"except": [
|
|
||||||
"after-custom-property",
|
|
||||||
"first-nested"
|
|
||||||
]
|
|
||||||
}],
|
|
||||||
"declaration-block-no-duplicate-properties": true,
|
|
||||||
"declaration-colon-space-after": "always",
|
|
||||||
"declaration-empty-line-before": ["always", {
|
|
||||||
"except": [
|
|
||||||
"after-declaration",
|
|
||||||
"first-nested",
|
|
||||||
"after-comment"
|
|
||||||
]
|
|
||||||
}],
|
|
||||||
"font-weight-notation": "numeric",
|
|
||||||
"indentation": [4, {
|
|
||||||
"except": ["value"]
|
|
||||||
}],
|
|
||||||
"max-empty-lines": 2,
|
|
||||||
"no-missing-end-of-source-newline": true,
|
|
||||||
"number-leading-zero": "always",
|
|
||||||
"property-no-unknown": [true, {
|
|
||||||
"ignoreProperties": "/lost-.+/"
|
|
||||||
}],
|
|
||||||
"rule-empty-line-before": [ "always-multi-line", {
|
|
||||||
"except": ["first-nested"],
|
|
||||||
"ignore": ["after-comment"]
|
|
||||||
}],
|
|
||||||
"string-quotes": "double",
|
|
||||||
"value-list-comma-space-after": "always",
|
|
||||||
"unit-case": "lower"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
44
client/.stylelintrc.js
vendored
Normal file
44
client/.stylelintrc.js
vendored
Normal file
@@ -0,0 +1,44 @@
|
|||||||
|
module.exports = {
|
||||||
|
rules: {
|
||||||
|
"selector-type-no-unknown": true,
|
||||||
|
"block-closing-brace-empty-line-before": "never",
|
||||||
|
"block-no-empty": true,
|
||||||
|
"block-opening-brace-newline-after": "always",
|
||||||
|
"block-opening-brace-space-before": "always",
|
||||||
|
"color-hex-case": "lower",
|
||||||
|
"color-named": "never",
|
||||||
|
"color-no-invalid-hex": true,
|
||||||
|
"length-zero-no-unit": true,
|
||||||
|
"declaration-block-trailing-semicolon": "always",
|
||||||
|
"custom-property-empty-line-before": ["always", {
|
||||||
|
"except": [
|
||||||
|
"after-custom-property",
|
||||||
|
"first-nested"
|
||||||
|
]
|
||||||
|
}],
|
||||||
|
"declaration-block-no-duplicate-properties": true,
|
||||||
|
"declaration-colon-space-after": "always",
|
||||||
|
"declaration-empty-line-before": ["always", {
|
||||||
|
"except": [
|
||||||
|
"after-declaration",
|
||||||
|
"first-nested",
|
||||||
|
"after-comment"
|
||||||
|
]
|
||||||
|
}],
|
||||||
|
"font-weight-notation": "numeric",
|
||||||
|
"indentation": [4, {
|
||||||
|
"except": ["value"]
|
||||||
|
}],
|
||||||
|
"max-empty-lines": 2,
|
||||||
|
"no-missing-end-of-source-newline": true,
|
||||||
|
"number-leading-zero": "always",
|
||||||
|
"property-no-unknown": true,
|
||||||
|
"rule-empty-line-before": ["always-multi-line", {
|
||||||
|
"except": ["first-nested"],
|
||||||
|
"ignore": ["after-comment"]
|
||||||
|
}],
|
||||||
|
"string-quotes": "double",
|
||||||
|
"value-list-comma-space-after": "always",
|
||||||
|
"unit-case": "lower"
|
||||||
|
}
|
||||||
|
}
|
||||||
14
client/babel.config.cjs
vendored
Normal file
14
client/babel.config.cjs
vendored
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
module.exports = (api) => {
|
||||||
|
api.cache(false);
|
||||||
|
return {
|
||||||
|
presets: ['@babel/preset-env', '@babel/preset-typescript', '@babel/preset-react'],
|
||||||
|
plugins: [
|
||||||
|
'@babel/plugin-transform-runtime',
|
||||||
|
'@babel/plugin-transform-class-properties',
|
||||||
|
'@babel/plugin-transform-object-rest-spread',
|
||||||
|
'@babel/plugin-transform-nullish-coalescing-operator',
|
||||||
|
'@babel/plugin-transform-optional-chaining',
|
||||||
|
'react-hot-loader/babel',
|
||||||
|
],
|
||||||
|
};
|
||||||
|
};
|
||||||
17
client/babel.config.js
vendored
17
client/babel.config.js
vendored
@@ -1,17 +0,0 @@
|
|||||||
module.exports = (api) => {
|
|
||||||
api.cache(false);
|
|
||||||
return {
|
|
||||||
presets: [
|
|
||||||
'@babel/preset-env',
|
|
||||||
'@babel/preset-react',
|
|
||||||
],
|
|
||||||
plugins: [
|
|
||||||
'@babel/plugin-proposal-class-properties',
|
|
||||||
'@babel/plugin-transform-runtime',
|
|
||||||
'@babel/plugin-proposal-object-rest-spread',
|
|
||||||
'@babel/plugin-proposal-nullish-coalescing-operator',
|
|
||||||
'@babel/plugin-proposal-optional-chaining',
|
|
||||||
'react-hot-loader/babel',
|
|
||||||
],
|
|
||||||
};
|
|
||||||
};
|
|
||||||
9
client/constants.js
vendored
9
client/constants.js
vendored
@@ -1,11 +1,6 @@
|
|||||||
const BUILD_ENVS = {
|
export const BUILD_ENVS = {
|
||||||
dev: 'development',
|
dev: 'development',
|
||||||
prod: 'production',
|
prod: 'production',
|
||||||
};
|
};
|
||||||
|
|
||||||
const BASE_URL = 'control';
|
export const BASE_URL = 'control';
|
||||||
|
|
||||||
module.exports = {
|
|
||||||
BUILD_ENVS,
|
|
||||||
BASE_URL,
|
|
||||||
};
|
|
||||||
|
|||||||
6
client/global.d.ts
vendored
Normal file
6
client/global.d.ts
vendored
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
import React from 'react';
|
||||||
|
|
||||||
|
declare module '*.svg' {
|
||||||
|
const content: React.FunctionComponent<React.SVGAttributes<SVGElement>>;
|
||||||
|
export default content;
|
||||||
|
}
|
||||||
5
client/jest.config.js
vendored
5
client/jest.config.js
vendored
@@ -1,5 +0,0 @@
|
|||||||
module.exports = {
|
|
||||||
transform: {
|
|
||||||
'^.+\\.jsx?$': 'babel-jest',
|
|
||||||
},
|
|
||||||
};
|
|
||||||
42189
client/package-lock.json
generated
vendored
42189
client/package-lock.json
generated
vendored
File diff suppressed because it is too large
Load Diff
115
client/package.json
vendored
115
client/package.json
vendored
@@ -3,19 +3,27 @@
|
|||||||
"version": "0.1.0",
|
"version": "0.1.0",
|
||||||
"private": true,
|
"private": true,
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"build-dev": "cross-env BUILD_ENV=dev webpack --config webpack.dev.js",
|
"build-dev": "cross-env NODE_ENV=development BUILD_ENV=dev webpack --config webpack.dev.js",
|
||||||
"build-prod": "cross-env BUILD_ENV=prod webpack --config webpack.prod.js",
|
"build-prod": "cross-env BUILD_ENV=prod webpack --config webpack.prod.js",
|
||||||
"watch": "cross-env BUILD_ENV=dev webpack --config webpack.dev.js --watch",
|
"watch": "cross-env BUILD_ENV=dev webpack --config webpack.dev.js --watch",
|
||||||
"watch:hot": "cross-env BUILD_ENV=dev webpack-dev-server --config webpack.dev.js",
|
"watch:hot": "cross-env BUILD_ENV=dev webpack-dev-server --config webpack.dev.js",
|
||||||
"lint": "eslint src",
|
"lint": "eslint --ext .ts,.tsx src",
|
||||||
"lint:fix": "eslint src --fix",
|
"lint:fix": "eslint --ext .ts,.tsx src --fix",
|
||||||
"test": "jest",
|
"test": "vitest --run",
|
||||||
"test:watch": "jest --watch"
|
"test:watch": "vitest --watch",
|
||||||
|
"test:e2e": "npx playwright test tests/e2e",
|
||||||
|
"test:e2e:interactive": "npx playwright test --ui",
|
||||||
|
"test:e2e:debug": "npx playwright test --debug",
|
||||||
|
"test:e2e:codegen": "npx playwright codegen",
|
||||||
|
"typecheck": "tsc --noEmit",
|
||||||
|
"typecheck:watch": "tsc --noEmit --watch"
|
||||||
},
|
},
|
||||||
|
"type": "module",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@nivo/line": "^0.64.0",
|
"@nivo/line": "^0.64.0",
|
||||||
"axios": "^0.19.2",
|
"axios": "^0.19.2",
|
||||||
"classnames": "^2.2.6",
|
"classnames": "^2.5.1",
|
||||||
|
"clsx": "^2.1.1",
|
||||||
"countries-and-timezones": "^3.6.0",
|
"countries-and-timezones": "^3.6.0",
|
||||||
"date-fns": "^1.29.0",
|
"date-fns": "^1.29.0",
|
||||||
"i18next": "^19.6.2",
|
"i18next": "^19.6.2",
|
||||||
@@ -24,11 +32,13 @@
|
|||||||
"js-yaml": "^3.14.0",
|
"js-yaml": "^3.14.0",
|
||||||
"lodash": "^4.17.19",
|
"lodash": "^4.17.19",
|
||||||
"nanoid": "^3.1.9",
|
"nanoid": "^3.1.9",
|
||||||
"prop-types": "^15.7.2",
|
"popper.js": "^1.16.1",
|
||||||
|
"prop-types": "^15.8.1",
|
||||||
"query-string": "^6.13.1",
|
"query-string": "^6.13.1",
|
||||||
"react": "^16.13.1",
|
"react": "^16.13.1",
|
||||||
"react-click-outside": "^3.0.1",
|
"react-click-outside": "^3.0.1",
|
||||||
"react-dom": "^16.13.1",
|
"react-dom": "^16.13.1",
|
||||||
|
"react-hook-form": "^7.54.0",
|
||||||
"react-i18next": "^11.7.2",
|
"react-i18next": "^11.7.2",
|
||||||
"react-modal": "^3.11.2",
|
"react-modal": "^3.11.2",
|
||||||
"react-popper-tooltip": "^2.11.1",
|
"react-popper-tooltip": "^2.11.1",
|
||||||
@@ -38,53 +48,62 @@
|
|||||||
"react-router-hash-link": "^1.2.2",
|
"react-router-hash-link": "^1.2.2",
|
||||||
"react-select": "^3.1.0",
|
"react-select": "^3.1.0",
|
||||||
"react-table": "^6.11.4",
|
"react-table": "^6.11.4",
|
||||||
"react-transition-group": "^4.4.1",
|
"react-transition-group": "^4.4.5",
|
||||||
"redux": "^4.0.5",
|
"redux": "^4.0.5",
|
||||||
"redux-actions": "^2.6.5",
|
"redux-actions": "^2.6.5",
|
||||||
"redux-form": "^8.3.5",
|
|
||||||
"redux-thunk": "^2.3.0",
|
"redux-thunk": "^2.3.0",
|
||||||
"url-polyfill": "^1.1.9"
|
"ts-migrate": "^0.1.35",
|
||||||
|
"url-polyfill": "^1.1.12"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@babel/core": "^7.9.6",
|
"@babel/core": "^7.24.5",
|
||||||
"@babel/plugin-proposal-class-properties": "^7.8.3",
|
"@babel/plugin-transform-class-properties": "^7.24.1",
|
||||||
"@babel/plugin-proposal-nullish-coalescing-operator": "^7.10.4",
|
"@babel/plugin-transform-nullish-coalescing-operator": "^7.24.1",
|
||||||
"@babel/plugin-proposal-object-rest-spread": "^7.9.6",
|
"@babel/plugin-transform-object-rest-spread": "^7.24.5",
|
||||||
"@babel/plugin-proposal-optional-chaining": "^7.10.4",
|
"@babel/plugin-transform-optional-chaining": "^7.24.5",
|
||||||
"@babel/plugin-transform-runtime": "^7.9.6",
|
"@babel/plugin-transform-runtime": "^7.24.3",
|
||||||
"@babel/preset-env": "^7.9.6",
|
"@babel/preset-env": "^7.24.5",
|
||||||
"@babel/preset-react": "^7.9.4",
|
"@babel/preset-react": "^7.24.1",
|
||||||
"autoprefixer": "^9.8.0",
|
"@playwright/test": "1.50.1",
|
||||||
"babel-eslint": "^10.1.0",
|
"@types/lodash": "^4.17.4",
|
||||||
"babel-loader": "^8.1.0",
|
"@types/node": "^22.10.2",
|
||||||
"clean-webpack-plugin": "^3.0.0",
|
"@types/react": "^17.0.80",
|
||||||
"copy-webpack-plugin": "^6.0.1",
|
"@types/react-dom": "^18.3.0",
|
||||||
"cross-env": "^7.0.2",
|
"@types/react-redux": "^7.1.33",
|
||||||
"css-loader": "^3.5.3",
|
"@types/react-router-dom": "^5.3.3",
|
||||||
"eslint": "^6.8.0",
|
"@types/react-table": "^7.7.20",
|
||||||
"eslint-config-airbnb": "^18.1.0",
|
"@types/redux-actions": "^2.6.5",
|
||||||
"eslint-import-resolver-webpack": "^0.12.1",
|
"@typescript-eslint/eslint-plugin": "^7.11.0",
|
||||||
"eslint-loader": "^4.0.2",
|
"@typescript-eslint/parser": "^7.10.0",
|
||||||
"eslint-plugin-import": "^2.22.1",
|
"babel-loader": "^9.1.3",
|
||||||
"eslint-plugin-jsx-a11y": "^6.2.3",
|
"clean-webpack-plugin": "^4.0.0",
|
||||||
"eslint-plugin-react": "^7.24.0",
|
"copy-webpack-plugin": "^12.0.2",
|
||||||
"eslint-plugin-react-hooks": "^2.5.0",
|
"cross-env": "^7.0.3",
|
||||||
"file-loader": "6.0.0",
|
"css-loader": "^7.1.2",
|
||||||
"html-webpack-plugin": "^4.3.0",
|
"eslint": "^8.57.0",
|
||||||
"jest": "^26.0.1",
|
"eslint-config-airbnb": "^19.0.4",
|
||||||
"mini-css-extract-plugin": "^0.9.0",
|
"eslint-config-prettier": "^9.1.0",
|
||||||
|
"eslint-plugin-jsx-a11y": "^6.8.0",
|
||||||
|
"eslint-plugin-prettier": "^5.1.3",
|
||||||
|
"eslint-plugin-react": "^7.34.1",
|
||||||
|
"eslint-plugin-react-hooks": "^4.6.2",
|
||||||
|
"file-loader": "^6.2.0",
|
||||||
|
"html-webpack-plugin": "^5.6.0",
|
||||||
|
"jscodeshift": "^0.15.2",
|
||||||
|
"mini-css-extract-plugin": "^2.9.0",
|
||||||
"path": "^0.12.7",
|
"path": "^0.12.7",
|
||||||
"postcss-flexbugs-fixes": "4.2.1",
|
"postcss-loader": "^8.1.1",
|
||||||
"postcss-loader": "^3.0.0",
|
"prettier": "^3.2.5",
|
||||||
"react-hot-loader": "^4.12.21",
|
"react-hot-loader": "^4.13.1",
|
||||||
"style-loader": "^1.2.1",
|
"style-loader": "^4.0.0",
|
||||||
"stylelint": "^13.5.0",
|
"stylelint": "^16.5.0",
|
||||||
"stylelint-webpack-plugin": "2.0.0",
|
"ts-loader": "^9.5.1",
|
||||||
"url-loader": "^4.1.0",
|
"url-loader": "^4.1.1",
|
||||||
"webpack": "^4.43.0",
|
"vitest": "^3.0.4",
|
||||||
"webpack-cli": "^3.3.11",
|
"webpack": "^5.91.0",
|
||||||
"webpack-dev-server": "^3.11.0",
|
"webpack-cli": "^5.1.4",
|
||||||
"webpack-merge": "^4.2.2"
|
"webpack-dev-server": "^5.0.4",
|
||||||
|
"webpack-merge": "^5.10.0"
|
||||||
},
|
},
|
||||||
"browserslist": {
|
"browserslist": {
|
||||||
"development": [
|
"development": [
|
||||||
|
|||||||
52
client/playwright.config.ts
vendored
Normal file
52
client/playwright.config.ts
vendored
Normal file
@@ -0,0 +1,52 @@
|
|||||||
|
import { defineConfig, devices } from '@playwright/test';
|
||||||
|
|
||||||
|
import path from 'path';
|
||||||
|
import { CONFIG_FILE_PATH } from './tests/constants';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* See https://playwright.dev/docs/test-configuration.
|
||||||
|
*/
|
||||||
|
export default defineConfig({
|
||||||
|
testDir: './tests/e2e',
|
||||||
|
globalSetup: path.resolve('./tests/e2e/globalSetup.ts'),
|
||||||
|
globalTeardown: path.resolve('./tests/e2e/globalTeardown.ts'),
|
||||||
|
timeout: 5000,
|
||||||
|
/* Run tests in files in parallel */
|
||||||
|
fullyParallel: true,
|
||||||
|
/* Fail the build on CI if you accidentally left test.only in the source code. */
|
||||||
|
forbidOnly: !!process.env.CI,
|
||||||
|
/* Retry on CI only */
|
||||||
|
retries: process.env.CI ? 2 : 0,
|
||||||
|
/* Opt out of parallel tests on CI. */
|
||||||
|
workers: process.env.CI ? 1 : undefined,
|
||||||
|
/* Reporter to use. See https://playwright.dev/docs/test-reporters */
|
||||||
|
reporter: 'html',
|
||||||
|
/* Shared settings for all the projects below. See https://playwright.dev/docs/api/class-testoptions. */
|
||||||
|
use: {
|
||||||
|
/* Base URL to use in actions like `await page.goto('/')`. */
|
||||||
|
baseURL: 'http://127.0.0.1:3000',
|
||||||
|
|
||||||
|
/* Collect trace when retrying the failed test. See https://playwright.dev/docs/trace-viewer */
|
||||||
|
trace: 'on-first-retry',
|
||||||
|
launchOptions: {
|
||||||
|
headless: true,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
|
||||||
|
/* Configure projects for major browsers */
|
||||||
|
projects: [
|
||||||
|
{
|
||||||
|
name: 'chromium',
|
||||||
|
use: { ...devices['Desktop Chrome'] },
|
||||||
|
},
|
||||||
|
],
|
||||||
|
|
||||||
|
webServer: {
|
||||||
|
stdout: process.env.CI ? 'pipe' : 'ignore',
|
||||||
|
command: `${!process.env.CI ? 'sudo ' : ''}./AdGuardHome --local-frontend -v -c ${CONFIG_FILE_PATH}`,
|
||||||
|
url: 'http://127.0.0.1:3000',
|
||||||
|
cwd: '..',
|
||||||
|
reuseExistingServer: !process.env.CI,
|
||||||
|
timeout: 10000,
|
||||||
|
},
|
||||||
|
});
|
||||||
@@ -1,18 +1,22 @@
|
|||||||
{
|
{
|
||||||
"client_settings": "إعدادات العميل",
|
"client_settings": "إعدادات العميل",
|
||||||
"example_upstream_reserved": "يمكنك تحديد <0> DNS upstream لنطاق معين (نطاقات) </0>",
|
"example_upstream_reserved": "من المنبع <0>لمجالات محددة</0>;",
|
||||||
"example_upstream_comment": "يمكنك تحديد تعليق",
|
"example_multiple_upstreams_reserved": "منابع متعددة <0>لمجالات محددة</0>;",
|
||||||
"upstream_parallel": "استخدام الاستعلامات المتوازية لتسريع الحل عن طريق الاستعلام في وقت واحد عن جميع خوادم المنبع",
|
"example_upstream_comment": "تعليق.",
|
||||||
"parallel_requests": "طلبات موازية",
|
"upstream_parallel": "استخدم الاستعلامات المتوازية لتسريع عملية الحل عن طريق الاستعلام عن جميع الخوادم المنبع في وقت واحد.",
|
||||||
"load_balancing": "توزيع الحمل",
|
"parallel_requests": "الطلبات الموازية",
|
||||||
|
"load_balancing": "موازنة الأحمال",
|
||||||
"load_balancing_desc": "الاستعلام عن خادم واحد في كل مرة سيستخدم AdGuard الرئيسية الخوارزمية العشوائية الموزونة لاختيار الخادم بحيث يتم استخدام أسرع خادم في كثير من الأحيان",
|
"load_balancing_desc": "الاستعلام عن خادم واحد في كل مرة سيستخدم AdGuard الرئيسية الخوارزمية العشوائية الموزونة لاختيار الخادم بحيث يتم استخدام أسرع خادم في كثير من الأحيان",
|
||||||
"bootstrap_dns": "خوادم Bootstrap DNS",
|
"bootstrap_dns": "خوادم Bootstrap DNS",
|
||||||
"bootstrap_dns_desc": "عناوين IP لخوادم DNS المستخدمة لحل عناوين IP الخاصة بمحللات DoH/DoT التي تحددها كمصدرين رئيسيين. التعليقات غير مسموح بها.",
|
"bootstrap_dns_desc": "عناوين IP لخوادم DNS المستخدمة لحل عناوين IP الخاصة بمحللات DoH/DoT التي تحددها كمصدرين رئيسيين. التعليقات غير مسموح بها.",
|
||||||
|
"fallback_dns_title": "خوادم DNS الاحتياطية",
|
||||||
|
"fallback_dns_desc": "قائمة الخوادم الاحتياطية المستخدمة في حالة عدم الاستجابة من خوادم DNS الرئيسية. تمتلك تلك الخوادم والخوادم الرئيسية نفس الأوامر.",
|
||||||
|
"fallback_dns_placeholder": "أدخل خادم DNS احتياطي واحد لكل سطر",
|
||||||
"local_ptr_title": "خوادم DNS العكسية الخاصة",
|
"local_ptr_title": "خوادم DNS العكسية الخاصة",
|
||||||
"local_ptr_desc": "خوادم DNS التي يستخدمها AdGuard Home لاستعلامات PTR المحلية. تُستخدم هذه الخوادم لحل أسماء المضيفين للعملاء بعناوين IP خاصة ، على سبيل المثال \"192.168.12.34\" ، باستخدام DNS العكسي. في حالة عدم التعيين ، يستخدم AdGuard Home عناوين محللات DNS الافتراضية لنظام التشغيل الخاص بك باستثناء عناوين AdGuard Home نفسها.",
|
"local_ptr_desc": "خوادم DNS التي يستخدمها AdGuard Home لاستعلامات PTR المحلية. تُستخدم هذه الخوادم لحل أسماء المضيفين للعملاء بعناوين IP خاصة ، على سبيل المثال \"192.168.12.34\" ، باستخدام DNS العكسي. في حالة عدم التعيين ، يستخدم AdGuard Home عناوين محللات DNS الافتراضية لنظام التشغيل الخاص بك باستثناء عناوين AdGuard Home نفسها.",
|
||||||
"local_ptr_default_resolver": "بشكل افتراضي ، يستخدم AdGuard Home محللات DNS العكسية التالية: {{ip}}.",
|
"local_ptr_default_resolver": "بشكل افتراضي ، يستخدم AdGuard Home محللات DNS العكسية التالية: {{ip}}.",
|
||||||
"local_ptr_no_default_resolver": "لم يتمكن AdGuard Home من تحديد محللات DNS العكسية المناسبة لهذا النظام.",
|
"local_ptr_no_default_resolver": "لم يتمكن AdGuard Home من تحديد محللات DNS العكسية المناسبة لهذا النظام.",
|
||||||
"local_ptr_placeholder": "أدخل عنوان خادم واحد لكل سطر",
|
"local_ptr_placeholder": "أدخل عنوان IP واحد لكل سطر",
|
||||||
"resolve_clients_title": "تفعيل التحليل العكسي لعناوين IP للعملاء",
|
"resolve_clients_title": "تفعيل التحليل العكسي لعناوين IP للعملاء",
|
||||||
"resolve_clients_desc": "حل عكسيًا لعناوين IP للعملاء في أسماء مضيفيهم عن طريق إرسال استعلامات PTR إلى أدوات الحل المقابلة (خوادم DNS الخاصة للعملاء المحليين ، والخوادم الأولية للعملاء الذين لديهم عناوين IP عامة).",
|
"resolve_clients_desc": "حل عكسيًا لعناوين IP للعملاء في أسماء مضيفيهم عن طريق إرسال استعلامات PTR إلى أدوات الحل المقابلة (خوادم DNS الخاصة للعملاء المحليين ، والخوادم الأولية للعملاء الذين لديهم عناوين IP عامة).",
|
||||||
"use_private_ptr_resolvers_title": "استخدم محللات DNS العكسية الخاصة",
|
"use_private_ptr_resolvers_title": "استخدم محللات DNS العكسية الخاصة",
|
||||||
@@ -34,7 +38,7 @@
|
|||||||
"dhcp_leases_not_found": "لم يتم العثور على عقود إيجار DHCP",
|
"dhcp_leases_not_found": "لم يتم العثور على عقود إيجار DHCP",
|
||||||
"dhcp_config_saved": "الإعدادات محفوظة لخادم DHCP",
|
"dhcp_config_saved": "الإعدادات محفوظة لخادم DHCP",
|
||||||
"dhcp_ipv4_settings": "DHCP IPv4 إعدادات",
|
"dhcp_ipv4_settings": "DHCP IPv4 إعدادات",
|
||||||
"dhcp_ipv6_settings": "DHCP IPv6 إعدادات",
|
"dhcp_ipv6_settings": "إعدادات DHCP IPv6",
|
||||||
"form_error_required": "الحقل مطلوب",
|
"form_error_required": "الحقل مطلوب",
|
||||||
"form_error_ip4_format": "عنوان IPv4 غير صالح",
|
"form_error_ip4_format": "عنوان IPv4 غير صالح",
|
||||||
"form_error_ip4_gateway_format": "عنوان IPv4 غير صالح للبوابة",
|
"form_error_ip4_gateway_format": "عنوان IPv4 غير صالح للبوابة",
|
||||||
@@ -63,14 +67,16 @@
|
|||||||
"dhcp_ip_addresses": "عناوين الـIP",
|
"dhcp_ip_addresses": "عناوين الـIP",
|
||||||
"ip": "IP",
|
"ip": "IP",
|
||||||
"dhcp_table_hostname": "اسم المضيف",
|
"dhcp_table_hostname": "اسم المضيف",
|
||||||
"dhcp_table_expires": "يتنهي في",
|
"dhcp_table_expires": "تنتهي",
|
||||||
"dhcp_warning": "إذا كنت تريد تمكين خادم DHCP على أي حال ، فتأكد من عدم وجود خادم DHCP نشط آخر في شبكتك. خلاف ذلك ، يمكن أن يعطل خدمة الإنترنت للأجهزة المتصلة!",
|
"dhcp_warning": "إذا كنت تريد تمكين خادم DHCP على أي حال ، فتأكد من عدم وجود خادم DHCP نشط آخر في شبكتك. خلاف ذلك ، يمكن أن يعطل خدمة الإنترنت للأجهزة المتصلة!",
|
||||||
"dhcp_error": "لم نتمكن من تحديد ما إذا كان هناك خادم DHCP آخر في الشبكة.",
|
"dhcp_error": "لم نتمكن من تحديد ما إذا كان هناك خادم DHCP آخر في الشبكة.",
|
||||||
"dhcp_static_ip_error": "من أجل استخدام خادم DHCP ، يجب تعيين عنوان IP ثابت. فشلنا في تحديد ما إذا تم تكوين واجهة الشبكة هذه باستخدام عنوان IP ثابت. يرجى تعيين عنوان IP ثابت يدويًا.",
|
"dhcp_static_ip_error": "من أجل استخدام خادم DHCP ، يجب تعيين عنوان IP ثابت. فشلنا في تحديد ما إذا تم تكوين واجهة الشبكة هذه باستخدام عنوان IP ثابت. يرجى تعيين عنوان IP ثابت يدويًا.",
|
||||||
"dhcp_dynamic_ip_found": "يستخدم نظامك عنوان IP الديناميكي للواجهة <0>{{interfaceName}}</0>. من أجل استعمال خادم DHCP ، يجب تعيين عنوان IP ثابت. عنوان IP الحالي الخاص بك هو <0>{{ipAddress}}</0>. إذا ضغطت على زر تفعيل DHCP سنقوم تلقائيًا بتعيين عنوان الIP هذا على أنه ثابت.",
|
"dhcp_dynamic_ip_found": "يستخدم نظامك عنوان IP الديناميكي للواجهة <0>{{interfaceName}}</0>. من أجل استعمال خادم DHCP ، يجب تعيين عنوان IP ثابت. عنوان IP الحالي الخاص بك هو <0>{{ipAddress}}</0>. إذا ضغطت على زر تفعيل DHCP سنقوم تلقائيًا بتعيين عنوان الIP هذا على أنه ثابت.",
|
||||||
"dhcp_lease_added": "تمت أضافة مدة الايجار \"{{key}}\" بنجاح",
|
"dhcp_lease_added": "تمت أضافة مدة الايجار \"{{key}}\" بنجاح",
|
||||||
"dhcp_lease_deleted": "تمت ازالة مدة الايجار \"{{key}}\" بنجاح",
|
"dhcp_lease_deleted": "تمت ازالة مدة الايجار \"{{key}}\" بنجاح",
|
||||||
|
"dhcp_lease_updated": "Static lease \"{{key}}\" تمّ التحديث بنجاح",
|
||||||
"dhcp_new_static_lease": "عقد إيجار ثابت جديد",
|
"dhcp_new_static_lease": "عقد إيجار ثابت جديد",
|
||||||
|
"dhcp_edit_static_lease": "تحرير عقد الإيجار الثابت",
|
||||||
"dhcp_static_leases_not_found": "لم يتم العثور على عقود إيجار ثابتة DHCP",
|
"dhcp_static_leases_not_found": "لم يتم العثور على عقود إيجار ثابتة DHCP",
|
||||||
"dhcp_add_static_lease": "إضافة عقد إيجار ثابت",
|
"dhcp_add_static_lease": "إضافة عقد إيجار ثابت",
|
||||||
"dhcp_reset_leases": "إعادة تعيين كافة عقود الإيجار",
|
"dhcp_reset_leases": "إعادة تعيين كافة عقود الإيجار",
|
||||||
@@ -83,7 +89,7 @@
|
|||||||
"form_enter_hostname": "أدخل اسم الhostname",
|
"form_enter_hostname": "أدخل اسم الhostname",
|
||||||
"error_details": "مزيد من التفاصيل حول الخطأ",
|
"error_details": "مزيد من التفاصيل حول الخطأ",
|
||||||
"response_details": "تفاصيل الاستجابة",
|
"response_details": "تفاصيل الاستجابة",
|
||||||
"request_details": "تفاصيل الطلب",
|
"request_details": "طلب التفاصيل",
|
||||||
"client_details": "تفاصيل العميل",
|
"client_details": "تفاصيل العميل",
|
||||||
"details": "التفاصيل",
|
"details": "التفاصيل",
|
||||||
"back": "رجوع",
|
"back": "رجوع",
|
||||||
@@ -93,13 +99,13 @@
|
|||||||
"filter": "فلتر",
|
"filter": "فلتر",
|
||||||
"query_log": "سجل الQuery",
|
"query_log": "سجل الQuery",
|
||||||
"compact": "المدمج",
|
"compact": "المدمج",
|
||||||
"nothing_found": "لم يتم العثور علي شيء...",
|
"nothing_found": "لم يتم العثور على شيء",
|
||||||
"faq": "أسئلة مكررة",
|
"faq": "الأسئلة المتداولة",
|
||||||
"version": "الإصدار",
|
"version": "الإصدار",
|
||||||
"address": "العناوين",
|
"address": "العنوان",
|
||||||
"protocol": "البروتوكول",
|
"protocol": "البروتوكول",
|
||||||
"on": "ON",
|
"on": "قيد التشغيل",
|
||||||
"off": "OFF",
|
"off": "قيد الإيقاف",
|
||||||
"copyright": "حقوق النشر",
|
"copyright": "حقوق النشر",
|
||||||
"homepage": "الصفحة الرئيسية",
|
"homepage": "الصفحة الرئيسية",
|
||||||
"report_an_issue": "الإبلاغ عن مشكلة",
|
"report_an_issue": "الإبلاغ عن مشكلة",
|
||||||
@@ -114,7 +120,8 @@
|
|||||||
"stats_malware_phishing": "حسر البرامج الضارة / والتصيّد",
|
"stats_malware_phishing": "حسر البرامج الضارة / والتصيّد",
|
||||||
"stats_adult": "حظر مواقع الويب الخاصة بالبالغين",
|
"stats_adult": "حظر مواقع الويب الخاصة بالبالغين",
|
||||||
"stats_query_domain": "اعلى النطاقات التي تم الاستعلام عنها",
|
"stats_query_domain": "اعلى النطاقات التي تم الاستعلام عنها",
|
||||||
"for_last_24_hours": "لأخر 24 ساعة",
|
"for_last_hours": "لآخر {{count}} ساعة",
|
||||||
|
"for_last_hours_plural": "لآخر {{count}} ساعة",
|
||||||
"for_last_days": "لآخر {{value}} يوم",
|
"for_last_days": "لآخر {{value}} يوم",
|
||||||
"for_last_days_plural": "لآخر {{count}} ايام",
|
"for_last_days_plural": "لآخر {{count}} ايام",
|
||||||
"stats_disabled": "تم تعطيل الإحصائيات. يمكنك تشغيله من <0> صفحة الإعدادات </0>.",
|
"stats_disabled": "تم تعطيل الإحصائيات. يمكنك تشغيله من <0> صفحة الإعدادات </0>.",
|
||||||
@@ -129,13 +136,16 @@
|
|||||||
"no_upstreams_data_found": "لم يتم العثور على بيانات خوادم upstream",
|
"no_upstreams_data_found": "لم يتم العثور على بيانات خوادم upstream",
|
||||||
"number_of_dns_query_days": "عدد استعلامات DNS التي تمت معالجتها لآخر {{count}} يوم",
|
"number_of_dns_query_days": "عدد استعلامات DNS التي تمت معالجتها لآخر {{count}} يوم",
|
||||||
"number_of_dns_query_days_plural": "عدد استعلامات DNS التي تمت معالجتها لآخر {{count}} أيام",
|
"number_of_dns_query_days_plural": "عدد استعلامات DNS التي تمت معالجتها لآخر {{count}} أيام",
|
||||||
"number_of_dns_query_24_hours": "عدد استعلامات DNS التي تمت معالجتها لآخر 24 ساعة",
|
"number_of_dns_query_hours": "عدد استفسارات DNS التي تمت معالجتها لآخر {{count}} ساعة",
|
||||||
|
"number_of_dns_query_hours_plural": "عدد استعلامات DNS التي تمت معالجتها خلال آخر {{count}} ساعة",
|
||||||
"number_of_dns_query_blocked_24_hours": "عدد طلبات DNS المحظورة بواسطة فلاتر adblock وقوائم حظر المضيفين",
|
"number_of_dns_query_blocked_24_hours": "عدد طلبات DNS المحظورة بواسطة فلاتر adblock وقوائم حظر المضيفين",
|
||||||
"number_of_dns_query_blocked_24_hours_by_sec": "عدد طلبات DNS التي تم حظرها من قبل وحدة أمان التصفح AdGuard",
|
"number_of_dns_query_blocked_24_hours_by_sec": "عدد طلبات DNS التي تم حظرها من قبل وحدة أمان التصفح AdGuard",
|
||||||
"number_of_dns_query_blocked_24_hours_adult": "عدد من المواقع (الإباحية) للبالغين تم حجبها",
|
"number_of_dns_query_blocked_24_hours_adult": "عدد من المواقع (الإباحية) للبالغين تم حجبها",
|
||||||
"enforced_save_search": "فرض البحث الآمن",
|
"enforced_save_search": "فرض البحث الآمن",
|
||||||
"number_of_dns_query_to_safe_search": "عدد طلبات DNS لمحركات البحث التي تم فرض البحث الآمن عنها",
|
"number_of_dns_query_to_safe_search": "عدد طلبات DNS لمحركات البحث التي تم فرض البحث الآمن عنها",
|
||||||
"average_processing_time": "متوسط وقت المعالجة",
|
"average_processing_time": "متوسط وقت المعالجة",
|
||||||
|
"average_upstream_response_time": "متوسط وقت استجابة المنبع",
|
||||||
|
"response_time": "وقت الاستجابة",
|
||||||
"average_processing_time_hint": "متوسط الوقت بالمللي ثانية عند معالجة طلب DNS",
|
"average_processing_time_hint": "متوسط الوقت بالمللي ثانية عند معالجة طلب DNS",
|
||||||
"block_domain_use_filters_and_hosts": "حظر النطاقات باستخدام عوامل التصفية وملفات المضيفين",
|
"block_domain_use_filters_and_hosts": "حظر النطاقات باستخدام عوامل التصفية وملفات المضيفين",
|
||||||
"filters_block_toggle_hint": "يمكنك إعداد قواعد حظر في <a>المرشحات</a> اعدادات.",
|
"filters_block_toggle_hint": "يمكنك إعداد قواعد حظر في <a>المرشحات</a> اعدادات.",
|
||||||
@@ -170,8 +180,9 @@
|
|||||||
"enabled_parental_toast": "تفعيل الرقابة الأبوية",
|
"enabled_parental_toast": "تفعيل الرقابة الأبوية",
|
||||||
"disabled_safe_search_toast": "تعطيل البحث الآمن",
|
"disabled_safe_search_toast": "تعطيل البحث الآمن",
|
||||||
"enabled_save_search_toast": "تفعيل البحث الآمن",
|
"enabled_save_search_toast": "تفعيل البحث الآمن",
|
||||||
"enabled_table_header": "تمكين",
|
"updated_save_search_toast": "تم تحديث إعدادات البحث الآمن",
|
||||||
"name_table_header": "الاسم",
|
"enabled_table_header": "قيد التشغيل",
|
||||||
|
"name_table_header": "الاِسْم",
|
||||||
"list_url_table_header": "قائمة الروابط",
|
"list_url_table_header": "قائمة الروابط",
|
||||||
"rules_count_table_header": "عدد القواعد",
|
"rules_count_table_header": "عدد القواعد",
|
||||||
"last_time_updated_table_header": "آخر تحديث",
|
"last_time_updated_table_header": "آخر تحديث",
|
||||||
@@ -225,6 +236,7 @@
|
|||||||
"updated_upstream_dns_toast": "تم حفظ خوادم Upstream بنجاح",
|
"updated_upstream_dns_toast": "تم حفظ خوادم Upstream بنجاح",
|
||||||
"dns_test_ok_toast": "تعمل خوادم DNS المحددة بشكل صحيح",
|
"dns_test_ok_toast": "تعمل خوادم DNS المحددة بشكل صحيح",
|
||||||
"dns_test_not_ok_toast": "خادم \"{{key}}\": لا يمكن استخدامه يرجى التحقق من كتابته بشكل صحيح",
|
"dns_test_not_ok_toast": "خادم \"{{key}}\": لا يمكن استخدامه يرجى التحقق من كتابته بشكل صحيح",
|
||||||
|
"dns_test_parsing_error_toast": "القسم {{section}}: السطر {{line}}: لا يمكن استخدامه، يرجى التحقق من أنك قد كتبته بشكل صحيح",
|
||||||
"dns_test_warning_toast": "المنبع \"{{key}}\" لا يستجيب لطلبات الاختبار وقد لا يعمل بشكل صحيح",
|
"dns_test_warning_toast": "المنبع \"{{key}}\" لا يستجيب لطلبات الاختبار وقد لا يعمل بشكل صحيح",
|
||||||
"unblock": "إلغاء الحظر",
|
"unblock": "إلغاء الحظر",
|
||||||
"block": "حظر",
|
"block": "حظر",
|
||||||
@@ -232,7 +244,8 @@
|
|||||||
"allow_this_client": "السماح لهذا العميل",
|
"allow_this_client": "السماح لهذا العميل",
|
||||||
"block_for_this_client_only": "احجب هذا العميل فقط",
|
"block_for_this_client_only": "احجب هذا العميل فقط",
|
||||||
"unblock_for_this_client_only": "إلغاء حجب هذا العميل فقط",
|
"unblock_for_this_client_only": "إلغاء حجب هذا العميل فقط",
|
||||||
"time_table_header": "وقت",
|
"add_persistent_client": "إضافة كعميل دائم",
|
||||||
|
"time_table_header": "الوقت",
|
||||||
"date": "التاريخ",
|
"date": "التاريخ",
|
||||||
"domain_name_table_header": "اسم النطاق",
|
"domain_name_table_header": "اسم النطاق",
|
||||||
"domain_or_client": "الدومين أو العميل",
|
"domain_or_client": "الدومين أو العميل",
|
||||||
@@ -247,7 +260,7 @@
|
|||||||
"refresh_btn": "تحديث",
|
"refresh_btn": "تحديث",
|
||||||
"previous_btn": "السابق",
|
"previous_btn": "السابق",
|
||||||
"next_btn": "التالي",
|
"next_btn": "التالي",
|
||||||
"loading_table_status": "جار التحميل...",
|
"loading_table_status": "التحميل جارٍ...",
|
||||||
"page_table_footer_text": "الصفحة",
|
"page_table_footer_text": "الصفحة",
|
||||||
"rows_table_footer_text": "صفوف",
|
"rows_table_footer_text": "صفوف",
|
||||||
"updated_custom_filtering_toast": "تحديث قواعد الفلترة المخصصة",
|
"updated_custom_filtering_toast": "تحديث قواعد الفلترة المخصصة",
|
||||||
@@ -259,12 +272,12 @@
|
|||||||
"query_log_cleared": "تم مسح سجل الاستعلام بنجاح",
|
"query_log_cleared": "تم مسح سجل الاستعلام بنجاح",
|
||||||
"query_log_updated": "تم تحديث سجل الاستعلام بنجاح",
|
"query_log_updated": "تم تحديث سجل الاستعلام بنجاح",
|
||||||
"query_log_clear": "مسح سجلات الاستعلام",
|
"query_log_clear": "مسح سجلات الاستعلام",
|
||||||
"query_log_retention": "الاحتفاظ بسجلات الاستعلام",
|
"query_log_retention": "تناوب سجلات الاستعلام",
|
||||||
"query_log_enable": "تمكين السجل",
|
"query_log_enable": "تمكين السجل",
|
||||||
"query_log_configuration": "تكوين السجلات",
|
"query_log_configuration": "تكوين السجلات",
|
||||||
"query_log_disabled": "سجل الاستعلام معطل ويمكن تهيئته من<0>الاعدادات</0>",
|
"query_log_disabled": "سجل الاستعلام معطل ويمكن تهيئته من<0>الاعدادات</0>",
|
||||||
"query_log_strict_search": "استخدم علامات الاقتباس المزدوجة للبحث الدقيق",
|
"query_log_strict_search": "استخدم علامات الاقتباس المزدوجة للبحث الدقيق",
|
||||||
"query_log_retention_confirm": "هل أنت متأكد من أنك تريد تغيير الاحتفاظ بسجل الاستعلام؟ إذا قمت بتقليل قيمة الفاصل الزمني سيتم فقدان بعض البيانات",
|
"query_log_retention_confirm": "هل أنت متيقِّن من أنك تريد تغيير دوران سجل الاستعلام؟ إذا قمت بتقليل قيمة الفاصل الزمني، ستفقد بعض البيانات",
|
||||||
"anonymize_client_ip": "إخفاء عنوان IP العميل",
|
"anonymize_client_ip": "إخفاء عنوان IP العميل",
|
||||||
"anonymize_client_ip_desc": "لا تقم بحفظ كامل عنوان IP العميل في السجلات والإحصائيات",
|
"anonymize_client_ip_desc": "لا تقم بحفظ كامل عنوان IP العميل في السجلات والإحصائيات",
|
||||||
"dns_config": "إعداد خادم DNS",
|
"dns_config": "إعداد خادم DNS",
|
||||||
@@ -278,7 +291,9 @@
|
|||||||
"custom_ip": "عنوان IP مخصص",
|
"custom_ip": "عنوان IP مخصص",
|
||||||
"blocking_ipv4": "حجب عنوان IPv4",
|
"blocking_ipv4": "حجب عنوان IPv4",
|
||||||
"blocking_ipv6": "حجب عنوان IPv6",
|
"blocking_ipv6": "حجب عنوان IPv6",
|
||||||
"blocked_response_ttl": "زمن حظر الاستجابة",
|
"blocked_response_ttl": "حظر استجابة TTL",
|
||||||
|
"blocked_response_ttl_desc": "تحديد عدد الثواني التي يجب على العملاء تخزين الاستجابة التي تمت تصفيتها مؤقتًا",
|
||||||
|
"form_enter_blocked_response_ttl": "أدخل وقت الاستجابة المحظورة TTL (بالثواني)",
|
||||||
"dnscrypt": "DNSCrypt",
|
"dnscrypt": "DNSCrypt",
|
||||||
"dns_over_https": "DNS-over-HTTPS",
|
"dns_over_https": "DNS-over-HTTPS",
|
||||||
"dns_over_tls": "DNS-over-TLS",
|
"dns_over_tls": "DNS-over-TLS",
|
||||||
@@ -294,7 +309,19 @@
|
|||||||
"rate_limit": "حدود التقييم",
|
"rate_limit": "حدود التقييم",
|
||||||
"edns_enable": "فعل EDNS client subnet",
|
"edns_enable": "فعل EDNS client subnet",
|
||||||
"edns_cs_desc": "أضف EDNS الشبكة الفرعية للعميل (ECS) إلى الطلبات الأولية وقم بتسجيل القيم المرسلة من قبل العملاء في سجل الاستعلام.",
|
"edns_cs_desc": "أضف EDNS الشبكة الفرعية للعميل (ECS) إلى الطلبات الأولية وقم بتسجيل القيم المرسلة من قبل العملاء في سجل الاستعلام.",
|
||||||
|
"edns_use_custom_ip": "استخدام IP مخصص لـ EDNS",
|
||||||
|
"edns_use_custom_ip_desc": "السماح باستخدام IP مخصص لـ EDNS",
|
||||||
"rate_limit_desc": "عدد الطلبات في الثانية المسموح بها لكل عميل. جعله على 0 يعني عدم وجود حد.",
|
"rate_limit_desc": "عدد الطلبات في الثانية المسموح بها لكل عميل. جعله على 0 يعني عدم وجود حد.",
|
||||||
|
"rate_limit_subnet_len_ipv4": "طول بادئة الشبكة لعناوين IPv4",
|
||||||
|
"rate_limit_subnet_len_ipv4_desc": "طول بادئة الشبكة لعناوين IPv4 المستخدمة لتحديد معدل الحد الأقصى. الافتراضي هو 24",
|
||||||
|
"rate_limit_subnet_len_ipv4_error": "يجب أن يكون طول بادئة الشبكة IPv4 بين 0 و 32",
|
||||||
|
"rate_limit_subnet_len_ipv6": "طول بادئة الشبكة لعناوين IPv6",
|
||||||
|
"rate_limit_subnet_len_ipv6_desc": "طول بادئة الشبكة لعناوين IPv6 المستخدمة لتحديد معدل الحد الأقصى. الافتراضي هو 56",
|
||||||
|
"rate_limit_subnet_len_ipv6_error": "يجب أن يكون طول بادئة الشبكة IPv6 بين 0 و 128",
|
||||||
|
"form_enter_rate_limit_subnet_len": "أدخل طول بادئة الشبكة الفرعية لتحديد معدل الحد الأقصى",
|
||||||
|
"rate_limit_whitelist": "قائمة السماح بتحديد معدل الحد الأقصى",
|
||||||
|
"rate_limit_whitelist_desc": "عناوين IP المستبعدة من تحديد معدل الحد الأقصى",
|
||||||
|
"rate_limit_whitelist_placeholder": "أدخل عنوان IP واحد لكل سطر",
|
||||||
"blocking_ipv4_desc": "سيتم إرجاع عنوان IP لطلب محظور",
|
"blocking_ipv4_desc": "سيتم إرجاع عنوان IP لطلب محظور",
|
||||||
"blocking_ipv6_desc": "سيتم إرجاع عنوان IP لطلب AAAA محظور",
|
"blocking_ipv6_desc": "سيتم إرجاع عنوان IP لطلب AAAA محظور",
|
||||||
"blocking_mode_default": "الافتراضي: الرد بعنوان IP صفري (0.0.0.0 لـ A ؛ :: لـ AAAA) عند حظره بواسطة قاعدة نمط Adblock ؛ الرد بعنوان IP المحدد في القاعدة عند حظره بواسطة / etc / hosts-style rule",
|
"blocking_mode_default": "الافتراضي: الرد بعنوان IP صفري (0.0.0.0 لـ A ؛ :: لـ AAAA) عند حظره بواسطة قاعدة نمط Adblock ؛ الرد بعنوان IP المحدد في القاعدة عند حظره بواسطة / etc / hosts-style rule",
|
||||||
@@ -302,14 +329,15 @@
|
|||||||
"blocking_mode_nxdomain": "NXDOMAIN: الرد باستخدام رمز NXDOMAIN",
|
"blocking_mode_nxdomain": "NXDOMAIN: الرد باستخدام رمز NXDOMAIN",
|
||||||
"blocking_mode_null_ip": "IP Null: الاستجابة بعنوان IP صفري (0.0.0.0 لـ A ؛ :: لـ AAAA)",
|
"blocking_mode_null_ip": "IP Null: الاستجابة بعنوان IP صفري (0.0.0.0 لـ A ؛ :: لـ AAAA)",
|
||||||
"blocking_mode_custom_ip": "استجابة IP مخصصة بعنوان IP تم تعيينه يدويًا",
|
"blocking_mode_custom_ip": "استجابة IP مخصصة بعنوان IP تم تعيينه يدويًا",
|
||||||
|
"theme_auto": "تلقائي",
|
||||||
"theme_light": "فاتح",
|
"theme_light": "فاتح",
|
||||||
"theme_dark": "ليلي",
|
"theme_dark": "داكن",
|
||||||
"upstream_dns_client_desc": "إذا احتفظت بهذا الحقل فارغًا ، فسيستخدم AdGuard Home الخوادم التي تم تكوينها في<0>DNS إعدادات</0>.",
|
"upstream_dns_client_desc": "إذا احتفظت بهذا الحقل فارغًا ، فسيستخدم AdGuard Home الخوادم التي تم تكوينها في<0>DNS إعدادات</0>.",
|
||||||
"tracker_source": "مصدر المتعقب",
|
"tracker_source": "مصدر المتعقب",
|
||||||
"source_label": "المصدر",
|
"source_label": "المصدر",
|
||||||
"found_in_known_domain_db": "تم العثور عليه في قاعدة بيانات دومينات معروفة.",
|
"found_in_known_domain_db": "تم العثور عليه في قاعدة بيانات دومينات معروفة.",
|
||||||
"category_label": "الفئة",
|
"category_label": "الفئة",
|
||||||
"rule_label": "قواعد",
|
"rule_label": "قاعدة (قواعد)",
|
||||||
"list_label": "قائمه",
|
"list_label": "قائمه",
|
||||||
"unknown_filter": "فلتر غير معروف {{filterId}}",
|
"unknown_filter": "فلتر غير معروف {{filterId}}",
|
||||||
"known_tracker": "متعقب معروف",
|
"known_tracker": "متعقب معروف",
|
||||||
@@ -320,14 +348,14 @@
|
|||||||
"install_settings_port": "المنفذ",
|
"install_settings_port": "المنفذ",
|
||||||
"install_settings_interface_link": "ستكون واجهة الويب الخاصة بمسؤول AdGuard Home متاحة على العناوين التالية:",
|
"install_settings_interface_link": "ستكون واجهة الويب الخاصة بمسؤول AdGuard Home متاحة على العناوين التالية:",
|
||||||
"form_error_port": "أدخل رقم منفذ صالح",
|
"form_error_port": "أدخل رقم منفذ صالح",
|
||||||
"install_settings_dns": "خادم DNS",
|
"install_settings_dns": "خَادِم DNS",
|
||||||
"install_settings_dns_desc": "ستحتاج إلى ضبط أجهزتك أو جهاز التوجيه الخاص بك لاستخدام خادم DNS على العناوين التالية:",
|
"install_settings_dns_desc": "ستحتاج إلى ضبط أجهزتك أو جهاز التوجيه الخاص بك لاستخدام خادم DNS على العناوين التالية:",
|
||||||
"install_settings_all_interfaces": "جميع الواجهات",
|
"install_settings_all_interfaces": "جميع الواجهات",
|
||||||
"install_auth_title": "المصادقة",
|
"install_auth_title": "المصادقة",
|
||||||
"install_auth_desc": "يجب إعداد مصادقة كلمة المرور لواجهة ويب مسؤول AdGuard Home. في حال كان AdGuard Home لا يمكن الوصول إليه إلا في شبكتك المحلية ، فلا يزال من المهم حمايته من الوصول غير المقيد.",
|
"install_auth_desc": "يجب إعداد مصادقة كلمة المرور لواجهة ويب مسؤول AdGuard Home. في حال كان AdGuard Home لا يمكن الوصول إليه إلا في شبكتك المحلية ، فلا يزال من المهم حمايته من الوصول غير المقيد.",
|
||||||
"install_auth_username": "اسم المستخدم",
|
"install_auth_username": "اسم المستخدم",
|
||||||
"install_auth_password": "الكلمة السرية",
|
"install_auth_password": "الكلمة السرية",
|
||||||
"install_auth_confirm": "تاكيد كلمه المرور",
|
"install_auth_confirm": "تأكيد كلمة المرور",
|
||||||
"install_auth_username_enter": "أدخل اسم المستخدم",
|
"install_auth_username_enter": "أدخل اسم المستخدم",
|
||||||
"install_auth_password_enter": "أدخل كلمة المرور",
|
"install_auth_password_enter": "أدخل كلمة المرور",
|
||||||
"install_step": "خطوة",
|
"install_step": "خطوة",
|
||||||
@@ -397,6 +425,9 @@
|
|||||||
"encryption_hostnames": "اسم المستضيف",
|
"encryption_hostnames": "اسم المستضيف",
|
||||||
"encryption_reset": "هل أنت متأكد أنك تريد إعادة تعيين إعدادات التشفير؟",
|
"encryption_reset": "هل أنت متأكد أنك تريد إعادة تعيين إعدادات التشفير؟",
|
||||||
"encryption_warning": "تحذير",
|
"encryption_warning": "تحذير",
|
||||||
|
"encryption_plain_dns_enable": "تمكين DNS العادي",
|
||||||
|
"encryption_plain_dns_desc": "الـDNS العادي مفعل افتراضيًا. يمكنك تعطيله لإجبار جميع الأجهزة على استخدام DNS المشفر. للقيام بذلك، يجب عليك تفعيل بروتوكول DNS المشفر على الأقل",
|
||||||
|
"encryption_plain_dns_error": "لتعطيل DNS العادي، قم بتمكين بروتوكول DNS المشفر على الأقل",
|
||||||
"topline_expiring_certificate": "شهادة SSL الخاصة بك على وشك الانتهاء. قم بتحديث <0>إعدادات التشفير</0>.",
|
"topline_expiring_certificate": "شهادة SSL الخاصة بك على وشك الانتهاء. قم بتحديث <0>إعدادات التشفير</0>.",
|
||||||
"topline_expired_certificate": "انتهت صلاحية شهادة SSL الخاصة بك. قم بتحديث <0>إعدادات التشفير</0>.",
|
"topline_expired_certificate": "انتهت صلاحية شهادة SSL الخاصة بك. قم بتحديث <0>إعدادات التشفير</0>.",
|
||||||
"form_error_port_range": "أدخل رقم المنفذ في النطاق 80-65535",
|
"form_error_port_range": "أدخل رقم المنفذ في النطاق 80-65535",
|
||||||
@@ -436,6 +467,7 @@
|
|||||||
"form_add_id": "أضافة معّرف",
|
"form_add_id": "أضافة معّرف",
|
||||||
"form_client_name": "ادخل اسم العميل",
|
"form_client_name": "ادخل اسم العميل",
|
||||||
"name": "اسم",
|
"name": "اسم",
|
||||||
|
"client_name": "العميل {{id}}",
|
||||||
"client_global_settings": "استخدم إعدادات عالمية",
|
"client_global_settings": "استخدم إعدادات عالمية",
|
||||||
"client_deleted": "تم حذف العميل \"{{key}}\" بنجاح",
|
"client_deleted": "تم حذف العميل \"{{key}}\" بنجاح",
|
||||||
"client_added": "تم اضافة العميل \"{{key}}\" بنجاح",
|
"client_added": "تم اضافة العميل \"{{key}}\" بنجاح",
|
||||||
@@ -444,7 +476,7 @@
|
|||||||
"client_confirm_delete": "هل أنت متأكد من أنك تريد حذف العميل \"{{key}}\"?",
|
"client_confirm_delete": "هل أنت متأكد من أنك تريد حذف العميل \"{{key}}\"?",
|
||||||
"list_confirm_delete": "هل أنت متأكد أنك تريد حذف هذه القائمة؟",
|
"list_confirm_delete": "هل أنت متأكد أنك تريد حذف هذه القائمة؟",
|
||||||
"auto_clients_title": "Runtime clients",
|
"auto_clients_title": "Runtime clients",
|
||||||
"auto_clients_desc": "الأجهزة غير المدرجة في قائمة العملاء الدائمين الذين قد لا يزالون يستخدمون AdGuard Home",
|
"auto_clients_desc": "معلومات حول عناوين IP للأجهزة التي تستخدم أو قد تستخدم AdGuard Home. يتم جمع هذه المعلومات من عدة مصادر، بما في ذلك ملفات المضيفين، و DNS العكسي، إلخ.",
|
||||||
"access_title": "إعدادات الوصول",
|
"access_title": "إعدادات الوصول",
|
||||||
"access_desc": "هنا يمكنك ضبط قواعد الوصول لخادم AdGuard Home DNS",
|
"access_desc": "هنا يمكنك ضبط قواعد الوصول لخادم AdGuard Home DNS",
|
||||||
"access_allowed_title": "العملاء المسموحين",
|
"access_allowed_title": "العملاء المسموحين",
|
||||||
@@ -457,6 +489,7 @@
|
|||||||
"updates_checked": "يتوفر إصدار جديد من AdGuard Home",
|
"updates_checked": "يتوفر إصدار جديد من AdGuard Home",
|
||||||
"updates_version_equal": "AdGuard Home محدث",
|
"updates_version_equal": "AdGuard Home محدث",
|
||||||
"check_updates_now": "تحقق من وجود تحديثات الآن",
|
"check_updates_now": "تحقق من وجود تحديثات الآن",
|
||||||
|
"version_request_error": "فشل التحقق من التحديث. يرجى التحقق من اتصالك بالإنترنت.",
|
||||||
"dns_privacy": "خصوصية DNS",
|
"dns_privacy": "خصوصية DNS",
|
||||||
"setup_dns_privacy_1": "<0> DNS-over-TLS: </0> استخدم سلسلة <1> {{address}} </1>.",
|
"setup_dns_privacy_1": "<0> DNS-over-TLS: </0> استخدم سلسلة <1> {{address}} </1>.",
|
||||||
"setup_dns_privacy_2": "<0> DNS-over-HTTPS: </0> استخدم سلسلة <1> {{address}} </1>.",
|
"setup_dns_privacy_2": "<0> DNS-over-HTTPS: </0> استخدم سلسلة <1> {{address}} </1>.",
|
||||||
@@ -477,7 +510,9 @@
|
|||||||
"setup_dns_notice": "من أجل استخدام <0> DNS-over-HTTPS </0> أو <1> DNS-over-TLS </1> ، تحتاج إلى <1> تكوين التشفير </1> في إعدادات AdGuard Home.",
|
"setup_dns_notice": "من أجل استخدام <0> DNS-over-HTTPS </0> أو <1> DNS-over-TLS </1> ، تحتاج إلى <1> تكوين التشفير </1> في إعدادات AdGuard Home.",
|
||||||
"rewrite_added": "تمت إضافة إعادة كتابة DNS لـ \"{{key}}\" بنجاح",
|
"rewrite_added": "تمت إضافة إعادة كتابة DNS لـ \"{{key}}\" بنجاح",
|
||||||
"rewrite_deleted": "تم حذف إعادة كتابة DNS لـ \"{{key}}\" بنجاح",
|
"rewrite_deleted": "تم حذف إعادة كتابة DNS لـ \"{{key}}\" بنجاح",
|
||||||
|
"rewrite_updated": "تم تحديث إعادة كتابة DNS بنجاح",
|
||||||
"rewrite_add": "إضافة إعادة كتابة DNS",
|
"rewrite_add": "إضافة إعادة كتابة DNS",
|
||||||
|
"rewrite_edit": "تحرير إعادة كتابة DNS",
|
||||||
"rewrite_not_found": "لم يتم العثور على إعادة كتابة DNS",
|
"rewrite_not_found": "لم يتم العثور على إعادة كتابة DNS",
|
||||||
"rewrite_confirm_delete": "هل أنت متأكد من أنك تريد حذف إعادة كتابة DNS لـ \"{{key}}\"؟",
|
"rewrite_confirm_delete": "هل أنت متأكد من أنك تريد حذف إعادة كتابة DNS لـ \"{{key}}\"؟",
|
||||||
"rewrite_desc": "يسمح بتكوين استجابة DNS المخصصة بسهولة لاسم نطاق معين.",
|
"rewrite_desc": "يسمح بتكوين استجابة DNS المخصصة بسهولة لاسم نطاق معين.",
|
||||||
@@ -506,7 +541,7 @@
|
|||||||
"encryption_key_source_content": "الصق محتويات المفتاح الخاص",
|
"encryption_key_source_content": "الصق محتويات المفتاح الخاص",
|
||||||
"stats_params": "ضبط الاحصائيات",
|
"stats_params": "ضبط الاحصائيات",
|
||||||
"config_successfully_saved": "تم حفظ الاعدادات بنجاح",
|
"config_successfully_saved": "تم حفظ الاعدادات بنجاح",
|
||||||
"interval_6_hour": "ساعات6",
|
"interval_6_hour": "6 ساعات",
|
||||||
"interval_24_hour": "24 ساعة",
|
"interval_24_hour": "24 ساعة",
|
||||||
"interval_days": "{{count}} يوم",
|
"interval_days": "{{count}} يوم",
|
||||||
"interval_days_plural": "{{count}} الأيام",
|
"interval_days_plural": "{{count}} الأيام",
|
||||||
@@ -517,14 +552,18 @@
|
|||||||
"filter_added_successfully": "تم إضافة القائمة بنجاح",
|
"filter_added_successfully": "تم إضافة القائمة بنجاح",
|
||||||
"filter_removed_successfully": "تم ازالته من القائمة بنجاح",
|
"filter_removed_successfully": "تم ازالته من القائمة بنجاح",
|
||||||
"filter_updated": "تم تحديث القائمة بنجاح",
|
"filter_updated": "تم تحديث القائمة بنجاح",
|
||||||
"statistics_configuration": "ضبط الاحصائيات",
|
"statistics_configuration": "تكوين الإحصائيات",
|
||||||
"statistics_retention": "الاحتفاظ بالإحصاءات",
|
"statistics_retention": "الاحتفاظ بالإحصاءات",
|
||||||
"statistics_retention_desc": "إذا قمت بتقليل قيمة الفاصل الزمني ، فستفقد بعض البيانات",
|
"statistics_retention_desc": "إذا قمت بتقليل قيمة الفاصل الزمني ، فستفقد بعض البيانات",
|
||||||
"statistics_clear": "إعادة تعيين الإحصائيات",
|
"statistics_clear": "إعادة تعيين الإحصائيات",
|
||||||
"statistics_clear_confirm": "هل أنت متأكد من أنك تريد مسح الإحصاءات؟",
|
"statistics_clear_confirm": "هل أنت متيقِّن من أنك تريد مسح الإحصائيات؟",
|
||||||
"statistics_retention_confirm": "هل أنت متأكد أنك تريد تغيير الاحتفاظ بالإحصاءات؟ إذا قمت بتقليل قيمة الفاصل الزمني ، فستفقد بعض البيانات",
|
"statistics_retention_confirm": "هل أنت متأكد أنك تريد تغيير الاحتفاظ بالإحصاءات؟ إذا قمت بتقليل قيمة الفاصل الزمني ، فستفقد بعض البيانات",
|
||||||
"statistics_cleared": "تم مسح الإحصائيات بنجاح",
|
"statistics_cleared": "تم مسح الإحصائيات بنجاح",
|
||||||
"statistics_enable": "تفعيل الاحصائيات",
|
"statistics_enable": "تفعيل الاحصائيات",
|
||||||
|
"ignore_domains": "المجالات التي تم تجاهلها (مفصولة بسطر جديد)",
|
||||||
|
"ignore_domains_title": "نطاقات تم تجاهلها",
|
||||||
|
"ignore_domains_desc_stats": "لا تتم كتابة الاستعلامات المطابقة لهذه القواعد في الإحصائيات",
|
||||||
|
"ignore_domains_desc_query": "لا تتم كتابة الاستعلامات المطابقة لهذه القواعد في سجل الاستعلامات",
|
||||||
"interval_hours": "{{count}} ساعة",
|
"interval_hours": "{{count}} ساعة",
|
||||||
"interval_hours_plural": "{{count}} ساعات",
|
"interval_hours_plural": "{{count}} ساعات",
|
||||||
"filters_configuration": "اضبط الفلاتر",
|
"filters_configuration": "اضبط الفلاتر",
|
||||||
@@ -597,20 +636,20 @@
|
|||||||
"dnssec_enable_desc": "قم بتعيين علامة DNSSEC في استعلامات DNS الواردة وتحقق من النتيجة (مطلوب محلل يدعم DNSSEC).",
|
"dnssec_enable_desc": "قم بتعيين علامة DNSSEC في استعلامات DNS الواردة وتحقق من النتيجة (مطلوب محلل يدعم DNSSEC).",
|
||||||
"validated_with_dnssec": "تم التحقق من صحتها باستخدام DNSSEC",
|
"validated_with_dnssec": "تم التحقق من صحتها باستخدام DNSSEC",
|
||||||
"all_queries": "كافة الاستفسارات",
|
"all_queries": "كافة الاستفسارات",
|
||||||
"show_blocked_responses": "حظر",
|
"show_blocked_responses": "ما تمّ حظره",
|
||||||
"show_whitelisted_responses": "القائمة البيضاء",
|
"show_whitelisted_responses": "المسموح به",
|
||||||
"show_processed_responses": "معالجة",
|
"show_processed_responses": "تمت معالجتها",
|
||||||
"blocked_safebrowsing": "محظور بواسطة التصفح الآمن",
|
"blocked_safebrowsing": "محظور بواسطة التصفح الآمن",
|
||||||
"blocked_adult_websites": "محظور بواسطة الرقابة الأبوية",
|
"blocked_adult_websites": "محظور بواسطة الرِّقابة الأبوية",
|
||||||
"blocked_threats": "التهديدات المحظورة",
|
"blocked_threats": "التهديدات المحظورة",
|
||||||
"allowed": "القائمة البيضاء",
|
"allowed": "المسموح به",
|
||||||
"filtered": "تمت الفلترة",
|
"filtered": "تمت الفلترة",
|
||||||
"rewritten": "أعيدت كتابته",
|
"rewritten": "أعيدت كتابته",
|
||||||
"safe_search": "البحث الأمن",
|
"safe_search": "البحث الآمن",
|
||||||
"blocklist": "قائمة الحظر",
|
"blocklist": "قائمة الحظر",
|
||||||
"milliseconds_abbreviation": "ms",
|
"milliseconds_abbreviation": "ms",
|
||||||
"cache_size": "حجم ذاكرة التخزين المؤقت",
|
"cache_size": "حجم ذاكرة التخزين المؤقت",
|
||||||
"cache_size_desc": "حجم ذاكرة التخزين المؤقت لنظام أسماء النطاقات (بالبايت).",
|
"cache_size_desc": "حجم ذاكرة التخزين المؤقت لنظام أسماء النطاق (بالبايت). لتعطيل التخزين المؤقت، اتركه فارغًا.",
|
||||||
"cache_ttl_min_override": "تجاوز الحد الأدنى من مدة البقاء TTL",
|
"cache_ttl_min_override": "تجاوز الحد الأدنى من مدة البقاء TTL",
|
||||||
"cache_ttl_max_override": "تجاوز الحد الاقصى من مدة البقاء TTL",
|
"cache_ttl_max_override": "تجاوز الحد الاقصى من مدة البقاء TTL",
|
||||||
"enter_cache_size": "أدخل حجم ذاكرة التخزين المؤقت (بايت)",
|
"enter_cache_size": "أدخل حجم ذاكرة التخزين المؤقت (بايت)",
|
||||||
@@ -621,14 +660,14 @@
|
|||||||
"ttl_cache_validation": "يجب أن يكون الحد الأدنى لتجاوز TTL لذاكرة التخزين المؤقت أقل من أو يساوي الحد الأقصى",
|
"ttl_cache_validation": "يجب أن يكون الحد الأدنى لتجاوز TTL لذاكرة التخزين المؤقت أقل من أو يساوي الحد الأقصى",
|
||||||
"cache_optimistic": "متفائل التخزين المؤقت",
|
"cache_optimistic": "متفائل التخزين المؤقت",
|
||||||
"cache_optimistic_desc": "اجعل AdGuard Home يستجيب من ذاكرة التخزين المؤقت حتى عندما تنتهي صلاحية الإدخالات وحاول أيضًا تحديثها.",
|
"cache_optimistic_desc": "اجعل AdGuard Home يستجيب من ذاكرة التخزين المؤقت حتى عندما تنتهي صلاحية الإدخالات وحاول أيضًا تحديثها.",
|
||||||
"filter_category_general": "General",
|
"filter_category_general": "عام",
|
||||||
"filter_category_security": "الامان",
|
"filter_category_security": "الأمان",
|
||||||
"filter_category_regional": "إقليمي",
|
"filter_category_regional": "إقليمي",
|
||||||
"filter_category_other": "أخرى",
|
"filter_category_other": "أخرى",
|
||||||
"filter_category_general_desc": "القوائم التي تمنع التتبع والإعلان على معظم الأجهزة",
|
"filter_category_general_desc": "القوائم التي تحظر التتبع والإعلانات على معظم الأجهزة",
|
||||||
"filter_category_security_desc": "القوائم المصممة خصيصًا لحظر النطاقات الخبيثة والتصيد الاحتيالي والخداع",
|
"filter_category_security_desc": "القوائم المصممة خصيصًا لحظر النطاقات الخبيثة والتصيد الاحتيالي والخداع",
|
||||||
"filter_category_regional_desc": "القوائم التي تركز على الإعلانات الإقليمية وخوادم التتبع",
|
"filter_category_regional_desc": "القوائم التي تركز على الإعلانات الإقليمية وخوادم التتبع",
|
||||||
"filter_category_other_desc": "قوائم حظر أخرى",
|
"filter_category_other_desc": "قوائم الحظر الأخرى",
|
||||||
"setup_config_to_enable_dhcp_server": "أضبط الاعدادات لتمكين خادم DHCP",
|
"setup_config_to_enable_dhcp_server": "أضبط الاعدادات لتمكين خادم DHCP",
|
||||||
"original_response": "الرد الأصلي",
|
"original_response": "الرد الأصلي",
|
||||||
"click_to_view_queries": "انقر لعرض الـ queries",
|
"click_to_view_queries": "انقر لعرض الـ queries",
|
||||||
@@ -637,16 +676,72 @@
|
|||||||
"filter_allowlist": "تحذير: سيؤدي هذا الإجراء أيضًا إلى استبعاد القاعدة \"{{disallowed_rule}}\" من قائمة العملاء المسموح لهم.",
|
"filter_allowlist": "تحذير: سيؤدي هذا الإجراء أيضًا إلى استبعاد القاعدة \"{{disallowed_rule}}\" من قائمة العملاء المسموح لهم.",
|
||||||
"last_rule_in_allowlist": "لا يمكن منع هذا العميل لأن استبعاد القاعدة \"{{disallowed_rule}}\" سيؤدي إلى تعطيل قائمة \"العملاء المسموح لهم\".",
|
"last_rule_in_allowlist": "لا يمكن منع هذا العميل لأن استبعاد القاعدة \"{{disallowed_rule}}\" سيؤدي إلى تعطيل قائمة \"العملاء المسموح لهم\".",
|
||||||
"use_saved_key": "استخدم المفتاح المحفوظ مسبقًا",
|
"use_saved_key": "استخدم المفتاح المحفوظ مسبقًا",
|
||||||
"parental_control": "الرقابة الابويه",
|
"parental_control": "الرِّقابة الأبوية",
|
||||||
"safe_browsing": "تصفح آمن",
|
"safe_browsing": "تصفح آمن",
|
||||||
"served_from_cache": "{{value}} <i>(يتم تقديمه من ذاكرة التخزين المؤقت)</i>",
|
"served_from_cache_label": "يتم تقديمه من ذاكرة التخزين المؤقت",
|
||||||
"form_error_password_length": "يجب أن تتكون كلمة المرور من {{value}} من الأحرف على الأقل",
|
"form_error_password_length": "يجب أن تتكون كلمة المرور من {{min}} إلى {{max}} من الأحرف في الأقل",
|
||||||
|
"anonymizer_notification": "<0>ملاحظة:</0> تم تمكين إخفاء هُوِيَّة IP. يمكنك تعطيله في <1>الإعدادات العامة</1>.",
|
||||||
|
"confirm_dns_cache_clear": "هل تريد بالتأكيد مسح ذاكرة التخزين المؤقت لنظام أسماء النطاقات DNS؟",
|
||||||
|
"cache_cleared": "تم مسح ذاكرة التخزين المؤقت لنظام أسماء النطاق بنجاح",
|
||||||
|
"clear_cache": "مسح ذاكرة التخزين المؤقت",
|
||||||
|
"make_static": "اجعلها ثابتة",
|
||||||
|
"theme_auto_desc": "تلقائي (بناءً على نظام ألوان جهازك)",
|
||||||
|
"theme_dark_desc": "المظهر الداكن",
|
||||||
|
"theme_light_desc": "المظهر فاتح",
|
||||||
|
"disable_for_seconds": "لـ {{count}} ثانية",
|
||||||
|
"disable_for_seconds_plural": "لمدة {{count}} ثانية",
|
||||||
|
"disable_for_minutes": "لمدة {{count}} دقيقة",
|
||||||
|
"disable_for_minutes_plural": "لمدة {{count}} دقيقة",
|
||||||
|
"disable_for_hours": "لمدة {{count}} ساعة",
|
||||||
|
"disable_for_hours_plural": "لمدة {{count}} ساعات",
|
||||||
|
"disable_until_tomorrow": "حتى الغد",
|
||||||
|
"disable_notify_for_seconds": "تعطيل الحماية لـ {{count}} ثانية",
|
||||||
|
"disable_notify_for_seconds_plural": "تعطيل الحماية ل {{count}} ثواني",
|
||||||
|
"disable_notify_for_minutes": "تعطيل الحماية لـ {{count}} دقيقة",
|
||||||
|
"disable_notify_for_minutes_plural": "تعطيل الحماية لـ {{count}} دقائق",
|
||||||
|
"disable_notify_for_hours": "تعطيل الحماية لـ {{count}} ساعة",
|
||||||
|
"disable_notify_for_hours_plural": "تعطيل الحماية لـ {{count}} ساعات",
|
||||||
|
"disable_notify_until_tomorrow": "تعطيل الحماية حتى الغد",
|
||||||
|
"enable_protection_timer": "سيتم تمكين الحماية في {{time}}",
|
||||||
|
"custom_retention_input": "أدخل الاحتفاظ بالساعات",
|
||||||
|
"custom_rotation_input": "أدخل التناوب بالساعات",
|
||||||
"protection_section_label": "الحماية",
|
"protection_section_label": "الحماية",
|
||||||
"sunday_short": "الاحد",
|
"log_and_stats_section_label": "سجل الاستعلام والإحصائيات",
|
||||||
|
"ignore_query_log": "تجاهل هذا العميل في سجل الاستعلام",
|
||||||
|
"ignore_statistics": "تجاهل هذا العميل في الإحصائيات",
|
||||||
|
"schedule_services": "إيقاف حظر الخدمة مؤقتًا",
|
||||||
|
"schedule_services_desc": "تهيئة جدول إيقاف فلتر خدمة الحظر",
|
||||||
|
"schedule_services_desc_client": "تهيئة جدول إيقاف فلتر خدمة الحظر لهذا العميل",
|
||||||
|
"schedule_desc": "تعيين فترات عدم النشاط للخدمات المحظورة",
|
||||||
|
"schedule_invalid_select": "يجب أن يكون وقت البَدْء قبل وقت الانتهاء",
|
||||||
|
"schedule_select_days": "اختر الأيام",
|
||||||
|
"schedule_timezone": "قم باختيار منطقة زمنية",
|
||||||
|
"schedule_current_timezone": "المنطقة الزمنية الحالية: {{value}}",
|
||||||
|
"schedule_time_all_day": "طوال اليوم",
|
||||||
|
"schedule_modal_description": "سيحل هذا الجدول الزمني محل أي جداول موجودة لنفس اليوم من الأسبوع. يمكن أن يكون لكل يوم من أيام الأسبوع مدّة خمول واحدة فقط.",
|
||||||
|
"schedule_modal_time_off": "لا يوجد حظر للخدمة:",
|
||||||
|
"schedule_new": "جدول زمني جديد",
|
||||||
|
"schedule_edit": "تحرير الجدول الزمني",
|
||||||
|
"schedule_save": "حفظ الجدول الزمني",
|
||||||
|
"schedule_add": "إضافة جدول زمني",
|
||||||
|
"schedule_remove": "إزالة الجدول الزمني",
|
||||||
|
"schedule_from": "من",
|
||||||
|
"schedule_to": "إلى",
|
||||||
|
"sunday": "الأحد",
|
||||||
|
"monday": "الإثنين",
|
||||||
|
"tuesday": "الثلاثاء",
|
||||||
|
"wednesday": "الأربعاء",
|
||||||
|
"thursday": "الخميس",
|
||||||
|
"friday": "الجمعة",
|
||||||
|
"saturday": "السبت",
|
||||||
|
"sunday_short": "الأحد",
|
||||||
"monday_short": "الإثنين",
|
"monday_short": "الإثنين",
|
||||||
"tuesday_short": "الثلاثاء",
|
"tuesday_short": "الثلاثاء",
|
||||||
"wednesday_short": "الاربعاء",
|
"wednesday_short": "الأربعاء",
|
||||||
"thursday_short": "الخميس",
|
"thursday_short": "الخميس",
|
||||||
"friday_short": "الجمعة",
|
"friday_short": "الجمعة",
|
||||||
"saturday_short": "السبت"
|
"saturday_short": "السبت",
|
||||||
|
"upstream_dns_cache_configuration": "تهيئة ذاكرة التخزين المؤقت لنظام أسماء النطاقات المستقبلي",
|
||||||
|
"enable_upstream_dns_cache": "تمكين التخزين المؤقت لنظام أسماء النطاقات DNS لتكوين المنبع المخصص لهذا العميل",
|
||||||
|
"dns_cache_size": "حجم ذاكرة التخزين المؤقت لنظام أسماء النطاقات، بالبايت"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -236,6 +236,7 @@
|
|||||||
"updated_upstream_dns_toast": "Upstream DNS-серверы абноўлены",
|
"updated_upstream_dns_toast": "Upstream DNS-серверы абноўлены",
|
||||||
"dns_test_ok_toast": "Паказаныя серверы DNS працуюць карэктна",
|
"dns_test_ok_toast": "Паказаныя серверы DNS працуюць карэктна",
|
||||||
"dns_test_not_ok_toast": "Сервер «{{key}}»: немагчыма выкарыстоўваць, праверце слушнасць напісання",
|
"dns_test_not_ok_toast": "Сервер «{{key}}»: немагчыма выкарыстоўваць, праверце слушнасць напісання",
|
||||||
|
"dns_test_parsing_error_toast": "Раздзел {{section}}: радок {{line}}: немагчыма выкарыстоўваць, праверце слушнасць напісання",
|
||||||
"dns_test_warning_toast": "Upstream «{{key}}» не адказвае на тэставыя запыты і можа не працаваць належным чынам",
|
"dns_test_warning_toast": "Upstream «{{key}}» не адказвае на тэставыя запыты і можа не працаваць належным чынам",
|
||||||
"unblock": "Адблакаваць",
|
"unblock": "Адблакаваць",
|
||||||
"block": "Заблакаваць",
|
"block": "Заблакаваць",
|
||||||
@@ -243,6 +244,7 @@
|
|||||||
"allow_this_client": "Дазволіць доступ гэтаму кліенту",
|
"allow_this_client": "Дазволіць доступ гэтаму кліенту",
|
||||||
"block_for_this_client_only": "Заблакаваць толькі для гэтага кліента",
|
"block_for_this_client_only": "Заблакаваць толькі для гэтага кліента",
|
||||||
"unblock_for_this_client_only": "Адблакаваць толькі для гэтага кліента",
|
"unblock_for_this_client_only": "Адблакаваць толькі для гэтага кліента",
|
||||||
|
"add_persistent_client": "Дадаць у захаваныя кліенты",
|
||||||
"time_table_header": "Час",
|
"time_table_header": "Час",
|
||||||
"date": "Дата",
|
"date": "Дата",
|
||||||
"domain_name_table_header": "Дамен",
|
"domain_name_table_header": "Дамен",
|
||||||
@@ -462,6 +464,7 @@
|
|||||||
"form_add_id": "Дадаць ідэнтыфікатар",
|
"form_add_id": "Дадаць ідэнтыфікатар",
|
||||||
"form_client_name": "Увядзіце імя кліента",
|
"form_client_name": "Увядзіце імя кліента",
|
||||||
"name": "Назва",
|
"name": "Назва",
|
||||||
|
"client_name": "Кліент {{id}}",
|
||||||
"client_global_settings": "Выкарыстаць глабальныя налады",
|
"client_global_settings": "Выкарыстаць глабальныя налады",
|
||||||
"client_deleted": "Кліент «{{key}}» паспяхова выдалены",
|
"client_deleted": "Кліент «{{key}}» паспяхова выдалены",
|
||||||
"client_added": "Кліент «{{key}}» паспяхова дададзены",
|
"client_added": "Кліент «{{key}}» паспяхова дададзены",
|
||||||
|
|||||||
@@ -159,6 +159,8 @@
|
|||||||
"dns_over_https": "DNS-пред-HTTPS",
|
"dns_over_https": "DNS-пред-HTTPS",
|
||||||
"dns_over_quic": "DNS-over-QUIC",
|
"dns_over_quic": "DNS-over-QUIC",
|
||||||
"plain_dns": "Обикновен DNS",
|
"plain_dns": "Обикновен DNS",
|
||||||
|
"theme_light": "Светла тема",
|
||||||
|
"theme_dark": "Тъмна тема",
|
||||||
"source_label": "Източник",
|
"source_label": "Източник",
|
||||||
"found_in_known_domain_db": "Намерен в списъците с домейни.",
|
"found_in_known_domain_db": "Намерен в списъците с домейни.",
|
||||||
"category_label": "Категория",
|
"category_label": "Категория",
|
||||||
@@ -282,6 +284,14 @@
|
|||||||
"blocklist": "Черен списък",
|
"blocklist": "Черен списък",
|
||||||
"filter_category_general": "General",
|
"filter_category_general": "General",
|
||||||
"filter_category_security": "Сигурност",
|
"filter_category_security": "Сигурност",
|
||||||
|
"filter_category_other": "Друго",
|
||||||
"port_53_faq_link": "Порт 53 често е зает от \"DNSStubListener\" или \"systemd-resolved\" услуги. Моля, прочетете <0>тази инструкция</0> как да решите това.",
|
"port_53_faq_link": "Порт 53 често е зает от \"DNSStubListener\" или \"systemd-resolved\" услуги. Моля, прочетете <0>тази инструкция</0> как да решите това.",
|
||||||
"parental_control": "Родителски контрол"
|
"parental_control": "Родителски контрол",
|
||||||
|
"sunday_short": "Нд",
|
||||||
|
"monday_short": "Пон",
|
||||||
|
"tuesday_short": "Вт",
|
||||||
|
"wednesday_short": "Ср",
|
||||||
|
"thursday_short": "Чт",
|
||||||
|
"friday_short": "Пт",
|
||||||
|
"saturday_short": "Съб"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6,21 +6,21 @@
|
|||||||
"upstream_parallel": "Použijte paralelní požadavky na urychlení řešení simultánním dotazováním na všechny navazující servery.",
|
"upstream_parallel": "Použijte paralelní požadavky na urychlení řešení simultánním dotazováním na všechny navazující servery.",
|
||||||
"parallel_requests": "Paralelní požadavky",
|
"parallel_requests": "Paralelní požadavky",
|
||||||
"load_balancing": "Optimalizace vytížení",
|
"load_balancing": "Optimalizace vytížení",
|
||||||
"load_balancing_desc": "Optimalizovaný dotaz na odchozí server. AdGuard Home použije vážený náhodný algoritmus k výběru serveru, takže nejrychlejší server je používán častěji.",
|
"load_balancing_desc": "Dotazy jednoho odchozího serveru ve stejný čas.<br/>AdGuard Home používá náhodný algoritmus pro výběr serverů s nejnižším počtem neúspěšných vyhledávání a nejnižší průměrnou dobou vyhledávání.",
|
||||||
"bootstrap_dns": "Bootstrap DNS servery",
|
"bootstrap_dns": "Bootstrap DNS servery",
|
||||||
"bootstrap_dns_desc": "IP adresy DNS serverů používaných k překladu IP adres řešitelů DoH/DoT, které zadáte jako odchozí servery. Komentáře nejsou povoleny.",
|
"bootstrap_dns_desc": "IP adresy DNS serverů používaných k překladu IP adres řešitelů DoH/DoT, které zadáte jako odchozí servery. Komentáře nejsou povoleny.",
|
||||||
"fallback_dns_title": "Záložní DNS servery",
|
"fallback_dns_title": "Záložní DNS servery",
|
||||||
"fallback_dns_desc": "Seznam záložních DNS serverů používaných v případě, že odchozí DNS servery neodpovídají. Syntaxe je stejná jako v hlavním poli pro odchozí servery výše.",
|
"fallback_dns_desc": "Seznam záložních DNS serverů používaných v případě, že odchozí DNS servery neodpovídají. Syntaxe je stejná jako v hlavním poli pro odchozí servery výše.",
|
||||||
"fallback_dns_placeholder": "Zadejte jeden záložní DNS server na řádek",
|
"fallback_dns_placeholder": "Zadejte jeden záložní DNS server na řádek",
|
||||||
"local_ptr_title": "Soukromé reverzní DNS servery",
|
"local_ptr_title": "Soukromé reverzní DNS servery",
|
||||||
"local_ptr_desc": "Servery DNS, které AdGuard Home používá pro lokální dotazy PTR. Tyto servery se používají k řešení požadavků PTR na adresy v soukromých rozmezích IP, například \"192.168.12.34\", pomocí reverzního DNS. Pokud není nastaveno, AdGuard Home automaticky použije výchozí řešitele vašeho OS s výjimkou adres samotného AdGuard Home.",
|
"local_ptr_desc": "DNS servery používané AdGuard Home pro soukromé požadavky PTR, SOA a NS. Požadavek je považován za soukromý, pokud požaduje doménu ARPA obsahující podsíť v rámci soukromých IP rozsahů (například \"192.168.12.34\") a pochází od klienta se soukromou IP adresou. Pokud není nastaveno, budou použity výchozí DNS řešitele vašeho operačního systému, s výjimkou IP adres AdGuard Home.",
|
||||||
"local_ptr_default_resolver": "Ve výchozím nastavení používá AdGuard Home následující reverzní DNS řešitele: {{ip}}.",
|
"local_ptr_default_resolver": "Ve výchozím nastavení používá AdGuard Home následující reverzní DNS řešitele: {{ip}}.",
|
||||||
"local_ptr_no_default_resolver": "AdGuard Home nemohl určit vhodné soukromé reverzní DNS řešitele pro tento systém.",
|
"local_ptr_no_default_resolver": "AdGuard Home nemohl určit vhodné soukromé reverzní DNS řešitele pro tento systém.",
|
||||||
"local_ptr_placeholder": "Zadejte jednu IP adresu na řádek",
|
"local_ptr_placeholder": "Zadejte jednu IP adresu na řádek",
|
||||||
"resolve_clients_title": "Povolit zpětné řešení IP adres klientů",
|
"resolve_clients_title": "Povolit zpětné řešení IP adres klientů",
|
||||||
"resolve_clients_desc": "Obráceně vyřešit IP adresy klientů na jejich názvy hostitelů zasláním dotazů PTR příslušným řešitelům (soukromé DNS servery pro místní klienty, odchozí servery pro klienty s veřejnou IP adresou).",
|
"resolve_clients_desc": "Obráceně vyřešit IP adresy klientů na jejich názvy hostitelů zasláním dotazů PTR příslušným řešitelům (soukromé DNS servery pro místní klienty, odchozí servery pro klienty s veřejnou IP adresou).",
|
||||||
"use_private_ptr_resolvers_title": "Použít soukromé reverzní rDNS řešitele",
|
"use_private_ptr_resolvers_title": "Použít soukromé reverzní rDNS řešitele",
|
||||||
"use_private_ptr_resolvers_desc": "Realizuje reverzní DNS vyhledávání pro lokální adresy pomocí těchto odchozích serverů. Pokud je funkce vypnuta, Adguard Home reaguje s NXDOMAIN na všechny takové PTR dotazy kromě klientů známých z DHCP, /etc/hosts, atd.",
|
"use_private_ptr_resolvers_desc": "Řešení požadavků PTR, SOA a NS pro domény ARPA obsahující soukromé IP adresy prostřednictvím soukromých odchozích serverů, DHCP, /etc/hosts atd. Pokud je zakázáno, AdGuard Home bude na všechny takové požadavky odpovídat pomocí NXDOMAIN.",
|
||||||
"check_dhcp_servers": "Zkontrolovat DHCP servery",
|
"check_dhcp_servers": "Zkontrolovat DHCP servery",
|
||||||
"save_config": "Uložit konfiguraci",
|
"save_config": "Uložit konfiguraci",
|
||||||
"enabled_dhcp": "DHCP server zapnutý",
|
"enabled_dhcp": "DHCP server zapnutý",
|
||||||
@@ -154,7 +154,7 @@
|
|||||||
"use_adguard_parental": "Použít službu AdGuard Rodičovská kontrola",
|
"use_adguard_parental": "Použít službu AdGuard Rodičovská kontrola",
|
||||||
"use_adguard_parental_hint": "AdGuard Home zkontroluje, zda doména obsahuje materiály pro dospělé. Používá stejné API přátelské k ochraně osobních údajů jako služba Bezpečnost prohlížení.",
|
"use_adguard_parental_hint": "AdGuard Home zkontroluje, zda doména obsahuje materiály pro dospělé. Používá stejné API přátelské k ochraně osobních údajů jako služba Bezpečnost prohlížení.",
|
||||||
"enforce_safe_search": "Použít bezpečné vyhledávání",
|
"enforce_safe_search": "Použít bezpečné vyhledávání",
|
||||||
"enforce_save_search_hint": "AdGuard Home vynutí bezpečné vyhledávání v následujících vyhledávačích: Google, YouTube, Bing, DuckDuckGo, Yandex, Pixabay.",
|
"enforce_save_search_hint": "AdGuard Home vynutí bezpečné vyhledávání v následujících vyhledávačích: Google, YouTube, Bing, DuckDuckGo, Ecosia, Yandex, Pixabay.",
|
||||||
"no_servers_specified": "Nebyly specifikovány žádné servery",
|
"no_servers_specified": "Nebyly specifikovány žádné servery",
|
||||||
"general_settings": "Obecná nastavení",
|
"general_settings": "Obecná nastavení",
|
||||||
"dns_settings": "Nastavení DNS",
|
"dns_settings": "Nastavení DNS",
|
||||||
@@ -236,6 +236,7 @@
|
|||||||
"updated_upstream_dns_toast": "Odchozí servery byly úspěšně uloženy",
|
"updated_upstream_dns_toast": "Odchozí servery byly úspěšně uloženy",
|
||||||
"dns_test_ok_toast": "Specifikované DNS servery pracují správně",
|
"dns_test_ok_toast": "Specifikované DNS servery pracují správně",
|
||||||
"dns_test_not_ok_toast": "Server \"{{key}}\": nemohl být použit, zkontrolujte, zda jste ho správně napsali",
|
"dns_test_not_ok_toast": "Server \"{{key}}\": nemohl být použit, zkontrolujte, zda jste ho správně napsali",
|
||||||
|
"dns_test_parsing_error_toast": "Sekce {{section}}: řádek {{line}}: nelze použít, zkontrolujte prosím, zda jste ho správně napsali",
|
||||||
"dns_test_warning_toast": "Upstream \"{{key}}\" neodpovídá na testovací požadavky a nemusí fungovat správně",
|
"dns_test_warning_toast": "Upstream \"{{key}}\" neodpovídá na testovací požadavky a nemusí fungovat správně",
|
||||||
"unblock": "Odblokovat",
|
"unblock": "Odblokovat",
|
||||||
"block": "Blokovat",
|
"block": "Blokovat",
|
||||||
@@ -243,6 +244,7 @@
|
|||||||
"allow_this_client": "Povolit tohoto klienta",
|
"allow_this_client": "Povolit tohoto klienta",
|
||||||
"block_for_this_client_only": "Blokovat pouze pro tohoto klienta",
|
"block_for_this_client_only": "Blokovat pouze pro tohoto klienta",
|
||||||
"unblock_for_this_client_only": "Odblokovat pouze pro tohoto klienta",
|
"unblock_for_this_client_only": "Odblokovat pouze pro tohoto klienta",
|
||||||
|
"add_persistent_client": "Přidat jako trvalého klienta",
|
||||||
"time_table_header": "Čas",
|
"time_table_header": "Čas",
|
||||||
"date": "Datum",
|
"date": "Datum",
|
||||||
"domain_name_table_header": "Název domény",
|
"domain_name_table_header": "Název domény",
|
||||||
@@ -292,6 +294,9 @@
|
|||||||
"blocked_response_ttl": "TTL blokované odezvy",
|
"blocked_response_ttl": "TTL blokované odezvy",
|
||||||
"blocked_response_ttl_desc": "Určuje, na kolik sekund by měli klienti ukládat filtrovanou odezvu do mezipaměti",
|
"blocked_response_ttl_desc": "Určuje, na kolik sekund by měli klienti ukládat filtrovanou odezvu do mezipaměti",
|
||||||
"form_enter_blocked_response_ttl": "Zadejte TTL blokované odezvy (v sekundách)",
|
"form_enter_blocked_response_ttl": "Zadejte TTL blokované odezvy (v sekundách)",
|
||||||
|
"upstream_timeout": "Časový limit odchozího serveru",
|
||||||
|
"upstream_timeout_desc": "Určuje počet sekund čekání na odpověď od odchozího serveru",
|
||||||
|
"form_enter_upstream_timeout": "Zadejte dobu časového limitu odchozího serveru v sekundách",
|
||||||
"dnscrypt": "DNSCrypt",
|
"dnscrypt": "DNSCrypt",
|
||||||
"dns_over_https": "DNS skrze HTTPS",
|
"dns_over_https": "DNS skrze HTTPS",
|
||||||
"dns_over_tls": "DNS skrze TLS",
|
"dns_over_tls": "DNS skrze TLS",
|
||||||
@@ -423,6 +428,9 @@
|
|||||||
"encryption_hostnames": "Názvy hostitelů",
|
"encryption_hostnames": "Názvy hostitelů",
|
||||||
"encryption_reset": "Opravdu chcete obnovit nastavení šifrování?",
|
"encryption_reset": "Opravdu chcete obnovit nastavení šifrování?",
|
||||||
"encryption_warning": "Varování",
|
"encryption_warning": "Varování",
|
||||||
|
"encryption_plain_dns_enable": "Povolit běžný DNS",
|
||||||
|
"encryption_plain_dns_desc": "Ve výchozím nastavení je povolen běžný DNS. Můžete ho zakázat, aby všechna zařízení používala šifrovaný DNS. Chcete-li to provést, musíte povolit alespoň jeden šifrovaný protokol DNS",
|
||||||
|
"encryption_plain_dns_error": "Chcete-li zakázat běžný DNS, povolte alespoň jeden šifrovaný protokol DNS",
|
||||||
"topline_expiring_certificate": "Váš SSL certifikát brzy vyprší. Aktualizujte <0>Nastavení šifrování</0>.",
|
"topline_expiring_certificate": "Váš SSL certifikát brzy vyprší. Aktualizujte <0>Nastavení šifrování</0>.",
|
||||||
"topline_expired_certificate": "Váš SSL certifikát vypršel. Aktualizujte <0>Nastavení šifrování</0>.",
|
"topline_expired_certificate": "Váš SSL certifikát vypršel. Aktualizujte <0>Nastavení šifrování</0>.",
|
||||||
"form_error_port_range": "Zadejte číslo portu v rozmezí 80-65535",
|
"form_error_port_range": "Zadejte číslo portu v rozmezí 80-65535",
|
||||||
@@ -462,6 +470,7 @@
|
|||||||
"form_add_id": "Přidat identifikátor",
|
"form_add_id": "Přidat identifikátor",
|
||||||
"form_client_name": "Zadejte název klienta",
|
"form_client_name": "Zadejte název klienta",
|
||||||
"name": "Název",
|
"name": "Název",
|
||||||
|
"client_name": "Klient {{id}}",
|
||||||
"client_global_settings": "Použít globální nastavení",
|
"client_global_settings": "Použít globální nastavení",
|
||||||
"client_deleted": "Klient \"{{key}}\" byl úspěšně odstraněn",
|
"client_deleted": "Klient \"{{key}}\" byl úspěšně odstraněn",
|
||||||
"client_added": "Klient \"{{key}}\" byl úspěšně přidán",
|
"client_added": "Klient \"{{key}}\" byl úspěšně přidán",
|
||||||
@@ -592,7 +601,7 @@
|
|||||||
"disable_ipv6": "Zakázat řešení IPv6 adres",
|
"disable_ipv6": "Zakázat řešení IPv6 adres",
|
||||||
"disable_ipv6_desc": "Odstranění všech dotazů DNS na adresy IPv6 (typ AAAA) a odstranění náznaků IPv6 z odpovědí HTTPS.",
|
"disable_ipv6_desc": "Odstranění všech dotazů DNS na adresy IPv6 (typ AAAA) a odstranění náznaků IPv6 z odpovědí HTTPS.",
|
||||||
"fastest_addr": "Nejrychlejší IP adresa",
|
"fastest_addr": "Nejrychlejší IP adresa",
|
||||||
"fastest_addr_desc": "Dotazovat všechny DNS servery a vrátit nejrychlejší IP adresu ze všech odpovědí. To zpomalí dotazy DNS, protože AdGuard Home musí čekat na odpovědi ze všech serverů DNS, ale celková konektivita se zlepší.",
|
"fastest_addr_desc": "Počká na odpovědi <b>všech</b> serverů DNS, změří rychlost připojení TCP pro každý server a vrátí IP adresu serveru s nejvyšší rychlostí připojení.<br/>Tento režim může výrazně zpomalit dotazy DNS, pokud jeden nebo více odchozích serverů neodpovídá. Ujistěte se, že vaše odchozí servery jsou stabilní a že časový limit odchozích serverů je nízký.",
|
||||||
"autofix_warning_text": "Pokud kliknete na „Opravit“, AdGuard Home nakonfiguruje váš systém tak, aby používal DNS server AdGuard Home.",
|
"autofix_warning_text": "Pokud kliknete na „Opravit“, AdGuard Home nakonfiguruje váš systém tak, aby používal DNS server AdGuard Home.",
|
||||||
"autofix_warning_list": "Jsou prováděny následující úlohy: <0>Deaktivace systému DNSStubListener</0> <0>Nastavení adresy serveru DNS na 127.0.0.1</0> <0>Nahrazení cíle symbolického odkazu z /etc/resolv.conf do /run/systemd/resolve/resolv.conf</0> <0>Zastavení služby DNSStubListener (znovu načtení služby systemd-resolved)</0>",
|
"autofix_warning_list": "Jsou prováděny následující úlohy: <0>Deaktivace systému DNSStubListener</0> <0>Nastavení adresy serveru DNS na 127.0.0.1</0> <0>Nahrazení cíle symbolického odkazu z /etc/resolv.conf do /run/systemd/resolve/resolv.conf</0> <0>Zastavení služby DNSStubListener (znovu načtení služby systemd-resolved)</0>",
|
||||||
"autofix_warning_result": "Výsledkem je, že všechny požadavky DNS z vašeho systému jsou ve výchozím nastavení zpracovány službou AdGuard Home.",
|
"autofix_warning_result": "Výsledkem je, že všechny požadavky DNS z vašeho systému jsou ve výchozím nastavení zpracovány službou AdGuard Home.",
|
||||||
@@ -672,7 +681,7 @@
|
|||||||
"use_saved_key": "Použít dříve uložený klíče",
|
"use_saved_key": "Použít dříve uložený klíče",
|
||||||
"parental_control": "Rodičovská ochrana",
|
"parental_control": "Rodičovská ochrana",
|
||||||
"safe_browsing": "Bezpečné prohlížení",
|
"safe_browsing": "Bezpečné prohlížení",
|
||||||
"served_from_cache": "{{value}} <i>(převzato z mezipaměti)</i>",
|
"served_from_cache_label": "Převzato z mezipaměti",
|
||||||
"form_error_password_length": "Heslo musí obsahovat od {{min}} do {{max}} znaků",
|
"form_error_password_length": "Heslo musí obsahovat od {{min}} do {{max}} znaků",
|
||||||
"anonymizer_notification": "<0>Poznámka:</0> Anonymizace IP je zapnuta. Můžete ji vypnout v <1>Obecných nastaveních</1>.",
|
"anonymizer_notification": "<0>Poznámka:</0> Anonymizace IP je zapnuta. Můžete ji vypnout v <1>Obecných nastaveních</1>.",
|
||||||
"confirm_dns_cache_clear": "Opravdu chcete vymazat mezipaměť DNS?",
|
"confirm_dns_cache_clear": "Opravdu chcete vymazat mezipaměť DNS?",
|
||||||
|
|||||||
@@ -6,21 +6,21 @@
|
|||||||
"upstream_parallel": "Brug parallelforespørgsler til at accelerere fortolkningen ved at forespørge alle upstream-servere samtidigt.",
|
"upstream_parallel": "Brug parallelforespørgsler til at accelerere fortolkningen ved at forespørge alle upstream-servere samtidigt.",
|
||||||
"parallel_requests": "Parallelle forespørgsler",
|
"parallel_requests": "Parallelle forespørgsler",
|
||||||
"load_balancing": "Belastningsfordeling",
|
"load_balancing": "Belastningsfordeling",
|
||||||
"load_balancing_desc": "Forespørg én server ad gangen. AdGuard Home vil bruge en vægtet randomiseringsalgoritme til valg af server, så den hurtigste server oftere anvendes.",
|
"load_balancing_desc": "Forespørg én upstream-server ad gangen.<br/>AdGuard Home bruger en vægtet tilfældighedsalgoritme til vælg af servere med det laveste antal fejlslagne opslag og den laveste gennemsnitlige opslagstid.",
|
||||||
"bootstrap_dns": "Bootstrap DNS-servere",
|
"bootstrap_dns": "Bootstrap DNS-servere",
|
||||||
"bootstrap_dns_desc": "IP-adresser på DNS-servere, som bruges til at opløse IP-adresser på de DoH/DoT-opløsere, som angives som upstreams. Kommentarer er ikke tilladt.",
|
"bootstrap_dns_desc": "IP-adresser på DNS-servere, som bruges til at opløse IP-adresser på de DoH/DoT-opløsere, som angives som upstreams. Kommentarer er ikke tilladt.",
|
||||||
"fallback_dns_title": "Reserve DNS-servere",
|
"fallback_dns_title": "Reserve DNS-servere",
|
||||||
"fallback_dns_desc": "Liste over reserve (fallback) DNS-servere, som bruges, når upstream DNS-servere ikke reagerer. Samme syntaks som i upstream-hovedfeltet ovenfor.",
|
"fallback_dns_desc": "Liste over reserve (fallback) DNS-servere, som bruges, når upstream DNS-servere ikke reagerer. Samme syntaks som i upstream-hovedfeltet ovenfor.",
|
||||||
"fallback_dns_placeholder": "Angiv én reserve DNS-server pr. linje",
|
"fallback_dns_placeholder": "Angiv én reserve DNS-server pr. linje",
|
||||||
"local_ptr_title": "Private reverse DNS-servere",
|
"local_ptr_title": "Private reverse DNS-servere",
|
||||||
"local_ptr_desc": "DNS-servere brugt af AdGuard Home til lokale PTR-forespørgsler. Disse servere bruges til at opløse PTR-forespørgsler fra private IP-adresseområder, f.eks. \"192.168.12.34\", vha. reverse DNS. Hvis ikke opsat, bruger AdGuard Home operativsystems standard DNS-opløsere undtagen for sine egne adresser.",
|
"local_ptr_desc": "DNS-serverne brugt af AdGuard Home til private PTR-, SOA- og NS-forespørgsler. En forespørgsel anses som privat, hvis den omhandler et ARPA-domæne indeholdende et undernet i et privat IP-områder, (såsom \"192.168.12.34\") og kommer fra en klient med en privat adresse. Hvis ikke opsat, bruger AdGuard Home OS'ets adresser på standard DNS-opløserne, bortset fra AdGuard Home-adresserne.",
|
||||||
"local_ptr_default_resolver": "AdGuard Home bruger som standard flg. reverse DNS-opløsere: {{ip}}.",
|
"local_ptr_default_resolver": "AdGuard Home bruger som standard flg. reverse DNS-opløsere: {{ip}}.",
|
||||||
"local_ptr_no_default_resolver": "AdGuard Home kunne ikke fastslå egnede private reverse DNS-opløsere for dette system.",
|
"local_ptr_no_default_resolver": "AdGuard Home kunne ikke fastslå egnede private reverse DNS-opløsere for dette system.",
|
||||||
"local_ptr_placeholder": "Angiv én IP-adresse pr. linje",
|
"local_ptr_placeholder": "Angiv én IP-adresse pr. linje",
|
||||||
"resolve_clients_title": "Aktivér omvendt løsning af klienters IP-adresser",
|
"resolve_clients_title": "Aktivér omvendt løsning af klienters IP-adresser",
|
||||||
"resolve_clients_desc": "Opløs klienters IP-adresser reverseret til deres værtsnavne ved at sende PTR-forespørgsler til korresponderende opløsere (private DNS-servere til lokale klienter, upstream-servere til klienter med offentlige IP-adresser).",
|
"resolve_clients_desc": "Opløs klienters IP-adresser reverseret til deres værtsnavne ved at sende PTR-forespørgsler til korresponderende opløsere (private DNS-servere til lokale klienter, upstream-servere til klienter med offentlige IP-adresser).",
|
||||||
"use_private_ptr_resolvers_title": "Brug private reverse DNS-opløsere",
|
"use_private_ptr_resolvers_title": "Brug private reverse DNS-opløsere",
|
||||||
"use_private_ptr_resolvers_desc": "Udfør reverse DNS-opslag for lokalt leverede adresser vha. disse upstream-servere. Hvis deaktiveret, svarer AdGuard Home med NXDOMAIN på alle sådanne PTR-forespørgsler bortset fra for klienter kendt via DHCP, /etc/hosts mv.",
|
"use_private_ptr_resolvers_desc": "Opløs PTR-, SOA- og NS-forespørgsler til ARPA-domæner indeholdende private adresser vha. private upstream-servere, DHCP, /etc/hosts mv. Hvis deaktiveret, besvarer AdGuard Home sådanne forespørgsler med NXDOMAIN.",
|
||||||
"check_dhcp_servers": "Søg efter DHCP-servere",
|
"check_dhcp_servers": "Søg efter DHCP-servere",
|
||||||
"save_config": "Gem opsætning",
|
"save_config": "Gem opsætning",
|
||||||
"enabled_dhcp": "DHCP-server aktiveret",
|
"enabled_dhcp": "DHCP-server aktiveret",
|
||||||
@@ -154,7 +154,7 @@
|
|||||||
"use_adguard_parental": "Brug AdGuards forældrekontrolwebtjeneste",
|
"use_adguard_parental": "Brug AdGuards forældrekontrolwebtjeneste",
|
||||||
"use_adguard_parental_hint": "AdGuard Home vil tjekke, om domænet indeholder voksenindhold vha. den samme fortrolighedsvenlige API som browsingsikkerhedswebtjenesten.",
|
"use_adguard_parental_hint": "AdGuard Home vil tjekke, om domænet indeholder voksenindhold vha. den samme fortrolighedsvenlige API som browsingsikkerhedswebtjenesten.",
|
||||||
"enforce_safe_search": "Brug sikker søgning",
|
"enforce_safe_search": "Brug sikker søgning",
|
||||||
"enforce_save_search_hint": "AdGuard Home vil håndhæve sikker søgning i flg. søgemaskiner: Google, YouTube, Bing, DuckDuckGo, Yandex og Pixabay.",
|
"enforce_save_search_hint": "AdGuard Home vil håndhæve sikker søgning i flg. søgemaskiner: Google, YouTube, Bing, DuckDuckGo, Ecosia, Yandex, Pixabay.",
|
||||||
"no_servers_specified": "Ingen servere angivet",
|
"no_servers_specified": "Ingen servere angivet",
|
||||||
"general_settings": "Generelle indstillinger",
|
"general_settings": "Generelle indstillinger",
|
||||||
"dns_settings": "DNS-indstillinger",
|
"dns_settings": "DNS-indstillinger",
|
||||||
@@ -236,6 +236,7 @@
|
|||||||
"updated_upstream_dns_toast": "Upstream-servere er gemt",
|
"updated_upstream_dns_toast": "Upstream-servere er gemt",
|
||||||
"dns_test_ok_toast": "Angivne DNS-servere fungerer korrekt",
|
"dns_test_ok_toast": "Angivne DNS-servere fungerer korrekt",
|
||||||
"dns_test_not_ok_toast": "Server \"{{key}}\": Kunne ikke bruges. Tjek, at du har angivet den korrekt",
|
"dns_test_not_ok_toast": "Server \"{{key}}\": Kunne ikke bruges. Tjek, at du har angivet den korrekt",
|
||||||
|
"dns_test_parsing_error_toast": "Sektion {{section}}: linje {{line}}: kunne ikke anvendes. Tjek at den er angivet korrekt",
|
||||||
"dns_test_warning_toast": "Upstream \"{{key}}\" svarer ikke på testforespørgsler og fungerer muligvis ikke korrekt",
|
"dns_test_warning_toast": "Upstream \"{{key}}\" svarer ikke på testforespørgsler og fungerer muligvis ikke korrekt",
|
||||||
"unblock": "Afblokering",
|
"unblock": "Afblokering",
|
||||||
"block": "Blokering",
|
"block": "Blokering",
|
||||||
@@ -243,6 +244,7 @@
|
|||||||
"allow_this_client": "Tillad denne klient",
|
"allow_this_client": "Tillad denne klient",
|
||||||
"block_for_this_client_only": "Blokér kun for denne klient",
|
"block_for_this_client_only": "Blokér kun for denne klient",
|
||||||
"unblock_for_this_client_only": "Afblokér kun for denne klient",
|
"unblock_for_this_client_only": "Afblokér kun for denne klient",
|
||||||
|
"add_persistent_client": "Tilføj som vedvarende klient",
|
||||||
"time_table_header": "Tid",
|
"time_table_header": "Tid",
|
||||||
"date": "Dato",
|
"date": "Dato",
|
||||||
"domain_name_table_header": "Domænenavn",
|
"domain_name_table_header": "Domænenavn",
|
||||||
@@ -292,6 +294,9 @@
|
|||||||
"blocked_response_ttl": "Blokeret svar TTL",
|
"blocked_response_ttl": "Blokeret svar TTL",
|
||||||
"blocked_response_ttl_desc": "Angiver, i hvor mange sekunder klienterne skal cache-lagre et filtreret svar",
|
"blocked_response_ttl_desc": "Angiver, i hvor mange sekunder klienterne skal cache-lagre et filtreret svar",
|
||||||
"form_enter_blocked_response_ttl": "Angiv blokeringssvar TTL (sekunder)",
|
"form_enter_blocked_response_ttl": "Angiv blokeringssvar TTL (sekunder)",
|
||||||
|
"upstream_timeout": "Upstream-timeout",
|
||||||
|
"upstream_timeout_desc": "Angiver antallet af sekunder, der skal ventes på et svar fra upstream-serveren",
|
||||||
|
"form_enter_upstream_timeout": "Angiv varigheden af upstream-server timeout i sekunder",
|
||||||
"dnscrypt": "DNSCrypt",
|
"dnscrypt": "DNSCrypt",
|
||||||
"dns_over_https": "DNS-over-HTTPS",
|
"dns_over_https": "DNS-over-HTTPS",
|
||||||
"dns_over_tls": "DNS-over-TLS",
|
"dns_over_tls": "DNS-over-TLS",
|
||||||
@@ -423,6 +428,9 @@
|
|||||||
"encryption_hostnames": "Værtsnavne",
|
"encryption_hostnames": "Værtsnavne",
|
||||||
"encryption_reset": "Sikker på, at du vil nulstille krypteringsindstillingerne?",
|
"encryption_reset": "Sikker på, at du vil nulstille krypteringsindstillingerne?",
|
||||||
"encryption_warning": "Advarsel",
|
"encryption_warning": "Advarsel",
|
||||||
|
"encryption_plain_dns_enable": "Aktivér almindelig DNS",
|
||||||
|
"encryption_plain_dns_desc": "Almindelig DNS er aktiveret som standard. Den kan deaktiveres for at tvinge alle enheder til at bruge krypteret DNS. For at gøre dette, aktivér mindst én krypteret DNS-protokol",
|
||||||
|
"encryption_plain_dns_error": "Aktivér mindst én krypteret DNS-protokol for at deaktivere almindelig DNS",
|
||||||
"topline_expiring_certificate": "Dit SSL-certifikat er ved at udløbe. Opdatér <0>Krypteringsindstillinger</0>.",
|
"topline_expiring_certificate": "Dit SSL-certifikat er ved at udløbe. Opdatér <0>Krypteringsindstillinger</0>.",
|
||||||
"topline_expired_certificate": "Dit SSL-certifikat er udløbet. Opdatér <0>Krypteringsindstillinger</0>.",
|
"topline_expired_certificate": "Dit SSL-certifikat er udløbet. Opdatér <0>Krypteringsindstillinger</0>.",
|
||||||
"form_error_port_range": "Angiv portnummer i intervallet 80-65535",
|
"form_error_port_range": "Angiv portnummer i intervallet 80-65535",
|
||||||
@@ -462,6 +470,7 @@
|
|||||||
"form_add_id": "Tilføj identifikator",
|
"form_add_id": "Tilføj identifikator",
|
||||||
"form_client_name": "Angiv klientnavn",
|
"form_client_name": "Angiv klientnavn",
|
||||||
"name": "Navn",
|
"name": "Navn",
|
||||||
|
"client_name": "Klient {{id}}",
|
||||||
"client_global_settings": "Brug globale indstillinger",
|
"client_global_settings": "Brug globale indstillinger",
|
||||||
"client_deleted": "Klient \"{{key}}\" slettet",
|
"client_deleted": "Klient \"{{key}}\" slettet",
|
||||||
"client_added": "Klient \"{{key}}\" tilføjet",
|
"client_added": "Klient \"{{key}}\" tilføjet",
|
||||||
@@ -592,7 +601,7 @@
|
|||||||
"disable_ipv6": "Deaktivér IPv6-adresseopløsning",
|
"disable_ipv6": "Deaktivér IPv6-adresseopløsning",
|
||||||
"disable_ipv6_desc": "Drop alle DNS-forespørgsler for IPv6-adresser (type AAAA), og fjern IPv6-tips fra HTTPS-svar.",
|
"disable_ipv6_desc": "Drop alle DNS-forespørgsler for IPv6-adresser (type AAAA), og fjern IPv6-tips fra HTTPS-svar.",
|
||||||
"fastest_addr": "Hurtigste IP-adresse",
|
"fastest_addr": "Hurtigste IP-adresse",
|
||||||
"fastest_addr_desc": "Forespørger alle DNS-servere og returner den hurtigste IP-adresse blandt alle svar. Dette vil gøre DNS-forespørgslerne langsommere grundet afventning af svar fra alle DNS-servere, men forbedrer samlet set forbindelsen.",
|
"fastest_addr_desc": "Vent på svar fra <b>alle</b> DNS-servere, mål TCP-forbindelseshastigheden for hver server, og returner IP-adressen på serveren med den hurtigste forbindelseshastighed.<br/>Denne tilstand kan sinke DNS-forespørgsler, betydeligt hvis en eller flere upstream-servere ikke svarer. Sørg for, at upstream-serverene er stabile, og at upstream-timeouten er lav.",
|
||||||
"autofix_warning_text": "Klikker du på \"Reparér\", opsætter AdGuard Home dit system til brug med AdGuard Home DNS-server.",
|
"autofix_warning_text": "Klikker du på \"Reparér\", opsætter AdGuard Home dit system til brug med AdGuard Home DNS-server.",
|
||||||
"autofix_warning_list": "Den vil udføre disse opgaver: <0>Deaktivere system DNSStubListener</0> <0>Opsætte DNS-serveradressen til 127.0.0.1</0> <0>Erstatte symbolsk linkmål for /etc/resolv.conf med /run/systemd/resolve/resolv.conf</0> <0>Stoppe DNSStubListener (genindlæs systemd-opløst tjeneste)</0>",
|
"autofix_warning_list": "Den vil udføre disse opgaver: <0>Deaktivere system DNSStubListener</0> <0>Opsætte DNS-serveradressen til 127.0.0.1</0> <0>Erstatte symbolsk linkmål for /etc/resolv.conf med /run/systemd/resolve/resolv.conf</0> <0>Stoppe DNSStubListener (genindlæs systemd-opløst tjeneste)</0>",
|
||||||
"autofix_warning_result": "Det betyder, at alle DNS-forespørgsler fra dit system som standard behandles af AdGuard Home.",
|
"autofix_warning_result": "Det betyder, at alle DNS-forespørgsler fra dit system som standard behandles af AdGuard Home.",
|
||||||
@@ -672,7 +681,7 @@
|
|||||||
"use_saved_key": "Brug den tidligere gemte nøgle",
|
"use_saved_key": "Brug den tidligere gemte nøgle",
|
||||||
"parental_control": "Forældrekontrol",
|
"parental_control": "Forældrekontrol",
|
||||||
"safe_browsing": "Sikker Browsing",
|
"safe_browsing": "Sikker Browsing",
|
||||||
"served_from_cache": "{{value}} <i>(leveret fra cache)</i>",
|
"served_from_cache_label": "Leveret fra cache",
|
||||||
"form_error_password_length": "Adgangskode skal udgøre fra {{min}} til {{max}} tegn",
|
"form_error_password_length": "Adgangskode skal udgøre fra {{min}} til {{max}} tegn",
|
||||||
"anonymizer_notification": "<0>Bemærk:</0> IP-anonymisering er aktiveret. Det kan deaktiveres via <1>Generelle indstillinger</1>.",
|
"anonymizer_notification": "<0>Bemærk:</0> IP-anonymisering er aktiveret. Det kan deaktiveres via <1>Generelle indstillinger</1>.",
|
||||||
"confirm_dns_cache_clear": "Sikker på, at DNS-cache skal ryddes?",
|
"confirm_dns_cache_clear": "Sikker på, at DNS-cache skal ryddes?",
|
||||||
|
|||||||
@@ -6,21 +6,21 @@
|
|||||||
"upstream_parallel": "Parallele Abfragen verwenden, um das Auflösen zu beschleunigen, indem alle Upstream-Server gleichzeitig abgefragt werden.",
|
"upstream_parallel": "Parallele Abfragen verwenden, um das Auflösen zu beschleunigen, indem alle Upstream-Server gleichzeitig abgefragt werden.",
|
||||||
"parallel_requests": "Paralleles Abfragen",
|
"parallel_requests": "Paralleles Abfragen",
|
||||||
"load_balancing": "Lastverteilung",
|
"load_balancing": "Lastverteilung",
|
||||||
"load_balancing_desc": "Einen Server nach dem anderen abfragen. AdGuard Home verwendet den gewichteten Zufallsalgorithmus, um den Server so auszuwählen, dass der schnellste Server häufiger verwendet wird.",
|
"load_balancing_desc": "Es wird jeweils ein Upstream-Server abgefragt.<br/> AdGuard Home verwendet einen gewichteten Zufallsalgorithmus, um die Server mit der geringsten Anzahl an fehlgeschlagenen Suchvorgängen und der niedrigsten durchschnittlichen Suchzeit auszuwählen.",
|
||||||
"bootstrap_dns": "Bootstrap-DNS-Server",
|
"bootstrap_dns": "Bootstrap-DNS-Server",
|
||||||
"bootstrap_dns_desc": "IP-Adressen der DNS-Server, die zum Auflösen der IP-Adressen von DoH/DoT Upstream-Servern verwendet werden, die Sie angegeben haben. Kommentare sind nicht erlaubt.",
|
"bootstrap_dns_desc": "IP-Adressen der DNS-Server, die zum Auflösen der IP-Adressen von DoH/DoT Upstream-Servern verwendet werden, die Sie angegeben haben. Kommentare sind nicht erlaubt.",
|
||||||
"fallback_dns_title": "Fallback-DNS-Server",
|
"fallback_dns_title": "Fallback-DNS-Server",
|
||||||
"fallback_dns_desc": "Liste der Fallback-DNS-Server, die verwendet werden, wenn die Upstream-DNS-Server nicht antworten. Die Syntax ist die gleiche wie im Hauptfeld für Upstream-Server oben.",
|
"fallback_dns_desc": "Liste der Fallback-DNS-Server, die verwendet werden, wenn die Upstream-DNS-Server nicht antworten. Die Syntax ist die gleiche wie im Hauptfeld für Upstream-Server oben.",
|
||||||
"fallback_dns_placeholder": "Geben Sie einen Fallback-DNS-Server pro Zeile ein",
|
"fallback_dns_placeholder": "Geben Sie einen Fallback-DNS-Server pro Zeile ein",
|
||||||
"local_ptr_title": "Private inverse DNS-Server",
|
"local_ptr_title": "Private inverse DNS-Server",
|
||||||
"local_ptr_desc": "Die DNS-Server, die AdGuard Home für lokale PTR-Abfragen verwendet. Diese Server werden verwendet, um die Hostnamen von Clients mit privaten IP-Adressen, z. B. „192.168.12.34“, per inverse DNS-Anfragen aufzulösen. Wenn nicht festgelegt, verwendet AdGuard Home die Adressen der Standard-DNS-Auflöser Ihres Betriebssystems mit Ausnahme der Adressen von AdGuard Home selbst.",
|
"local_ptr_desc": "Von AdGuard Home verwendete DNS-Server für private PTR-, SOA- und NS-Anfragen. Eine Anfrage gilt als privat, wenn sie nach einer ARPA-Domain fragt, die ein Subnetz innerhalb privater IP-Bereiche enthält (z. B. „192.168.12.34“) und von einem Client mit privater IP-Adresse stammt. Wenn nicht eingestellt, werden die Standard-DNS-Auflöser Ihres Betriebssystems verwendet, außer für die IP-Adressen von AdGuard Home.",
|
||||||
"local_ptr_default_resolver": "Standardmäßig verwendet AdGuard Home die folgenden inversen DNS-Resolver: {{ip}}.",
|
"local_ptr_default_resolver": "Standardmäßig verwendet AdGuard Home die folgenden inversen DNS-Resolver: {{ip}}.",
|
||||||
"local_ptr_no_default_resolver": "AdGuard Home konnte keine geeigneten privaten Invers-DNS-Resolver für dieses System ermitteln.",
|
"local_ptr_no_default_resolver": "AdGuard Home konnte keine geeigneten privaten Invers-DNS-Resolver für dieses System ermitteln.",
|
||||||
"local_ptr_placeholder": "Geben Sie eine IP-Adresse pro Zeile ein",
|
"local_ptr_placeholder": "Geben Sie eine IP-Adresse pro Zeile ein",
|
||||||
"resolve_clients_title": "Hostnamenauflösung der Clients aktivieren",
|
"resolve_clients_title": "Hostnamenauflösung der Clients aktivieren",
|
||||||
"resolve_clients_desc": "Inverses Auflösen der IP-Adressen der Clients in ihre Hostnamen durch Senden von PTR-Anfragen an die entsprechenden Resolver (private DNS-Server für lokale Kunden, Upstream-Server für Kunden mit öffentlichen IP-Adressen).",
|
"resolve_clients_desc": "Inverses Auflösen der IP-Adressen der Clients in ihre Hostnamen durch Senden von PTR-Anfragen an die entsprechenden Resolver (private DNS-Server für lokale Kunden, Upstream-Server für Kunden mit öffentlichen IP-Adressen).",
|
||||||
"use_private_ptr_resolvers_title": "Private Reverse-DNS-Resolver verwenden",
|
"use_private_ptr_resolvers_title": "Private Reverse-DNS-Resolver verwenden",
|
||||||
"use_private_ptr_resolvers_desc": "Führt inverse DNS-Abfragen für lokal bereitgestellte Adressen mit diesen Upstream-Servern durch. Wenn deaktiviert, antwortet AdGuard Home mit NXDOMAIN auf alle solchen PTR-Anfragen, außer für Clients, die über DHCP, /etc/hosts usw. bekannt sind.",
|
"use_private_ptr_resolvers_desc": "Löst PTR-, SOA- und NS-Anfragen für ARD-Domains mit privaten IP-Adressen über private Upstream-Server, DHCP, /etc/hosts usw. auf. Ist diese Option deaktiviert, antwortet AdGuard Home auf alle derartigen Anfragen mit NXDOMAIN.",
|
||||||
"check_dhcp_servers": "Auf DHCP-Server prüfen",
|
"check_dhcp_servers": "Auf DHCP-Server prüfen",
|
||||||
"save_config": "Konfiguration speichern",
|
"save_config": "Konfiguration speichern",
|
||||||
"enabled_dhcp": "DHCP-Server aktiviert",
|
"enabled_dhcp": "DHCP-Server aktiviert",
|
||||||
@@ -89,7 +89,7 @@
|
|||||||
"form_enter_hostname": "Gerätenamen eingeben",
|
"form_enter_hostname": "Gerätenamen eingeben",
|
||||||
"error_details": "Fehlerdetails",
|
"error_details": "Fehlerdetails",
|
||||||
"response_details": "Einzelheiten der Antwort",
|
"response_details": "Einzelheiten der Antwort",
|
||||||
"request_details": "Einzelheiten der Anfrage",
|
"request_details": "Informationen zur Anfrage",
|
||||||
"client_details": "Einzelheiten des Clients",
|
"client_details": "Einzelheiten des Clients",
|
||||||
"details": "Details",
|
"details": "Details",
|
||||||
"back": "Zurück",
|
"back": "Zurück",
|
||||||
@@ -121,7 +121,7 @@
|
|||||||
"stats_adult": "Gesperrte jugendgefährdende Websites",
|
"stats_adult": "Gesperrte jugendgefährdende Websites",
|
||||||
"stats_query_domain": "Am häufigsten angefragte Domains",
|
"stats_query_domain": "Am häufigsten angefragte Domains",
|
||||||
"for_last_hours": "in die letzte {{count}} Stunde",
|
"for_last_hours": "in die letzte {{count}} Stunde",
|
||||||
"for_last_hours_plural": "in die letzten {{count}} Stunden",
|
"for_last_hours_plural": "in den letzten {{count}} Stunden",
|
||||||
"for_last_days": "am letzten {{count}} Tag",
|
"for_last_days": "am letzten {{count}} Tag",
|
||||||
"for_last_days_plural": "in den letzten {{count}} Tage",
|
"for_last_days_plural": "in den letzten {{count}} Tage",
|
||||||
"stats_disabled": "Die Statistik wurde deaktiviert. Sie können diese in den <0>Einstellungen</0> erneut aktivieren.",
|
"stats_disabled": "Die Statistik wurde deaktiviert. Sie können diese in den <0>Einstellungen</0> erneut aktivieren.",
|
||||||
@@ -154,7 +154,7 @@
|
|||||||
"use_adguard_parental": "AdGuard Webservice für Kindersicherung verwenden",
|
"use_adguard_parental": "AdGuard Webservice für Kindersicherung verwenden",
|
||||||
"use_adguard_parental_hint": "AdGuard Home wird prüfen, ob die Domain jugendgefährdende Inhalte enthält. Zum Schutz Ihrer Privatsphäre wird die selbe API wie für den Webservice für Internetsicherheit verwendet.",
|
"use_adguard_parental_hint": "AdGuard Home wird prüfen, ob die Domain jugendgefährdende Inhalte enthält. Zum Schutz Ihrer Privatsphäre wird die selbe API wie für den Webservice für Internetsicherheit verwendet.",
|
||||||
"enforce_safe_search": "Sichere Suche verwenden",
|
"enforce_safe_search": "Sichere Suche verwenden",
|
||||||
"enforce_save_search_hint": "AdGuard kann Sichere Suche für folgende Suchmaschinen erzwingen: Google, YouTube, Bing, DuckDuckGo, Yandex und Pixabay.",
|
"enforce_save_search_hint": "AdGuard kann Sichere Suche für folgende Suchmaschinen erzwingen: Google, YouTube, Bing, DuckDuckGo, Ecosia, Yandex und Pixabay.",
|
||||||
"no_servers_specified": "Keine Server festgelegt",
|
"no_servers_specified": "Keine Server festgelegt",
|
||||||
"general_settings": "Allgemeine Einstellungen",
|
"general_settings": "Allgemeine Einstellungen",
|
||||||
"dns_settings": "DNS-Einstellungen",
|
"dns_settings": "DNS-Einstellungen",
|
||||||
@@ -236,6 +236,7 @@
|
|||||||
"updated_upstream_dns_toast": "Upstream-Server erfolgreich gespeichert",
|
"updated_upstream_dns_toast": "Upstream-Server erfolgreich gespeichert",
|
||||||
"dns_test_ok_toast": "Angegebene DNS-Server arbeiten ordnungsgemäß",
|
"dns_test_ok_toast": "Angegebene DNS-Server arbeiten ordnungsgemäß",
|
||||||
"dns_test_not_ok_toast": "Server „{{key}}“: konnte nicht verwendet werden, bitte überprüfen Sie die korrekte Schreibweise",
|
"dns_test_not_ok_toast": "Server „{{key}}“: konnte nicht verwendet werden, bitte überprüfen Sie die korrekte Schreibweise",
|
||||||
|
"dns_test_parsing_error_toast": "Abschnitt {{section}}: Zeile {{line}}: konnte nicht verwendet werden, bitte überprüfen Sie, ob alles richtig geschrieben ist",
|
||||||
"dns_test_warning_toast": "Upstream „{{key}}“ reagiert nicht auf Testanfragen und funktioniert möglicherweise nicht fehlerfrei",
|
"dns_test_warning_toast": "Upstream „{{key}}“ reagiert nicht auf Testanfragen und funktioniert möglicherweise nicht fehlerfrei",
|
||||||
"unblock": "Entsperren",
|
"unblock": "Entsperren",
|
||||||
"block": "Sperren",
|
"block": "Sperren",
|
||||||
@@ -243,6 +244,7 @@
|
|||||||
"allow_this_client": "Diesen Client zulassen",
|
"allow_this_client": "Diesen Client zulassen",
|
||||||
"block_for_this_client_only": "Nur für diesen Client sperren",
|
"block_for_this_client_only": "Nur für diesen Client sperren",
|
||||||
"unblock_for_this_client_only": "Nur für diesen Client freigeben",
|
"unblock_for_this_client_only": "Nur für diesen Client freigeben",
|
||||||
|
"add_persistent_client": "Als dauerhaften Client hinzufügen",
|
||||||
"time_table_header": "Zeit",
|
"time_table_header": "Zeit",
|
||||||
"date": "Datum",
|
"date": "Datum",
|
||||||
"domain_name_table_header": "Domainname",
|
"domain_name_table_header": "Domainname",
|
||||||
@@ -260,7 +262,7 @@
|
|||||||
"next_btn": "Nächste",
|
"next_btn": "Nächste",
|
||||||
"loading_table_status": "Wird geladen …",
|
"loading_table_status": "Wird geladen …",
|
||||||
"page_table_footer_text": "Seite",
|
"page_table_footer_text": "Seite",
|
||||||
"rows_table_footer_text": "Reihen",
|
"rows_table_footer_text": "Zeilen",
|
||||||
"updated_custom_filtering_toast": "Benutzerdefinierten Filterregeln erfolgreich gespeichert",
|
"updated_custom_filtering_toast": "Benutzerdefinierten Filterregeln erfolgreich gespeichert",
|
||||||
"rule_removed_from_custom_filtering_toast": "Regel wurde aus den benutzerdefinierten Filterregeln entfernt: {{rule}}",
|
"rule_removed_from_custom_filtering_toast": "Regel wurde aus den benutzerdefinierten Filterregeln entfernt: {{rule}}",
|
||||||
"rule_added_to_custom_filtering_toast": "Regel wurde zu den benutzerdefinierten Filterregeln hinzugefügt: {{rule}}",
|
"rule_added_to_custom_filtering_toast": "Regel wurde zu den benutzerdefinierten Filterregeln hinzugefügt: {{rule}}",
|
||||||
@@ -292,6 +294,9 @@
|
|||||||
"blocked_response_ttl": "Gültigkeitsdauer der blockierten Antwort",
|
"blocked_response_ttl": "Gültigkeitsdauer der blockierten Antwort",
|
||||||
"blocked_response_ttl_desc": "Gibt an, wie viele Sekunden lang die Clients eine gefilterte Antwort zwischenspeichern sollen",
|
"blocked_response_ttl_desc": "Gibt an, wie viele Sekunden lang die Clients eine gefilterte Antwort zwischenspeichern sollen",
|
||||||
"form_enter_blocked_response_ttl": "Geben Sie die Gültigkeitsdauer für blockierte Antworten ein (in Sekunden)",
|
"form_enter_blocked_response_ttl": "Geben Sie die Gültigkeitsdauer für blockierte Antworten ein (in Sekunden)",
|
||||||
|
"upstream_timeout": "Upstream-Timeout",
|
||||||
|
"upstream_timeout_desc": "Gibt die Anzahl der Sekunden an, die auf eine Antwort des Upstream-Servers gewartet werden soll",
|
||||||
|
"form_enter_upstream_timeout": "Geben Sie die Timeout-Dauer des Upstream-Servers in Sekunden ein",
|
||||||
"dnscrypt": "DNSCrypt",
|
"dnscrypt": "DNSCrypt",
|
||||||
"dns_over_https": "DNS-over-HTTPS",
|
"dns_over_https": "DNS-over-HTTPS",
|
||||||
"dns_over_tls": "DNS-over-TLS",
|
"dns_over_tls": "DNS-over-TLS",
|
||||||
@@ -423,6 +428,9 @@
|
|||||||
"encryption_hostnames": "Hostnamen",
|
"encryption_hostnames": "Hostnamen",
|
||||||
"encryption_reset": "Möchten Sie die Verschlüsselungseinstellungen wirklich zurücksetzen?",
|
"encryption_reset": "Möchten Sie die Verschlüsselungseinstellungen wirklich zurücksetzen?",
|
||||||
"encryption_warning": "Warnhinweis",
|
"encryption_warning": "Warnhinweis",
|
||||||
|
"encryption_plain_dns_enable": "Einfaches DNS aktivieren",
|
||||||
|
"encryption_plain_dns_desc": "Einfaches DNS ist standardmäßig aktiviert. Sie können es deaktivieren, um alle Geräte zu zwingen, verschlüsseltes DNS zu verwenden. Dazu müssen Sie mindestens ein verschlüsseltes DNS-Protokoll aktivieren",
|
||||||
|
"encryption_plain_dns_error": "Um einfaches DNS zu deaktivieren, aktivieren Sie mindestens ein verschlüsseltes DNS-Protokoll",
|
||||||
"topline_expiring_certificate": "Ihr SSL-Zertifikat läuft demnächst ab. Aktualisieren Sie Ihre <0>Verschlüsselungseinstellungen</0>.",
|
"topline_expiring_certificate": "Ihr SSL-Zertifikat läuft demnächst ab. Aktualisieren Sie Ihre <0>Verschlüsselungseinstellungen</0>.",
|
||||||
"topline_expired_certificate": "Ihr SSL-Zertifikat ist abgelaufen. Aktualisieren Sie Ihre <0>Verschlüsselungseinstellungen</0>.",
|
"topline_expired_certificate": "Ihr SSL-Zertifikat ist abgelaufen. Aktualisieren Sie Ihre <0>Verschlüsselungseinstellungen</0>.",
|
||||||
"form_error_port_range": "Geben Sie die Portnummer zwischen 80 und 65535 ein",
|
"form_error_port_range": "Geben Sie die Portnummer zwischen 80 und 65535 ein",
|
||||||
@@ -462,6 +470,7 @@
|
|||||||
"form_add_id": "Kennung hinzufügen",
|
"form_add_id": "Kennung hinzufügen",
|
||||||
"form_client_name": "Clientnamen eingeben",
|
"form_client_name": "Clientnamen eingeben",
|
||||||
"name": "Name",
|
"name": "Name",
|
||||||
|
"client_name": "Client {{id}}",
|
||||||
"client_global_settings": "Allgemeine Einstellungen nutzen",
|
"client_global_settings": "Allgemeine Einstellungen nutzen",
|
||||||
"client_deleted": "Client „{{key}}“ erfolgreich entfernt",
|
"client_deleted": "Client „{{key}}“ erfolgreich entfernt",
|
||||||
"client_added": "Client „{{key}}“ erfolgreich hinzugefügt",
|
"client_added": "Client „{{key}}“ erfolgreich hinzugefügt",
|
||||||
@@ -592,7 +601,7 @@
|
|||||||
"disable_ipv6": "IPv6 deaktivieren",
|
"disable_ipv6": "IPv6 deaktivieren",
|
||||||
"disable_ipv6_desc": "Alle DNS-Anfragen für IPv6-Adressen (Typ AAAA) verwerfen und IPv6-Hinweise aus HTTPS-Antworten entfernen.",
|
"disable_ipv6_desc": "Alle DNS-Anfragen für IPv6-Adressen (Typ AAAA) verwerfen und IPv6-Hinweise aus HTTPS-Antworten entfernen.",
|
||||||
"fastest_addr": "Schnellste IP-Adresse",
|
"fastest_addr": "Schnellste IP-Adresse",
|
||||||
"fastest_addr_desc": "Fragen Sie alle DNS-Server ab und geben Sie die schnellste IP-Adresse unter allen Antworten zurück. Dies verlangsamt DNS-Abfragen, da AdGuard Home auf Antworten von allen DNS-Servern warten muss, verbessert jedoch die Gesamtkonnektivität.",
|
"fastest_addr_desc": "Auf Antworten von <b>allen</b> DNS-Servern warten, die TCP-Verbindungsgeschwindigkeit für jeden Server messen und die IP-Adresse des Servers mit der schnellsten Verbindungsgeschwindigkeit zurückgeben.<br/>Dieser Modus kann DNS-Anfragen erheblich verlangsamen, wenn ein oder mehrere Server nicht antworten. Stellen Sie sicher, dass Ihre Server stabil laufen und das Upstream-Timeout niedrig ist.",
|
||||||
"autofix_warning_text": "Wenn Sie auf „Beheben“ klicken, konfiguriert AdGuardHome Ihr System für die Verwendung des AdGuardHome-DNS-Servers.",
|
"autofix_warning_text": "Wenn Sie auf „Beheben“ klicken, konfiguriert AdGuardHome Ihr System für die Verwendung des AdGuardHome-DNS-Servers.",
|
||||||
"autofix_warning_list": "Es werden folgende Aufgaben ausgeführt: <0>Deaktivieren des DNSStubListener-Systems</0> <0>Festlegen der DNS-Server-Adresse auf 127.0.0.1</0> <0>Ersetzen des symbolischen Linkziels von /etc/resolv.conf auf /run/systemd/resolve/resolv.conf</0> <0>Anhalten des DNSStubListener (systemseitig aufgelöster Dienst wird nachladen)</0>",
|
"autofix_warning_list": "Es werden folgende Aufgaben ausgeführt: <0>Deaktivieren des DNSStubListener-Systems</0> <0>Festlegen der DNS-Server-Adresse auf 127.0.0.1</0> <0>Ersetzen des symbolischen Linkziels von /etc/resolv.conf auf /run/systemd/resolve/resolv.conf</0> <0>Anhalten des DNSStubListener (systemseitig aufgelöster Dienst wird nachladen)</0>",
|
||||||
"autofix_warning_result": "Als Folge daraus werden alle DNS-Anforderungen von Ihrem System standardmäßig von AdGuardHome verarbeitet.",
|
"autofix_warning_result": "Als Folge daraus werden alle DNS-Anforderungen von Ihrem System standardmäßig von AdGuardHome verarbeitet.",
|
||||||
@@ -672,7 +681,7 @@
|
|||||||
"use_saved_key": "Zuvor gespeicherten Schlüssel verwenden",
|
"use_saved_key": "Zuvor gespeicherten Schlüssel verwenden",
|
||||||
"parental_control": "Kindersicherung",
|
"parental_control": "Kindersicherung",
|
||||||
"safe_browsing": "Internetsicherheit",
|
"safe_browsing": "Internetsicherheit",
|
||||||
"served_from_cache": "{{value}} <i>(aus dem Cache abgerufen)</i>",
|
"served_from_cache_label": "Aus dem Cache abgerufen",
|
||||||
"form_error_password_length": "Das Passwort muss zwischen {{min}} und {{max}} Zeichen enthalten",
|
"form_error_password_length": "Das Passwort muss zwischen {{min}} und {{max}} Zeichen enthalten",
|
||||||
"anonymizer_notification": "<0>Hinweis:</0> Die IP-Anonymisierung ist aktiviert. Sie können sie in den <1>Allgemeinen Einstellungen</1> deaktivieren.",
|
"anonymizer_notification": "<0>Hinweis:</0> Die IP-Anonymisierung ist aktiviert. Sie können sie in den <1>Allgemeinen Einstellungen</1> deaktivieren.",
|
||||||
"confirm_dns_cache_clear": "Möchten Sie den DNS-Cache wirklich leeren?",
|
"confirm_dns_cache_clear": "Möchten Sie den DNS-Cache wirklich leeren?",
|
||||||
@@ -680,8 +689,8 @@
|
|||||||
"clear_cache": "Cache leeren",
|
"clear_cache": "Cache leeren",
|
||||||
"make_static": "Statisch machen",
|
"make_static": "Statisch machen",
|
||||||
"theme_auto_desc": "Automatisch (basierend auf dem Farbschema Ihres Geräts)",
|
"theme_auto_desc": "Automatisch (basierend auf dem Farbschema Ihres Geräts)",
|
||||||
"theme_dark_desc": "Dunkles Farbschema",
|
"theme_dark_desc": "Dunkles Design",
|
||||||
"theme_light_desc": "Helles Farbschema",
|
"theme_light_desc": "Helles Design",
|
||||||
"disable_for_seconds": "Für {{count}} Sekunde",
|
"disable_for_seconds": "Für {{count}} Sekunde",
|
||||||
"disable_for_seconds_plural": "Für {{count}} Sekunden",
|
"disable_for_seconds_plural": "Für {{count}} Sekunden",
|
||||||
"disable_for_minutes": "Für {{count}} Minute",
|
"disable_for_minutes": "Für {{count}} Minute",
|
||||||
|
|||||||
@@ -6,21 +6,21 @@
|
|||||||
"upstream_parallel": "Use parallel queries to speed up resolving by querying all upstream servers simultaneously.",
|
"upstream_parallel": "Use parallel queries to speed up resolving by querying all upstream servers simultaneously.",
|
||||||
"parallel_requests": "Parallel requests",
|
"parallel_requests": "Parallel requests",
|
||||||
"load_balancing": "Load-balancing",
|
"load_balancing": "Load-balancing",
|
||||||
"load_balancing_desc": "Query one upstream server at a time. AdGuard Home uses its weighted random algorithm to pick the server so that the fastest server is used more often.",
|
"load_balancing_desc": "Query one upstream server at a time.<br/>AdGuard Home uses a weighted random algorithm to select servers with the lowest number of failed lookups and the lowest average lookup time.",
|
||||||
"bootstrap_dns": "Bootstrap DNS servers",
|
"bootstrap_dns": "Bootstrap DNS servers",
|
||||||
"bootstrap_dns_desc": "IP addresses of DNS servers used to resolve IP addresses of the DoH/DoT resolvers you specify as upstreams. Comments are not permitted.",
|
"bootstrap_dns_desc": "IP addresses of DNS servers used to resolve IP addresses of the DoH/DoT resolvers you specify as upstreams. Comments are not permitted.",
|
||||||
"fallback_dns_title": "Fallback DNS servers",
|
"fallback_dns_title": "Fallback DNS servers",
|
||||||
"fallback_dns_desc": "List of fallback DNS servers used when upstream DNS servers are not responding. The syntax is the same as in the main upstreams field above.",
|
"fallback_dns_desc": "List of fallback DNS servers used when upstream DNS servers are not responding. The syntax is the same as in the main upstreams field above.",
|
||||||
"fallback_dns_placeholder": "Enter one fallback DNS server per line",
|
"fallback_dns_placeholder": "Enter one fallback DNS server per line",
|
||||||
"local_ptr_title": "Private reverse DNS servers",
|
"local_ptr_title": "Private reverse DNS servers",
|
||||||
"local_ptr_desc": "The DNS servers that AdGuard Home uses for local PTR queries. These servers are used to resolve PTR requests for addresses in private IP ranges, for example \"192.168.12.34\", using reverse DNS. If not set, AdGuard Home uses the addresses of the default DNS resolvers of your OS except for the addresses of AdGuard Home itself.",
|
"local_ptr_desc": "DNS servers used by AdGuard Home for private PTR, SOA, and NS requests. A request is considered private if it asks for an ARPA domain containing a subnet within private IP ranges (such as \"192.168.12.34\") and comes from a client with a private IP address. If not set, the default DNS resolvers of your OS will be used, except for the AdGuard Home IP addresses.",
|
||||||
"local_ptr_default_resolver": "By default, AdGuard Home uses the following reverse DNS resolvers: {{ip}}.",
|
"local_ptr_default_resolver": "By default, AdGuard Home uses the following reverse DNS resolvers: {{ip}}.",
|
||||||
"local_ptr_no_default_resolver": "AdGuard Home could not determine suitable private reverse DNS resolvers for this system.",
|
"local_ptr_no_default_resolver": "AdGuard Home could not determine suitable private reverse DNS resolvers for this system.",
|
||||||
"local_ptr_placeholder": "Enter one IP address per line",
|
"local_ptr_placeholder": "Enter one IP address per line",
|
||||||
"resolve_clients_title": "Enable reverse resolving of clients' IP addresses",
|
"resolve_clients_title": "Enable reverse resolving of clients' IP addresses",
|
||||||
"resolve_clients_desc": "Reversely resolve clients' IP addresses into their hostnames by sending PTR queries to corresponding resolvers (private DNS servers for local clients, upstream servers for clients with public IP addresses).",
|
"resolve_clients_desc": "Reversely resolve clients' IP addresses into their hostnames by sending PTR queries to corresponding resolvers (private DNS servers for local clients, upstream servers for clients with public IP addresses).",
|
||||||
"use_private_ptr_resolvers_title": "Use private reverse DNS resolvers",
|
"use_private_ptr_resolvers_title": "Use private reverse DNS resolvers",
|
||||||
"use_private_ptr_resolvers_desc": "Perform reverse DNS lookups for locally served addresses using these upstream servers. If disabled, AdGuard Home responds with NXDOMAIN to all such PTR requests except for clients known from DHCP, /etc/hosts, and so on.",
|
"use_private_ptr_resolvers_desc": "Resolve PTR, SOA, and NS requests for ARPA domains containing private IP addresses through private upstream servers, DHCP, /etc/hosts, etc. If disabled, AdGuard Home will respond to all such requests with NXDOMAIN.",
|
||||||
"check_dhcp_servers": "Check for DHCP servers",
|
"check_dhcp_servers": "Check for DHCP servers",
|
||||||
"save_config": "Save configuration",
|
"save_config": "Save configuration",
|
||||||
"enabled_dhcp": "DHCP server enabled",
|
"enabled_dhcp": "DHCP server enabled",
|
||||||
@@ -154,7 +154,7 @@
|
|||||||
"use_adguard_parental": "Use AdGuard parental control web service",
|
"use_adguard_parental": "Use AdGuard parental control web service",
|
||||||
"use_adguard_parental_hint": "AdGuard Home will check if domain contains adult materials. It uses the same privacy-friendly API as the browsing security web service.",
|
"use_adguard_parental_hint": "AdGuard Home will check if domain contains adult materials. It uses the same privacy-friendly API as the browsing security web service.",
|
||||||
"enforce_safe_search": "Use Safe Search",
|
"enforce_safe_search": "Use Safe Search",
|
||||||
"enforce_save_search_hint": "AdGuard Home will enforce safe search in the following search engines: Google, YouTube, Bing, DuckDuckGo, Yandex, Pixabay.",
|
"enforce_save_search_hint": "AdGuard Home will enforce safe search in the following search engines: Google, YouTube, Bing, DuckDuckGo, Ecosia, Yandex, Pixabay.",
|
||||||
"no_servers_specified": "No servers specified",
|
"no_servers_specified": "No servers specified",
|
||||||
"general_settings": "General settings",
|
"general_settings": "General settings",
|
||||||
"dns_settings": "DNS settings",
|
"dns_settings": "DNS settings",
|
||||||
@@ -236,6 +236,7 @@
|
|||||||
"updated_upstream_dns_toast": "Upstream servers successfully saved",
|
"updated_upstream_dns_toast": "Upstream servers successfully saved",
|
||||||
"dns_test_ok_toast": "Specified DNS servers are working correctly",
|
"dns_test_ok_toast": "Specified DNS servers are working correctly",
|
||||||
"dns_test_not_ok_toast": "Server \"{{key}}\": could not be used, please check that you've written it correctly",
|
"dns_test_not_ok_toast": "Server \"{{key}}\": could not be used, please check that you've written it correctly",
|
||||||
|
"dns_test_parsing_error_toast": "Section {{section}}: line {{line}}: could not be used, please check that you've written it correctly",
|
||||||
"dns_test_warning_toast": "Upstream \"{{key}}\" does not respond to test requests and may not work properly",
|
"dns_test_warning_toast": "Upstream \"{{key}}\" does not respond to test requests and may not work properly",
|
||||||
"unblock": "Unblock",
|
"unblock": "Unblock",
|
||||||
"block": "Block",
|
"block": "Block",
|
||||||
@@ -243,6 +244,7 @@
|
|||||||
"allow_this_client": "Allow this client",
|
"allow_this_client": "Allow this client",
|
||||||
"block_for_this_client_only": "Block for this client only",
|
"block_for_this_client_only": "Block for this client only",
|
||||||
"unblock_for_this_client_only": "Unblock for this client only",
|
"unblock_for_this_client_only": "Unblock for this client only",
|
||||||
|
"add_persistent_client": "Add as persistent client",
|
||||||
"time_table_header": "Time",
|
"time_table_header": "Time",
|
||||||
"date": "Date",
|
"date": "Date",
|
||||||
"domain_name_table_header": "Domain name",
|
"domain_name_table_header": "Domain name",
|
||||||
@@ -292,6 +294,9 @@
|
|||||||
"blocked_response_ttl": "Blocked response TTL",
|
"blocked_response_ttl": "Blocked response TTL",
|
||||||
"blocked_response_ttl_desc": "Specifies for how many seconds the clients should cache a filtered response",
|
"blocked_response_ttl_desc": "Specifies for how many seconds the clients should cache a filtered response",
|
||||||
"form_enter_blocked_response_ttl": "Enter blocked response TTL (seconds)",
|
"form_enter_blocked_response_ttl": "Enter blocked response TTL (seconds)",
|
||||||
|
"upstream_timeout": "Upstream timeout",
|
||||||
|
"upstream_timeout_desc": "Specifies the number of seconds to wait for a response from the upstream server",
|
||||||
|
"form_enter_upstream_timeout": "Enter the upstream server timeout duration in seconds",
|
||||||
"dnscrypt": "DNSCrypt",
|
"dnscrypt": "DNSCrypt",
|
||||||
"dns_over_https": "DNS-over-HTTPS",
|
"dns_over_https": "DNS-over-HTTPS",
|
||||||
"dns_over_tls": "DNS-over-TLS",
|
"dns_over_tls": "DNS-over-TLS",
|
||||||
@@ -465,6 +470,7 @@
|
|||||||
"form_add_id": "Add identifier",
|
"form_add_id": "Add identifier",
|
||||||
"form_client_name": "Enter client name",
|
"form_client_name": "Enter client name",
|
||||||
"name": "Name",
|
"name": "Name",
|
||||||
|
"client_name": "Client {{id}}",
|
||||||
"client_global_settings": "Use global settings",
|
"client_global_settings": "Use global settings",
|
||||||
"client_deleted": "Client \"{{key}}\" successfully deleted",
|
"client_deleted": "Client \"{{key}}\" successfully deleted",
|
||||||
"client_added": "Client \"{{key}}\" successfully added",
|
"client_added": "Client \"{{key}}\" successfully added",
|
||||||
@@ -595,7 +601,7 @@
|
|||||||
"disable_ipv6": "Disable resolving of IPv6 addresses",
|
"disable_ipv6": "Disable resolving of IPv6 addresses",
|
||||||
"disable_ipv6_desc": "Drop all DNS queries for IPv6 addresses (type AAAA) and remove IPv6 hints from HTTPS responses.",
|
"disable_ipv6_desc": "Drop all DNS queries for IPv6 addresses (type AAAA) and remove IPv6 hints from HTTPS responses.",
|
||||||
"fastest_addr": "Fastest IP address",
|
"fastest_addr": "Fastest IP address",
|
||||||
"fastest_addr_desc": "Query all DNS servers and return the fastest IP address among all responses. This slows down DNS queries as AdGuard Home has to wait for responses from all DNS servers, but improves the overall connectivity.",
|
"fastest_addr_desc": "Wait for responses from <b>all</b> DNS servers, measure the TCP connection speed for each server, and return the IP address of the server with the fastest connection speed.<br/>This mode can significantly slow down DNS queries, if one or more upstream servers are not responding. Make sure that your upstream servers are stable and your upstream timeout is low.",
|
||||||
"autofix_warning_text": "If you click \"Fix\", AdGuard Home will configure your system to use AdGuard Home DNS server.",
|
"autofix_warning_text": "If you click \"Fix\", AdGuard Home will configure your system to use AdGuard Home DNS server.",
|
||||||
"autofix_warning_list": "It will perform these tasks: <0>Deactivate system DNSStubListener</0> <0>Set DNS server address to 127.0.0.1</0> <0>Replace symbolic link target of /etc/resolv.conf with /run/systemd/resolve/resolv.conf</0> <0>Stop DNSStubListener (reload systemd-resolved service)</0>",
|
"autofix_warning_list": "It will perform these tasks: <0>Deactivate system DNSStubListener</0> <0>Set DNS server address to 127.0.0.1</0> <0>Replace symbolic link target of /etc/resolv.conf with /run/systemd/resolve/resolv.conf</0> <0>Stop DNSStubListener (reload systemd-resolved service)</0>",
|
||||||
"autofix_warning_result": "As a result all DNS requests from your system will be processed by AdGuard Home by default.",
|
"autofix_warning_result": "As a result all DNS requests from your system will be processed by AdGuard Home by default.",
|
||||||
@@ -675,7 +681,7 @@
|
|||||||
"use_saved_key": "Use the previously saved key",
|
"use_saved_key": "Use the previously saved key",
|
||||||
"parental_control": "Parental Control",
|
"parental_control": "Parental Control",
|
||||||
"safe_browsing": "Safe Browsing",
|
"safe_browsing": "Safe Browsing",
|
||||||
"served_from_cache": "{{value}} <i>(served from cache)</i>",
|
"served_from_cache_label": "Served from cache",
|
||||||
"form_error_password_length": "Password must be {{min}} to {{max}} characters long",
|
"form_error_password_length": "Password must be {{min}} to {{max}} characters long",
|
||||||
"anonymizer_notification": "<0>Note:</0> IP anonymization is enabled. You can disable it in <1>General settings</1>.",
|
"anonymizer_notification": "<0>Note:</0> IP anonymization is enabled. You can disable it in <1>General settings</1>.",
|
||||||
"confirm_dns_cache_clear": "Are you sure you want to clear DNS cache?",
|
"confirm_dns_cache_clear": "Are you sure you want to clear DNS cache?",
|
||||||
|
|||||||
@@ -6,21 +6,21 @@
|
|||||||
"upstream_parallel": "Usar consultas paralelas para acelerar la resolución al consultar simultáneamente a todos los servidores DNS de subida.",
|
"upstream_parallel": "Usar consultas paralelas para acelerar la resolución al consultar simultáneamente a todos los servidores DNS de subida.",
|
||||||
"parallel_requests": "Consultas paralelas",
|
"parallel_requests": "Consultas paralelas",
|
||||||
"load_balancing": "Balanceo de carga",
|
"load_balancing": "Balanceo de carga",
|
||||||
"load_balancing_desc": "Consulta un servidor DNS de subida a la vez. AdGuard Home utiliza su algoritmo aleatorio ponderado para elegir el servidor más rápido y sea utilizado con más frecuencia.",
|
"load_balancing_desc": "Consulta un servidor Dns upstream a la vez.<br/>AdGuard Home utiliza un algoritmo aleatorio ponderado para seleccionar los servidores con el menor número de fallos y el menor tiempo medio de búsqueda.",
|
||||||
"bootstrap_dns": "Servidores DNS de arranque",
|
"bootstrap_dns": "Servidores DNS de arranque",
|
||||||
"bootstrap_dns_desc": "Direcciones IP de servidores DNS utilizadas para resolver direcciones IP de los solucionadores DoH/DoT que especifiques como ascendentes. No se permiten comentarios.",
|
"bootstrap_dns_desc": "Direcciones IP de servidores DNS utilizadas para resolver direcciones IP de los solucionadores DoH/DoT que especifiques como ascendentes. No se permiten comentarios.",
|
||||||
"fallback_dns_title": "Servidores DNS alternativos",
|
"fallback_dns_title": "Servidores DNS alternativos",
|
||||||
"fallback_dns_desc": "Lista de servidores DNS alternativos utilizados cuando los servidores DNS de subida no responden. La sintaxis es la misma que en el campo de los principales DNS de subida anterior.",
|
"fallback_dns_desc": "Lista de servidores DNS alternativos utilizados cuando los servidores DNS de subida no responden. La sintaxis es la misma que en el campo de los principales DNS de subida anterior.",
|
||||||
"fallback_dns_placeholder": "Ingresa un servidor DNS alternativo por línea",
|
"fallback_dns_placeholder": "Ingresa un servidor DNS alternativo por línea",
|
||||||
"local_ptr_title": "Servidores DNS inversos y privados",
|
"local_ptr_title": "Servidores DNS inversos y privados",
|
||||||
"local_ptr_desc": "Los servidores DNS que AdGuard Home utiliza para las consultas PTR locales. Estos servidores se utilizan para resolver las peticiones PTR de direcciones en rangos de IP privadas, por ejemplo \"192.168.12.34\", utilizando DNS inverso. Si no está establecido, AdGuard Home utilizará los resolutores DNS predeterminados de tu sistema operativo, excepto las direcciones del propio AdGuard Home.",
|
"local_ptr_desc": "Los servidores DNS que AdGuard Home utiliza para consultas PTR, SOA y NS privadas. La petición se considera privada si solicita un dominio ARPA que contiene una subred dentro de rangos IP privados, por ejemplo \"192.168.12.34\", y procede de un cliente con dirección privada. Si no se configura, AdGuard Home utiliza las direcciones de los resolvedores DNS predeterminados de tu sistema operativo, excepto las direcciones del propio AdGuard Home.",
|
||||||
"local_ptr_default_resolver": "Por defecto, AdGuard Home utiliza los siguientes resolutores DNS inversos: {{ip}}.",
|
"local_ptr_default_resolver": "Por defecto, AdGuard Home utiliza los siguientes resolutores DNS inversos: {{ip}}.",
|
||||||
"local_ptr_no_default_resolver": "AdGuard Home no pudo determinar los resolutores DNS inversos y privados adecuados para este sistema.",
|
"local_ptr_no_default_resolver": "AdGuard Home no pudo determinar los resolutores DNS inversos y privados adecuados para este sistema.",
|
||||||
"local_ptr_placeholder": "Ingresa una dirección IP por línea",
|
"local_ptr_placeholder": "Ingresa una dirección IP por línea",
|
||||||
"resolve_clients_title": "Habilitar la resolución inversa de las direcciones IP de clientes",
|
"resolve_clients_title": "Habilitar la resolución inversa de las direcciones IP de clientes",
|
||||||
"resolve_clients_desc": "Resolve de manera inversa las direcciones IP de los clientes a sus nombres de hosts enviando consultas PTR a los resolutores correspondientes (servidores DNS privados para clientes locales, servidores DNS de subida para clientes con direcciones IP públicas).",
|
"resolve_clients_desc": "Resolve de manera inversa las direcciones IP de los clientes a sus nombres de hosts enviando consultas PTR a los resolutores correspondientes (servidores DNS privados para clientes locales, servidores DNS de subida para clientes con direcciones IP públicas).",
|
||||||
"use_private_ptr_resolvers_title": "Usar resolutores DNS inversos y privados",
|
"use_private_ptr_resolvers_title": "Usar resolutores DNS inversos y privados",
|
||||||
"use_private_ptr_resolvers_desc": "Realiza búsquedas DNS inversas para direcciones servidas localmente utilizando estos servidores DNS de subida. Si está deshabilitado, AdGuard Home responderá con NXDOMAIN a todas las peticiones PTR de este tipo, excepto para los clientes conocidos por DHCP, /etc/hosts, etc.",
|
"use_private_ptr_resolvers_desc": "Resolver las peticiones PTR, SOA y NS para dominios ARPA que contienen direcciones privadas utilizando servidores upstream privados, DHCP, /etc/hosts, etc. Si se desactiva, AdGuard Home responde a todas estas consultas con NXDOMAIN.",
|
||||||
"check_dhcp_servers": "Comprobar si hay servidores DHCP",
|
"check_dhcp_servers": "Comprobar si hay servidores DHCP",
|
||||||
"save_config": "Guardar configuración",
|
"save_config": "Guardar configuración",
|
||||||
"enabled_dhcp": "Servidor DHCP habilitado",
|
"enabled_dhcp": "Servidor DHCP habilitado",
|
||||||
@@ -154,7 +154,7 @@
|
|||||||
"use_adguard_parental": "Usar el control parental de AdGuard",
|
"use_adguard_parental": "Usar el control parental de AdGuard",
|
||||||
"use_adguard_parental_hint": "AdGuard Home comprobará si el dominio contiene materiales para adultos. Utiliza la misma API amigable con la privacidad del servicio web de seguridad de navegación.",
|
"use_adguard_parental_hint": "AdGuard Home comprobará si el dominio contiene materiales para adultos. Utiliza la misma API amigable con la privacidad del servicio web de seguridad de navegación.",
|
||||||
"enforce_safe_search": "Usar búsqueda segura",
|
"enforce_safe_search": "Usar búsqueda segura",
|
||||||
"enforce_save_search_hint": "AdGuard Home reforzará la búsqueda segura en los siguientes motores de búsqueda: Google, YouTube, Bing, DuckDuckGo, Yandex y Pixabay.",
|
"enforce_save_search_hint": "AdGuard Home reforzará la búsqueda segura en los siguientes motores de búsqueda: Google, YouTube, Bing, DuckDuckGo, Ecosia, Yandex y Pixabay.",
|
||||||
"no_servers_specified": "No hay servidores especificados",
|
"no_servers_specified": "No hay servidores especificados",
|
||||||
"general_settings": "Configuración general",
|
"general_settings": "Configuración general",
|
||||||
"dns_settings": "Configuración del DNS",
|
"dns_settings": "Configuración del DNS",
|
||||||
@@ -236,6 +236,7 @@
|
|||||||
"updated_upstream_dns_toast": "Servidores DNS de subida guardados correctamente",
|
"updated_upstream_dns_toast": "Servidores DNS de subida guardados correctamente",
|
||||||
"dns_test_ok_toast": "Los servidores DNS especificados funcionan correctamente",
|
"dns_test_ok_toast": "Los servidores DNS especificados funcionan correctamente",
|
||||||
"dns_test_not_ok_toast": "Servidor \"{{key}}\": no se puede utilizar, por favor revisa si lo has escrito correctamente",
|
"dns_test_not_ok_toast": "Servidor \"{{key}}\": no se puede utilizar, por favor revisa si lo has escrito correctamente",
|
||||||
|
"dns_test_parsing_error_toast": "No se pudo utilizar la sección {{section}}: línea {{line}}:, verifica si la escribiste correctamente",
|
||||||
"dns_test_warning_toast": "DNS de subida \"{{key}}\" no responde a las peticiones de prueba y es posible que no funcione correctamente",
|
"dns_test_warning_toast": "DNS de subida \"{{key}}\" no responde a las peticiones de prueba y es posible que no funcione correctamente",
|
||||||
"unblock": "Desbloquear",
|
"unblock": "Desbloquear",
|
||||||
"block": "Bloquear",
|
"block": "Bloquear",
|
||||||
@@ -243,6 +244,7 @@
|
|||||||
"allow_this_client": "Permitir a este cliente",
|
"allow_this_client": "Permitir a este cliente",
|
||||||
"block_for_this_client_only": "Bloquear solo para este cliente",
|
"block_for_this_client_only": "Bloquear solo para este cliente",
|
||||||
"unblock_for_this_client_only": "Desbloquear solo para este cliente",
|
"unblock_for_this_client_only": "Desbloquear solo para este cliente",
|
||||||
|
"add_persistent_client": "Añadir como cliente persistente",
|
||||||
"time_table_header": "Hora",
|
"time_table_header": "Hora",
|
||||||
"date": "Fecha",
|
"date": "Fecha",
|
||||||
"domain_name_table_header": "Nombre del dominio",
|
"domain_name_table_header": "Nombre del dominio",
|
||||||
@@ -292,6 +294,9 @@
|
|||||||
"blocked_response_ttl": "Respuesta TTL bloqueada",
|
"blocked_response_ttl": "Respuesta TTL bloqueada",
|
||||||
"blocked_response_ttl_desc": "Especifica durante cuántos segundos los clientes deben almacenar en cache una respuesta filtrada",
|
"blocked_response_ttl_desc": "Especifica durante cuántos segundos los clientes deben almacenar en cache una respuesta filtrada",
|
||||||
"form_enter_blocked_response_ttl": "Ingresa el TTL de respuesta bloqueada (segundos)",
|
"form_enter_blocked_response_ttl": "Ingresa el TTL de respuesta bloqueada (segundos)",
|
||||||
|
"upstream_timeout": "Tiempo de espera del upstream",
|
||||||
|
"upstream_timeout_desc": "Especifica el número de segundos que se debe esperar para recibir una respuesta del servidor upstream",
|
||||||
|
"form_enter_upstream_timeout": "Ingresa la duración del tiempo de espera del servidor DNS upstream en segundos",
|
||||||
"dnscrypt": "DNSCrypt",
|
"dnscrypt": "DNSCrypt",
|
||||||
"dns_over_https": "DNS mediante HTTPS",
|
"dns_over_https": "DNS mediante HTTPS",
|
||||||
"dns_over_tls": "DNS mediante TLS",
|
"dns_over_tls": "DNS mediante TLS",
|
||||||
@@ -423,6 +428,9 @@
|
|||||||
"encryption_hostnames": "Nombres de hosts",
|
"encryption_hostnames": "Nombres de hosts",
|
||||||
"encryption_reset": "¿Estás seguro de que deseas restablecer la configuración de cifrado?",
|
"encryption_reset": "¿Estás seguro de que deseas restablecer la configuración de cifrado?",
|
||||||
"encryption_warning": "Advertencia",
|
"encryption_warning": "Advertencia",
|
||||||
|
"encryption_plain_dns_enable": "Activar DNS simple (sin cifrado)",
|
||||||
|
"encryption_plain_dns_desc": "El DNS simple (sin cifrado) está activado de forma predeterminada. Puedes desactivarlo para obligar a todos los dispositivos a utilizar DNS cifrado. Para ello, debes habilitar al menos un protocolo DNS cifrado",
|
||||||
|
"encryption_plain_dns_error": "Para desactivar el DNS simple, activa al menos un protocolo DNS cifrado",
|
||||||
"topline_expiring_certificate": "Tu certificado SSL está a punto de expirar. Actualiza la <0>configuración de cifrado</0>.",
|
"topline_expiring_certificate": "Tu certificado SSL está a punto de expirar. Actualiza la <0>configuración de cifrado</0>.",
|
||||||
"topline_expired_certificate": "Tu certificado SSL ha expirado. Actualiza la <0>configuración de cifrado</0>.",
|
"topline_expired_certificate": "Tu certificado SSL ha expirado. Actualiza la <0>configuración de cifrado</0>.",
|
||||||
"form_error_port_range": "Ingresa el número del puerto en el rango de 80 a 65535",
|
"form_error_port_range": "Ingresa el número del puerto en el rango de 80 a 65535",
|
||||||
@@ -462,6 +470,7 @@
|
|||||||
"form_add_id": "Añadir identificador",
|
"form_add_id": "Añadir identificador",
|
||||||
"form_client_name": "Ingresa el nombre del cliente",
|
"form_client_name": "Ingresa el nombre del cliente",
|
||||||
"name": "Nombre",
|
"name": "Nombre",
|
||||||
|
"client_name": "Cliente {{id}}",
|
||||||
"client_global_settings": "Usar configuración global",
|
"client_global_settings": "Usar configuración global",
|
||||||
"client_deleted": "Cliente \"{{key}}\" eliminado correctamente",
|
"client_deleted": "Cliente \"{{key}}\" eliminado correctamente",
|
||||||
"client_added": "Cliente \"{{key}}\" añadido correctamente",
|
"client_added": "Cliente \"{{key}}\" añadido correctamente",
|
||||||
@@ -592,7 +601,7 @@
|
|||||||
"disable_ipv6": "Deshabilitar resolución de direcciones IPv6",
|
"disable_ipv6": "Deshabilitar resolución de direcciones IPv6",
|
||||||
"disable_ipv6_desc": "Descarta todas las consultas de DNS para direcciones IPv6 (tipo AAAA) y elimina las sugerencias de IPv6 de las respuestas HTTPS.",
|
"disable_ipv6_desc": "Descarta todas las consultas de DNS para direcciones IPv6 (tipo AAAA) y elimina las sugerencias de IPv6 de las respuestas HTTPS.",
|
||||||
"fastest_addr": "Dirección IP más rápida",
|
"fastest_addr": "Dirección IP más rápida",
|
||||||
"fastest_addr_desc": "Consulta todos los servidores DNS y devuelve la dirección IP más rápida de todas las respuestas. Esto ralentiza las consultas DNS ya que AdGuard Home tiene que esperar las respuestas de todos los servidores DNS, pero mejora la conectividad general.",
|
"fastest_addr_desc": "Espera a que respondan <b>todos</b> los servidores DNS, mide la velocidad de conexión TCP de cada servidor y devuelve la Dirección IP del servidor con la velocidad de conexión más rápida.<br/>Este modo puede ralentizar significativamente las consultas DNS, si uno o más servidores DNS de upstream no están respondiendo. Asegúrate de que tus servidores DNS upstream sean estables y tu tiempo de espera de upstream sea bajo.",
|
||||||
"autofix_warning_text": "Si haces clic en \"Corregir\", AdGuard Home configurará tu sistema para utilizar el servidor DNS de AdGuard Home.",
|
"autofix_warning_text": "Si haces clic en \"Corregir\", AdGuard Home configurará tu sistema para utilizar el servidor DNS de AdGuard Home.",
|
||||||
"autofix_warning_list": "Realizará estas tareas: <0>Deshabilitar el sistema DNSStubListener</0> <0>Establecer la dirección del servidor DNS en 127.0.0.1</0> <0>Reemplazar el destino del enlace simbólico de /etc/resolv.conf por /run/systemd/resolve/resolv.conf</0> <0>Detener DNSStubListener (recargar el servicio systemd-resolved)</0>",
|
"autofix_warning_list": "Realizará estas tareas: <0>Deshabilitar el sistema DNSStubListener</0> <0>Establecer la dirección del servidor DNS en 127.0.0.1</0> <0>Reemplazar el destino del enlace simbólico de /etc/resolv.conf por /run/systemd/resolve/resolv.conf</0> <0>Detener DNSStubListener (recargar el servicio systemd-resolved)</0>",
|
||||||
"autofix_warning_result": "Como resultado, todas las peticiones DNS de tu sistema serán procesadas por AdGuard Home de manera predeterminada.",
|
"autofix_warning_result": "Como resultado, todas las peticiones DNS de tu sistema serán procesadas por AdGuard Home de manera predeterminada.",
|
||||||
@@ -672,7 +681,7 @@
|
|||||||
"use_saved_key": "Usar la clave guardada previamente",
|
"use_saved_key": "Usar la clave guardada previamente",
|
||||||
"parental_control": "Control parental",
|
"parental_control": "Control parental",
|
||||||
"safe_browsing": "Navegación segura",
|
"safe_browsing": "Navegación segura",
|
||||||
"served_from_cache": "{{value}} <i>(servido desde la caché)</i>",
|
"served_from_cache_label": "Servido desde la caché",
|
||||||
"form_error_password_length": "La contraseña debe tener entre {{min}} y {{max}} caracteres",
|
"form_error_password_length": "La contraseña debe tener entre {{min}} y {{max}} caracteres",
|
||||||
"anonymizer_notification": "<0>Nota:</0> La anonimización de IP está habilitada. Puedes deshabilitarla en <1>Configuración general</1>.",
|
"anonymizer_notification": "<0>Nota:</0> La anonimización de IP está habilitada. Puedes deshabilitarla en <1>Configuración general</1>.",
|
||||||
"confirm_dns_cache_clear": "¿Estás seguro de que deseas borrar la caché DNS?",
|
"confirm_dns_cache_clear": "¿Estás seguro de que deseas borrar la caché DNS?",
|
||||||
|
|||||||
@@ -220,6 +220,7 @@
|
|||||||
"updated_upstream_dns_toast": "سرورهای DNS جریان ارسالی بروز رسانی شده است",
|
"updated_upstream_dns_toast": "سرورهای DNS جریان ارسالی بروز رسانی شده است",
|
||||||
"dns_test_ok_toast": "سرورهای DNS تعیین شده بدرستی کار می کنند",
|
"dns_test_ok_toast": "سرورهای DNS تعیین شده بدرستی کار می کنند",
|
||||||
"dns_test_not_ok_toast": "سرور \"{{key}}\": نمیتواند مورد استفاده قرار گیرد،لطفا بررسی کنید آن را بدرستی نوشته اید",
|
"dns_test_not_ok_toast": "سرور \"{{key}}\": نمیتواند مورد استفاده قرار گیرد،لطفا بررسی کنید آن را بدرستی نوشته اید",
|
||||||
|
"dns_test_parsing_error_toast": "بخش {{section}}: خط {{line}}: نمیتواند مورد استفاده قرار گیرد،لطفا بررسی کنید آن را بهدرستی نوشتهاید",
|
||||||
"unblock": "رفع انسداد",
|
"unblock": "رفع انسداد",
|
||||||
"block": "مسدود کردن",
|
"block": "مسدود کردن",
|
||||||
"disallow_this_client": "این مشتری را رد کنید",
|
"disallow_this_client": "این مشتری را رد کنید",
|
||||||
@@ -420,6 +421,7 @@
|
|||||||
"form_add_id": "افزودن احرازکننده",
|
"form_add_id": "افزودن احرازکننده",
|
||||||
"form_client_name": "نام کلاینت را وارد کنید",
|
"form_client_name": "نام کلاینت را وارد کنید",
|
||||||
"name": "نام",
|
"name": "نام",
|
||||||
|
"client_name": "مشتری {{id}}",
|
||||||
"client_global_settings": "استفاده از تنظیمات سراسری",
|
"client_global_settings": "استفاده از تنظیمات سراسری",
|
||||||
"client_deleted": "کلاینت \"{{key}}\" را با موفقیت حذف کرد",
|
"client_deleted": "کلاینت \"{{key}}\" را با موفقیت حذف کرد",
|
||||||
"client_added": "کلاینت \"{{key}}\" را با موفقیت اضافه کرد",
|
"client_added": "کلاینت \"{{key}}\" را با موفقیت اضافه کرد",
|
||||||
@@ -587,6 +589,7 @@
|
|||||||
"cache_optimistic_desc": "AdGuard Home را وادار می کند که از سمت حافظه پنهان پاسخ دهد حتی وقتی که موارد وارد شده منقضی شده باشد و همچنین سعی بر تازه کردن آنها می کند.",
|
"cache_optimistic_desc": "AdGuard Home را وادار می کند که از سمت حافظه پنهان پاسخ دهد حتی وقتی که موارد وارد شده منقضی شده باشد و همچنین سعی بر تازه کردن آنها می کند.",
|
||||||
"filter_category_general": "General",
|
"filter_category_general": "General",
|
||||||
"filter_category_security": "مسدودسازی بدافزار و فیشینگ",
|
"filter_category_security": "مسدودسازی بدافزار و فیشینگ",
|
||||||
|
"filter_category_regional": "منطقهای",
|
||||||
"filter_category_other": "ساير",
|
"filter_category_other": "ساير",
|
||||||
"use_saved_key": "از کلید ذخیره شده قبلی استفاده کنید",
|
"use_saved_key": "از کلید ذخیره شده قبلی استفاده کنید",
|
||||||
"parental_control": "نظارت والدین",
|
"parental_control": "نظارت والدین",
|
||||||
|
|||||||
@@ -6,21 +6,21 @@
|
|||||||
"upstream_parallel": "Käytä rinnakkaisia pyyntöjä ja nopeuta selvitystä käyttämällä kaikkia ylävirtapalvelimia samanaikaisesti.",
|
"upstream_parallel": "Käytä rinnakkaisia pyyntöjä ja nopeuta selvitystä käyttämällä kaikkia ylävirtapalvelimia samanaikaisesti.",
|
||||||
"parallel_requests": "Rinnakkaiset pyynnöt",
|
"parallel_requests": "Rinnakkaiset pyynnöt",
|
||||||
"load_balancing": "Kuormantasaus",
|
"load_balancing": "Kuormantasaus",
|
||||||
"load_balancing_desc": "Lähetä pyyntö yhdelle ylävirtapalvelimelle kerrallaan. AdGuard Home pyrkii valitsemaan nopeimman palvelimen painotetun satunnaisalgoritminsa avulla.",
|
"load_balancing_desc": "Lähetä kysely kerrallaan yhdelle ylävirtapalvelimelle. AdGuard Home valitsee painotetun satunnaisalgoritmin avulla palvelimet, joilla on vähiten epäonnistuneita hakuja ja keskimääräisesti lyhin hakuaika.",
|
||||||
"bootstrap_dns": "Bootstrap DNS-palvelimet",
|
"bootstrap_dns": "Bootstrap DNS-palvelimet",
|
||||||
"bootstrap_dns_desc": "Ylävirroiksi määrittämiesi DoH/DoT-resolverien IP-osoitteiden selvitykseen käytettävien DNS-palvelimien IP-osoitteet. Kommentteja ei sallita.",
|
"bootstrap_dns_desc": "Ylävirroiksi määrittämiesi DoH/DoT-resolverien IP-osoitteiden selvitykseen käytettävien DNS-palvelimien IP-osoitteet. Kommentteja ei sallita.",
|
||||||
"fallback_dns_title": "DNS-varapalvelimet",
|
"fallback_dns_title": "DNS-varapalvelimet",
|
||||||
"fallback_dns_desc": "Listaus DNS-varapalvelimista, joita käytetään kun lähtevät DNS-palvelimet eivät vastaa. Syntaksi on sama kuin yllä olevassa pääylävirrat-kentässä.",
|
"fallback_dns_desc": "Listaus DNS-varapalvelimista, joita käytetään kun lähtevät DNS-palvelimet eivät vastaa. Syntaksi on sama kuin yllä olevassa pääylävirrat-kentässä.",
|
||||||
"fallback_dns_placeholder": "Syötä yksi DNS-varapalvelin per rivi",
|
"fallback_dns_placeholder": "Syötä yksi DNS-varapalvelin per rivi",
|
||||||
"local_ptr_title": "Yksityiset käänteis-DNS-palvelimet",
|
"local_ptr_title": "Yksityiset käänteis-DNS-palvelimet",
|
||||||
"local_ptr_desc": "DNS-palvelimet, joita AdGuard Home käyttää paikallisille PTR-pyynnöille. Näitä palvelimia käytetään yksityistä IP-osoitetta käyttävien PTR-pyyntöjen osoitteiden, kuten \"192.168.12.34\", selvitykseen käänteis-DNS:n avulla. Jos ei käytössä, AdGuard Home käyttää käyttöjärjestelmän oletusarvoisia DNS-resolvereita, poislukien AdGuard Homen omat osoitteet.",
|
"local_ptr_desc": "AdGuard Homen yksityisille PTR-, SOA- ja NS-pyynnöille käyttämät DNS-palvelimet. Pyyntöä luokitellaan yksityiseksi, jos se pyytää yksityistä IP-aluetta (kuten \"192.168.12.34\") käyttävän aliverkon sisältävää ARPA-verkkotunnusta ja on lähtöisin päätteeltä, jolla on yksityinen IP-osoite. Jos tätä ei ole määritetty, käytetään käyttöjärjestelmän oletusarvoisia DNS-resolvereita (AdGuard Homen IP-osoitteet pois lukien).",
|
||||||
"local_ptr_default_resolver": "Oletusarvoisesti AdGuard Home käyttää seuraavia käänteis-DNS-resolvereita: {{ip}}.",
|
"local_ptr_default_resolver": "Oletusarvoisesti AdGuard Home käyttää seuraavia käänteis-DNS-resolvereita: {{ip}}.",
|
||||||
"local_ptr_no_default_resolver": "AdGuard Home ei voinut määrittää tälle järjestelmälle sopivaa yksityistä käänteis-DNS-resolveria.",
|
"local_ptr_no_default_resolver": "AdGuard Home ei voinut määrittää tälle järjestelmälle sopivaa yksityistä käänteis-DNS-resolveria.",
|
||||||
"local_ptr_placeholder": "Syötä yksi IP-osoite per rivi",
|
"local_ptr_placeholder": "Syötä yksi IP-osoite per rivi",
|
||||||
"resolve_clients_title": "Käytä päätelaitteiden IP-osoitteille käänteistä selvitystä",
|
"resolve_clients_title": "Käytä päätelaitteiden IP-osoitteille käänteistä selvitystä",
|
||||||
"resolve_clients_desc": "Selvitä päätelaitteiden IP-osoitteiden isäntänimet käänteisesti lähettämällä PTR-pyynnöt sopiville resolvereille (yksityiset DNS-palvelimet paikallisille päätelaitteille, ylävirtapalvelimet päätelaitteille, joilla on julkiset IP-osoitteet).",
|
"resolve_clients_desc": "Selvitä päätelaitteiden IP-osoitteiden isäntänimet käänteisesti lähettämällä PTR-pyynnöt sopiville resolvereille (yksityiset DNS-palvelimet paikallisille päätelaitteille, ylävirtapalvelimet päätelaitteille, joilla on julkiset IP-osoitteet).",
|
||||||
"use_private_ptr_resolvers_title": "Käytä yksityisiä käänteis-DNS-resolvereita",
|
"use_private_ptr_resolvers_title": "Käytä yksityisiä käänteis-DNS-resolvereita",
|
||||||
"use_private_ptr_resolvers_desc": "Suorita käänteis-DNS-selvitykset paikallisesti tarjotuille osoitteille käyttäen näitä ylävirtapalvelimia. Jos ei käytössä, vastaa AdGuard Home kaikkiin sen tyyppisiin PTR-pyyntöihin NXDOMAIN-arvolla, pois lukien DHCP, /etc/hosts, yms. -tiedoista tunnistettut päätelaitteet.",
|
"use_private_ptr_resolvers_desc": "Selvitä yksityisiä IP-osoitteita sisältävien ARPA-verkkotunnusten PTR-, SOA- ja NS-pyynnöt käyttäen yksityisiä ylävirtapalvelimia, DHCP:tä, /etc/hosts-määrityksiä, yms. Jos tämä ei ole käytössä, AdGuard Home vastaa tällaisiin pyyntöihin NXDOMAIN-tiedolla.",
|
||||||
"check_dhcp_servers": "Etsi DHCP-palvelimia",
|
"check_dhcp_servers": "Etsi DHCP-palvelimia",
|
||||||
"save_config": "Tallenna asetukset",
|
"save_config": "Tallenna asetukset",
|
||||||
"enabled_dhcp": "DHCP-palvelin otettiin käyttöön",
|
"enabled_dhcp": "DHCP-palvelin otettiin käyttöön",
|
||||||
@@ -154,7 +154,7 @@
|
|||||||
"use_adguard_parental": "Käytä AdGuardin lapsilukko-palvelua",
|
"use_adguard_parental": "Käytä AdGuardin lapsilukko-palvelua",
|
||||||
"use_adguard_parental_hint": "AdGuard Home tarkistaa, sisältääkö verkkotunnus aikuisille tarkoitettua sisältöä. Se käyttää samaa tietosuojapainotteista rajapintaa, kuin turvallisen selauksen palvelu.",
|
"use_adguard_parental_hint": "AdGuard Home tarkistaa, sisältääkö verkkotunnus aikuisille tarkoitettua sisältöä. Se käyttää samaa tietosuojapainotteista rajapintaa, kuin turvallisen selauksen palvelu.",
|
||||||
"enforce_safe_search": "Käytä turvallista hakua",
|
"enforce_safe_search": "Käytä turvallista hakua",
|
||||||
"enforce_save_search_hint": "AdGuard Home voi pakottaa turvallisen haun käyttöön seuraavissa hakukoneissa: Google, YouTube, Bing, DuckDuckGo, Yandex, Pixabay.",
|
"enforce_save_search_hint": "AdGuard Home pakottaa turvallisen haun käyttöön seuraavissa hakukoneissa: Google, YouTube, Bing, DuckDuckGo, Ecosia, Yandex ja Pixabay.",
|
||||||
"no_servers_specified": "Palvelimia ei ole määritetty",
|
"no_servers_specified": "Palvelimia ei ole määritetty",
|
||||||
"general_settings": "Yleiset asetukset",
|
"general_settings": "Yleiset asetukset",
|
||||||
"dns_settings": "DNS-asetukset",
|
"dns_settings": "DNS-asetukset",
|
||||||
@@ -236,6 +236,7 @@
|
|||||||
"updated_upstream_dns_toast": "Ylävirtapalvelimet tallennettiin",
|
"updated_upstream_dns_toast": "Ylävirtapalvelimet tallennettiin",
|
||||||
"dns_test_ok_toast": "Määritetyt DNS-palvelimet toimivat oikein",
|
"dns_test_ok_toast": "Määritetyt DNS-palvelimet toimivat oikein",
|
||||||
"dns_test_not_ok_toast": "Palvelin \"{{key}}\": Ei voitu käyttää, tarkista oikeinkirjoitus",
|
"dns_test_not_ok_toast": "Palvelin \"{{key}}\": Ei voitu käyttää, tarkista oikeinkirjoitus",
|
||||||
|
"dns_test_parsing_error_toast": "Osio {{section}}: rivi {{line}}: Ei voitu käyttää, tarkista oikeinkirjoitus",
|
||||||
"dns_test_warning_toast": "Datavuon \"{{key}}\" ei vastaa testipyyntöihin eikä välttämättä toimi kunnolla",
|
"dns_test_warning_toast": "Datavuon \"{{key}}\" ei vastaa testipyyntöihin eikä välttämättä toimi kunnolla",
|
||||||
"unblock": "Salli",
|
"unblock": "Salli",
|
||||||
"block": "Estä",
|
"block": "Estä",
|
||||||
@@ -243,6 +244,7 @@
|
|||||||
"allow_this_client": "Salli tämä päätelaite",
|
"allow_this_client": "Salli tämä päätelaite",
|
||||||
"block_for_this_client_only": "Estä vain tältä päätelaitteelta",
|
"block_for_this_client_only": "Estä vain tältä päätelaitteelta",
|
||||||
"unblock_for_this_client_only": "Salli vain tälle päätelaitteelle",
|
"unblock_for_this_client_only": "Salli vain tälle päätelaitteelle",
|
||||||
|
"add_persistent_client": "Lisää pysyvänä päätelaitteena",
|
||||||
"time_table_header": "Aika",
|
"time_table_header": "Aika",
|
||||||
"date": "Päiväys",
|
"date": "Päiväys",
|
||||||
"domain_name_table_header": "Verkkotunnus",
|
"domain_name_table_header": "Verkkotunnus",
|
||||||
@@ -270,12 +272,12 @@
|
|||||||
"query_log_cleared": "Pyyntöhistorian tyhjennys onnistui",
|
"query_log_cleared": "Pyyntöhistorian tyhjennys onnistui",
|
||||||
"query_log_updated": "Pyyntöhistorian päivitys onnistui",
|
"query_log_updated": "Pyyntöhistorian päivitys onnistui",
|
||||||
"query_log_clear": "Tyhjennä pyyntöhistoria",
|
"query_log_clear": "Tyhjennä pyyntöhistoria",
|
||||||
"query_log_retention": "Kyselylokien kierto",
|
"query_log_retention": "Pyyntöhistorian kierto",
|
||||||
"query_log_enable": "Käytä historiaa",
|
"query_log_enable": "Käytä historiaa",
|
||||||
"query_log_configuration": "Historian määritys",
|
"query_log_configuration": "Historian määritys",
|
||||||
"query_log_disabled": "Pyyntöhistoria ei ole käytössä. Voit ottaa sen käyttöön <0>asetuksissa</0>",
|
"query_log_disabled": "Pyyntöhistoria ei ole käytössä. Voit ottaa sen käyttöön <0>asetuksista</0>.",
|
||||||
"query_log_strict_search": "Käytä tarkalle haulle lainausmerkkejä",
|
"query_log_strict_search": "Käytä tarkalle haulle lainausmerkkejä",
|
||||||
"query_log_retention_confirm": "Haluatko varmasti muuttaa kyselylokin kiertoa? Jos pienennät intervalliarvoa, osa tiedoista menetetään",
|
"query_log_retention_confirm": "Haluatko varmasti muuttaa pyyntöhistorian kiertoa? Jos pienennät aikaväliä, osa tiedoista menetetään.",
|
||||||
"anonymize_client_ip": "Piilota päätelaitteen IP-osoite",
|
"anonymize_client_ip": "Piilota päätelaitteen IP-osoite",
|
||||||
"anonymize_client_ip_desc": "Älä tallenna päätelaitteen täydellistä IP-osoitetta historiaan ja tilastoihin.",
|
"anonymize_client_ip_desc": "Älä tallenna päätelaitteen täydellistä IP-osoitetta historiaan ja tilastoihin.",
|
||||||
"dns_config": "DNS-palvelimen määritys",
|
"dns_config": "DNS-palvelimen määritys",
|
||||||
@@ -303,28 +305,28 @@
|
|||||||
"download_mobileconfig_dot": "Lataa .mobileconfig-tiedosto DNS-over-TLS -käytölle",
|
"download_mobileconfig_dot": "Lataa .mobileconfig-tiedosto DNS-over-TLS -käytölle",
|
||||||
"download_mobileconfig": "Lataa asetustiedosto",
|
"download_mobileconfig": "Lataa asetustiedosto",
|
||||||
"plain_dns": "Tavallinen DNS",
|
"plain_dns": "Tavallinen DNS",
|
||||||
"form_enter_rate_limit": "Syötä rajoitus",
|
"form_enter_rate_limit": "Syötä pyyntörajoitus",
|
||||||
"rate_limit": "Pyyntöjen ajoitus",
|
"rate_limit": "Pyyntöajoitus",
|
||||||
"edns_enable": "Käytä EDNS-päätelaitealivekkoa",
|
"edns_enable": "Käytä EDNS-päätelaitealivekkoa",
|
||||||
"edns_cs_desc": "Lähetä päätelaitteiden aliverkot DNS-palvelimille.",
|
"edns_cs_desc": "Lisää EDNS Client Subnet (ECS) -valinta ylävirran pyyntöihin ja kirjaa päätelaitteiden lähettämät arvot pyyntöhistoriaan.",
|
||||||
"edns_use_custom_ip": "Käytä omaa IP-osoitetta EDNS:lle",
|
"edns_use_custom_ip": "Käytä omaa IP-osoitetta EDNS:lle",
|
||||||
"edns_use_custom_ip_desc": "Salli oman IP-osoitteen käyttö EDNS-mekanismille.",
|
"edns_use_custom_ip_desc": "Salli oman IP-osoitteen käyttö EDNS-mekanismille.",
|
||||||
"rate_limit_desc": "Päätelaitteelle sallittu pyyntöjen enimmäismäärä sekunnissa. Arvo 0 tarkoittaa rajatonta.",
|
"rate_limit_desc": "Päätelaitteelle sallittu pyyntöjen enimmäismäärä sekunnissa. Arvo 0 tarkoittaa rajatonta.",
|
||||||
"rate_limit_subnet_len_ipv4": "IPv4-osoitteiden aliverkon etuliitteen pituus",
|
"rate_limit_subnet_len_ipv4": "IPv4-osoitteiden aliverkon etuliitteen pituus",
|
||||||
"rate_limit_subnet_len_ipv4_desc": "Aliverkon etuliitteen pituus IPv4-osoitteille, joita käytetään nopeuden rajoittamiseen. Oletusarvo on 24",
|
"rate_limit_subnet_len_ipv4_desc": "Pyyntörajoitukseen käytettävien IPv4-osoitteiden aliverkon etuliitteen pituus. Oletusarvo on 24.",
|
||||||
"rate_limit_subnet_len_ipv4_error": "IPv4-aliverkon etuliitteen pituuden tulee olla 0–32",
|
"rate_limit_subnet_len_ipv4_error": "IPv4-aliverkon etuliitteen pituuden tulee olla väliltä 0–32.",
|
||||||
"rate_limit_subnet_len_ipv6": "IPv6-osoitteiden aliverkon etuliitteen pituus",
|
"rate_limit_subnet_len_ipv6": "IPv6-osoitteiden aliverkon etuliitteen pituus",
|
||||||
"rate_limit_subnet_len_ipv6_desc": "Aliverkon etuliitteen pituus IPv6-osoitteille, joita käytetään nopeuden rajoittamiseen. Oletusarvo on 56",
|
"rate_limit_subnet_len_ipv6_desc": "Pyyntörajoitukseen käytettävien IPv6-osoitteiden aliverkon etuliitteen pituus. Oletusarvo on 56.",
|
||||||
"rate_limit_subnet_len_ipv6_error": "IPv6-aliverkon etuliitteen pituuden tulee olla 0–128",
|
"rate_limit_subnet_len_ipv6_error": "IPv6-aliverkon etuliitteen pituuden tulee olla väliltä 0–128.",
|
||||||
"form_enter_rate_limit_subnet_len": "Anna aliverkon etuliitteen pituus nopeuden rajoittamista varten",
|
"form_enter_rate_limit_subnet_len": "Syötä pyyntörajoitukseen käytettävä aliverkon etuliitteen pituus",
|
||||||
"rate_limit_whitelist": "Nopeutta rajoittava sallittu luettelo",
|
"rate_limit_whitelist": "Pyyntörajoituksen ohituslista",
|
||||||
"rate_limit_whitelist_desc": "IP-osoitteet, jotka eivät kuulu nopeusrajoituksen piiriin",
|
"rate_limit_whitelist_desc": "IP-osoitteet, jotka eivät kuulu pyyntörajoituksen piiriin.",
|
||||||
"rate_limit_whitelist_placeholder": "Syötä yksi IP-osoite per rivi",
|
"rate_limit_whitelist_placeholder": "Syötä yksi IP-osoite per rivi",
|
||||||
"blocking_ipv4_desc": "Estettyyn A-pyyntöön palautettava IP-osoite",
|
"blocking_ipv4_desc": "Estettyyn A-pyyntöön palautettava IP-osoite",
|
||||||
"blocking_ipv6_desc": "Estettyyn AAAA-pyyntöön palautettava IP-osoite",
|
"blocking_ipv6_desc": "Estettyyn AAAA-pyyntöön palautettava IP-osoite",
|
||||||
"blocking_mode_default": "Oletus: Vastaa IP-nollaosoitteella (0.0.0.0 korvaa A; :: korvaa AAAA) kun estetään mainoseston säännöllä; vastaa säännön määrittämällä IP-osoitteella kun estetään /etc/hosts-tyyppisellä säännöllä",
|
"blocking_mode_default": "Oletus: Vastaa IP-nollaosoitteella (0.0.0.0 korvaa A; :: korvaa AAAA) kun estetään mainoseston säännöllä; vastaa säännön määrittämällä IP-osoitteella kun estetään /etc/hosts-tyyppisellä säännöllä",
|
||||||
"blocking_mode_refused": "REFUSED: Vastaa REFUSED-koodilla",
|
"blocking_mode_refused": "REFUSED: Vastaa REFUSED-koodilla",
|
||||||
"blocking_mode_nxdomain": "NXDOMAIN: Vastaa NXDOMAIN-koodilla",
|
"blocking_mode_nxdomain": "NXDOMAIN: Vastaa NXDOMAIN-tiedolla",
|
||||||
"blocking_mode_null_ip": "Tyhjä IP: Vastaa IP-nollaosoitteella (0.0.0.0 korvaa A; :: korvaa AAAA)",
|
"blocking_mode_null_ip": "Tyhjä IP: Vastaa IP-nollaosoitteella (0.0.0.0 korvaa A; :: korvaa AAAA)",
|
||||||
"blocking_mode_custom_ip": "Mukautettu IP: Vastaa manuaalisesti määritetyllä IP-osoitteella",
|
"blocking_mode_custom_ip": "Mukautettu IP: Vastaa manuaalisesti määritetyllä IP-osoitteella",
|
||||||
"theme_auto": "Automaattinen",
|
"theme_auto": "Automaattinen",
|
||||||
@@ -423,6 +425,9 @@
|
|||||||
"encryption_hostnames": "Isäntänimet",
|
"encryption_hostnames": "Isäntänimet",
|
||||||
"encryption_reset": "Haluatko varmasti palauttaa salausasetukset?",
|
"encryption_reset": "Haluatko varmasti palauttaa salausasetukset?",
|
||||||
"encryption_warning": "Varoitus",
|
"encryption_warning": "Varoitus",
|
||||||
|
"encryption_plain_dns_enable": "Käytä tavallista DNS:ää",
|
||||||
|
"encryption_plain_dns_desc": "Tavallinen DNS on oletusarvoisesti käytössä. Voit poistaa sen käytöstä pakottaaksesi kaikki laitteet käyttämään salattua DNS:ää. Tätä varten sinun on otettava käyttöön ainakin yksi salattu DNS-protokolla.",
|
||||||
|
"encryption_plain_dns_error": "Voit poistaa tavallisen DNS:n käytöstä ottamalla käyttöön ainakin yhden salatun DNS-protokollan.",
|
||||||
"topline_expiring_certificate": "SSL-varmenteesi on erääntymässä. Päivitä <0>Salausasetukset</0>.",
|
"topline_expiring_certificate": "SSL-varmenteesi on erääntymässä. Päivitä <0>Salausasetukset</0>.",
|
||||||
"topline_expired_certificate": "SSL-varmenteesi on erääntynyt. Päivitä <0>Salausasetukset</0>.",
|
"topline_expired_certificate": "SSL-varmenteesi on erääntynyt. Päivitä <0>Salausasetukset</0>.",
|
||||||
"form_error_port_range": "Syötä portti väliltä 80-65535",
|
"form_error_port_range": "Syötä portti väliltä 80-65535",
|
||||||
@@ -443,7 +448,7 @@
|
|||||||
"manual_update": "Seuraa <a>näitä ohjeita</a> päivittääksesi manuaalisesti.",
|
"manual_update": "Seuraa <a>näitä ohjeita</a> päivittääksesi manuaalisesti.",
|
||||||
"processing_update": "Odota kun AdGuard Home päivittyy",
|
"processing_update": "Odota kun AdGuard Home päivittyy",
|
||||||
"clients_title": "Pysyvät päätelaitteet",
|
"clients_title": "Pysyvät päätelaitteet",
|
||||||
"clients_desc": "Määritä pysyvät AdGuard Homeen yhdistetyt päätelaitetiedot.",
|
"clients_desc": "Määritä AdGuard Homeen pysyvästi yhdistettyjen päätelaitteiden tiedot.",
|
||||||
"settings_global": "Yleinen",
|
"settings_global": "Yleinen",
|
||||||
"settings_custom": "Mukautettu",
|
"settings_custom": "Mukautettu",
|
||||||
"table_client": "Asiakas",
|
"table_client": "Asiakas",
|
||||||
@@ -462,6 +467,7 @@
|
|||||||
"form_add_id": "Lisää tunniste",
|
"form_add_id": "Lisää tunniste",
|
||||||
"form_client_name": "Syötä päätelaitteen nimi",
|
"form_client_name": "Syötä päätelaitteen nimi",
|
||||||
"name": "Nimi",
|
"name": "Nimi",
|
||||||
|
"client_name": "Päätelaite {{id}}",
|
||||||
"client_global_settings": "Käytä yleisiä asetuksia",
|
"client_global_settings": "Käytä yleisiä asetuksia",
|
||||||
"client_deleted": "Päätelaite \"{{key}}\" poistettiin",
|
"client_deleted": "Päätelaite \"{{key}}\" poistettiin",
|
||||||
"client_added": "Päätelaite \"{{key}}\" lisättiin",
|
"client_added": "Päätelaite \"{{key}}\" lisättiin",
|
||||||
@@ -475,10 +481,10 @@
|
|||||||
"access_desc": "Tässä voidaan määrittää AdGuard Homen DNS-palvelimen käyttöoikeussääntöjä.",
|
"access_desc": "Tässä voidaan määrittää AdGuard Homen DNS-palvelimen käyttöoikeussääntöjä.",
|
||||||
"access_allowed_title": "Sallitut päätelaitteet",
|
"access_allowed_title": "Sallitut päätelaitteet",
|
||||||
"access_allowed_desc": "Lista CIDR-merkinnöistä, IP-osoitteista tai <a>ClientID</a>-tunnisteista. Jos listalla on kohteita, hyväksyy AdGuard Home pyyntöjä vain näiltä päätelaitteilta.",
|
"access_allowed_desc": "Lista CIDR-merkinnöistä, IP-osoitteista tai <a>ClientID</a>-tunnisteista. Jos listalla on kohteita, hyväksyy AdGuard Home pyyntöjä vain näiltä päätelaitteilta.",
|
||||||
"access_disallowed_title": "Kielletyt päätelaitteet",
|
"access_disallowed_title": "Estetyt päätelaitteet",
|
||||||
"access_disallowed_desc": "Lista CIDR-merkinnöistä, IP-osoitteista tai <a>ClientID</a>-tunnisteista. Jos listalla on kohteita, hylkää AdGuard Home näiden päätelaitteiden pyynnöt. Tätä kenttää ei huomioida, jos sallittuja päätelaitteita on määritetty.",
|
"access_disallowed_desc": "Lista CIDR-merkinnöistä, IP-osoitteista tai <a>ClientID</a>-tunnisteista. Jos listalla on kohteita, hylkää AdGuard Home näiden päätelaitteiden pyynnöt. Tätä kenttää ei huomioida, jos sallittuja päätelaitteita on määritetty.",
|
||||||
"access_blocked_title": "Kielletyt verkkotunnukset",
|
"access_blocked_title": "Estetyt verkkotunnukset",
|
||||||
"access_blocked_desc": "Ei pidä sekoittaa suodattimiin. AdGuard Home hylkää näiden verkkotunnusten DNS-pyynnöt, eivätkä nämä pyynnöt näy edes pyyntöhistoriassa. Tähän voidaan syöttää tarkkoja verkkotunnuksia, jokerimerkkejä tai URL-suodatussääntöjä, kuten \"example.org\", \"*.example.org\" tai \"||example.org^\".",
|
"access_blocked_desc": "Ei pidä sekoittaa suodattimiin. AdGuard Home hylkää näiden verkkotunnusten DNS-pyynnöt, eivätkä nämä pyynnöt myöskään näy pyyntöhistoriassa. Tähän voidaan syöttää tarkkoja verkkotunnuksia, jokerimerkkejä tai URL-suodatussääntöjä, kuten \"example.org\", \"*.example.org\" tai \"||example.org^\".",
|
||||||
"access_settings_saved": "Käytön asetukset tallennettiin",
|
"access_settings_saved": "Käytön asetukset tallennettiin",
|
||||||
"updates_checked": "Uusi versio AdGuard Home -ohjelmasta on saatavana\n",
|
"updates_checked": "Uusi versio AdGuard Home -ohjelmasta on saatavana\n",
|
||||||
"updates_version_equal": "AdGuard Home on ajan tasalla",
|
"updates_version_equal": "AdGuard Home on ajan tasalla",
|
||||||
@@ -495,8 +501,8 @@
|
|||||||
"setup_dns_privacy_ios_1": "<0>DNSCloak</0> tukee <1>DNS-over-HTTPS</1>, mutta oman palvelimen käyttö' varten sille on luotava <2>DNS Stamp</2> -merkintä.",
|
"setup_dns_privacy_ios_1": "<0>DNSCloak</0> tukee <1>DNS-over-HTTPS</1>, mutta oman palvelimen käyttö' varten sille on luotava <2>DNS Stamp</2> -merkintä.",
|
||||||
"setup_dns_privacy_ios_2": "<0>AdGuard iOS:lle</0> tukee <1>DNS-over-HTTPS</1> ja <1>DNS-over-TLS</1> -toteutuksia.",
|
"setup_dns_privacy_ios_2": "<0>AdGuard iOS:lle</0> tukee <1>DNS-over-HTTPS</1> ja <1>DNS-over-TLS</1> -toteutuksia.",
|
||||||
"setup_dns_privacy_other_title": "Muita toteutuksia",
|
"setup_dns_privacy_other_title": "Muita toteutuksia",
|
||||||
"setup_dns_privacy_other_1": "AdGuard Home voi itse olla turvallinen DNS-päätelaite millä tahansa alustalla.",
|
"setup_dns_privacy_other_1": "AdGuard Home voi itse olla suojattu DNS -pääte millä tahansa alustalla.",
|
||||||
"setup_dns_privacy_other_2": "<0>dnsproxy</0> tukee kaikkia tunnettuja turvallisia DNS-protokollia.",
|
"setup_dns_privacy_other_2": "<0>dnsproxy</0> tukee kaikkia tunnettuja suojattuja DNS-protokollia.",
|
||||||
"setup_dns_privacy_other_3": "<0>dnscrypt-proxy</0> tukee <1>DNS-over-HTTPS</1> -protokollaa.",
|
"setup_dns_privacy_other_3": "<0>dnscrypt-proxy</0> tukee <1>DNS-over-HTTPS</1> -protokollaa.",
|
||||||
"setup_dns_privacy_other_4": "<0>Mozilla Firefox</0> tukee <1>DNS-over-HTTPS</1>-toteutusta.",
|
"setup_dns_privacy_other_4": "<0>Mozilla Firefox</0> tukee <1>DNS-over-HTTPS</1>-toteutusta.",
|
||||||
"setup_dns_privacy_other_5": "Löydät lisää toteutuksia <0>täältä</0> ja <1>täältä</1>.",
|
"setup_dns_privacy_other_5": "Löydät lisää toteutuksia <0>täältä</0> ja <1>täältä</1>.",
|
||||||
@@ -536,7 +542,7 @@
|
|||||||
"stats_params": "Tilastoinnin määritys",
|
"stats_params": "Tilastoinnin määritys",
|
||||||
"config_successfully_saved": "Asetukset tallennettiin",
|
"config_successfully_saved": "Asetukset tallennettiin",
|
||||||
"interval_6_hour": "6 tuntia",
|
"interval_6_hour": "6 tuntia",
|
||||||
"interval_24_hour": "24 tuntia",
|
"interval_24_hour": "24 tunnilta",
|
||||||
"interval_days": "{{count}} päivä",
|
"interval_days": "{{count}} päivä",
|
||||||
"interval_days_plural": "{{count}} päivää",
|
"interval_days_plural": "{{count}} päivää",
|
||||||
"domain": "Verkkotunnus",
|
"domain": "Verkkotunnus",
|
||||||
@@ -557,7 +563,7 @@
|
|||||||
"ignore_domains": "Ohitettavat verkkotunnukset (erotettu rivinvaihdolla)",
|
"ignore_domains": "Ohitettavat verkkotunnukset (erotettu rivinvaihdolla)",
|
||||||
"ignore_domains_title": "Ohitettavat verkkotunnukset",
|
"ignore_domains_title": "Ohitettavat verkkotunnukset",
|
||||||
"ignore_domains_desc_stats": "Sääntöihin sopivat kyselyt eivät kirjoitu tilastoihin",
|
"ignore_domains_desc_stats": "Sääntöihin sopivat kyselyt eivät kirjoitu tilastoihin",
|
||||||
"ignore_domains_desc_query": "Sääntöihin sopivat kyselyt eivät tallennu kyselylokiin",
|
"ignore_domains_desc_query": "Näitä sääntöjä vastaavia pyyntöjä ei tallenneta pyyntöhistoriaan.",
|
||||||
"interval_hours": "{{count}} tunti",
|
"interval_hours": "{{count}} tunti",
|
||||||
"interval_hours_plural": "{{count}} tuntia",
|
"interval_hours_plural": "{{count}} tuntia",
|
||||||
"filters_configuration": "Suodatinten määritys",
|
"filters_configuration": "Suodatinten määritys",
|
||||||
@@ -672,7 +678,7 @@
|
|||||||
"use_saved_key": "Käytä aiemmin tallennettua avainta",
|
"use_saved_key": "Käytä aiemmin tallennettua avainta",
|
||||||
"parental_control": "Lapsilukko",
|
"parental_control": "Lapsilukko",
|
||||||
"safe_browsing": "Turvallinen selaus",
|
"safe_browsing": "Turvallinen selaus",
|
||||||
"served_from_cache": "{{value}} <i>(jaettu välimuistista)</i>",
|
"served_from_cache_label": "Toimitettu välimuistista",
|
||||||
"form_error_password_length": "Salasanan on oltava {{min}} - {{max}} merkkiä pitkä",
|
"form_error_password_length": "Salasanan on oltava {{min}} - {{max}} merkkiä pitkä",
|
||||||
"anonymizer_notification": "<0>Huomioi:</0> IP-osoitteen anonymisointi on käytössä. Voit poistaa sen käytöstä <1>Yleisistä asetuksista</1>.",
|
"anonymizer_notification": "<0>Huomioi:</0> IP-osoitteen anonymisointi on käytössä. Voit poistaa sen käytöstä <1>Yleisistä asetuksista</1>.",
|
||||||
"confirm_dns_cache_clear": "Haluatko varmasti tyhjentää DNS-välimuistin?",
|
"confirm_dns_cache_clear": "Haluatko varmasti tyhjentää DNS-välimuistin?",
|
||||||
@@ -700,12 +706,12 @@
|
|||||||
"custom_retention_input": "Syötä säilytysaika tunteina",
|
"custom_retention_input": "Syötä säilytysaika tunteina",
|
||||||
"custom_rotation_input": "Syötä uudistusaika tunteina",
|
"custom_rotation_input": "Syötä uudistusaika tunteina",
|
||||||
"protection_section_label": "Suojaus",
|
"protection_section_label": "Suojaus",
|
||||||
"log_and_stats_section_label": "Kyselyhistoria ja tilastot",
|
"log_and_stats_section_label": "Pyyntöhistoria ja tilastot",
|
||||||
"ignore_query_log": "Älä huomioi tätä päätettä kyselyhistoriassa",
|
"ignore_query_log": "Älä huomioi tätä päätelaitetta pyyntöhistoriassa",
|
||||||
"ignore_statistics": "Älä huomioi tätä päätettä tilastoissa",
|
"ignore_statistics": "Älä huomioi tätä päätettä tilastoissa",
|
||||||
"schedule_services": "Keskeytä palveluesto",
|
"schedule_services": "Pysäytä palveluesto",
|
||||||
"schedule_services_desc": "Määritä palvelunestosuodattimen keskeytysajoitus.",
|
"schedule_services_desc": "Määritä palvelunestosuodattimen pysäytysajoitus.",
|
||||||
"schedule_services_desc_client": "Määritä palvelunestosuodattimen keskeytysajoitus tälle päätteelle.",
|
"schedule_services_desc_client": "Määritä palvelunestosuodattimen pysäytysajoitus tälle päätteelle.",
|
||||||
"schedule_desc": "Aseta estettujen palveluiden käyttämättömyysjaksot",
|
"schedule_desc": "Aseta estettujen palveluiden käyttämättömyysjaksot",
|
||||||
"schedule_invalid_select": "Aloitusaika on oltava ennen lopetusaikaa",
|
"schedule_invalid_select": "Aloitusaika on oltava ennen lopetusaikaa",
|
||||||
"schedule_select_days": "Valitse päivät",
|
"schedule_select_days": "Valitse päivät",
|
||||||
|
|||||||
@@ -6,21 +6,21 @@
|
|||||||
"upstream_parallel": "Utilisez des requêtes parallèles pour accélérer la résolution en requêtant simultanément tous les serveurs en amont.",
|
"upstream_parallel": "Utilisez des requêtes parallèles pour accélérer la résolution en requêtant simultanément tous les serveurs en amont.",
|
||||||
"parallel_requests": "Requêtes en parallèle",
|
"parallel_requests": "Requêtes en parallèle",
|
||||||
"load_balancing": "Équilibrage de charge",
|
"load_balancing": "Équilibrage de charge",
|
||||||
"load_balancing_desc": "Interroger un serveur en amont à la fois. AdGuard Home utilise son algorithme aléatoire pondéré pour choisir le serveur de sorte que le serveur le plus rapide soit utilisé plus souvent.",
|
"load_balancing_desc": "Une requête par serveur en amont à la fois.<br/>AdGuard Home utilise un algorithme aléatoire pondéré pour sélectionner les serveurs avec le plus petit nombre d'échecs de recherche et le temps de recherche moyen le plus bas.",
|
||||||
"bootstrap_dns": "Serveurs DNS d'amorçage",
|
"bootstrap_dns": "Serveurs DNS d'amorçage",
|
||||||
"bootstrap_dns_desc": "Les adresses IP des serveurs DNS utilisées pour résoudre les adresses IP des résolveurs DoH/DoT que vous spécifiez comme en amont. Les commentaires ne sont pas autorisés.",
|
"bootstrap_dns_desc": "Les adresses IP des serveurs DNS utilisées pour résoudre les adresses IP des résolveurs DoH/DoT que vous spécifiez comme en amont. Les commentaires ne sont pas autorisés.",
|
||||||
"fallback_dns_title": "Serveurs DNS de repli",
|
"fallback_dns_title": "Serveurs DNS de repli",
|
||||||
"fallback_dns_desc": "Liste des serveurs DNS de repli utilisés lorsque les serveurs DNS en amont ne répondent pas. La syntaxe est la même que dans le champ principal en amont ci-dessus.",
|
"fallback_dns_desc": "Liste des serveurs DNS de repli utilisés lorsque les serveurs DNS en amont ne répondent pas. La syntaxe est la même que dans le champ principal en amont ci-dessus.",
|
||||||
"fallback_dns_placeholder": "Saisissez un serveur DNS de repli par ligne",
|
"fallback_dns_placeholder": "Saisissez un serveur DNS de repli par ligne",
|
||||||
"local_ptr_title": "Serveurs DNS privés inverses",
|
"local_ptr_title": "Serveurs DNS privés inverses",
|
||||||
"local_ptr_desc": "Les serveurs DNS que AdGuard Home utilise pour les requêtes PTR locales. Ces serveurs sont utilisés pour résoudre les noms d'hôte des clients avec des adresses IP privées, par exemple « 192.168.12.34 », en utilisant le DNS inversé. Si ce paramètre n'est pas défini, AdGuard Home utilise les adresses des résolveurs DNS par défaut de votre système d'exploitation, à l'exception des adresses d'AdGuard Home lui-même.",
|
"local_ptr_desc": "Les serveurs DNS utilisés par AdGuard Home pour les requêtes privées PTR, SOA et NS. Une requête est considérée privée si elle demande un domaine ARPA contenant un sous-réseau entre les plages IP privées (par exemple \"192.168.12.34\") et provient d'un client avec une adresse IP privée. Sans réglages additionnels, les résolveurs DNS par défaut de votre système d'exploitation seront utilisés, sauf pour les adresses IP d'AdGuard Home.",
|
||||||
"local_ptr_default_resolver": "Par défaut, AdGuard Home utilise les résolveurs DNS inversés suivants : {{ip}}.",
|
"local_ptr_default_resolver": "Par défaut, AdGuard Home utilise les résolveurs DNS inversés suivants : {{ip}}.",
|
||||||
"local_ptr_no_default_resolver": "AdGuard Home n'a pas pu déterminer de résolveurs DNS inversés privés appropriés pour ce système.",
|
"local_ptr_no_default_resolver": "AdGuard Home n'a pas pu déterminer de résolveurs DNS inversés privés appropriés pour ce système.",
|
||||||
"local_ptr_placeholder": "Saisissez une adresse IP par ligne",
|
"local_ptr_placeholder": "Saisissez une adresse IP par ligne",
|
||||||
"resolve_clients_title": "Activer la résolution inverse des adresses IP des clients",
|
"resolve_clients_title": "Activer la résolution inverse des adresses IP des clients",
|
||||||
"resolve_clients_desc": "Résoudre inversement les adresses IP des clients en leurs noms d'hôtes en envoyant des requêtes PTR aux résolveurs correspondants (serveurs DNS privés pour les clients locaux, serveurs en amont pour les clients ayant une adresse IP publique).",
|
"resolve_clients_desc": "Résoudre inversement les adresses IP des clients en leurs noms d'hôtes en envoyant des requêtes PTR aux résolveurs correspondants (serveurs DNS privés pour les clients locaux, serveurs en amont pour les clients ayant une adresse IP publique).",
|
||||||
"use_private_ptr_resolvers_title": "Utiliser des résolveurs DNS inversés privés",
|
"use_private_ptr_resolvers_title": "Utiliser des résolveurs DNS inversés privés",
|
||||||
"use_private_ptr_resolvers_desc": "Effectuer des recherches DNS inversées pour les adresses servies localement en utilisant ces serveurs en amont. S'il est désactivé, AdGuard Home répond avec NXDOMAIN à toutes les requêtes PTR de ce type, sauf pour les clients connus par DHCP, /etc/hosts, etc.",
|
"use_private_ptr_resolvers_desc": "Résolvez les requêtes PTR, SOA et NS pour les domaines ARPA contenant des adresses IP privées par aide des serveurs privés en amont, DHCP, /etc/hosts, etc. S'il est désactivé, AdGuard Home répondra à toutes ces requêtes avec NXDOMAIN.",
|
||||||
"check_dhcp_servers": "Rechercher les serveurs DHCP",
|
"check_dhcp_servers": "Rechercher les serveurs DHCP",
|
||||||
"save_config": "Sauvegarder la configuration",
|
"save_config": "Sauvegarder la configuration",
|
||||||
"enabled_dhcp": "Serveur DHCP activé",
|
"enabled_dhcp": "Serveur DHCP activé",
|
||||||
@@ -154,7 +154,7 @@
|
|||||||
"use_adguard_parental": "Utiliser le contrôle parental d'AdGuard",
|
"use_adguard_parental": "Utiliser le contrôle parental d'AdGuard",
|
||||||
"use_adguard_parental_hint": "AdGuard Home va vérifier s'il y a du contenu pour adultes sur le domaine. Ce sera fait par aide du même API discret que celui utilisé par le service de Sécurité de navigation.",
|
"use_adguard_parental_hint": "AdGuard Home va vérifier s'il y a du contenu pour adultes sur le domaine. Ce sera fait par aide du même API discret que celui utilisé par le service de Sécurité de navigation.",
|
||||||
"enforce_safe_search": "Utiliser la Recherche Sécurisée",
|
"enforce_safe_search": "Utiliser la Recherche Sécurisée",
|
||||||
"enforce_save_search_hint": "AdGuard Home appliquera la recherche sécurisée dans les moteurs de recherche suivants : Google, YouTube, Bing, DuckDuckGo, Yandex, Pixabay.",
|
"enforce_save_search_hint": "AdGuard Home appliquera la recherche sécurisée dans les moteurs de recherche suivants : Google, YouTube, Bing, DuckDuckGo, Ecosia, Yandex, Pixabay.",
|
||||||
"no_servers_specified": "Pas de serveurs spécifiés",
|
"no_servers_specified": "Pas de serveurs spécifiés",
|
||||||
"general_settings": "Paramètres généraux",
|
"general_settings": "Paramètres généraux",
|
||||||
"dns_settings": "Paramètres DNS",
|
"dns_settings": "Paramètres DNS",
|
||||||
@@ -236,6 +236,7 @@
|
|||||||
"updated_upstream_dns_toast": "Serveurs en amont enregistrés",
|
"updated_upstream_dns_toast": "Serveurs en amont enregistrés",
|
||||||
"dns_test_ok_toast": "Les serveurs DNS spécifiés fonctionnent correctement",
|
"dns_test_ok_toast": "Les serveurs DNS spécifiés fonctionnent correctement",
|
||||||
"dns_test_not_ok_toast": "Impossible d'utiliser le serveur « {{key}} »: veuillez vérifier si le nom saisi est bien correct",
|
"dns_test_not_ok_toast": "Impossible d'utiliser le serveur « {{key}} »: veuillez vérifier si le nom saisi est bien correct",
|
||||||
|
"dns_test_parsing_error_toast": "La section {{section}}: ligne {{line}}: n'a pas pu être utilisée, veuillez vérifier que vous l'avez écrite correctement",
|
||||||
"dns_test_warning_toast": "L'amont « {{key}} » ne répond pas aux demandes de test et peut ne pas fonctionner correctement",
|
"dns_test_warning_toast": "L'amont « {{key}} » ne répond pas aux demandes de test et peut ne pas fonctionner correctement",
|
||||||
"unblock": "Débloquer",
|
"unblock": "Débloquer",
|
||||||
"block": "Bloquer",
|
"block": "Bloquer",
|
||||||
@@ -243,6 +244,7 @@
|
|||||||
"allow_this_client": "Autoriser ce client",
|
"allow_this_client": "Autoriser ce client",
|
||||||
"block_for_this_client_only": "Bloquer uniquement pour ce client",
|
"block_for_this_client_only": "Bloquer uniquement pour ce client",
|
||||||
"unblock_for_this_client_only": "Débloquer uniquement pour ce client",
|
"unblock_for_this_client_only": "Débloquer uniquement pour ce client",
|
||||||
|
"add_persistent_client": "Ajouter comme client persistant",
|
||||||
"time_table_header": "Temps",
|
"time_table_header": "Temps",
|
||||||
"date": "Date",
|
"date": "Date",
|
||||||
"domain_name_table_header": "Nom de domaine",
|
"domain_name_table_header": "Nom de domaine",
|
||||||
@@ -292,6 +294,9 @@
|
|||||||
"blocked_response_ttl": "Réponse bloquée TTL",
|
"blocked_response_ttl": "Réponse bloquée TTL",
|
||||||
"blocked_response_ttl_desc": "Spécifie pendant combien de secondes les clients doivent mettre en cache une réponse filtrée",
|
"blocked_response_ttl_desc": "Spécifie pendant combien de secondes les clients doivent mettre en cache une réponse filtrée",
|
||||||
"form_enter_blocked_response_ttl": "Saisir le TTL de la réponse bloquée (secondes)",
|
"form_enter_blocked_response_ttl": "Saisir le TTL de la réponse bloquée (secondes)",
|
||||||
|
"upstream_timeout": "Délai d'attente en amont",
|
||||||
|
"upstream_timeout_desc": "Spécifie le nombre de secondes à attendre pour une réponse du serveur en amont",
|
||||||
|
"form_enter_upstream_timeout": "Saisir le délai d'attente du serveur en amont en secondes",
|
||||||
"dnscrypt": "DNSCrypt",
|
"dnscrypt": "DNSCrypt",
|
||||||
"dns_over_https": "DNS-over-HTTPS",
|
"dns_over_https": "DNS-over-HTTPS",
|
||||||
"dns_over_tls": "DNS-over-TLS",
|
"dns_over_tls": "DNS-over-TLS",
|
||||||
@@ -423,6 +428,9 @@
|
|||||||
"encryption_hostnames": "Noms d'hôte",
|
"encryption_hostnames": "Noms d'hôte",
|
||||||
"encryption_reset": "Voulez-vous vraiment réinitialiser les paramètres de chiffrement ?",
|
"encryption_reset": "Voulez-vous vraiment réinitialiser les paramètres de chiffrement ?",
|
||||||
"encryption_warning": "Attention",
|
"encryption_warning": "Attention",
|
||||||
|
"encryption_plain_dns_enable": "Activer le DNS simple",
|
||||||
|
"encryption_plain_dns_desc": "Le DNS simple est activé par défaut. Vous pouvez le désactiver pour forcer tous les appareils à utiliser un DNS crypté. Pour faire ça, vous devez activer au moins un protocole DNS crypté",
|
||||||
|
"encryption_plain_dns_error": "Pour désactiver le DNS simple, activez au moins un protocole DNS crypté",
|
||||||
"topline_expiring_certificate": "Votre certificat SSL est sur le point d'expirer. Mettez à jour vos <0>Paramètres de chiffrement</0>.",
|
"topline_expiring_certificate": "Votre certificat SSL est sur le point d'expirer. Mettez à jour vos <0>Paramètres de chiffrement</0>.",
|
||||||
"topline_expired_certificate": "Votre certificat SSL a expiré. Mettez à jour vos <0>Paramètres de chiffrement</0>.",
|
"topline_expired_certificate": "Votre certificat SSL a expiré. Mettez à jour vos <0>Paramètres de chiffrement</0>.",
|
||||||
"form_error_port_range": "Saisissez une valeur de port entre 80 et 65535",
|
"form_error_port_range": "Saisissez une valeur de port entre 80 et 65535",
|
||||||
@@ -462,6 +470,7 @@
|
|||||||
"form_add_id": "Ajouter identifiant",
|
"form_add_id": "Ajouter identifiant",
|
||||||
"form_client_name": "Saisissez le nom du client",
|
"form_client_name": "Saisissez le nom du client",
|
||||||
"name": "Nom",
|
"name": "Nom",
|
||||||
|
"client_name": "Client {{id}}",
|
||||||
"client_global_settings": "Utiliser les paramètres généraux",
|
"client_global_settings": "Utiliser les paramètres généraux",
|
||||||
"client_deleted": "Le client « {{key}} » a été supprimé",
|
"client_deleted": "Le client « {{key}} » a été supprimé",
|
||||||
"client_added": "Le client « {{key}} » a été ajouté",
|
"client_added": "Le client « {{key}} » a été ajouté",
|
||||||
@@ -592,7 +601,7 @@
|
|||||||
"disable_ipv6": "Désactiver la résolution des adresses IPv6",
|
"disable_ipv6": "Désactiver la résolution des adresses IPv6",
|
||||||
"disable_ipv6_desc": "Supprimer toutes les requêtes DNS pour les adresses IPv6 (type AAAA) et supprimer les indices IPv6 des réponses HTTPS.",
|
"disable_ipv6_desc": "Supprimer toutes les requêtes DNS pour les adresses IPv6 (type AAAA) et supprimer les indices IPv6 des réponses HTTPS.",
|
||||||
"fastest_addr": "Adresse IP la plus rapide",
|
"fastest_addr": "Adresse IP la plus rapide",
|
||||||
"fastest_addr_desc": "Rechercher tous les serveurs DNS et renvoyer l’adresse IP la plus rapide parmi toutes les réponses. Cela ralentit les requêtes DNS car AdGuard Home doit attendre les réponses de tous les serveurs DNS, mais la connectivité globale s'améliore.",
|
"fastest_addr_desc": "Attente les réponses de <b>tous</b> les serveurs DNS, mesure de la vitesse de connexion TCP pour chaque serveur et renvoi de l'adresse IP du serveur avec la vitesse de connexion la plus rapide.<br/>Ce mode peut considérablement ralentir les requêtes DNS, si un ou plusieurs serveurs en amont ne répondent pas. Assurez-vous que vos serveurs en amont sont stables et que votre délai dépassé en amont est faible.",
|
||||||
"autofix_warning_text": "Si vous cliquez sur « Réparer », AdGuard Home configurera votre système pour utiliser le serveur DNS AdGuard Home.",
|
"autofix_warning_text": "Si vous cliquez sur « Réparer », AdGuard Home configurera votre système pour utiliser le serveur DNS AdGuard Home.",
|
||||||
"autofix_warning_list": "Ceci effectuera les tâches suivantes : <0>Désactiver le système DNSStubListener</0> <0>Définir l’adresse du serveur DNS à 127.0.0.1 </0> <0>Remplacer la cible du lien symbolique de /etc/resolv.conf par /run/systemd/resolve/resolv.conf</0> <0>Arrêter DNSStubListener (recharger le service résolu par systemd)</0>",
|
"autofix_warning_list": "Ceci effectuera les tâches suivantes : <0>Désactiver le système DNSStubListener</0> <0>Définir l’adresse du serveur DNS à 127.0.0.1 </0> <0>Remplacer la cible du lien symbolique de /etc/resolv.conf par /run/systemd/resolve/resolv.conf</0> <0>Arrêter DNSStubListener (recharger le service résolu par systemd)</0>",
|
||||||
"autofix_warning_result": "Par conséquent, toutes les demandes DNS de votre système seront traitées par AdGuardHome par défaut.",
|
"autofix_warning_result": "Par conséquent, toutes les demandes DNS de votre système seront traitées par AdGuardHome par défaut.",
|
||||||
@@ -670,9 +679,9 @@
|
|||||||
"filter_allowlist": "ATTENTION : Cette action exclura également la règle « {{disallowed_rule}} » de la liste des clients autorisés.",
|
"filter_allowlist": "ATTENTION : Cette action exclura également la règle « {{disallowed_rule}} » de la liste des clients autorisés.",
|
||||||
"last_rule_in_allowlist": "Impossible d’interdire ce client, car l’exclusion de la règle « {{disallowed_rule}} » DÉSACTIVERA la liste des « clients autorisés ».",
|
"last_rule_in_allowlist": "Impossible d’interdire ce client, car l’exclusion de la règle « {{disallowed_rule}} » DÉSACTIVERA la liste des « clients autorisés ».",
|
||||||
"use_saved_key": "Utiliser la clef précédemment enregistrée",
|
"use_saved_key": "Utiliser la clef précédemment enregistrée",
|
||||||
"parental_control": "Contrôle parental",
|
"parental_control": "Contrôle Parental",
|
||||||
"safe_browsing": "Navigation sécurisée",
|
"safe_browsing": "Navigation sécurisée",
|
||||||
"served_from_cache": "{{value}} <i>(depuis le cache)</i>",
|
"served_from_cache_label": "Servi depuis le cache",
|
||||||
"form_error_password_length": "Le mot de passe doit comporter entre {{min}} et {{max}} caractères",
|
"form_error_password_length": "Le mot de passe doit comporter entre {{min}} et {{max}} caractères",
|
||||||
"anonymizer_notification": "<0>Note :</0> L'anonymisation IP est activée. Vous pouvez la désactiver dans les <1>paramètres généraux</1>.",
|
"anonymizer_notification": "<0>Note :</0> L'anonymisation IP est activée. Vous pouvez la désactiver dans les <1>paramètres généraux</1>.",
|
||||||
"confirm_dns_cache_clear": "Voulez-vous vraiment vider le cache DNS ?",
|
"confirm_dns_cache_clear": "Voulez-vous vraiment vider le cache DNS ?",
|
||||||
|
|||||||
@@ -13,14 +13,14 @@
|
|||||||
"fallback_dns_desc": "Popis rezervnih DNS poslužitelja koji se koriste kada uzvodni DNS poslužitelji ne odgovaraju. Sintaksa je ista kao u gornjem polju glavnog uzvodnog toka.",
|
"fallback_dns_desc": "Popis rezervnih DNS poslužitelja koji se koriste kada uzvodni DNS poslužitelji ne odgovaraju. Sintaksa je ista kao u gornjem polju glavnog uzvodnog toka.",
|
||||||
"fallback_dns_placeholder": "Unesite jedan rezervni DNS poslužitelj po retku",
|
"fallback_dns_placeholder": "Unesite jedan rezervni DNS poslužitelj po retku",
|
||||||
"local_ptr_title": "Privatni obrnuti DNS poslužitelji",
|
"local_ptr_title": "Privatni obrnuti DNS poslužitelji",
|
||||||
"local_ptr_desc": "DNS poslužitelji koje AdGuard Home koristi za lokalne PTR upite. Ti se poslužitelji koriste za razrješavanje naziva glavnog računala klijenata s privatnim IP adresama, na primjer \"192.168.12.34\", koristeći obrnuti DNS. Ako nije postavljeno, AdGuard Home koristi adrese zadanih DNS razrješivača vašeg OS-a, osim za adrese samog AdGuard Homea.",
|
"local_ptr_desc": "DNS poslužitelji koje koristi AdGuard Home za privatne PTR, SOA i NS zahtjeve. Zahtjev se smatra privatnim ako traži ARPA domenu koja sadrži podmrežu unutar privatnih IP raspona (kao što je \"192.168.12.34\") i dolazi od klijenta s privatnom IP adresom. Ako nije postavljeno, koristit će se zadani DNS rezolveri vašeg OS-a, osim za AdGuard Home IP adrese.",
|
||||||
"local_ptr_default_resolver": "Prema zadanim postavkama AdGuard Home koristi sljedeće obrnute DNS razrješivače: {{ip}}.",
|
"local_ptr_default_resolver": "Prema zadanim postavkama AdGuard Home koristi sljedeće obrnute DNS razrješivače: {{ip}}.",
|
||||||
"local_ptr_no_default_resolver": "AdGuard Home nije mogao odrediti prikladne privatne obrnute DNS razrješivače za ovaj sustav.",
|
"local_ptr_no_default_resolver": "AdGuard Home nije mogao odrediti prikladne privatne obrnute DNS razrješivače za ovaj sustav.",
|
||||||
"local_ptr_placeholder": "Unesite jednu adresu poslužitelja po retku",
|
"local_ptr_placeholder": "Unesite jednu adresu poslužitelja po retku",
|
||||||
"resolve_clients_title": "Omogući obrnuto rješavanje IP adresa klijenata",
|
"resolve_clients_title": "Omogući obrnuto rješavanje IP adresa klijenata",
|
||||||
"resolve_clients_desc": "Obrnuto razriješite IP adrese klijenata u nazive glavnih računala slanjem PTR upita odgovarajućim razrješivačima (privatni DNS poslužitelji za lokalne klijente, uzvodni poslužitelji za klijente s javnim IP adresama).",
|
"resolve_clients_desc": "Obrnuto razriješite IP adrese klijenata u nazive glavnih računala slanjem PTR upita odgovarajućim razrješivačima (privatni DNS poslužitelji za lokalne klijente, uzvodni poslužitelji za klijente s javnim IP adresama).",
|
||||||
"use_private_ptr_resolvers_title": "Koristi privatne reverzne DNS razrješivače",
|
"use_private_ptr_resolvers_title": "Koristi privatne reverzne DNS razrješivače",
|
||||||
"use_private_ptr_resolvers_desc": "Izvršite obrnuta DNS traženja za lokalno poslužene adrese pomoću ovih uzlaznih poslužitelja. Ako je onemogućen, AdGuard Home odgovara S NXDOMAIN-om na sve takve PTR zahtjeve osim za klijente poznate iz DHCP-a, /etc/hosts i tako dalje.",
|
"use_private_ptr_resolvers_desc": "Razriješi PTR, SOA i NS zahtjeve za ARPA domene koje sadrže privatne IP adrese putem privatnih uzvodnih poslužitelja, DHCP-a, /etc/hostova itd. Ako je onemogućeno, AdGuard Home će na sve takve zahtjeve odgovoriti s NXDOMAIN.",
|
||||||
"check_dhcp_servers": "Provjera DHCP poslužitelja",
|
"check_dhcp_servers": "Provjera DHCP poslužitelja",
|
||||||
"save_config": "Spremi konfiguraciju",
|
"save_config": "Spremi konfiguraciju",
|
||||||
"enabled_dhcp": "DHCP poslužitelj je omogućen",
|
"enabled_dhcp": "DHCP poslužitelj je omogućen",
|
||||||
@@ -236,6 +236,7 @@
|
|||||||
"updated_upstream_dns_toast": "Uzvodni poslužitelji uspješno su spremljeni",
|
"updated_upstream_dns_toast": "Uzvodni poslužitelji uspješno su spremljeni",
|
||||||
"dns_test_ok_toast": "Odabrani DNS poslužitelji su trenutno aktivni",
|
"dns_test_ok_toast": "Odabrani DNS poslužitelji su trenutno aktivni",
|
||||||
"dns_test_not_ok_toast": "\"{{key}}\" poslužitelja: ne može se upotrijebiti, provjerite jeste li to ispravno napisali",
|
"dns_test_not_ok_toast": "\"{{key}}\" poslužitelja: ne može se upotrijebiti, provjerite jeste li to ispravno napisali",
|
||||||
|
"dns_test_parsing_error_toast": "Odjeljak {{section}}: redak {{line}}: nije moguće koristiti, provjerite jeste li ispravno napisali",
|
||||||
"dns_test_warning_toast": "Upstream \"{{key}}\" ne odgovara na zahtjeve za testiranje i možda neće raditi ispravno",
|
"dns_test_warning_toast": "Upstream \"{{key}}\" ne odgovara na zahtjeve za testiranje i možda neće raditi ispravno",
|
||||||
"unblock": "Odblokiraj",
|
"unblock": "Odblokiraj",
|
||||||
"block": "Blokiraj",
|
"block": "Blokiraj",
|
||||||
@@ -243,6 +244,7 @@
|
|||||||
"allow_this_client": "Omogući ovog klijenta",
|
"allow_this_client": "Omogući ovog klijenta",
|
||||||
"block_for_this_client_only": "Blokiraj samo za ovog klijenta",
|
"block_for_this_client_only": "Blokiraj samo za ovog klijenta",
|
||||||
"unblock_for_this_client_only": "Odblokiraj samo za ovog klijenta",
|
"unblock_for_this_client_only": "Odblokiraj samo za ovog klijenta",
|
||||||
|
"add_persistent_client": "Dodaj u spremljene klijente",
|
||||||
"time_table_header": "Vrijeme",
|
"time_table_header": "Vrijeme",
|
||||||
"date": "Datum",
|
"date": "Datum",
|
||||||
"domain_name_table_header": "Naziv domene",
|
"domain_name_table_header": "Naziv domene",
|
||||||
@@ -423,6 +425,9 @@
|
|||||||
"encryption_hostnames": "Nazivi računala",
|
"encryption_hostnames": "Nazivi računala",
|
||||||
"encryption_reset": "Jeste li sigurni da želite poništiti postavke šifriranja?",
|
"encryption_reset": "Jeste li sigurni da želite poništiti postavke šifriranja?",
|
||||||
"encryption_warning": "Upozorenje",
|
"encryption_warning": "Upozorenje",
|
||||||
|
"encryption_plain_dns_enable": "Omogući obični DNS",
|
||||||
|
"encryption_plain_dns_desc": "Obični DNS je omogućen prema zadanim postavkama. Možete ga onemogućiti kako biste prisilili sve uređaje da koriste šifrirani DNS. Da biste to učinili, morate omogućiti barem jedan kriptirani DNS protokol",
|
||||||
|
"encryption_plain_dns_error": "Da biste onemogućili obični DNS, omogućite barem jedan kriptirani DNS protokol",
|
||||||
"topline_expiring_certificate": "Vaš SSL certifikat uskoro ističe. Ažurirajte <0>Postavke šifriranja</0>.",
|
"topline_expiring_certificate": "Vaš SSL certifikat uskoro ističe. Ažurirajte <0>Postavke šifriranja</0>.",
|
||||||
"topline_expired_certificate": "Vaš SSL certifikat je istekao. Ažurirajte <0>Postavke šifriranja</0>.",
|
"topline_expired_certificate": "Vaš SSL certifikat je istekao. Ažurirajte <0>Postavke šifriranja</0>.",
|
||||||
"form_error_port_range": "Unesite broj porta od 80 do 65536",
|
"form_error_port_range": "Unesite broj porta od 80 do 65536",
|
||||||
@@ -462,6 +467,7 @@
|
|||||||
"form_add_id": "Dodaj identifikator",
|
"form_add_id": "Dodaj identifikator",
|
||||||
"form_client_name": "Unesite naziv klijenta",
|
"form_client_name": "Unesite naziv klijenta",
|
||||||
"name": "Naziv",
|
"name": "Naziv",
|
||||||
|
"client_name": "Klijent {{id}}",
|
||||||
"client_global_settings": "Koristi globalne postavke",
|
"client_global_settings": "Koristi globalne postavke",
|
||||||
"client_deleted": "Klijent \"{{key}}\" je uspješno uklonjen",
|
"client_deleted": "Klijent \"{{key}}\" je uspješno uklonjen",
|
||||||
"client_added": "Klijent \"{{key}}\" je uspješno dodan",
|
"client_added": "Klijent \"{{key}}\" je uspješno dodan",
|
||||||
@@ -672,7 +678,7 @@
|
|||||||
"use_saved_key": "Korištenje prethodno spremljenog ključa",
|
"use_saved_key": "Korištenje prethodno spremljenog ključa",
|
||||||
"parental_control": "Roditeljska zaštita",
|
"parental_control": "Roditeljska zaštita",
|
||||||
"safe_browsing": "Sigurno surfanje",
|
"safe_browsing": "Sigurno surfanje",
|
||||||
"served_from_cache": "{{value}} <i>(dohvaćeno iz predmemorije)</i>",
|
"served_from_cache_label": "Posluženo iz predmemorije",
|
||||||
"form_error_password_length": "Lozinka mora sadržavati od {{min}} do {{max}} znakova",
|
"form_error_password_length": "Lozinka mora sadržavati od {{min}} do {{max}} znakova",
|
||||||
"anonymizer_notification": "<0>Napomena:</0>IP anonimizacija je omogućena. Možete ju onemogućiti u <1>općim postavkama</1>.",
|
"anonymizer_notification": "<0>Napomena:</0>IP anonimizacija je omogućena. Možete ju onemogućiti u <1>općim postavkama</1>.",
|
||||||
"confirm_dns_cache_clear": "Jeste li sigurni da želite očistiti DNS predmemoriju?",
|
"confirm_dns_cache_clear": "Jeste li sigurni da želite očistiti DNS predmemoriju?",
|
||||||
|
|||||||
@@ -236,6 +236,7 @@
|
|||||||
"updated_upstream_dns_toast": "Upstream szerverek sikeresen mentve",
|
"updated_upstream_dns_toast": "Upstream szerverek sikeresen mentve",
|
||||||
"dns_test_ok_toast": "A megadott DNS-kiszolgálók megfelelően működnek",
|
"dns_test_ok_toast": "A megadott DNS-kiszolgálók megfelelően működnek",
|
||||||
"dns_test_not_ok_toast": "Szerver \"{{key}}\": nem használható, ellenőrizze, hogy helyesen írta-e be",
|
"dns_test_not_ok_toast": "Szerver \"{{key}}\": nem használható, ellenőrizze, hogy helyesen írta-e be",
|
||||||
|
"dns_test_parsing_error_toast": "Szekció {{section}}: sor {{line}}: nem használható, ellenőrizze, hogy helyesen írta-e be",
|
||||||
"dns_test_warning_toast": "A \"{{key}}\" feltöltés nem válaszol a tesztkérelmekre, és lehet, hogy nem működik megfelelően",
|
"dns_test_warning_toast": "A \"{{key}}\" feltöltés nem válaszol a tesztkérelmekre, és lehet, hogy nem működik megfelelően",
|
||||||
"unblock": "Feloldás",
|
"unblock": "Feloldás",
|
||||||
"block": "Blokkolás",
|
"block": "Blokkolás",
|
||||||
@@ -243,6 +244,7 @@
|
|||||||
"allow_this_client": "Engedélyezés ennek a kliensnek",
|
"allow_this_client": "Engedélyezés ennek a kliensnek",
|
||||||
"block_for_this_client_only": "Tiltás csak ennek a kliensnek",
|
"block_for_this_client_only": "Tiltás csak ennek a kliensnek",
|
||||||
"unblock_for_this_client_only": "Feloldás csak ennek a kliensnek",
|
"unblock_for_this_client_only": "Feloldás csak ennek a kliensnek",
|
||||||
|
"add_persistent_client": "Hozzáadás állandó ügyfélként",
|
||||||
"time_table_header": "Idő",
|
"time_table_header": "Idő",
|
||||||
"date": "Dátum",
|
"date": "Dátum",
|
||||||
"domain_name_table_header": "Domain név",
|
"domain_name_table_header": "Domain név",
|
||||||
@@ -462,6 +464,7 @@
|
|||||||
"form_add_id": "Azonosító hozzáadása",
|
"form_add_id": "Azonosító hozzáadása",
|
||||||
"form_client_name": "Adja meg a kliens nevét",
|
"form_client_name": "Adja meg a kliens nevét",
|
||||||
"name": "Név",
|
"name": "Név",
|
||||||
|
"client_name": "Ügyfél {{id}}",
|
||||||
"client_global_settings": "Globális beállítások használata",
|
"client_global_settings": "Globális beállítások használata",
|
||||||
"client_deleted": "A(z) \"{{key}}\" kliens sikeresen el lett távolítva",
|
"client_deleted": "A(z) \"{{key}}\" kliens sikeresen el lett távolítva",
|
||||||
"client_added": "A(z) \"{{key}}\" kliens sikeresen hozzá lett adva",
|
"client_added": "A(z) \"{{key}}\" kliens sikeresen hozzá lett adva",
|
||||||
|
|||||||
@@ -1,26 +1,26 @@
|
|||||||
{
|
{
|
||||||
"client_settings": "Pengaturan klien",
|
"client_settings": "Pengaturan klien",
|
||||||
"example_upstream_reserved": "upstream <0>untuk domain spesifik</0>;",
|
"example_upstream_reserved": "hulu <0>untuk domain tertentu</0>;",
|
||||||
"example_multiple_upstreams_reserved": "beberapa server upstream <0>untuk domain spesifik</0>;",
|
"example_multiple_upstreams_reserved": "beberapa hulu <0>untuk domain tertentu</0>;",
|
||||||
"example_upstream_comment": "komentar.",
|
"example_upstream_comment": "komentar.",
|
||||||
"upstream_parallel": "Gunakan kueri paralel untuk mempercepat resoluasi dengan menanyakan semua server upstream secara bersamaan",
|
"upstream_parallel": "Gunakan kueri paralel untuk mempercepat penyelesaian dengan mengkueri seluruh server hulu secara bersamaan.",
|
||||||
"parallel_requests": "Permintaan paralel",
|
"parallel_requests": "Permintaan paralel",
|
||||||
"load_balancing": "Penyeimbang beban",
|
"load_balancing": "Penyeimbang beban",
|
||||||
"load_balancing_desc": "Permintaan satu server pada satu waktu. AdGuard Home akan menggunakan algoritma acak tertimbang untuk memilih server sehingga server tercepat akan lebih sering digunakan.",
|
"load_balancing_desc": "Permintaan satu server pada satu waktu. AdGuard Home akan menggunakan algoritma acak tertimbang untuk memilih server sehingga server tercepat akan lebih sering digunakan.",
|
||||||
"bootstrap_dns": "Server DNS bootstrap",
|
"bootstrap_dns": "Server DNS bootstrap",
|
||||||
"bootstrap_dns_desc": "Alamat IP server DNS yang digunakan untuk menyelesaikan alamat IP resolver DoH/DoT yang Anda tentukan sebagai upstream. Komentar tidak diizinkan.",
|
"bootstrap_dns_desc": "Alamat IP server DNS yang digunakan untuk menyelesaikan alamat IP penyelesai DoH/DoT yang Anda tentukan sebagai hulu. Tidak diizinkan untuk berkomentar.",
|
||||||
"fallback_dns_title": "Server DNS cadangan",
|
"fallback_dns_title": "Server DNS cadangan",
|
||||||
"fallback_dns_desc": "Daftar server DNS cadangan yang digunakan ketika server DNS hulu tidak merespons. Sintaksnya sama dengan bidang hulu utama di atas.",
|
"fallback_dns_desc": "Daftar server DNS cadangan yang digunakan ketika server hulu DNS tidak merespons. Sintaksnya sama dengan kolom hulu utama di atas.",
|
||||||
"fallback_dns_placeholder": "Masukkan satu server DNS cadangan per baris",
|
"fallback_dns_placeholder": "Masukkan satu server DNS cadangan per baris",
|
||||||
"local_ptr_title": "Server pembalik DNS pribadi",
|
"local_ptr_title": "Server pembalik DNS pribadi",
|
||||||
"local_ptr_desc": "Server DNS yang digunakan AdGuard Home untuk kueri PTR lokal. Server ini digunakan untuk menyelesaikan nama host klien dengan alamat IP pribadi, misalnya \"192.168.12.34\", menggunakan DNS terbalik. Jika tidak disetel, AdGuard Home menggunakan alamat resolver DNS default OS Anda kecuali untuk alamat AdGuard Home itu sendiri.",
|
"local_ptr_desc": "Server DNS yang digunakan oleh AdGuard Home untuk permintaan PTR, SOA, dan NS pribadi. Permintaan dianggap pribadi jika meminta domain ARPA yang berisi subnet dalam rentang IP pribadi (seperti \"192.168.12.34\") dan berasal dari klien dengan alamat IP pribadi. Jika tidak ditetapkan, standar pemecah DNS milik OS Anda akan digunakan, kecuali untuk alamat IP AdGuard Home.",
|
||||||
"local_ptr_default_resolver": "Secara bawaan, AdGuard Home menggunakan pemecah DNS terbalik: {{ip}}.",
|
"local_ptr_default_resolver": "Secara bawaan, AdGuard Home menggunakan pemecah DNS terbalik: {{ip}}.",
|
||||||
"local_ptr_no_default_resolver": "AdGuard Home tidak dapat menentukan pemecah DNS terbalik yang sesuai untuk sistem ini.",
|
"local_ptr_no_default_resolver": "AdGuard Home tidak dapat menentukan pemecah DNS terbalik yang sesuai untuk sistem ini.",
|
||||||
"local_ptr_placeholder": "Masukkan satu alamat IP per baris",
|
"local_ptr_placeholder": "Masukkan satu alamat IP per baris",
|
||||||
"resolve_clients_title": "Aktifkan resolusi hostname klien",
|
"resolve_clients_title": "Aktifkan resolusi hostname klien",
|
||||||
"resolve_clients_desc": "Menyelesaikan alamat IP klien secara terbalik ke nama host mereka dengan mengirimkan kueri PTR ke resolver yang sesuai (server DNS pribadi untuk klien lokal, server upstream untuk klien dengan alamat IP publik).",
|
"resolve_clients_desc": "Selesaikan alamat IP klien secara terbalik ke dalam nama host mereka dengan mengirimkan kueri PTR ke penyelesai yang sesuai (server DNS pribadi untuk klien lokal, server hulu untuk klien dengan alamat IP publik).",
|
||||||
"use_private_ptr_resolvers_title": "Gunakan server pembalik DNS pribadi",
|
"use_private_ptr_resolvers_title": "Gunakan server pembalik DNS pribadi",
|
||||||
"use_private_ptr_resolvers_desc": "Lakukan pencarian DNS terbalik untuk alamat yang disajikan secara lokal menggunakan server upstream ini. Jika dinonaktifkan, Adguard Home merespon dengan NXDOMAIN untuk semua permintaan PTR tersebut kecuali untuk klien yang diketahui dari DHCP, /etc/hosts, dan seterusnya.",
|
"use_private_ptr_resolvers_desc": "Menyelesaikan permintaan PTR, SOA, dan NS untuk domain ARPA yang berisi alamat IP pribadi melalui server hulu pribadi, DHCP, /etc/hosts, dll. Jika dinonaktifkan, AdGuard Home akan merespons semua permintaan tersebut dengan NXDOMAIN.",
|
||||||
"check_dhcp_servers": "Cek untuk server DHCP",
|
"check_dhcp_servers": "Cek untuk server DHCP",
|
||||||
"save_config": "Simpan pengaturan",
|
"save_config": "Simpan pengaturan",
|
||||||
"enabled_dhcp": "Server DHCP diaktifkan",
|
"enabled_dhcp": "Server DHCP diaktifkan",
|
||||||
@@ -49,12 +49,12 @@
|
|||||||
"form_error_server_name": "Nama server tidak valid",
|
"form_error_server_name": "Nama server tidak valid",
|
||||||
"form_error_subnet": "Subnet \"{{cidr}}\" tidak berisi alamat IP \"{{ip}}\"",
|
"form_error_subnet": "Subnet \"{{cidr}}\" tidak berisi alamat IP \"{{ip}}\"",
|
||||||
"form_error_positive": "Harus lebih dari 0",
|
"form_error_positive": "Harus lebih dari 0",
|
||||||
"form_error_gateway_ip": "Sewa tidak dapat memiliki alamat IP gateway",
|
"form_error_gateway_ip": "Lease tidak dapat memiliki gerbang alamat IP",
|
||||||
"out_of_range_error": "Harus di luar rentang \"{{start}}\"-\"{{end}}\"",
|
"out_of_range_error": "Harus di luar rentang \"{{start}}\"-\"{{end}}\"",
|
||||||
"lower_range_start_error": "Harus lebih rendah dari rentang awal",
|
"lower_range_start_error": "Harus lebih rendah dari rentang awal",
|
||||||
"greater_range_start_error": "Harus lebih besar dari rentang awal",
|
"greater_range_start_error": "Harus lebih besar dari rentang awal",
|
||||||
"subnet_error": "Alamat harus dalam satu subnet",
|
"subnet_error": "Alamat harus dalam satu subnet",
|
||||||
"gateway_or_subnet_invalid": "Subnet mask tidak valid",
|
"gateway_or_subnet_invalid": "Subnet samaran tidak valid",
|
||||||
"dhcp_form_gateway_input": "IP gateway",
|
"dhcp_form_gateway_input": "IP gateway",
|
||||||
"dhcp_form_subnet_input": "Subnet mask",
|
"dhcp_form_subnet_input": "Subnet mask",
|
||||||
"dhcp_form_range_title": "Rentang alamat IP",
|
"dhcp_form_range_title": "Rentang alamat IP",
|
||||||
@@ -68,7 +68,7 @@
|
|||||||
"ip": "IP",
|
"ip": "IP",
|
||||||
"dhcp_table_hostname": "Nama host",
|
"dhcp_table_hostname": "Nama host",
|
||||||
"dhcp_table_expires": "Kadaluwarsa",
|
"dhcp_table_expires": "Kadaluwarsa",
|
||||||
"dhcp_warning": "Jika anda ingin mengaktifkan server DHCP bawaan, pastikan tidak ada server DHCP lain yang aktif. Jika tidak, akan memutus koneksi internet pada perangkat yang telah terhubung!",
|
"dhcp_warning": "Jika Anda tetap ingin mengaktifkan server DHCP, pastikan tidak ada server DHCP lain yang aktif di jaringan Anda, karena hal ini dapat memutus konektivitas Internet untuk perangkat di jaringan!",
|
||||||
"dhcp_error": "AdGuard Home tidak dapat menentukan apakah ada server DHCP aktif lain pada jaringan",
|
"dhcp_error": "AdGuard Home tidak dapat menentukan apakah ada server DHCP aktif lain pada jaringan",
|
||||||
"dhcp_static_ip_error": "Jika ingin menggunakan server DHCP, alamat IP statis harus diatur. AdGuard Home gagal menentukan jika antarmuka jaringan ini dikonfigurasi menggunakan alamat IP statis. Silakan atur alamat IP statis secara manual.",
|
"dhcp_static_ip_error": "Jika ingin menggunakan server DHCP, alamat IP statis harus diatur. AdGuard Home gagal menentukan jika antarmuka jaringan ini dikonfigurasi menggunakan alamat IP statis. Silakan atur alamat IP statis secara manual.",
|
||||||
"dhcp_dynamic_ip_found": "Sistem Anda menggunakan konfigurasi alamat IP dinamis untuk antarmuka <0>{{interfaceName}}</0>. Untuk menggunakan server DHCP, alamat IP statis harus ditetapkan. Alamat IP Anda saat ini adalah <0>{{ipAddress}}</0>. AdGuard Home akan secara otomatis menetapkan alamat IP ini sebagai statis jika Anda menekan tombol Aktifkan DHCP.",
|
"dhcp_dynamic_ip_found": "Sistem Anda menggunakan konfigurasi alamat IP dinamis untuk antarmuka <0>{{interfaceName}}</0>. Untuk menggunakan server DHCP, alamat IP statis harus ditetapkan. Alamat IP Anda saat ini adalah <0>{{ipAddress}}</0>. AdGuard Home akan secara otomatis menetapkan alamat IP ini sebagai statis jika Anda menekan tombol Aktifkan DHCP.",
|
||||||
@@ -117,8 +117,8 @@
|
|||||||
"refresh_statics": "Segarkan statistik",
|
"refresh_statics": "Segarkan statistik",
|
||||||
"dns_query": "Kueri DNS",
|
"dns_query": "Kueri DNS",
|
||||||
"blocked_by": "<0>Diblokir oleh</0>",
|
"blocked_by": "<0>Diblokir oleh</0>",
|
||||||
"stats_malware_phishing": "Malware/phishing diblokir",
|
"stats_malware_phishing": "Malware/phishing terblokir",
|
||||||
"stats_adult": "Situs dewasa diblokir",
|
"stats_adult": "Situs dewasa terblokir",
|
||||||
"stats_query_domain": "Kueri domain teratas",
|
"stats_query_domain": "Kueri domain teratas",
|
||||||
"for_last_hours": "selama {{count}} jam terakhir",
|
"for_last_hours": "selama {{count}} jam terakhir",
|
||||||
"for_last_hours_plural": "selama {{count}} jam terakhir",
|
"for_last_hours_plural": "selama {{count}} jam terakhir",
|
||||||
@@ -132,29 +132,29 @@
|
|||||||
"top_clients": "Klien teratas",
|
"top_clients": "Klien teratas",
|
||||||
"no_clients_found": "Tidak ditemukan klien",
|
"no_clients_found": "Tidak ditemukan klien",
|
||||||
"general_statistics": "Statistik umum",
|
"general_statistics": "Statistik umum",
|
||||||
"top_upstreams": "Top servers upstream",
|
"top_upstreams": "Hulu teratas",
|
||||||
"no_upstreams_data_found": "Tidak ada data server upstream yang ditemukan",
|
"no_upstreams_data_found": "Tidak ada data hulu yang ditemukan",
|
||||||
"number_of_dns_query_days": "Jumlah kueri DNS diproses selama {{value}} hari terakhir",
|
"number_of_dns_query_days": "Jumlah kueri DNS diproses selama {{value}} hari terakhir",
|
||||||
"number_of_dns_query_days_plural": "Jumlah kueri DNS yang diproses selama {{count}} hari terakhir",
|
"number_of_dns_query_days_plural": "Jumlah kueri DNS yang diproses selama {{count}} hari terakhir",
|
||||||
"number_of_dns_query_hours": "Jumlah kueri DNS diproses selama {{{count}} jam terakhir",
|
"number_of_dns_query_hours": "Jumlah kueri DNS diproses selama {{{count}} jam terakhir",
|
||||||
"number_of_dns_query_hours_plural": "Jumlah kueri DNS diproses selama {{count}} jam terakhir",
|
"number_of_dns_query_hours_plural": "Jumlah kueri DNS diproses selama {{count}} jam terakhir",
|
||||||
"number_of_dns_query_blocked_24_hours": "Julah DNS diblokir oleh penyaring adblock dan daftar blokir hosts",
|
"number_of_dns_query_blocked_24_hours": "Jumlah permintaan DNS yang diblokir oleh filter adblock dan daftar hitam host",
|
||||||
"number_of_dns_query_blocked_24_hours_by_sec": "Jumlah perminataan DNS diblokir oleh modul Kemanan Penjelajahan AdGuard",
|
"number_of_dns_query_blocked_24_hours_by_sec": "Jumlah permintaan DNS yang diblokir oleh modul keamanan penjelajahan AdGuard",
|
||||||
"number_of_dns_query_blocked_24_hours_adult": "Jumlah website dewasa diblokir",
|
"number_of_dns_query_blocked_24_hours_adult": "Jumlah situs web dewasa yang diblokir",
|
||||||
"enforced_save_search": "Paksa pencarian aman",
|
"enforced_save_search": "Paksa pencarian aman",
|
||||||
"number_of_dns_query_to_safe_search": "Jumlah perminataan DNS ke mesin pencari yang dipaksa Pencarian Aman",
|
"number_of_dns_query_to_safe_search": "Jumlah perminataan DNS ke mesin pencari yang dipaksa Pencarian Aman",
|
||||||
"average_processing_time": "Rata-rata waktu pemrosesan",
|
"average_processing_time": "Rata-rata waktu pemrosesan",
|
||||||
"average_upstream_response_time": "Waktu respons server upstream rata-rata",
|
"average_upstream_response_time": "Rata-rata waktu respons hulu",
|
||||||
"response_time": "Waktu respons",
|
"response_time": "Waktu respons",
|
||||||
"average_processing_time_hint": "Rata-rata waktu dalam milidetik untuk pemrosesan sebuah permintaan DNS",
|
"average_processing_time_hint": "Rata-rata waktu dalam milidetik untuk pemrosesan sebuah permintaan DNS",
|
||||||
"block_domain_use_filters_and_hosts": "Blokir domain menggunakan filter dan file hosts",
|
"block_domain_use_filters_and_hosts": "Blokir domain menggunakan filter dan berkas host",
|
||||||
"filters_block_toggle_hint": "Anda dapat menyiapkan aturan pemblokiran di pengaturan <a>Penyaringan</a>.",
|
"filters_block_toggle_hint": "Anda dapat menyiapkan aturan pemblokiran dalam pengaturan <a>Filter</a>.",
|
||||||
"use_adguard_browsing_sec": "Gunakan layanan web Keamanan Penjelajahan AdGuard",
|
"use_adguard_browsing_sec": "Gunakan layanan web Keamanan Penjelajahan AdGuard",
|
||||||
"use_adguard_browsing_sec_hint": "AdGuard Home akan memeriksa apakah domain diblokir oleh layanan web keamanan penjelajahan. Ini akan menggunakan API pencarian yang ramah privasi untuk melakukan pemeriksaan: hanya awalan singkat dari hash nama domain SHA256 yang dikirim ke server.",
|
"use_adguard_browsing_sec_hint": "AdGuard Home akan memeriksa apakah domain diblokir oleh layanan web keamanan penjelajahan. Ini akan menggunakan API pencarian yang ramah privasi untuk melakukan pemeriksaan: hanya awalan singkat dari hash nama domain SHA256 yang dikirim ke server.",
|
||||||
"use_adguard_parental": "Gunakan layanan web kontrol orang tua AdGuard",
|
"use_adguard_parental": "Gunakan layanan web kontrol orang tua AdGuard",
|
||||||
"use_adguard_parental_hint": "AdGuard Home akan mengecek jika domain mengandung materi dewasa. Akan menggunakan API yang ramah privasi yang sama sebagai layanan web keamanan penjelajahan.",
|
"use_adguard_parental_hint": "AdGuard Home akan mengecek jika domain mengandung materi dewasa. Akan menggunakan API yang ramah privasi yang sama sebagai layanan web keamanan penjelajahan.",
|
||||||
"enforce_safe_search": "Pakai pencarian aman",
|
"enforce_safe_search": "Pakai pencarian aman",
|
||||||
"enforce_save_search_hint": "AdGuard Home dapat memaksa penelusuran aman pada mesin pencari berikut: Google, Youtube, Bing, DuckDuckGo, Yandex, dan Pixabay.",
|
"enforce_save_search_hint": "AdGuard Home akan memberlakukan pencarian yang aman di mesin pencari berikut ini: Google, YouTube, Bing, DuckDuckGo, Ecosia, Yandex, Pixabay.",
|
||||||
"no_servers_specified": "Sever tidak disebutkan",
|
"no_servers_specified": "Sever tidak disebutkan",
|
||||||
"general_settings": "Pengaturan umum",
|
"general_settings": "Pengaturan umum",
|
||||||
"dns_settings": "Pengaturan DNS",
|
"dns_settings": "Pengaturan DNS",
|
||||||
@@ -166,11 +166,11 @@
|
|||||||
"encryption_settings": "Pengaturan enkripsi",
|
"encryption_settings": "Pengaturan enkripsi",
|
||||||
"dhcp_settings": "Pengaturan DHCP",
|
"dhcp_settings": "Pengaturan DHCP",
|
||||||
"upstream_dns": "Server DNS hulu",
|
"upstream_dns": "Server DNS hulu",
|
||||||
"upstream_dns_help": "Masukkan alamat server per baris. <a>Pelajari lebih</a> mengenai konfigurasi upstream server DNS.",
|
"upstream_dns_help": "Masukkan satu alamat server per baris. <a>Pelajari lebih lanjut</a> mengenai cara mengonfigurasi server DNS hulu.",
|
||||||
"upstream_dns_configured_in_file": "Diatur dalam {{path}}",
|
"upstream_dns_configured_in_file": "Diatur dalam {{path}}",
|
||||||
"test_upstream_btn": "Uji hulu",
|
"test_upstream_btn": "Uji hulu",
|
||||||
"upstreams": "Upstream",
|
"upstreams": "Hulu",
|
||||||
"upstream": "Server upstream",
|
"upstream": "Hulu",
|
||||||
"apply_btn": "Terapkan",
|
"apply_btn": "Terapkan",
|
||||||
"disabled_filtering_toast": "Penyaringan nonaktif",
|
"disabled_filtering_toast": "Penyaringan nonaktif",
|
||||||
"enabled_filtering_toast": "Penyaringan aktif",
|
"enabled_filtering_toast": "Penyaringan aktif",
|
||||||
@@ -191,11 +191,11 @@
|
|||||||
"edit_table_action": "Ubah",
|
"edit_table_action": "Ubah",
|
||||||
"delete_table_action": "Hapus",
|
"delete_table_action": "Hapus",
|
||||||
"elapsed": "Berlalu",
|
"elapsed": "Berlalu",
|
||||||
"filters_and_hosts_hint": "AdGuard Home memahami aturan dasar adblock dan sintak file hosts.",
|
"filters_and_hosts_hint": "AdGuard Home memahami aturan dasar adblock dan sintak berkas host.",
|
||||||
"no_blocklist_added": "Tiada daftar hitam ditambahkan",
|
"no_blocklist_added": "Tidak ada daftar hitam yang ditambahkan",
|
||||||
"no_whitelist_added": "Tiada daftar putih ditambahkan",
|
"no_whitelist_added": "Tidak ada daftar putih yang ditambahkan",
|
||||||
"add_blocklist": "Tambah daftar hitam",
|
"add_blocklist": "Tambahkan daftar hitam",
|
||||||
"add_allowlist": "Tambah daftar putih",
|
"add_allowlist": "Tambahkan daftar putih",
|
||||||
"cancel_btn": "Batal",
|
"cancel_btn": "Batal",
|
||||||
"enter_name_hint": "Masukkan nama",
|
"enter_name_hint": "Masukkan nama",
|
||||||
"enter_url_or_path_hint": "Masukan sebuah URL atau jalur absolut dari daftar",
|
"enter_url_or_path_hint": "Masukan sebuah URL atau jalur absolut dari daftar",
|
||||||
@@ -211,38 +211,40 @@
|
|||||||
"form_error_url_format": "Format URL tidak valid",
|
"form_error_url_format": "Format URL tidak valid",
|
||||||
"form_error_url_or_path_format": "URL atau jalur absolut dari daftar tidak valid",
|
"form_error_url_or_path_format": "URL atau jalur absolut dari daftar tidak valid",
|
||||||
"custom_filter_rules": "Aturan penyaringan khusus",
|
"custom_filter_rules": "Aturan penyaringan khusus",
|
||||||
"custom_filter_rules_hint": "Masukkan satu aturan dalam sebuah baris. Anda dapat menggunakan baik aturan adblock maupun sintaks file hosts.",
|
"custom_filter_rules_hint": "Masukkan satu aturan pada satu baris. Anda dapat menggunakan aturan adblock atau sintaks berkas host.",
|
||||||
"system_host_files": "File host sistem",
|
"system_host_files": "Berkas host sistem",
|
||||||
"examples_title": "Contoh",
|
"examples_title": "Contoh",
|
||||||
"example_meaning_filter_block": "blokir akses ke example.org dan seluruh subdomainnya;",
|
"example_meaning_filter_block": "blokir akses ke example.org dan seluruh subdomainnya;",
|
||||||
"example_meaning_filter_whitelist": "buka blokir akses ke domain example.orf dan seluruh subdomainnya;",
|
"example_meaning_filter_whitelist": "buka blokir akses ke domain example.org dan seluruh subdomainnya;",
|
||||||
"example_meaning_host_block": "merespons dengan 127.0.0.1 untuk example.org (tetapi tidak untuk subdomainnya);",
|
"example_meaning_host_block": "merespons dengan 127.0.0.1 untuk example.org (tetapi tidak untuk subdomainnya);",
|
||||||
"example_comment": "! Komentar di sini.",
|
"example_comment": "! Komentar di sini.",
|
||||||
"example_comment_meaning": "hanya sebuah komentar;",
|
"example_comment_meaning": "hanya sebuah komentar;",
|
||||||
"example_comment_hash": "# Juga sebuah komentar.",
|
"example_comment_hash": "# Juga sebuah komentar.",
|
||||||
"example_regex_meaning": "blokir akses ke domain yang cocok dengan ekspresi reguler yang ditentukan.",
|
"example_regex_meaning": "blokir akses ke domain yang cocok dengan ekspresi reguler yang ditentukan.",
|
||||||
"example_upstream_regular": "DNS reguler (melalui UDP);",
|
"example_upstream_regular": "DNS biasa (melalui UDP);",
|
||||||
"example_upstream_regular_port": "DNS biasa (lebih dari UDP, dengan port);",
|
"example_upstream_regular_port": "DNS biasa (melalui UDP, dengan port);",
|
||||||
"example_upstream_udp": "DNS biasa (lebih dari UDP, nama host);",
|
"example_upstream_udp": "DNS biasa (melalui UDP, nama host);",
|
||||||
"example_upstream_dot": "terenkripsi <0>DNS-over-TLS</0>;",
|
"example_upstream_dot": "<0>DNS melalui TLS</0> terenkripsi;",
|
||||||
"example_upstream_doh": "terenkripsi <0>DNS-over-HTTPS</0>;",
|
"example_upstream_doh": "<0>DNS melalui HTTPS</0> terenkripsi;",
|
||||||
"example_upstream_doh3": "DNS-over-HTTPS terenkripsi dengan paksa <0>HTTP/3</0> dan tidak ada fallback ke HTTP/2 atau lebih rendah;",
|
"example_upstream_doh3": "DNS melalui HTTPS terenkripsi dengan <0>HTTP/3</0> secara paksa dan tidak ada cadangan ke HTTP/2 atau lebih rendah;",
|
||||||
"example_upstream_doq": "terenkripsi <0>DNS-over-QUIC</0>;",
|
"example_upstream_doq": "<0>DNS melalui QUIC</0> terenkripsi;",
|
||||||
"example_upstream_sdns": "<0>Stempel DNS</0> untuk <1>DNSCrypt</1> atau pengarah <2>DNS-over-HTTPS</2>;",
|
"example_upstream_sdns": "<0>Stempel DNS</0> untuk <1>DNSCrypt</1> atau pengarah <2>DNS melalui HTTPS</2>;",
|
||||||
"example_upstream_tcp": "DNS reguler (melalui TCP);",
|
"example_upstream_tcp": "DNS biasa (melalui TCP);",
|
||||||
"example_upstream_tcp_port": "DNS biasa (melalui TCP, dengan port);",
|
"example_upstream_tcp_port": "DNS biasa (melalui TCP, dengan port);",
|
||||||
"example_upstream_tcp_hostname": "DNS biasa (lebih dari TCP, nama host);",
|
"example_upstream_tcp_hostname": "DNS biasa (melalui TCP, nama host);",
|
||||||
"all_lists_up_to_date_toast": "Semua daftar sudah diperbarui",
|
"all_lists_up_to_date_toast": "Semua daftar sudah diperbarui",
|
||||||
"updated_upstream_dns_toast": "Server upstream berhasil disimpan",
|
"updated_upstream_dns_toast": "Server hulu berhasil disimpan",
|
||||||
"dns_test_ok_toast": "Server DNS yang ditentukan bekerja dengan benar",
|
"dns_test_ok_toast": "Server DNS yang ditentukan bekerja dengan benar",
|
||||||
"dns_test_not_ok_toast": "Server \"{{key}}\": tidak dapat digunakan, mohon cek bahwa Anda telah menulisnya dengan benar",
|
"dns_test_not_ok_toast": "Server \"{{key}}\": tidak dapat digunakan, mohon cek bahwa Anda telah menulisnya dengan benar",
|
||||||
"dns_test_warning_toast": "Upstream \"{{key}}\" tidak menanggapi permintaan pengujian dan mungkin tidak berfungsi dengan baik",
|
"dns_test_parsing_error_toast": "Bagian {{section}}: baris {{line}}: tidak dapat digunakan, mohon cek bahwa Anda telah menulisnya dengan benar",
|
||||||
|
"dns_test_warning_toast": "Hulu \"{{key}}\" tidak menanggapi permintaan pengujian dan mungkin tidak berfungsi dengan benar",
|
||||||
"unblock": "Buka Blokir",
|
"unblock": "Buka Blokir",
|
||||||
"block": "Blok",
|
"block": "Blok",
|
||||||
"disallow_this_client": "Cabut ijin untuk klien ini",
|
"disallow_this_client": "Cabut ijin untuk klien ini",
|
||||||
"allow_this_client": "Ijinkan klien ini",
|
"allow_this_client": "Ijinkan klien ini",
|
||||||
"block_for_this_client_only": "Blok hanya untuk klien ini",
|
"block_for_this_client_only": "Blok hanya untuk klien ini",
|
||||||
"unblock_for_this_client_only": "Jangan diblok hanya untuk klien ini",
|
"unblock_for_this_client_only": "Jangan diblok hanya untuk klien ini",
|
||||||
|
"add_persistent_client": "Tambahkan sebagai klien persisten",
|
||||||
"time_table_header": "Waktu",
|
"time_table_header": "Waktu",
|
||||||
"date": "Tanggal",
|
"date": "Tanggal",
|
||||||
"domain_name_table_header": "Nama domain",
|
"domain_name_table_header": "Nama domain",
|
||||||
@@ -266,18 +268,18 @@
|
|||||||
"rule_added_to_custom_filtering_toast": "Aturan ditambah ke aturan penyaringan khusus: {{rule}}",
|
"rule_added_to_custom_filtering_toast": "Aturan ditambah ke aturan penyaringan khusus: {{rule}}",
|
||||||
"query_log_response_status": "Status: {{value}}",
|
"query_log_response_status": "Status: {{value}}",
|
||||||
"query_log_filtered": "Difilter oleh {{filter}}",
|
"query_log_filtered": "Difilter oleh {{filter}}",
|
||||||
"query_log_confirm_clear": "Apakah Anda yakin ingin menghapus seluruh kueri log?",
|
"query_log_confirm_clear": "Apakah Anda yakin ingin menghapus seluruh catatan kueri?",
|
||||||
"query_log_cleared": "Kueri log telah berhasil dihapus",
|
"query_log_cleared": "Catatan kueri berhasil dihapus",
|
||||||
"query_log_updated": "Log permintaan telah berhasil diperbarui",
|
"query_log_updated": "Catatan kueri berhasil diperbarui",
|
||||||
"query_log_clear": "Hapus kueri log",
|
"query_log_clear": "Hapus catatan kueri",
|
||||||
"query_log_retention": "Rotasi kueri log",
|
"query_log_retention": "Rotasi kueri log",
|
||||||
"query_log_enable": "Aktifkan log",
|
"query_log_enable": "Aktifkan catatan",
|
||||||
"query_log_configuration": "Konfigurasi log",
|
"query_log_configuration": "Konfigurasi catatan",
|
||||||
"query_log_disabled": "Kueri log dinonaktifkan dan dapat dikonfigurasi di <0>pengaturan</0>",
|
"query_log_disabled": "Catatan kueri dinonaktifkan dan dapat dikonfigurasi di <0>pengaturan</0>",
|
||||||
"query_log_strict_search": "Gunakan tanda kutip ganda untuk pencarian ketat",
|
"query_log_strict_search": "Gunakan tanda kutip ganda untuk pencarian ketat",
|
||||||
"query_log_retention_confirm": "Apakah Anda yakin ingin mengubah rotasi kueri log? Jika Anda menurunkan nilai interval, beberapa data akan hilang",
|
"query_log_retention_confirm": "Apakah Anda yakin ingin mengubah rotasi kueri log? Jika Anda menurunkan nilai interval, beberapa data akan hilang",
|
||||||
"anonymize_client_ip": "Anonim IP klien",
|
"anonymize_client_ip": "Anonim IP klien",
|
||||||
"anonymize_client_ip_desc": "Jangan simpan alamat lengkap IP klien dalam log dan statistik",
|
"anonymize_client_ip_desc": "Jangan simpan alamat lengkap IP klien dalam catatan atau statistik",
|
||||||
"dns_config": "Konfigurasi server DNS",
|
"dns_config": "Konfigurasi server DNS",
|
||||||
"dns_cache_config": "Konfigurasi cache DNS",
|
"dns_cache_config": "Konfigurasi cache DNS",
|
||||||
"dns_cache_config_desc": "Disini Anda bisa mengonfigurasi cache DNS",
|
"dns_cache_config_desc": "Disini Anda bisa mengonfigurasi cache DNS",
|
||||||
@@ -289,7 +291,7 @@
|
|||||||
"custom_ip": "Custom IP",
|
"custom_ip": "Custom IP",
|
||||||
"blocking_ipv4": "Blokiran IPv4",
|
"blocking_ipv4": "Blokiran IPv4",
|
||||||
"blocking_ipv6": "Blokiran IPv6",
|
"blocking_ipv6": "Blokiran IPv6",
|
||||||
"blocked_response_ttl": "Respon TLL diblokir",
|
"blocked_response_ttl": "Respons TTL terblokir",
|
||||||
"blocked_response_ttl_desc": "Menentukan berapa detik klien harus menyimpan respons yang difilter dalam cache",
|
"blocked_response_ttl_desc": "Menentukan berapa detik klien harus menyimpan respons yang difilter dalam cache",
|
||||||
"form_enter_blocked_response_ttl": "Masukkan TTL respons yang diblokir (detik)",
|
"form_enter_blocked_response_ttl": "Masukkan TTL respons yang diblokir (detik)",
|
||||||
"dnscrypt": "DNSCrypt",
|
"dnscrypt": "DNSCrypt",
|
||||||
@@ -306,8 +308,8 @@
|
|||||||
"form_enter_rate_limit": "Masukkan batas nilai",
|
"form_enter_rate_limit": "Masukkan batas nilai",
|
||||||
"rate_limit": "Batas nilai",
|
"rate_limit": "Batas nilai",
|
||||||
"edns_enable": "Aktifkan EDNS Klien Subnet",
|
"edns_enable": "Aktifkan EDNS Klien Subnet",
|
||||||
"edns_cs_desc": "Tambahkan opsi EDNS Client Subnet (ECS) ke permintaan upstream dan catat nilai yang dikirim oleh klien di log kueri.",
|
"edns_cs_desc": "Tambahkan opsi EDNS Client Subnet (ECS) ke permintaan hulu dan catat nilai yang dikirim oleh klien dalam catatan kueri.",
|
||||||
"edns_use_custom_ip": "Gunakan IP khusus untuk EDNS",
|
"edns_use_custom_ip": "Gunakan IP kustom untuk EDNS",
|
||||||
"edns_use_custom_ip_desc": "Izinkan untuk menggunakan IP kustom untuk EDNS",
|
"edns_use_custom_ip_desc": "Izinkan untuk menggunakan IP kustom untuk EDNS",
|
||||||
"rate_limit_desc": "Jumlah permintaan per detik yang diperbolehkan untuk satu klien. Atur ke 0 untuk tidak terbatas.",
|
"rate_limit_desc": "Jumlah permintaan per detik yang diperbolehkan untuk satu klien. Atur ke 0 untuk tidak terbatas.",
|
||||||
"rate_limit_subnet_len_ipv4": "Panjang awalan subnet untuk alamat IPv4",
|
"rate_limit_subnet_len_ipv4": "Panjang awalan subnet untuk alamat IPv4",
|
||||||
@@ -320,27 +322,27 @@
|
|||||||
"rate_limit_whitelist": "Daftar pembatasan tarif yang diizinkan",
|
"rate_limit_whitelist": "Daftar pembatasan tarif yang diizinkan",
|
||||||
"rate_limit_whitelist_desc": "Alamat IP dikecualikan dari pembatasan tarif",
|
"rate_limit_whitelist_desc": "Alamat IP dikecualikan dari pembatasan tarif",
|
||||||
"rate_limit_whitelist_placeholder": "Masukkan satu alamat IP per baris",
|
"rate_limit_whitelist_placeholder": "Masukkan satu alamat IP per baris",
|
||||||
"blocking_ipv4_desc": "Alamat IP akan dikembalikan untuk permintaan A yang diblokir",
|
"blocking_ipv4_desc": "Alamat IP yang akan dikembalikan untuk permintaan A yang diblokir",
|
||||||
"blocking_ipv6_desc": "Alamat IP akan dipulihkan untuk permintaan AAAA yang diblokir",
|
"blocking_ipv6_desc": "Alamat IP yang akan dikembalikan untuk permintaan AAAA yang diblokir",
|
||||||
"blocking_mode_default": "Default: Tanggapi dengan alamat IP nol (0.0.0.0 untuk A; :: untuk AAAA) saat diblokir oleh aturan gaya Adblock; tanggapi dengan alamat IP yang ditentukan dalam aturan ketika diblokir oleh aturan gaya host /etc/",
|
"blocking_mode_default": "Standar: Tanggapi dengan alamat IP nol (0.0.0.0 untuk A; :: untuk AAAA) saat diblokir oleh aturan gaya Adblock; tanggapi dengan alamat IP yang ditentukan dalam aturan ketika diblokir oleh aturan /etc/hosts-style",
|
||||||
"blocking_mode_refused": "DITOLAK: Respon dengan kode DITOLAK",
|
"blocking_mode_refused": "DITOLAK: Respon dengan kode DITOLAK",
|
||||||
"blocking_mode_nxdomain": "NXDOMAIN: Respon pakai kode NXDOMAIN",
|
"blocking_mode_nxdomain": "NXDOMAIN: Respon pakai kode NXDOMAIN",
|
||||||
"blocking_mode_null_ip": "Null IP: Respon pakai alamat IP kosong (0.0.0.0 untuk A; :: untuk AAAA)",
|
"blocking_mode_null_ip": "Null IP: Respon pakai alamat IP kosong (0.0.0.0 untuk A; :: untuk AAAA)",
|
||||||
"blocking_mode_custom_ip": "IP kustom: respon dengan alamat IP yang diset secara manual",
|
"blocking_mode_custom_ip": "IP kustom: respon dengan alamat IP yang diset secara manual",
|
||||||
"theme_auto": "Auto",
|
"theme_auto": "Otomatis",
|
||||||
"theme_light": "Terang",
|
"theme_light": "Terang",
|
||||||
"theme_dark": "Gelap",
|
"theme_dark": "Gelap",
|
||||||
"upstream_dns_client_desc": "Jika Anda biarkan bidang ini kosong, AdGuard Home akan memakai server yang dikonfigurasi di<0>Pengaturan DNS</0>.",
|
"upstream_dns_client_desc": "Jika Anda biarkan kolom ini kosong, AdGuard Home akan menggunakan server yang dikonfigurasi di <0>pengaturan DNS</0>.",
|
||||||
"tracker_source": "Sumber pelacak",
|
"tracker_source": "Sumber pelacak",
|
||||||
"source_label": "Sumber",
|
"source_label": "Sumber",
|
||||||
"found_in_known_domain_db": "Ditemukan di database domain dikenal",
|
"found_in_known_domain_db": "Ditemukan di basis data domain yang dikenal.",
|
||||||
"category_label": "Kategori",
|
"category_label": "Kategori",
|
||||||
"rule_label": "Atura(n)",
|
"rule_label": "Atura(n)",
|
||||||
"list_label": "Daftar",
|
"list_label": "Daftar",
|
||||||
"unknown_filter": "Penyaringan {{filterId}} tidak dikenal",
|
"unknown_filter": "Penyaringan {{filterId}} tidak dikenal",
|
||||||
"known_tracker": "Pelacak yang dikenal",
|
"known_tracker": "Pelacak yang dikenal",
|
||||||
"install_welcome_title": "Selamat datang di AdGuard Home!",
|
"install_welcome_title": "Selamat datang di AdGuard Home!",
|
||||||
"install_welcome_desc": "AdGuard Home adalah sebuah server DNS pemblokiran iklan dan pelacak di jaringan. Tujuannya adalah memungkinkan anda mengkontrol seluruh jaringan dan semua perangkat anda, dan ini tidak membutuhkan aplikasi tambahan di klien",
|
"install_welcome_desc": "AdGuard Home adalah server DNS pemblokir iklan dan pelacak di seluruh jaringan. Tujuannya untuk memungkinkan Anda mengendalikan seluruh jaringan dan semua perangkat Anda, dan tidak perlu menggunakan program sisi klien.",
|
||||||
"install_settings_title": "Antarmuka Halaman Admin",
|
"install_settings_title": "Antarmuka Halaman Admin",
|
||||||
"install_settings_listen": "Antarmuka pengoperasian",
|
"install_settings_listen": "Antarmuka pengoperasian",
|
||||||
"install_settings_port": "Port",
|
"install_settings_port": "Port",
|
||||||
@@ -362,20 +364,20 @@
|
|||||||
"install_submit_title": "Selamat!",
|
"install_submit_title": "Selamat!",
|
||||||
"install_submit_desc": "Prosedur pengaturan telah selesai, dan anda siap untuk mulai menggunakan AdGuard Home.",
|
"install_submit_desc": "Prosedur pengaturan telah selesai, dan anda siap untuk mulai menggunakan AdGuard Home.",
|
||||||
"install_devices_router": "Router",
|
"install_devices_router": "Router",
|
||||||
"install_devices_router_desc": "Setelan ini akan secara otomatis mencakup semua perangkat yang terhubung ke router rumah anda dan anda tak perlu mengkonfigurasikan secara manual.",
|
"install_devices_router_desc": "Penyiapan ini secara otomatis mencakup semua perangkat yang terhubung ke router rumah Anda, tidak perlu mengkonfigurasi masing-masing perangkat secara manual.",
|
||||||
"install_devices_address": "Server DNS AdGuard Home akan menggunakan alamat berikut",
|
"install_devices_address": "Server DNS AdGuard Home akan menggunakan alamat berikut",
|
||||||
"install_devices_router_list_1": "Buka preferensi untuk router Anda. Biasanya, Anda dapat mengaksesnya dari browser Anda melalui URL, seperti http://192.168.0.1/ atau http://192.168.1.1/. Anda mungkin diminta untuk memasukkan kata sandi. Jika Anda tidak mengingatnya, Anda sering kali dapat mengatur ulang kata sandi dengan menekan tombol pada perute itu sendiri, tetapi perlu diketahui bahwa jika prosedur ini dipilih, Anda mungkin akan kehilangan seluruh konfigurasi perute. Jika router Anda memerlukan aplikasi untuk menyiapkannya, instal aplikasi tersebut di ponsel atau PC Anda dan gunakan untuk mengakses pengaturan router.",
|
"install_devices_router_list_1": "Buka preferensi untuk router Anda. Biasanya, Anda dapat mengaksesnya dari peramban Anda melalui URL, seperti http://192.168.0.1/ atau http://192.168.1.1/. Anda mungkin diminta untuk memasukkan kata sandi. Jika Anda tidak mengingatnya, Anda sering kali dapat mengatur ulang kata sandi dengan menekan tombol pada router itu sendiri, tetapi perlu diketahui bahwa jika prosedur ini dipilih, Anda mungkin akan kehilangan seluruh konfigurasi router. Jika router Anda memerlukan aplikasi untuk menyiapkannya, pasang aplikasi tersebut di ponsel atau PC Anda dan gunakan untuk mengakses pengaturan router.",
|
||||||
"install_devices_router_list_2": "Temukan pengaturan DHCP / DNS. Cari huruf DNS di sebelah bidang yang memungkinkan dua atau tiga set angka, masing-masing dipecah menjadi empat grup dengan satu hingga tiga digit.",
|
"install_devices_router_list_2": "Temukan pengaturan DHCP / DNS. Cari huruf DNS di sebelah kolom yang memungkinkan dua atau tiga set angka, masing-masing dipecah menjadi empat kelompok dengan satu hingga tiga digit.",
|
||||||
"install_devices_router_list_3": "Masukkan alamat server AdGuard Home disana",
|
"install_devices_router_list_3": "Masukkan alamat server AdGuard Home disana",
|
||||||
"install_devices_router_list_4": "Anda tidak dapat menyetel server DNS kustom pada beberapa tipe router. Dalam hal ini mungkin membantu jika Anda mengatur AdGuard Home sebagai <0>server DHCP</0>. Jika tidak, Anda harus mencari petunjuk tentang cara mengkustomisasi server DNS untuk model router khusus Anda.",
|
"install_devices_router_list_4": "Anda tidak dapat menyetel server DNS kustom pada beberapa tipe router. Dalam hal ini mungkin membantu jika Anda mengatur AdGuard Home sebagai <0>server DHCP</0>. Jika tidak, Anda harus mencari petunjuk tentang cara mengkustomisasi server DNS untuk model router khusus Anda.",
|
||||||
"install_devices_windows_list_1": "Buka Panel Kontrol melalui menu Start atau pencarian Windows.",
|
"install_devices_windows_list_1": "Buka Panel Kontrol melalui menu Start atau pencarian Windows.",
|
||||||
"install_devices_windows_list_2": "Masuk ke kategori Jaringan dan Internet (Network and Internet) dan kemudian ke Pusat Jaringan dan Berbagi (Network and Sharing Center).",
|
"install_devices_windows_list_2": "Masuk ke kategori Jaringan dan Internet (Network and Internet) dan kemudian ke Pusat Jaringan dan Berbagi (Network and Sharing Center).",
|
||||||
"install_devices_windows_list_3": "Di panel kiri, klik \"Ubah pengaturan adaptor\".",
|
"install_devices_windows_list_3": "Di panel kiri, klik \"Ubah pengaturan adaptor\".",
|
||||||
"install_devices_windows_list_4": "Klik kanan koneksi aktif Anda dan pilih Properties.",
|
"install_devices_windows_list_4": "Klik kanan koneksi aktif Anda dan pilih Properti.",
|
||||||
"install_devices_windows_list_5": "Temukan \"Internet Protocol Version 4 (TCP/IPv4)\" (atau, untuk IPv6, \"Internet Protocol Version 6 (TCP/IPv6)\") dalam daftar, pilih dan kemudian klik Properties lagi.",
|
"install_devices_windows_list_5": "Temukan \"Protokol Internet Versi 4 (TCP/IPv4)\" (atau, untuk IPv6, \"Protokol Internet Versi 6 (TCP/IPv6)\") dalam daftar, pilih dan kemudian klik Properti lagi.",
|
||||||
"install_devices_windows_list_6": "Pilih \"Gunakan alamat server DNS berikut\" dan masukkan alamat server Beranda AdGuard Anda.",
|
"install_devices_windows_list_6": "Pilih \"Gunakan alamat server DNS berikut\" dan masukkan alamat server Beranda AdGuard Anda.",
|
||||||
"install_devices_macos_list_1": "Klik ikon Apple dan pergi ke System Preferences.",
|
"install_devices_macos_list_1": "Klik ikon Apple dan buka Preferensi Sistem.",
|
||||||
"install_devices_macos_list_2": "Klik Network.",
|
"install_devices_macos_list_2": "Klik Jaringan.",
|
||||||
"install_devices_macos_list_3": "Pilih koneksi pertama dalam daftar dan klik Advanced.",
|
"install_devices_macos_list_3": "Pilih koneksi pertama dalam daftar dan klik Advanced.",
|
||||||
"install_devices_macos_list_4": "Pilih tab DNS dan masukkan alamat server AdGuard Anda.",
|
"install_devices_macos_list_4": "Pilih tab DNS dan masukkan alamat server AdGuard Anda.",
|
||||||
"install_devices_android_list_1": "Dari layar beranda Menu Android, ketuk Pengaturan.",
|
"install_devices_android_list_1": "Dari layar beranda Menu Android, ketuk Pengaturan.",
|
||||||
@@ -386,13 +388,13 @@
|
|||||||
"install_devices_ios_list_1": "Dari layar beranda, ketuk Pengaturan.",
|
"install_devices_ios_list_1": "Dari layar beranda, ketuk Pengaturan.",
|
||||||
"install_devices_ios_list_2": "Pilih Wi-Fi di menu sebelah kiri (tidak mungkin untuk mengkonfigurasi DNS untuk jaringan seluler).",
|
"install_devices_ios_list_2": "Pilih Wi-Fi di menu sebelah kiri (tidak mungkin untuk mengkonfigurasi DNS untuk jaringan seluler).",
|
||||||
"install_devices_ios_list_3": "Ketuk nama jaringan yang saat ini aktif.",
|
"install_devices_ios_list_3": "Ketuk nama jaringan yang saat ini aktif.",
|
||||||
"install_devices_ios_list_4": "Di bidang DNS, masukkan alamat server AdGuard Home anda.",
|
"install_devices_ios_list_4": "Di kolom DNS, masukkan alamat server AdGuard Home Anda.",
|
||||||
"get_started": "Mari mulai",
|
"get_started": "Mari mulai",
|
||||||
"next": "Selanjutnya",
|
"next": "Selanjutnya",
|
||||||
"open_dashboard": "Buka Beranda",
|
"open_dashboard": "Buka Beranda",
|
||||||
"install_saved": "Berhasil disimpan",
|
"install_saved": "Berhasil disimpan",
|
||||||
"encryption_title": "Enkripsi",
|
"encryption_title": "Enkripsi",
|
||||||
"encryption_desc": "Enkripsi (HTTPS/QUIC/TLS) untuk DNS dan antarmuka admin",
|
"encryption_desc": "Dukungan enkripsi (HTTPS/QUIC/TLS) untuk DNS dan antarmuka web admin",
|
||||||
"encryption_config_saved": "Pengaturan enkripsi telah tersimpan",
|
"encryption_config_saved": "Pengaturan enkripsi telah tersimpan",
|
||||||
"encryption_server": "Nama server",
|
"encryption_server": "Nama server",
|
||||||
"encryption_server_enter": "Masukkan nama domain anda",
|
"encryption_server_enter": "Masukkan nama domain anda",
|
||||||
@@ -404,7 +406,7 @@
|
|||||||
"encryption_dot": "Port DNS-over-TLS",
|
"encryption_dot": "Port DNS-over-TLS",
|
||||||
"encryption_dot_desc": "Jika port ini terkonfigurasi, AdGuard Home akan menjalankan server DNS-over-TLS dalam port ini",
|
"encryption_dot_desc": "Jika port ini terkonfigurasi, AdGuard Home akan menjalankan server DNS-over-TLS dalam port ini",
|
||||||
"encryption_doq": "Port DNS-over-QUIC ",
|
"encryption_doq": "Port DNS-over-QUIC ",
|
||||||
"encryption_doq_desc": "Jika port ini diatur secara sepesifik, AdGuard Home akan menjalankan server DNS-lewat-QUIC pada port ini.",
|
"encryption_doq_desc": "Jika port ini dikonfigurasi, AdGuard Home akan menjalankan server DNS melalui QUIC pada port ini.",
|
||||||
"encryption_certificates": "Sertifikat",
|
"encryption_certificates": "Sertifikat",
|
||||||
"encryption_certificates_desc": "Untuk menggunakan enkripsi, Anda perlu memberikan rantai sertifikat SSL yang valid untuk domain Anda. Anda bisa mendapatkan sertifikat gratis di <0>{{link}}</0> atau Anda dapat membelinya dari salah satu Otoritas Sertifikat tepercaya.",
|
"encryption_certificates_desc": "Untuk menggunakan enkripsi, Anda perlu memberikan rantai sertifikat SSL yang valid untuk domain Anda. Anda bisa mendapatkan sertifikat gratis di <0>{{link}}</0> atau Anda dapat membelinya dari salah satu Otoritas Sertifikat tepercaya.",
|
||||||
"encryption_certificates_input": "Salin / rekatkan sertifikat PEM yang disandikan di sini.",
|
"encryption_certificates_input": "Salin / rekatkan sertifikat PEM yang disandikan di sini.",
|
||||||
@@ -423,11 +425,14 @@
|
|||||||
"encryption_hostnames": "Nama host",
|
"encryption_hostnames": "Nama host",
|
||||||
"encryption_reset": "Anda yakin ingin mengatur ulang pengaturan enkripsi?",
|
"encryption_reset": "Anda yakin ingin mengatur ulang pengaturan enkripsi?",
|
||||||
"encryption_warning": "Peringatan",
|
"encryption_warning": "Peringatan",
|
||||||
|
"encryption_plain_dns_enable": "Aktifkan DNS biasa",
|
||||||
|
"encryption_plain_dns_desc": "DNS biasa diaktifkan secara standar. Anda dapat menonaktifkannya untuk memaksa semua perangkat menggunakan DNS terenkripsi. Untuk melakukan ini, Anda harus mengaktifkan setidaknya satu protokol DNS terenkripsi",
|
||||||
|
"encryption_plain_dns_error": "Untuk menonaktifkan DNS biasa, aktifkan setidaknya satu protokol DNS terenkripsi",
|
||||||
"topline_expiring_certificate": "Sertifikat SSL Anda hampir kedaluwarsa. Perbarui <0>Pengaturan enkripsi</0>.",
|
"topline_expiring_certificate": "Sertifikat SSL Anda hampir kedaluwarsa. Perbarui <0>Pengaturan enkripsi</0>.",
|
||||||
"topline_expired_certificate": "Sertifikat SSL Anda kedaluwarsa. Perbarui <0>Pengaturan enkripsi</0>.",
|
"topline_expired_certificate": "Sertifikat SSL Anda kedaluwarsa. Perbarui <0>Pengaturan enkripsi</0>.",
|
||||||
"form_error_port_range": "Masukkan nomor port di kisaran 80-65535",
|
"form_error_port_range": "Masukkan nomor port di kisaran 80-65535",
|
||||||
"form_error_port_unsafe": "Ini adalah port yang tidak aman",
|
"form_error_port_unsafe": "Port tidak aman",
|
||||||
"form_error_equal": "Seharusnya tidak sama",
|
"form_error_equal": "Tidak boleh sama",
|
||||||
"form_error_password": "Kata sandi tidak cocok",
|
"form_error_password": "Kata sandi tidak cocok",
|
||||||
"reset_settings": "Setel ulang pengaturan",
|
"reset_settings": "Setel ulang pengaturan",
|
||||||
"update_announcement": "AdGuard Home {{version}} sekarang tersedia! <0>Klik di sini</0> untuk info lebih lanjut.",
|
"update_announcement": "AdGuard Home {{version}} sekarang tersedia! <0>Klik di sini</0> untuk info lebih lanjut.",
|
||||||
@@ -439,29 +444,30 @@
|
|||||||
"fix": "Perbaiki",
|
"fix": "Perbaiki",
|
||||||
"dns_providers": "Berikut adalah <0>daftar penyedia DNS yang dikenal</0> untuk dipilih.",
|
"dns_providers": "Berikut adalah <0>daftar penyedia DNS yang dikenal</0> untuk dipilih.",
|
||||||
"update_now": "Perbarui sekarang",
|
"update_now": "Perbarui sekarang",
|
||||||
"update_failed": "Pembaruan otomatis gagal. Silahkan <a>ikuti petunjuk ini</a> untuk perbarui secara manual.",
|
"update_failed": "Pembaruan otomatis gagal. Silakan <a>ikuti langkah-langkah berikut</a> untuk memperbarui secara manual.",
|
||||||
"manual_update": "Silakan <a>mengikuti langkah berikut</a> untuk memperbarui secara manual.",
|
"manual_update": "Silakan <a>mengikuti langkah berikut</a> untuk memperbarui secara manual.",
|
||||||
"processing_update": "Silahkan tunggu, AdGuard Home sedang diperbarui",
|
"processing_update": "Silahkan tunggu, AdGuard Home sedang diperbarui",
|
||||||
"clients_title": "Klien yang gigih",
|
"clients_title": "Klien persisten",
|
||||||
"clients_desc": "Konfigurasikan catatan klien persisten untuk perangkat yang terhubung ke AdGuard Home",
|
"clients_desc": "Konfigurasikan catatan klien persisten untuk perangkat yang terhubung ke AdGuard Home",
|
||||||
"settings_global": "Global",
|
"settings_global": "Global",
|
||||||
"settings_custom": "Kustom",
|
"settings_custom": "Kustom",
|
||||||
"table_client": "Klien",
|
"table_client": "Klien",
|
||||||
"table_name": "Nama",
|
"table_name": "Nama",
|
||||||
"save_btn": "Simpan",
|
"save_btn": "Simpan",
|
||||||
"client_add": "Tambah Klien",
|
"client_add": "Tambahkan Klien",
|
||||||
"client_new": "Klien Baru",
|
"client_new": "Klien Baru",
|
||||||
"client_edit": "Ubah Klien",
|
"client_edit": "Ubah Klien",
|
||||||
"client_identifier": "Identifikasi",
|
"client_identifier": "Identifikasi",
|
||||||
"ip_address": "Alamat IP",
|
"ip_address": "Alamat IP",
|
||||||
"client_identifier_desc": "Klien dapat diidentifikasi oleh alamat IP, CIDR, alamat MAC atau ClientID (dapat digunakan untuk DoT/DoH/DoQ). <0>Di sini</0> Anda dapat mempelajari lebih lanjut tentang cara mengidentifikasi klien.",
|
"client_identifier_desc": "Klien dapat diidentifikasi berdasarkan alamat IP, CIDR, alamat MAC, atau ClientID (dapat digunakan untuk DoT/DoH/DoQ). Pelajari lebih lanjut tentang cara mengidentifikasi klien <0>di sini</0>.",
|
||||||
"form_enter_ip": "Masukkan IP",
|
"form_enter_ip": "Masukkan IP",
|
||||||
"form_enter_subnet_ip": "Masukkan alamat IP di subnet \"{{cidr}}\"",
|
"form_enter_subnet_ip": "Masukkan alamat IP di subnet \"{{cidr}}\"",
|
||||||
"form_enter_mac": "Masukkan MAC",
|
"form_enter_mac": "Masukkan MAC",
|
||||||
"form_enter_id": "Masukkan pengenal",
|
"form_enter_id": "Masukkan pengenal",
|
||||||
"form_add_id": "Tambah pengenal",
|
"form_add_id": "Tambahkan pengenal",
|
||||||
"form_client_name": "Masukkan nama klien",
|
"form_client_name": "Masukkan nama klien",
|
||||||
"name": "Nama",
|
"name": "Nama",
|
||||||
|
"client_name": "Klien {{id}}",
|
||||||
"client_global_settings": "Gunakan pengaturan global",
|
"client_global_settings": "Gunakan pengaturan global",
|
||||||
"client_deleted": "Klien \"{{key}}\" berhasil dihapus",
|
"client_deleted": "Klien \"{{key}}\" berhasil dihapus",
|
||||||
"client_added": "Klien \"{{key}}\" berhasil ditambahkan",
|
"client_added": "Klien \"{{key}}\" berhasil ditambahkan",
|
||||||
@@ -469,26 +475,26 @@
|
|||||||
"clients_not_found": "Tidak ada klien ditemukan",
|
"clients_not_found": "Tidak ada klien ditemukan",
|
||||||
"client_confirm_delete": "Apakah anda yakin ingin menghapus klien \"{{key}}\"?",
|
"client_confirm_delete": "Apakah anda yakin ingin menghapus klien \"{{key}}\"?",
|
||||||
"list_confirm_delete": "Anda yakin ingin menghapus daftar ini?",
|
"list_confirm_delete": "Anda yakin ingin menghapus daftar ini?",
|
||||||
"auto_clients_title": "Klien (waktu berjalan)",
|
"auto_clients_title": "Klien runtime",
|
||||||
"auto_clients_desc": "Informasi tentang alamat IP perangkat yang menggunakan atau mungkin menggunakan AdGuard Home. Informasi ini dikumpulkan dari beberapa sumber, termasuk file host, reverse DNS, dll.",
|
"auto_clients_desc": "Informasi tentang alamat IP perangkat yang menggunakan atau mungkin menggunakan AdGuard Home. Informasi ini dikumpulkan dari beberapa sumber, termasuk berkas host, DNS terbalik, dll.",
|
||||||
"access_title": "Pengaturan akses",
|
"access_title": "Pengaturan akses",
|
||||||
"access_desc": "Disini anda dapat mengatur aturan akses untuk server AdGuard Home DNS",
|
"access_desc": "Disini anda dapat mengatur aturan akses untuk server AdGuard Home DNS",
|
||||||
"access_allowed_title": "Klien yang diizinkan",
|
"access_allowed_title": "Klien yang diizinkan",
|
||||||
"access_allowed_desc": "Daftar CIDR, alamat IP, atau <a>ClientID</a>. Jika daftar ini memiliki entri, AdGuard Home hanya akan menerima permintaan dari klien ini.",
|
"access_allowed_desc": "Daftar CIDR, alamat IP, atau <a>ClientID</a>. Jika daftar ini memiliki entri, AdGuard Home hanya akan menerima permintaan dari klien ini.",
|
||||||
"access_disallowed_title": "Klien yang tidak diizinkan",
|
"access_disallowed_title": "Klien yang tidak diizinkan",
|
||||||
"access_disallowed_desc": "Daftar CIDR, alamat IP, atau <a>ClientID</a>. Jika daftar ini memiliki entri, AdGuard Home akan membatalkan permintaan dari klien ini. Bidang ini diabaikan jika ada entri di klien yang diizinkan.",
|
"access_disallowed_desc": "Daftar CIDR, alamat IP, atau <a>ClientID</a>. Jika daftar ini memiliki entri, AdGuard Home akan membatalkan permintaan dari klien ini. Kolom ini diabaikan jika ada entri di daftar putih klien.",
|
||||||
"access_blocked_title": "Domain yang diblokir",
|
"access_blocked_title": "Domain yang diblokir",
|
||||||
"access_blocked_desc": "Jangan bingung dengan filter. AdGuard Home menghapus kueri DNS yang cocok dengan domain ini, dan kueri ini bahkan tidak muncul di log kueri. Anda dapat menentukan nama domain, karakter pengganti, atau aturan filter URL yang tepat, mis. \"example.org\", \"*.example.org\", atau \"||example.org^\" yang sesuai.",
|
"access_blocked_desc": "Jangan dikelirukan dengan filter. AdGuard Home membuang kueri DNS yang cocok dengan domain ini, dan kueri ini bahkan tidak muncul di catatan kueri. Anda dapat menentukan nama domain, karakter pengganti, atau aturan filter URL yang tepat, misalnya \"example.org\", \"*.example.org\", atau \"||example.org^\" secara bersamaan.",
|
||||||
"access_settings_saved": "Pengaturan akses berhasil disimpan",
|
"access_settings_saved": "Pengaturan akses berhasil disimpan",
|
||||||
"updates_checked": "Versi baru AdGuard Home tersedia\n",
|
"updates_checked": "Versi baru AdGuard Home tersedia",
|
||||||
"updates_version_equal": "AdGuard Home sudah tebaru",
|
"updates_version_equal": "AdGuard Home sudah tebaru",
|
||||||
"check_updates_now": "Periksa pembaruan sekarang",
|
"check_updates_now": "Periksa pembaruan sekarang",
|
||||||
"version_request_error": "Pemeriksaan pembaruan gagal. Harap periksa koneksi internet anda.",
|
"version_request_error": "Pemeriksaan pembaruan gagal. Harap periksa koneksi internet anda.",
|
||||||
"dns_privacy": "DNS Privasi",
|
"dns_privacy": "DNS Privasi",
|
||||||
"setup_dns_privacy_1": "<0>DNS-over-TLS:</0> Memakai <1>{{address}}</1> string.",
|
"setup_dns_privacy_1": "<0>DNS melalui TLS:</0> Gunakan <1>{{address}}</1> string.",
|
||||||
"setup_dns_privacy_2": "<0>DNS-over-TLS:</0> Memakai <1>{{address}}</1> string.",
|
"setup_dns_privacy_2": "<0>DNS-over-TLS:</0> Memakai <1>{{address}}</1> string.",
|
||||||
"setup_dns_privacy_3": "<0>Berikut daftar perangkat lunak yang dapat Anda gunakan.</0>",
|
"setup_dns_privacy_3": "<0>Berikut daftar perangkat lunak yang dapat Anda gunakan.</0>",
|
||||||
"setup_dns_privacy_4": "Di perangkat iOS 14 atau macOS Big Sur, Anda dapat mengunduh file '.mobileconfig' khusus yang menambahkan server <highlight>DNS-over-HTTPS</highlight> atau <highlight>DNS-over-TLS</highlight> ke pengaturan DNS.",
|
"setup_dns_privacy_4": "Pada perangkat iOS 14 atau macOS Big Sur, Anda dapat mengunduh berkas khusus '.mobileconfig' yang menambahkan server <highlight>DNS melalui HTTPS</highlight> atau <highlight>DNS melalui TLS</highlight> ke pengaturan DNS.",
|
||||||
"setup_dns_privacy_android_1": "Android 9 mendukung DNS-over-TLS secara asli. Untuk mengkonfigurasinya, buka Pengaturan → Jaringan & internet → Tingkat Lanjut → DNS Pribadi dan masukkan nama domain Anda di sana.",
|
"setup_dns_privacy_android_1": "Android 9 mendukung DNS-over-TLS secara asli. Untuk mengkonfigurasinya, buka Pengaturan → Jaringan & internet → Tingkat Lanjut → DNS Pribadi dan masukkan nama domain Anda di sana.",
|
||||||
"setup_dns_privacy_android_2": "<0>AdGuard untuk Android</0> mendukung <1>DNS-over-HTTPS</1> dan <1>DNS-over-TLS</1>.",
|
"setup_dns_privacy_android_2": "<0>AdGuard untuk Android</0> mendukung <1>DNS-over-HTTPS</1> dan <1>DNS-over-TLS</1>.",
|
||||||
"setup_dns_privacy_android_3": "<0>Intra</0> menambahkan dukungan <1>DNS-over-HTTPS</1> untuk Android.",
|
"setup_dns_privacy_android_3": "<0>Intra</0> menambahkan dukungan <1>DNS-over-HTTPS</1> untuk Android.",
|
||||||
@@ -505,13 +511,13 @@
|
|||||||
"rewrite_added": "DNS rewrite untuk \"{{key}}\" berhasil ditambahkan",
|
"rewrite_added": "DNS rewrite untuk \"{{key}}\" berhasil ditambahkan",
|
||||||
"rewrite_deleted": "DNS rewrite untuk \"{{key}}\" berhasil dihapus",
|
"rewrite_deleted": "DNS rewrite untuk \"{{key}}\" berhasil dihapus",
|
||||||
"rewrite_updated": "Penulisan ulang DNS berhasil diperbarui",
|
"rewrite_updated": "Penulisan ulang DNS berhasil diperbarui",
|
||||||
"rewrite_add": "Tambah DNS rewrite",
|
"rewrite_add": "Tambahkan penulisan ulang DNS",
|
||||||
"rewrite_edit": "Edit penulisan ulang DNS",
|
"rewrite_edit": "Edit penulisan ulang DNS",
|
||||||
"rewrite_not_found": "Tidak ada DNS rewrite ditemukan",
|
"rewrite_not_found": "Tidak ada DNS rewrite ditemukan",
|
||||||
"rewrite_confirm_delete": "Apakah anda yakin ingin menghapus DNS rewrite untuk \"{{key}}\"?",
|
"rewrite_confirm_delete": "Apakah anda yakin ingin menghapus DNS rewrite untuk \"{{key}}\"?",
|
||||||
"rewrite_desc": "Memungkinkan untuk dengan mudah mengkonfigurasi respons DNS kustom untuk nama domain tertentu.",
|
"rewrite_desc": "Memungkinkan untuk dengan mudah mengkonfigurasi respons DNS kustom untuk nama domain tertentu.",
|
||||||
"rewrite_applied": "Aturan Rewrite yang diterapkan",
|
"rewrite_applied": "Aturan Rewrite yang diterapkan",
|
||||||
"rewrite_hosts_applied": "Ditulis ulang oleh aturan file hosts",
|
"rewrite_hosts_applied": "Ditulis ulang oleh aturan berkas host",
|
||||||
"dns_rewrites": "DNS rewrite",
|
"dns_rewrites": "DNS rewrite",
|
||||||
"form_domain": "Masukkan nama domain",
|
"form_domain": "Masukkan nama domain",
|
||||||
"form_answer": "Masaukan alamat IP atau nama domain",
|
"form_answer": "Masaukan alamat IP atau nama domain",
|
||||||
@@ -542,7 +548,7 @@
|
|||||||
"domain": "Domain",
|
"domain": "Domain",
|
||||||
"ecs": "ECS",
|
"ecs": "ECS",
|
||||||
"punycode": "Kode kecil",
|
"punycode": "Kode kecil",
|
||||||
"answer": "Jawab",
|
"answer": "Jawaban",
|
||||||
"filter_added_successfully": "Filter telah berhasil ditambahkan",
|
"filter_added_successfully": "Filter telah berhasil ditambahkan",
|
||||||
"filter_removed_successfully": "Daftar ini telah sukses dihapus",
|
"filter_removed_successfully": "Daftar ini telah sukses dihapus",
|
||||||
"filter_updated": "Daftar telah sukses diperbarui",
|
"filter_updated": "Daftar telah sukses diperbarui",
|
||||||
@@ -557,7 +563,7 @@
|
|||||||
"ignore_domains": "Domain yang diabaikan (dipisahkan oleh baris baru)",
|
"ignore_domains": "Domain yang diabaikan (dipisahkan oleh baris baru)",
|
||||||
"ignore_domains_title": "Domain yang diabaikan",
|
"ignore_domains_title": "Domain yang diabaikan",
|
||||||
"ignore_domains_desc_stats": "Kueri yang cocok dengan aturan ini tidak ditulis ke statistik",
|
"ignore_domains_desc_stats": "Kueri yang cocok dengan aturan ini tidak ditulis ke statistik",
|
||||||
"ignore_domains_desc_query": "Kueri yang cocok dengan aturan ini tidak ditulis ke log kueri",
|
"ignore_domains_desc_query": "Kueri yang cocok dengan aturan ini tidak ditulis ke catatan kueri",
|
||||||
"interval_hours": "{{count}} jam",
|
"interval_hours": "{{count}} jam",
|
||||||
"interval_hours_plural": "{{count}} jam",
|
"interval_hours_plural": "{{count}} jam",
|
||||||
"filters_configuration": "Konfigurasi filter",
|
"filters_configuration": "Konfigurasi filter",
|
||||||
@@ -587,17 +593,17 @@
|
|||||||
"example_rewrite_wildcard": "tulis ulang respon untuk semua subdomain <0>contoh.org</0>.",
|
"example_rewrite_wildcard": "tulis ulang respon untuk semua subdomain <0>contoh.org</0>.",
|
||||||
"rewrite_ip_address": "Alamat IP: pakai IP ini dalam respons A atau AAAA",
|
"rewrite_ip_address": "Alamat IP: pakai IP ini dalam respons A atau AAAA",
|
||||||
"rewrite_domain_name": "Nama domain: tambah ke rekaman CNAME",
|
"rewrite_domain_name": "Nama domain: tambah ke rekaman CNAME",
|
||||||
"rewrite_A": "<0>A</0>: nilai khusus, biarkan <0>A</0> merekam dari upstream",
|
"rewrite_A": "<0>A</0>: nilai khusus, biarkan <0>A</0> merekam dari hulu",
|
||||||
"rewrite_AAAA": "<0>AAAA</0>: nilai khusus, biarkan <0>AAAA</0> merekam dari upstream",
|
"rewrite_AAAA": "<0>AAAA</0>: nilai khusus, biarkan <0>AAAA</0> merekam dari hulu",
|
||||||
"disable_ipv6": "Nonaktifkan penyelesaian alamat IPv6",
|
"disable_ipv6": "Nonaktifkan penyelesaian alamat IPv6",
|
||||||
"disable_ipv6_desc": "Hapus semua kueri DNS untuk alamat IPv6 (ketik AAAA) dan hapus petunjuk IPv6 dari respons HTTPS.",
|
"disable_ipv6_desc": "Hapus semua kueri DNS untuk alamat IPv6 (ketik AAAA) dan hapus petunjuk IPv6 dari respons HTTPS.",
|
||||||
"fastest_addr": "Alamat IP tercepat",
|
"fastest_addr": "Alamat IP tercepat",
|
||||||
"fastest_addr_desc": "Kuiri semua server DNS dan kembalikan alamat IP tercepat diantara semua tanggapan. Ini memperlambat pencarian DNS Sebagai Rumah AdGuard harus menunggu tanggapan dari semua server DNS, tapi meningkatkan konektivitas keseluruhan.",
|
"fastest_addr_desc": "Kuiri semua server DNS dan kembalikan alamat IP tercepat diantara semua tanggapan. Ini memperlambat pencarian DNS Sebagai Rumah AdGuard harus menunggu tanggapan dari semua server DNS, tapi meningkatkan konektivitas keseluruhan.",
|
||||||
"autofix_warning_text": "Apabila anda menekan \"Perbaiki\", AdGuardHome akan mengatur sistem anda untuk menggunakan server DNS AdGuardHome.",
|
"autofix_warning_text": "Apabila anda menekan \"Perbaiki\", AdGuardHome akan mengatur sistem anda untuk menggunakan server DNS AdGuardHome.",
|
||||||
"autofix_warning_list": "Ini akan melakukan tugas berikut: <0>Nonaktifkan sistem DNSStubListener</0> <0> Atur alamat server DNS ke 127.0.0.1</0> <0>Ganti target tautan simbolis /etc/resolv.conf pakai /run/systemd/resolve/resolv.conf</0> <0>Hentikan DNSStubListener (muat ulang layanan sistemd-resolve service)</0>",
|
"autofix_warning_list": "Ini akan melakukan tugas berikut: <0>Nonaktifkan sistem DNSStubListener</0> <0>Atur alamat server DNS ke 127.0.0.1</0> <0>Ganti target tautan simbolis /etc/resolv.conf dengan /run/systemd/resolve/resolv.conf</0> <0>Hentikan DNSStubListener (muat ulang layanan sistemd-resolved)</0>",
|
||||||
"autofix_warning_result": "Hasilnya, semua permintaan DNS dari sistem anda akan diproses oleh AdGuardHome secara standar.",
|
"autofix_warning_result": "Hasilnya, semua permintaan DNS dari sistem anda akan diproses oleh AdGuardHome secara standar.",
|
||||||
"tags_title": "Tag",
|
"tags_title": "Tag",
|
||||||
"tags_desc": "Anda dapat memilih tag sesuai dengan klien. Tag dapat dimasukkan dalam aturan pemfilteran dan memungkinkan Anda untuk menerapkannya lebih akurat. <0>Pelajari lebih</0>.",
|
"tags_desc": "Anda dapat memilih tag yang sesuai dengan klien. Sertakan tag dalam aturan pemfilteran untuk menerapkannya dengan lebih akurat. <0>Pelajari lebih lanjut</0>.",
|
||||||
"form_select_tags": "Pilih tag klien",
|
"form_select_tags": "Pilih tag klien",
|
||||||
"check_title": "Periksa penyaringan",
|
"check_title": "Periksa penyaringan",
|
||||||
"check_desc": "Periksa apakah nama host telah tersaring.",
|
"check_desc": "Periksa apakah nama host telah tersaring.",
|
||||||
@@ -605,7 +611,7 @@
|
|||||||
"form_enter_host": "Masukkan nama host",
|
"form_enter_host": "Masukkan nama host",
|
||||||
"filtered_custom_rules": "Tersaring oleh aturan penyaring Buatan",
|
"filtered_custom_rules": "Tersaring oleh aturan penyaring Buatan",
|
||||||
"choose_from_list": "Pilih dari daftar",
|
"choose_from_list": "Pilih dari daftar",
|
||||||
"add_custom_list": "Tambah daftar buatan",
|
"add_custom_list": "Tambahkan daftar kustom",
|
||||||
"host_whitelisted": "Host didaftar putihkan",
|
"host_whitelisted": "Host didaftar putihkan",
|
||||||
"check_ip": "Alamat IP: {{ip}}",
|
"check_ip": "Alamat IP: {{ip}}",
|
||||||
"check_cname": "CNAME: {{cname}}",
|
"check_cname": "CNAME: {{cname}}",
|
||||||
@@ -615,8 +621,8 @@
|
|||||||
"check_not_found": "Tidak di temukan di daftar penyaringan anda",
|
"check_not_found": "Tidak di temukan di daftar penyaringan anda",
|
||||||
"client_confirm_block": "Apa anda yakin ingin mem-blokir klien ini \"{{ip}}\"?",
|
"client_confirm_block": "Apa anda yakin ingin mem-blokir klien ini \"{{ip}}\"?",
|
||||||
"client_confirm_unblock": "Apa anda yakin ingin meng-unblock klien ini \"{{ip}}\"?",
|
"client_confirm_unblock": "Apa anda yakin ingin meng-unblock klien ini \"{{ip}}\"?",
|
||||||
"client_blocked": "Klien \"{{ip}}\" sukses di blokir",
|
"client_blocked": "Klien \"{{ip}}\" berhasil diblokir",
|
||||||
"client_unblocked": "Klien \"{{ip}}\" sukses di unblock",
|
"client_unblocked": "Klien \"{{ip}}\" berhasil membuka blokir",
|
||||||
"static_ip": "Alamat IP statis",
|
"static_ip": "Alamat IP statis",
|
||||||
"static_ip_desc": "AdGuard Home adalah server jadi perlu alamat IP statis agar berfungsi dengan benar. Jika tidak, pada titik tertentu, router Anda dapat menetapkan alamat IP yang berbeda untuk perangkat ini.",
|
"static_ip_desc": "AdGuard Home adalah server jadi perlu alamat IP statis agar berfungsi dengan benar. Jika tidak, pada titik tertentu, router Anda dapat menetapkan alamat IP yang berbeda untuk perangkat ini.",
|
||||||
"set_static_ip": "Atur alamat IP statik",
|
"set_static_ip": "Atur alamat IP statik",
|
||||||
@@ -634,8 +640,8 @@
|
|||||||
"show_whitelisted_responses": "Dalam Daftar Putih",
|
"show_whitelisted_responses": "Dalam Daftar Putih",
|
||||||
"show_processed_responses": "Terproses",
|
"show_processed_responses": "Terproses",
|
||||||
"blocked_safebrowsing": "Diblokir oleh Penjelajahan Aman",
|
"blocked_safebrowsing": "Diblokir oleh Penjelajahan Aman",
|
||||||
"blocked_adult_websites": "Diblok oleh Kontrol Orang tua",
|
"blocked_adult_websites": "Diblokir oleh Kontrol Orang Tua",
|
||||||
"blocked_threats": "Blokir Ancaman",
|
"blocked_threats": "Ancaman terblokir",
|
||||||
"allowed": "Dibolehkan",
|
"allowed": "Dibolehkan",
|
||||||
"filtered": "Tersaring",
|
"filtered": "Tersaring",
|
||||||
"rewritten": "Tulis ulang",
|
"rewritten": "Tulis ulang",
|
||||||
@@ -649,8 +655,8 @@
|
|||||||
"enter_cache_size": "Masukkan ukuran cache (bytes)",
|
"enter_cache_size": "Masukkan ukuran cache (bytes)",
|
||||||
"enter_cache_ttl_min_override": "Masukkan TTL minimum (detik)",
|
"enter_cache_ttl_min_override": "Masukkan TTL minimum (detik)",
|
||||||
"enter_cache_ttl_max_override": "Masukkan TTL maksimum (detik)",
|
"enter_cache_ttl_max_override": "Masukkan TTL maksimum (detik)",
|
||||||
"cache_ttl_min_override_desc": "Perpanjang nilai waktu-online singkat (detik) yang diterima dari server upstream saat menyimpan respons DNS.",
|
"cache_ttl_min_override_desc": "Perpanjang nilai time-to-live (detik) yang diterima dari server hulu saat menyimpan respons DNS.",
|
||||||
"cache_ttl_max_override_desc": "Tetapkan nilai waktu-online maksimum (detik) untuk entri di cache DNS.",
|
"cache_ttl_max_override_desc": "Tetapkan nilai maksimum time-to-live (detik) untuk entri dalam cache DNS.",
|
||||||
"ttl_cache_validation": "Nilai TTL cache minimum harus kurang dari atau sama dengan nilai maksimum",
|
"ttl_cache_validation": "Nilai TTL cache minimum harus kurang dari atau sama dengan nilai maksimum",
|
||||||
"cache_optimistic": "Caching yang optimis",
|
"cache_optimistic": "Caching yang optimis",
|
||||||
"cache_optimistic_desc": "Buat AdGuard Home merespons dari cache bahkan ketika entri telah kedaluwarsa dan juga mencoba untuk menyegarkannya.",
|
"cache_optimistic_desc": "Buat AdGuard Home merespons dari cache bahkan ketika entri telah kedaluwarsa dan juga mencoba untuk menyegarkannya.",
|
||||||
@@ -670,23 +676,23 @@
|
|||||||
"filter_allowlist": "PERINGATAN: Tindakan ini juga akan mengecualikan aturan \"{{disallowed_rule}}\" dari daftar klien yang diizinkan.",
|
"filter_allowlist": "PERINGATAN: Tindakan ini juga akan mengecualikan aturan \"{{disallowed_rule}}\" dari daftar klien yang diizinkan.",
|
||||||
"last_rule_in_allowlist": "Tidak dapat melarang klien ini karena mengecualikan aturan \"{{disallowed_rule}}\" akan MENONAKTIFKAN daftar \"Klien yang diizinkan\".",
|
"last_rule_in_allowlist": "Tidak dapat melarang klien ini karena mengecualikan aturan \"{{disallowed_rule}}\" akan MENONAKTIFKAN daftar \"Klien yang diizinkan\".",
|
||||||
"use_saved_key": "Gunakan kunci yang disimpan sebelumnya",
|
"use_saved_key": "Gunakan kunci yang disimpan sebelumnya",
|
||||||
"parental_control": "Kontrol Orang Tua",
|
"parental_control": "Pengawasan Orang Tua",
|
||||||
"safe_browsing": "Penjelajahan Aman",
|
"safe_browsing": "Penjelajahan Aman",
|
||||||
"served_from_cache": "{{value}} <i>(disajikan dari cache)</i>",
|
"served_from_cache_label": "Disajikan dari cache",
|
||||||
"form_error_password_length": "Kata sandi harus terdiri dari {{min}} hingga {{max}}",
|
"form_error_password_length": "Kata sandi harus terdiri dari {{min}} hingga {{max}}",
|
||||||
"anonymizer_notification": "<0>Catatan:</0> Anonimisasi IP diaktifkan. Anda dapat menonaktifkannya di <1>Pengaturan umum</1> .",
|
"anonymizer_notification": "<0>Catatan:</0> Anonimisasi IP diaktifkan. Anda dapat menonaktifkannya di <1>Pengaturan umum</1> .",
|
||||||
"confirm_dns_cache_clear": "Apakah Anda yakin ingin menghapus cache DNS?",
|
"confirm_dns_cache_clear": "Apakah Anda yakin ingin menghapus cache DNS?",
|
||||||
"cache_cleared": "Cache DNS berhasil dibersihkan",
|
"cache_cleared": "Cache DNS berhasil dihapus",
|
||||||
"clear_cache": "Hapus cache",
|
"clear_cache": "Hapus cache",
|
||||||
"make_static": "Jadikan statis",
|
"make_static": "Jadikan statis",
|
||||||
"theme_auto_desc": "Otomatis (berdasarkan skema warna perangkat anda)",
|
"theme_auto_desc": "Otomatis (berdasarkan skema warna perangkat anda)",
|
||||||
"theme_dark_desc": "Tema gelap",
|
"theme_dark_desc": "Tema gelap",
|
||||||
"theme_light_desc": "Tema terang",
|
"theme_light_desc": "Tema terang",
|
||||||
"disable_for_seconds": "Untuk {{count}} detik",
|
"disable_for_seconds": "Selama {{count}} detik",
|
||||||
"disable_for_seconds_plural": "Untuk {{count}} detik",
|
"disable_for_seconds_plural": "Selama {{count}} detik",
|
||||||
"disable_for_minutes": "Untuk {{count}} menit",
|
"disable_for_minutes": "Selama {{count}} menit",
|
||||||
"disable_for_minutes_plural": "Untuk {{count}} menit",
|
"disable_for_minutes_plural": "Selama {{count}} menit",
|
||||||
"disable_for_hours": "Untuk {{count}} jam",
|
"disable_for_hours": "Selama {{count}} jam",
|
||||||
"disable_for_hours_plural": "Untuk {{count}} jam",
|
"disable_for_hours_plural": "Untuk {{count}} jam",
|
||||||
"disable_until_tomorrow": "Sampai besok",
|
"disable_until_tomorrow": "Sampai besok",
|
||||||
"disable_notify_for_seconds": "Hentikan perlindungan selama {{count}} detik",
|
"disable_notify_for_seconds": "Hentikan perlindungan selama {{count}} detik",
|
||||||
@@ -700,10 +706,10 @@
|
|||||||
"custom_retention_input": "Masukkan retensi dalam hitungan jam",
|
"custom_retention_input": "Masukkan retensi dalam hitungan jam",
|
||||||
"custom_rotation_input": "Masukkan rotasi dalam hitungan jam",
|
"custom_rotation_input": "Masukkan rotasi dalam hitungan jam",
|
||||||
"protection_section_label": "Perlindungan",
|
"protection_section_label": "Perlindungan",
|
||||||
"log_and_stats_section_label": "Log kueri dan statistik",
|
"log_and_stats_section_label": "Catatan kueri dan statistik",
|
||||||
"ignore_query_log": "Abaikan klien ini di log kueri",
|
"ignore_query_log": "Abaikan klien ini di catatan kueri",
|
||||||
"ignore_statistics": "Abaikan klien ini di statistik",
|
"ignore_statistics": "Abaikan klien ini di statistik",
|
||||||
"schedule_services": "Menjeda pemblokiran layanan",
|
"schedule_services": "Jeda pemblokiran layanan",
|
||||||
"schedule_services_desc": "Mengonfigurasi jadwal jeda filter pemblokiran layanan",
|
"schedule_services_desc": "Mengonfigurasi jadwal jeda filter pemblokiran layanan",
|
||||||
"schedule_services_desc_client": "Mengonfigurasi jadwal jeda filter pemblokiran layanan untuk klien ini",
|
"schedule_services_desc_client": "Mengonfigurasi jadwal jeda filter pemblokiran layanan untuk klien ini",
|
||||||
"schedule_desc": "Tetapkan periode tidak aktif untuk layanan yang diblokir",
|
"schedule_desc": "Tetapkan periode tidak aktif untuk layanan yang diblokir",
|
||||||
@@ -735,7 +741,7 @@
|
|||||||
"thursday_short": "Kam",
|
"thursday_short": "Kam",
|
||||||
"friday_short": "Jum",
|
"friday_short": "Jum",
|
||||||
"saturday_short": "Sab",
|
"saturday_short": "Sab",
|
||||||
"upstream_dns_cache_configuration": "Konfigurasi cache DNS upstream",
|
"upstream_dns_cache_configuration": "Konfigurasi cache DNS hulu",
|
||||||
"enable_upstream_dns_cache": "Aktifkan cache DNS untuk konfigurasi upstream kustom klien ini",
|
"enable_upstream_dns_cache": "Aktifkan cache DNS untuk konfigurasi hulu kustom pada klien ini",
|
||||||
"dns_cache_size": "Ukuran cache DNS, dalam byte"
|
"dns_cache_size": "Ukuran cache DNS, dalam byte"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6,21 +6,21 @@
|
|||||||
"upstream_parallel": "Utilizza richieste parallele per accelerare la risoluzione interrogando simultaneamente tutti i server upstream.",
|
"upstream_parallel": "Utilizza richieste parallele per accelerare la risoluzione interrogando simultaneamente tutti i server upstream.",
|
||||||
"parallel_requests": "Richieste parallele",
|
"parallel_requests": "Richieste parallele",
|
||||||
"load_balancing": "Bilanciamento del carico",
|
"load_balancing": "Bilanciamento del carico",
|
||||||
"load_balancing_desc": "Interroga un server upstream per volta. AdGuard Home utilizzerà un algoritmo casuale ponderato per la selezione del server, in maniera tale da scegliere spesso il più veloce.",
|
"load_balancing_desc": "Esegui una query su un server upstream alla volta.<br/>AdGuard Home utilizza un algoritmo casuale ponderato per selezionare i server con il minor numero di ricerche fallite e il tempo medio di ricerca più basso.",
|
||||||
"bootstrap_dns": "Server DNS bootstrap",
|
"bootstrap_dns": "Server DNS bootstrap",
|
||||||
"bootstrap_dns_desc": "Indirizzi IP dei server DNS utilizzati per risolvere gli indirizzi IP dei resolver DoH/DoT specificati come upstream. I commenti non sono ammessi.",
|
"bootstrap_dns_desc": "Indirizzi IP dei server DNS utilizzati per risolvere gli indirizzi IP dei resolver DoH/DoT specificati come upstream. I commenti non sono ammessi.",
|
||||||
"fallback_dns_title": "Server DNS di fallback",
|
"fallback_dns_title": "Server DNS di fallback",
|
||||||
"fallback_dns_desc": "Elenco dei server DNS fallback utilizzati quando i server DNS upstream non rispondono. La sintassi è la stessa del campo principale upstream sopra.",
|
"fallback_dns_desc": "Elenco dei server DNS fallback utilizzati quando i server DNS upstream non rispondono. La sintassi è la stessa del campo principale upstream sopra.",
|
||||||
"fallback_dns_placeholder": "Inserisci un server DNS fallback per riga",
|
"fallback_dns_placeholder": "Inserisci un server DNS fallback per riga",
|
||||||
"local_ptr_title": "Server DNS privati inversi",
|
"local_ptr_title": "Server DNS privati inversi",
|
||||||
"local_ptr_desc": "I server DNS che AdGuard Home utilizza per le richieste PTR locali. Questi server vengono utilizzati per risolvere i nomi host dei client con indirizzi IP privati, ad esempio \"192.168.12.34\", utilizzando il DNS inverso. Se non è impostato, AdGuard Home utilizzerà gli indirizzi dei resolutori DNS predefiniti del tuo sistema operativo ad eccezione degli indirizzi di AdGuard Home stesso.",
|
"local_ptr_desc": "I server DNS usati da AdGuard Home per richieste private PTR, SOA e NS. Una richiesta è considerata privata se richiede un dominio ARPA contenente una sottorete all'interno di intervalli IP privati (come \"192.168.12.34\") e proviene da un client con un indirizzo IP privato. Se non impostato, saranno usati i risolutori DNS predefiniti del tuo sistema operativo, ad eccezione degli indirizzi IP di AdGuard Home.",
|
||||||
"local_ptr_default_resolver": "Per impostazione predefinita, AdGuard Home utilizzerà i seguenti risolutori DNS inversi: {{ip}}.",
|
"local_ptr_default_resolver": "Per impostazione predefinita, AdGuard Home utilizzerà i seguenti risolutori DNS inversi: {{ip}}.",
|
||||||
"local_ptr_no_default_resolver": "AdGuard Home non è stato in grado di determinare i risolutori DNS inversi privati adatti per questo sistema.",
|
"local_ptr_no_default_resolver": "AdGuard Home non è stato in grado di determinare i risolutori DNS inversi privati adatti per questo sistema.",
|
||||||
"local_ptr_placeholder": "Inserisci un indirizzo IP per riga",
|
"local_ptr_placeholder": "Inserisci un indirizzo IP per riga",
|
||||||
"resolve_clients_title": "Attiva la risoluzione inversa degli indirizzi IP dei client",
|
"resolve_clients_title": "Attiva la risoluzione inversa degli indirizzi IP dei client",
|
||||||
"resolve_clients_desc": "Risolve inversamente gli indirizzi IP dei client nei loro nomi host inviando richieste PTR ai risolutori corrispondenti (server DNS privati per client locali, server upstream per client con indirizzi IP pubblici).",
|
"resolve_clients_desc": "Risolve inversamente gli indirizzi IP dei client nei loro nomi host inviando richieste PTR ai risolutori corrispondenti (server DNS privati per client locali, server upstream per client con indirizzi IP pubblici).",
|
||||||
"use_private_ptr_resolvers_title": "Utilizza dei resolver rDNS privati",
|
"use_private_ptr_resolvers_title": "Utilizza dei resolver rDNS privati",
|
||||||
"use_private_ptr_resolvers_desc": "Esegue ricerche DNS inverse per indirizzi locali utilizzando questi server upstream. Se disattivata, AdGuard Home risponderà con NXDOMAIN a tutte le richieste PTR ad eccezione dei client noti da DHCP, /etc/hosts, e così via.",
|
"use_private_ptr_resolvers_desc": "Risolvi le richieste PTR, SOA e NS per domini ARPA contenenti indirizzi IP privati tramite server upstream privati, DHCP, /etc/hosts, ecc. Se disabilitato, AdGuard Home risponderà a tutte queste richieste con NXDOMAIN.",
|
||||||
"check_dhcp_servers": "Controlla la presenza di server DHCP",
|
"check_dhcp_servers": "Controlla la presenza di server DHCP",
|
||||||
"save_config": "Salva configurazione",
|
"save_config": "Salva configurazione",
|
||||||
"enabled_dhcp": "Server DHCP attivo",
|
"enabled_dhcp": "Server DHCP attivo",
|
||||||
@@ -154,7 +154,7 @@
|
|||||||
"use_adguard_parental": "Utilizza il Controllo Parentale di AdGuard",
|
"use_adguard_parental": "Utilizza il Controllo Parentale di AdGuard",
|
||||||
"use_adguard_parental_hint": "AdGuard Home verificherà se il dominio contiene materiale per adulti. Utilizza le stesse API privacy-friendly del servizio web 'sicurezza di navigazione'.",
|
"use_adguard_parental_hint": "AdGuard Home verificherà se il dominio contiene materiale per adulti. Utilizza le stesse API privacy-friendly del servizio web 'sicurezza di navigazione'.",
|
||||||
"enforce_safe_search": "Utilizza Ricerca Sicura",
|
"enforce_safe_search": "Utilizza Ricerca Sicura",
|
||||||
"enforce_save_search_hint": "AdGuard Home forzerà la ricerca sicura sui seguenti motori di ricerca: Google, YouTube, Bing, DuckDuckGo, Yandex, Pixabay.",
|
"enforce_save_search_hint": "AdGuard Home applicherà la ricerca sicura nei seguenti motori di ricerca: Google, YouTube, Bing, DuckDuckGo, Ecosia, Yandex, Pixabay.",
|
||||||
"no_servers_specified": "Nessun server specificato",
|
"no_servers_specified": "Nessun server specificato",
|
||||||
"general_settings": "Impostazioni generali",
|
"general_settings": "Impostazioni generali",
|
||||||
"dns_settings": "Impostazioni DNS",
|
"dns_settings": "Impostazioni DNS",
|
||||||
@@ -236,6 +236,7 @@
|
|||||||
"updated_upstream_dns_toast": "I server upstream sono stati salvati correttamente",
|
"updated_upstream_dns_toast": "I server upstream sono stati salvati correttamente",
|
||||||
"dns_test_ok_toast": "I server DNS specificati funzionano correttamente",
|
"dns_test_ok_toast": "I server DNS specificati funzionano correttamente",
|
||||||
"dns_test_not_ok_toast": "Server \"{{key}}\": non può essere utilizzato, assicurati di averlo digitato correttamente",
|
"dns_test_not_ok_toast": "Server \"{{key}}\": non può essere utilizzato, assicurati di averlo digitato correttamente",
|
||||||
|
"dns_test_parsing_error_toast": "Sezione {{section}}: riga {{line}}: non può essere usata, controlla se l'hai scritta correttamente",
|
||||||
"dns_test_warning_toast": "Upstream \"{{key}}\" non risponde alle richieste di test e potrebbe non funzionare correttamente",
|
"dns_test_warning_toast": "Upstream \"{{key}}\" non risponde alle richieste di test e potrebbe non funzionare correttamente",
|
||||||
"unblock": "Sblocca",
|
"unblock": "Sblocca",
|
||||||
"block": "Blocca",
|
"block": "Blocca",
|
||||||
@@ -243,6 +244,7 @@
|
|||||||
"allow_this_client": "Consenti questo client",
|
"allow_this_client": "Consenti questo client",
|
||||||
"block_for_this_client_only": "Blocca solo per questo client",
|
"block_for_this_client_only": "Blocca solo per questo client",
|
||||||
"unblock_for_this_client_only": "Sblocca solo per questo client",
|
"unblock_for_this_client_only": "Sblocca solo per questo client",
|
||||||
|
"add_persistent_client": "Aggiungi come client persistente",
|
||||||
"time_table_header": "Ora",
|
"time_table_header": "Ora",
|
||||||
"date": "Data",
|
"date": "Data",
|
||||||
"domain_name_table_header": "Nome dominio",
|
"domain_name_table_header": "Nome dominio",
|
||||||
@@ -292,6 +294,9 @@
|
|||||||
"blocked_response_ttl": "Risposta TTL bloccata",
|
"blocked_response_ttl": "Risposta TTL bloccata",
|
||||||
"blocked_response_ttl_desc": "Specifica per quanti secondi i client devono tenere nella cache una risposta filtrata",
|
"blocked_response_ttl_desc": "Specifica per quanti secondi i client devono tenere nella cache una risposta filtrata",
|
||||||
"form_enter_blocked_response_ttl": "Inserisci tempo di vita (TTL) della risposta bloccata (secondi)",
|
"form_enter_blocked_response_ttl": "Inserisci tempo di vita (TTL) della risposta bloccata (secondi)",
|
||||||
|
"upstream_timeout": "Timeout upstream",
|
||||||
|
"upstream_timeout_desc": "Specifica il numero di secondi da attendere per una risposta dal server upstream",
|
||||||
|
"form_enter_upstream_timeout": "Inserisci la durata del timeout del server upstream in secondi",
|
||||||
"dnscrypt": "DNSCrypt",
|
"dnscrypt": "DNSCrypt",
|
||||||
"dns_over_https": "DNS su HTTPS",
|
"dns_over_https": "DNS su HTTPS",
|
||||||
"dns_over_tls": "DNS su TLS",
|
"dns_over_tls": "DNS su TLS",
|
||||||
@@ -339,7 +344,7 @@
|
|||||||
"list_label": "Elenco",
|
"list_label": "Elenco",
|
||||||
"unknown_filter": "Filtro sconosciuto {{filterId}}",
|
"unknown_filter": "Filtro sconosciuto {{filterId}}",
|
||||||
"known_tracker": "Tracciatore noto",
|
"known_tracker": "Tracciatore noto",
|
||||||
"install_welcome_title": "Benvenuto nella Home di AdGuard!",
|
"install_welcome_title": "Benvenuto in AdGuard Home!",
|
||||||
"install_welcome_desc": "AdGuard Home è un server DNS che blocca annunci e tracciatori a livello di rete. Il suo scopo è quello di permetterti il controllo dell'intera rete e di tutti i dispositivi, e non richiede l'utilizzo di un programma lato client.",
|
"install_welcome_desc": "AdGuard Home è un server DNS che blocca annunci e tracciatori a livello di rete. Il suo scopo è quello di permetterti il controllo dell'intera rete e di tutti i dispositivi, e non richiede l'utilizzo di un programma lato client.",
|
||||||
"install_settings_title": "Interfaccia Web dell'Admin",
|
"install_settings_title": "Interfaccia Web dell'Admin",
|
||||||
"install_settings_listen": "Interfaccia d'ascolto",
|
"install_settings_listen": "Interfaccia d'ascolto",
|
||||||
@@ -423,6 +428,9 @@
|
|||||||
"encryption_hostnames": "Nomi host",
|
"encryption_hostnames": "Nomi host",
|
||||||
"encryption_reset": "Sei sicuro di voler ripristinare le impostazioni di crittografia?",
|
"encryption_reset": "Sei sicuro di voler ripristinare le impostazioni di crittografia?",
|
||||||
"encryption_warning": "Attenzione",
|
"encryption_warning": "Attenzione",
|
||||||
|
"encryption_plain_dns_enable": "Abilita DNS semplice",
|
||||||
|
"encryption_plain_dns_desc": "Il DNS semplice è abilitato per impostazione predefinita. Puoi disabilitarlo per forzare tutti i dispositivi a usare DNS crittografati. Per fare ciò è necessario abilitare almeno un protocollo DNS crittografato",
|
||||||
|
"encryption_plain_dns_error": "Per disabilitare il DNS semplice, abilitare almeno un protocollo DNS crittografato",
|
||||||
"topline_expiring_certificate": "Il tuo certificato SSL sta per scadere. Aggiorna le<0> Impostazioni di crittografia </ 0>.",
|
"topline_expiring_certificate": "Il tuo certificato SSL sta per scadere. Aggiorna le<0> Impostazioni di crittografia </ 0>.",
|
||||||
"topline_expired_certificate": "Il tuo certificato SSL è scaduto. Aggiorna le <0> Impostazioni di crittografia </ 0>.",
|
"topline_expired_certificate": "Il tuo certificato SSL è scaduto. Aggiorna le <0> Impostazioni di crittografia </ 0>.",
|
||||||
"form_error_port_range": "Immettere il valore della porta nell'intervallo 80-65535",
|
"form_error_port_range": "Immettere il valore della porta nell'intervallo 80-65535",
|
||||||
@@ -441,7 +449,7 @@
|
|||||||
"update_now": "Aggiorna ora",
|
"update_now": "Aggiorna ora",
|
||||||
"update_failed": "Aggiornamento automatico non riuscito. Ti suggeriamo di <a>seguire questi passaggi</a> per aggiornare manualmente.",
|
"update_failed": "Aggiornamento automatico non riuscito. Ti suggeriamo di <a>seguire questi passaggi</a> per aggiornare manualmente.",
|
||||||
"manual_update": "Ti invitiamo a <a>seguire questi passaggi</a> per aggiornare manualmente.",
|
"manual_update": "Ti invitiamo a <a>seguire questi passaggi</a> per aggiornare manualmente.",
|
||||||
"processing_update": "Perfavore aspetta, AdGuard Home si sta aggiornando",
|
"processing_update": "Attendi per favore, AdGuard Home si sta aggiornando",
|
||||||
"clients_title": "Client persistenti",
|
"clients_title": "Client persistenti",
|
||||||
"clients_desc": "Configura le registrazioni dei client persistenti per i dispositivi connessi ad AdGuard Home",
|
"clients_desc": "Configura le registrazioni dei client persistenti per i dispositivi connessi ad AdGuard Home",
|
||||||
"settings_global": "Globale",
|
"settings_global": "Globale",
|
||||||
@@ -462,6 +470,7 @@
|
|||||||
"form_add_id": "Aggiungi identificatore",
|
"form_add_id": "Aggiungi identificatore",
|
||||||
"form_client_name": "Inserisci nome client",
|
"form_client_name": "Inserisci nome client",
|
||||||
"name": "Nome",
|
"name": "Nome",
|
||||||
|
"client_name": "Client {{id}}",
|
||||||
"client_global_settings": "Utilizza le impostazioni globali",
|
"client_global_settings": "Utilizza le impostazioni globali",
|
||||||
"client_deleted": "Client \"{{key}}\" eliminato correttamente",
|
"client_deleted": "Client \"{{key}}\" eliminato correttamente",
|
||||||
"client_added": "Client \"{{key}}\" aggiunto correttamente",
|
"client_added": "Client \"{{key}}\" aggiunto correttamente",
|
||||||
@@ -592,7 +601,7 @@
|
|||||||
"disable_ipv6": "Disattiva risoluzione indirizzi IPv6",
|
"disable_ipv6": "Disattiva risoluzione indirizzi IPv6",
|
||||||
"disable_ipv6_desc": "Eliminare tutte le query DNS per gli indirizzi IPv6 (tipo AAAA) e rimuovere i suggerimenti IPv6 dalle risposte HTTPS.",
|
"disable_ipv6_desc": "Eliminare tutte le query DNS per gli indirizzi IPv6 (tipo AAAA) e rimuovere i suggerimenti IPv6 dalle risposte HTTPS.",
|
||||||
"fastest_addr": "Indirizzo IP più veloce",
|
"fastest_addr": "Indirizzo IP più veloce",
|
||||||
"fastest_addr_desc": "Interroga tutti i server DNS e restituisci l'indirizzo IP più veloce tra tutte le risposte. Ciò rallenterà le richieste DNS poiché AdGuard Home dovrà attendere le risposte da tutti i server DNS, ma ciò migliorerà complessivamente la connettività.",
|
"fastest_addr_desc": "Attendi le risposte da <b>tutti i</b> server DNS, misura la velocità di connessione TCP per ogni server e restituisci l'indirizzo IP del server con la velocità di connessione più elevata.<br/>Questa modalità può rallentare notevolmente le query DNS, se uno o più server upstream non rispondono. Assicurati che i tuoi server upstream siano stabili e che il timeout upstream sia basso.",
|
||||||
"autofix_warning_text": "Se fai clic su \"Correggi\", AdGuardHome configurerà il tuo sistema per utilizzare il server DNS AdGuardHome.",
|
"autofix_warning_text": "Se fai clic su \"Correggi\", AdGuardHome configurerà il tuo sistema per utilizzare il server DNS AdGuardHome.",
|
||||||
"autofix_warning_list": "Eseguirà queste attività: <0> Disattiva DNSStubListener di sistema </0> <0> Imposta l'indirizzo del server DNS su 127.0.0.1 </0> <0> Sostituisci la destinazione del collegamento simbolico di /etc/resolv.conf su / run / systemd /resolve/resolv.conf </0> <0> Arresta DNSStubListener (ricarica il servizio systemd-resolved) </0>",
|
"autofix_warning_list": "Eseguirà queste attività: <0> Disattiva DNSStubListener di sistema </0> <0> Imposta l'indirizzo del server DNS su 127.0.0.1 </0> <0> Sostituisci la destinazione del collegamento simbolico di /etc/resolv.conf su / run / systemd /resolve/resolv.conf </0> <0> Arresta DNSStubListener (ricarica il servizio systemd-resolved) </0>",
|
||||||
"autofix_warning_result": "Di conseguenza, tutte le richieste DNS dal sistema verranno elaborate da AdGuardHome per impostazione predefinita.",
|
"autofix_warning_result": "Di conseguenza, tutte le richieste DNS dal sistema verranno elaborate da AdGuardHome per impostazione predefinita.",
|
||||||
@@ -672,7 +681,7 @@
|
|||||||
"use_saved_key": "Utilizza la chiave salvata in precedenza",
|
"use_saved_key": "Utilizza la chiave salvata in precedenza",
|
||||||
"parental_control": "Controllo Parentale",
|
"parental_control": "Controllo Parentale",
|
||||||
"safe_browsing": "Navigazione Sicura",
|
"safe_browsing": "Navigazione Sicura",
|
||||||
"served_from_cache": "{{value}} <i>(fornito dalla cache)</i>",
|
"served_from_cache_label": "Servito dalla cache",
|
||||||
"form_error_password_length": "La password deve contenere da {{min}} a {{max}} caratteri",
|
"form_error_password_length": "La password deve contenere da {{min}} a {{max}} caratteri",
|
||||||
"anonymizer_notification": "<0>Attenzione:</0> L'anonimizzazione dell'IP è abilitata. Puoi disabilitarla in <1>Impostazioni generali</1>.",
|
"anonymizer_notification": "<0>Attenzione:</0> L'anonimizzazione dell'IP è abilitata. Puoi disabilitarla in <1>Impostazioni generali</1>.",
|
||||||
"confirm_dns_cache_clear": "Sei sicuro di voler cancellare la cache DNS?",
|
"confirm_dns_cache_clear": "Sei sicuro di voler cancellare la cache DNS?",
|
||||||
|
|||||||
@@ -6,21 +6,21 @@
|
|||||||
"upstream_parallel": "並列リクエストを使用する(同時にすべてのアップストリームサーバーに処理要求することで解決スピードが向上)",
|
"upstream_parallel": "並列リクエストを使用する(同時にすべてのアップストリームサーバーに処理要求することで解決スピードが向上)",
|
||||||
"parallel_requests": "並列リクエスト",
|
"parallel_requests": "並列リクエスト",
|
||||||
"load_balancing": "ロードバランシング",
|
"load_balancing": "ロードバランシング",
|
||||||
"load_balancing_desc": "一度に1つのアップストリームサーバに処理要求します。 AdGuard Homeは、重み付きランダムアルゴリズム(weighted random algorithm)を使用してサーバを選択するため、最速のサーバがより頻繁に使用されます。",
|
"load_balancing_desc": "一度に1つのアップストリームサーバーをクエリします。<br/>AdGuard Home は、重み付き乱択アルゴリズムを使用して、ルックアップに失敗した回数が最も少なく、平均ルックアップ時間が最も短いサーバーを選択します。",
|
||||||
"bootstrap_dns": "ブートストラップDNSサーバ",
|
"bootstrap_dns": "ブートストラップDNSサーバ",
|
||||||
"bootstrap_dns_desc": "アップストリームとして指定したDoH/DoTリゾルバのIPアドレスを解決するために使用されるDNSサーバーのIPアドレスです。(コメントは許可されていません)",
|
"bootstrap_dns_desc": "アップストリームとして指定したDoH/DoTリゾルバのIPアドレスを解決するために使用されるDNSサーバーのIPアドレスです。(コメントは許可されていません)",
|
||||||
"fallback_dns_title": "フォールバックDNSサーバー",
|
"fallback_dns_title": "フォールバックDNSサーバー",
|
||||||
"fallback_dns_desc": "アップストリームDNSサーバーが応答しない場合に使用されるフォールバックDNSサーバーのリストです。構文は上記のmain upstreamsフィールドと同じです。",
|
"fallback_dns_desc": "アップストリームDNSサーバーが応答しない場合に使用されるフォールバックDNSサーバーのリストです。構文は上記のmain upstreamsフィールドと同じです。",
|
||||||
"fallback_dns_placeholder": "フォールバックDNSサーバーを1行に1つずつ入力してください。",
|
"fallback_dns_placeholder": "フォールバックDNSサーバーを1行に1つずつ入力してください。",
|
||||||
"local_ptr_title": "プライベートリバースDNSサーバー",
|
"local_ptr_title": "プライベートリバースDNSサーバー",
|
||||||
"local_ptr_desc": "AdGuard HomeがローカルPTRクエリに使用するDNSサーバーです。これらのサーバーは、rDNSを使ってプライベートIPアドレス(例えば\"192.168.12.34\")を持つクライアントのホスト名を解決するために使用されます。設定されていない場合、AdGuard HomeはOSのデフォルトDNSリゾルバーのアドレス(AdGuard Home自体のアドレスを除く)を自動的に使用します。",
|
"local_ptr_desc": "AdGuard Home がプライベート PTR、SOA、および NS リクエストに使用する DNS サーバー。プライベート IP 範囲内のサブネット (「192.168.12.34」など) を含む ARPA ドメインを要求し、プライベート IP アドレスを持つクライアントから来たリクエストが、プライベートリクエストとみなされます。本設定が特に指定されていない場合、OS のデフォルト DNS リゾルバ(AdGuard Home の IP アドレスを除く)が使用されます。",
|
||||||
"local_ptr_default_resolver": "デフォルトでは、AdGuard Homeは次のリバースDNSリゾルバを使用します: {{ip}}",
|
"local_ptr_default_resolver": "デフォルトでは、AdGuard Homeは次のリバースDNSリゾルバを使用します: {{ip}}",
|
||||||
"local_ptr_no_default_resolver": "AdGuard Homeは、このシステムに適したプライベートリバースDNSリゾルバを特定できませんでした。",
|
"local_ptr_no_default_resolver": "AdGuard Homeは、このシステムに適したプライベートリバースDNSリゾルバを特定できませんでした。",
|
||||||
"local_ptr_placeholder": "IPアドレスを1行に1つずづ入力してください。",
|
"local_ptr_placeholder": "IPアドレスを1行に1つずづ入力してください。",
|
||||||
"resolve_clients_title": "クライアントのIPアドレスの逆解決を有効にする",
|
"resolve_clients_title": "クライアントのIPアドレスの逆解決を有効にする",
|
||||||
"resolve_clients_desc": "対応するリゾルバー(ローカルクライアントの場合はプライベートDNSサーバ、パブリックIPを持つクライアントの場合はアップストリームサーバー)にPTRクエリを送信することにより、クライアントのIPアドレスをホストネームに逆解決します。",
|
"resolve_clients_desc": "対応するリゾルバー(ローカルクライアントの場合はプライベートDNSサーバ、パブリックIPを持つクライアントの場合はアップストリームサーバー)にPTRクエリを送信することにより、クライアントのIPアドレスをホストネームに逆解決します。",
|
||||||
"use_private_ptr_resolvers_title": "プライベートリバースDNSリゾルバを使用",
|
"use_private_ptr_resolvers_title": "プライベートリバースDNSリゾルバを使用",
|
||||||
"use_private_ptr_resolvers_desc": "これらのアップストリームサーバーを使用して、ローカルで提供されるアドレスのリバースDNSルックアップを実行します。無効にすると、AdGuard Homeは、DHCP, /etc/hosts などから認識されるクライアントを除き、すべてのこのようなPTR要求にNXDOMAINで応答します。",
|
"use_private_ptr_resolvers_desc": "プライベートアップストリームサーバー、DHCP、/etc/hosts などを通じて、プライベート IP アドレスを含む ARPA ドメインの PTR、SOA、および NS リクエストを解決します。無効にした場合、AdGuard Home はこのようなリクエストのすべてに NXDOMAIN で応答します。",
|
||||||
"check_dhcp_servers": "DHCPサーバをチェックする",
|
"check_dhcp_servers": "DHCPサーバをチェックする",
|
||||||
"save_config": "構成を保存する",
|
"save_config": "構成を保存する",
|
||||||
"enabled_dhcp": "DHCPサーバを有効にしました",
|
"enabled_dhcp": "DHCPサーバを有効にしました",
|
||||||
@@ -154,7 +154,7 @@
|
|||||||
"use_adguard_parental": "AdGuardペアレンタルコントロール・ウェブサービスを使用する",
|
"use_adguard_parental": "AdGuardペアレンタルコントロール・ウェブサービスを使用する",
|
||||||
"use_adguard_parental_hint": "AdGuard Homeは、ドメインにアダルトコンテンツが含まれているかどうかを確認します。 ブラウジングセキュリティ・ウェブサービスと同じプライバシーに優しいAPIを使用します。",
|
"use_adguard_parental_hint": "AdGuard Homeは、ドメインにアダルトコンテンツが含まれているかどうかを確認します。 ブラウジングセキュリティ・ウェブサービスと同じプライバシーに優しいAPIを使用します。",
|
||||||
"enforce_safe_search": "セーフサーチを使用する",
|
"enforce_safe_search": "セーフサーチを使用する",
|
||||||
"enforce_save_search_hint": "AdGuard Homeは、次の検索エンジンでセーフサーチを強制適用します: Google, YouTube, Bing, DuckDuckGo, Yandex, Pixabay",
|
"enforce_save_search_hint": "AdGuard Homeは、次の検索エンジンでセーフサーチを強制適用します: Google, YouTube, Bing, DuckDuckGo, Ecosia, Yandex, Pixabay",
|
||||||
"no_servers_specified": "サーバが指定されていません",
|
"no_servers_specified": "サーバが指定されていません",
|
||||||
"general_settings": "一般設定",
|
"general_settings": "一般設定",
|
||||||
"dns_settings": "DNS設定",
|
"dns_settings": "DNS設定",
|
||||||
@@ -236,6 +236,7 @@
|
|||||||
"updated_upstream_dns_toast": "アップストリームサーバーを保存しました。",
|
"updated_upstream_dns_toast": "アップストリームサーバーを保存しました。",
|
||||||
"dns_test_ok_toast": "指定されたDNSサーバは正しく動作しています",
|
"dns_test_ok_toast": "指定されたDNSサーバは正しく動作しています",
|
||||||
"dns_test_not_ok_toast": "サーバ \"{{key}}\": 使用できませんでした。正しく入力されているかどうかを確認してください",
|
"dns_test_not_ok_toast": "サーバ \"{{key}}\": 使用できませんでした。正しく入力されているかどうかを確認してください",
|
||||||
|
"dns_test_parsing_error_toast": "セクション {{section}}: 行 {{line}}: を使用できませんでした。正しく記述されているか確認してください",
|
||||||
"dns_test_warning_toast": "アップストリーム\"{{key}}\"はテストリクエストに応答せず、正しく動作しない可能性があります。",
|
"dns_test_warning_toast": "アップストリーム\"{{key}}\"はテストリクエストに応答せず、正しく動作しない可能性があります。",
|
||||||
"unblock": "ブロック解除",
|
"unblock": "ブロック解除",
|
||||||
"block": "ブロック",
|
"block": "ブロック",
|
||||||
@@ -243,6 +244,7 @@
|
|||||||
"allow_this_client": "このクライアントを許可する",
|
"allow_this_client": "このクライアントを許可する",
|
||||||
"block_for_this_client_only": "このクライアントに対してのみブロックする",
|
"block_for_this_client_only": "このクライアントに対してのみブロックする",
|
||||||
"unblock_for_this_client_only": "このクライアントに対してのみブロックを解除する",
|
"unblock_for_this_client_only": "このクライアントに対してのみブロックを解除する",
|
||||||
|
"add_persistent_client": "永続クライアントとして追加する",
|
||||||
"time_table_header": "時刻",
|
"time_table_header": "時刻",
|
||||||
"date": "購入日時",
|
"date": "購入日時",
|
||||||
"domain_name_table_header": "ドメイン名",
|
"domain_name_table_header": "ドメイン名",
|
||||||
@@ -292,6 +294,9 @@
|
|||||||
"blocked_response_ttl": "Blocked Response TTL(ブロック済み応答のTTL)",
|
"blocked_response_ttl": "Blocked Response TTL(ブロック済み応答のTTL)",
|
||||||
"blocked_response_ttl_desc": "フィルタリングされた応答をクライアントがキャッシュしておく時間(秒)を指定します。",
|
"blocked_response_ttl_desc": "フィルタリングされた応答をクライアントがキャッシュしておく時間(秒)を指定します。",
|
||||||
"form_enter_blocked_response_ttl": "ブロック済み応答のTTL(秒単位)を入力してください",
|
"form_enter_blocked_response_ttl": "ブロック済み応答のTTL(秒単位)を入力してください",
|
||||||
|
"upstream_timeout": "Upstream timeout(アップストリームタイムアウト)",
|
||||||
|
"upstream_timeout_desc": "アップストリームサーバーからの応答を待つ秒数を指定します。",
|
||||||
|
"form_enter_upstream_timeout": "アップストリームサーバーのタイムアウト時間を秒単位で入力します。",
|
||||||
"dnscrypt": "DNSCrypt",
|
"dnscrypt": "DNSCrypt",
|
||||||
"dns_over_https": "DNS-over-HTTPS",
|
"dns_over_https": "DNS-over-HTTPS",
|
||||||
"dns_over_tls": "DNS-over-TLS",
|
"dns_over_tls": "DNS-over-TLS",
|
||||||
@@ -423,6 +428,9 @@
|
|||||||
"encryption_hostnames": "ホスト名",
|
"encryption_hostnames": "ホスト名",
|
||||||
"encryption_reset": "暗号化設定をリセットして良いですか?",
|
"encryption_reset": "暗号化設定をリセットして良いですか?",
|
||||||
"encryption_warning": "警告",
|
"encryption_warning": "警告",
|
||||||
|
"encryption_plain_dns_enable": "プレーンDNSを有効にする",
|
||||||
|
"encryption_plain_dns_desc": "プレーンDNSはデフォルトで有効になっています。無効にして、すべてのデバイスに暗号化された DNS の使用を強制適用できます。これを行うには、少なくとも 1 つの暗号化されたDNSプロトコルを有効にする必要があります。",
|
||||||
|
"encryption_plain_dns_error": "プレーンDNSを無効にするには、暗号化DNSプロトコルを少なくとも 1 つ有効にしてください",
|
||||||
"topline_expiring_certificate": "SSL証明書は期限切れになります。<0>暗号化設定</0>を更新します。",
|
"topline_expiring_certificate": "SSL証明書は期限切れになります。<0>暗号化設定</0>を更新します。",
|
||||||
"topline_expired_certificate": "SSL証明書は期限切れです。<0>暗号化設定</0>を更新します。",
|
"topline_expired_certificate": "SSL証明書は期限切れです。<0>暗号化設定</0>を更新します。",
|
||||||
"form_error_port_range": "80〜65535 の範囲内でポート番号を入力してください",
|
"form_error_port_range": "80〜65535 の範囲内でポート番号を入力してください",
|
||||||
@@ -462,6 +470,7 @@
|
|||||||
"form_add_id": "識別子を追加する",
|
"form_add_id": "識別子を追加する",
|
||||||
"form_client_name": "クライアント名を入力してください",
|
"form_client_name": "クライアント名を入力してください",
|
||||||
"name": "名前",
|
"name": "名前",
|
||||||
|
"client_name": "クライアント {{id}}",
|
||||||
"client_global_settings": "グローバル設定を使用する",
|
"client_global_settings": "グローバル設定を使用する",
|
||||||
"client_deleted": "クライアント \"{{key}}\" の削除に成功しました",
|
"client_deleted": "クライアント \"{{key}}\" の削除に成功しました",
|
||||||
"client_added": "クライアント \"{{key}}\" の追加に成功しました",
|
"client_added": "クライアント \"{{key}}\" の追加に成功しました",
|
||||||
@@ -592,7 +601,7 @@
|
|||||||
"disable_ipv6": "IPv6アドレスの解決を無効にする",
|
"disable_ipv6": "IPv6アドレスの解決を無効にする",
|
||||||
"disable_ipv6_desc": "IPv6アドレス(タイプAAAA)に対するDNSクエリをすべて破棄し、HTTPS応答から IPv6 hint を削除します。",
|
"disable_ipv6_desc": "IPv6アドレス(タイプAAAA)に対するDNSクエリをすべて破棄し、HTTPS応答から IPv6 hint を削除します。",
|
||||||
"fastest_addr": "最速のIPアドレス",
|
"fastest_addr": "最速のIPアドレス",
|
||||||
"fastest_addr_desc": "すべてのDNSサーバーに処理要求し、全応答の中で最速のIPアドレスを返します。これにより、AdGuard HomeがすべてのDNSサーバーからの応答を待つ必要があるため、DNSクエリが遅くなりますが、全体的な接続性は向上します。",
|
"fastest_addr_desc": "<b>すべての</b>DNSサーバーからの応答を待ち、各サーバーのTCP接続速度を測定し、最も接続速度の速いサーバーのIPアドレスを返します。<br/>※このモードでは、1つまたは複数のアップストリームサーバーが応答しない場合、DNSクエリが大幅に遅くなることがあります。アップストリームサーバーが安定していることを確認し、アップストリームタイムアウトは小さくしておいてください。",
|
||||||
"autofix_warning_text": "「修正」をクリックすると、AdGuardHomeはAdGuardHome DNSサーバを使用するようにシステムを構成します。",
|
"autofix_warning_text": "「修正」をクリックすると、AdGuardHomeはAdGuardHome DNSサーバを使用するようにシステムを構成します。",
|
||||||
"autofix_warning_list": "次のタスクを実行します:<0>システムDNSStubListenerを非アクティブ化します</0> <0>DNSサーバのアドレスを127.0.0.1に設定します</0> <0>/etc/resolv.confのシンボリックリンクの対象を/run/systemd/resolve/resolv.confに置換します</0> <0>DNSStubListenerを停止します(systemd-resolvedサービスをリロードします)</0>",
|
"autofix_warning_list": "次のタスクを実行します:<0>システムDNSStubListenerを非アクティブ化します</0> <0>DNSサーバのアドレスを127.0.0.1に設定します</0> <0>/etc/resolv.confのシンボリックリンクの対象を/run/systemd/resolve/resolv.confに置換します</0> <0>DNSStubListenerを停止します(systemd-resolvedサービスをリロードします)</0>",
|
||||||
"autofix_warning_result": "その結果、システムからのすべてのDNSリクエストは、デフォルトでAdGuard Homeによって処理されます。",
|
"autofix_warning_result": "その結果、システムからのすべてのDNSリクエストは、デフォルトでAdGuard Homeによって処理されます。",
|
||||||
@@ -672,7 +681,7 @@
|
|||||||
"use_saved_key": "以前に保存したキーを使用する",
|
"use_saved_key": "以前に保存したキーを使用する",
|
||||||
"parental_control": "ペアレンタルコントロール",
|
"parental_control": "ペアレンタルコントロール",
|
||||||
"safe_browsing": "セーフブラウジング",
|
"safe_browsing": "セーフブラウジング",
|
||||||
"served_from_cache": "{{value}} <i>(キャッシュから応答)</i>",
|
"served_from_cache_label": "キャッシュからの配信:",
|
||||||
"form_error_password_length": "パスワードの長さは{{min}}〜{{max}}文字にしてください。",
|
"form_error_password_length": "パスワードの長さは{{min}}〜{{max}}文字にしてください。",
|
||||||
"anonymizer_notification": "【<0>注意</0>】IPの匿名化が有効になっています。 <1>一般設定</1>で無効にできます。",
|
"anonymizer_notification": "【<0>注意</0>】IPの匿名化が有効になっています。 <1>一般設定</1>で無効にできます。",
|
||||||
"confirm_dns_cache_clear": "DNS キャッシュをクリアしてもよろしいですか?",
|
"confirm_dns_cache_clear": "DNS キャッシュをクリアしてもよろしいですか?",
|
||||||
|
|||||||
@@ -6,21 +6,21 @@
|
|||||||
"upstream_parallel": "쿼리 처리 속도를 높이려면 모든 업스트림 서버에서 동시에 병렬 쿼리를 사용해주세요.",
|
"upstream_parallel": "쿼리 처리 속도를 높이려면 모든 업스트림 서버에서 동시에 병렬 쿼리를 사용해주세요.",
|
||||||
"parallel_requests": "병렬 처리 요청",
|
"parallel_requests": "병렬 처리 요청",
|
||||||
"load_balancing": "로드 밸런싱",
|
"load_balancing": "로드 밸런싱",
|
||||||
"load_balancing_desc": "한 번에 하나의 서버씩 질의합니다. AdGuard Home은 가중 랜덤 알고리즘를 사용해서 가장 빠른 서버가 자주 사용되도록 서버를 선택합니다.",
|
"load_balancing_desc": "한 번에 하나의 업스트림 서버를 쿼리합니다.<br/>AdGuard Home은 가중 무작위 알고리즘을 사용하여 조회 실패 횟수가 가장 적고 평균 조회 시간이 가장 짧은 서버를 선택합니다.",
|
||||||
"bootstrap_dns": "부트스트랩 DNS 서버",
|
"bootstrap_dns": "부트스트랩 DNS 서버",
|
||||||
"bootstrap_dns_desc": "업스트림으로 지정한 DoH/DoT 리졸버의 IP 주소를 확인하는 데 사용되는 DNS 서버의 IP 주소입니다. 주석은 허용되지 않습니다.",
|
"bootstrap_dns_desc": "업스트림으로 지정한 DoH/DoT 리졸버의 IP 주소를 확인하는 데 사용되는 DNS 서버의 IP 주소입니다. 주석은 허용되지 않습니다.",
|
||||||
"fallback_dns_title": "폴백 DNS 서버",
|
"fallback_dns_title": "폴백 DNS 서버",
|
||||||
"fallback_dns_desc": "업스트림 DNS 서버가 응답하지 않을 때 사용되는 폴백 DNS 서버 목록입니다. 구문은 위의 기본 업스트림 필드와 동일합니다.",
|
"fallback_dns_desc": "업스트림 DNS 서버가 응답하지 않을 때 사용되는 폴백 DNS 서버 목록입니다. 구문은 위의 기본 업스트림 필드와 동일합니다.",
|
||||||
"fallback_dns_placeholder": "한 줄에 하나의 폴백 DNS 서버를 입력하세요.",
|
"fallback_dns_placeholder": "한 줄에 하나의 폴백 DNS 서버를 입력하세요.",
|
||||||
"local_ptr_title": "프라이빗 역방향 DNS 서버",
|
"local_ptr_title": "프라이빗 역방향 DNS 서버",
|
||||||
"local_ptr_desc": "AdGuard Home이 로컬 PTR 쿼리에 사용하는 DNS 서버입니다. 이러한 서버는 역방향 DNS를 사용하여 개인 IP 주소(예: '192.168.12.34')가 있는 클라이언트의 호스트 이름을 확인하는 데 사용됩니다. 설정되지 않은 경우, AdGuard Home은 AdGuard Home의 주소를 제외하고 운영 체제의 기본 DNS 리졸버의 주소를 사용합니다.",
|
"local_ptr_desc": "AdGuard Home에서 비공개 PTR, SOA 및 NS 요청에 사용하는 DNS 서버입니다. 요청이 비공개 IP 범위 내의 서브넷(예: \"192.168.12.34\")을 포함하는 ARPA 도메인을 요청하고 비공개 IP 주소를 가진 클라이언트로부터 오는 경우 비공개로 간주됩니다. 설정하지 않으면 AdGuard Home IP 주소를 제외한 OS의 기본 DNS 리졸버가 사용됩니다.",
|
||||||
"local_ptr_default_resolver": "기본적으로 AdGuard Home에서는 {{ip}} 역방향 DNS 서버를 이용합니다.",
|
"local_ptr_default_resolver": "기본적으로 AdGuard Home에서는 {{ip}} 역방향 DNS 서버를 이용합니다.",
|
||||||
"local_ptr_no_default_resolver": "AdGuard Home에서 이 시스템에 적합한 사설 역방향 프라이빗 DNS 서버를 결정할 수 없습니다.",
|
"local_ptr_no_default_resolver": "AdGuard Home에서 이 시스템에 적합한 사설 역방향 프라이빗 DNS 서버를 결정할 수 없습니다.",
|
||||||
"local_ptr_placeholder": "한 줄에 하나씩 IP 주소를 입력하세요.",
|
"local_ptr_placeholder": "한 줄에 하나씩 IP 주소를 입력하세요.",
|
||||||
"resolve_clients_title": "클라이언트 IP 주소에 대한 호스트명 확인 활성화",
|
"resolve_clients_title": "클라이언트 IP 주소에 대한 호스트명 확인 활성화",
|
||||||
"resolve_clients_desc": "해당 서버에 대한 PTR 쿼리를 통해 클라이언트의 도메인 이름을 정의합니다. (로컬 클라이언트의 경우 프라이빗 DNS 서버, 공용 IP 주소가 있는 클라이언트의 경우 업스트림 서버).",
|
"resolve_clients_desc": "해당 서버에 대한 PTR 쿼리를 통해 클라이언트의 도메인 이름을 정의합니다. (로컬 클라이언트의 경우 프라이빗 DNS 서버, 공용 IP 주소가 있는 클라이언트의 경우 업스트림 서버).",
|
||||||
"use_private_ptr_resolvers_title": "프라이빗 역방향 DNS 리졸버 사용",
|
"use_private_ptr_resolvers_title": "프라이빗 역방향 DNS 리졸버 사용",
|
||||||
"use_private_ptr_resolvers_desc": "업스트림 서버를 사용해 로컬로 제공되는 주소의 역방향 DNS를 조회합니다. 끄는 경우, AdGuard Home은 DHCP, /etc/hosts 등에서 알려진 클라이언트를 제외한 모든 PTR 요청에 NXDOMAIN으로 응답합니다.",
|
"use_private_ptr_resolvers_desc": "사설 업스트림 서버, DHCP, / etc/hosts 등을 통해 사설 IP 주소가 포함된 ARPA 도메인에 대한 PTR, SOA 및 NS 요청을 처리합니다. 비활성화하면 AdGuard Home은 NXDOMAIN을 사용하여 이러한 모든 요청에 응답합니다.",
|
||||||
"check_dhcp_servers": "DHCP 서버 체크",
|
"check_dhcp_servers": "DHCP 서버 체크",
|
||||||
"save_config": "구성 저장",
|
"save_config": "구성 저장",
|
||||||
"enabled_dhcp": "DHCP 서버 활성화됨",
|
"enabled_dhcp": "DHCP 서버 활성화됨",
|
||||||
@@ -108,7 +108,7 @@
|
|||||||
"off": "OFF",
|
"off": "OFF",
|
||||||
"copyright": "Copyright",
|
"copyright": "Copyright",
|
||||||
"homepage": "홈페이지",
|
"homepage": "홈페이지",
|
||||||
"report_an_issue": "문제를 보고합니다",
|
"report_an_issue": "문제 신고",
|
||||||
"privacy_policy": "개인정보취급방침",
|
"privacy_policy": "개인정보취급방침",
|
||||||
"enable_protection": "보호 활성화",
|
"enable_protection": "보호 활성화",
|
||||||
"enabled_protection": "보호 활성화됨",
|
"enabled_protection": "보호 활성화됨",
|
||||||
@@ -154,7 +154,7 @@
|
|||||||
"use_adguard_parental": "AdGuard 자녀 보호 웹 서비스 사용",
|
"use_adguard_parental": "AdGuard 자녀 보호 웹 서비스 사용",
|
||||||
"use_adguard_parental_hint": "AdGuard Home은 도메인에 성인 자료가 포함되어 있는지 확인합니다. 브라우징 보안 웹 서비스와 동일한 개인정보 보호 API를 사용함.",
|
"use_adguard_parental_hint": "AdGuard Home은 도메인에 성인 자료가 포함되어 있는지 확인합니다. 브라우징 보안 웹 서비스와 동일한 개인정보 보호 API를 사용함.",
|
||||||
"enforce_safe_search": "세이프서치 사용",
|
"enforce_safe_search": "세이프서치 사용",
|
||||||
"enforce_save_search_hint": "AdGuard Home은 Google, YouTube, Bing, DuckDuckGo, Yandex, Pixabay와 같은 검색 엔진에서 세이프서치를 시행합니다.",
|
"enforce_save_search_hint": "AdGuard Home은 Google, YouTube, Bing, DuckDuckGo, Ecosia, Yandex, Pixabay와 같은 검색 엔진에서 세이프서치를 시행합니다.",
|
||||||
"no_servers_specified": "지정된 서버 없음",
|
"no_servers_specified": "지정된 서버 없음",
|
||||||
"general_settings": "일반 설정",
|
"general_settings": "일반 설정",
|
||||||
"dns_settings": "DNS 설정",
|
"dns_settings": "DNS 설정",
|
||||||
@@ -236,6 +236,7 @@
|
|||||||
"updated_upstream_dns_toast": "업스트림 서버가 성공적으로 저장되었습니다",
|
"updated_upstream_dns_toast": "업스트림 서버가 성공적으로 저장되었습니다",
|
||||||
"dns_test_ok_toast": "지정된 DNS 서버가 올바르게 작동하고 있습니다.",
|
"dns_test_ok_toast": "지정된 DNS 서버가 올바르게 작동하고 있습니다.",
|
||||||
"dns_test_not_ok_toast": "서버 '{{key}}': 사용할 수 없습니다, 제대로 작성했는지 확인하세요",
|
"dns_test_not_ok_toast": "서버 '{{key}}': 사용할 수 없습니다, 제대로 작성했는지 확인하세요",
|
||||||
|
"dns_test_parsing_error_toast": "섹션 {{section}}: 줄 {{line}}: 사용할 수 없으며, 올바르게 작성했는지 확인하세요.",
|
||||||
"dns_test_warning_toast": "업스트림 '{{key}}'이(가) 테스트 요청에 응답하지 않으며 제대로 작동하지 않을 수 있습니다",
|
"dns_test_warning_toast": "업스트림 '{{key}}'이(가) 테스트 요청에 응답하지 않으며 제대로 작동하지 않을 수 있습니다",
|
||||||
"unblock": "차단 해제",
|
"unblock": "차단 해제",
|
||||||
"block": "차단",
|
"block": "차단",
|
||||||
@@ -243,6 +244,7 @@
|
|||||||
"allow_this_client": "클라이언트 허용",
|
"allow_this_client": "클라이언트 허용",
|
||||||
"block_for_this_client_only": "이 클라이언트에 대해서만 차단",
|
"block_for_this_client_only": "이 클라이언트에 대해서만 차단",
|
||||||
"unblock_for_this_client_only": "이 클라이언트에 대해서만 차단 해제",
|
"unblock_for_this_client_only": "이 클라이언트에 대해서만 차단 해제",
|
||||||
|
"add_persistent_client": "저장된 클라이언트에 추가",
|
||||||
"time_table_header": "시간",
|
"time_table_header": "시간",
|
||||||
"date": "날짜",
|
"date": "날짜",
|
||||||
"domain_name_table_header": "도메인명",
|
"domain_name_table_header": "도메인명",
|
||||||
@@ -292,6 +294,9 @@
|
|||||||
"blocked_response_ttl": "차단된 TTL 응답",
|
"blocked_response_ttl": "차단된 TTL 응답",
|
||||||
"blocked_response_ttl_desc": "클라이언트가 필터링된 응답을 캐시해야 하는 시간(초)을 지정합니다.",
|
"blocked_response_ttl_desc": "클라이언트가 필터링된 응답을 캐시해야 하는 시간(초)을 지정합니다.",
|
||||||
"form_enter_blocked_response_ttl": "차단된 응답 TTL(초)을 입력하세요.",
|
"form_enter_blocked_response_ttl": "차단된 응답 TTL(초)을 입력하세요.",
|
||||||
|
"upstream_timeout": "업스트림 제한 시간",
|
||||||
|
"upstream_timeout_desc": "업스트림 서버의 응답을 기다리는 시간(초)을 지정합니다.",
|
||||||
|
"form_enter_upstream_timeout": "업스트림 서버 응답 제한 시간을 초 단위로 입력하세요.",
|
||||||
"dnscrypt": "DNSCrypt",
|
"dnscrypt": "DNSCrypt",
|
||||||
"dns_over_https": "DNS-over-HTTPS",
|
"dns_over_https": "DNS-over-HTTPS",
|
||||||
"dns_over_tls": "DNS-over-TLS",
|
"dns_over_tls": "DNS-over-TLS",
|
||||||
@@ -423,6 +428,9 @@
|
|||||||
"encryption_hostnames": "호스트 이름",
|
"encryption_hostnames": "호스트 이름",
|
||||||
"encryption_reset": "암호화 설정을 재설정하시겠습니까?",
|
"encryption_reset": "암호화 설정을 재설정하시겠습니까?",
|
||||||
"encryption_warning": "주의",
|
"encryption_warning": "주의",
|
||||||
|
"encryption_plain_dns_enable": "평문 DNS 활성화",
|
||||||
|
"encryption_plain_dns_desc": "평문 DNS가 기본으로 설정되어 있습니다. 비활성화해서 모든 기기가 암호화된 DNS를 사용하도록 할 수 있습니다. 그러려면 암호화된 DNS 프로토콜을 하나 이상 활성화해야 합니다.",
|
||||||
|
"encryption_plain_dns_error": "평문 DNS를 비활성화하려면, 암호화된 DNS 프로토콜을 하나 이상 활성화하세요",
|
||||||
"topline_expiring_certificate": "SSL 인증서가 곧 만료됩니다. 업데이트<0> 암호화 설정</0>.",
|
"topline_expiring_certificate": "SSL 인증서가 곧 만료됩니다. 업데이트<0> 암호화 설정</0>.",
|
||||||
"topline_expired_certificate": "SSL 인증서가 만료되었습니다. 업데이트<0> 암호화 설정</0>.",
|
"topline_expired_certificate": "SSL 인증서가 만료되었습니다. 업데이트<0> 암호화 설정</0>.",
|
||||||
"form_error_port_range": "80-65535 범위의 포트 번호를 입력하세요",
|
"form_error_port_range": "80-65535 범위의 포트 번호를 입력하세요",
|
||||||
@@ -462,6 +470,7 @@
|
|||||||
"form_add_id": "식별자 추가",
|
"form_add_id": "식별자 추가",
|
||||||
"form_client_name": "클라이언트 이름 입력",
|
"form_client_name": "클라이언트 이름 입력",
|
||||||
"name": "이름",
|
"name": "이름",
|
||||||
|
"client_name": "클라이언트 {{id}}",
|
||||||
"client_global_settings": "글로벌 설정 사용",
|
"client_global_settings": "글로벌 설정 사용",
|
||||||
"client_deleted": "클라이언트 '{{key}}'이(가) 정상적으로 삭제되었습니다",
|
"client_deleted": "클라이언트 '{{key}}'이(가) 정상적으로 삭제되었습니다",
|
||||||
"client_added": "클라이언트 '{{key}}'이(가) 정상적으로 추가되었습니다",
|
"client_added": "클라이언트 '{{key}}'이(가) 정상적으로 추가되었습니다",
|
||||||
@@ -592,7 +601,7 @@
|
|||||||
"disable_ipv6": "IPv6 주소 확인 비활성화",
|
"disable_ipv6": "IPv6 주소 확인 비활성화",
|
||||||
"disable_ipv6_desc": "IPv6 주소(AAAA 유형)에 대한 모든 DNS 쿼리를 무시하고 HTTPS 유형 응답에서 IPv6 데이터를 제거합니다.",
|
"disable_ipv6_desc": "IPv6 주소(AAAA 유형)에 대한 모든 DNS 쿼리를 무시하고 HTTPS 유형 응답에서 IPv6 데이터를 제거합니다.",
|
||||||
"fastest_addr": "가장 빠른 IP 주소",
|
"fastest_addr": "가장 빠른 IP 주소",
|
||||||
"fastest_addr_desc": "모든 DNS 서버에 쿼리를 수행한 다음 반응이 가장 빠른 IP주소를 반송합니다. AdGuard Home이 모든 DNS 서버의 응답을 기다려야 하기 때문에 DNS 쿼리 속도가 느려지지만 전반적인 연결이 향상됩니다.",
|
"fastest_addr_desc": "<b>모든</b> DNS 서버의 응답을 기다렸다가 각 서버의 TCP 연결 속도를 측정하여 연결 속도가 가장 빠른 서버의 IP 주소를 반환합니다.<br/>이 모드는 하나 이상의 업스트림 서버가 응답하지 않는 경우, DNS 쿼리 속도가 상당히 느려질 수 있습니다. 업스트림 서버가 안정적이고 업스트림 타임아웃이 짧은지 확인하세요.",
|
||||||
"autofix_warning_text": "'수정'을 클릭하면 AdGuard Home이 AdGuard Home DNS 서버를 사용하도록 시스템을 설정합니다.",
|
"autofix_warning_text": "'수정'을 클릭하면 AdGuard Home이 AdGuard Home DNS 서버를 사용하도록 시스템을 설정합니다.",
|
||||||
"autofix_warning_list": "다음 작업을 진행합니다: <0>DNSStubListener 시스템 비활성화</0> <0>DNS 서버 주소를 127.0.0.1로 설정</0> <0>/etc/resolv.conf의 심볼릭 링크 타겟을 /run/systemd/resolve/resolv.conf로 변경</0> <0>DNSStubListener 중지 (systemd-resolved 서비스 새로고침)</0>",
|
"autofix_warning_list": "다음 작업을 진행합니다: <0>DNSStubListener 시스템 비활성화</0> <0>DNS 서버 주소를 127.0.0.1로 설정</0> <0>/etc/resolv.conf의 심볼릭 링크 타겟을 /run/systemd/resolve/resolv.conf로 변경</0> <0>DNSStubListener 중지 (systemd-resolved 서비스 새로고침)</0>",
|
||||||
"autofix_warning_result": "결과적으로 시스템의 모든 DNS 요청은 기본적으로 AdGuard Home에 의해 처리됩니다.",
|
"autofix_warning_result": "결과적으로 시스템의 모든 DNS 요청은 기본적으로 AdGuard Home에 의해 처리됩니다.",
|
||||||
@@ -672,7 +681,7 @@
|
|||||||
"use_saved_key": "이전에 저장했던 키 사용하기",
|
"use_saved_key": "이전에 저장했던 키 사용하기",
|
||||||
"parental_control": "자녀 보호",
|
"parental_control": "자녀 보호",
|
||||||
"safe_browsing": "세이프 브라우징",
|
"safe_browsing": "세이프 브라우징",
|
||||||
"served_from_cache": "{{value}} <i>(캐시에서 제공)</i>",
|
"served_from_cache_label": "캐시에서 가져옴",
|
||||||
"form_error_password_length": "비밀번호는 {{min}}~{{max}}자 길이여야 합니다.",
|
"form_error_password_length": "비밀번호는 {{min}}~{{max}}자 길이여야 합니다.",
|
||||||
"anonymizer_notification": "<0>참고:</0> IP 익명화가 활성화되었습니다. <1>일반 설정</1>에서 비활성화할 수 있습니다.",
|
"anonymizer_notification": "<0>참고:</0> IP 익명화가 활성화되었습니다. <1>일반 설정</1>에서 비활성화할 수 있습니다.",
|
||||||
"confirm_dns_cache_clear": "정말로 DNS 캐시를 지우시겠습니까?",
|
"confirm_dns_cache_clear": "정말로 DNS 캐시를 지우시겠습니까?",
|
||||||
|
|||||||
@@ -6,21 +6,21 @@
|
|||||||
"upstream_parallel": "Parallelle verzoeken gebruiken om te versnellen door gelijktijdig verzoeken te sturen naar alle upstream servers.",
|
"upstream_parallel": "Parallelle verzoeken gebruiken om te versnellen door gelijktijdig verzoeken te sturen naar alle upstream servers.",
|
||||||
"parallel_requests": "Parallelle verzoeken",
|
"parallel_requests": "Parallelle verzoeken",
|
||||||
"load_balancing": "Volume balanceren",
|
"load_balancing": "Volume balanceren",
|
||||||
"load_balancing_desc": "Eén server per keer bevragen. AdGuard Home gebruikt hiervoor een gewogen willekeurig algoritme om de server te kiezen zodat de snelste server meer zal gebruikt worden.",
|
"load_balancing_desc": "Voer zoekopdrachten uit op één upstream-server tegelijk.<br/>AdGuard Home gebruikt een gewogen willekeurig algoritme om servers te selecteren met het laagste aantal mislukte zoekopdrachten en de laagste gemiddelde opzoektijd.",
|
||||||
"bootstrap_dns": "Bootstrap DNS-servers",
|
"bootstrap_dns": "Bootstrap DNS-servers",
|
||||||
"bootstrap_dns_desc": "IP-adressen van DNS-servers die worden gebruikt om IP-adressen om te zetten van de DoH/DoT-resolvers die je opgeeft als upstreams. Opmerkingen zijn niet toegestaan.",
|
"bootstrap_dns_desc": "IP-adressen van DNS-servers die worden gebruikt om IP-adressen om te zetten van de DoH/DoT-resolvers die je opgeeft als upstreams. Opmerkingen zijn niet toegestaan.",
|
||||||
"fallback_dns_title": "Back-up DNS-servers",
|
"fallback_dns_title": "Back-up DNS-servers",
|
||||||
"fallback_dns_desc": "Lijst met DNS-back-up-noodservers die worden gebruikt wanneer upstream DNS-servers niet reageren. De syntaxis is hetzelfde als in het veld hoofdstroomopwaarts hierboven.",
|
"fallback_dns_desc": "Lijst met DNS-back-up-noodservers die worden gebruikt wanneer upstream DNS-servers niet reageren. De syntaxis is hetzelfde als in het veld hoofdstroomopwaarts hierboven.",
|
||||||
"fallback_dns_placeholder": "Voer één DNS-back-upserver per regel in",
|
"fallback_dns_placeholder": "Voer één DNS-back-upserver per regel in",
|
||||||
"local_ptr_title": "Private omgekeerde DNS-servers",
|
"local_ptr_title": "Private omgekeerde DNS-servers",
|
||||||
"local_ptr_desc": "De DNS-servers die AdGuard Home gebruikt voor lokale PTR-zoekopdrachten. Deze servers worden gebruikt om PTR-verzoeken voor adressen in privé-IP-bereiken op te lossen, bijvoorbeeld \"192.168.12.34\", met behulp van reverse DNS. Indien niet ingesteld, gebruikt AdGuard Home de adressen van de standaard DNS-resolvers van uw besturingssysteem, behalve de adressen van AdGuard Home zelf.",
|
"local_ptr_desc": "DNS-servers die door AdGuard Home worden gebruikt voor privé PTR-, SOA- en NS-verzoeken. Een verzoek wordt als privé beschouwd als het vraagt om een ARPA-domein dat een subnet binnen privé-IP-bereiken bevat (zoals \"192.168.12.34\") en afkomstig is van een client met een privé-IP-adres. Indien niet ingesteld, zullen de standaard DNS-resolvers van je besturingssysteem worden gebruikt, behalve de AdGuard Home IP-adressen.",
|
||||||
"local_ptr_default_resolver": "Standaard gebruikt AdGuard Home de volgende omgekeerde DNS-resolvers: {{ip}}.",
|
"local_ptr_default_resolver": "Standaard gebruikt AdGuard Home de volgende omgekeerde DNS-resolvers: {{ip}}.",
|
||||||
"local_ptr_no_default_resolver": "AdGuard Home kon voor dit systeem geen geschikte private omgekeerde DNS-resolvers bepalen.",
|
"local_ptr_no_default_resolver": "AdGuard Home kon voor dit systeem geen geschikte private omgekeerde DNS-resolvers bepalen.",
|
||||||
"local_ptr_placeholder": "Voer één IP-adres per regel in",
|
"local_ptr_placeholder": "Voer één IP-adres per regel in",
|
||||||
"resolve_clients_title": "Omzetten van hostnamen van clients inschakelen",
|
"resolve_clients_title": "Omzetten van hostnamen van clients inschakelen",
|
||||||
"resolve_clients_desc": "Indien ingeschakeld, zal AdGuard Home proberen om IP-adressen van apparaten te converteren in hun hostnamen door PTR-verzoeken te sturen naar overeenkomstige resolvers (privé-DNS-servers voor lokale apparaten, upstream-server voor apparaten met een openbaar IP-adres).",
|
"resolve_clients_desc": "Indien ingeschakeld, zal AdGuard Home proberen om IP-adressen van apparaten te converteren in hun hostnamen door PTR-verzoeken te sturen naar overeenkomstige resolvers (privé-DNS-servers voor lokale apparaten, upstream-server voor apparaten met een openbaar IP-adres).",
|
||||||
"use_private_ptr_resolvers_title": "Private omgekeerde DNS-resolvers gebruiken",
|
"use_private_ptr_resolvers_title": "Private omgekeerde DNS-resolvers gebruiken",
|
||||||
"use_private_ptr_resolvers_desc": "Omgekeerde DNS opzoekingen uitvoeren voor locale adressen door deze upstream servers te gebruiken. Indien uitgeschakeld, reageert AdGuard Home met NXDOMAIN op al dergelijke PTR-verzoeken, uitgezonderd voor apparaten gekend van DHCP, /etc/hosts, enz.",
|
"use_private_ptr_resolvers_desc": "PTR-, SOA- en NS-verzoeken voor ARPA-domeinen die privé-IP-adressen bevatten oplossen via privé-upstreamservers, DHCP, /etc/hosts, enz. Indien uitgeschakeld, zal AdGuard Home op al dergelijke verzoeken reageren met NXDOMAIN.",
|
||||||
"check_dhcp_servers": "Zoek achter DHCP servers",
|
"check_dhcp_servers": "Zoek achter DHCP servers",
|
||||||
"save_config": "Configuratie opslaan",
|
"save_config": "Configuratie opslaan",
|
||||||
"enabled_dhcp": "DHCP server inschakelen",
|
"enabled_dhcp": "DHCP server inschakelen",
|
||||||
@@ -154,7 +154,7 @@
|
|||||||
"use_adguard_parental": "Gebruik AdGuard Ouderlijk toezicht web service",
|
"use_adguard_parental": "Gebruik AdGuard Ouderlijk toezicht web service",
|
||||||
"use_adguard_parental_hint": "AdGuard Home controleert of het domein 18+ content bevat. Dit gebeurt dmv dezelfde privacy vriendelijke API als de Browsing Security web service.",
|
"use_adguard_parental_hint": "AdGuard Home controleert of het domein 18+ content bevat. Dit gebeurt dmv dezelfde privacy vriendelijke API als de Browsing Security web service.",
|
||||||
"enforce_safe_search": "Veilig zoeken gebruiken",
|
"enforce_safe_search": "Veilig zoeken gebruiken",
|
||||||
"enforce_save_search_hint": "AdGuard Home kan veilig zoeken forceren voor de volgende zoekmachines: Google, Youtube, Bing, en DuckDuckGo, Yandex, Pixabay.",
|
"enforce_save_search_hint": "AdGuard Home dwingt veilig zoeken af in de volgende zoekmachines: Google, YouTube, Bing, DuckDuckGo, Ecosia, Yandex, Pixabay.",
|
||||||
"no_servers_specified": "Geen servers gespecificeerd",
|
"no_servers_specified": "Geen servers gespecificeerd",
|
||||||
"general_settings": "Algemene instellingen",
|
"general_settings": "Algemene instellingen",
|
||||||
"dns_settings": "DNS instellingen",
|
"dns_settings": "DNS instellingen",
|
||||||
@@ -166,7 +166,7 @@
|
|||||||
"encryption_settings": "Encryptie instellingen",
|
"encryption_settings": "Encryptie instellingen",
|
||||||
"dhcp_settings": "DHCP instellingen",
|
"dhcp_settings": "DHCP instellingen",
|
||||||
"upstream_dns": "Upstream DNS-servers",
|
"upstream_dns": "Upstream DNS-servers",
|
||||||
"upstream_dns_help": "Een server-adres per regel invoeren. <a>Meer weten</a> over het configureren van upstream DNS-servers.",
|
"upstream_dns_help": "Een server-adres per regel invoeren. <a>Meer informatie</a> over het configureren van upstream DNS-servers.",
|
||||||
"upstream_dns_configured_in_file": "Geconfigureerd in {{path}}",
|
"upstream_dns_configured_in_file": "Geconfigureerd in {{path}}",
|
||||||
"test_upstream_btn": "Test upstream",
|
"test_upstream_btn": "Test upstream",
|
||||||
"upstreams": "Upstreams",
|
"upstreams": "Upstreams",
|
||||||
@@ -236,6 +236,7 @@
|
|||||||
"updated_upstream_dns_toast": "Upstream-servers succesvol opgeslagen",
|
"updated_upstream_dns_toast": "Upstream-servers succesvol opgeslagen",
|
||||||
"dns_test_ok_toast": "Opgegeven DNS-servers werken correct",
|
"dns_test_ok_toast": "Opgegeven DNS-servers werken correct",
|
||||||
"dns_test_not_ok_toast": "Server \"{{key}}\": kon niet worden gebruikt, controleer of je het correct hebt geschreven",
|
"dns_test_not_ok_toast": "Server \"{{key}}\": kon niet worden gebruikt, controleer of je het correct hebt geschreven",
|
||||||
|
"dns_test_parsing_error_toast": "Sectie {{section}}: regel {{line}}: kan niet worden gebruikt. Controleer of je het correct hebt geschreven",
|
||||||
"dns_test_warning_toast": "Upstream \"{{key}}\" reageert niet op testverzoeken en werkt mogelijk niet goed",
|
"dns_test_warning_toast": "Upstream \"{{key}}\" reageert niet op testverzoeken en werkt mogelijk niet goed",
|
||||||
"unblock": "Deblokkeren",
|
"unblock": "Deblokkeren",
|
||||||
"block": "Blokkeren",
|
"block": "Blokkeren",
|
||||||
@@ -243,6 +244,7 @@
|
|||||||
"allow_this_client": "Toepassing/systeem toelaten",
|
"allow_this_client": "Toepassing/systeem toelaten",
|
||||||
"block_for_this_client_only": "Alleen voor deze cliënt blokkeren",
|
"block_for_this_client_only": "Alleen voor deze cliënt blokkeren",
|
||||||
"unblock_for_this_client_only": "Alleen voor deze cliënt deblokkeren",
|
"unblock_for_this_client_only": "Alleen voor deze cliënt deblokkeren",
|
||||||
|
"add_persistent_client": "Toevoegen als permanente client",
|
||||||
"time_table_header": "Tijd",
|
"time_table_header": "Tijd",
|
||||||
"date": "Datum",
|
"date": "Datum",
|
||||||
"domain_name_table_header": "Domein naam",
|
"domain_name_table_header": "Domein naam",
|
||||||
@@ -252,8 +254,8 @@
|
|||||||
"response_code": "Reactiecode",
|
"response_code": "Reactiecode",
|
||||||
"client_table_header": "Gebruiker",
|
"client_table_header": "Gebruiker",
|
||||||
"empty_response_status": "Leeg",
|
"empty_response_status": "Leeg",
|
||||||
"show_all_filter_type": "Toon alles",
|
"show_all_filter_type": "Alles weergeven",
|
||||||
"show_filtered_type": "Toon gefilterde",
|
"show_filtered_type": "Gefilterde weergeven",
|
||||||
"no_logs_found": "Geen logboeken gevonden",
|
"no_logs_found": "Geen logboeken gevonden",
|
||||||
"refresh_btn": "Verversen",
|
"refresh_btn": "Verversen",
|
||||||
"previous_btn": "Vorige",
|
"previous_btn": "Vorige",
|
||||||
@@ -292,6 +294,9 @@
|
|||||||
"blocked_response_ttl": "Geblokkeerde reactie TTL",
|
"blocked_response_ttl": "Geblokkeerde reactie TTL",
|
||||||
"blocked_response_ttl_desc": "Hiermee geef je op hoeveel seconden de clients een gefilterd antwoord in de cache moeten opslaan",
|
"blocked_response_ttl_desc": "Hiermee geef je op hoeveel seconden de clients een gefilterd antwoord in de cache moeten opslaan",
|
||||||
"form_enter_blocked_response_ttl": "Voer geblokkeerd antwoord TTL in (seconden)",
|
"form_enter_blocked_response_ttl": "Voer geblokkeerd antwoord TTL in (seconden)",
|
||||||
|
"upstream_timeout": "Upstream time-out",
|
||||||
|
"upstream_timeout_desc": "Geeft het aantal seconden aan dat moet worden gewacht op een reactie van de upstream-server",
|
||||||
|
"form_enter_upstream_timeout": "Voer de time-outduur van de upstream-server in seconden in",
|
||||||
"dnscrypt": "DNSCrypt",
|
"dnscrypt": "DNSCrypt",
|
||||||
"dns_over_https": "DNS-via-HTTPS",
|
"dns_over_https": "DNS-via-HTTPS",
|
||||||
"dns_over_tls": "DNS-via-TLS",
|
"dns_over_tls": "DNS-via-TLS",
|
||||||
@@ -322,10 +327,10 @@
|
|||||||
"rate_limit_whitelist_placeholder": "Voer één IP-adres per regel in",
|
"rate_limit_whitelist_placeholder": "Voer één IP-adres per regel in",
|
||||||
"blocking_ipv4_desc": "IP-adres dat moet worden teruggegeven voor een geblokkeerd A-verzoek",
|
"blocking_ipv4_desc": "IP-adres dat moet worden teruggegeven voor een geblokkeerd A-verzoek",
|
||||||
"blocking_ipv6_desc": "IP-adres dat moet worden teruggegeven voor een geblokkeerd A-verzoek",
|
"blocking_ipv6_desc": "IP-adres dat moet worden teruggegeven voor een geblokkeerd A-verzoek",
|
||||||
"blocking_mode_default": "Standaard: Reageer met een nul IP adres (0.0.0.0 for A; :: voor AAAA) wanneer geblokkeerd door een Adblock-type regel; reageer met het IP-adres dat is opgegeven in de regel wanneer geblokkeerd door een /etc/hosts type regel",
|
"blocking_mode_default": "Standaard: Reageer met een nul IP-adres (0.0.0.0 for A; :: voor AAAA) wanneer geblokkeerd door een Adblock-type regel; reageer met het IP-adres dat is opgegeven in de regel wanneer geblokkeerd door een /etc/hosts type regel",
|
||||||
"blocking_mode_refused": "REFUSED: Antwoorden met REFUSED code",
|
"blocking_mode_refused": "REFUSED: Antwoorden met REFUSED code",
|
||||||
"blocking_mode_nxdomain": "NXDOMAIN: Reageer met NXDOMAIN code",
|
"blocking_mode_nxdomain": "NXDOMAIN: Reageer met NXDOMAIN code",
|
||||||
"blocking_mode_null_ip": "Nul IP: Reageer met een nul IP address (0.0.0.0 voor A; :: voor AAAA)",
|
"blocking_mode_null_ip": "Nul IP: Reageer met een nul IP-adres (0.0.0.0 voor A; :: voor AAAA)",
|
||||||
"blocking_mode_custom_ip": "Aangepast IP: Reageer met een handmatige ingesteld IP adres",
|
"blocking_mode_custom_ip": "Aangepast IP: Reageer met een handmatige ingesteld IP adres",
|
||||||
"theme_auto": "Automatisch",
|
"theme_auto": "Automatisch",
|
||||||
"theme_light": "Licht",
|
"theme_light": "Licht",
|
||||||
@@ -423,6 +428,9 @@
|
|||||||
"encryption_hostnames": "Hostnamen",
|
"encryption_hostnames": "Hostnamen",
|
||||||
"encryption_reset": "Ben je zeker dat je de encryptie instellingen wil resetten?",
|
"encryption_reset": "Ben je zeker dat je de encryptie instellingen wil resetten?",
|
||||||
"encryption_warning": "Waarschuwing",
|
"encryption_warning": "Waarschuwing",
|
||||||
|
"encryption_plain_dns_enable": "Gewone DNS inschakelen",
|
||||||
|
"encryption_plain_dns_desc": "Gewone DNS is standaard ingeschakeld. Je kunt het uitschakelen om alle apparaten te dwingen versleutelde DNS te gebruiken. Om dit te doen, moet je ten minste één versleuteld DNS-protocol inschakelen",
|
||||||
|
"encryption_plain_dns_error": "Als je gewone DNS wilt uitschakelen, schakel je ten minste één versleuteld DNS-protocol in",
|
||||||
"topline_expiring_certificate": "Jouw SSL-certificaat vervalt binnenkort. Werk de <0>encryptie-instellingen</0> bij.",
|
"topline_expiring_certificate": "Jouw SSL-certificaat vervalt binnenkort. Werk de <0>encryptie-instellingen</0> bij.",
|
||||||
"topline_expired_certificate": "Jouw SSL-certificaat is vervallen. Werk de <0>encryptie-instellingen</0> bij.",
|
"topline_expired_certificate": "Jouw SSL-certificaat is vervallen. Werk de <0>encryptie-instellingen</0> bij.",
|
||||||
"form_error_port_range": "Poortnummer invoeren tussen 80 en 65535",
|
"form_error_port_range": "Poortnummer invoeren tussen 80 en 65535",
|
||||||
@@ -462,6 +470,7 @@
|
|||||||
"form_add_id": "ID toevoegen",
|
"form_add_id": "ID toevoegen",
|
||||||
"form_client_name": "Vul gebruikersnaam in",
|
"form_client_name": "Vul gebruikersnaam in",
|
||||||
"name": "Naam",
|
"name": "Naam",
|
||||||
|
"client_name": "Client {{id}}",
|
||||||
"client_global_settings": "Gebruik globale instelling",
|
"client_global_settings": "Gebruik globale instelling",
|
||||||
"client_deleted": "Gebruiker \"{{key}}\" met succes verwijderd",
|
"client_deleted": "Gebruiker \"{{key}}\" met succes verwijderd",
|
||||||
"client_added": "Gebruiker \"{{key}}\" met succes toegevoegd",
|
"client_added": "Gebruiker \"{{key}}\" met succes toegevoegd",
|
||||||
@@ -489,7 +498,7 @@
|
|||||||
"setup_dns_privacy_2": "<0>DNS-via-HTTPS:</0> Gebruik <1>{{address}}</1> string.",
|
"setup_dns_privacy_2": "<0>DNS-via-HTTPS:</0> Gebruik <1>{{address}}</1> string.",
|
||||||
"setup_dns_privacy_3": "<0>Hou er rekening mee dat het beveiligde DNS protocol alleen beschikbaar is voor Android 9. U moet dus extra software installeren voor andere besturingssystemen.</0><0>Hier is een lijst van te gebruiken software.</0>",
|
"setup_dns_privacy_3": "<0>Hou er rekening mee dat het beveiligde DNS protocol alleen beschikbaar is voor Android 9. U moet dus extra software installeren voor andere besturingssystemen.</0><0>Hier is een lijst van te gebruiken software.</0>",
|
||||||
"setup_dns_privacy_4": "Op een iOS 14 of macOS Big Sur apparaat kan je een speciaal '.mobileconfig'-bestand downloaden dat <highlight>DNS-via-HTTPS</highlight> of <highlight>DNS-via-TLS</highlight> servers aan de DNS-instellingen toevoegt.",
|
"setup_dns_privacy_4": "Op een iOS 14 of macOS Big Sur apparaat kan je een speciaal '.mobileconfig'-bestand downloaden dat <highlight>DNS-via-HTTPS</highlight> of <highlight>DNS-via-TLS</highlight> servers aan de DNS-instellingen toevoegt.",
|
||||||
"setup_dns_privacy_android_1": "Android 9 ondersteunt native DNS-via-TLS. Om het te configureren, ga naar Instellingen → Netwerk & internet → Geavanceerd → Privé DNS en voer daar je domeinnaam in.",
|
"setup_dns_privacy_android_1": "Android 9 ondersteunt native DNS-via-TLS. Om het te configureren, ga naar Instellingen → Netwerk & internet → Geavanceerd → Privé-DNS en voer daar je domeinnaam in.",
|
||||||
"setup_dns_privacy_android_2": "<0>AdGuard voor Android</0>ondersteunt<1>DNS-via-HTTPS </1>en<1>DNS-via-TLS</1>.",
|
"setup_dns_privacy_android_2": "<0>AdGuard voor Android</0>ondersteunt<1>DNS-via-HTTPS </1>en<1>DNS-via-TLS</1>.",
|
||||||
"setup_dns_privacy_android_3": "<0> Intra </0> voegt <1> DNS-via-HTTPS</1> ondersteuning toe aan Android.",
|
"setup_dns_privacy_android_3": "<0> Intra </0> voegt <1> DNS-via-HTTPS</1> ondersteuning toe aan Android.",
|
||||||
"setup_dns_privacy_ios_1": "<0>DNSCloak</0> ondersteunt <1> DNS-via-HTTPS </1>, maar om het te configureren op jouw eigen server moet er een <2> DNS-stempel </2> gegenereerd worden.",
|
"setup_dns_privacy_ios_1": "<0>DNSCloak</0> ondersteunt <1> DNS-via-HTTPS </1>, maar om het te configureren op jouw eigen server moet er een <2> DNS-stempel </2> gegenereerd worden.",
|
||||||
@@ -526,7 +535,7 @@
|
|||||||
"blocked_services_global": "Gebruik algemeen geblokkeerde services",
|
"blocked_services_global": "Gebruik algemeen geblokkeerde services",
|
||||||
"blocked_service": "Geblokkeerde service",
|
"blocked_service": "Geblokkeerde service",
|
||||||
"block_all": "Blokkeer alles",
|
"block_all": "Blokkeer alles",
|
||||||
"unblock_all": "Deblokkeer alles",
|
"unblock_all": "Alles deblokkeren",
|
||||||
"encryption_certificate_path": "Certificaat pad",
|
"encryption_certificate_path": "Certificaat pad",
|
||||||
"encryption_private_key_path": "Privé sleutel pad",
|
"encryption_private_key_path": "Privé sleutel pad",
|
||||||
"encryption_certificates_source_path": "Certificaten bestandspad instellen",
|
"encryption_certificates_source_path": "Certificaten bestandspad instellen",
|
||||||
@@ -592,7 +601,7 @@
|
|||||||
"disable_ipv6": "Oplossen IPv6-adressen uitschakelen",
|
"disable_ipv6": "Oplossen IPv6-adressen uitschakelen",
|
||||||
"disable_ipv6_desc": "Alle DNS-query's voor IPv6-adressen (type AAAA) verwijderen en IPv6-hints uit HTTPS-antwoorden verwijderen.",
|
"disable_ipv6_desc": "Alle DNS-query's voor IPv6-adressen (type AAAA) verwijderen en IPv6-hints uit HTTPS-antwoorden verwijderen.",
|
||||||
"fastest_addr": "Snelste IP adres",
|
"fastest_addr": "Snelste IP adres",
|
||||||
"fastest_addr_desc": "Alle DNS-servers bevragen en het snelste IP adres terugkoppelen. Dit zal de DNS verzoeken vertragen omdat AdGuard Home moet wachten op de antwoorden van alles DNS-servers, maar verbetert wel de connectiviteit.",
|
"fastest_addr_desc": "Wacht op reacties van <b>alle</b> DNS-servers, meet de TCP-verbindingssnelheid voor elke server en retourneer het IP-adres van de server met de hoogste verbindingssnelheid.<br/>Deze modus kan DNS-query's aanzienlijk vertragen als een of meer upstream-servers niet reageren. Zorg ervoor dat je upstream-servers stabiel zijn en dat je upstream-time-out laag is.",
|
||||||
"autofix_warning_text": "Als je op \"Repareren\" klikt, configureert AdGuard Home jouw systeem om de AdGuard Home DNS-server te gebruiken.",
|
"autofix_warning_text": "Als je op \"Repareren\" klikt, configureert AdGuard Home jouw systeem om de AdGuard Home DNS-server te gebruiken.",
|
||||||
"autofix_warning_list": "De volgende taken worden uitgevoerd: <0> Deactiveren van Systeem DNSStubListener</0> <0> DNS-serveradres instellen op 127.0.0.1 </0> <0> Symbolisch koppelingsdoel van /etc/resolv.conf vervangen door /run/systemd/resolve/resolv.conf </0> <0> Stop DNSStubListener (herlaad systemd-resolved service) </0>",
|
"autofix_warning_list": "De volgende taken worden uitgevoerd: <0> Deactiveren van Systeem DNSStubListener</0> <0> DNS-serveradres instellen op 127.0.0.1 </0> <0> Symbolisch koppelingsdoel van /etc/resolv.conf vervangen door /run/systemd/resolve/resolv.conf </0> <0> Stop DNSStubListener (herlaad systemd-resolved service) </0>",
|
||||||
"autofix_warning_result": "Als gevolg hiervan worden alle DNS-aanvragen van je systeem standaard door AdGuard Home verwerkt.",
|
"autofix_warning_result": "Als gevolg hiervan worden alle DNS-aanvragen van je systeem standaard door AdGuard Home verwerkt.",
|
||||||
@@ -672,7 +681,7 @@
|
|||||||
"use_saved_key": "De eerder opgeslagen sleutel gebruiken",
|
"use_saved_key": "De eerder opgeslagen sleutel gebruiken",
|
||||||
"parental_control": "Ouderlijk toezicht",
|
"parental_control": "Ouderlijk toezicht",
|
||||||
"safe_browsing": "Veilig browsen",
|
"safe_browsing": "Veilig browsen",
|
||||||
"served_from_cache": "{{value}} <i>(geleverd vanuit cache)</i>",
|
"served_from_cache_label": "Geleverd vanuit cache",
|
||||||
"form_error_password_length": "Wachtwoord moet {{min}} tot {{max}} tekens lang zijn",
|
"form_error_password_length": "Wachtwoord moet {{min}} tot {{max}} tekens lang zijn",
|
||||||
"anonymizer_notification": "<0>Opmerking:</0> IP-anonimisering is ingeschakeld. Je kunt het uitschakelen in <1>Algemene instellingen</1>.",
|
"anonymizer_notification": "<0>Opmerking:</0> IP-anonimisering is ingeschakeld. Je kunt het uitschakelen in <1>Algemene instellingen</1>.",
|
||||||
"confirm_dns_cache_clear": "Weet je zeker dat je de DNS-cache wilt wissen?",
|
"confirm_dns_cache_clear": "Weet je zeker dat je de DNS-cache wilt wissen?",
|
||||||
|
|||||||
@@ -128,6 +128,7 @@
|
|||||||
"enforced_save_search": "Påtvungede barnevennlige søk",
|
"enforced_save_search": "Påtvungede barnevennlige søk",
|
||||||
"number_of_dns_query_to_safe_search": "Antall DNS-forespørsler til søkemotorer der \"Safe Search\" ble fremtvunget",
|
"number_of_dns_query_to_safe_search": "Antall DNS-forespørsler til søkemotorer der \"Safe Search\" ble fremtvunget",
|
||||||
"average_processing_time": "Gjennomsnittlig behandlingstid",
|
"average_processing_time": "Gjennomsnittlig behandlingstid",
|
||||||
|
"response_time": "Responstid",
|
||||||
"average_processing_time_hint": "Gjennomsnittstid for behandling av DNS-forespørsler i millisekunder",
|
"average_processing_time_hint": "Gjennomsnittstid for behandling av DNS-forespørsler i millisekunder",
|
||||||
"block_domain_use_filters_and_hosts": "Blokker domener ved hjelp av filtre, «hosts»-filer, og rå domener",
|
"block_domain_use_filters_and_hosts": "Blokker domener ved hjelp av filtre, «hosts»-filer, og rå domener",
|
||||||
"filters_block_toggle_hint": "Du kan sette opp blokkeringsoppføringer i <a>Filtre</a>-innstillingene.",
|
"filters_block_toggle_hint": "Du kan sette opp blokkeringsoppføringer i <a>Filtre</a>-innstillingene.",
|
||||||
@@ -212,6 +213,7 @@
|
|||||||
"updated_upstream_dns_toast": "Oppdaterte oppstrøms-DNS-tjenerne",
|
"updated_upstream_dns_toast": "Oppdaterte oppstrøms-DNS-tjenerne",
|
||||||
"dns_test_ok_toast": "De spesifiserte DNS-tjenerne fungerer riktig",
|
"dns_test_ok_toast": "De spesifiserte DNS-tjenerne fungerer riktig",
|
||||||
"dns_test_not_ok_toast": "Tjeneren «{{key}}» kunne ikke brukes, vennligst dobbeltsjekk at du har skrevet den riktig",
|
"dns_test_not_ok_toast": "Tjeneren «{{key}}» kunne ikke brukes, vennligst dobbeltsjekk at du har skrevet den riktig",
|
||||||
|
"dns_test_parsing_error_toast": "Seksjon {{section}}: linje {{line}}: kunne ikke brukes, vennligst sjekk at du har skrevet det riktig",
|
||||||
"unblock": "Tillat",
|
"unblock": "Tillat",
|
||||||
"block": "Blokker",
|
"block": "Blokker",
|
||||||
"disallow_this_client": "Ikke tillat denne klienten",
|
"disallow_this_client": "Ikke tillat denne klienten",
|
||||||
|
|||||||
@@ -6,21 +6,21 @@
|
|||||||
"upstream_parallel": "Użyj zapytań równoległych, aby przyspieszyć rozwiązywanie przez jednoczesne wysyłanie zapytań do wszystkich serwerów nadrzędnych.",
|
"upstream_parallel": "Użyj zapytań równoległych, aby przyspieszyć rozwiązywanie przez jednoczesne wysyłanie zapytań do wszystkich serwerów nadrzędnych.",
|
||||||
"parallel_requests": "Równoległe żądania",
|
"parallel_requests": "Równoległe żądania",
|
||||||
"load_balancing": "Równoważenie obciążenia",
|
"load_balancing": "Równoważenie obciążenia",
|
||||||
"load_balancing_desc": "Wysyłaj zapytania do jednego serwera nadrzędnego na raz. AdGuard Home używa swojego losowego algorytmu ważonego, aby wybrać serwer, tak aby najszybszy serwer był używany częściej.",
|
"load_balancing_desc": "Zapytaj jeden serwer nadrzędny na raz. AdGuard Home używa ważonego, losowego algorytmu do wybierania serwerów z najmniejszą liczbą nieudanych wyszukiwań i najniższym uśrednionym czasem wyszukiwania.",
|
||||||
"bootstrap_dns": "Serwery DNS Bootstrap",
|
"bootstrap_dns": "Serwery DNS Bootstrap",
|
||||||
"bootstrap_dns_desc": "Adresy IP serwerów DNS używanych do rozpoznawania adresów IP programów rozpoznawania nazw DoH/DoT określonych jako nadrzędne. Komentarze są niedozwolone.",
|
"bootstrap_dns_desc": "Adresy IP serwerów DNS używanych do rozpoznawania adresów IP programów rozpoznawania nazw DoH/DoT określonych jako nadrzędne. Komentarze są niedozwolone.",
|
||||||
"fallback_dns_title": "Rezerwowe serwery DNS",
|
"fallback_dns_title": "Rezerwowe serwery DNS",
|
||||||
"fallback_dns_desc": "Lista rezerwowych serwerów DNS używanych, gdy nadrzędne serwery DNS nie odpowiadają. Składnia jest taka sama jak w głównym polu powyżej.",
|
"fallback_dns_desc": "Lista rezerwowych serwerów DNS używanych, gdy nadrzędne serwery DNS nie odpowiadają. Składnia jest taka sama jak w głównym polu powyżej.",
|
||||||
"fallback_dns_placeholder": "Wprowadź jeden rezerwowy serwer DNS w każdym wierszu",
|
"fallback_dns_placeholder": "Wprowadź jeden rezerwowy serwer DNS w każdym wierszu",
|
||||||
"local_ptr_title": "Prywatne odwrotne serwery DNS",
|
"local_ptr_title": "Prywatne odwrotne serwery DNS",
|
||||||
"local_ptr_desc": "Serwery DNS, których AdGuard Home używa do lokalnych zapytań PTR. Serwery te są używane do rozpoznawania nazw hostów klientów z prywatnymi adresami IP, na przykład „192.168.12.34”, przy użyciu odwrotnego DNS. Jeśli nie jest ustawiona, AdGuard Home używa adresów domyślnych resolwerów DNS systemu operacyjnego, z wyjątkiem adresów samego AdGuard Home.",
|
"local_ptr_desc": "Serwery DNS używane przez AdGuard Home do prywatnych żądań PTR, SOA i NS. Żądanie jest uważane za prywatne, jeśli prosi o domenę ARPA zawierającą podsieć w prywatnym zakresie adresów IP (np. „192.168.12.34”) i pochodzi od klienta z prywatnym adresem IP. Jeśli nie zostanie ustawione, zostaną użyte domyślne programy rozpoznawania nazw DNS Twojego systemu operacyjnego, z wyjątkiem domowych adresów IP AdGuard.",
|
||||||
"local_ptr_default_resolver": "Domyślnie AdGuard Home używa następujących odwrotnych resolwerów DNS: {{ip}}.",
|
"local_ptr_default_resolver": "Domyślnie AdGuard Home używa następujących odwrotnych resolwerów DNS: {{ip}}.",
|
||||||
"local_ptr_no_default_resolver": "AdGuard Home nie mógł określić odpowiednich prywatnych resolwerów DNS dla tego systemu.",
|
"local_ptr_no_default_resolver": "AdGuard Home nie mógł określić odpowiednich prywatnych resolwerów DNS dla tego systemu.",
|
||||||
"local_ptr_placeholder": "Wprowadź po jednym adresie IP w każdym wierszu",
|
"local_ptr_placeholder": "Wprowadź po jednym adresie IP w każdym wierszu",
|
||||||
"resolve_clients_title": "Włącz odwrotne rozpoznawanie adresów IP klientów",
|
"resolve_clients_title": "Włącz odwrotne rozpoznawanie adresów IP klientów",
|
||||||
"resolve_clients_desc": "Odwróć adresy IP klientów na ich nazwy hostów, wysyłając zapytania PTR do odpowiednich programów tłumaczących (prywatne serwery DNS dla klientów lokalnych, serwery nadrzędne dla klientów z publicznymi adresami IP).",
|
"resolve_clients_desc": "Odwróć adresy IP klientów na ich nazwy hostów, wysyłając zapytania PTR do odpowiednich programów tłumaczących (prywatne serwery DNS dla klientów lokalnych, serwery nadrzędne dla klientów z publicznymi adresami IP).",
|
||||||
"use_private_ptr_resolvers_title": "Użyj prywatnych odwrotnych resolwerów DNS",
|
"use_private_ptr_resolvers_title": "Użyj prywatnych odwrotnych resolwerów DNS",
|
||||||
"use_private_ptr_resolvers_desc": "Wykonuj odwrotne wyszukiwania DNS dla adresów obsługiwanych lokalnie przy użyciu tych serwerów nadrzędnych. Po wyłączeniu AdGuard Home odpowiada za pomocą NXDOMAIN na wszystkie takie żądania PTR, z wyjątkiem klientów znanych z DHCP, /etc/hosts i tak dalej.",
|
"use_private_ptr_resolvers_desc": "Rozwiązuj żądania PTR, SOA i NS dla domen ARPA zawierających prywatne adresy IP za pośrednictwem prywatnych serwerów nadrzędnych, DHCP, /etc/hosts itp. Jeśli ta opcja jest wyłączona, AdGuard Home będzie odpowiadać na wszystkie takie żądania za pomocą NXDOMAIN.",
|
||||||
"check_dhcp_servers": "Sprawdź serwery DHCP",
|
"check_dhcp_servers": "Sprawdź serwery DHCP",
|
||||||
"save_config": "Zapisz konfigurację",
|
"save_config": "Zapisz konfigurację",
|
||||||
"enabled_dhcp": "Serwer DHCP włączony",
|
"enabled_dhcp": "Serwer DHCP włączony",
|
||||||
@@ -122,7 +122,7 @@
|
|||||||
"stats_query_domain": "Najczęściej wyszukiwane domeny",
|
"stats_query_domain": "Najczęściej wyszukiwane domeny",
|
||||||
"for_last_hours": "w ciągu ostatniej {{count}} godziny",
|
"for_last_hours": "w ciągu ostatniej {{count}} godziny",
|
||||||
"for_last_hours_plural": "w ciągu ostatnich {{count}} godzin",
|
"for_last_hours_plural": "w ciągu ostatnich {{count}} godzin",
|
||||||
"for_last_days": "za ostatni dzień {{count}}",
|
"for_last_days": "za ostatni {{count}} dzień",
|
||||||
"for_last_days_plural": "z ostatnich {{count}} dni",
|
"for_last_days_plural": "z ostatnich {{count}} dni",
|
||||||
"stats_disabled": "Statystyki zostały wyłączone. Można je włączyć na <0>stronie ustawień</0>.",
|
"stats_disabled": "Statystyki zostały wyłączone. Można je włączyć na <0>stronie ustawień</0>.",
|
||||||
"stats_disabled_short": "Statystyki zostały wyłączone",
|
"stats_disabled_short": "Statystyki zostały wyłączone",
|
||||||
@@ -130,7 +130,7 @@
|
|||||||
"requests_count": "Licznik żądań",
|
"requests_count": "Licznik żądań",
|
||||||
"top_blocked_domains": "Najpopularniejsze zablokowane domeny",
|
"top_blocked_domains": "Najpopularniejsze zablokowane domeny",
|
||||||
"top_clients": "Główni klienci",
|
"top_clients": "Główni klienci",
|
||||||
"no_clients_found": "Nie znaleziono klienta",
|
"no_clients_found": "Nie znaleziono klientów",
|
||||||
"general_statistics": "Ogólne statystyki",
|
"general_statistics": "Ogólne statystyki",
|
||||||
"top_upstreams": "Często żądane serwery nadrzędne",
|
"top_upstreams": "Często żądane serwery nadrzędne",
|
||||||
"no_upstreams_data_found": "Brak danych dotyczących serwerów nadrzędnych",
|
"no_upstreams_data_found": "Brak danych dotyczących serwerów nadrzędnych",
|
||||||
@@ -154,7 +154,7 @@
|
|||||||
"use_adguard_parental": "Użyj usługi Kontrola Rodzicielska AdGuard",
|
"use_adguard_parental": "Użyj usługi Kontrola Rodzicielska AdGuard",
|
||||||
"use_adguard_parental_hint": "AdGuard Home sprawdzi, czy domena zawiera materiały dla dorosłych. Używa tego samego interfejsu API przyjaznego prywatności, co usługa sieciowa Bezpieczne Przeglądanie. ",
|
"use_adguard_parental_hint": "AdGuard Home sprawdzi, czy domena zawiera materiały dla dorosłych. Używa tego samego interfejsu API przyjaznego prywatności, co usługa sieciowa Bezpieczne Przeglądanie. ",
|
||||||
"enforce_safe_search": "Użyj bezpiecznego wyszukiwania",
|
"enforce_safe_search": "Użyj bezpiecznego wyszukiwania",
|
||||||
"enforce_save_search_hint": "AdGuard Home wymusza bezpieczne wyszukiwanie w następujących wyszukiwarkach: Google, YouTube, Bing, DuckDuckGo, Yandex, Pixabay.",
|
"enforce_save_search_hint": "AdGuard Home wymusza bezpieczne wyszukiwanie w następujących wyszukiwarkach: Google, YouTube, Bing, DuckDuckGo, Ecosia, Yandex, Pixabay.",
|
||||||
"no_servers_specified": "Nie określono serwerów",
|
"no_servers_specified": "Nie określono serwerów",
|
||||||
"general_settings": "Ustawienia główne",
|
"general_settings": "Ustawienia główne",
|
||||||
"dns_settings": "Ustawienia DNS",
|
"dns_settings": "Ustawienia DNS",
|
||||||
@@ -236,6 +236,7 @@
|
|||||||
"updated_upstream_dns_toast": "Serwery nadrzędne zostały pomyślnie zapisane",
|
"updated_upstream_dns_toast": "Serwery nadrzędne zostały pomyślnie zapisane",
|
||||||
"dns_test_ok_toast": "Określone serwery DNS działają poprawnie",
|
"dns_test_ok_toast": "Określone serwery DNS działają poprawnie",
|
||||||
"dns_test_not_ok_toast": "Serwer \"{{key}}\": nie może być użyte, sprawdź, czy zapisano go poprawnie",
|
"dns_test_not_ok_toast": "Serwer \"{{key}}\": nie może być użyte, sprawdź, czy zapisano go poprawnie",
|
||||||
|
"dns_test_parsing_error_toast": "Sekcja {{section}}: linia {{line}}: nie może być użyte, sprawdź, czy zapisano go poprawnie",
|
||||||
"dns_test_warning_toast": "Upstream \"{{key}}\" nie odpowiada na zapytania testowe i może nie działać prawidłowo",
|
"dns_test_warning_toast": "Upstream \"{{key}}\" nie odpowiada na zapytania testowe i może nie działać prawidłowo",
|
||||||
"unblock": "Odblokuj",
|
"unblock": "Odblokuj",
|
||||||
"block": "Zablokuj",
|
"block": "Zablokuj",
|
||||||
@@ -243,6 +244,7 @@
|
|||||||
"allow_this_client": "Pozwól temu klientowi",
|
"allow_this_client": "Pozwól temu klientowi",
|
||||||
"block_for_this_client_only": "Zablokuj tylko tego klienta",
|
"block_for_this_client_only": "Zablokuj tylko tego klienta",
|
||||||
"unblock_for_this_client_only": "Odblokuj tylko tego klienta",
|
"unblock_for_this_client_only": "Odblokuj tylko tego klienta",
|
||||||
|
"add_persistent_client": "Dodaj do zapisanych klientów",
|
||||||
"time_table_header": "Czas",
|
"time_table_header": "Czas",
|
||||||
"date": "Data",
|
"date": "Data",
|
||||||
"domain_name_table_header": "Nazwa domeny",
|
"domain_name_table_header": "Nazwa domeny",
|
||||||
@@ -423,6 +425,9 @@
|
|||||||
"encryption_hostnames": "Nazwy hostów",
|
"encryption_hostnames": "Nazwy hostów",
|
||||||
"encryption_reset": "Czy na pewno chcesz zresetować ustawienia szyfrowania?",
|
"encryption_reset": "Czy na pewno chcesz zresetować ustawienia szyfrowania?",
|
||||||
"encryption_warning": "Ostrzeżenie",
|
"encryption_warning": "Ostrzeżenie",
|
||||||
|
"encryption_plain_dns_enable": "Włącz zwykły DNS",
|
||||||
|
"encryption_plain_dns_desc": "Zwykły DNS jest domyślnie włączony. Możesz go wyłączyć, aby zmusić wszystkie urządzenia do korzystania z szyfrowanego DNS. Aby to zrobić, musisz włączyć co najmniej jeden szyfrowany protokół DNS",
|
||||||
|
"encryption_plain_dns_error": "Aby wyłączyć zwykły DNS, włącz co najmniej jeden szyfrowany protokół DNS",
|
||||||
"topline_expiring_certificate": "Twój certyfikat SSL wkrótce wygaśnie. Zaktualizuj <0>Ustawienia szyfrowania</0>.",
|
"topline_expiring_certificate": "Twój certyfikat SSL wkrótce wygaśnie. Zaktualizuj <0>Ustawienia szyfrowania</0>.",
|
||||||
"topline_expired_certificate": "Twój certyfikat SSL wygasł. Zaktualizuj <0>Ustawienia szyfrowania</0>.",
|
"topline_expired_certificate": "Twój certyfikat SSL wygasł. Zaktualizuj <0>Ustawienia szyfrowania</0>.",
|
||||||
"form_error_port_range": "Wpisz numer portu z zakresu 80-65535",
|
"form_error_port_range": "Wpisz numer portu z zakresu 80-65535",
|
||||||
@@ -462,6 +467,7 @@
|
|||||||
"form_add_id": "Dodaj identyfikator",
|
"form_add_id": "Dodaj identyfikator",
|
||||||
"form_client_name": "Wpisz nazwę klienta",
|
"form_client_name": "Wpisz nazwę klienta",
|
||||||
"name": "Nazwa",
|
"name": "Nazwa",
|
||||||
|
"client_name": "Klient {{id}}",
|
||||||
"client_global_settings": "Użyj ustawień globalnych",
|
"client_global_settings": "Użyj ustawień globalnych",
|
||||||
"client_deleted": "Klient \"{{key}}\" został pomyślnie usunięty",
|
"client_deleted": "Klient \"{{key}}\" został pomyślnie usunięty",
|
||||||
"client_added": "Klient \"{{key}}\" został pomyślnie dodany",
|
"client_added": "Klient \"{{key}}\" został pomyślnie dodany",
|
||||||
@@ -672,7 +678,7 @@
|
|||||||
"use_saved_key": "Użyj wcześniej zapisanego klucza",
|
"use_saved_key": "Użyj wcześniej zapisanego klucza",
|
||||||
"parental_control": "Kontrola rodzicielska",
|
"parental_control": "Kontrola rodzicielska",
|
||||||
"safe_browsing": "Bezpieczne przeglądanie",
|
"safe_browsing": "Bezpieczne przeglądanie",
|
||||||
"served_from_cache": "{{value}} <i>(podawane z pamięci podręcznej)</i>",
|
"served_from_cache_label": "Podano z pamięci podręcznej",
|
||||||
"form_error_password_length": "Hasło musi zawierać od {{min}} do {{max}} znaków",
|
"form_error_password_length": "Hasło musi zawierać od {{min}} do {{max}} znaków",
|
||||||
"anonymizer_notification": "<0>Uwaga:</0> Anonimizacja IP jest włączona. Możesz ją wyłączyć w <1>Ustawieniach ogólnych</1>.",
|
"anonymizer_notification": "<0>Uwaga:</0> Anonimizacja IP jest włączona. Możesz ją wyłączyć w <1>Ustawieniach ogólnych</1>.",
|
||||||
"confirm_dns_cache_clear": "Czy na pewno chcesz wyczyścić pamięć podręczną DNS?",
|
"confirm_dns_cache_clear": "Czy na pewno chcesz wyczyścić pamięć podręczną DNS?",
|
||||||
|
|||||||
@@ -6,21 +6,21 @@
|
|||||||
"upstream_parallel": "Usar consultas paralelas para acelerar a resolução consultando simultaneamente todos os servidores DNS primário",
|
"upstream_parallel": "Usar consultas paralelas para acelerar a resolução consultando simultaneamente todos os servidores DNS primário",
|
||||||
"parallel_requests": "Solicitações paralelas",
|
"parallel_requests": "Solicitações paralelas",
|
||||||
"load_balancing": "Balanceamento de carga",
|
"load_balancing": "Balanceamento de carga",
|
||||||
"load_balancing_desc": "Consulte um servidor DNS primário por vez. O AdGuard Home usa seu algoritmo aleatório ponderado para escolher o servidor para que o servidor mais rápido seja usado com mais frequência.",
|
"load_balancing_desc": "Consulte um servidor upstream por vez.<br/>O AdGuard Home usa um algoritmo aleatório ponderado para selecionar servidores com o menor número de falhas e o menor tempo médio de consulta.",
|
||||||
"bootstrap_dns": "Servidores DNS de inicialização",
|
"bootstrap_dns": "Servidores DNS de inicialização",
|
||||||
"bootstrap_dns_desc": "Endereços IP de servidores DNS usados para resolver endereços IP dos resolvedores DoH/DoT que você especifica como upstreams. Comentários não são permitidos.",
|
"bootstrap_dns_desc": "Endereços IP de servidores DNS usados para resolver endereços IP dos resolvedores DoH/DoT que você especifica como upstreams. Comentários não são permitidos.",
|
||||||
"fallback_dns_title": "Servidores DNS Fallback",
|
"fallback_dns_title": "Servidores DNS Fallback",
|
||||||
"fallback_dns_desc": "Lista de servidores DNS Fallback usados quando os servidores DNS primários não estão respondendo. A sintaxe é a mesma dos campos de servidores principais na seção acima.",
|
"fallback_dns_desc": "Lista de servidores DNS Fallback usados quando os servidores DNS primários não estão respondendo. A sintaxe é a mesma dos campos de servidores principais na seção acima.",
|
||||||
"fallback_dns_placeholder": "Insira um servidor DNS fallback por linha",
|
"fallback_dns_placeholder": "Insira um servidor DNS fallback por linha",
|
||||||
"local_ptr_title": "Servidores DNS reversos privados",
|
"local_ptr_title": "Servidores DNS reversos privados",
|
||||||
"local_ptr_desc": "Os servidores DNS que o AdGuard Home usa para consultas PTR locais. Esses servidores são usados para resolver solicitações de PTR para endereços em intervalos de IP privados, por exemplo \"192.168.12.34\", usando DNS reverso. Se não estiver definido, o AdGuard Home usa os endereços dos resolvedores de DNS padrão do seu sistema operacional, exceto os endereços do próprio AdGuard Home.",
|
"local_ptr_desc": "Os servidores DNS que o AdGuard Home utiliza para consultas privadas de PTR, SOA e NS. A solicitação é considerada privada se solicitar um domínio ARPA contendo uma sub-rede dentro de intervalos de IP privados, por exemplo \"192.168.12.34\", e vier de um cliente com endereço privado. Se não for definido, o AdGuard Home usará os endereços dos resolvedores DNS padrão do seu sistema operacional, exceto os endereços do próprio AdGuard Home.",
|
||||||
"local_ptr_default_resolver": "Por padrão, o AdGuard Home usa os seguintes resolvedores de DNS reverso: {{ip}}.",
|
"local_ptr_default_resolver": "Por padrão, o AdGuard Home usa os seguintes resolvedores de DNS reverso: {{ip}}.",
|
||||||
"local_ptr_no_default_resolver": "A página inicial do AdGuard não conseguiu determinar resolvedores DNS reversos privados adequados para este sistema.",
|
"local_ptr_no_default_resolver": "A página inicial do AdGuard não conseguiu determinar resolvedores DNS reversos privados adequados para este sistema.",
|
||||||
"local_ptr_placeholder": "Insira um endereço IP por linha",
|
"local_ptr_placeholder": "Insira um endereço IP por linha",
|
||||||
"resolve_clients_title": "Ativar resolução reversa de endereços IP de clientes",
|
"resolve_clients_title": "Ativar resolução reversa de endereços IP de clientes",
|
||||||
"resolve_clients_desc": "Resolva reversamente os endereços IP dos clientes em seus nomes de host, enviando consultas PTR aos resolvedores correspondentes (servidores DNS privados para clientes locais, servidores upstream para clientes com endereços IP públicos).",
|
"resolve_clients_desc": "Resolva reversamente os endereços IP dos clientes em seus nomes de host, enviando consultas PTR aos resolvedores correspondentes (servidores DNS privados para clientes locais, servidores upstream para clientes com endereços IP públicos).",
|
||||||
"use_private_ptr_resolvers_title": "Usar resolvedores DNS reversos privados",
|
"use_private_ptr_resolvers_title": "Usar resolvedores DNS reversos privados",
|
||||||
"use_private_ptr_resolvers_desc": "Execute pesquisas reversas de DNS para endereços servidos localmente usando esses servidores DNS primário. Se desativado, o AdGuard Home responde com NXDOMAIN a todas essas solicitações PTR, exceto para clientes conhecidos de DHCP, /etc/hosts e assim por diante.",
|
"use_private_ptr_resolvers_desc": "Resolver solicitações PTR, SOA e NS para domínios ARPA contendo endereços privados usando servidores upstream privados, DHCP, /etc/hosts e assim por diante. Se desativado, o AdGuard Home responde a todas essas consultas com NXDOMAIN.",
|
||||||
"check_dhcp_servers": "Verificar por servidores DHCP",
|
"check_dhcp_servers": "Verificar por servidores DHCP",
|
||||||
"save_config": "Salvar configuração",
|
"save_config": "Salvar configuração",
|
||||||
"enabled_dhcp": "Servidor DHCP ativado",
|
"enabled_dhcp": "Servidor DHCP ativado",
|
||||||
@@ -154,7 +154,7 @@
|
|||||||
"use_adguard_parental": "Usar o serviço de controle parental do AdGuard",
|
"use_adguard_parental": "Usar o serviço de controle parental do AdGuard",
|
||||||
"use_adguard_parental_hint": "O AdGuard Home irá verificar se o domínio contém conteúdo adulto. Ele usa a mesma API amigável de privacidade que o serviço de segurança da navegação.",
|
"use_adguard_parental_hint": "O AdGuard Home irá verificar se o domínio contém conteúdo adulto. Ele usa a mesma API amigável de privacidade que o serviço de segurança da navegação.",
|
||||||
"enforce_safe_search": "Usar pesquisa segura",
|
"enforce_safe_search": "Usar pesquisa segura",
|
||||||
"enforce_save_search_hint": "O AdGuard Home forcará a pesquisa segura nos seguintes motores de busca: Google, YouTube, Bing, DuckDuckGo, Yandex, Pixabay.",
|
"enforce_save_search_hint": "O AdGuard Home forcará a pesquisa segura nos seguintes motores de busca: Google, YouTube, Bing, DuckDuckGo, Ecosia, Yandex, Pixabay.",
|
||||||
"no_servers_specified": "Nenhum servidor especificado",
|
"no_servers_specified": "Nenhum servidor especificado",
|
||||||
"general_settings": "Configurações gerais",
|
"general_settings": "Configurações gerais",
|
||||||
"dns_settings": "Configurações de DNS",
|
"dns_settings": "Configurações de DNS",
|
||||||
@@ -236,6 +236,7 @@
|
|||||||
"updated_upstream_dns_toast": "Servidores DNS primário salvos com sucesso",
|
"updated_upstream_dns_toast": "Servidores DNS primário salvos com sucesso",
|
||||||
"dns_test_ok_toast": "Os servidores DNS especificados estão funcionando corretamente",
|
"dns_test_ok_toast": "Os servidores DNS especificados estão funcionando corretamente",
|
||||||
"dns_test_not_ok_toast": "O servidor \"{{key}}\": não pôde ser utilizado. Por favor, verifique se você escreveu corretamente",
|
"dns_test_not_ok_toast": "O servidor \"{{key}}\": não pôde ser utilizado. Por favor, verifique se você escreveu corretamente",
|
||||||
|
"dns_test_parsing_error_toast": "A seção {{section}}: linha {{line}}: não pôde ser usada. Verifique se foi escrita corretamente",
|
||||||
"dns_test_warning_toast": "Servidor DNS primário \"{{key}}\" não responde aos Solicitações de teste e pode não funcionar corretamente",
|
"dns_test_warning_toast": "Servidor DNS primário \"{{key}}\" não responde aos Solicitações de teste e pode não funcionar corretamente",
|
||||||
"unblock": "Desbloquear",
|
"unblock": "Desbloquear",
|
||||||
"block": "Bloquear",
|
"block": "Bloquear",
|
||||||
@@ -243,6 +244,7 @@
|
|||||||
"allow_this_client": "Permitir este cliente",
|
"allow_this_client": "Permitir este cliente",
|
||||||
"block_for_this_client_only": "Bloquear apenas para este cliente",
|
"block_for_this_client_only": "Bloquear apenas para este cliente",
|
||||||
"unblock_for_this_client_only": "Desbloquear apenas para este cliente",
|
"unblock_for_this_client_only": "Desbloquear apenas para este cliente",
|
||||||
|
"add_persistent_client": "Adicionar como cliente persistente",
|
||||||
"time_table_header": "Data",
|
"time_table_header": "Data",
|
||||||
"date": "Data",
|
"date": "Data",
|
||||||
"domain_name_table_header": "Nome de domínio",
|
"domain_name_table_header": "Nome de domínio",
|
||||||
@@ -292,6 +294,9 @@
|
|||||||
"blocked_response_ttl": "Resposta bloqueada TTL",
|
"blocked_response_ttl": "Resposta bloqueada TTL",
|
||||||
"blocked_response_ttl_desc": "Especifica por quantos segundos os clientes devem armazenar em cache uma resposta filtrada",
|
"blocked_response_ttl_desc": "Especifica por quantos segundos os clientes devem armazenar em cache uma resposta filtrada",
|
||||||
"form_enter_blocked_response_ttl": "Insira o TTL da resposta bloqueada (segundos)",
|
"form_enter_blocked_response_ttl": "Insira o TTL da resposta bloqueada (segundos)",
|
||||||
|
"upstream_timeout": "Tempo limite de upstream",
|
||||||
|
"upstream_timeout_desc": "Especifica o número de segundos para esperar por uma resposta do servidor upstream",
|
||||||
|
"form_enter_upstream_timeout": "Insira a duração do tempo limite do servidor upstream em segundos",
|
||||||
"dnscrypt": "DNSCrypt",
|
"dnscrypt": "DNSCrypt",
|
||||||
"dns_over_https": "DNS-sobre-HTTPS",
|
"dns_over_https": "DNS-sobre-HTTPS",
|
||||||
"dns_over_tls": "DNS-sobre-TLS",
|
"dns_over_tls": "DNS-sobre-TLS",
|
||||||
@@ -423,6 +428,9 @@
|
|||||||
"encryption_hostnames": "Nomes dos servidores",
|
"encryption_hostnames": "Nomes dos servidores",
|
||||||
"encryption_reset": "Você tem certeza de que deseja redefinir a configuração de criptografia?",
|
"encryption_reset": "Você tem certeza de que deseja redefinir a configuração de criptografia?",
|
||||||
"encryption_warning": "Aviso",
|
"encryption_warning": "Aviso",
|
||||||
|
"encryption_plain_dns_enable": "Ativar DNS simples (sem criptografia)",
|
||||||
|
"encryption_plain_dns_desc": "O DNS simples (sem criptografia) está ativado por padrão. Você pode desativá-lo para forçar todos os dispositivos a usar DNS criptografado. Para fazer isso, você deve ativar pelo menos um protocolo DNS criptografado",
|
||||||
|
"encryption_plain_dns_error": "Para desativar o DNS simples, ative pelo menos um protocolo DNS criptografado",
|
||||||
"topline_expiring_certificate": "Seu certificado SSL está prestes a expirar. Atualize suas <0>configurações de criptografia</]0>",
|
"topline_expiring_certificate": "Seu certificado SSL está prestes a expirar. Atualize suas <0>configurações de criptografia</]0>",
|
||||||
"topline_expired_certificate": "Seu certificado SSL está expirado. Atualize suas <0>configurações de criptografia</0>",
|
"topline_expired_certificate": "Seu certificado SSL está expirado. Atualize suas <0>configurações de criptografia</0>",
|
||||||
"form_error_port_range": "Digite um número de porta entre 80 e 65535",
|
"form_error_port_range": "Digite um número de porta entre 80 e 65535",
|
||||||
@@ -462,6 +470,7 @@
|
|||||||
"form_add_id": "Adicionar identificador",
|
"form_add_id": "Adicionar identificador",
|
||||||
"form_client_name": "Digite o nome do cliente",
|
"form_client_name": "Digite o nome do cliente",
|
||||||
"name": "Nome",
|
"name": "Nome",
|
||||||
|
"client_name": "Cliente {{id}}",
|
||||||
"client_global_settings": "Usar configurações global",
|
"client_global_settings": "Usar configurações global",
|
||||||
"client_deleted": "Cliente \"{{key}}\" excluído com sucesso",
|
"client_deleted": "Cliente \"{{key}}\" excluído com sucesso",
|
||||||
"client_added": "Cliente \"{{key}}\" adicionado com sucesso",
|
"client_added": "Cliente \"{{key}}\" adicionado com sucesso",
|
||||||
@@ -592,7 +601,7 @@
|
|||||||
"disable_ipv6": "Desativar resolução de endereços IPv6",
|
"disable_ipv6": "Desativar resolução de endereços IPv6",
|
||||||
"disable_ipv6_desc": "Descarta todas as consultas DNS para endereços IPv6 (tipo AAAA) e remove dicas de IPv6 das respostas HTTPS.",
|
"disable_ipv6_desc": "Descarta todas as consultas DNS para endereços IPv6 (tipo AAAA) e remove dicas de IPv6 das respostas HTTPS.",
|
||||||
"fastest_addr": "Endereço de IP mais rápido",
|
"fastest_addr": "Endereço de IP mais rápido",
|
||||||
"fastest_addr_desc": "Consulta todos os servidores DNS e retorna o endereço IP mais rápido entre todas as respostas. Isso torna as consultas DNS mais lentas, pois o AdGuard Home tem que esperar pelas respostas de todos os servidores DNS, mas melhora a conectividade geral.",
|
"fastest_addr_desc": "Aguarde as respostas de <b>todos</b> os servidores DNS, meça a velocidade da conexão TCP para cada servidor e retorne o endereço de IP do servidor com a velocidade de conexão mais rápida.<br/>Esse modo pode retardar significativamente as consultas de DNS, se um ou mais servidores DNS primários não estiverem respondendo. Certifique-se de que seus servidores DNS primários sejam estáveis e que seu tempo de espera para DNS seja baixo.",
|
||||||
"autofix_warning_text": "Se clicar em \"Corrigir\", o AdGuardHome irá configurar o seu sistema para utilizar o servidor DNS do AdGuardHome.",
|
"autofix_warning_text": "Se clicar em \"Corrigir\", o AdGuardHome irá configurar o seu sistema para utilizar o servidor DNS do AdGuardHome.",
|
||||||
"autofix_warning_list": "Ele irá realizar estas tarefas: <0>Desativar sistema DNSStubListener</0> <0>Definir endereço do servidor DNS para 127.0.0.1</0> <0>Substituir o alvo simbólico do link /etc/resolv.conf para /run/systemd/resolv.conf</0> <0>Parar DNSStubListener (recarregar serviço resolvido pelo sistema)</0>",
|
"autofix_warning_list": "Ele irá realizar estas tarefas: <0>Desativar sistema DNSStubListener</0> <0>Definir endereço do servidor DNS para 127.0.0.1</0> <0>Substituir o alvo simbólico do link /etc/resolv.conf para /run/systemd/resolv.conf</0> <0>Parar DNSStubListener (recarregar serviço resolvido pelo sistema)</0>",
|
||||||
"autofix_warning_result": "Como resultado, todos as solicitações DNS do seu sistema serão processadas pelo AdGuard Home por padrão.",
|
"autofix_warning_result": "Como resultado, todos as solicitações DNS do seu sistema serão processadas pelo AdGuard Home por padrão.",
|
||||||
@@ -672,7 +681,7 @@
|
|||||||
"use_saved_key": "Use a chave salva anteriormente",
|
"use_saved_key": "Use a chave salva anteriormente",
|
||||||
"parental_control": "Controle parental",
|
"parental_control": "Controle parental",
|
||||||
"safe_browsing": "Navegação segura",
|
"safe_browsing": "Navegação segura",
|
||||||
"served_from_cache": "{{value}} <i>(servido do cache)</i>",
|
"served_from_cache_label": "Servido a partir do cache",
|
||||||
"form_error_password_length": "A senha deve ter entre {{min}} e {{max}} caracteres",
|
"form_error_password_length": "A senha deve ter entre {{min}} e {{max}} caracteres",
|
||||||
"anonymizer_notification": "<0>Observação:</0> A anonimização de IP está ativada. Você pode desativá-lo em <1>Configurações gerais</1>.",
|
"anonymizer_notification": "<0>Observação:</0> A anonimização de IP está ativada. Você pode desativá-lo em <1>Configurações gerais</1>.",
|
||||||
"confirm_dns_cache_clear": "Tem certeza de que deseja limpar o cache DNS?",
|
"confirm_dns_cache_clear": "Tem certeza de que deseja limpar o cache DNS?",
|
||||||
|
|||||||
@@ -6,21 +6,21 @@
|
|||||||
"upstream_parallel": "Usar consultas paralelas para acelerar a resolução consultando simultaneamente todos os servidores DNS",
|
"upstream_parallel": "Usar consultas paralelas para acelerar a resolução consultando simultaneamente todos os servidores DNS",
|
||||||
"parallel_requests": "Solicitações paralelas",
|
"parallel_requests": "Solicitações paralelas",
|
||||||
"load_balancing": "Balanceamento de carga",
|
"load_balancing": "Balanceamento de carga",
|
||||||
"load_balancing_desc": "Consulte um servidor DNS primário por vez. O AdGuard Home usa seu algoritmo aleatório ponderado para escolher o servidor para que o servidor mais rápido seja usado com mais frequência.",
|
"load_balancing_desc": "Consulta um servidor upstream de cada vez. <br/>O AdGuard Home usa um algoritmo aleatório ponderado para selecionar servidores com o menor número de pesquisas falhadas e o menor tempo médio de pesquisa.",
|
||||||
"bootstrap_dns": "Servidores DNS de arranque",
|
"bootstrap_dns": "Servidores DNS de arranque",
|
||||||
"bootstrap_dns_desc": "Endereços IP de servidores DNS usados para resolver endereços IP dos resolvedores DoH/DoT que você especifica como upstreams. Comentários não são permitidos.",
|
"bootstrap_dns_desc": "Endereços IP de servidores DNS usados para resolver endereços IP dos resolvedores DoH/DoT que você especifica como upstreams. Comentários não são permitidos.",
|
||||||
"fallback_dns_title": "Servidores DNS de fallback",
|
"fallback_dns_title": "Servidores DNS de fallback",
|
||||||
"fallback_dns_desc": "Lista de servidores DNS de fallback usados quando os servidores DNS upstream não estão respondendo. A sintaxe é a mesma do campo principal de upstreams acima.",
|
"fallback_dns_desc": "Lista de servidores DNS de fallback usados quando os servidores DNS upstream não estão respondendo. A sintaxe é a mesma do campo principal de upstreams acima.",
|
||||||
"fallback_dns_placeholder": "Insira um servidor DNS de fallback por linha",
|
"fallback_dns_placeholder": "Insira um servidor DNS de fallback por linha",
|
||||||
"local_ptr_title": "Servidores DNS reversos privados",
|
"local_ptr_title": "Servidores DNS reversos privados",
|
||||||
"local_ptr_desc": "Os servidores DNS que o AdGuard Home usa para consultas PTR locais. Esses servidores são usados para resolver solicitações de PTR para endereços em intervalos de IP privados, por exemplo \"192.168.12.34\", usando DNS reverso. Se não estiver definido, o AdGuard Home usa os endereços dos resolvedores de DNS padrão do seu sistema operacional, exceto os endereços do próprio AdGuard Home.",
|
"local_ptr_desc": "Os servidores DNS que o AdGuard Home utiliza para consultas privadas de PTR, SOA e NS. A solicitação é considerada privada se solicitar um domínio ARPA contendo uma sub-rede dentro de intervalos de IP privados, por exemplo \"192.168.12.34\", e vier de um cliente com endereço privado. Se não for definido, o AdGuard Home usará os endereços dos resolvedores DNS padrão do seu sistema operacional, exceto os endereços do próprio AdGuard Home.",
|
||||||
"local_ptr_default_resolver": "Por predefinição, o AdGuard Home usa os seguintes resolvedores de DNS reverso: {{ip}}.",
|
"local_ptr_default_resolver": "Por predefinição, o AdGuard Home usa os seguintes resolvedores de DNS reverso: {{ip}}.",
|
||||||
"local_ptr_no_default_resolver": "A página inicial do AdGuard não conseguiu determinar resolvedores DNS reversos privados adequados para este sistema.",
|
"local_ptr_no_default_resolver": "A página inicial do AdGuard não conseguiu determinar resolvedores DNS reversos privados adequados para este sistema.",
|
||||||
"local_ptr_placeholder": "Insira um endereço IP por linha",
|
"local_ptr_placeholder": "Insira um endereço IP por linha",
|
||||||
"resolve_clients_title": "Ativar resolução reversa de endereços IP de clientes",
|
"resolve_clients_title": "Ativar resolução reversa de endereços IP de clientes",
|
||||||
"resolve_clients_desc": "Resolva reversamente os endereços IP dos clientes em seus nomes de host, enviando consultas PTR aos resolvedores correspondentes (servidores DNS privados para clientes locais, servidores upstream para clientes com endereços IP públicos).",
|
"resolve_clients_desc": "Resolva reversamente os endereços IP dos clientes em seus nomes de host, enviando consultas PTR aos resolvedores correspondentes (servidores DNS privados para clientes locais, servidores upstream para clientes com endereços IP públicos).",
|
||||||
"use_private_ptr_resolvers_title": "Usar resolvedores DNS reversos privados",
|
"use_private_ptr_resolvers_title": "Usar resolvedores DNS reversos privados",
|
||||||
"use_private_ptr_resolvers_desc": "Execute pesquisas reversas de DNS para endereços servidos localmente usando esses servidores DNS primário. Se desativado, o AdGuard Home responde com NXDOMAIN a todas essas solicitações PTR, exceto para clientes conhecidos de DHCP, /etc/hosts e assim por diante.",
|
"use_private_ptr_resolvers_desc": "Resolver solicitações PTR, SOA e NS para domínios ARPA contendo endereços privados usando servidores upstream privados, DHCP, /etc/hosts e assim por diante. Se desativado, o AdGuard Home responde a todas essas consultas com NXDOMAIN.",
|
||||||
"check_dhcp_servers": "Verificar por servidores DHCP",
|
"check_dhcp_servers": "Verificar por servidores DHCP",
|
||||||
"save_config": "Guardar definição",
|
"save_config": "Guardar definição",
|
||||||
"enabled_dhcp": "Servidor DHCP ativado",
|
"enabled_dhcp": "Servidor DHCP ativado",
|
||||||
@@ -154,7 +154,7 @@
|
|||||||
"use_adguard_parental": "Usar o serviço de controlo parental do AdGuard",
|
"use_adguard_parental": "Usar o serviço de controlo parental do AdGuard",
|
||||||
"use_adguard_parental_hint": "O AdGuard Home irá verificar se o domínio contém conteúdo adulto. Usa a mesma API amigável de privacidade que o serviço de segurança da navegação.",
|
"use_adguard_parental_hint": "O AdGuard Home irá verificar se o domínio contém conteúdo adulto. Usa a mesma API amigável de privacidade que o serviço de segurança da navegação.",
|
||||||
"enforce_safe_search": "Usar pesquisa segura",
|
"enforce_safe_search": "Usar pesquisa segura",
|
||||||
"enforce_save_search_hint": "O AdGuard Home forçará a pesquisa segura nos seguintes motores de busca: Google, Youtube, Bing, DuckDuckGo, Yandex, Pixabay.",
|
"enforce_save_search_hint": "O AdGuard Home aplicará pesquisa segura nos seguintes motores de busca: Google, YouTube, Bing, DuckDuckGo, Ecosia, Yandex, Pixabay.",
|
||||||
"no_servers_specified": "Nenhum servidor especificado",
|
"no_servers_specified": "Nenhum servidor especificado",
|
||||||
"general_settings": "Definições gerais",
|
"general_settings": "Definições gerais",
|
||||||
"dns_settings": "Definições de DNS",
|
"dns_settings": "Definições de DNS",
|
||||||
@@ -236,6 +236,7 @@
|
|||||||
"updated_upstream_dns_toast": "Servidores DNS primário guardados com sucesso",
|
"updated_upstream_dns_toast": "Servidores DNS primário guardados com sucesso",
|
||||||
"dns_test_ok_toast": "Os servidores DNS especificados estão a funcionar corretamente",
|
"dns_test_ok_toast": "Os servidores DNS especificados estão a funcionar corretamente",
|
||||||
"dns_test_not_ok_toast": "O servidor \"{{key}}\": não pôde ser utilizado. Por favor, verifique se o escreveu corretamente",
|
"dns_test_not_ok_toast": "O servidor \"{{key}}\": não pôde ser utilizado. Por favor, verifique se o escreveu corretamente",
|
||||||
|
"dns_test_parsing_error_toast": "A seção {{section}}: linha {{line}}: não pôde ser usada. Verifique se foi escrita corretamente",
|
||||||
"dns_test_warning_toast": "Servidor DNS primário \"{{key}}\" não responde aos solicitações de teste e pode não funcionar corretamente",
|
"dns_test_warning_toast": "Servidor DNS primário \"{{key}}\" não responde aos solicitações de teste e pode não funcionar corretamente",
|
||||||
"unblock": "Desbloquear",
|
"unblock": "Desbloquear",
|
||||||
"block": "Bloquear",
|
"block": "Bloquear",
|
||||||
@@ -243,6 +244,7 @@
|
|||||||
"allow_this_client": "Permitir este cliente",
|
"allow_this_client": "Permitir este cliente",
|
||||||
"block_for_this_client_only": "Bloquear apenas para este cliente",
|
"block_for_this_client_only": "Bloquear apenas para este cliente",
|
||||||
"unblock_for_this_client_only": "Desbloquear apenas para este cliente",
|
"unblock_for_this_client_only": "Desbloquear apenas para este cliente",
|
||||||
|
"add_persistent_client": "Adicionar como cliente persistente",
|
||||||
"time_table_header": "Data",
|
"time_table_header": "Data",
|
||||||
"date": "Data",
|
"date": "Data",
|
||||||
"domain_name_table_header": "Nome do domínio",
|
"domain_name_table_header": "Nome do domínio",
|
||||||
@@ -292,6 +294,9 @@
|
|||||||
"blocked_response_ttl": "Resposta bloqueada TTL",
|
"blocked_response_ttl": "Resposta bloqueada TTL",
|
||||||
"blocked_response_ttl_desc": "Especifica por quantos segundos os clientes devem armazenar em cache uma resposta filtrada",
|
"blocked_response_ttl_desc": "Especifica por quantos segundos os clientes devem armazenar em cache uma resposta filtrada",
|
||||||
"form_enter_blocked_response_ttl": "Insira o TTL da resposta bloqueada (segundos)",
|
"form_enter_blocked_response_ttl": "Insira o TTL da resposta bloqueada (segundos)",
|
||||||
|
"upstream_timeout": "Tempo esgotado de upstream",
|
||||||
|
"upstream_timeout_desc": "Especifica o número de segundos a aguardar por uma resposta do servidor upstream",
|
||||||
|
"form_enter_upstream_timeout": "Insira a duração do tempo esgotado do servidor upstream em segundos",
|
||||||
"dnscrypt": "DNSCrypt",
|
"dnscrypt": "DNSCrypt",
|
||||||
"dns_over_https": "DNS-sobre-HTTPS",
|
"dns_over_https": "DNS-sobre-HTTPS",
|
||||||
"dns_over_tls": "DNS-sobre-TLS",
|
"dns_over_tls": "DNS-sobre-TLS",
|
||||||
@@ -423,6 +428,9 @@
|
|||||||
"encryption_hostnames": "Nomes dos servidores",
|
"encryption_hostnames": "Nomes dos servidores",
|
||||||
"encryption_reset": "Tem a certeza de que deseja repor a definição de criptografia?",
|
"encryption_reset": "Tem a certeza de que deseja repor a definição de criptografia?",
|
||||||
"encryption_warning": "Cuidado",
|
"encryption_warning": "Cuidado",
|
||||||
|
"encryption_plain_dns_enable": "Habilitar DNS simples (sem criptografia)",
|
||||||
|
"encryption_plain_dns_desc": "O DNS simples (sem criptografia) está ativado por padrão. Pode desativá-lo para forçar todos os dispositivos a usar DNS criptografado. Para isso, deve ativar pelo menos um protocolo DNS criptografado",
|
||||||
|
"encryption_plain_dns_error": "Para desabilitar o DNS simples, habilite pelo menos um protocolo DNS criptografado",
|
||||||
"topline_expiring_certificate": "O seu certificado SSL está prestes a expirar. Atualize as suas <0>definições de criptografia</0>.",
|
"topline_expiring_certificate": "O seu certificado SSL está prestes a expirar. Atualize as suas <0>definições de criptografia</0>.",
|
||||||
"topline_expired_certificate": "O seu certificado SSL está expirado. Atualize as suas <0>definições de criptografia</0>.",
|
"topline_expired_certificate": "O seu certificado SSL está expirado. Atualize as suas <0>definições de criptografia</0>.",
|
||||||
"form_error_port_range": "Digite um numero de porta entre 80 e 65535",
|
"form_error_port_range": "Digite um numero de porta entre 80 e 65535",
|
||||||
@@ -462,6 +470,7 @@
|
|||||||
"form_add_id": "Adicionar identificador",
|
"form_add_id": "Adicionar identificador",
|
||||||
"form_client_name": "Insira o nome do cliente",
|
"form_client_name": "Insira o nome do cliente",
|
||||||
"name": "Nome",
|
"name": "Nome",
|
||||||
|
"client_name": "Cliente {{id}}",
|
||||||
"client_global_settings": "Usar definições globais",
|
"client_global_settings": "Usar definições globais",
|
||||||
"client_deleted": "Cliente \"{{key}}\" excluído com sucesso",
|
"client_deleted": "Cliente \"{{key}}\" excluído com sucesso",
|
||||||
"client_added": "Cliente \"{{key}}\" adicionado com sucesso",
|
"client_added": "Cliente \"{{key}}\" adicionado com sucesso",
|
||||||
@@ -592,7 +601,7 @@
|
|||||||
"disable_ipv6": "Desativar resolução de endereços IPv6",
|
"disable_ipv6": "Desativar resolução de endereços IPv6",
|
||||||
"disable_ipv6_desc": "Descarte todas as consultas DNS para endereços IPv6 (tipo AAAA) e remova as dicas IPv6 das respostas HTTPS.",
|
"disable_ipv6_desc": "Descarte todas as consultas DNS para endereços IPv6 (tipo AAAA) e remova as dicas IPv6 das respostas HTTPS.",
|
||||||
"fastest_addr": "Endereço de IP mais rápido",
|
"fastest_addr": "Endereço de IP mais rápido",
|
||||||
"fastest_addr_desc": "Consulta todos os servidores DNS e retorna o endereço IP mais rápido entre todas as respostas. Isso torna as consultas DNS mais lentas, pois o AdGuard Home tem que esperar pelas respostas de todos os servidores DNS, mas melhora a conectividade geral.",
|
"fastest_addr_desc": "Aguarda por respostas de <b>todos</b> os servidores DNS, mede a velocidade da ligação TCP para cada servidor e devolva o endereço IP do servidor com a velocidade de ligação mais rápida.<br/>Este modo pode abrandar significativamente as consultas DNS, se um ou mais servidores upstream não estiverem a responder. Certifique-se de que os seus servidores upstream são estáveis e que o tempo esgotado de upstream é baixo.",
|
||||||
"autofix_warning_text": "Se clicar em \"Corrigir\", o AdGuardHome irá configurar o seu sistema para utilizar o servidor DNS do AdGuardHome.",
|
"autofix_warning_text": "Se clicar em \"Corrigir\", o AdGuardHome irá configurar o seu sistema para utilizar o servidor DNS do AdGuardHome.",
|
||||||
"autofix_warning_list": "Irá realizar estas tarefas: <0>Desativar sistema DNSStubListener</0> <0>Definir endereço do servidor DNS para 127.0.0.1</0> <0>Substituir o alvo simbólico do link /etc/resolv.conf para /run/systemd/resolv.conf</0> <0>Parar DNSStubListener (recarregar serviço resolvido pelo sistema)</0>",
|
"autofix_warning_list": "Irá realizar estas tarefas: <0>Desativar sistema DNSStubListener</0> <0>Definir endereço do servidor DNS para 127.0.0.1</0> <0>Substituir o alvo simbólico do link /etc/resolv.conf para /run/systemd/resolv.conf</0> <0>Parar DNSStubListener (recarregar serviço resolvido pelo sistema)</0>",
|
||||||
"autofix_warning_result": "Como resultado, todos as solicitações DNS do seu sistema serão processadas pelo AdGuard Home por predefinição.",
|
"autofix_warning_result": "Como resultado, todos as solicitações DNS do seu sistema serão processadas pelo AdGuard Home por predefinição.",
|
||||||
@@ -672,7 +681,7 @@
|
|||||||
"use_saved_key": "Use a chave guardada anteriormente",
|
"use_saved_key": "Use a chave guardada anteriormente",
|
||||||
"parental_control": "Controlo parental",
|
"parental_control": "Controlo parental",
|
||||||
"safe_browsing": "Navegação segura",
|
"safe_browsing": "Navegação segura",
|
||||||
"served_from_cache": "{{value}} <i>(servido do cache)</i>",
|
"served_from_cache_label": "Servido a partir do cache",
|
||||||
"form_error_password_length": "A palavra-passe deve ter {{min}} a {{max}} caracteres",
|
"form_error_password_length": "A palavra-passe deve ter {{min}} a {{max}} caracteres",
|
||||||
"anonymizer_notification": "<0>Observação:</0> A anonimização de IP está ativada. Você pode desativá-la em <1>Definições gerais</1>.",
|
"anonymizer_notification": "<0>Observação:</0> A anonimização de IP está ativada. Você pode desativá-la em <1>Definições gerais</1>.",
|
||||||
"confirm_dns_cache_clear": "Tem certeza de que quer limpar a cache DNS?",
|
"confirm_dns_cache_clear": "Tem certeza de que quer limpar a cache DNS?",
|
||||||
|
|||||||
@@ -236,6 +236,7 @@
|
|||||||
"updated_upstream_dns_toast": "Serverele din amonte au fost salvate cu succes",
|
"updated_upstream_dns_toast": "Serverele din amonte au fost salvate cu succes",
|
||||||
"dns_test_ok_toast": "Serverele DNS specificate funcționează corect",
|
"dns_test_ok_toast": "Serverele DNS specificate funcționează corect",
|
||||||
"dns_test_not_ok_toast": "Serverul \"{{key}}\": nu a putut fi utilizat, verificați dacă l-ați scris corect",
|
"dns_test_not_ok_toast": "Serverul \"{{key}}\": nu a putut fi utilizat, verificați dacă l-ați scris corect",
|
||||||
|
"dns_test_parsing_error_toast": "Secțiune {{section}}: linie {{line}}: nu a putut fi folosit, vă rugăm să verificați dacă l-ați scris corect",
|
||||||
"dns_test_warning_toast": "„{{key}}” în amonte nu răspunde la solicitările de testare și s-ar putea să nu funcționeze corect",
|
"dns_test_warning_toast": "„{{key}}” în amonte nu răspunde la solicitările de testare și s-ar putea să nu funcționeze corect",
|
||||||
"unblock": "Deblocați",
|
"unblock": "Deblocați",
|
||||||
"block": "Blocați",
|
"block": "Blocați",
|
||||||
@@ -243,6 +244,7 @@
|
|||||||
"allow_this_client": "Permiteți acest client",
|
"allow_this_client": "Permiteți acest client",
|
||||||
"block_for_this_client_only": "Blocați numai pentru acest client",
|
"block_for_this_client_only": "Blocați numai pentru acest client",
|
||||||
"unblock_for_this_client_only": "Deblocați numai pentru acest client",
|
"unblock_for_this_client_only": "Deblocați numai pentru acest client",
|
||||||
|
"add_persistent_client": "Adăugați ca client persistent",
|
||||||
"time_table_header": "Ora",
|
"time_table_header": "Ora",
|
||||||
"date": "Data",
|
"date": "Data",
|
||||||
"domain_name_table_header": "Nume domeniu",
|
"domain_name_table_header": "Nume domeniu",
|
||||||
@@ -462,6 +464,7 @@
|
|||||||
"form_add_id": "Adăugați identificator",
|
"form_add_id": "Adăugați identificator",
|
||||||
"form_client_name": "Introduceți nume client",
|
"form_client_name": "Introduceți nume client",
|
||||||
"name": "Nume",
|
"name": "Nume",
|
||||||
|
"client_name": "Client {{id}}",
|
||||||
"client_global_settings": "Folosiți setări globale",
|
"client_global_settings": "Folosiți setări globale",
|
||||||
"client_deleted": "Clientul \"{{key}}\" a fost șters cu succes",
|
"client_deleted": "Clientul \"{{key}}\" a fost șters cu succes",
|
||||||
"client_added": "Clientul \"{{key}}\" a fost adăugat cu succes",
|
"client_added": "Clientul \"{{key}}\" a fost adăugat cu succes",
|
||||||
|
|||||||
@@ -6,21 +6,21 @@
|
|||||||
"upstream_parallel": "Использовать параллельные запросы ко всем серверам одновременно для ускорения обработки запроса.",
|
"upstream_parallel": "Использовать параллельные запросы ко всем серверам одновременно для ускорения обработки запроса.",
|
||||||
"parallel_requests": "Параллельные запросы",
|
"parallel_requests": "Параллельные запросы",
|
||||||
"load_balancing": "Распределение нагрузки\n",
|
"load_balancing": "Распределение нагрузки\n",
|
||||||
"load_balancing_desc": "Запрашивать по одному серверу за раз. AdGuard Home использует алгоритм взвешенного случайного выбора сервера, так что самый быстрый сервер используется чаще.",
|
"load_balancing_desc": "Запрашивать по одному upstream-серверу.<br/>AdGuard Home использует алгоритм случайной выборки с учётом веса для выбора серверов с наименьшим количеством неудачных запросов и наименьшим средним временем выполнения запроса.",
|
||||||
"bootstrap_dns": "Bootstrap DNS-серверы",
|
"bootstrap_dns": "Bootstrap DNS-серверы",
|
||||||
"bootstrap_dns_desc": "IP-адреса DNS-серверов, используемых для поиска IP-адресов DoH/DoT upstream-серверов, которые вы указали. Комментарии не допускаются.",
|
"bootstrap_dns_desc": "IP-адреса DNS-серверов, используемых для поиска IP-адресов DoH/DoT upstream-серверов, которые вы указали. Комментарии не допускаются.",
|
||||||
"fallback_dns_title": "Резервные DNS-серверы",
|
"fallback_dns_title": "Резервные DNS-серверы",
|
||||||
"fallback_dns_desc": "Список резервных DNS-серверов, используемых в тех случаях, когда вышестоящие DNS-серверы недоступны. Синтаксис такой же, как и в поле Upstream DNS-серверы выше.",
|
"fallback_dns_desc": "Список резервных DNS-серверов, используемых в тех случаях, когда вышестоящие DNS-серверы недоступны. Синтаксис такой же, как и в поле Upstream DNS-серверы выше.",
|
||||||
"fallback_dns_placeholder": "Введите один резервный DNS-сервер в каждой строке",
|
"fallback_dns_placeholder": "Введите один резервный DNS-сервер в каждой строке",
|
||||||
"local_ptr_title": "Приватные серверы для обратного DNS",
|
"local_ptr_title": "Приватные серверы для обратного DNS",
|
||||||
"local_ptr_desc": "DNS-серверы, которые AdGuard Home использует для локальных PTR-запросов. Эти серверы используются, чтобы получить доменные имена клиентов с приватными IP-адресами, например «192.168.12.34», с помощью обратного DNS. Если список пуст, AdGuard Home использует DNS-серверы по умолчанию вашей ОС.",
|
"local_ptr_desc": "DNS-серверы, которые AdGuard Home использует для локальных PTR, SOA и NS-запросов. Запрос считается локальным, если он запрашивает информацию об ARPA-домене, подсеть которого в локальном IP-диапазоне (например, «192.168.12.34»), и если при этом запрос пришел от клиента с локальным адресом. Если значение не установлено, AdGuard Home использует адреса DNS-серверы по умолчанию в вашей ОС, за исключением адресов самого AdGuard Home.",
|
||||||
"local_ptr_default_resolver": "По умолчанию AdGuard Home использует следующие обратные DNS-резолверы: {{ip}}.",
|
"local_ptr_default_resolver": "По умолчанию AdGuard Home использует следующие обратные DNS-резолверы: {{ip}}.",
|
||||||
"local_ptr_no_default_resolver": "AdGuard Home не смог определить подходящие приватные обратные DNS-резолверы для этой системы.",
|
"local_ptr_no_default_resolver": "AdGuard Home не смог определить подходящие приватные обратные DNS-резолверы для этой системы.",
|
||||||
"local_ptr_placeholder": "Введите по одному адресу на строчку",
|
"local_ptr_placeholder": "Введите по одному адресу на строчку",
|
||||||
"resolve_clients_title": "Включить запрашивание доменных имён для IP-адресов клиентов",
|
"resolve_clients_title": "Включить запрашивание доменных имён для IP-адресов клиентов",
|
||||||
"resolve_clients_desc": "Определять доменные имена клиентов через PTR-запросы к соответствующим серверам (приватные DNS-серверы для локальных клиентов, upstream-серверы для клиентов с публичным IP-адресом).",
|
"resolve_clients_desc": "Определять доменные имена клиентов через PTR-запросы к соответствующим серверам (приватные DNS-серверы для локальных клиентов, upstream-серверы для клиентов с публичным IP-адресом).",
|
||||||
"use_private_ptr_resolvers_title": "Использовать приватные обратные DNS-резолверы",
|
"use_private_ptr_resolvers_title": "Использовать приватные обратные DNS-резолверы",
|
||||||
"use_private_ptr_resolvers_desc": "Посылать обратные DNS-запросы для локально обслуживаемых адресов на указанные серверы. Если отключено, AdGuard Home будет отвечать NXDOMAIN на все подобные PTR-запросы, кроме запросов о клиентах, уже известных по DHCP, /etc/hosts и так далее.",
|
"use_private_ptr_resolvers_desc": "Посылать PTR, SOA и NS-запросы для ARPA-доменов, содержащих локальные адреса, с помощью указанных upstream-серверов, DHCP, /etc/hosts и так далее. Если отключено, AdGuard Home отвечает NXDOMAIN на все подобные запросы.",
|
||||||
"check_dhcp_servers": "Проверить DHCP-серверы",
|
"check_dhcp_servers": "Проверить DHCP-серверы",
|
||||||
"save_config": "Сохранить конфигурацию",
|
"save_config": "Сохранить конфигурацию",
|
||||||
"enabled_dhcp": "DHCP-сервер включён",
|
"enabled_dhcp": "DHCP-сервер включён",
|
||||||
@@ -154,7 +154,7 @@
|
|||||||
"use_adguard_parental": "Включить модуль Родительского контроля AdGuard ",
|
"use_adguard_parental": "Включить модуль Родительского контроля AdGuard ",
|
||||||
"use_adguard_parental_hint": "AdGuard Home проверит, содержит ли домен материалы 18+. Он использует тот же API для обеспечения конфиденциальности, что и веб-служба безопасности браузера.",
|
"use_adguard_parental_hint": "AdGuard Home проверит, содержит ли домен материалы 18+. Он использует тот же API для обеспечения конфиденциальности, что и веб-служба безопасности браузера.",
|
||||||
"enforce_safe_search": "Включить безопасный поиск",
|
"enforce_safe_search": "Включить безопасный поиск",
|
||||||
"enforce_save_search_hint": "AdGuard Home может обеспечить безопасный поиск в следующих поисковых системах: Google, YouTube, Bing, DuckDuckGo, Yandex и Pixabay.",
|
"enforce_save_search_hint": "AdGuard Home будет обеспечивать безопасный поиск в следующих поисковых системах: Google, YouTube, Bing, DuckDuckGo, Ecosia, Yandex, Pixabay.",
|
||||||
"no_servers_specified": "Нет указанных серверов",
|
"no_servers_specified": "Нет указанных серверов",
|
||||||
"general_settings": "Основные настройки",
|
"general_settings": "Основные настройки",
|
||||||
"dns_settings": "Настройки DNS",
|
"dns_settings": "Настройки DNS",
|
||||||
@@ -236,6 +236,7 @@
|
|||||||
"updated_upstream_dns_toast": "DNS-серверы успешно обновлены",
|
"updated_upstream_dns_toast": "DNS-серверы успешно обновлены",
|
||||||
"dns_test_ok_toast": "Указанные серверы DNS работают корректно",
|
"dns_test_ok_toast": "Указанные серверы DNS работают корректно",
|
||||||
"dns_test_not_ok_toast": "Сервер «{{key}}»: невозможно использовать, проверьте правильность написания",
|
"dns_test_not_ok_toast": "Сервер «{{key}}»: невозможно использовать, проверьте правильность написания",
|
||||||
|
"dns_test_parsing_error_toast": "Раздел {{section}}: строка {{line}}: невозможно использовать, проверьте правильность написания",
|
||||||
"dns_test_warning_toast": "Upstream «{{key}}» не отвечает на тестовые запросы и может работать некорректно",
|
"dns_test_warning_toast": "Upstream «{{key}}» не отвечает на тестовые запросы и может работать некорректно",
|
||||||
"unblock": "Разблокировать",
|
"unblock": "Разблокировать",
|
||||||
"block": "Заблокировать",
|
"block": "Заблокировать",
|
||||||
@@ -243,6 +244,7 @@
|
|||||||
"allow_this_client": "Разрешить доступ клиенту",
|
"allow_this_client": "Разрешить доступ клиенту",
|
||||||
"block_for_this_client_only": "Заблокировать только для этого клиента",
|
"block_for_this_client_only": "Заблокировать только для этого клиента",
|
||||||
"unblock_for_this_client_only": "Разблокировать только для этого клиента",
|
"unblock_for_this_client_only": "Разблокировать только для этого клиента",
|
||||||
|
"add_persistent_client": "Добавить в сохранённые клиенты",
|
||||||
"time_table_header": "Время",
|
"time_table_header": "Время",
|
||||||
"date": "Дата",
|
"date": "Дата",
|
||||||
"domain_name_table_header": "Домен",
|
"domain_name_table_header": "Домен",
|
||||||
@@ -292,6 +294,9 @@
|
|||||||
"blocked_response_ttl": "TTL заблокированного ответа",
|
"blocked_response_ttl": "TTL заблокированного ответа",
|
||||||
"blocked_response_ttl_desc": "Указывает, в течение скольких секунд клиенты должны кешировать отфильтрованный ответ",
|
"blocked_response_ttl_desc": "Указывает, в течение скольких секунд клиенты должны кешировать отфильтрованный ответ",
|
||||||
"form_enter_blocked_response_ttl": "Введите TTL заблокированного ответа (в секундах)",
|
"form_enter_blocked_response_ttl": "Введите TTL заблокированного ответа (в секундах)",
|
||||||
|
"upstream_timeout": "Время ожидания ответов от upstream-серверов",
|
||||||
|
"upstream_timeout_desc": "Длительность ожидания ответа от upstream-серверов в секундах",
|
||||||
|
"form_enter_upstream_timeout": "Введите время ожидания для upstream-сервера в секундах",
|
||||||
"dnscrypt": "DNSCrypt",
|
"dnscrypt": "DNSCrypt",
|
||||||
"dns_over_https": "DNS-over-HTTPS",
|
"dns_over_https": "DNS-over-HTTPS",
|
||||||
"dns_over_tls": "DNS-over-TLS",
|
"dns_over_tls": "DNS-over-TLS",
|
||||||
@@ -423,6 +428,9 @@
|
|||||||
"encryption_hostnames": "Имена хостов",
|
"encryption_hostnames": "Имена хостов",
|
||||||
"encryption_reset": "Вы уверены, что хотите сбросить настройки шифрования?",
|
"encryption_reset": "Вы уверены, что хотите сбросить настройки шифрования?",
|
||||||
"encryption_warning": "Предупреждение",
|
"encryption_warning": "Предупреждение",
|
||||||
|
"encryption_plain_dns_enable": "Включить незашифрованный DNS",
|
||||||
|
"encryption_plain_dns_desc": "Незашифрованный DNS включён по умолчанию. Вы можете отключить его, чтобы заставить все устройства использовать зашифрованный DNS. Для этого необходимо включить хотя бы один зашифрованный протокол DNS",
|
||||||
|
"encryption_plain_dns_error": "Чтобы отключить незашифрованный DNS, включите хотя бы один зашифрованный протокол DNS",
|
||||||
"topline_expiring_certificate": "Ваш SSL-сертификат скоро истекает. Обновите <0>Настройки шифрования</0>.",
|
"topline_expiring_certificate": "Ваш SSL-сертификат скоро истекает. Обновите <0>Настройки шифрования</0>.",
|
||||||
"topline_expired_certificate": "Ваш SSL-сертификат истёк. Обновите <0>Настройки шифрования</0>.",
|
"topline_expired_certificate": "Ваш SSL-сертификат истёк. Обновите <0>Настройки шифрования</0>.",
|
||||||
"form_error_port_range": "Введите номер порта из интервала 80-65535",
|
"form_error_port_range": "Введите номер порта из интервала 80-65535",
|
||||||
@@ -462,6 +470,7 @@
|
|||||||
"form_add_id": "Добавить идентификатор",
|
"form_add_id": "Добавить идентификатор",
|
||||||
"form_client_name": "Введите имя клиента",
|
"form_client_name": "Введите имя клиента",
|
||||||
"name": "Имя",
|
"name": "Имя",
|
||||||
|
"client_name": "Клиент {{id}}",
|
||||||
"client_global_settings": "Использовать глобальные настройки",
|
"client_global_settings": "Использовать глобальные настройки",
|
||||||
"client_deleted": "Клиент «{{key}}» успешно удалён",
|
"client_deleted": "Клиент «{{key}}» успешно удалён",
|
||||||
"client_added": "Клиент «{{key}}» успешно добавлен",
|
"client_added": "Клиент «{{key}}» успешно добавлен",
|
||||||
@@ -592,7 +601,7 @@
|
|||||||
"disable_ipv6": "Отключить обработку IPv6-адресов",
|
"disable_ipv6": "Отключить обработку IPv6-адресов",
|
||||||
"disable_ipv6_desc": "Игнорировать все DNS-запросы адресов IPv6 (тип AAAA) и удалять IPv6-данные из ответов типа HTTPS.",
|
"disable_ipv6_desc": "Игнорировать все DNS-запросы адресов IPv6 (тип AAAA) и удалять IPv6-данные из ответов типа HTTPS.",
|
||||||
"fastest_addr": "Самый быстрый IP-адрес",
|
"fastest_addr": "Самый быстрый IP-адрес",
|
||||||
"fastest_addr_desc": "Опросить все DNS-серверы и вернуть самый быстрый IP-адрес из полученных ответов. Это замедлит DNS-запросы, так как нужно будет дождаться ответов со всех DNS-серверов, но улучшит соединение.",
|
"fastest_addr_desc": "Дождаться ответов от <b>всех</b> DNS-серверов, измерить скорость TCP-соединения для каждого сервера и вернуть IP-адрес сервера с самой высокой скоростью соединения.<br/>Этот режим может значительно замедлить выполнение DNS-запросов, если один или несколько серверов не отвечают. Убедитесь, что ваши серверы работают стабильно, а время ожидания серверов мало.",
|
||||||
"autofix_warning_text": "При нажатии «Исправить» AdGuard Home настроит вашу систему на использование DNS-сервера AdGuard Home.",
|
"autofix_warning_text": "При нажатии «Исправить» AdGuard Home настроит вашу систему на использование DNS-сервера AdGuard Home.",
|
||||||
"autofix_warning_list": "Будут выполняться следующие задачи: <0>Деактивировать системный DNSStubListener</0> <0>Установить адрес сервера DNS на 127.0.0.1</0> <0>Создать символическую ссылку /etc/resolv.conf на /run/systemd/resolve/resolv.conf</0> <0>Остановить DNSStubListener (перезагрузить системную службу)</0>.",
|
"autofix_warning_list": "Будут выполняться следующие задачи: <0>Деактивировать системный DNSStubListener</0> <0>Установить адрес сервера DNS на 127.0.0.1</0> <0>Создать символическую ссылку /etc/resolv.conf на /run/systemd/resolve/resolv.conf</0> <0>Остановить DNSStubListener (перезагрузить системную службу)</0>.",
|
||||||
"autofix_warning_result": "В результате все DNS-запросы от вашей системы будут по умолчанию обрабатываться AdGuard Home.\n",
|
"autofix_warning_result": "В результате все DNS-запросы от вашей системы будут по умолчанию обрабатываться AdGuard Home.\n",
|
||||||
@@ -672,7 +681,7 @@
|
|||||||
"use_saved_key": "Использовать сохранённый ранее ключ",
|
"use_saved_key": "Использовать сохранённый ранее ключ",
|
||||||
"parental_control": "Родительский контроль",
|
"parental_control": "Родительский контроль",
|
||||||
"safe_browsing": "Безопасный интернет",
|
"safe_browsing": "Безопасный интернет",
|
||||||
"served_from_cache": "{{value}} <i>(получено из кеша)</i>",
|
"served_from_cache_label": "Получено из кеша",
|
||||||
"form_error_password_length": "Пароль должен содержать от {{min}} до {{max}} символов",
|
"form_error_password_length": "Пароль должен содержать от {{min}} до {{max}} символов",
|
||||||
"anonymizer_notification": "<0>Внимание:</0> включена анонимизация IP-адресов. Вы можете отключить её в разделе <1>Основные настройки</1>.",
|
"anonymizer_notification": "<0>Внимание:</0> включена анонимизация IP-адресов. Вы можете отключить её в разделе <1>Основные настройки</1>.",
|
||||||
"confirm_dns_cache_clear": "Вы уверены, что хотите очистить кеш DNS?",
|
"confirm_dns_cache_clear": "Вы уверены, что хотите очистить кеш DNS?",
|
||||||
|
|||||||
@@ -7,7 +7,7 @@
|
|||||||
"local_ptr_desc": "ස්ථානීය PTR විමසුම් සඳහා ඇඩ්ගාර්ඩ් හෝම් භාවිතා කරන ව.නා.ප. සේවාදායක. මෙම සේවාදායක පුද්ගලික අ.ජා.කෙ. ලිපින පරාසවල PTR විමසුම් විසඳීමට භාවිතා කරයි, උදාහරණයක් ලෙස ප්රතිවර්ත ව.නා.ප. භාවිතයෙන් \"192.168.12.34\". මෙය සකසා නැති නම්, ඇඩ්ගාර්ඩ් හෝම් හි ලිපින සඳහා හැරුනු විට ඔබගේ මෙහෙයුම් පද්ධතියේ පෙරනිමි ව.නා.ප. විසදුම්වල ලිපින භාවිතා කරයි.",
|
"local_ptr_desc": "ස්ථානීය PTR විමසුම් සඳහා ඇඩ්ගාර්ඩ් හෝම් භාවිතා කරන ව.නා.ප. සේවාදායක. මෙම සේවාදායක පුද්ගලික අ.ජා.කෙ. ලිපින පරාසවල PTR විමසුම් විසඳීමට භාවිතා කරයි, උදාහරණයක් ලෙස ප්රතිවර්ත ව.නා.ප. භාවිතයෙන් \"192.168.12.34\". මෙය සකසා නැති නම්, ඇඩ්ගාර්ඩ් හෝම් හි ලිපින සඳහා හැරුනු විට ඔබගේ මෙහෙයුම් පද්ධතියේ පෙරනිමි ව.නා.ප. විසදුම්වල ලිපින භාවිතා කරයි.",
|
||||||
"local_ptr_default_resolver": "පෙරනිමි පරිදි, ඇඩ්ගාර්ඩ් හෝම් පහත ප්රතිවර්ත ව.නා.ප. පිළිවිසඳු භාවිතා කරයි: {{ip}}.",
|
"local_ptr_default_resolver": "පෙරනිමි පරිදි, ඇඩ්ගාර්ඩ් හෝම් පහත ප්රතිවර්ත ව.නා.ප. පිළිවිසඳු භාවිතා කරයි: {{ip}}.",
|
||||||
"local_ptr_no_default_resolver": "ඇඩ්ගාර්ඩ් හෝම් හට මෙම පද්ධතිය සඳහා සුදුසු පුද්ගලික ප්රතිවර්ත ව.නා.ප. පිළිවිසඳු නිශ්චය කරගත නොහැකි විය.",
|
"local_ptr_no_default_resolver": "ඇඩ්ගාර්ඩ් හෝම් හට මෙම පද්ධතිය සඳහා සුදුසු පුද්ගලික ප්රතිවර්ත ව.නා.ප. පිළිවිසඳු නිශ්චය කරගත නොහැකි විය.",
|
||||||
"local_ptr_placeholder": "පේළියකට එක් සේවාදායක ලිපිනය බැගින් යොදන්න",
|
"local_ptr_placeholder": "පේළියකට අ.ජා.කෙ. ලිපිනය බැගින් ලියන්න",
|
||||||
"resolve_clients_title": "අනුග්රාහකවල අ.ජා.කෙ. ලිපින ප්රතිවර්ත විසඳීම සබල කරන්න",
|
"resolve_clients_title": "අනුග්රාහකවල අ.ජා.කෙ. ලිපින ප්රතිවර්ත විසඳීම සබල කරන්න",
|
||||||
"use_private_ptr_resolvers_title": "පෞද්. ප්රතිවර්ත ව.නා.ප. පිළිවිසඳු භාවිතය",
|
"use_private_ptr_resolvers_title": "පෞද්. ප්රතිවර්ත ව.නා.ප. පිළිවිසඳු භාවිතය",
|
||||||
"check_dhcp_servers": "ග.ධා.වි.කෙ. සේවාදායක පරීක්ෂා කරන්න",
|
"check_dhcp_servers": "ග.ධා.වි.කෙ. සේවාදායක පරීක්ෂා කරන්න",
|
||||||
@@ -102,7 +102,6 @@
|
|||||||
"stats_malware_phishing": "අවහිර කළ ද්වේශාංග/තතුබෑම්",
|
"stats_malware_phishing": "අවහිර කළ ද්වේශාංග/තතුබෑම්",
|
||||||
"stats_adult": "අවහිර කළ වැඩිහිටි වියමන අඩවි",
|
"stats_adult": "අවහිර කළ වැඩිහිටි වියමන අඩවි",
|
||||||
"stats_query_domain": "ප්රචලිත විමසන ලද වසම්",
|
"stats_query_domain": "ප්රචලිත විමසන ලද වසම්",
|
||||||
"for_last_24_hours": "පසුගිය පැය 24 සඳහා",
|
|
||||||
"for_last_days": "පසුගිය දවස් {{count}} සඳහා",
|
"for_last_days": "පසුගිය දවස් {{count}} සඳහා",
|
||||||
"for_last_days_plural": "පසුගිය දවස් {{count}} සඳහා",
|
"for_last_days_plural": "පසුගිය දවස් {{count}} සඳහා",
|
||||||
"stats_disabled": "සංඛ්යාලේඛන අබල කර ඇත. එය <0>සැකසුම් පිටුවෙන්</0> සබල කළ හැකිය.",
|
"stats_disabled": "සංඛ්යාලේඛන අබල කර ඇත. එය <0>සැකසුම් පිටුවෙන්</0> සබල කළ හැකිය.",
|
||||||
@@ -115,13 +114,15 @@
|
|||||||
"general_statistics": "පොදු සංඛ්යාලේඛන",
|
"general_statistics": "පොදු සංඛ්යාලේඛන",
|
||||||
"number_of_dns_query_days": "පසුගිය දවස් {{count}} සඳහා සැකසූ ව.නා.ප. විමසුම් ගණන",
|
"number_of_dns_query_days": "පසුගිය දවස් {{count}} සඳහා සැකසූ ව.නා.ප. විමසුම් ගණන",
|
||||||
"number_of_dns_query_days_plural": "පසුගිය දවස් {{count}} සඳහා සැකසූ ව.නා.ප. විමසුම් ගණන",
|
"number_of_dns_query_days_plural": "පසුගිය දවස් {{count}} සඳහා සැකසූ ව.නා.ප. විමසුම් ගණන",
|
||||||
"number_of_dns_query_24_hours": "පසුගිය පැය 24 සඳහා සැකසූ ව.නා.ප. විමසුම් ගණන",
|
"number_of_dns_query_hours": "පසුගිය පැය {{count}} සඳහා සැකසූ ව.නා.ප. විමසුම් ගණන",
|
||||||
|
"number_of_dns_query_hours_plural": "පසුගිය පැය {{count}} සඳහා සැකසූ ව.නා.ප. විමසුම් ගණන",
|
||||||
"number_of_dns_query_blocked_24_hours": "දැන්වීම් වාරණ පෙරහන් සහ සත්කාරක වාරණ ලැයිස්තු මගින් අවහිර කළ ව.නා.ප. ඉල්ලීම් ගණන",
|
"number_of_dns_query_blocked_24_hours": "දැන්වීම් වාරණ පෙරහන් සහ සත්කාරක වාරණ ලැයිස්තු මගින් අවහිර කළ ව.නා.ප. ඉල්ලීම් ගණන",
|
||||||
"number_of_dns_query_blocked_24_hours_by_sec": "ඇඩ්ගාර්ඩ් පිරික්සුම් ආරක්ෂණ ඒකකය මගින් අවහිර කළ ව.නා.ප. ඉල්ලීම් ගණන",
|
"number_of_dns_query_blocked_24_hours_by_sec": "ඇඩ්ගාර්ඩ් පිරික්සුම් ආරක්ෂණ ඒකකය මගින් අවහිර කළ ව.නා.ප. ඉල්ලීම් ගණන",
|
||||||
"number_of_dns_query_blocked_24_hours_adult": "අවහිර කළ වැඩිහිටි වියමන අඩවි ගණන",
|
"number_of_dns_query_blocked_24_hours_adult": "අවහිර කළ වැඩිහිටි වියමන අඩවි ගණන",
|
||||||
"enforced_save_search": "ආරක්ෂිත සෙවීම බලාත්මක කළ",
|
"enforced_save_search": "ආරක්ෂිත සෙවීම බලාත්මක කළ",
|
||||||
"number_of_dns_query_to_safe_search": "ආරක්ෂිත සෙවීම බලාත්මක කළ සෙවුම් යන්ත්ර සඳහා ව.නා.ප. ඉල්ලීම් ගණන",
|
"number_of_dns_query_to_safe_search": "ආරක්ෂිත සෙවීම බලාත්මක කළ සෙවුම් යන්ත්ර සඳහා ව.නා.ප. ඉල්ලීම් ගණන",
|
||||||
"average_processing_time": "සාමාන්ය සැකසුම් කාලය",
|
"average_processing_time": "සාමාන්ය සැකසුම් කාලය",
|
||||||
|
"response_time": "ප්රතිචාර කාලය",
|
||||||
"average_processing_time_hint": "ව.නා.ප. ඉල්ලීමක් සැකසීමේ සාමාන්ය කාලය මිලි තත්පර වලින්",
|
"average_processing_time_hint": "ව.නා.ප. ඉල්ලීමක් සැකසීමේ සාමාන්ය කාලය මිලි තත්පර වලින්",
|
||||||
"block_domain_use_filters_and_hosts": "පෙරහන් හා සත්කාරක ගොනු භාවිතයෙන් වසම් අවහිර කරන්න",
|
"block_domain_use_filters_and_hosts": "පෙරහන් හා සත්කාරක ගොනු භාවිතයෙන් වසම් අවහිර කරන්න",
|
||||||
"filters_block_toggle_hint": "ඔබට අවහිර කිරීමේ නීති <a>පෙරහන්</a> තුළ පිහිටුවිය හැකිය.",
|
"filters_block_toggle_hint": "ඔබට අවහිර කිරීමේ නීති <a>පෙරහන්</a> තුළ පිහිටුවිය හැකිය.",
|
||||||
@@ -130,7 +131,7 @@
|
|||||||
"use_adguard_parental": "ඇඩ්ගාර්ඩ් දෙමාපිය පාලන වියමන සේවාව භාවිතා කරන්න",
|
"use_adguard_parental": "ඇඩ්ගාර්ඩ් දෙමාපිය පාලන වියමන සේවාව භාවිතා කරන්න",
|
||||||
"use_adguard_parental_hint": "වසමේ වැඩිහිටියන්ට අදාල කරුණු අඩංගු දැයි ඇඩ්ගාර්ඩ් හෝම් විසින් පරීක්ෂා කරනු ඇත. එය පිරික්සුම් ආරක්ෂණ වියමන සේවාව මෙන් රහස්යතා හිතකාමී යෙ.ක්ර. අ.මු. (API) භාවිතා කරයි.",
|
"use_adguard_parental_hint": "වසමේ වැඩිහිටියන්ට අදාල කරුණු අඩංගු දැයි ඇඩ්ගාර්ඩ් හෝම් විසින් පරීක්ෂා කරනු ඇත. එය පිරික්සුම් ආරක්ෂණ වියමන සේවාව මෙන් රහස්යතා හිතකාමී යෙ.ක්ර. අ.මු. (API) භාවිතා කරයි.",
|
||||||
"enforce_safe_search": "ආරක්ෂිත සෙවුම භාවිතා කරන්න",
|
"enforce_safe_search": "ආරක්ෂිත සෙවුම භාවිතා කරන්න",
|
||||||
"enforce_save_search_hint": "ඇඩ්ගාර්ඩ් හෝම් පහත සෙවුම් යන්ත්ර තුළ ආරක්ෂිත සෙවුම බලාත්මක කරනු ඇත: ගූගල්, යූටියුබ්, බින්ග්, ඩක්ඩක්ගෝ, යාන්ඩෙක්ස් සහ පික්සාබේ.",
|
"enforce_save_search_hint": "ඇඩ්ගාර්ඩ් හෝම් පහත සෙවුම් යන්ත්ර තුළ ආරක්ෂිත සෙවුම බලාත්මක කරනු ඇත: ගූගල්, යූටියුබ්, බින්ග්, ඩක්ඩක්ගෝ, එකොසියා, යාන්ඩෙක්ස් සහ පික්සාබේ.",
|
||||||
"no_servers_specified": "සේවාදායක කිසිවක් නිශ්චිතව දක්වා නැත",
|
"no_servers_specified": "සේවාදායක කිසිවක් නිශ්චිතව දක්වා නැත",
|
||||||
"general_settings": "පොදු සැකසුම්",
|
"general_settings": "පොදු සැකසුම්",
|
||||||
"dns_settings": "ව.නා.ප. සැකසුම්",
|
"dns_settings": "ව.නා.ප. සැකසුම්",
|
||||||
@@ -196,21 +197,23 @@
|
|||||||
"example_comment_hash": "# එසේම අදහස් දැක්වීමක්.",
|
"example_comment_hash": "# එසේම අදහස් දැක්වීමක්.",
|
||||||
"example_regex_meaning": "නිශ්චිතව දක්වා ඇති නිත්ය වාක්යවිධියට ගැළපෙන වසම් වෙත ප්රවේශය අවහිර කරයි.",
|
"example_regex_meaning": "නිශ්චිතව දක්වා ඇති නිත්ය වාක්යවිධියට ගැළපෙන වසම් වෙත ප්රවේශය අවහිර කරයි.",
|
||||||
"example_upstream_regular": "සාමාන්ය ව.නා.ප. (UDP හරහා);",
|
"example_upstream_regular": "සාමාන්ය ව.නා.ප. (UDP හරහා);",
|
||||||
|
"example_upstream_regular_port": "සාමාන්ය ව.නා.ප. (UDP හරහා, තොට සමඟ);",
|
||||||
"example_upstream_udp": "සාමාන්ය ව.නා.ප. (UDP, සත්කාරක-නම හරහා);",
|
"example_upstream_udp": "සාමාන්ය ව.නා.ප. (UDP, සත්කාරක-නම හරහා);",
|
||||||
"example_upstream_dot": "සංකේතිත <0>TLS-මගින්-ව.නා.ප.</0>;",
|
"example_upstream_dot": "සංකේතිත <0>TLS-මගින්-ව.නා.ප.</0>;",
|
||||||
"example_upstream_doh": "සංකේතිත <0>HTTPS-මගින්-ව.නා.ප.</0>;",
|
"example_upstream_doh": "සංකේතිත <0>HTTPS-මගින්-ව.නා.ප.</0>;",
|
||||||
"example_upstream_doq": "සංකේතිත <0>QUIC-මගින්-ව.නා.ප.</0>;",
|
"example_upstream_doq": "සංකේතිත <0>QUIC-මගින්-ව.නා.ප.</0>;",
|
||||||
"example_upstream_sdns": "<1>DNSCrypt</1> හෝ <2>HTTPS-මගින්-ව.නා.ප.</2> පිළිවිසඳු සඳහා <0>ව.නා.ප. මුද්දර</0>;",
|
"example_upstream_sdns": "<1>DNSCrypt</1> හෝ <2>HTTPS-මගින්-ව.නා.ප.</2> පිළිවිසඳු සඳහා <0>ව.නා.ප. මුද්දර</0>;",
|
||||||
"example_upstream_tcp": "සාමාන්ය ව.නා.ප. (TCP/ස.පා.කෙ. හරහා);",
|
"example_upstream_tcp": "සාමාන්ය ව.නා.ප. (TCP/ස.පා.කෙ. හරහා);",
|
||||||
|
"example_upstream_tcp_port": "සාමාන්ය ව.නා.ප. (TCP හරහා, තොට සමඟ);",
|
||||||
"example_upstream_tcp_hostname": "සාමාන්ය ව.නා.ප. (ස.පා.කෙ., සත්කාරක-නම හරහා);",
|
"example_upstream_tcp_hostname": "සාමාන්ය ව.නා.ප. (ස.පා.කෙ., සත්කාරක-නම හරහා);",
|
||||||
"all_lists_up_to_date_toast": "සියළුම ලැයිස්තු දැනටමත් යාවත්කාලීනයි",
|
"all_lists_up_to_date_toast": "සියළුම ලැයිස්තු දැනටමත් යාවත්කාලීනයි",
|
||||||
"dns_test_ok_toast": "සඳහන් කළ ව.නා.ප. සේවාදායක නිවැරදිව ක්රියා කරයි",
|
"dns_test_ok_toast": "සඳහන් කළ ව.නා.ප. සේවාදායක නිවැරදිව ක්රියා කරයි",
|
||||||
"dns_test_not_ok_toast": "\"{{key}}\" සේවාදායක(ය): භාවිතා කිරීමට නොහැකි විය, ඔබ එය නිවැරදිව ලියා ඇතිදැයි පරීක්ෂා කරන්න",
|
"dns_test_not_ok_toast": "\"{{key}}\" සේවාදායක(ය): භාවිතා කිරීමට නොහැකි විය, ඔබ එය නිවැරදිව ලියා ඇතිදැයි පරීක්ෂා කරන්න",
|
||||||
"unblock": "අනවහිර",
|
"unblock": "අනවහිර",
|
||||||
"block": "අවහිර",
|
"block": "අවහිර",
|
||||||
"disallow_this_client": "මෙම අනුග්රාහකයට නොඉඩ දෙන්න",
|
"disallow_this_client": "මෙම අනුග්රාහකයට ඉඩ නොදෙන්න",
|
||||||
"allow_this_client": "මෙම අනුග්රාහකයට ඉඩ දෙන්න",
|
"allow_this_client": "මෙම අනුග්රාහකයට ඉඩ දෙන්න",
|
||||||
"block_for_this_client_only": "මෙම අනුග්රාහකයට පමණක් අවහිර කරන්න",
|
"block_for_this_client_only": "මෙම අනුග්රාහකයට අවහිර කරන්න",
|
||||||
"unblock_for_this_client_only": "මෙම අනුග්රාහකයට පමණක් අනවහිර කරන්න",
|
"unblock_for_this_client_only": "මෙම අනුග්රාහකයට පමණක් අනවහිර කරන්න",
|
||||||
"time_table_header": "වේලාව",
|
"time_table_header": "වේලාව",
|
||||||
"date": "දිනය",
|
"date": "දිනය",
|
||||||
@@ -275,6 +278,7 @@
|
|||||||
"edns_use_custom_ip": "EDNS සඳහා අභිරුචි අ.ජා.කෙ. යොදාගන්න",
|
"edns_use_custom_ip": "EDNS සඳහා අභිරුචි අ.ජා.කෙ. යොදාගන්න",
|
||||||
"edns_use_custom_ip_desc": "EDNS සඳහා අභිරුචි අ.ජා.කෙ. භාවිතයට ඉඩදෙන්න",
|
"edns_use_custom_ip_desc": "EDNS සඳහා අභිරුචි අ.ජා.කෙ. භාවිතයට ඉඩදෙන්න",
|
||||||
"rate_limit_desc": "එක් අනුග්රාහකයකට ඉඩ දී ඇති තත්පරයට ඉල්ලීම් ගණන. එය 0 ලෙස සැකසීම යනුවෙන් අදහස් කරන්නේ සීමාවක් නැති බවයි.",
|
"rate_limit_desc": "එක් අනුග්රාහකයකට ඉඩ දී ඇති තත්පරයට ඉල්ලීම් ගණන. එය 0 ලෙස සැකසීම යනුවෙන් අදහස් කරන්නේ සීමාවක් නැති බවයි.",
|
||||||
|
"rate_limit_whitelist_placeholder": "පේළියකට අ.ජා.කෙ. ලිපිනය බැගින් ලියන්න",
|
||||||
"blocking_ipv4_desc": "අවහිර කළ A ඉල්ලීමක් සඳහා ආපසු එවිය යුතු අ.ජා.කෙ. (IP) ලිපිනය",
|
"blocking_ipv4_desc": "අවහිර කළ A ඉල්ලීමක් සඳහා ආපසු එවිය යුතු අ.ජා.කෙ. (IP) ලිපිනය",
|
||||||
"blocking_ipv6_desc": "අවහිර කළ AAAA ඉල්ලීමක් සඳහා ආපසු එවිය යුතු අ.ජා.කෙ. (IP) ලිපිනය",
|
"blocking_ipv6_desc": "අවහිර කළ AAAA ඉල්ලීමක් සඳහා ආපසු එවිය යුතු අ.ජා.කෙ. (IP) ලිපිනය",
|
||||||
"blocking_mode_default": "පොදු: දැන්වීම් අවහිර කරන ආකාරයේ නීතියක් මගින් අවහිර කළ විට REFUSED සමඟ ප්රතිචාර දක්වයි; /etc/host-style ආකාරයේ නීතියක් මගින් අවහිර කළ විට නීතියේ දක්වා ඇති අ.ජා.කෙ. ලිපිනය සමඟ ප්රතිචාර දක්වයි",
|
"blocking_mode_default": "පොදු: දැන්වීම් අවහිර කරන ආකාරයේ නීතියක් මගින් අවහිර කළ විට REFUSED සමඟ ප්රතිචාර දක්වයි; /etc/host-style ආකාරයේ නීතියක් මගින් අවහිර කළ විට නීතියේ දක්වා ඇති අ.ජා.කෙ. ලිපිනය සමඟ ප්රතිචාර දක්වයි",
|
||||||
@@ -505,8 +509,8 @@
|
|||||||
"statistics_enable": "සංඛ්යාලේඛන සබල කරන්න",
|
"statistics_enable": "සංඛ්යාලේඛන සබල කරන්න",
|
||||||
"ignore_domains": "නොසලකන වසම් (පේළියකට එක බැගින්)",
|
"ignore_domains": "නොසලකන වසම් (පේළියකට එක බැගින්)",
|
||||||
"ignore_domains_title": "නොසලකන වසම්",
|
"ignore_domains_title": "නොසලකන වසම්",
|
||||||
"ignore_domains_desc_stats": "සංඛ්යාලේඛනයෙහි මෙම වසම් සඳහා විමසුම් නොලියැවෙයි",
|
"ignore_domains_desc_stats": "මෙම නීති වලට ගැළපෙන විමසුම් සංඛ්යාලේඛනයට නොලියැවෙයි",
|
||||||
"ignore_domains_desc_query": "විමසුම් සටහනෙහි මෙම වසම් සඳහා විමසුම් නොලියැවෙයි",
|
"ignore_domains_desc_query": "විමසුම් සටහනට මෙම නීති වලට ගැළපෙන විමසුම් නොලියැවෙයි",
|
||||||
"interval_hours": "පැය {{count}}",
|
"interval_hours": "පැය {{count}}",
|
||||||
"interval_hours_plural": "පැය {{count}}",
|
"interval_hours_plural": "පැය {{count}}",
|
||||||
"filters_configuration": "පෙරහන් වින්යාසය",
|
"filters_configuration": "පෙරහන් වින්යාසය",
|
||||||
@@ -615,8 +619,8 @@
|
|||||||
"use_saved_key": "පෙර සුරැකි යතුර භාවිතා කරන්න",
|
"use_saved_key": "පෙර සුරැකි යතුර භාවිතා කරන්න",
|
||||||
"parental_control": "දෙමාපිය පාලනය",
|
"parental_control": "දෙමාපිය පාලනය",
|
||||||
"safe_browsing": "ආරක්ෂිත පිරික්සුම",
|
"safe_browsing": "ආරක්ෂිත පිරික්සුම",
|
||||||
"served_from_cache": "{{value}} <i>(නිහිතයෙන් ගැනිණි)</i>",
|
"served_from_cache_label": "නිහිතයෙන් සැපයිණි",
|
||||||
"form_error_password_length": "මුරපදය අවම වශයෙන් අකුරු {{value}} ක් දිගු විය යුතුමයි",
|
"form_error_password_length": "මුරපදය අකුරු {{min}} සහ {{value}} ක් අතර විය යුතුය",
|
||||||
"anonymizer_notification": "<0>සටහන:</0> අ.ජා.කෙ. නිර්නාමිකකරණය සබලයි. ඔබට එය <1>පොදු සැකසුම්</1> හරහා අබල කිරීමට හැකිය .",
|
"anonymizer_notification": "<0>සටහන:</0> අ.ජා.කෙ. නිර්නාමිකකරණය සබලයි. ඔබට එය <1>පොදු සැකසුම්</1> හරහා අබල කිරීමට හැකිය .",
|
||||||
"confirm_dns_cache_clear": "ඔබට ව.නා.ප. නිහිතය හිස් කිරීමට වුවමනාද?",
|
"confirm_dns_cache_clear": "ඔබට ව.නා.ප. නිහිතය හිස් කිරීමට වුවමනාද?",
|
||||||
"cache_cleared": "ව.නා.ප. නිහිතය හිස් කෙරිණි",
|
"cache_cleared": "ව.නා.ප. නිහිතය හිස් කෙරිණි",
|
||||||
@@ -646,6 +650,7 @@
|
|||||||
"log_and_stats_section_label": "විමසුම් සටහන හා සංඛ්යාලේඛන",
|
"log_and_stats_section_label": "විමසුම් සටහන හා සංඛ්යාලේඛන",
|
||||||
"ignore_query_log": "විමසුම් සටහනට මෙම අනුග්රාහකය යොදන්න එපා",
|
"ignore_query_log": "විමසුම් සටහනට මෙම අනුග්රාහකය යොදන්න එපා",
|
||||||
"ignore_statistics": "සංඛ්යාලේඛනයට මෙම අනුග්රාහකය යොදන්න එපා",
|
"ignore_statistics": "සංඛ්යාලේඛනයට මෙම අනුග්රාහකය යොදන්න එපා",
|
||||||
|
"schedule_services": "සේවා අවහිර විරාමය",
|
||||||
"schedule_invalid_select": "ආරම්භක වේලාව අවසන් වේලාවට කලින් විය යුතුය",
|
"schedule_invalid_select": "ආරම්භක වේලාව අවසන් වේලාවට කලින් විය යුතුය",
|
||||||
"schedule_select_days": "දවස් තෝරන්න",
|
"schedule_select_days": "දවස් තෝරන්න",
|
||||||
"schedule_timezone": "වේලා කලාපයක් තෝරන්න",
|
"schedule_timezone": "වේලා කලාපයක් තෝරන්න",
|
||||||
|
|||||||
@@ -6,27 +6,27 @@
|
|||||||
"upstream_parallel": "Používať paralelné dopyty na zrýchlenie súčasným dopytovaním všetkých upstream serverov súčasne.",
|
"upstream_parallel": "Používať paralelné dopyty na zrýchlenie súčasným dopytovaním všetkých upstream serverov súčasne.",
|
||||||
"parallel_requests": "Paralelné dopyty",
|
"parallel_requests": "Paralelné dopyty",
|
||||||
"load_balancing": "Vyrovnávanie záťaže",
|
"load_balancing": "Vyrovnávanie záťaže",
|
||||||
"load_balancing_desc": "Dopytovať len jeden server v danom čase. AdGuard Home použije na výber servera vážený náhodný algoritmus, aby sa najrýchlejší server používal častejšie.",
|
"load_balancing_desc": "Dopytuje sa súčasne len jeden upstream server.<br/>AdGuard Home používa vážený náhodný algoritmus na výber serverov s najnižším počtom neúspešných vyhľadávaní a najnižším priemerným časom vyhľadávania.",
|
||||||
"bootstrap_dns": "Bootstrap DNS servery",
|
"bootstrap_dns": "Bootstrap DNS servery",
|
||||||
"bootstrap_dns_desc": "IP adresy serverov DNS používaných na rozlíšenie IP adries prekladačov DoH/DoT, ktoré zadáte ako upstream. Komentáre nie sú povolené.",
|
"bootstrap_dns_desc": "IP adresy serverov DNS používaných na rozlíšenie IP adries prekladačov DoH/DoT, ktoré zadáte ako upstream. Komentáre nie sú povolené.",
|
||||||
"fallback_dns_title": "Záložné servery DNS",
|
"fallback_dns_title": "Záložné servery DNS",
|
||||||
"fallback_dns_desc": "Zoznam záložných serverov DNS, ktoré sa používajú, keď nadradený servery DNS neodpovedajú. Syntax je rovnaká ako v hlavnom poli vyššie.",
|
"fallback_dns_desc": "Zoznam záložných serverov DNS, ktoré sa používajú, keď nadradený servery DNS neodpovedajú. Syntax je rovnaká ako v hlavnom poli vyššie.",
|
||||||
"fallback_dns_placeholder": "Zadajte jeden záložný server DNS na riadok",
|
"fallback_dns_placeholder": "Zadajte jeden záložný server DNS na riadok",
|
||||||
"local_ptr_title": "Súkromné reverzné DNS servery",
|
"local_ptr_title": "Súkromné reverzné DNS servery",
|
||||||
"local_ptr_desc": "DNS servery, ktoré AdGuard Home používa pre miestne PTR dopyty. Tieto servery sa používajú na rozlíšenie názvov hostiteľov klientov so súkromnými adresami IP, napríklad \"192.168.12.34\", pomocou reverzného DNS. Ak nie je nastavené inak, AdGuard Home použije adresy predvolených prekladačov DNS Vášho operačného systému okrem adries samotného AdGuard Home.",
|
"local_ptr_desc": "Servery DNS, ktoré používa AdGuard Home na súkromné dopyty PTR, SOA a NS. Dopyt sa považuje za súkromný, ak požaduje doménu ARPA obsahujúcu podsieť v rozsahu súkromnej IP adresy (napríklad „192.168.12.34“) a pochádza od klienta so súkromnou IP adresou. Ak nie je nastavené, použijú sa predvolené DNS resolvery Vášho operačného systému, okrem AdGuard Home IP adries.",
|
||||||
"local_ptr_default_resolver": "V predvolenom nastavení používa AdGuard Home nasledujúce reverzné DNS prekladače: {{ip}}.",
|
"local_ptr_default_resolver": "V predvolenom nastavení používa AdGuard Home nasledujúce reverzné DNS prekladače: {{ip}}.",
|
||||||
"local_ptr_no_default_resolver": "AdGuard Home nemohol určiť vhodné súkromné reverzné DNS prekladače pre tento systém.",
|
"local_ptr_no_default_resolver": "AdGuard Home nemohol určiť vhodné súkromné reverzné DNS prekladače pre tento systém.",
|
||||||
"local_ptr_placeholder": "Na každý riadok zadajte IP adresu jedného servera",
|
"local_ptr_placeholder": "Na každý riadok zadajte IP adresu jedného servera",
|
||||||
"resolve_clients_title": "Povoliť spätný preklad IP adries klientov",
|
"resolve_clients_title": "Povoliť spätný preklad IP adries klientov",
|
||||||
"resolve_clients_desc": "Reverzne rozlišuje adresy IP klientov na ich názvy hostiteľov odosielaním PTR dopytov príslušným prekladačom (súkromné DNS servery pre miestnych klientov, servery typu upstream pre klientov s verejnými IP adresami).",
|
"resolve_clients_desc": "Reverzne rozlišuje adresy IP klientov na ich názvy hostiteľov odosielaním PTR dopytov príslušným prekladačom (súkromné DNS servery pre miestnych klientov, servery typu upstream pre klientov s verejnými IP adresami).",
|
||||||
"use_private_ptr_resolvers_title": "Použiť súkromné reverzné DNS resolvery",
|
"use_private_ptr_resolvers_title": "Použiť súkromné reverzné DNS resolvery",
|
||||||
"use_private_ptr_resolvers_desc": "Realizuje reverzné vyhľadávanie DNS pre lokálne adresy pomocou týchto upstream serverov. Ak je funkcia vypnutá, Adguard Home reaguje s NXDOMAIN na všetky takéto PTR dopyty okrem klientov známych z DHCP, /etc/hosts, a tak ďalej.",
|
"use_private_ptr_resolvers_desc": "Riešenie dopytov PTR, SOA a NS pre domény ARPA obsahujúce súkromné IP adresy prostredníctvom súkromných upstream serverov, DHCP, /etc/hosts atď. Ak je vypnuté, AdGuard Home bude na všetky takéto dopyty odpovedať pomocou NXDOMAIN.",
|
||||||
"check_dhcp_servers": "Skontrolovať DHCP servery",
|
"check_dhcp_servers": "Skontrolovať DHCP servery",
|
||||||
"save_config": "Uložiť konfiguráciu",
|
"save_config": "Uložiť konfiguráciu",
|
||||||
"enabled_dhcp": "DHCP server zapnutý",
|
"enabled_dhcp": "DHCP server zapnutý",
|
||||||
"disabled_dhcp": "DHCP server vypnutý",
|
"disabled_dhcp": "DHCP server vypnutý",
|
||||||
"unavailable_dhcp": "DHCP nie je dostupné",
|
"unavailable_dhcp": "DHCP nie je dostupné",
|
||||||
"unavailable_dhcp_desc": "AdGuard Home nemôže vo vašom OS prevádzkovať DHCP server",
|
"unavailable_dhcp_desc": "AdGuard Home nemôže vo Vašom OS prevádzkovať DHCP server",
|
||||||
"dhcp_title": "DHCP server (experimentálne!)",
|
"dhcp_title": "DHCP server (experimentálne!)",
|
||||||
"dhcp_description": "Ak Váš smerovač neposkytuje možnosť nastaviť DHCP, môžete použiť vlastný zabudovaný DHCP server AdGuard.",
|
"dhcp_description": "Ak Váš smerovač neposkytuje možnosť nastaviť DHCP, môžete použiť vlastný zabudovaný DHCP server AdGuard.",
|
||||||
"dhcp_enable": "Zapnúť DHCP server",
|
"dhcp_enable": "Zapnúť DHCP server",
|
||||||
@@ -89,7 +89,7 @@
|
|||||||
"form_enter_hostname": "Zadajte meno hostiteľa",
|
"form_enter_hostname": "Zadajte meno hostiteľa",
|
||||||
"error_details": "Podrobnosti chyby",
|
"error_details": "Podrobnosti chyby",
|
||||||
"response_details": "Podrobnosti odpovede",
|
"response_details": "Podrobnosti odpovede",
|
||||||
"request_details": "Podrobnosti požiadavky",
|
"request_details": "Podrobnosti dopytu",
|
||||||
"client_details": "Podrobnosti klienta",
|
"client_details": "Podrobnosti klienta",
|
||||||
"details": "Podrobnosti",
|
"details": "Podrobnosti",
|
||||||
"back": "Naspäť",
|
"back": "Naspäť",
|
||||||
@@ -154,7 +154,7 @@
|
|||||||
"use_adguard_parental": "Použiť AdGuard službu Rodičovská kontrola",
|
"use_adguard_parental": "Použiť AdGuard službu Rodičovská kontrola",
|
||||||
"use_adguard_parental_hint": "AdGuard Home skontroluje, či doména obsahuje materiály pre dospelých. Používa rovnaké API priateľské k ochrane osobných údajov ako služba Bezpečného prehliadania.",
|
"use_adguard_parental_hint": "AdGuard Home skontroluje, či doména obsahuje materiály pre dospelých. Používa rovnaké API priateľské k ochrane osobných údajov ako služba Bezpečného prehliadania.",
|
||||||
"enforce_safe_search": "Používať bezpečné vyhľadávanie",
|
"enforce_safe_search": "Používať bezpečné vyhľadávanie",
|
||||||
"enforce_save_search_hint": "AdGuard Home vynucuje bezpečné vyhľadávanie v nasledujúcich vyhľadávačoch: Google, YouTube, Bing, DuckDuckGo, Yandex a Pixabay.",
|
"enforce_save_search_hint": "AdGuard Home vynúti bezpečné vyhľadávanie v nasledujúcich vyhľadávačoch: Google, YouTube, Bing, DuckDuckGo, Ecosia, Yandex, Pixabay.",
|
||||||
"no_servers_specified": "Neboli špecifikované žiadne servery",
|
"no_servers_specified": "Neboli špecifikované žiadne servery",
|
||||||
"general_settings": "Všeobecné nastavenia",
|
"general_settings": "Všeobecné nastavenia",
|
||||||
"dns_settings": "Nastavenia DNS",
|
"dns_settings": "Nastavenia DNS",
|
||||||
@@ -236,6 +236,7 @@
|
|||||||
"updated_upstream_dns_toast": "Upstream servery boli úspešne uložené",
|
"updated_upstream_dns_toast": "Upstream servery boli úspešne uložené",
|
||||||
"dns_test_ok_toast": "Špecifikované DNS servery pracujú korektne",
|
"dns_test_ok_toast": "Špecifikované DNS servery pracujú korektne",
|
||||||
"dns_test_not_ok_toast": "Server \"{{key}}\": nemohol byť použitý, skontrolujte, či ste ho správne napísali",
|
"dns_test_not_ok_toast": "Server \"{{key}}\": nemohol byť použitý, skontrolujte, či ste ho správne napísali",
|
||||||
|
"dns_test_parsing_error_toast": "Sekcia {{section}}: riadok {{line}}: nepodarilo sa použiť, skontrolujte, či ste ho napísali správne",
|
||||||
"dns_test_warning_toast": "Upstream \"{{key}}\" neodpovedá na testovacie dopyty a nemusí fungovať správne",
|
"dns_test_warning_toast": "Upstream \"{{key}}\" neodpovedá na testovacie dopyty a nemusí fungovať správne",
|
||||||
"unblock": "Odblokovať",
|
"unblock": "Odblokovať",
|
||||||
"block": "Blokovať",
|
"block": "Blokovať",
|
||||||
@@ -243,6 +244,7 @@
|
|||||||
"allow_this_client": "Povoliť tohto klienta",
|
"allow_this_client": "Povoliť tohto klienta",
|
||||||
"block_for_this_client_only": "Blokovať len pre tohto klienta",
|
"block_for_this_client_only": "Blokovať len pre tohto klienta",
|
||||||
"unblock_for_this_client_only": "Odblokovať len pre tohto klienta",
|
"unblock_for_this_client_only": "Odblokovať len pre tohto klienta",
|
||||||
|
"add_persistent_client": "Pridať ako trvalého klienta",
|
||||||
"time_table_header": "Čas",
|
"time_table_header": "Čas",
|
||||||
"date": "Dátum",
|
"date": "Dátum",
|
||||||
"domain_name_table_header": "Meno domény",
|
"domain_name_table_header": "Meno domény",
|
||||||
@@ -292,6 +294,9 @@
|
|||||||
"blocked_response_ttl": "Blokovaná odozva TTL",
|
"blocked_response_ttl": "Blokovaná odozva TTL",
|
||||||
"blocked_response_ttl_desc": "Určuje, na koľko sekúnd by mali klienti uložiť filtrovanú odozvu do vyrovnávacej pamäte",
|
"blocked_response_ttl_desc": "Určuje, na koľko sekúnd by mali klienti uložiť filtrovanú odozvu do vyrovnávacej pamäte",
|
||||||
"form_enter_blocked_response_ttl": "Zadajte TTL blokovanej odozve (sekundy)",
|
"form_enter_blocked_response_ttl": "Zadajte TTL blokovanej odozve (sekundy)",
|
||||||
|
"upstream_timeout": "Časový limit pre upstream",
|
||||||
|
"upstream_timeout_desc": "Určuje počet sekúnd čakania na odpoveď z upstream servera",
|
||||||
|
"form_enter_upstream_timeout": "Zadajte trvanie časového limitu upstream servera v sekundách",
|
||||||
"dnscrypt": "DNSCrypt",
|
"dnscrypt": "DNSCrypt",
|
||||||
"dns_over_https": "DNS-over-HTTPS",
|
"dns_over_https": "DNS-over-HTTPS",
|
||||||
"dns_over_tls": "DNS-over-TLS",
|
"dns_over_tls": "DNS-over-TLS",
|
||||||
@@ -306,7 +311,7 @@
|
|||||||
"form_enter_rate_limit": "Zadajte rýchlostný limit",
|
"form_enter_rate_limit": "Zadajte rýchlostný limit",
|
||||||
"rate_limit": "Rýchlostný limit",
|
"rate_limit": "Rýchlostný limit",
|
||||||
"edns_enable": "Povoliť klientsku podsiete EDNS",
|
"edns_enable": "Povoliť klientsku podsiete EDNS",
|
||||||
"edns_cs_desc": "Pridáva možnosť EDNS Client Subnet (ECS) do upstream požiadaviek a zapíše hodnoty odoslané klientmi do denníka dopytov.",
|
"edns_cs_desc": "Pridáva možnosť EDNS Client Subnet (ECS) do upstream dopytov a zapíše hodnoty odoslané klientami do denníka dopytov.",
|
||||||
"edns_use_custom_ip": "Použiť vlastnú IP adresu pre EDNS",
|
"edns_use_custom_ip": "Použiť vlastnú IP adresu pre EDNS",
|
||||||
"edns_use_custom_ip_desc": "Povoliť používanie vlastnej IP adresy pre EDNS",
|
"edns_use_custom_ip_desc": "Povoliť používanie vlastnej IP adresy pre EDNS",
|
||||||
"rate_limit_desc": "Počet požiadaviek za sekundu, ktoré môže jeden klient vykonať. Nastavenie na hodnotu 0 znamená neobmedzene.",
|
"rate_limit_desc": "Počet požiadaviek za sekundu, ktoré môže jeden klient vykonať. Nastavenie na hodnotu 0 znamená neobmedzene.",
|
||||||
@@ -423,6 +428,9 @@
|
|||||||
"encryption_hostnames": "Názvy hostiteľov",
|
"encryption_hostnames": "Názvy hostiteľov",
|
||||||
"encryption_reset": "Naozaj chcete obnoviť nastavenia šifrovania?",
|
"encryption_reset": "Naozaj chcete obnoviť nastavenia šifrovania?",
|
||||||
"encryption_warning": "Varovanie",
|
"encryption_warning": "Varovanie",
|
||||||
|
"encryption_plain_dns_enable": "Zapnúť jednoduchý DNS",
|
||||||
|
"encryption_plain_dns_desc": "Jednoduchý DNS je predvolene zapnutý. Môžete ho vypnúť, aby ste prinútili všetky zariadenia používať šifrovaný DNS. Ak to chcete urobiť, musíte zapnúť aspoň jeden šifrovaný DNS protokol",
|
||||||
|
"encryption_plain_dns_error": "Ak chcete vypnúť jednoduchý DNS protokol, zapnite aspoň jeden šifrovaný DNS protokol",
|
||||||
"topline_expiring_certificate": "Váš SSL certifikát čoskoro vyprší. Aktualizujte <0>Nastavenia šifrovania</0>.",
|
"topline_expiring_certificate": "Váš SSL certifikát čoskoro vyprší. Aktualizujte <0>Nastavenia šifrovania</0>.",
|
||||||
"topline_expired_certificate": "Váš SSL certifikát vypršal. Aktualizujte <0>Nastavenia šifrovania</0>.",
|
"topline_expired_certificate": "Váš SSL certifikát vypršal. Aktualizujte <0>Nastavenia šifrovania</0>.",
|
||||||
"form_error_port_range": "Zadajte číslo portu v rozsahu 80-65535",
|
"form_error_port_range": "Zadajte číslo portu v rozsahu 80-65535",
|
||||||
@@ -462,6 +470,7 @@
|
|||||||
"form_add_id": "Pridajte identifikátor",
|
"form_add_id": "Pridajte identifikátor",
|
||||||
"form_client_name": "Zadajte meno klienta",
|
"form_client_name": "Zadajte meno klienta",
|
||||||
"name": "Meno",
|
"name": "Meno",
|
||||||
|
"client_name": "Klient {{id}}",
|
||||||
"client_global_settings": "Použiť globálne nastavenia",
|
"client_global_settings": "Použiť globálne nastavenia",
|
||||||
"client_deleted": "\"{{key}}\" klienta bol úspešne vymazaný",
|
"client_deleted": "\"{{key}}\" klienta bol úspešne vymazaný",
|
||||||
"client_added": "\"{{key}}\" klienta bol úspešne pridaný",
|
"client_added": "\"{{key}}\" klienta bol úspešne pridaný",
|
||||||
@@ -474,11 +483,11 @@
|
|||||||
"access_title": "Nastavenia prístupu",
|
"access_title": "Nastavenia prístupu",
|
||||||
"access_desc": "Tu môžete konfigurovať pravidlá prístupu pre server DNS AdGuard Home.",
|
"access_desc": "Tu môžete konfigurovať pravidlá prístupu pre server DNS AdGuard Home.",
|
||||||
"access_allowed_title": "Povolení klienti",
|
"access_allowed_title": "Povolení klienti",
|
||||||
"access_allowed_desc": "Zoznam CIDR, IP adries alebo <a>ClientID</a>. Ak tento zoznam obsahuje položky, AdGuard Home bude akceptovať požiadavky iba od týchto klientov.",
|
"access_allowed_desc": "Zoznam CIDR, IP adries alebo <a>ClientID</a>. Ak tento zoznam obsahuje položky, AdGuard Home bude akceptovať dopyty iba od týchto klientov.",
|
||||||
"access_disallowed_title": "Nepovolení klienti",
|
"access_disallowed_title": "Nepovolení klienti",
|
||||||
"access_disallowed_desc": "Zoznam CIDR, IP adries alebo <a>ClientID</a>. Ak tento zoznam obsahuje položky, AdGuard Home zruší požiadavky od týchto klientov. Toto pole sa ignoruje, ak sú v poli Povolení klienti položky.",
|
"access_disallowed_desc": "Zoznam CIDR, IP adries alebo <a>ClientID</a>. Ak tento zoznam obsahuje položky, AdGuard Home zruší dopyty od týchto klientov. Toto pole sa ignoruje, ak sú v poli Povolení klienti položky.",
|
||||||
"access_blocked_title": "Nepovolené domény",
|
"access_blocked_title": "Nepovolené domény",
|
||||||
"access_blocked_desc": "Nesmie byť zamieňaná s filtrami. AdGuard Home zruší DNS dopyty, ktoré sa zhodujú s týmito doménami, a tieto dopyty sa nezobrazia ani v denníku dopytov. Môžete určiť presné názvy domén, zástupné znaky alebo pravidlá filtrovania URL adries, napr. \"example.org\", \"*.example.org\" alebo ||example.org^\" zodpovedajúcim spôsobom.",
|
"access_blocked_desc": "Nesmie byť zamieňaná s filtrami. AdGuard Home zruší DNS dopyty, ktoré sa zhodujú s týmito doménami, a tieto dopyty sa nezobrazia ani v denníku dopytov. Môžete určiť presné názvy domén, zástupné znaky alebo pravidlá filtrácie URL adries, napr. \"example.org\", \"*.example.org\" alebo ||example.org^\" zodpovedajúcim spôsobom.",
|
||||||
"access_settings_saved": "Nastavenia prístupu úspešne uložené",
|
"access_settings_saved": "Nastavenia prístupu úspešne uložené",
|
||||||
"updates_checked": "K dispozícii je nová verzia aplikácie AdGuard Home\n",
|
"updates_checked": "K dispozícii je nová verzia aplikácie AdGuard Home\n",
|
||||||
"updates_version_equal": "AdGuard Home je aktuálny",
|
"updates_version_equal": "AdGuard Home je aktuálny",
|
||||||
@@ -592,7 +601,7 @@
|
|||||||
"disable_ipv6": "Vypnúť rozlišovanie IPv6 adries",
|
"disable_ipv6": "Vypnúť rozlišovanie IPv6 adries",
|
||||||
"disable_ipv6_desc": "Ignorovať všetky dotazy DNS na adresy IPv6 (typ AAAA) a odstrániť IPv6 údaje z HTTPS odpovedí.",
|
"disable_ipv6_desc": "Ignorovať všetky dotazy DNS na adresy IPv6 (typ AAAA) a odstrániť IPv6 údaje z HTTPS odpovedí.",
|
||||||
"fastest_addr": "Najrýchlejšia IP adresa",
|
"fastest_addr": "Najrýchlejšia IP adresa",
|
||||||
"fastest_addr_desc": "Dopytovať všetky servery DNS a vrátiť najrýchlejšiu IP adresu zo všetkých odpovedí. Toto spomalí DNS dopyty, pretože AdGuard Home musí čakať na odpovede zo všetkých serverov DNS, ale zlepší sa celkové pripojenie.",
|
"fastest_addr_desc": "Čaká na odpovede od <b>všetkých</b> DNS serverov, zmeria rýchlosť pripojenia TCP pre každý server a vráti adresu IP servera s najväčšou rýchlosťou pripojenia.<br/>Tento režim môže výrazne spomaliť DNS dopyty, ak jeden alebo viac upstream serverov neodpovedá. Uistite sa, že Vaše upstream servery sú stabilné a upstream upstream je nízky.",
|
||||||
"autofix_warning_text": "Ak kliknete na „Opraviť“, AdGuardHome nakonfiguruje Váš systém tak, aby používal DNS server AdGuardHome.",
|
"autofix_warning_text": "Ak kliknete na „Opraviť“, AdGuardHome nakonfiguruje Váš systém tak, aby používal DNS server AdGuardHome.",
|
||||||
"autofix_warning_list": "Bude vykonávať tieto úlohy: <0>Deaktivovať systém DNSStubListener</0> <0>Nastaviť adresu servera DNS na 127.0.0.1</0> <0>Nahradiť cieľový symbolický odkaz /etc/resolv.conf na /run/systemd/resolve/resolv.conf</0> <0>Zastaviť službu DNSStubListener (znova načítať službu systemd-resolved)</0>",
|
"autofix_warning_list": "Bude vykonávať tieto úlohy: <0>Deaktivovať systém DNSStubListener</0> <0>Nastaviť adresu servera DNS na 127.0.0.1</0> <0>Nahradiť cieľový symbolický odkaz /etc/resolv.conf na /run/systemd/resolve/resolv.conf</0> <0>Zastaviť službu DNSStubListener (znova načítať službu systemd-resolved)</0>",
|
||||||
"autofix_warning_result": "Výsledkom bude, že všetky DNS dopyty z Vášho systému budú štandardne spracované službou AdGuard Home.",
|
"autofix_warning_result": "Výsledkom bude, že všetky DNS dopyty z Vášho systému budú štandardne spracované službou AdGuard Home.",
|
||||||
@@ -672,7 +681,7 @@
|
|||||||
"use_saved_key": "Použiť predtým uložený kľúč",
|
"use_saved_key": "Použiť predtým uložený kľúč",
|
||||||
"parental_control": "Rodičovská kontrola",
|
"parental_control": "Rodičovská kontrola",
|
||||||
"safe_browsing": "Bezpečné prehliadanie",
|
"safe_browsing": "Bezpečné prehliadanie",
|
||||||
"served_from_cache": "{{value}} <i>(prevzatá z cache pamäte)</i>",
|
"served_from_cache_label": "Prevzaté z cache pamäte",
|
||||||
"form_error_password_length": "Heslo musí mať od {{min}} do {{max}} znakov",
|
"form_error_password_length": "Heslo musí mať od {{min}} do {{max}} znakov",
|
||||||
"anonymizer_notification": "<0>Poznámka:</0> Anonymizácia IP je zapnutá. Môžete ju vypnúť vo <1>Všeobecných nastaveniach</1>.",
|
"anonymizer_notification": "<0>Poznámka:</0> Anonymizácia IP je zapnutá. Môžete ju vypnúť vo <1>Všeobecných nastaveniach</1>.",
|
||||||
"confirm_dns_cache_clear": "Naozaj chcete vymazať vyrovnávaciu pamäť DNS?",
|
"confirm_dns_cache_clear": "Naozaj chcete vymazať vyrovnávaciu pamäť DNS?",
|
||||||
|
|||||||
@@ -236,6 +236,7 @@
|
|||||||
"updated_upstream_dns_toast": "Gorvodni trežniki so uspešno shranjeni",
|
"updated_upstream_dns_toast": "Gorvodni trežniki so uspešno shranjeni",
|
||||||
"dns_test_ok_toast": "Navedeni strežniki DNS delujejo pravilno",
|
"dns_test_ok_toast": "Navedeni strežniki DNS delujejo pravilno",
|
||||||
"dns_test_not_ok_toast": "Ni mogoče uporabiti: strežnika \"{{key}}\". Preverite, ali ste ga pravilno napisali",
|
"dns_test_not_ok_toast": "Ni mogoče uporabiti: strežnika \"{{key}}\". Preverite, ali ste ga pravilno napisali",
|
||||||
|
"dns_test_parsing_error_toast": "Razdelek {{section}}: vrstica {{line}}: ni bilo mogoče uporabiti, preverite, ali ste ga pravilno zapisali",
|
||||||
"dns_test_warning_toast": "Upstream \"{{key}}\" se ne odziva na testne zahteve in morda ne deluje pravilno",
|
"dns_test_warning_toast": "Upstream \"{{key}}\" se ne odziva na testne zahteve in morda ne deluje pravilno",
|
||||||
"unblock": "Omogoči",
|
"unblock": "Omogoči",
|
||||||
"block": "Onemogoči",
|
"block": "Onemogoči",
|
||||||
@@ -243,6 +244,7 @@
|
|||||||
"allow_this_client": "Dovoli tega odjemalca",
|
"allow_this_client": "Dovoli tega odjemalca",
|
||||||
"block_for_this_client_only": "Onemogoči samo za tega odjemalca",
|
"block_for_this_client_only": "Onemogoči samo za tega odjemalca",
|
||||||
"unblock_for_this_client_only": "Omogoči samo za tega odjemalca",
|
"unblock_for_this_client_only": "Omogoči samo za tega odjemalca",
|
||||||
|
"add_persistent_client": "Dodaj kot vztrajnega odjemalca",
|
||||||
"time_table_header": "Čas",
|
"time_table_header": "Čas",
|
||||||
"date": "Datum",
|
"date": "Datum",
|
||||||
"domain_name_table_header": "Ime domene",
|
"domain_name_table_header": "Ime domene",
|
||||||
@@ -423,6 +425,9 @@
|
|||||||
"encryption_hostnames": "Imena gostiteljev",
|
"encryption_hostnames": "Imena gostiteljev",
|
||||||
"encryption_reset": "Ali ste prepričani, da želite ponastaviti nastavitve šifriranja?",
|
"encryption_reset": "Ali ste prepričani, da želite ponastaviti nastavitve šifriranja?",
|
||||||
"encryption_warning": "Opozorilo",
|
"encryption_warning": "Opozorilo",
|
||||||
|
"encryption_plain_dns_enable": "Omogoči navaden DNS",
|
||||||
|
"encryption_plain_dns_desc": "Navaden DNS je privzeto omogočen. Lahko ga onemogočite, da vse naprave prisilite k uporabi šifriranega DNS-ja. Če želite to narediti, morate omogočiti vsaj en šifriran protokol DNS",
|
||||||
|
"encryption_plain_dns_error": "Da onemogočite navaden DNS, omogočite vsaj en šifriran protokol DNS",
|
||||||
"topline_expiring_certificate": "Vaš e digitalno potrdilo SSL bo kmalu poteklol. Posodobite <0>Nastavitve šifriranja</0>.",
|
"topline_expiring_certificate": "Vaš e digitalno potrdilo SSL bo kmalu poteklol. Posodobite <0>Nastavitve šifriranja</0>.",
|
||||||
"topline_expired_certificate": "Vaše digitalno potrdilo SSL je poteklo. Posodobi <0>Nastavitve šifriranja</0>.",
|
"topline_expired_certificate": "Vaše digitalno potrdilo SSL je poteklo. Posodobi <0>Nastavitve šifriranja</0>.",
|
||||||
"form_error_port_range": "Vnesite številko vrat v razponu med 80-65535",
|
"form_error_port_range": "Vnesite številko vrat v razponu med 80-65535",
|
||||||
@@ -462,6 +467,7 @@
|
|||||||
"form_add_id": "Dodaj identifikatorja",
|
"form_add_id": "Dodaj identifikatorja",
|
||||||
"form_client_name": "Vnesite ime odjemalca",
|
"form_client_name": "Vnesite ime odjemalca",
|
||||||
"name": "Ime",
|
"name": "Ime",
|
||||||
|
"client_name": "Odjemalec {{id}}",
|
||||||
"client_global_settings": "Uporabi splošne nastavitve",
|
"client_global_settings": "Uporabi splošne nastavitve",
|
||||||
"client_deleted": "Odjemalec \"{{key}}\" je bil uspešno izbrisan",
|
"client_deleted": "Odjemalec \"{{key}}\" je bil uspešno izbrisan",
|
||||||
"client_added": "Odjemalec \"{{key}}\" je bil uspešno dodan",
|
"client_added": "Odjemalec \"{{key}}\" je bil uspešno dodan",
|
||||||
@@ -672,7 +678,7 @@
|
|||||||
"use_saved_key": "Uporabi prej shranjeni ključ",
|
"use_saved_key": "Uporabi prej shranjeni ključ",
|
||||||
"parental_control": "Starševski nadzor",
|
"parental_control": "Starševski nadzor",
|
||||||
"safe_browsing": "Varno brskanje",
|
"safe_browsing": "Varno brskanje",
|
||||||
"served_from_cache": "{{value}} <i>(postreženo iz predpomnilnika)</i>",
|
"served_from_cache_label": "Dostavljeno iz predpomnilnika",
|
||||||
"form_error_password_length": "Geslo mora vsebovati od {{min}} do {{max}} znakov",
|
"form_error_password_length": "Geslo mora vsebovati od {{min}} do {{max}} znakov",
|
||||||
"anonymizer_notification": "<0>Opomba:</0> Anonimizacija IP je omogočena. Onemogočite ga lahko v <1>Splošnih nastavitvah</1>.",
|
"anonymizer_notification": "<0>Opomba:</0> Anonimizacija IP je omogočena. Onemogočite ga lahko v <1>Splošnih nastavitvah</1>.",
|
||||||
"confirm_dns_cache_clear": "Ali ste prepričani, da želite počistiti predpomnilnik DNS?",
|
"confirm_dns_cache_clear": "Ali ste prepričani, da želite počistiti predpomnilnik DNS?",
|
||||||
|
|||||||
@@ -236,6 +236,7 @@
|
|||||||
"updated_upstream_dns_toast": "Upstream serveri su uspešno sačuvani",
|
"updated_upstream_dns_toast": "Upstream serveri su uspešno sačuvani",
|
||||||
"dns_test_ok_toast": "Dati DNS serveri rade ispravno",
|
"dns_test_ok_toast": "Dati DNS serveri rade ispravno",
|
||||||
"dns_test_not_ok_toast": "Server \"{{key}}\": se ne može koristiti. Proverite da li ste ga ispravno uneli",
|
"dns_test_not_ok_toast": "Server \"{{key}}\": se ne može koristiti. Proverite da li ste ga ispravno uneli",
|
||||||
|
"dns_test_parsing_error_toast": "Odeljak {{section}}: linija {{line}}: ne može se koristiti, molimo proverite da li ste ga ispravno napisali",
|
||||||
"dns_test_warning_toast": "Apstrim \"{{key}}\" ne odgovara na zahteve za testiranje i možda neće raditi kako treba",
|
"dns_test_warning_toast": "Apstrim \"{{key}}\" ne odgovara na zahteve za testiranje i možda neće raditi kako treba",
|
||||||
"unblock": "Odblokiraj",
|
"unblock": "Odblokiraj",
|
||||||
"block": "Blokiraj",
|
"block": "Blokiraj",
|
||||||
@@ -243,6 +244,7 @@
|
|||||||
"allow_this_client": "Dozvoli ovaj klijent",
|
"allow_this_client": "Dozvoli ovaj klijent",
|
||||||
"block_for_this_client_only": "Blokiraj samo za ovaj klijent",
|
"block_for_this_client_only": "Blokiraj samo za ovaj klijent",
|
||||||
"unblock_for_this_client_only": "Odblokiraj samo za ovaj klijent",
|
"unblock_for_this_client_only": "Odblokiraj samo za ovaj klijent",
|
||||||
|
"add_persistent_client": "Dodati u sačuvane klijente",
|
||||||
"time_table_header": "Vreme",
|
"time_table_header": "Vreme",
|
||||||
"date": "Datum",
|
"date": "Datum",
|
||||||
"domain_name_table_header": "Ime domena",
|
"domain_name_table_header": "Ime domena",
|
||||||
@@ -462,6 +464,7 @@
|
|||||||
"form_add_id": "Dodaj identifikator",
|
"form_add_id": "Dodaj identifikator",
|
||||||
"form_client_name": "Unesite ime klijenta",
|
"form_client_name": "Unesite ime klijenta",
|
||||||
"name": "Ime",
|
"name": "Ime",
|
||||||
|
"client_name": "Klijent {{id}}",
|
||||||
"client_global_settings": "Koristi globalne postavke",
|
"client_global_settings": "Koristi globalne postavke",
|
||||||
"client_deleted": "Klijent \"{{key}}\" uspešno izbrisan",
|
"client_deleted": "Klijent \"{{key}}\" uspešno izbrisan",
|
||||||
"client_added": "Klijent \"{{key}}\" uspešno dodat",
|
"client_added": "Klijent \"{{key}}\" uspešno dodat",
|
||||||
|
|||||||
@@ -9,7 +9,7 @@
|
|||||||
"load_balancing_desc": "Fråga en uppströmsserver åt gången. AdGuard Home använder sin viktade slumpmässiga algoritm för att välja server så att den snabbaste servern används oftare.",
|
"load_balancing_desc": "Fråga en uppströmsserver åt gången. AdGuard Home använder sin viktade slumpmässiga algoritm för att välja server så att den snabbaste servern används oftare.",
|
||||||
"bootstrap_dns": "Bootstrap-DNS-servrar",
|
"bootstrap_dns": "Bootstrap-DNS-servrar",
|
||||||
"bootstrap_dns_desc": "IP-adresser för DNS-servrar som används för att lösa IP-adresser för de DoH/DoT-resolvers som du anger som uppströms. Kommentarer är inte tillåtna.",
|
"bootstrap_dns_desc": "IP-adresser för DNS-servrar som används för att lösa IP-adresser för de DoH/DoT-resolvers som du anger som uppströms. Kommentarer är inte tillåtna.",
|
||||||
"fallback_dns_title": "Reserv-DNS-servrar",
|
"fallback_dns_title": "Reserv DNS-servrar",
|
||||||
"fallback_dns_desc": "Lista över reserv-DNS-servrar som används när uppströms DNS-servrar inte svarar. Syntaxen är densamma som i huvuduppströmsfältet ovan.",
|
"fallback_dns_desc": "Lista över reserv-DNS-servrar som används när uppströms DNS-servrar inte svarar. Syntaxen är densamma som i huvuduppströmsfältet ovan.",
|
||||||
"fallback_dns_placeholder": "Ange en reserv-DNS-server per rad",
|
"fallback_dns_placeholder": "Ange en reserv-DNS-server per rad",
|
||||||
"local_ptr_title": "Privata omvända DNS-servrar",
|
"local_ptr_title": "Privata omvända DNS-servrar",
|
||||||
@@ -141,8 +141,8 @@
|
|||||||
"number_of_dns_query_blocked_24_hours": "Antalet DNS-förfrågningar som blockerades av annonsfilter och värdens blockeringsklistor",
|
"number_of_dns_query_blocked_24_hours": "Antalet DNS-förfrågningar som blockerades av annonsfilter och värdens blockeringsklistor",
|
||||||
"number_of_dns_query_blocked_24_hours_by_sec": "Antalet DNS-förfrågningar som blockerades av AdGuards modul för surfsäkerhet",
|
"number_of_dns_query_blocked_24_hours_by_sec": "Antalet DNS-förfrågningar som blockerades av AdGuards modul för surfsäkerhet",
|
||||||
"number_of_dns_query_blocked_24_hours_adult": "Antalet vuxensajter som blockerats",
|
"number_of_dns_query_blocked_24_hours_adult": "Antalet vuxensajter som blockerats",
|
||||||
"enforced_save_search": "Aktivering av Säker surf",
|
"enforced_save_search": "Genomdrev SafeSearch",
|
||||||
"number_of_dns_query_to_safe_search": "Antalet DNS-förfrågningar mot sökmotorer där Säker surf tvingats",
|
"number_of_dns_query_to_safe_search": "Antalet DNS-förfrågningar till sökmotorer för vilka SafeSearch genomdrevs",
|
||||||
"average_processing_time": "Genomsnittlig processtid",
|
"average_processing_time": "Genomsnittlig processtid",
|
||||||
"average_upstream_response_time": "Genomsnittlig svarstid uppströmsserver",
|
"average_upstream_response_time": "Genomsnittlig svarstid uppströmsserver",
|
||||||
"response_time": "Svarstid",
|
"response_time": "Svarstid",
|
||||||
@@ -153,7 +153,7 @@
|
|||||||
"use_adguard_browsing_sec_hint": "AdGuard Home kommer att kontrollera om en domän är blockerad av webbservicen surfsäkerhet. Med en integritetsvänlig metod görs en API-lookup för att kontrollera: endast ett kort prefix i domännamnet SHA256 hash skickas till servern.",
|
"use_adguard_browsing_sec_hint": "AdGuard Home kommer att kontrollera om en domän är blockerad av webbservicen surfsäkerhet. Med en integritetsvänlig metod görs en API-lookup för att kontrollera: endast ett kort prefix i domännamnet SHA256 hash skickas till servern.",
|
||||||
"use_adguard_parental": "Använda AdGuards webbservice för föräldrakontroll",
|
"use_adguard_parental": "Använda AdGuards webbservice för föräldrakontroll",
|
||||||
"use_adguard_parental_hint": "AdGuard Home kommer att kontrollera domäner för innehåll av vuxenmaterial . Samma integritetsvänliga metod för API-lookup som tillämpas i webbservicens surfsäkerhet används.",
|
"use_adguard_parental_hint": "AdGuard Home kommer att kontrollera domäner för innehåll av vuxenmaterial . Samma integritetsvänliga metod för API-lookup som tillämpas i webbservicens surfsäkerhet används.",
|
||||||
"enforce_safe_search": "Använd säker webbsökning",
|
"enforce_safe_search": "Använd SafeSearch",
|
||||||
"enforce_save_search_hint": "AdGuard Home kommer tvinga säker surf på följande sökmotorer: Google, Youtube, Bing, DuckDuckGo, Yandex, Pixabay.",
|
"enforce_save_search_hint": "AdGuard Home kommer tvinga säker surf på följande sökmotorer: Google, Youtube, Bing, DuckDuckGo, Yandex, Pixabay.",
|
||||||
"no_servers_specified": "Inga servrar angivna",
|
"no_servers_specified": "Inga servrar angivna",
|
||||||
"general_settings": "Allmänna inställningar",
|
"general_settings": "Allmänna inställningar",
|
||||||
@@ -236,6 +236,7 @@
|
|||||||
"updated_upstream_dns_toast": "Sparade uppströms dns-servrar",
|
"updated_upstream_dns_toast": "Sparade uppströms dns-servrar",
|
||||||
"dns_test_ok_toast": "Angivna DNS servrar fungerar korrekt",
|
"dns_test_ok_toast": "Angivna DNS servrar fungerar korrekt",
|
||||||
"dns_test_not_ok_toast": "Server \"{{key}}\": kunde inte användas. Var snäll och kolla att du skrivit in rätt",
|
"dns_test_not_ok_toast": "Server \"{{key}}\": kunde inte användas. Var snäll och kolla att du skrivit in rätt",
|
||||||
|
"dns_test_parsing_error_toast": "Avsnitt {{section}}: rad {{line}}: kunde inte användas, kontrollera att du har skrivit det korrekt",
|
||||||
"dns_test_warning_toast": "Uppströms \"{{key}}\" svarar inte på testförfrågningar och kanske inte fungerar korrekt",
|
"dns_test_warning_toast": "Uppströms \"{{key}}\" svarar inte på testförfrågningar och kanske inte fungerar korrekt",
|
||||||
"unblock": "Avblockera",
|
"unblock": "Avblockera",
|
||||||
"block": "Blockera",
|
"block": "Blockera",
|
||||||
@@ -243,6 +244,7 @@
|
|||||||
"allow_this_client": "Tillåt den här klienten",
|
"allow_this_client": "Tillåt den här klienten",
|
||||||
"block_for_this_client_only": "Blockera endast för denna klient",
|
"block_for_this_client_only": "Blockera endast för denna klient",
|
||||||
"unblock_for_this_client_only": "Avblockera endast för denna klient",
|
"unblock_for_this_client_only": "Avblockera endast för denna klient",
|
||||||
|
"add_persistent_client": "Lägg till som beständig klient",
|
||||||
"time_table_header": "Tid",
|
"time_table_header": "Tid",
|
||||||
"date": "Datum",
|
"date": "Datum",
|
||||||
"domain_name_table_header": "Domännamn",
|
"domain_name_table_header": "Domännamn",
|
||||||
@@ -459,8 +461,9 @@
|
|||||||
"form_enter_mac": "Skriv in MAC",
|
"form_enter_mac": "Skriv in MAC",
|
||||||
"form_enter_id": "Ange identifierare",
|
"form_enter_id": "Ange identifierare",
|
||||||
"form_add_id": "Lägg till identifierare",
|
"form_add_id": "Lägg till identifierare",
|
||||||
"form_client_name": "Skriv in klientnamn",
|
"form_client_name": "Ange klientnamn",
|
||||||
"name": "Namn",
|
"name": "Namn",
|
||||||
|
"client_name": "Klient {{id}}",
|
||||||
"client_global_settings": "Använda globala inställningar",
|
"client_global_settings": "Använda globala inställningar",
|
||||||
"client_deleted": "Klient \"{{key}}\" har raderats",
|
"client_deleted": "Klient \"{{key}}\" har raderats",
|
||||||
"client_added": "Klient \"{{key}}\" har lagts till",
|
"client_added": "Klient \"{{key}}\" har lagts till",
|
||||||
@@ -654,7 +657,7 @@
|
|||||||
"cache_optimistic": "Optimistisk cachning",
|
"cache_optimistic": "Optimistisk cachning",
|
||||||
"cache_optimistic_desc": "Få AdGuard Home att svara från cachen även när posterna har gått ut och försök även uppdatera dem.",
|
"cache_optimistic_desc": "Få AdGuard Home att svara från cachen även när posterna har gått ut och försök även uppdatera dem.",
|
||||||
"filter_category_general": "Allmänt",
|
"filter_category_general": "Allmänt",
|
||||||
"filter_category_security": "säkerhet",
|
"filter_category_security": "Säkerhet",
|
||||||
"filter_category_regional": "Regional",
|
"filter_category_regional": "Regional",
|
||||||
"filter_category_other": "Övrigt",
|
"filter_category_other": "Övrigt",
|
||||||
"filter_category_general_desc": "Listor som blockerar spårning och reklam på de flesta enheterna",
|
"filter_category_general_desc": "Listor som blockerar spårning och reklam på de flesta enheterna",
|
||||||
@@ -671,7 +674,6 @@
|
|||||||
"use_saved_key": "Använd den tidigare sparade nyckeln",
|
"use_saved_key": "Använd den tidigare sparade nyckeln",
|
||||||
"parental_control": "Föräldrakontroll",
|
"parental_control": "Föräldrakontroll",
|
||||||
"safe_browsing": "Säker surfning",
|
"safe_browsing": "Säker surfning",
|
||||||
"served_from_cache": "{{value}} <i>(levereras från cache)</i>",
|
|
||||||
"form_error_password_length": "Lösenordet måste vara {{min}} till {{max}} tecken långt",
|
"form_error_password_length": "Lösenordet måste vara {{min}} till {{max}} tecken långt",
|
||||||
"anonymizer_notification": "<0>Observera:</0> IP-anonymisering är aktiverad. Du kan inaktivera den i <1>Allmänna inställningar</1>.",
|
"anonymizer_notification": "<0>Observera:</0> IP-anonymisering är aktiverad. Du kan inaktivera den i <1>Allmänna inställningar</1>.",
|
||||||
"confirm_dns_cache_clear": "Är du säker på att du vill rensa DNS-cache?",
|
"confirm_dns_cache_clear": "Är du säker på att du vill rensa DNS-cache?",
|
||||||
|
|||||||
@@ -46,6 +46,7 @@
|
|||||||
"settings": "การตั้งค่า",
|
"settings": "การตั้งค่า",
|
||||||
"filters": "ตัวกรอง",
|
"filters": "ตัวกรอง",
|
||||||
"query_log": "บันทึกการสืบค้น",
|
"query_log": "บันทึกการสืบค้น",
|
||||||
|
"nothing_found": "ไม่พบอะไร",
|
||||||
"faq": "คำถามที่พบบ่อย",
|
"faq": "คำถามที่พบบ่อย",
|
||||||
"version": "รุ่น",
|
"version": "รุ่น",
|
||||||
"address": "ที่อยู่",
|
"address": "ที่อยู่",
|
||||||
@@ -349,7 +350,7 @@
|
|||||||
"statistics_configuration": "การกำหนดค่าสถิติ",
|
"statistics_configuration": "การกำหนดค่าสถิติ",
|
||||||
"statistics_retention": "การเก็บรักษาสถิติ",
|
"statistics_retention": "การเก็บรักษาสถิติ",
|
||||||
"statistics_retention_desc": "หากคุณลดค่าช่วงเวลาข้อมูลบางอย่างจะหายไป",
|
"statistics_retention_desc": "หากคุณลดค่าช่วงเวลาข้อมูลบางอย่างจะหายไป",
|
||||||
"statistics_clear": " ล้างค่าสถิติ",
|
"statistics_clear": "ล้างสถิติ",
|
||||||
"statistics_clear_confirm": "คุณแน่ใจหรือไม่ว่าต้องการล้างสถิติ?",
|
"statistics_clear_confirm": "คุณแน่ใจหรือไม่ว่าต้องการล้างสถิติ?",
|
||||||
"statistics_retention_confirm": "คุณแน่ใจหรือไม่ว่าต้องการเปลี่ยนการเก็บรักษาสถิติ? หากคุณลดค่าช่วงเวลา ข้อมูลบางอย่างจะหายไป",
|
"statistics_retention_confirm": "คุณแน่ใจหรือไม่ว่าต้องการเปลี่ยนการเก็บรักษาสถิติ? หากคุณลดค่าช่วงเวลา ข้อมูลบางอย่างจะหายไป",
|
||||||
"statistics_cleared": "สถิติได้ถูกล้างเรียบร้อยแล้ว",
|
"statistics_cleared": "สถิติได้ถูกล้างเรียบร้อยแล้ว",
|
||||||
@@ -390,10 +391,13 @@
|
|||||||
"check_title": "ตรวจสอบการกรอง",
|
"check_title": "ตรวจสอบการกรอง",
|
||||||
"check_desc": "ตรวจสอบว่าชื่อโฮสต์ถูกกรอง",
|
"check_desc": "ตรวจสอบว่าชื่อโฮสต์ถูกกรอง",
|
||||||
"form_enter_host": "ป้อนชื่อโฮสต์",
|
"form_enter_host": "ป้อนชื่อโฮสต์",
|
||||||
"show_processed_responses": "การประมวลผล",
|
"show_blocked_responses": "ปิดกั้นแล้ว",
|
||||||
|
"show_whitelisted_responses": "รายการที่อนุญาต",
|
||||||
|
"show_processed_responses": "ประมวลผลแล้ว",
|
||||||
"blocked_adult_websites": "ถูกปิดกั้นโดยการควบคุมของผู้ปกครอง",
|
"blocked_adult_websites": "ถูกปิดกั้นโดยการควบคุมของผู้ปกครอง",
|
||||||
"safe_search": "ค้นหาอย่างปลอดภัย",
|
"safe_search": "ค้นหาอย่างปลอดภัย",
|
||||||
"blocklist": "บัญชีดำ",
|
"blocklist": "บัญชีดำ",
|
||||||
|
"allowed": "รายการที่อนุญาต",
|
||||||
"filter_category_other": "อื่น ๆ",
|
"filter_category_other": "อื่น ๆ",
|
||||||
"parental_control": "ควบคุมโดยผู้ปกครอง",
|
"parental_control": "ควบคุมโดยผู้ปกครอง",
|
||||||
"sunday_short": "อาทิตย์",
|
"sunday_short": "อาทิตย์",
|
||||||
|
|||||||
@@ -6,21 +6,21 @@
|
|||||||
"upstream_parallel": "Tüm üst sunucuları eş zamanlı sorgulayarak çözümlemeyi hızlandırmak için paralel sorgular kullanın.",
|
"upstream_parallel": "Tüm üst sunucuları eş zamanlı sorgulayarak çözümlemeyi hızlandırmak için paralel sorgular kullanın.",
|
||||||
"parallel_requests": "Paralel istekler",
|
"parallel_requests": "Paralel istekler",
|
||||||
"load_balancing": "Yük dengeleme",
|
"load_balancing": "Yük dengeleme",
|
||||||
"load_balancing_desc": "Her seferde bir üst sunucuyu sorgulayın. AdGuard Home, sunucuyu seçmek için ağırlıklı rastgele algoritmasını kullanır, böylece en hızlı sunucu daha sık kullanılır.",
|
"load_balancing_desc": "Aynı anda bir üst kaynak sunucusunu sorgulayın. AdGuard Home, en düşük başarısız arama sayısına ve en düşük ortalama arama süresine sahip sunucuları seçmek için ağırlıklı rastgele bir algoritma kullanır.",
|
||||||
"bootstrap_dns": "DNS Önyükleme sunucuları",
|
"bootstrap_dns": "DNS Önyükleme sunucuları",
|
||||||
"bootstrap_dns_desc": "Üst kaynak olarak belirttiğiniz DoH/DoT çözümleyicilerin IP adreslerini çözümlemek için kullanılan DNS sunucularının IP adresleri. Yorumlara izin verilmez.",
|
"bootstrap_dns_desc": "Üst kaynak olarak belirttiğiniz DoH/DoT çözümleyicilerin IP adreslerini çözümlemek için kullanılan DNS sunucularının IP adresleri. Yorumlara izin verilmez.",
|
||||||
"fallback_dns_title": "Yedek DNS sunucuları",
|
"fallback_dns_title": "Yedek DNS sunucuları",
|
||||||
"fallback_dns_desc": "Yukarı akış DNS sunucuları yanıt vermediğinde kullanılan yedek DNS sunucularının listesi. Söz dizimi yukarıdaki ana üst kaynak alanıyla aynıdır.",
|
"fallback_dns_desc": "Yukarı akış DNS sunucuları yanıt vermediğinde kullanılan yedek DNS sunucularının listesi. Söz dizimi yukarıdaki ana üst kaynak alanıyla aynıdır.",
|
||||||
"fallback_dns_placeholder": "Her satıra bir yedek DNS sunucusu girin",
|
"fallback_dns_placeholder": "Her satıra bir yedek DNS sunucusu girin",
|
||||||
"local_ptr_title": "Özel ters DNS sunucuları",
|
"local_ptr_title": "Özel ters DNS sunucuları",
|
||||||
"local_ptr_desc": "AdGuard Home'un yerel PTR sorguları için kullandığı DNS sunucuları. Bu sunucular, rDNS kullanarak, örneğin \"192.168.12.34\" gibi özel IP aralıklarındaki adresler için PTR isteklerini çözmek için kullanılır. Ayarlanmadığı durumda AdGuard Home, işletim sisteminizin varsayılan DNS çözümleme adreslerini kullanır.",
|
"local_ptr_desc": "AdGuard Home tarafından özel PTR, SOA ve NS istekleri için kullanılan DNS sunucuları. Bir istek, özel IP aralıkları (\"192.168.12.34\" gibi) içinde bir alt ağ içeren bir ARPA alan adı ister ve özel IP adresine sahip bir istemciden gelirse özel olarak kabul edilir. Ayarlanmadığı durumda AdGuard Home, IP adresleri dışında işletim sisteminizin varsayılan DNS çözümleyicileri kullanılır.",
|
||||||
"local_ptr_default_resolver": "AdGuard Home, varsayılan olarak aşağıdaki ters DNS çözümleyicilerini kullanır: {{ip}}.",
|
"local_ptr_default_resolver": "AdGuard Home, varsayılan olarak aşağıdaki ters DNS çözümleyicilerini kullanır: {{ip}}.",
|
||||||
"local_ptr_no_default_resolver": "AdGuard Home, bu sistem için uygun olan özel ters DNS çözümleyicilerini belirleyemedi.",
|
"local_ptr_no_default_resolver": "AdGuard Home, bu sistem için uygun olan özel ters DNS çözümleyicilerini belirleyemedi.",
|
||||||
"local_ptr_placeholder": "Her satıra bir IP adresi girin",
|
"local_ptr_placeholder": "Her satıra bir IP adresi girin",
|
||||||
"resolve_clients_title": "İstemcilerin IP adreslerinin ters çözümlenmesini etkinleştir",
|
"resolve_clients_title": "İstemcilerin IP adreslerinin ters çözümlenmesini etkinleştir",
|
||||||
"resolve_clients_desc": "Karşılık gelen çözümleyicilere (yerel istemciler için özel DNS sunucuları, genel IP adresleri olan istemciler için üst sunucuları) PTR sorguları göndererek istemcilerin IP adreslerini ana makine adlarının tersine çözün.",
|
"resolve_clients_desc": "Karşılık gelen çözümleyicilere (yerel istemciler için özel DNS sunucuları, genel IP adresleri olan istemciler için üst sunucuları) PTR sorguları göndererek istemcilerin IP adreslerini ana makine adlarının tersine çözün.",
|
||||||
"use_private_ptr_resolvers_title": "Özel ters DNS çözümleyicileri kullan",
|
"use_private_ptr_resolvers_title": "Özel ters DNS çözümleyicileri kullan",
|
||||||
"use_private_ptr_resolvers_desc": "Bu üst kaynak sunucularını kullanarak yerel olarak sunulan adresler için ters DNS aramaları yapın. Devre dışı bırakılırsa, AdGuard Home, DHCP, /etc/hosts, vb. tarafından bilinen istemciler dışında bu tür tüm PTR isteklerine NXDOMAIN ile yanıt verir.",
|
"use_private_ptr_resolvers_desc": "Özel üst kaynak sunucuları, DHCP, /etc/hosts, vb. aracılığıyla özel IP adresleri içeren ARPA alan adları için PTR, SOA ve NS isteklerini çözümleyin. Devre dışı bırakılırsa, AdGuard Home bu tür tüm isteklere NXDOMAIN ile yanıt verir.",
|
||||||
"check_dhcp_servers": "DHCP sunucularını denetle",
|
"check_dhcp_servers": "DHCP sunucularını denetle",
|
||||||
"save_config": "Yapılandırmayı kaydet",
|
"save_config": "Yapılandırmayı kaydet",
|
||||||
"enabled_dhcp": "DHCP sunucusu etkinleştirildi",
|
"enabled_dhcp": "DHCP sunucusu etkinleştirildi",
|
||||||
@@ -40,11 +40,11 @@
|
|||||||
"dhcp_ipv4_settings": "DHCP IPv4 Ayarları",
|
"dhcp_ipv4_settings": "DHCP IPv4 Ayarları",
|
||||||
"dhcp_ipv6_settings": "DHCP IPv6 Ayarları",
|
"dhcp_ipv6_settings": "DHCP IPv6 Ayarları",
|
||||||
"form_error_required": "Gerekli alan",
|
"form_error_required": "Gerekli alan",
|
||||||
"form_error_ip4_format": "Geçersiz IPv4 adresi",
|
"form_error_ip4_format": "IPv4 adresi geçersiz",
|
||||||
"form_error_ip4_gateway_format": "Geçersiz ağ geçidi IPv4 adresi",
|
"form_error_ip4_gateway_format": "Ağ geçidi IPv4 adresi geçersiz",
|
||||||
"form_error_ip6_format": "Geçersiz IPv6 adresi",
|
"form_error_ip6_format": "IPv6 adresi geçersiz",
|
||||||
"form_error_ip_format": "Geçersiz IP adresi",
|
"form_error_ip_format": "IP adresi geçersiz",
|
||||||
"form_error_mac_format": "Geçersiz MAC adresi",
|
"form_error_mac_format": "MAC adresi geçersiz",
|
||||||
"form_error_client_id_format": "İstemci Kimliği yalnızca sayılar, küçük harfler ve kısa çizgiler içermelidir",
|
"form_error_client_id_format": "İstemci Kimliği yalnızca sayılar, küçük harfler ve kısa çizgiler içermelidir",
|
||||||
"form_error_server_name": "Sunucu adı geçersiz",
|
"form_error_server_name": "Sunucu adı geçersiz",
|
||||||
"form_error_subnet": "\"{{cidr}}\" alt ağı, \"{{ip}}\" IP adresini içermiyor",
|
"form_error_subnet": "\"{{cidr}}\" alt ağı, \"{{ip}}\" IP adresini içermiyor",
|
||||||
@@ -68,7 +68,7 @@
|
|||||||
"ip": "IP",
|
"ip": "IP",
|
||||||
"dhcp_table_hostname": "Ana makine Adı",
|
"dhcp_table_hostname": "Ana makine Adı",
|
||||||
"dhcp_table_expires": "Bitiş tarihi",
|
"dhcp_table_expires": "Bitiş tarihi",
|
||||||
"dhcp_warning": "DHCP sunucusunu yine de etkinleştirmek istiyorsanız, ağınızda başka aktif DHCP sunucusu olmadığından emin olun, aksi takdirde ağa bağlı cihazların İnternet bağlantısı kesilebilir!",
|
"dhcp_warning": "DHCP sunucusunu yine de etkinleştirmek istiyorsanız, ağınızda başka bir aktif DHCP sunucusu olmadığından emin olun, aksi takdirde ağa bağlı cihazların internet bağlantısı kesilebilir!",
|
||||||
"dhcp_error": "AdGuard Home, ağda başka bir etkin DHCP sunucusu olup olmadığını belirleyemedi",
|
"dhcp_error": "AdGuard Home, ağda başka bir etkin DHCP sunucusu olup olmadığını belirleyemedi",
|
||||||
"dhcp_static_ip_error": "DHCP sunucusunu kullanmak için sabit bir IP adresi ayarlanmalıdır. AdGuard Home, bu ağ arayüzünün sabit bir IP adresi kullanılarak yapılandırılıp yapılandırılmadığını belirleyemedi. Lütfen sabit IP adresini elle ayarlayın.",
|
"dhcp_static_ip_error": "DHCP sunucusunu kullanmak için sabit bir IP adresi ayarlanmalıdır. AdGuard Home, bu ağ arayüzünün sabit bir IP adresi kullanılarak yapılandırılıp yapılandırılmadığını belirleyemedi. Lütfen sabit IP adresini elle ayarlayın.",
|
||||||
"dhcp_dynamic_ip_found": "Sisteminiz, <0>{{interfaceName}}</0> arayüzü için dinamik IP adresi yapılandırması kullanıyor. DHCP sunucusunu kullanmak için sabit bir IP adresi ayarlanmalıdır. Geçerli olan IP adresiniz <0>{{ipAddress}}</0>. \"DHCP sunucusunu etkinleştir\" düğmesine basarsanız, AdGuard Home bu IP adresini otomatik bir şekilde sabit olarak ayarlayacaktır.",
|
"dhcp_dynamic_ip_found": "Sisteminiz, <0>{{interfaceName}}</0> arayüzü için dinamik IP adresi yapılandırması kullanıyor. DHCP sunucusunu kullanmak için sabit bir IP adresi ayarlanmalıdır. Geçerli olan IP adresiniz <0>{{ipAddress}}</0>. \"DHCP sunucusunu etkinleştir\" düğmesine basarsanız, AdGuard Home bu IP adresini otomatik bir şekilde sabit olarak ayarlayacaktır.",
|
||||||
@@ -147,14 +147,14 @@
|
|||||||
"average_upstream_response_time": "Ortalama üst kaynak yanıt süresi",
|
"average_upstream_response_time": "Ortalama üst kaynak yanıt süresi",
|
||||||
"response_time": "Yanıt süresi",
|
"response_time": "Yanıt süresi",
|
||||||
"average_processing_time_hint": "Bir DNS isteğinin milisaniye cinsinden ortalama işlem süresi",
|
"average_processing_time_hint": "Bir DNS isteğinin milisaniye cinsinden ortalama işlem süresi",
|
||||||
"block_domain_use_filters_and_hosts": "Filtre ve hosts dosyalarını kullanarak alan adlarını engelle",
|
"block_domain_use_filters_and_hosts": "Filtre ve ana bilgisayar dosyalarını kullanarak alan adlarını engelle",
|
||||||
"filters_block_toggle_hint": "<a>Filtreler</a> ayarlarında engelleme kuralları oluşturabilirsiniz.",
|
"filters_block_toggle_hint": "<a>Filtreler</a> ayarlarında engelleme kuralları oluşturabilirsiniz.",
|
||||||
"use_adguard_browsing_sec": "AdGuard gezinti koruması web hizmetini kullan",
|
"use_adguard_browsing_sec": "AdGuard gezinti koruması web hizmetini kullan",
|
||||||
"use_adguard_browsing_sec_hint": "AdGuard Home, alan adının gezinti koruması web hizmeti tarafından engellenip engellenmediğini kontrol eder. Kontrolü gerçekleştirmek için gizlilik dostu arama API'sini kullanır: sunucuya yalnızca SHA256 karma alan adının kısa bir ön eki gönderilir.",
|
"use_adguard_browsing_sec_hint": "AdGuard Home, alan adının gezinti koruması web hizmeti tarafından engellenip engellenmediğini kontrol eder. Kontrolü gerçekleştirmek için gizlilik dostu arama API'sini kullanır: sunucuya yalnızca SHA256 karma alan adının kısa bir ön eki gönderilir.",
|
||||||
"use_adguard_parental": "AdGuard ebeveyn denetimi web hizmetini kullan",
|
"use_adguard_parental": "AdGuard ebeveyn denetimi web hizmetini kullan",
|
||||||
"use_adguard_parental_hint": "AdGuard Home, alan adının yetişkin içerik bulundurup bulundurmadığını kontrol eder. Gezinti koruması web hizmeti ile kullandığımız aynı gizlilik dostu API'yi kullanır.",
|
"use_adguard_parental_hint": "AdGuard Home, alan adının yetişkin içerik bulundurup bulundurmadığını kontrol eder. Gezinti koruması web hizmeti ile kullandığımız aynı gizlilik dostu API'yi kullanır.",
|
||||||
"enforce_safe_search": "Güvenli Aramayı kullan",
|
"enforce_safe_search": "Güvenli aramayı kullan",
|
||||||
"enforce_save_search_hint": "AdGuard Home, şu arama motorlarında güvenli aramayı uygular: Google, YouTube, Bing, DuckDuckGo, Yandex ve Pixabay.",
|
"enforce_save_search_hint": "AdGuard Home, şu arama motorlarında güvenli aramayı uygular: Google, YouTube, Bing, DuckDuckGo, Ecosia, Yandex, Pixabay.",
|
||||||
"no_servers_specified": "Sunucu belirtilmedi",
|
"no_servers_specified": "Sunucu belirtilmedi",
|
||||||
"general_settings": "Genel ayarlar",
|
"general_settings": "Genel ayarlar",
|
||||||
"dns_settings": "DNS ayarları",
|
"dns_settings": "DNS ayarları",
|
||||||
@@ -236,6 +236,7 @@
|
|||||||
"updated_upstream_dns_toast": "Üst sunucular başarıyla kaydedildi",
|
"updated_upstream_dns_toast": "Üst sunucular başarıyla kaydedildi",
|
||||||
"dns_test_ok_toast": "Belirtilen DNS sunucuları düzgün çalışıyor",
|
"dns_test_ok_toast": "Belirtilen DNS sunucuları düzgün çalışıyor",
|
||||||
"dns_test_not_ok_toast": "Sunucu \"{{key}}\": kullanılamıyor, lütfen doğru yazdığınızdan emin olun",
|
"dns_test_not_ok_toast": "Sunucu \"{{key}}\": kullanılamıyor, lütfen doğru yazdığınızdan emin olun",
|
||||||
|
"dns_test_parsing_error_toast": "{{section}} bölümü: {{line}}. satır: kullanılamadı, lütfen doğru yazdığınızı kontrol edin",
|
||||||
"dns_test_warning_toast": "Üst kaynak \"{{key}}\", test isteklerine yanıt vermiyor ve düzgün çalışmayabilir",
|
"dns_test_warning_toast": "Üst kaynak \"{{key}}\", test isteklerine yanıt vermiyor ve düzgün çalışmayabilir",
|
||||||
"unblock": "Engeli kaldır",
|
"unblock": "Engeli kaldır",
|
||||||
"block": "Engelle",
|
"block": "Engelle",
|
||||||
@@ -243,6 +244,7 @@
|
|||||||
"allow_this_client": "Bu istemciye izin ver",
|
"allow_this_client": "Bu istemciye izin ver",
|
||||||
"block_for_this_client_only": "Yalnızca bu istemci için engelle",
|
"block_for_this_client_only": "Yalnızca bu istemci için engelle",
|
||||||
"unblock_for_this_client_only": "Yalnızca bu istemci için engellemeyi kaldır",
|
"unblock_for_this_client_only": "Yalnızca bu istemci için engellemeyi kaldır",
|
||||||
|
"add_persistent_client": "Kalıcı istemci olarak ekle",
|
||||||
"time_table_header": "Saat",
|
"time_table_header": "Saat",
|
||||||
"date": "Tarih",
|
"date": "Tarih",
|
||||||
"domain_name_table_header": "Alan adı",
|
"domain_name_table_header": "Alan adı",
|
||||||
@@ -292,6 +294,9 @@
|
|||||||
"blocked_response_ttl": "Engellenen yanıt kullanım süresi",
|
"blocked_response_ttl": "Engellenen yanıt kullanım süresi",
|
||||||
"blocked_response_ttl_desc": "İstemcilerin filtrelenmiş bir yanıtı kaç saniye süreyle önbelleğe alması gerektiğini belirtir",
|
"blocked_response_ttl_desc": "İstemcilerin filtrelenmiş bir yanıtı kaç saniye süreyle önbelleğe alması gerektiğini belirtir",
|
||||||
"form_enter_blocked_response_ttl": "Engellenen yanıt kullanım süresini girin (saniye)",
|
"form_enter_blocked_response_ttl": "Engellenen yanıt kullanım süresini girin (saniye)",
|
||||||
|
"upstream_timeout": "Üst kaynak zaman aşımı",
|
||||||
|
"upstream_timeout_desc": "Üst kaynak sunucusundan yanıt almak için kaç saniye bekleneceğini belirtir",
|
||||||
|
"form_enter_upstream_timeout": "Üst kaynak sunucusu zaman aşımı süresini saniye cinsinden girin",
|
||||||
"dnscrypt": "DNSCrypt",
|
"dnscrypt": "DNSCrypt",
|
||||||
"dns_over_https": "DNS-over-HTTPS",
|
"dns_over_https": "DNS-over-HTTPS",
|
||||||
"dns_over_tls": "DNS-over-TLS",
|
"dns_over_tls": "DNS-over-TLS",
|
||||||
@@ -306,7 +311,7 @@
|
|||||||
"form_enter_rate_limit": "Sıklık limitini girin",
|
"form_enter_rate_limit": "Sıklık limitini girin",
|
||||||
"rate_limit": "Sıklık limiti",
|
"rate_limit": "Sıklık limiti",
|
||||||
"edns_enable": "EDNS istemci alt ağını etkinleştir",
|
"edns_enable": "EDNS istemci alt ağını etkinleştir",
|
||||||
"edns_cs_desc": "Kaynak yönü isteklerine EDNS İstemci Alt Ağı seçeneğini (ECS) ekleyin ve istemciler tarafından gönderilen değerleri sorgu günlüğüne kaydedin.",
|
"edns_cs_desc": "Üst sunucu isteklerine ECS (EDNS İstemci Alt Ağı) seçeneğini ekler ve istemciler tarafından gönderilen değerleri sorgu günlüğünde kaydeder.",
|
||||||
"edns_use_custom_ip": "EDNS için özel IP kullan",
|
"edns_use_custom_ip": "EDNS için özel IP kullan",
|
||||||
"edns_use_custom_ip_desc": "EDNS için özel IP kullanımına izin ver",
|
"edns_use_custom_ip_desc": "EDNS için özel IP kullanımına izin ver",
|
||||||
"rate_limit_desc": "İstemci başına izin verilen saniyedeki istek sayısı. 0 olarak ayarlamak, sınır olmadığı anlamına gelir.",
|
"rate_limit_desc": "İstemci başına izin verilen saniyedeki istek sayısı. 0 olarak ayarlamak, sınır olmadığı anlamına gelir.",
|
||||||
@@ -340,17 +345,17 @@
|
|||||||
"unknown_filter": "Bilinmeyen filtre {{filterId}}",
|
"unknown_filter": "Bilinmeyen filtre {{filterId}}",
|
||||||
"known_tracker": "Bilinen izleyici",
|
"known_tracker": "Bilinen izleyici",
|
||||||
"install_welcome_title": "AdGuard Home'a hoş geldiniz!",
|
"install_welcome_title": "AdGuard Home'a hoş geldiniz!",
|
||||||
"install_welcome_desc": "AdGuard Home, ağ genelinde reklamları ve izleyicileri engelleyen bir DNS sunucusudur. Tüm ağınızı ve tüm cihazlarınızı kontrol etmenizi sağlar, istemci tarafında herhangi bir program kullanmanıza gerek duymaz.",
|
"install_welcome_desc": "AdGuard Home, ağ genelinde reklam ve izleyici engelleyen bir DNS sunucusudur. Tüm ağınızı ve cihazlarınızı kontrol etmenizi sağlar ve istemci tarafında ek bir yazılım kullanmanıza gerek duymaz.",
|
||||||
"install_settings_title": "Yönetici Web Arayüzü",
|
"install_settings_title": "Yönetici Web Arayüzü",
|
||||||
"install_settings_listen": "Dinleme arayüzü",
|
"install_settings_listen": "Dinleme arayüzü",
|
||||||
"install_settings_port": "Bağlantı noktası",
|
"install_settings_port": "Bağlantı noktası",
|
||||||
"install_settings_interface_link": "AdGuard Home yönetici web arayüzünüz aşağıdaki adreslerde bulunacaktır:",
|
"install_settings_interface_link": "AdGuard Home yönetici web arayüzüne aşağıdaki adreslerden erişebilirsiniz:",
|
||||||
"form_error_port": "Geçerli bir bağlantı noktası değeri girin",
|
"form_error_port": "Geçerli bir bağlantı noktası değeri girin",
|
||||||
"install_settings_dns": "DNS sunucusu",
|
"install_settings_dns": "DNS sunucusu",
|
||||||
"install_settings_dns_desc": "Aşağıdaki adreslerde DNS sunucusunu kullanmak için cihazlarınızı veya yönlendiricinizi yapılandırmanız gerekir:",
|
"install_settings_dns_desc": "Cihazlarınızı veya yönlendiricinizi aşağıdaki adreslerdeki DNS sunucusunu kullanacak şekilde yapılandırmanız gerekir:",
|
||||||
"install_settings_all_interfaces": "Tüm arayüzler",
|
"install_settings_all_interfaces": "Tüm arayüzler",
|
||||||
"install_auth_title": "Kimlik Doğrulama",
|
"install_auth_title": "Kimlik Doğrulama",
|
||||||
"install_auth_desc": "AdGuard Home yönetim web arayüzü için şifre doğrulaması yapılandırılmalıdır. AdGuard Home'a yalnızca yerel ağınızdan erişilebilir olsa bile, onu sınırsız erişimden korumak yine de önemlidir.",
|
"install_auth_desc": "AdGuard Home yönetici web arayüzüne parola ile kimlik doğrulama yapılandırılmalıdır. AdGuard Home yalnızca yerel ağınızdan erişilebilir olsa bile, yine de yetkisiz erişime karşı korunması önemlidir.",
|
||||||
"install_auth_username": "Kullanıcı adı",
|
"install_auth_username": "Kullanıcı adı",
|
||||||
"install_auth_password": "Parola",
|
"install_auth_password": "Parola",
|
||||||
"install_auth_confirm": "Parolayı onayla",
|
"install_auth_confirm": "Parolayı onayla",
|
||||||
@@ -364,10 +369,10 @@
|
|||||||
"install_devices_router": "Yönlendirici",
|
"install_devices_router": "Yönlendirici",
|
||||||
"install_devices_router_desc": "Bu kurulum, ev yönlendiricinize bağlı tüm cihazları otomatik olarak kapsar ve her birini elle yapılandırmanıza gerek yoktur.",
|
"install_devices_router_desc": "Bu kurulum, ev yönlendiricinize bağlı tüm cihazları otomatik olarak kapsar ve her birini elle yapılandırmanıza gerek yoktur.",
|
||||||
"install_devices_address": "AdGuard Home DNS sunucusu aşağıdaki adresleri dinliyor",
|
"install_devices_address": "AdGuard Home DNS sunucusu aşağıdaki adresleri dinliyor",
|
||||||
"install_devices_router_list_1": "Yönlendiricinizin ayarlarına gidin. Genellikle tarayıcınızdan http://192.168.0.1/ veya http://192.168.1.1/ gibi bir URL aracılığıyla erişebilirsiniz. Bir parola girmeniz istenebilir. Hatırlamıyorsanız, genellikle yönlendiricinin üzerindeki bir düğmeye basarak parolayı sıfırlayabilirsiniz, ancak bu işlemin seçilmesi durumunda yüksek ihtimalle tüm yönlendirici yapılandırmasını kaybedeceğinizi unutmayın. Yönlendiricinizin kurulumu için bir uygulama gerekiyorsa, lütfen uygulamayı telefonunuza veya PC'nize yükleyin ve yönlendiricinin ayarlarına erişmek için kullanın.",
|
"install_devices_router_list_1": "Yönlendiricinizin ayarlarına gidin. Genellikle, tarayıcınızdan http://192.168.0.1/ veya http://192.168.1.1/ gibi bir URL üzerinden erişebilirsiniz. Giriş yaparken bir parola girmeniz istenebilir. Parolanızı hatırlamıyorsanız, genellikle yönlendiricinin üzerindeki bir düğmeye basarak parolayı sıfırlayabilirsiniz, ancak bu işlemi seçerseniz yönlendiricinin tüm yapılandırmasını kaybedebileceğinizi unutmayın. Yönlendiricinizin kurulumu için bir uygulama gerekiyorsa, lütfen uygulamayı telefonunuza veya bilgisayarınıza yükleyin ve yönlendiricinin ayarlarına erişmek için bu uygulamayı kullanın.",
|
||||||
"install_devices_router_list_2": "DHCP/DNS ayarlarını bulun. DNS satırlarını arayın, genelde iki veya üç tanedir, üç rakam girilebilen dört ayrı grup içeren satırdır.",
|
"install_devices_router_list_2": "DHCP/DNS ayarlarını bulun. DNS satırlarını arayın, genelde iki veya üç tanedir, üç rakam girilebilen dört ayrı grup içeren satırdır.",
|
||||||
"install_devices_router_list_3": "AdGuard Home sunucu adreslerinizi oraya girin.",
|
"install_devices_router_list_3": "AdGuard Home sunucu adreslerinizi oraya girin.",
|
||||||
"install_devices_router_list_4": "Bazı yönlendirici türlerinde özel bir DNS sunucusu ayarlanamaz. Bu durumda, AdGuard Home'u <0>DHCP sunucusu</0> olarak ayarlamak yardımcı olabilir. Aksi takdirde, yönlendirici modeliniz için DNS sunucularını nasıl ayarlayacağınız konusunda yönlendirici kılavuzuna bakmalısınız.",
|
"install_devices_router_list_4": "Bazı yönlendirici türlerinde özel bir DNS sunucusu yapılandırılamaz. Bu durumda, AdGuard Home'u bir <0>DHCP sunucusu</0> olarak yapılandırmak yardımcı olabilir. Aksi takdirde, yönlendirici modelinizde DNS sunucularını nasıl özelleştireceğinizi öğrenmek için yönlendirici kılavuzunu kontrol etmelisiniz.",
|
||||||
"install_devices_windows_list_1": "Başlat menüsünden veya Windows araması aracılığıyla Denetim Masası'nı açın.",
|
"install_devices_windows_list_1": "Başlat menüsünden veya Windows araması aracılığıyla Denetim Masası'nı açın.",
|
||||||
"install_devices_windows_list_2": "Ağ ve İnternet kategorisine girin ve ardından Ağ ve Paylaşım Merkezi'ne girin.",
|
"install_devices_windows_list_2": "Ağ ve İnternet kategorisine girin ve ardından Ağ ve Paylaşım Merkezi'ne girin.",
|
||||||
"install_devices_windows_list_3": "Sol panelde \"Bağdaştırıcı ayarlarını değiştirin\" öğesine tıklayın.",
|
"install_devices_windows_list_3": "Sol panelde \"Bağdaştırıcı ayarlarını değiştirin\" öğesine tıklayın.",
|
||||||
@@ -387,7 +392,7 @@
|
|||||||
"install_devices_ios_list_2": "Sol menüde bulunan Wi-Fi bölümüne girin (telefon ağlar için özel DNS sunucusu ayarlanamaz).",
|
"install_devices_ios_list_2": "Sol menüde bulunan Wi-Fi bölümüne girin (telefon ağlar için özel DNS sunucusu ayarlanamaz).",
|
||||||
"install_devices_ios_list_3": "O anda aktif olan ağın adına dokunun.",
|
"install_devices_ios_list_3": "O anda aktif olan ağın adına dokunun.",
|
||||||
"install_devices_ios_list_4": "DNS alanına AdGuard Home sunucunuzun adreslerini girin.",
|
"install_devices_ios_list_4": "DNS alanına AdGuard Home sunucunuzun adreslerini girin.",
|
||||||
"get_started": "Başlayın",
|
"get_started": "Başla",
|
||||||
"next": "Sonraki",
|
"next": "Sonraki",
|
||||||
"open_dashboard": "Panoyu Aç",
|
"open_dashboard": "Panoyu Aç",
|
||||||
"install_saved": "Başarıyla kaydedildi",
|
"install_saved": "Başarıyla kaydedildi",
|
||||||
@@ -423,6 +428,9 @@
|
|||||||
"encryption_hostnames": "Ana makine adları",
|
"encryption_hostnames": "Ana makine adları",
|
||||||
"encryption_reset": "Şifreleme ayarlarını sıfırlamak istediğinizden emin misiniz?",
|
"encryption_reset": "Şifreleme ayarlarını sıfırlamak istediğinizden emin misiniz?",
|
||||||
"encryption_warning": "Uyarı",
|
"encryption_warning": "Uyarı",
|
||||||
|
"encryption_plain_dns_enable": "Düz DNS'i etkinleştir",
|
||||||
|
"encryption_plain_dns_desc": "Düz DNS varsayılan olarak etkindir. Tüm aygıtları şifrelenmiş DNS kullanmaya zorlamak için bunu devre dışı bırakabilirsiniz. Bunu yapmak için en az bir şifrelenmiş DNS protokolünü etkinleştirmeniz gerekir",
|
||||||
|
"encryption_plain_dns_error": "Düz DNS'i devre dışı bırakmak için en az bir şifrelenmiş DNS protokolünü etkinleştirin",
|
||||||
"topline_expiring_certificate": "SSL sertifikanızın süresi sona üzere. <0>Şifreleme ayarlarını</0> güncelleyin.",
|
"topline_expiring_certificate": "SSL sertifikanızın süresi sona üzere. <0>Şifreleme ayarlarını</0> güncelleyin.",
|
||||||
"topline_expired_certificate": "SSL sertifikanızın süresi sona erdi. <0>Şifreleme ayarlarını</0> güncelleyin.",
|
"topline_expired_certificate": "SSL sertifikanızın süresi sona erdi. <0>Şifreleme ayarlarını</0> güncelleyin.",
|
||||||
"form_error_port_range": "80-65535 aralığında geçerli bir bağlantı noktası değeri girin",
|
"form_error_port_range": "80-65535 aralığında geçerli bir bağlantı noktası değeri girin",
|
||||||
@@ -447,14 +455,14 @@
|
|||||||
"settings_global": "Genel",
|
"settings_global": "Genel",
|
||||||
"settings_custom": "Özel",
|
"settings_custom": "Özel",
|
||||||
"table_client": "İstemci",
|
"table_client": "İstemci",
|
||||||
"table_name": "AdAdı",
|
"table_name": "Ad",
|
||||||
"save_btn": "Kaydet",
|
"save_btn": "Kaydet",
|
||||||
"client_add": "İstemci Ekle",
|
"client_add": "İstemci Ekle",
|
||||||
"client_new": "Yeni İstemci",
|
"client_new": "Yeni İstemci",
|
||||||
"client_edit": "İstemciyi Düzenle",
|
"client_edit": "İstemciyi Düzenle",
|
||||||
"client_identifier": "Tanımlayıcı",
|
"client_identifier": "Tanımlayıcı",
|
||||||
"ip_address": "IP adresi",
|
"ip_address": "IP adresi",
|
||||||
"client_identifier_desc": "İstemciler IP adresleri, CIDR, MAC adresleri veya ClientID (DoT/DoH/DoQ için kullanılabilir) ile tanımlanabilir. İstemcileri nasıl tanımlayacağınız hakkında daha fazla bilgiyi <0>buradan</0> edinebilirsiniz.",
|
"client_identifier_desc": "İstemciler, IP adresi, CIDR, MAC adresi veya ClientID (DoT/DoH/DoQ için kullanılabilir) ile tanımlanabilir. İstemcileri nasıl tanımlayacağınız hakkında daha fazla bilgiye <0>buradan</0> ulaşabilirsiniz.",
|
||||||
"form_enter_ip": "IP girin",
|
"form_enter_ip": "IP girin",
|
||||||
"form_enter_subnet_ip": "\"{{cidr}}\" alt ağına bir IP adresi girin",
|
"form_enter_subnet_ip": "\"{{cidr}}\" alt ağına bir IP adresi girin",
|
||||||
"form_enter_mac": "MAC adresi girin",
|
"form_enter_mac": "MAC adresi girin",
|
||||||
@@ -462,6 +470,7 @@
|
|||||||
"form_add_id": "Tanımlayıcı ekle",
|
"form_add_id": "Tanımlayıcı ekle",
|
||||||
"form_client_name": "İstemci ismi girin",
|
"form_client_name": "İstemci ismi girin",
|
||||||
"name": "Adı",
|
"name": "Adı",
|
||||||
|
"client_name": "İstemci {{id}}",
|
||||||
"client_global_settings": "Genel ayarları kullan",
|
"client_global_settings": "Genel ayarları kullan",
|
||||||
"client_deleted": "\"{{key}}\" istemcisi başarıyla silindi",
|
"client_deleted": "\"{{key}}\" istemcisi başarıyla silindi",
|
||||||
"client_added": "\"{{key}}\" istemcisi başarıyla eklendi",
|
"client_added": "\"{{key}}\" istemcisi başarıyla eklendi",
|
||||||
@@ -470,7 +479,7 @@
|
|||||||
"client_confirm_delete": "\"{{key}}\" istemcisini silmek istediğinizden emin misiniz?",
|
"client_confirm_delete": "\"{{key}}\" istemcisini silmek istediğinizden emin misiniz?",
|
||||||
"list_confirm_delete": "Bu listeyi silmek istediğinizden emin misiniz?",
|
"list_confirm_delete": "Bu listeyi silmek istediğinizden emin misiniz?",
|
||||||
"auto_clients_title": "Çalışma zamanı istemcileri",
|
"auto_clients_title": "Çalışma zamanı istemcileri",
|
||||||
"auto_clients_desc": "AdGuard Home'u kullanan veya kullanabilecek cihazların IP adresleri hakkında bilgiler. Bu bilgiler, hosts dosyaları, ters DNS, vb. dahil olmak üzere çeşitli kaynaklardan toplanır.",
|
"auto_clients_desc": "AdGuard Home'u kullanan veya kullanabilecek cihazların IP adresleri hakkında bilgiler. Bu bilgiler, ana bilgisayar dosyaları, ters DNS sorguları ve çeşitli diğer kaynaklardan toplanmaktadır.",
|
||||||
"access_title": "Erişim ayarları",
|
"access_title": "Erişim ayarları",
|
||||||
"access_desc": "AdGuard Home DNS sunucusu için erişim kurallarını buradan yapılandırabilirsiniz",
|
"access_desc": "AdGuard Home DNS sunucusu için erişim kurallarını buradan yapılandırabilirsiniz",
|
||||||
"access_allowed_title": "İzin verilen istemciler",
|
"access_allowed_title": "İzin verilen istemciler",
|
||||||
@@ -592,12 +601,12 @@
|
|||||||
"disable_ipv6": "IPv6 adreslerinin çözümlenmesini devre dışı bırak",
|
"disable_ipv6": "IPv6 adreslerinin çözümlenmesini devre dışı bırak",
|
||||||
"disable_ipv6_desc": "IPv6 adresleri için tüm DNS sorgularını bırakın (AAAA yazın) ve HTTPS yanıtlarından IPv6 ipuçlarını kaldırın.",
|
"disable_ipv6_desc": "IPv6 adresleri için tüm DNS sorgularını bırakın (AAAA yazın) ve HTTPS yanıtlarından IPv6 ipuçlarını kaldırın.",
|
||||||
"fastest_addr": "En hızlı IP adresi",
|
"fastest_addr": "En hızlı IP adresi",
|
||||||
"fastest_addr_desc": "Tüm DNS sunucularını sorgulayın ve tüm yanıtlar arasından en hızlı olan IP adresini döndürün. AdGuard Home'un tüm DNS sunucularından yanıt beklemesi gerektiği için DNS sorgularını yavaşlatır, ancak genel bağlantıyı iyileştirir.",
|
"fastest_addr_desc": "<b>Tüm</b> DNS sunucularından yanıt bekler, her sunucu için TCP bağlantı hızını ölçer ve en hızlı bağlantı hızına sahip sunucunun IP adresini döndürür.<br/>Bu yapılandırma, bir veya daha fazla üst kaynak sunucusu yanıt vermediğinde, DNS sorgularını önemli ölçüde yavaşlatabilir. Üst kaynak sunucularınızın kararlı olduğundan ve üst kaynak zaman aşım sürenizin düşük olduğundan emin olun.",
|
||||||
"autofix_warning_text": "\"Düzelt\" seçeneğine tıklarsanız, AdGuard Home, sisteminizi AdGuard Home DNS sunucusunu kullanacak şekilde yapılandırır.",
|
"autofix_warning_text": "\"Düzelt\" seçeneğine tıklarsanız, AdGuard Home, sisteminizi AdGuard Home DNS sunucusunu kullanacak şekilde yapılandırır.",
|
||||||
"autofix_warning_list": "Bu görevleri gerçekleştirir: <0>Sistem DNSStubListener'ı devre dışı bırakın</0> <0>DNS sunucusu adresini 127.0.0.1 olarak ayarlayın</0> <0>/etc/resolv.conf'un sembolik bağlantı hedefini /run/systemd/resolve/resolv.conf ile değiştirin<0> <0>DNSStubListener'ı durdurun (systemd çözümlenmiş hizmeti yeniden yükleyin)</0>",
|
"autofix_warning_list": "Bu görevleri gerçekleştirir: <0>Sistem DNSStubListener'ı devre dışı bırakın</0> <0>DNS sunucusu adresini 127.0.0.1 olarak ayarlayın</0> <0>/etc/resolv.conf'un sembolik bağlantı hedefini /run/systemd/resolve/resolv.conf ile değiştirin<0> <0>DNSStubListener'ı durdurun (systemd çözümlenmiş hizmeti yeniden yükleyin)</0>",
|
||||||
"autofix_warning_result": "Sonuç olarak, sisteminizden gelen tüm DNS istekleri varsayılan olarak AdGuard Home tarafından işlenecektir.",
|
"autofix_warning_result": "Sonuç olarak, sisteminizden gelen tüm DNS istekleri varsayılan olarak AdGuard Home tarafından işlenecektir.",
|
||||||
"tags_title": "Etiketler",
|
"tags_title": "Etiketler",
|
||||||
"tags_desc": "İstemciye karşılık gelen etiketleri seçebilirsiniz. Etiketleri daha kesin olarak uygulamak için filtreleme kurallarına dahil edin. <0>Daha fazla bilgi edinin</0>.",
|
"tags_desc": "İstemciyi tanımlayan etiketleri seçebilirsiniz. Filtreleme kurallarına etiketleri dahil ederek daha hassas bir şekilde uygulayabilirsiniz. <0>Daha fazla bilgi edinin</0>.",
|
||||||
"form_select_tags": "İstemci etiketlerini seçin",
|
"form_select_tags": "İstemci etiketlerini seçin",
|
||||||
"check_title": "Filtrelemeyi denetleyin",
|
"check_title": "Filtrelemeyi denetleyin",
|
||||||
"check_desc": "Ana makine adının filtreleme durumunu kontrol edin.",
|
"check_desc": "Ana makine adının filtreleme durumunu kontrol edin.",
|
||||||
@@ -618,11 +627,11 @@
|
|||||||
"client_blocked": "\"{{ip}}\" istemcisi başarıyla engellendi",
|
"client_blocked": "\"{{ip}}\" istemcisi başarıyla engellendi",
|
||||||
"client_unblocked": "\"{{ip}}\" istemcinin engellemesi başarıyla kaldırıldı",
|
"client_unblocked": "\"{{ip}}\" istemcinin engellemesi başarıyla kaldırıldı",
|
||||||
"static_ip": "Sabit IP adresi",
|
"static_ip": "Sabit IP adresi",
|
||||||
"static_ip_desc": "AdGuard Home bir sunucudur, bu nedenle düzgün çalışması için sabit bir IP adresine ihtiyacı vardır. Aksi takdirde, yönlendiriciniz bir zaman sonra bu cihaza farklı bir IP adresi atayabilir.",
|
"static_ip_desc": "AdGuard Home bir sunucudur, bu nedenle düzgün çalışabilmesi için sabit bir IP adresine ihtiyaç duyar. Aksi takdirde, yönlendiriciniz bu cihaza farklı bir IP adresi atayabilir.",
|
||||||
"set_static_ip": "Sabit IP adresi ayarla",
|
"set_static_ip": "Sabit IP adresi ayarla",
|
||||||
"install_static_ok": "Güzel haber! Sabit IP adresi zaten yapılandırılmış",
|
"install_static_ok": "Güzel haber! Sabit IP adresi zaten yapılandırılmış",
|
||||||
"install_static_error": "AdGuard Home, bu ağ arayüzü için otomatik olarak yapılandıramıyor. Lütfen bunu elle nasıl yapacağınızla ilgili talimatlara bakın.",
|
"install_static_error": "AdGuard Home, bu ağ arayüzü için otomatik olarak yapılandıramıyor. Lütfen bunu elle nasıl yapacağınızla ilgili talimatlara bakın.",
|
||||||
"install_static_configure": "AdGuard Home, <0>{{ip}}</0> dinamik IP adresinin kullanıldığını tespit etti. Sabit adresiniz olarak ayarlanmasını ister misiniz?",
|
"install_static_configure": "AdGuard Home, <0>{{ip}}</0> sabit IP adresinin kullanıldığını tespit etti. Sabit adresiniz olarak ayarlanmasını ister misiniz?",
|
||||||
"confirm_static_ip": "AdGuard Home, {{ip}} adresini sabit IP adresiniz olacak şekilde yapılandırır. Devam etmek istiyor musunuz?",
|
"confirm_static_ip": "AdGuard Home, {{ip}} adresini sabit IP adresiniz olacak şekilde yapılandırır. Devam etmek istiyor musunuz?",
|
||||||
"list_updated": "{{count}} liste güncellendi",
|
"list_updated": "{{count}} liste güncellendi",
|
||||||
"list_updated_plural": "{{count}} liste güncellendi",
|
"list_updated_plural": "{{count}} liste güncellendi",
|
||||||
@@ -672,7 +681,7 @@
|
|||||||
"use_saved_key": "Önceden kaydedilmiş anahtarı kullan",
|
"use_saved_key": "Önceden kaydedilmiş anahtarı kullan",
|
||||||
"parental_control": "Ebeveyn Denetimi",
|
"parental_control": "Ebeveyn Denetimi",
|
||||||
"safe_browsing": "Güvenli Gezinti",
|
"safe_browsing": "Güvenli Gezinti",
|
||||||
"served_from_cache": "{{value}} <i>(önbellekten kullanıldı)</i>",
|
"served_from_cache_label": "Önbellekten kullanıldı",
|
||||||
"form_error_password_length": "Parola {{min}} ila {{max}} karakter uzunluğunda olmalıdır",
|
"form_error_password_length": "Parola {{min}} ila {{max}} karakter uzunluğunda olmalıdır",
|
||||||
"anonymizer_notification": "<0>Not:</0> IP anonimleştirme etkinleştirildi. Bunu <1>Genel ayarlardan</1> devre dışı bırakabilirsiniz.",
|
"anonymizer_notification": "<0>Not:</0> IP anonimleştirme etkinleştirildi. Bunu <1>Genel ayarlardan</1> devre dışı bırakabilirsiniz.",
|
||||||
"confirm_dns_cache_clear": "DNS önbelleğini temizlemek istediğinizden emin misiniz?",
|
"confirm_dns_cache_clear": "DNS önbelleğini temizlemek istediğinizden emin misiniz?",
|
||||||
@@ -701,8 +710,8 @@
|
|||||||
"custom_rotation_input": "Rotasyonu saat cinsinden girin",
|
"custom_rotation_input": "Rotasyonu saat cinsinden girin",
|
||||||
"protection_section_label": "Koruma",
|
"protection_section_label": "Koruma",
|
||||||
"log_and_stats_section_label": "Sorgu günlüğü ve istatistikler",
|
"log_and_stats_section_label": "Sorgu günlüğü ve istatistikler",
|
||||||
"ignore_query_log": "Sorgu günlüğünde bu istemciyi yoksay",
|
"ignore_query_log": "Sorgu günlüğünde bu istemciyi gösterme",
|
||||||
"ignore_statistics": "İstatistiklerde bu istemciyi yoksay",
|
"ignore_statistics": "İstatistiklerde bu istemciyi gösterme",
|
||||||
"schedule_services": "Hizmet engellemeyi duraklat",
|
"schedule_services": "Hizmet engellemeyi duraklat",
|
||||||
"schedule_services_desc": "Hizmet engelleme filtresinin duraklatma planını yapılandırın",
|
"schedule_services_desc": "Hizmet engelleme filtresinin duraklatma planını yapılandırın",
|
||||||
"schedule_services_desc_client": "Bu istemci için hizmet engelleme filtresinin duraklatma planını yapılandırın",
|
"schedule_services_desc_client": "Bu istemci için hizmet engelleme filtresinin duraklatma planını yapılandırın",
|
||||||
@@ -736,6 +745,6 @@
|
|||||||
"friday_short": "Cum",
|
"friday_short": "Cum",
|
||||||
"saturday_short": "Cmt",
|
"saturday_short": "Cmt",
|
||||||
"upstream_dns_cache_configuration": "Üst kaynak DNS önbellek yapılandırması",
|
"upstream_dns_cache_configuration": "Üst kaynak DNS önbellek yapılandırması",
|
||||||
"enable_upstream_dns_cache": "Bu istemcinin özel üst kaynak yapılandırması için DNS önbelleğe almayı etkinleştir",
|
"enable_upstream_dns_cache": "Bu istemcinin özel üst kaynak yapılandırması için DNS önbelleğini etkinleştir",
|
||||||
"dns_cache_size": "DNS önbellek boyutu, bayt cinsinden"
|
"dns_cache_size": "DNS önbellek boyutu, bayt cinsinden"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -20,7 +20,7 @@
|
|||||||
"resolve_clients_title": "Увімкнути зворотне вирішення IP-адрес клієнтів",
|
"resolve_clients_title": "Увімкнути зворотне вирішення IP-адрес клієнтів",
|
||||||
"resolve_clients_desc": "Визначати доменні імена клієнтів за допомогою PTR-запитів до відповідних серверів — приватних DNS-серверів для локальних клієнтів та upstream-серверів для клієнтів з публічними IP-адресами.",
|
"resolve_clients_desc": "Визначати доменні імена клієнтів за допомогою PTR-запитів до відповідних серверів — приватних DNS-серверів для локальних клієнтів та upstream-серверів для клієнтів з публічними IP-адресами.",
|
||||||
"use_private_ptr_resolvers_title": "Використовувати приватні зворотні DNS-резолвери",
|
"use_private_ptr_resolvers_title": "Використовувати приватні зворотні DNS-резолвери",
|
||||||
"use_private_ptr_resolvers_desc": "Надсилати зворотні DNS-запити до вказаних серверів для клієнтів, що обслуговуються локально. Якщо вимкнено, AdGuard Home буде відповідати NXDOMAIN на всі такі PTR-запити, окрім запитів про клієнтів, що уже відомі завдяки DHCP, /etc/hosts тощо.",
|
"use_private_ptr_resolvers_desc": "Розвʼязувати запити PTR, SOA та NS для доменів ARPA, що містять приватні IP-адреси, через приватні вихідні сервери, DHCP, /etc/hosts тощо. Якщо вимкнено, AdGuard Home відповідатиме на всі такі запити з NXDOMAIN.",
|
||||||
"check_dhcp_servers": "Перевірити DHCP-сервери",
|
"check_dhcp_servers": "Перевірити DHCP-сервери",
|
||||||
"save_config": "Зберегти конфігурацію",
|
"save_config": "Зберегти конфігурацію",
|
||||||
"enabled_dhcp": "DHCP-сервер увімкнено",
|
"enabled_dhcp": "DHCP-сервер увімкнено",
|
||||||
@@ -68,7 +68,7 @@
|
|||||||
"ip": "IP",
|
"ip": "IP",
|
||||||
"dhcp_table_hostname": "Назва вузла",
|
"dhcp_table_hostname": "Назва вузла",
|
||||||
"dhcp_table_expires": "Закінчується",
|
"dhcp_table_expires": "Закінчується",
|
||||||
"dhcp_warning": "Якщо ви однаково хочете увімкнути DHCP-сервер, переконайтеся, що у вашій мережі немає інших активних DHCP-серверів. Інакше, це може порушити роботу інтернету на під'єднаних пристроях!",
|
"dhcp_warning": "Якщо ви однаково хочете увімкнути DHCP-сервер, переконайтеся, що у вашій мережі немає інших активних DHCP-серверів. Інакше, це може порушити роботу інтернету на підʼєднаних пристроях!",
|
||||||
"dhcp_error": "AdGuard Home не зміг визначити, чи є в мережі інший DHCP-сервер",
|
"dhcp_error": "AdGuard Home не зміг визначити, чи є в мережі інший DHCP-сервер",
|
||||||
"dhcp_static_ip_error": "Для використання DHCP-сервера необхідно встановити статичну IP-адресу. Нам не вдалося визначити, чи цей мережевий інтерфейс налаштовано для використання статичної IP-адреси. Встановіть статичну IP-адресу вручну.",
|
"dhcp_static_ip_error": "Для використання DHCP-сервера необхідно встановити статичну IP-адресу. Нам не вдалося визначити, чи цей мережевий інтерфейс налаштовано для використання статичної IP-адреси. Встановіть статичну IP-адресу вручну.",
|
||||||
"dhcp_dynamic_ip_found": "Ваша система використовує конфігурацію з динамічною IP-адресою для інтерфейсу <0>{{interfaceName}}</0>. Для використання DHCP-сервера необхідно встановити статичну IP-адресу. Ваша поточна IP-адреса <0>{{ipAddress}}</0>. Ми автоматично встановимо цю IP-адресу як статичну, якщо ви натиснете кнопку «Увімкнути DHCP-сервер».",
|
"dhcp_dynamic_ip_found": "Ваша система використовує конфігурацію з динамічною IP-адресою для інтерфейсу <0>{{interfaceName}}</0>. Для використання DHCP-сервера необхідно встановити статичну IP-адресу. Ваша поточна IP-адреса <0>{{ipAddress}}</0>. Ми автоматично встановимо цю IP-адресу як статичну, якщо ви натиснете кнопку «Увімкнути DHCP-сервер».",
|
||||||
@@ -236,6 +236,7 @@
|
|||||||
"updated_upstream_dns_toast": "DNS-сервери успішно збережено",
|
"updated_upstream_dns_toast": "DNS-сервери успішно збережено",
|
||||||
"dns_test_ok_toast": "Вказані DNS сервери працюють правильно",
|
"dns_test_ok_toast": "Вказані DNS сервери працюють правильно",
|
||||||
"dns_test_not_ok_toast": "Сервер «{{key}}»: неможливо використати. Перевірте правильність введення",
|
"dns_test_not_ok_toast": "Сервер «{{key}}»: неможливо використати. Перевірте правильність введення",
|
||||||
|
"dns_test_parsing_error_toast": "Розділ {{section}}: рядок {{line}}: неможливо використати. Перевірте правильність введення",
|
||||||
"dns_test_warning_toast": "Upstream «{{key}}» не відповідає на тестові запити та може працювати не правильно",
|
"dns_test_warning_toast": "Upstream «{{key}}» не відповідає на тестові запити та може працювати не правильно",
|
||||||
"unblock": "Дозволити",
|
"unblock": "Дозволити",
|
||||||
"block": "Заборонити",
|
"block": "Заборонити",
|
||||||
@@ -243,6 +244,7 @@
|
|||||||
"allow_this_client": "Дозволити цей клієнт",
|
"allow_this_client": "Дозволити цей клієнт",
|
||||||
"block_for_this_client_only": "Заборонити тільки цей клієнт",
|
"block_for_this_client_only": "Заборонити тільки цей клієнт",
|
||||||
"unblock_for_this_client_only": "Дозволити тільки цей клієнт",
|
"unblock_for_this_client_only": "Дозволити тільки цей клієнт",
|
||||||
|
"add_persistent_client": "Додати в збережені клієнти",
|
||||||
"time_table_header": "Час",
|
"time_table_header": "Час",
|
||||||
"date": "Дата",
|
"date": "Дата",
|
||||||
"domain_name_table_header": "Назва домену",
|
"domain_name_table_header": "Назва домену",
|
||||||
@@ -341,10 +343,10 @@
|
|||||||
"known_tracker": "Відомі трекери",
|
"known_tracker": "Відомі трекери",
|
||||||
"install_welcome_title": "Вітаємо в AdGuard Home!",
|
"install_welcome_title": "Вітаємо в AdGuard Home!",
|
||||||
"install_welcome_desc": "AdGuard Home — це мережевий DNS-сервер, що блокує рекламу та відстеження. Його мета — надати вам контроль над усією мережею та всіма пристроями в ній без потреби використання програми на стороні клієнта.",
|
"install_welcome_desc": "AdGuard Home — це мережевий DNS-сервер, що блокує рекламу та відстеження. Його мета — надати вам контроль над усією мережею та всіма пристроями в ній без потреби використання програми на стороні клієнта.",
|
||||||
"install_settings_title": "Веб-інтерфейс адміністратора",
|
"install_settings_title": "Вебінтерфейс адміністратора",
|
||||||
"install_settings_listen": "Мережевий інтерфейс",
|
"install_settings_listen": "Мережевий інтерфейс",
|
||||||
"install_settings_port": "Порт",
|
"install_settings_port": "Порт",
|
||||||
"install_settings_interface_link": "Веб-інтерфейс адміністратора AdGuard Home буде доступний за такими адресами:",
|
"install_settings_interface_link": "Вебінтерфейс адміністратора AdGuard Home буде доступний за такими адресами:",
|
||||||
"form_error_port": "Уведіть правильне значення порту",
|
"form_error_port": "Уведіть правильне значення порту",
|
||||||
"install_settings_dns": "DNS-сервер",
|
"install_settings_dns": "DNS-сервер",
|
||||||
"install_settings_dns_desc": "Вам потрібно буде налаштувати свої пристрої або маршрутизатор для використання DNS-сервера за такими адресами:",
|
"install_settings_dns_desc": "Вам потрібно буде налаштувати свої пристрої або маршрутизатор для використання DNS-сервера за такими адресами:",
|
||||||
@@ -362,7 +364,7 @@
|
|||||||
"install_submit_title": "Вітаємо!",
|
"install_submit_title": "Вітаємо!",
|
||||||
"install_submit_desc": "Процедура налаштування завершена і тепер все готово, аби почати користуватися AdGuard Home.",
|
"install_submit_desc": "Процедура налаштування завершена і тепер все готово, аби почати користуватися AdGuard Home.",
|
||||||
"install_devices_router": "Роутер",
|
"install_devices_router": "Роутер",
|
||||||
"install_devices_router_desc": "Це налаштування буде автоматично охоплювати всі пристрої, що під'єднано до домашнього маршрутизатора. Вам не потрібно буде налаштовувати кожен з них вручну.",
|
"install_devices_router_desc": "Це налаштування буде автоматично охоплювати всі пристрої, що підʼєднано до домашнього маршрутизатора. Вам не потрібно буде налаштовувати кожен з них вручну.",
|
||||||
"install_devices_address": "DNS-сервер AdGuard Home прослуховує наступні адреси",
|
"install_devices_address": "DNS-сервер AdGuard Home прослуховує наступні адреси",
|
||||||
"install_devices_router_list_1": "Відкрийте налаштування маршрутизатора. Зазвичай ви можете отримати до нього доступ із браузера за допомогою URL-адреси, наприклад, http://192.168.0.1/ або http://192.168.1.1/. Можливо, треба буде ввести пароль. Якщо ви його не знаєте, часто можна скинути пароль, натиснувши кнопку на самому маршрутизаторі. Для деяких маршрутизаторів потрібна спеціальна програма, яка в такому випадку повинна бути вже встановлена на вашому комп’ютері чи телефоні.",
|
"install_devices_router_list_1": "Відкрийте налаштування маршрутизатора. Зазвичай ви можете отримати до нього доступ із браузера за допомогою URL-адреси, наприклад, http://192.168.0.1/ або http://192.168.1.1/. Можливо, треба буде ввести пароль. Якщо ви його не знаєте, часто можна скинути пароль, натиснувши кнопку на самому маршрутизаторі. Для деяких маршрутизаторів потрібна спеціальна програма, яка в такому випадку повинна бути вже встановлена на вашому комп’ютері чи телефоні.",
|
||||||
"install_devices_router_list_2": "Знайдіть налаштування DHCP/DNS. Шукайте літери DNS поруч із полем, в яке можна ввести два або три набори чисел, кожен з яких розбитий на чотири групи від однієї до трьох цифр.",
|
"install_devices_router_list_2": "Знайдіть налаштування DHCP/DNS. Шукайте літери DNS поруч із полем, в яке можна ввести два або три набори чисел, кожен з яких розбитий на чотири групи від однієї до трьох цифр.",
|
||||||
@@ -423,6 +425,9 @@
|
|||||||
"encryption_hostnames": "Назви вузлів",
|
"encryption_hostnames": "Назви вузлів",
|
||||||
"encryption_reset": "Ви впевнені, що хочете скинути налаштування шифрування?",
|
"encryption_reset": "Ви впевнені, що хочете скинути налаштування шифрування?",
|
||||||
"encryption_warning": "Попередження",
|
"encryption_warning": "Попередження",
|
||||||
|
"encryption_plain_dns_enable": "Увімкнути звичайний DNS",
|
||||||
|
"encryption_plain_dns_desc": "Звичайний DNS усталено увімкнений. Ви можете вимкнути його, щоб змусити всі пристрої використовувати зашифрований DNS. Для цього необхідно увімкнути хоча б один зашифрований протокол DNS",
|
||||||
|
"encryption_plain_dns_error": "Щоб вимкнути звичайний DNS, увімкніть принаймні один зашифрований протокол DNS",
|
||||||
"topline_expiring_certificate": "Ваш сертифікат SSL скоро закінчиться. Оновіть <0>Налаштування шифрування</0>.",
|
"topline_expiring_certificate": "Ваш сертифікат SSL скоро закінчиться. Оновіть <0>Налаштування шифрування</0>.",
|
||||||
"topline_expired_certificate": "Термін дії вашого сертифіката SSL закінчився. Оновіть <0>Налаштування шифрування</0>.",
|
"topline_expired_certificate": "Термін дії вашого сертифіката SSL закінчився. Оновіть <0>Налаштування шифрування</0>.",
|
||||||
"form_error_port_range": "Введіть значення порту в діапазоні 80−65535",
|
"form_error_port_range": "Введіть значення порту в діапазоні 80−65535",
|
||||||
@@ -443,7 +448,7 @@
|
|||||||
"manual_update": "Щоб оновити самостійно, <a>виконайте ці кроки</a>.",
|
"manual_update": "Щоб оновити самостійно, <a>виконайте ці кроки</a>.",
|
||||||
"processing_update": "Зачекайте будь ласка, AdGuard Home оновлюється",
|
"processing_update": "Зачекайте будь ласка, AdGuard Home оновлюється",
|
||||||
"clients_title": "Постійні клієнти",
|
"clients_title": "Постійні клієнти",
|
||||||
"clients_desc": "Налаштуйте пристрої, під'єднані до AdGuard Home",
|
"clients_desc": "Налаштуйте пристрої, які підʼєднано до AdGuard Home",
|
||||||
"settings_global": "Загальні",
|
"settings_global": "Загальні",
|
||||||
"settings_custom": "Власні",
|
"settings_custom": "Власні",
|
||||||
"table_client": "Клієнт",
|
"table_client": "Клієнт",
|
||||||
@@ -462,6 +467,7 @@
|
|||||||
"form_add_id": "Додати ідентифікатор",
|
"form_add_id": "Додати ідентифікатор",
|
||||||
"form_client_name": "Введіть ім'я клієнта",
|
"form_client_name": "Введіть ім'я клієнта",
|
||||||
"name": "Ім'я",
|
"name": "Ім'я",
|
||||||
|
"client_name": "Клієнт {{id}}",
|
||||||
"client_global_settings": "Використати загальні налаштування",
|
"client_global_settings": "Використати загальні налаштування",
|
||||||
"client_deleted": "Клієнта «{{key}}» успішно видалено",
|
"client_deleted": "Клієнта «{{key}}» успішно видалено",
|
||||||
"client_added": "Клієнта «{{key}}» успішно додано",
|
"client_added": "Клієнта «{{key}}» успішно додано",
|
||||||
@@ -672,7 +678,7 @@
|
|||||||
"use_saved_key": "Використати раніше збережений ключ",
|
"use_saved_key": "Використати раніше збережений ключ",
|
||||||
"parental_control": "Батьківський контроль",
|
"parental_control": "Батьківський контроль",
|
||||||
"safe_browsing": "Безпечний перегляд",
|
"safe_browsing": "Безпечний перегляд",
|
||||||
"served_from_cache": "{{value}} <i>(отримано з кешу)</i>",
|
"served_from_cache_label": "Отримано з кешу",
|
||||||
"form_error_password_length": "Пароль має містити від {{min}} до {{max}} символів",
|
"form_error_password_length": "Пароль має містити від {{min}} до {{max}} символів",
|
||||||
"anonymizer_notification": "<0>Примітка:</0> IP-анонімізацію ввімкнено. Ви можете вимкнути його в <1>Загальні налаштування</1> .",
|
"anonymizer_notification": "<0>Примітка:</0> IP-анонімізацію ввімкнено. Ви можете вимкнути його в <1>Загальні налаштування</1> .",
|
||||||
"confirm_dns_cache_clear": "Ви впевнені, що бажаєте очистити кеш DNS?",
|
"confirm_dns_cache_clear": "Ви впевнені, що бажаєте очистити кеш DNS?",
|
||||||
|
|||||||
@@ -6,21 +6,21 @@
|
|||||||
"upstream_parallel": "Sử dụng truy vấn song song để tăng tốc độ giải quyết bằng cách truy vấn đồng thời tất cả các máy chủ ngược tuyến",
|
"upstream_parallel": "Sử dụng truy vấn song song để tăng tốc độ giải quyết bằng cách truy vấn đồng thời tất cả các máy chủ ngược tuyến",
|
||||||
"parallel_requests": "Yêu cầu song song",
|
"parallel_requests": "Yêu cầu song song",
|
||||||
"load_balancing": "Cân bằng tải",
|
"load_balancing": "Cân bằng tải",
|
||||||
"load_balancing_desc": "Chỉ truy xuất một máy chủ trong cùng thời điểm. AdGuard Home sẽ sử dụng thuật toán trọng số ngẫu nhiên để chọn một máy chủ nhanh nhất và sử dụng máy chủ đó thường xuyên hơn.",
|
"load_balancing_desc": "Truy vấn một máy chủ thượng nguồn tại một thời điểm. AdGuard Home sử dụng thuật toán ngẫu nhiên có trọng số để chọn máy chủ có số lần tìm kiếm không thành công thấp nhất và thời gian tìm kiếm trung bình thấp nhất.",
|
||||||
"bootstrap_dns": "Máy chủ DNS Bootstrap",
|
"bootstrap_dns": "Máy chủ DNS Bootstrap",
|
||||||
"bootstrap_dns_desc": "Địa chỉ IP của máy chủ DNS được sử dụng để phân giải địa chỉ IP của trình phân giải DoH/DoT mà bạn chỉ định làm thượng nguồn. Bình luận không được phép.",
|
"bootstrap_dns_desc": "Địa chỉ IP của máy chủ DNS được sử dụng để phân giải địa chỉ IP của trình phân giải DoH/DoT mà bạn chỉ định làm thượng nguồn. Bình luận không được phép.",
|
||||||
"fallback_dns_title": "Máy chủ DNS dự phòng",
|
"fallback_dns_title": "Máy chủ DNS dự phòng",
|
||||||
"fallback_dns_desc": "Danh sách máy chủ DNS dự phòng được sử dụng khi máy chủ DNS ngược tuyến không phản hồi. Cú pháp tương tự như trong trường ngược dòng chính ở trên.",
|
"fallback_dns_desc": "Danh sách máy chủ DNS dự phòng được sử dụng khi máy chủ DNS ngược tuyến không phản hồi. Cú pháp tương tự như trong trường ngược dòng chính ở trên.",
|
||||||
"fallback_dns_placeholder": "Nhập một máy chủ DNS dự phòng trên mỗi dòng",
|
"fallback_dns_placeholder": "Nhập một máy chủ DNS dự phòng trên mỗi dòng",
|
||||||
"local_ptr_title": "Máy chủ DNS riêng tư",
|
"local_ptr_title": "Máy chủ DNS riêng tư",
|
||||||
"local_ptr_desc": "Máy chủ DNS hoặc các máy chủ mà AdGuard Home sẽ sử dụng cho các truy vấn về tài nguyên được phân phối cục bộ. Ví dụ: máy chủ này sẽ được sử dụng để phân giải tên máy khách của máy khách cho các máy khách có địa chỉ IP riêng. Nếu không được cài đặt, AdGuard Home sẽ tự động sử dụng trình phân giải DNS mặc định của bạn.",
|
"local_ptr_desc": "Máy chủ DNS được AdGuard Home sử dụng cho các yêu cầu PTR, SOA và NS riêng tư. Một yêu cầu được coi là riêng tư nếu nó yêu cầu một miền ARPA chứa một mạng con trong phạm vi IP riêng tư (chẳng hạn như \"192.168.12.34\") và đến từ một máy khách có địa chỉ IP riêng tư. Nếu không được thiết lập, các trình phân giải DNS mặc định của hệ điều hành của bạn sẽ được sử dụng, ngoại trừ các địa chỉ IP của AdGuard Home.",
|
||||||
"local_ptr_default_resolver": "Theo mặc định, AdGuard Home sử dụng các hệ thống phân giải tên miền ngược sau: {{ip}}.",
|
"local_ptr_default_resolver": "Theo mặc định, AdGuard Home sử dụng các hệ thống phân giải tên miền ngược sau: {{ip}}.",
|
||||||
"local_ptr_no_default_resolver": "AdGuard Home không thể xác định hệ thống phân giải tên miền ngược riêng phù hợp cho hệ thống này.",
|
"local_ptr_no_default_resolver": "AdGuard Home không thể xác định hệ thống phân giải tên miền ngược riêng phù hợp cho hệ thống này.",
|
||||||
"local_ptr_placeholder": "Nhập một địa chỉ IP trên mỗi dòng",
|
"local_ptr_placeholder": "Nhập một địa chỉ IP trên mỗi dòng",
|
||||||
"resolve_clients_title": "Kích hoạt cho phép phân giải ngược về địa chỉ IP của máy khách",
|
"resolve_clients_title": "Kích hoạt cho phép phân giải ngược về địa chỉ IP của máy khách",
|
||||||
"resolve_clients_desc": "Nếu được bật, AdGuard Home sẽ cố gắng phân giải ngược lại địa chỉ IP của khách hàng thành tên máy chủ của họ bằng cách gửi các truy vấn PTR tới trình phân giải tương ứng (máy chủ DNS riêng cho máy khách cục bộ, máy chủ ngược dòng cho máy khách có địa chỉ IP công cộng).",
|
"resolve_clients_desc": "Nếu được bật, AdGuard Home sẽ cố gắng phân giải ngược lại địa chỉ IP của khách hàng thành tên máy chủ của họ bằng cách gửi các truy vấn PTR tới trình phân giải tương ứng (máy chủ DNS riêng cho máy khách cục bộ, máy chủ ngược dòng cho máy khách có địa chỉ IP công cộng).",
|
||||||
"use_private_ptr_resolvers_title": "Sử dụng trình rDNS riêng tư",
|
"use_private_ptr_resolvers_title": "Sử dụng trình rDNS riêng tư",
|
||||||
"use_private_ptr_resolvers_desc": "Thực hiện tra cứu ngược DNS cho các địa chỉ được phân phối cục bộ bằng cách sử dụng các máy chủ nguồn. Nếu bị vô hiệu hóa, AdGuard Home sẽ phản hồi với NXDOMAIN cho tất cả các yêu cầu PTR ngoại trừ các ứng dụng khách được biết đến bởi DHCP, / etc / hosts, v. v.",
|
"use_private_ptr_resolvers_desc": "Giải quyết các yêu cầu PTR, SOA và NS cho các miền ARPA chứa địa chỉ IP riêng thông qua máy chủ thượng nguồn riêng, DHCP, /etc/hosts, v. v. Nếu bị vô hiệu hóa, AdGuard Home sẽ phản hồi tất cả các yêu cầu đó bằng NXDOMAIN.",
|
||||||
"check_dhcp_servers": "Kiểm tra máy chủ DHCP",
|
"check_dhcp_servers": "Kiểm tra máy chủ DHCP",
|
||||||
"save_config": "Lưu thiết lập",
|
"save_config": "Lưu thiết lập",
|
||||||
"enabled_dhcp": "Máy chủ DHCP đã kích hoạt",
|
"enabled_dhcp": "Máy chủ DHCP đã kích hoạt",
|
||||||
@@ -154,7 +154,7 @@
|
|||||||
"use_adguard_parental": "Sử dụng dịch vụ quản lý của phụ huynh AdGuard",
|
"use_adguard_parental": "Sử dụng dịch vụ quản lý của phụ huynh AdGuard",
|
||||||
"use_adguard_parental_hint": "AdGuard Home sẽ kiểm tra nếu tên miền chứa từ khoá người lớn. Tính năng sử dụng API thân thiện với quyền riêng tư tương tự với dịch vụ bảo vệ duyệt web",
|
"use_adguard_parental_hint": "AdGuard Home sẽ kiểm tra nếu tên miền chứa từ khoá người lớn. Tính năng sử dụng API thân thiện với quyền riêng tư tương tự với dịch vụ bảo vệ duyệt web",
|
||||||
"enforce_safe_search": "Bắt buộc tìm kiếm an toàn",
|
"enforce_safe_search": "Bắt buộc tìm kiếm an toàn",
|
||||||
"enforce_save_search_hint": "AdGuard Home có thể bắt buộc tìm kiếm an toàn với các dịch vụ tìm kiếm: Google, Youtube, Bing, Yandex.",
|
"enforce_save_search_hint": "AdGuard Home sẽ thực thi tìm kiếm an toàn trong các công cụ tìm kiếm sau: Google, YouTube, Bing, DuckDuckGo, Ecosia, Yandex, Pixabay.",
|
||||||
"no_servers_specified": "Không có máy chủ nào được liệt kê",
|
"no_servers_specified": "Không có máy chủ nào được liệt kê",
|
||||||
"general_settings": "Cài đặt chung",
|
"general_settings": "Cài đặt chung",
|
||||||
"dns_settings": "Cài đặt DNS",
|
"dns_settings": "Cài đặt DNS",
|
||||||
@@ -236,6 +236,7 @@
|
|||||||
"updated_upstream_dns_toast": "Các máy chủ thượng nguồn đã được lưu thành công",
|
"updated_upstream_dns_toast": "Các máy chủ thượng nguồn đã được lưu thành công",
|
||||||
"dns_test_ok_toast": "Máy chủ DNS có thể sử dụng",
|
"dns_test_ok_toast": "Máy chủ DNS có thể sử dụng",
|
||||||
"dns_test_not_ok_toast": "Máy chủ \"{{key}}\"': không thể sử dụng, vui lòng kiểm tra lại",
|
"dns_test_not_ok_toast": "Máy chủ \"{{key}}\"': không thể sử dụng, vui lòng kiểm tra lại",
|
||||||
|
"dns_test_parsing_error_toast": "Phần {{section}}: dòng {{line}}: không thể sử dụng được, vui lòng kiểm tra xem bạn đã viết đúng chưa",
|
||||||
"dns_test_warning_toast": "Ngược lại \"{{key}}\" không phản hồi các yêu cầu kiểm tra và có thể không hoạt động bình thường",
|
"dns_test_warning_toast": "Ngược lại \"{{key}}\" không phản hồi các yêu cầu kiểm tra và có thể không hoạt động bình thường",
|
||||||
"unblock": "Bỏ chặn",
|
"unblock": "Bỏ chặn",
|
||||||
"block": "Chặn",
|
"block": "Chặn",
|
||||||
@@ -243,6 +244,7 @@
|
|||||||
"allow_this_client": "Cho phép ứng dụng khách này",
|
"allow_this_client": "Cho phép ứng dụng khách này",
|
||||||
"block_for_this_client_only": "Chỉ chặn ứng dụng khách này",
|
"block_for_this_client_only": "Chỉ chặn ứng dụng khách này",
|
||||||
"unblock_for_this_client_only": "Chỉ hủy chặn ứng dụng khách này",
|
"unblock_for_this_client_only": "Chỉ hủy chặn ứng dụng khách này",
|
||||||
|
"add_persistent_client": "Thêm làm ứng dụng khách liên tục",
|
||||||
"time_table_header": "Thời gian",
|
"time_table_header": "Thời gian",
|
||||||
"date": "Ngày",
|
"date": "Ngày",
|
||||||
"domain_name_table_header": "Tên miền",
|
"domain_name_table_header": "Tên miền",
|
||||||
@@ -423,6 +425,9 @@
|
|||||||
"encryption_hostnames": "Tên máy chủ",
|
"encryption_hostnames": "Tên máy chủ",
|
||||||
"encryption_reset": "Bạn có chắc chắn muốn đặt lại cài đặt mã hóa?",
|
"encryption_reset": "Bạn có chắc chắn muốn đặt lại cài đặt mã hóa?",
|
||||||
"encryption_warning": "Cảnh báo",
|
"encryption_warning": "Cảnh báo",
|
||||||
|
"encryption_plain_dns_enable": "Kích hoạt DNS đơn giản",
|
||||||
|
"encryption_plain_dns_desc": "DNS đơn giản được bật theo mặc định. Bạn có thể vô hiệu hóa nó để buộc tất cả các thiết bị sử dụng DNS được mã hóa. Để thực hiện việc này, bạn phải kích hoạt ít nhất một giao thức DNS được mã hóa",
|
||||||
|
"encryption_plain_dns_error": "Để tắt DNS đơn giản, hãy bật ít nhất một giao thức DNS được mã hóa",
|
||||||
"topline_expiring_certificate": "Chứng chỉ SSL của bạn sắp hết hạn. Cập nhật <0>Cài đặt mã hóa</0>.",
|
"topline_expiring_certificate": "Chứng chỉ SSL của bạn sắp hết hạn. Cập nhật <0>Cài đặt mã hóa</0>.",
|
||||||
"topline_expired_certificate": "Chứng chỉ SSL của bạn đã hết hạn. Cập nhật <0>Cài đặt mã hóa</0>.",
|
"topline_expired_certificate": "Chứng chỉ SSL của bạn đã hết hạn. Cập nhật <0>Cài đặt mã hóa</0>.",
|
||||||
"form_error_port_range": "Nhập giá trị cổng trong phạm vi 80-65535",
|
"form_error_port_range": "Nhập giá trị cổng trong phạm vi 80-65535",
|
||||||
@@ -462,6 +467,7 @@
|
|||||||
"form_add_id": "Thêm định danh",
|
"form_add_id": "Thêm định danh",
|
||||||
"form_client_name": "Nhập tên máy khách",
|
"form_client_name": "Nhập tên máy khách",
|
||||||
"name": "Tên",
|
"name": "Tên",
|
||||||
|
"client_name": "Khách hàng {{id}}",
|
||||||
"client_global_settings": "Sử dụng cài đặt toàn cầu",
|
"client_global_settings": "Sử dụng cài đặt toàn cầu",
|
||||||
"client_deleted": "Máy khách \"{{key}}\" đã xóa thành công",
|
"client_deleted": "Máy khách \"{{key}}\" đã xóa thành công",
|
||||||
"client_added": "Máy khách \"{{key}}\" đã thêm thành công",
|
"client_added": "Máy khách \"{{key}}\" đã thêm thành công",
|
||||||
@@ -672,7 +678,7 @@
|
|||||||
"use_saved_key": "Sử dụng khóa đã lưu trước đó",
|
"use_saved_key": "Sử dụng khóa đã lưu trước đó",
|
||||||
"parental_control": "Quản lý của phụ huynh",
|
"parental_control": "Quản lý của phụ huynh",
|
||||||
"safe_browsing": "Duyệt web an toàn",
|
"safe_browsing": "Duyệt web an toàn",
|
||||||
"served_from_cache": "{{value}} <i>(được phục vụ từ bộ nhớ cache)</i>",
|
"served_from_cache_label": "Được phục vụ từ bộ nhớ đệm",
|
||||||
"form_error_password_length": "Mật khẩu phải dài từ {{min}} đến {{max}} ký tự",
|
"form_error_password_length": "Mật khẩu phải dài từ {{min}} đến {{max}} ký tự",
|
||||||
"anonymizer_notification": "<0> Lưu ý:</0> Tính năng ẩn danh IP được bật. Bạn có thể tắt nó trong <1> Cài đặt chung</1>.",
|
"anonymizer_notification": "<0> Lưu ý:</0> Tính năng ẩn danh IP được bật. Bạn có thể tắt nó trong <1> Cài đặt chung</1>.",
|
||||||
"confirm_dns_cache_clear": "Bạn có chắc chắn muốn xóa bộ đệm ẩn DNS không?",
|
"confirm_dns_cache_clear": "Bạn có chắc chắn muốn xóa bộ đệm ẩn DNS không?",
|
||||||
|
|||||||
@@ -6,21 +6,21 @@
|
|||||||
"upstream_parallel": "使用并行请求以同时查询所有上游服务器来加快解析速度。",
|
"upstream_parallel": "使用并行请求以同时查询所有上游服务器来加快解析速度。",
|
||||||
"parallel_requests": "并行请求",
|
"parallel_requests": "并行请求",
|
||||||
"load_balancing": "负载均衡",
|
"load_balancing": "负载均衡",
|
||||||
"load_balancing_desc": "一次查询一台服务器。AdGuard Home 将使用加权随机算法来选择服务器,以便更常使用最快的服务器。",
|
"load_balancing_desc": "一次查询一台上游服务器。<br/>AdGuard Home 使用加权随机算法来选择具有最少失败查找和最低平均查找时间的服务器。",
|
||||||
"bootstrap_dns": "Bootstrap DNS 服务器",
|
"bootstrap_dns": "Bootstrap DNS 服务器",
|
||||||
"bootstrap_dns_desc": "DNS 服务器的 IP 地址,用于解析指定为上游的 DoH/DoT 解析器的 IP 地址。不允许添加注释。",
|
"bootstrap_dns_desc": "DNS 服务器的 IP 地址,用于解析指定为上游的 DoH/DoT 解析器的 IP 地址。不允许添加注释。",
|
||||||
"fallback_dns_title": "后备 DNS 服务器",
|
"fallback_dns_title": "后备 DNS 服务器",
|
||||||
"fallback_dns_desc": "当上游 DNS 服务器没有响应时使用的后备 DNS 服务器列表。语法与上面的「主要上游」字段相同。",
|
"fallback_dns_desc": "当上游 DNS 服务器没有响应时使用的后备 DNS 服务器列表。语法与上面的「主要上游」字段相同。",
|
||||||
"fallback_dns_placeholder": "每行输入一个后备 DNS 服务器",
|
"fallback_dns_placeholder": "每行输入一个后备 DNS 服务器",
|
||||||
"local_ptr_title": "私人反向 DNS 服务器",
|
"local_ptr_title": "私人反向 DNS 服务器",
|
||||||
"local_ptr_desc": "AdGuard Home 用于本地 PTR 查询的 DNS 服务器。这些服务器将使用反向 DNS 解析具有私人 IP 地址的客户机的主机名,比如 \"192.168.12.34\"。如果没有设置,除非是 AdGuard Home 里设置的地址,AdGuard Home 都将自动使用您的操作系统的默认 DNS 解析器。",
|
"local_ptr_desc": "AdGuard Home 用于私人 PTR、SOA 和 NS 请求的 DNS 服务器。如果请求的 ARPA 域名包含私有 IP 范围内的子网(如 \"192.168.12.34\"),且请求来自具有私有 IP 地址的客户端,该请求被视为私有请求。如果未设置,将使用操作系统的默认 DNS 解析器,AdGuard Home IP 地址除外。",
|
||||||
"local_ptr_default_resolver": "AdGuard Home 默认使用下列反向 DNS 解析器: {{ip}}",
|
"local_ptr_default_resolver": "AdGuard Home 默认使用下列反向 DNS 解析器: {{ip}}",
|
||||||
"local_ptr_no_default_resolver": "AdGuard Home 无法为这个系统确定合适的私人反向 DNS 解析器。",
|
"local_ptr_no_default_resolver": "AdGuard Home 无法为这个系统确定合适的私人反向 DNS 解析器。",
|
||||||
"local_ptr_placeholder": "每行输入一个 IP 地址",
|
"local_ptr_placeholder": "每行输入一个 IP 地址",
|
||||||
"resolve_clients_title": "启用客户端的 IP 地址的反向解析",
|
"resolve_clients_title": "启用客户端的 IP 地址的反向解析",
|
||||||
"resolve_clients_desc": "通过发送 PTR 查询到对应的解析器 (本地客户端的私人 DNS 服务器,公共 IP 客户端的上游服务器) 将 IP 地址反向解析成其客户端主机名。",
|
"resolve_clients_desc": "通过发送 PTR 查询到对应的解析器 (本地客户端的私人 DNS 服务器,公共 IP 客户端的上游服务器) 将 IP 地址反向解析成其客户端主机名。",
|
||||||
"use_private_ptr_resolvers_title": "使用私人反向 DNS 解析器",
|
"use_private_ptr_resolvers_title": "使用私人反向 DNS 解析器",
|
||||||
"use_private_ptr_resolvers_desc": "使用这些上游服务器对本地服务的地址执行反向 DNS 查找。 如果禁用,则 AdGuard Home 会以 NXDOMAIN 响应所有此类 PTR 请求,从 DHCP、/etc/hosts 等获知的客户端除外。",
|
"use_private_ptr_resolvers_desc": "使用私有上游服务器、DHCP、/etc/hosts 等解决包含私有 IP 地址的 ARPA 域名的 PTR、SOA 和 NS 请求。如果禁用,AdGuard Home 将以 NXDOMAIN 回应所有此类请求。",
|
||||||
"check_dhcp_servers": "检查 DHCP 服务器",
|
"check_dhcp_servers": "检查 DHCP 服务器",
|
||||||
"save_config": "保存配置",
|
"save_config": "保存配置",
|
||||||
"enabled_dhcp": "DHCP 服务器已启用",
|
"enabled_dhcp": "DHCP 服务器已启用",
|
||||||
@@ -154,7 +154,7 @@
|
|||||||
"use_adguard_parental": "使用 AdGuard 【家长控制】服务",
|
"use_adguard_parental": "使用 AdGuard 【家长控制】服务",
|
||||||
"use_adguard_parental_hint": "AdGuard Home 将使用与浏览安全服务相同的隐私性强的 API 来检查域名指向的网站是否包含成人内容。",
|
"use_adguard_parental_hint": "AdGuard Home 将使用与浏览安全服务相同的隐私性强的 API 来检查域名指向的网站是否包含成人内容。",
|
||||||
"enforce_safe_search": "使用安全搜索",
|
"enforce_safe_search": "使用安全搜索",
|
||||||
"enforce_save_search_hint": "AdGuard Home 对以下搜索引擎可强制启用安全搜索:Google、YouTube、Bing、DuckDuckGo、Yandex、Pixabay。",
|
"enforce_save_search_hint": "AdGuard Home 将会在下列搜索引擎中强制启用安全搜索:Google、YouTube、Bing、DuckDuckGo、Ecosia、Yandex、Pixabay。",
|
||||||
"no_servers_specified": "未找到指定的服务器",
|
"no_servers_specified": "未找到指定的服务器",
|
||||||
"general_settings": "常规设置",
|
"general_settings": "常规设置",
|
||||||
"dns_settings": "DNS 设置",
|
"dns_settings": "DNS 设置",
|
||||||
@@ -236,6 +236,7 @@
|
|||||||
"updated_upstream_dns_toast": "上游服务器保存成功",
|
"updated_upstream_dns_toast": "上游服务器保存成功",
|
||||||
"dns_test_ok_toast": "指定的 DNS 服务器现已正常运行",
|
"dns_test_ok_toast": "指定的 DNS 服务器现已正常运行",
|
||||||
"dns_test_not_ok_toast": "服务器 \"{{key}}\":无法使用,请检查你输入的是否正确",
|
"dns_test_not_ok_toast": "服务器 \"{{key}}\":无法使用,请检查你输入的是否正确",
|
||||||
|
"dns_test_parsing_error_toast": "第 {{section}} 节:第 {{line}} 行:无法使用,请检查您输入的是否正确",
|
||||||
"dns_test_warning_toast": "上游 “{{key}}” 不响应测试请求,可能无法正常工作",
|
"dns_test_warning_toast": "上游 “{{key}}” 不响应测试请求,可能无法正常工作",
|
||||||
"unblock": "放行",
|
"unblock": "放行",
|
||||||
"block": "拦截",
|
"block": "拦截",
|
||||||
@@ -243,6 +244,7 @@
|
|||||||
"allow_this_client": "允许这个客户端",
|
"allow_this_client": "允许这个客户端",
|
||||||
"block_for_this_client_only": "仅对此客户端拦截",
|
"block_for_this_client_only": "仅对此客户端拦截",
|
||||||
"unblock_for_this_client_only": "仅解除对此客户端的拦截",
|
"unblock_for_this_client_only": "仅解除对此客户端的拦截",
|
||||||
|
"add_persistent_client": "添加为持久客户端",
|
||||||
"time_table_header": "时间",
|
"time_table_header": "时间",
|
||||||
"date": "日期",
|
"date": "日期",
|
||||||
"domain_name_table_header": "域名",
|
"domain_name_table_header": "域名",
|
||||||
@@ -292,6 +294,9 @@
|
|||||||
"blocked_response_ttl": "屏蔽的 TTL 应答",
|
"blocked_response_ttl": "屏蔽的 TTL 应答",
|
||||||
"blocked_response_ttl_desc": "指定客户端应缓存已过滤响应的秒数",
|
"blocked_response_ttl_desc": "指定客户端应缓存已过滤响应的秒数",
|
||||||
"form_enter_blocked_response_ttl": "输入拦截的 TTL 应答(秒)",
|
"form_enter_blocked_response_ttl": "输入拦截的 TTL 应答(秒)",
|
||||||
|
"upstream_timeout": "上游超时",
|
||||||
|
"upstream_timeout_desc": "指定等待上游服务器响应的秒数",
|
||||||
|
"form_enter_upstream_timeout": "输入上游服务器超时时间(以秒为单位)",
|
||||||
"dnscrypt": "DNSCrypt",
|
"dnscrypt": "DNSCrypt",
|
||||||
"dns_over_https": "DNS-over-HTTPS",
|
"dns_over_https": "DNS-over-HTTPS",
|
||||||
"dns_over_tls": "DNS-over-TLS",
|
"dns_over_tls": "DNS-over-TLS",
|
||||||
@@ -423,6 +428,9 @@
|
|||||||
"encryption_hostnames": "主机名",
|
"encryption_hostnames": "主机名",
|
||||||
"encryption_reset": "您确定想要重置加密设置?",
|
"encryption_reset": "您确定想要重置加密设置?",
|
||||||
"encryption_warning": "警告",
|
"encryption_warning": "警告",
|
||||||
|
"encryption_plain_dns_enable": "启用无加密 DNS",
|
||||||
|
"encryption_plain_dns_desc": "默认情况下启用无加密 DNS。用户可以禁用它,强制所有设备使用加密 DNS。为此,必须至少启用一个加密 DNS 协议",
|
||||||
|
"encryption_plain_dns_error": "要禁用无加密 DNS,请至少启用一个加密 DNS 协议",
|
||||||
"topline_expiring_certificate": "您的 SSL 证书即将过期。请更新 <0>加密设置</0> 。",
|
"topline_expiring_certificate": "您的 SSL 证书即将过期。请更新 <0>加密设置</0> 。",
|
||||||
"topline_expired_certificate": "您的 SSL 证书已过期。请更新 <0>加密设置</0> 。",
|
"topline_expired_certificate": "您的 SSL 证书已过期。请更新 <0>加密设置</0> 。",
|
||||||
"form_error_port_range": "输入 80 - 65535 范围内的端口值",
|
"form_error_port_range": "输入 80 - 65535 范围内的端口值",
|
||||||
@@ -462,6 +470,7 @@
|
|||||||
"form_add_id": "添加标识符",
|
"form_add_id": "添加标识符",
|
||||||
"form_client_name": "输入客户端名称",
|
"form_client_name": "输入客户端名称",
|
||||||
"name": "名称",
|
"name": "名称",
|
||||||
|
"client_name": "客户端 {{id}}",
|
||||||
"client_global_settings": "使用全局设置",
|
"client_global_settings": "使用全局设置",
|
||||||
"client_deleted": "客户端 \"{{key}}\" 删除成功",
|
"client_deleted": "客户端 \"{{key}}\" 删除成功",
|
||||||
"client_added": "客户端 \"{{key}}\" 添加成功",
|
"client_added": "客户端 \"{{key}}\" 添加成功",
|
||||||
@@ -592,7 +601,7 @@
|
|||||||
"disable_ipv6": "禁用 IPv6 地址的解析",
|
"disable_ipv6": "禁用 IPv6 地址的解析",
|
||||||
"disable_ipv6_desc": "丢弃对 IPv6 地址(类型 AAAA)的所有 DNS 查询,并从 HTTPS 响应中删除 IPv6 相关的信息。",
|
"disable_ipv6_desc": "丢弃对 IPv6 地址(类型 AAAA)的所有 DNS 查询,并从 HTTPS 响应中删除 IPv6 相关的信息。",
|
||||||
"fastest_addr": "最快的 IP 地址",
|
"fastest_addr": "最快的 IP 地址",
|
||||||
"fastest_addr_desc": "查询所有 DNS 服务器并返回所有响应中速度最快的 IP 地址。因 AdGuard Home 必须等待全部 DNS 服务器响应,这会降低 DNS 查询的速度,但此举将会在总体上改善连接速度。",
|
"fastest_addr_desc": "等待<b>所有</b> DNS 服务器的响应,测量每个服务器的 TCP 连接速度,并返回连接速度最快的服务器的 IP 地址。<br/>如果一个或多个上游服务器没有响应,此模式会显著减慢 DNS 查询速度。确保您的上游服务器稳定且上游超时时间短。",
|
||||||
"autofix_warning_text": "若您单击「修复」,AdGuard Home 将会配置您的系统以使用 AdGuard Home 的 DNS 服务器。",
|
"autofix_warning_text": "若您单击「修复」,AdGuard Home 将会配置您的系统以使用 AdGuard Home 的 DNS 服务器。",
|
||||||
"autofix_warning_list": "其将会进行如下工作:<0>停用系统DNSStubListener</0><0>设置DNS服务器地址为127.0.0.1</0><0>将/etc/resolv.conf的符号链接目标替换为/run/systemd/resolv/resolv.conf</0><0>停止DNSStubListener(重新加载系统解析服务)</0>",
|
"autofix_warning_list": "其将会进行如下工作:<0>停用系统DNSStubListener</0><0>设置DNS服务器地址为127.0.0.1</0><0>将/etc/resolv.conf的符号链接目标替换为/run/systemd/resolv/resolv.conf</0><0>停止DNSStubListener(重新加载系统解析服务)</0>",
|
||||||
"autofix_warning_result": "因此,默认情况下所有来自系统的 DNS 请求都将由 AdGuard Home 处理。",
|
"autofix_warning_result": "因此,默认情况下所有来自系统的 DNS 请求都将由 AdGuard Home 处理。",
|
||||||
@@ -672,7 +681,7 @@
|
|||||||
"use_saved_key": "使用之前保存的密钥",
|
"use_saved_key": "使用之前保存的密钥",
|
||||||
"parental_control": "家长控制",
|
"parental_control": "家长控制",
|
||||||
"safe_browsing": "安全浏览",
|
"safe_browsing": "安全浏览",
|
||||||
"served_from_cache": "{{value}}<i>(由缓存提供)</i>",
|
"served_from_cache_label": "从缓存中",
|
||||||
"form_error_password_length": "密码长度必须为 {{min}} 到 {{max}} 个字符",
|
"form_error_password_length": "密码长度必须为 {{min}} 到 {{max}} 个字符",
|
||||||
"anonymizer_notification": "<0>注意:</0> IP 匿名化已启用。您可以在<1>常规设置</1>中禁用它。",
|
"anonymizer_notification": "<0>注意:</0> IP 匿名化已启用。您可以在<1>常规设置</1>中禁用它。",
|
||||||
"confirm_dns_cache_clear": "您确定要清除 DNS 缓存吗?",
|
"confirm_dns_cache_clear": "您确定要清除 DNS 缓存吗?",
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
{
|
{
|
||||||
"client_settings": "用戶端設定",
|
"client_settings": "用戶端設定",
|
||||||
"example_upstream_reserved": "您可以<0>指定網域</0>使用特定 DNS 查詢",
|
"example_upstream_reserved": "您可以<0>指定網域</0>使用特定 DNS 查詢",
|
||||||
|
"example_multiple_upstreams_reserved": "多個上游 <0>for 特定網域</0>;",
|
||||||
"example_upstream_comment": "您可以指定註解",
|
"example_upstream_comment": "您可以指定註解",
|
||||||
"upstream_parallel": "使用平行查詢,同時查詢所有上游伺服器來加速解析結果",
|
"upstream_parallel": "使用平行查詢,同時查詢所有上游伺服器來加速解析結果",
|
||||||
"parallel_requests": "平行處理",
|
"parallel_requests": "平行處理",
|
||||||
@@ -8,6 +9,9 @@
|
|||||||
"load_balancing_desc": "一次只查詢一個伺服器。AdGuard Home 會使用加權隨機取樣來選擇使用的查詢結果,以確保速度最快的伺服器能被充分運用。",
|
"load_balancing_desc": "一次只查詢一個伺服器。AdGuard Home 會使用加權隨機取樣來選擇使用的查詢結果,以確保速度最快的伺服器能被充分運用。",
|
||||||
"bootstrap_dns": "引導(Boostrap) DNS 伺服器",
|
"bootstrap_dns": "引導(Boostrap) DNS 伺服器",
|
||||||
"bootstrap_dns_desc": "Bootstrap DNS 伺服器用於解析您所設定的上游 DoH/DoT 解析器的 IP 地址",
|
"bootstrap_dns_desc": "Bootstrap DNS 伺服器用於解析您所設定的上游 DoH/DoT 解析器的 IP 地址",
|
||||||
|
"fallback_dns_title": "備用 DNS 伺服器",
|
||||||
|
"fallback_dns_desc": "備用 DNS 伺服器列表:於主要 DNS 伺服器沒有回應時使用。語法與主要 DNS 伺服器設定欄位相同。",
|
||||||
|
"fallback_dns_placeholder": "每行輸入一個備用 DNS 伺服器",
|
||||||
"local_ptr_title": "私人 DNS 伺服器",
|
"local_ptr_title": "私人 DNS 伺服器",
|
||||||
"local_ptr_desc": "AdGuard Home 用於區域 PTR 查詢的 DNS 伺服器。這些伺服器將用於解析具有私人 IP 位址的用戶端的主機名稱,例如 \"192.168.12.34\",使用 rDNS。如果沒有設定,AdGuard Home 將自動使用您的系統預設 DNS 解析。",
|
"local_ptr_desc": "AdGuard Home 用於區域 PTR 查詢的 DNS 伺服器。這些伺服器將用於解析具有私人 IP 位址的用戶端的主機名稱,例如 \"192.168.12.34\",使用 rDNS。如果沒有設定,AdGuard Home 將自動使用您的系統預設 DNS 解析。",
|
||||||
"local_ptr_default_resolver": "AdGuard Home 預設使用以下作為 DNS 反解器:{{ip}}",
|
"local_ptr_default_resolver": "AdGuard Home 預設使用以下作為 DNS 反解器:{{ip}}",
|
||||||
@@ -37,17 +41,19 @@
|
|||||||
"dhcp_ipv6_settings": "DHCP IPv6 設定",
|
"dhcp_ipv6_settings": "DHCP IPv6 設定",
|
||||||
"form_error_required": "必要欄位",
|
"form_error_required": "必要欄位",
|
||||||
"form_error_ip4_format": "無效的 IPv4 格式",
|
"form_error_ip4_format": "無效的 IPv4 格式",
|
||||||
"form_error_ip6_format": "無效的 IPv6 格式",
|
|
||||||
"form_error_ip4_gateway_format": "閘道的 IPv4 位址無效",
|
"form_error_ip4_gateway_format": "閘道的 IPv4 位址無效",
|
||||||
"form_error_ip_format": "無效的 IP 位址",
|
"form_error_ip6_format": "無效的 IPv6 格式",
|
||||||
|
"form_error_ip_format": "無效的 IP 格式",
|
||||||
"form_error_mac_format": "無效的 「MAC 位址」格式",
|
"form_error_mac_format": "無效的 「MAC 位址」格式",
|
||||||
"form_error_client_id_format": "無效的「客戶端 ID」格式",
|
"form_error_client_id_format": "無效的「客戶端 ID」格式",
|
||||||
"form_error_server_name": "無效伺服器名稱",
|
"form_error_server_name": "無效伺服器名稱",
|
||||||
"form_error_subnet": "子網路 \"{{cidr}}\" 不包含 IP 位址 \"{{ip}}\"",
|
"form_error_subnet": "子網路 \"{{cidr}}\" 不包含 IP 位址 \"{{ip}}\"",
|
||||||
"form_error_positive": "數值必須大於 0",
|
"form_error_positive": "數值必須大於 0",
|
||||||
|
"form_error_gateway_ip": "租約不能使用閘道器的 IP 位址",
|
||||||
"out_of_range_error": "必須介於 \"{{start}}\" - \"{{end}}\" 範圍之外",
|
"out_of_range_error": "必須介於 \"{{start}}\" - \"{{end}}\" 範圍之外",
|
||||||
"lower_range_start_error": "必須小於起始值",
|
"lower_range_start_error": "必須小於起始值",
|
||||||
"greater_range_start_error": "必須大於起始值",
|
"greater_range_start_error": "必須大於起始值",
|
||||||
|
"subnet_error": "地址必須在同一個子網路中",
|
||||||
"gateway_or_subnet_invalid": "無效子網路",
|
"gateway_or_subnet_invalid": "無效子網路",
|
||||||
"dhcp_form_gateway_input": "閘道 IP 位址",
|
"dhcp_form_gateway_input": "閘道 IP 位址",
|
||||||
"dhcp_form_subnet_input": "子網路遮罩",
|
"dhcp_form_subnet_input": "子網路遮罩",
|
||||||
@@ -68,7 +74,9 @@
|
|||||||
"dhcp_dynamic_ip_found": "您的網路介面 <0>{{interfaceName}}</0> 正在使用動態 IP,要使用 DHCP 伺服器必須指定靜態 IP 給 AdGuard。\n目前您的 IP 位址 <0>{{ipAddress}}</0>,啟用 DHCP 後此 IP 將自動設定為靜態 IP 位址。",
|
"dhcp_dynamic_ip_found": "您的網路介面 <0>{{interfaceName}}</0> 正在使用動態 IP,要使用 DHCP 伺服器必須指定靜態 IP 給 AdGuard。\n目前您的 IP 位址 <0>{{ipAddress}}</0>,啟用 DHCP 後此 IP 將自動設定為靜態 IP 位址。",
|
||||||
"dhcp_lease_added": "靜態租用 \"{{key}}\" 已新增成功",
|
"dhcp_lease_added": "靜態租用 \"{{key}}\" 已新增成功",
|
||||||
"dhcp_lease_deleted": "靜態租用 \"{{key}}\" 已刪除成功",
|
"dhcp_lease_deleted": "靜態租用 \"{{key}}\" 已刪除成功",
|
||||||
|
"dhcp_lease_updated": "靜態租約 \"{{key}}\" 已成功更新",
|
||||||
"dhcp_new_static_lease": "新增靜態租用",
|
"dhcp_new_static_lease": "新增靜態租用",
|
||||||
|
"dhcp_edit_static_lease": "編輯靜態租約",
|
||||||
"dhcp_static_leases_not_found": "找不到 DHCP 靜態租用",
|
"dhcp_static_leases_not_found": "找不到 DHCP 靜態租用",
|
||||||
"dhcp_add_static_lease": "新增靜態租用",
|
"dhcp_add_static_lease": "新增靜態租用",
|
||||||
"dhcp_reset_leases": "重置所有 DHCP 租約",
|
"dhcp_reset_leases": "重置所有 DHCP 租約",
|
||||||
@@ -112,7 +120,8 @@
|
|||||||
"stats_malware_phishing": "已封鎖惡意軟體/網路釣魚",
|
"stats_malware_phishing": "已封鎖惡意軟體/網路釣魚",
|
||||||
"stats_adult": "已封鎖成人網站",
|
"stats_adult": "已封鎖成人網站",
|
||||||
"stats_query_domain": "熱門查詢網域排行",
|
"stats_query_domain": "熱門查詢網域排行",
|
||||||
"for_last_24_hours": "過去 24 小時",
|
"for_last_hours": "在過去 {{count}} 小時",
|
||||||
|
"for_last_hours_plural": "在過去 {{count}} 小時裡",
|
||||||
"for_last_days": "最近 {{count}} 天內",
|
"for_last_days": "最近 {{count}} 天內",
|
||||||
"for_last_days_plural": "最近 {{count}} 天內",
|
"for_last_days_plural": "最近 {{count}} 天內",
|
||||||
"stats_disabled": "已禁用統計資料。您可以從<0>設定頁面</0>打開它。",
|
"stats_disabled": "已禁用統計資料。您可以從<0>設定頁面</0>打開它。",
|
||||||
@@ -123,15 +132,20 @@
|
|||||||
"top_clients": "熱門用戶端排行",
|
"top_clients": "熱門用戶端排行",
|
||||||
"no_clients_found": "找不到用戶端",
|
"no_clients_found": "找不到用戶端",
|
||||||
"general_statistics": "一般統計資料",
|
"general_statistics": "一般統計資料",
|
||||||
|
"top_upstreams": "熱門上游伺服器",
|
||||||
|
"no_upstreams_data_found": "找不到上游數據",
|
||||||
"number_of_dns_query_days": "過去 {{count}} 天內 DNS 查詢總數",
|
"number_of_dns_query_days": "過去 {{count}} 天內 DNS 查詢總數",
|
||||||
"number_of_dns_query_days_plural": "過去 {{count}} 天內 DNS 查詢總數",
|
"number_of_dns_query_days_plural": "過去 {{count}} 天內 DNS 查詢總數",
|
||||||
"number_of_dns_query_24_hours": "過去 24小時內 DNS 查詢總數",
|
"number_of_dns_query_hours": "過去 {{count}} 小時處理的 DNS 查詢數量",
|
||||||
|
"number_of_dns_query_hours_plural": "過去 {{count}} 小時處理的 DNS 查詢數量",
|
||||||
"number_of_dns_query_blocked_24_hours": "已被廣告過濾器與主機黑名單封鎖 DNS 查詢總數",
|
"number_of_dns_query_blocked_24_hours": "已被廣告過濾器與主機黑名單封鎖 DNS 查詢總數",
|
||||||
"number_of_dns_query_blocked_24_hours_by_sec": "已被 AdGuard 瀏覽安全模組封鎖的 DNS 查詢總數",
|
"number_of_dns_query_blocked_24_hours_by_sec": "已被 AdGuard 瀏覽安全模組封鎖的 DNS 查詢總數",
|
||||||
"number_of_dns_query_blocked_24_hours_adult": "已封鎖成人網站總數",
|
"number_of_dns_query_blocked_24_hours_adult": "已封鎖成人網站總數",
|
||||||
"enforced_save_search": "強制使用安全搜尋",
|
"enforced_save_search": "強制使用安全搜尋",
|
||||||
"number_of_dns_query_to_safe_search": "已強制使用安全搜尋總數",
|
"number_of_dns_query_to_safe_search": "已強制使用安全搜尋總數",
|
||||||
"average_processing_time": "平均的處理時間",
|
"average_processing_time": "平均的處理時間",
|
||||||
|
"average_upstream_response_time": "平均上游伺服器回應時間",
|
||||||
|
"response_time": "回應時間",
|
||||||
"average_processing_time_hint": "處理 DNS 請求的平均時間(毫秒)",
|
"average_processing_time_hint": "處理 DNS 請求的平均時間(毫秒)",
|
||||||
"block_domain_use_filters_and_hosts": "使用過濾器與 hosts 檔案阻擋網域查詢",
|
"block_domain_use_filters_and_hosts": "使用過濾器與 hosts 檔案阻擋網域查詢",
|
||||||
"filters_block_toggle_hint": "您可在<a>過濾器</a>設定中設定封鎖規則。",
|
"filters_block_toggle_hint": "您可在<a>過濾器</a>設定中設定封鎖規則。",
|
||||||
@@ -156,6 +170,7 @@
|
|||||||
"upstream_dns_configured_in_file": "設定在 {{path}}",
|
"upstream_dns_configured_in_file": "設定在 {{path}}",
|
||||||
"test_upstream_btn": "測試上游 DNS",
|
"test_upstream_btn": "測試上游 DNS",
|
||||||
"upstreams": "上游",
|
"upstreams": "上游",
|
||||||
|
"upstream": "上游伺服器",
|
||||||
"apply_btn": "套用",
|
"apply_btn": "套用",
|
||||||
"disabled_filtering_toast": "已停用過濾",
|
"disabled_filtering_toast": "已停用過濾",
|
||||||
"enabled_filtering_toast": "已啟用過濾",
|
"enabled_filtering_toast": "已啟用過濾",
|
||||||
@@ -164,6 +179,7 @@
|
|||||||
"disabled_parental_toast": "已停用家長監護",
|
"disabled_parental_toast": "已停用家長監護",
|
||||||
"enabled_parental_toast": "已啟用家長監護",
|
"enabled_parental_toast": "已啟用家長監護",
|
||||||
"disabled_safe_search_toast": "已停用安全搜尋",
|
"disabled_safe_search_toast": "已停用安全搜尋",
|
||||||
|
"enabled_save_search_toast": "已啟用安全搜尋",
|
||||||
"updated_save_search_toast": "已更新安全搜尋設定",
|
"updated_save_search_toast": "已更新安全搜尋設定",
|
||||||
"enabled_table_header": "啟用",
|
"enabled_table_header": "啟用",
|
||||||
"name_table_header": "名稱",
|
"name_table_header": "名稱",
|
||||||
@@ -206,24 +222,29 @@
|
|||||||
"example_comment_hash": "# Also a comment",
|
"example_comment_hash": "# Also a comment",
|
||||||
"example_regex_meaning": "使用正規表示式(Regular Expression)來阻止對應的網域查詢",
|
"example_regex_meaning": "使用正規表示式(Regular Expression)來阻止對應的網域查詢",
|
||||||
"example_upstream_regular": "一般 DNS(透過 UDP)",
|
"example_upstream_regular": "一般 DNS(透過 UDP)",
|
||||||
|
"example_upstream_regular_port": "一般 DNS(透過 UDP,連接埠)",
|
||||||
|
"example_upstream_udp": "一般 DNS(透過 UDP,主機名稱)",
|
||||||
"example_upstream_dot": "<0>DNS-over-TLS</0>(流量加密)",
|
"example_upstream_dot": "<0>DNS-over-TLS</0>(流量加密)",
|
||||||
"example_upstream_doh": "<0>DNS-over-HTTPS</0>(流量加密)",
|
"example_upstream_doh": "<0>DNS-over-HTTPS</0>(流量加密)",
|
||||||
|
"example_upstream_doh3": "使 DNS-over-HTTPS 強制使用 <0>HTTP/3</0> ,並禁止使用後備 HTTP/2 或更低版本;",
|
||||||
"example_upstream_doq": "加密 <0>DNS-over-QUIC</0>",
|
"example_upstream_doq": "加密 <0>DNS-over-QUIC</0>",
|
||||||
"example_upstream_sdns": "您可以使透過 <0>DNS Stamps</0> 來解析 <1>DNSCrypt</1> 或 <2>DNS-over-HTTPS</2>",
|
"example_upstream_sdns": "您可以使透過 <0>DNS Stamps</0> 來解析 <1>DNSCrypt</1> 或 <2>DNS-over-HTTPS</2>",
|
||||||
"example_upstream_tcp": "一般 DNS(透過 TCP)",
|
"example_upstream_tcp": "一般 DNS(透過 TCP)",
|
||||||
"example_upstream_regular_port": "一般 DNS(透過 UDP,連接埠)",
|
|
||||||
"example_upstream_udp": "一般 DNS(透過 UDP,主機名稱)",
|
|
||||||
"example_upstream_tcp_port": "一般 DNS(透過 TCP,連接埠)",
|
"example_upstream_tcp_port": "一般 DNS(透過 TCP,連接埠)",
|
||||||
"example_upstream_tcp_hostname": "一般 DNS(透過 TCP,主機名稱)",
|
"example_upstream_tcp_hostname": "一般 DNS(透過 TCP,主機名稱)",
|
||||||
"all_lists_up_to_date_toast": "所有清單已更新至最新",
|
"all_lists_up_to_date_toast": "所有清單已更新至最新",
|
||||||
|
"updated_upstream_dns_toast": "已更新上游 DNS 伺服器",
|
||||||
"dns_test_ok_toast": "設定中的 DNS 上游運作正常",
|
"dns_test_ok_toast": "設定中的 DNS 上游運作正常",
|
||||||
"dns_test_not_ok_toast": "DNS 設定中的 \"{{key}}\" 出現錯誤,請確認是否正確輸入",
|
"dns_test_not_ok_toast": "DNS 設定中的 \"{{key}}\" 出現錯誤,請確認是否正確輸入",
|
||||||
|
"dns_test_parsing_error_toast": "在 {{section}} 部分中:第 {{line}} 行:無法使用,請檢查您是否有正確地填寫",
|
||||||
|
"dns_test_warning_toast": "上游伺服器 \"{{key}}\" 沒有回應測試請求,可能無法正常運作",
|
||||||
"unblock": "解除封鎖",
|
"unblock": "解除封鎖",
|
||||||
"block": "封鎖",
|
"block": "封鎖",
|
||||||
"disallow_this_client": "不允許此用戶端",
|
"disallow_this_client": "不允許此用戶端",
|
||||||
"allow_this_client": "允許此用戶端",
|
"allow_this_client": "允許此用戶端",
|
||||||
"block_for_this_client_only": "僅封鎖此用戶端",
|
"block_for_this_client_only": "僅封鎖此用戶端",
|
||||||
"unblock_for_this_client_only": "僅解除封鎖此用戶端",
|
"unblock_for_this_client_only": "僅解除封鎖此用戶端",
|
||||||
|
"add_persistent_client": "加入到用戶端",
|
||||||
"time_table_header": "時間",
|
"time_table_header": "時間",
|
||||||
"date": "日期",
|
"date": "日期",
|
||||||
"domain_name_table_header": "域名",
|
"domain_name_table_header": "域名",
|
||||||
@@ -270,6 +291,9 @@
|
|||||||
"custom_ip": "自訂 IP 位址",
|
"custom_ip": "自訂 IP 位址",
|
||||||
"blocking_ipv4": "封鎖 IPv4",
|
"blocking_ipv4": "封鎖 IPv4",
|
||||||
"blocking_ipv6": "封鎖 IPv6",
|
"blocking_ipv6": "封鎖 IPv6",
|
||||||
|
"blocked_response_ttl": "阻塞響應 TTL",
|
||||||
|
"blocked_response_ttl_desc": "指定客戶端應快取過濾回應的秒數",
|
||||||
|
"form_enter_blocked_response_ttl": "輸入已封鎖的回應 TTL(秒)",
|
||||||
"dnscrypt": "DNSCrypt",
|
"dnscrypt": "DNSCrypt",
|
||||||
"dns_over_https": "DNS-over-HTTPS",
|
"dns_over_https": "DNS-over-HTTPS",
|
||||||
"dns_over_tls": "DNS-over-TLS",
|
"dns_over_tls": "DNS-over-TLS",
|
||||||
@@ -288,6 +312,16 @@
|
|||||||
"edns_use_custom_ip": "使用自訂 EDNS IP",
|
"edns_use_custom_ip": "使用自訂 EDNS IP",
|
||||||
"edns_use_custom_ip_desc": "允許使用自訂 EDNS IP",
|
"edns_use_custom_ip_desc": "允許使用自訂 EDNS IP",
|
||||||
"rate_limit_desc": "限制單一裝置每秒發出的查詢次數(設定為 0 即表示無限制)",
|
"rate_limit_desc": "限制單一裝置每秒發出的查詢次數(設定為 0 即表示無限制)",
|
||||||
|
"rate_limit_subnet_len_ipv4": "IPv4 位址的子網路前綴長度",
|
||||||
|
"rate_limit_subnet_len_ipv4_desc": "用於速率限制的 IPv4 位址的子網路前綴長度。 預設為 24",
|
||||||
|
"rate_limit_subnet_len_ipv4_error": "IPv4 子網路前綴長度應介於 0 到 32 之間",
|
||||||
|
"rate_limit_subnet_len_ipv6": "IPv6 位址的子網路前綴長度",
|
||||||
|
"rate_limit_subnet_len_ipv6_desc": "用於速率限制的 IPv6 位址的子網路前綴長度。 預設為 56",
|
||||||
|
"rate_limit_subnet_len_ipv6_error": "IPv6 子網路前綴長度應介於 0 到 128 之間",
|
||||||
|
"form_enter_rate_limit_subnet_len": "輸入速率限制的子網路前綴長度",
|
||||||
|
"rate_limit_whitelist": "速率限制白名單",
|
||||||
|
"rate_limit_whitelist_desc": "排除在速率限制之外的 IP 位址",
|
||||||
|
"rate_limit_whitelist_placeholder": "每行輸入一個 IP 地址",
|
||||||
"blocking_ipv4_desc": "回覆指定 IPv4 位址給被封鎖的網域的 A 紀錄查詢",
|
"blocking_ipv4_desc": "回覆指定 IPv4 位址給被封鎖的網域的 A 紀錄查詢",
|
||||||
"blocking_ipv6_desc": "回覆指定 IPv6 位址給被封鎖的網域的 AAAA 紀錄查詢",
|
"blocking_ipv6_desc": "回覆指定 IPv6 位址給被封鎖的網域的 AAAA 紀錄查詢",
|
||||||
"blocking_mode_default": "預設:被 Adblock 規則封鎖時回應零值的 IP 位址(A 紀錄回應 0.0.0.0 ,AAAA 紀錄回應 ::);被 /etc/hosts 規則封鎖時回應規則中指定 IP 位址",
|
"blocking_mode_default": "預設:被 Adblock 規則封鎖時回應零值的 IP 位址(A 紀錄回應 0.0.0.0 ,AAAA 紀錄回應 ::);被 /etc/hosts 規則封鎖時回應規則中指定 IP 位址",
|
||||||
@@ -391,6 +425,9 @@
|
|||||||
"encryption_hostnames": "主機名稱",
|
"encryption_hostnames": "主機名稱",
|
||||||
"encryption_reset": "您確定要重設加密設定嗎?",
|
"encryption_reset": "您確定要重設加密設定嗎?",
|
||||||
"encryption_warning": "警告",
|
"encryption_warning": "警告",
|
||||||
|
"encryption_plain_dns_enable": "啟用一般 DNS",
|
||||||
|
"encryption_plain_dns_desc": "預設情況下已啟用一般 DNS。您可以將其停用以強制所有裝置使用加密 DNS。要執行此操作,您必須啟用至少一個加密的 DNS 協定。",
|
||||||
|
"encryption_plain_dns_error": "若要停用一般 DNS,請啟用至少一個加密的 DNS 協定",
|
||||||
"topline_expiring_certificate": "您的 SSL 憑證即將到期。請前往<0>加密設定</0>更新。",
|
"topline_expiring_certificate": "您的 SSL 憑證即將到期。請前往<0>加密設定</0>更新。",
|
||||||
"topline_expired_certificate": "您的 SSL 憑證已到期。請前往<0>加密設定</0>更新。",
|
"topline_expired_certificate": "您的 SSL 憑證已到期。請前往<0>加密設定</0>更新。",
|
||||||
"form_error_port_range": "輸入範圍 80-65535 中的值",
|
"form_error_port_range": "輸入範圍 80-65535 中的值",
|
||||||
@@ -430,6 +467,7 @@
|
|||||||
"form_add_id": "新增識別碼",
|
"form_add_id": "新增識別碼",
|
||||||
"form_client_name": "輸入用戶端名稱",
|
"form_client_name": "輸入用戶端名稱",
|
||||||
"name": "名稱",
|
"name": "名稱",
|
||||||
|
"client_name": "客戶端 {{id}}",
|
||||||
"client_global_settings": "使用全域設定",
|
"client_global_settings": "使用全域設定",
|
||||||
"client_deleted": "已刪除「{{key}}」",
|
"client_deleted": "已刪除「{{key}}」",
|
||||||
"client_added": "已新增「{{key}}」",
|
"client_added": "已新增「{{key}}」",
|
||||||
@@ -451,6 +489,7 @@
|
|||||||
"updates_checked": "檢查更新成功",
|
"updates_checked": "檢查更新成功",
|
||||||
"updates_version_equal": "AdGuard Home 是最新的版本",
|
"updates_version_equal": "AdGuard Home 是最新的版本",
|
||||||
"check_updates_now": "立即檢查更新",
|
"check_updates_now": "立即檢查更新",
|
||||||
|
"version_request_error": "更新檢查失敗。請檢查您的網絡連線。",
|
||||||
"dns_privacy": "DNS 隱私",
|
"dns_privacy": "DNS 隱私",
|
||||||
"setup_dns_privacy_1": "<0>DNS-over-TLS:</0>使用 <1>{{address}}</1>。",
|
"setup_dns_privacy_1": "<0>DNS-over-TLS:</0>使用 <1>{{address}}</1>。",
|
||||||
"setup_dns_privacy_2": "<0>DNS-over-HTTPS:</0>使用 <1>{{address}}</1>。",
|
"setup_dns_privacy_2": "<0>DNS-over-HTTPS:</0>使用 <1>{{address}}</1>。",
|
||||||
@@ -471,6 +510,7 @@
|
|||||||
"setup_dns_notice": "要使用 <1>DNS-over-HTTPS</1> 或 <1>DNS-over-TLS</1>,您必須先在 AdGuard Home 完成 <0>加密設定</0>。",
|
"setup_dns_notice": "要使用 <1>DNS-over-HTTPS</1> 或 <1>DNS-over-TLS</1>,您必須先在 AdGuard Home 完成 <0>加密設定</0>。",
|
||||||
"rewrite_added": "「{{key}}」的 DNS 覆寫新增成功",
|
"rewrite_added": "「{{key}}」的 DNS 覆寫新增成功",
|
||||||
"rewrite_deleted": "「{{key}}」的 DNS 覆寫刪除成功",
|
"rewrite_deleted": "「{{key}}」的 DNS 覆寫刪除成功",
|
||||||
|
"rewrite_updated": "已更新 DNS 覆寫",
|
||||||
"rewrite_add": "新增 DNS 覆寫",
|
"rewrite_add": "新增 DNS 覆寫",
|
||||||
"rewrite_edit": "編輯 DNS 覆寫",
|
"rewrite_edit": "編輯 DNS 覆寫",
|
||||||
"rewrite_not_found": "找不到 DNS 覆寫",
|
"rewrite_not_found": "找不到 DNS 覆寫",
|
||||||
@@ -522,6 +562,8 @@
|
|||||||
"statistics_enable": "啟用統計數據",
|
"statistics_enable": "啟用統計數據",
|
||||||
"ignore_domains": "已忽略網域(每行一個)",
|
"ignore_domains": "已忽略網域(每行一個)",
|
||||||
"ignore_domains_title": "已忽略網域",
|
"ignore_domains_title": "已忽略網域",
|
||||||
|
"ignore_domains_desc_stats": "符合這些規則的查詢不會被計入統計資料中",
|
||||||
|
"ignore_domains_desc_query": "符合這些規則的查詢不會被寫入查詢記錄中",
|
||||||
"interval_hours": "{{count}} 小時",
|
"interval_hours": "{{count}} 小時",
|
||||||
"interval_hours_plural": "{{count}} 小時",
|
"interval_hours_plural": "{{count}} 小時",
|
||||||
"filters_configuration": "過濾器設定",
|
"filters_configuration": "過濾器設定",
|
||||||
@@ -631,10 +673,19 @@
|
|||||||
"click_to_view_queries": "按一下以檢視查詢結果",
|
"click_to_view_queries": "按一下以檢視查詢結果",
|
||||||
"port_53_faq_link": "連接埠 53 經常被「DNSStubListener」或「systemd-resolved」服務佔用。請閱讀下列有關解決<0>這個問題</0>的說明",
|
"port_53_faq_link": "連接埠 53 經常被「DNSStubListener」或「systemd-resolved」服務佔用。請閱讀下列有關解決<0>這個問題</0>的說明",
|
||||||
"adg_will_drop_dns_queries": "AdGuard Home 將停止回應此用戶端的所有 DNS 查詢。",
|
"adg_will_drop_dns_queries": "AdGuard Home 將停止回應此用戶端的所有 DNS 查詢。",
|
||||||
|
"filter_allowlist": "警告:此操作同時會將規則 \"{{disallowed_rule}}\" 從允許的客戶端清單中排除。",
|
||||||
|
"last_rule_in_allowlist": "無法停用此客戶端,因為排除規則「{{disallowed_rule}}」會導致「允許的用戶端」清單停用。",
|
||||||
|
"use_saved_key": "使用先前儲存的鍵",
|
||||||
|
"parental_control": "家長監護",
|
||||||
"safe_browsing": "安全瀏覽",
|
"safe_browsing": "安全瀏覽",
|
||||||
"served_from_cache": "{{value}} <i>(由快取回應)</i>",
|
"served_from_cache_label": "由快取回應",
|
||||||
"form_error_password_length": "密碼必須至少 {{value}} 個字元長度",
|
"form_error_password_length": "密碼必須至少 {{value}} 個字元長度",
|
||||||
|
"anonymizer_notification": "<0>注意</0>: 已啟用 IP 去識別化。您可以在<1>一般設定</1>中停用它。",
|
||||||
|
"confirm_dns_cache_clear": "您確定要清除 DNS 快取嗎?",
|
||||||
|
"cache_cleared": "DNS 快取成功清除",
|
||||||
|
"clear_cache": "清除快取",
|
||||||
"make_static": "新增為靜態",
|
"make_static": "新增為靜態",
|
||||||
|
"theme_auto_desc": "自動(根據裝置調整)",
|
||||||
"theme_dark_desc": "深色主題",
|
"theme_dark_desc": "深色主題",
|
||||||
"theme_light_desc": "淺色主題",
|
"theme_light_desc": "淺色主題",
|
||||||
"disable_for_seconds": "{{count}} 秒",
|
"disable_for_seconds": "{{count}} 秒",
|
||||||
@@ -649,11 +700,48 @@
|
|||||||
"disable_notify_for_minutes": "暫停防護 {{count}} 分鐘",
|
"disable_notify_for_minutes": "暫停防護 {{count}} 分鐘",
|
||||||
"disable_notify_for_minutes_plural": "暫停防護 {{count}} 分鐘",
|
"disable_notify_for_minutes_plural": "暫停防護 {{count}} 分鐘",
|
||||||
"disable_notify_for_hours": "暫停防護 {{count}} 小時",
|
"disable_notify_for_hours": "暫停防護 {{count}} 小時",
|
||||||
|
"disable_notify_for_hours_plural": "停用保護 {{count}} 小時",
|
||||||
|
"disable_notify_until_tomorrow": "停用保護直至明天",
|
||||||
|
"enable_protection_timer": "保護功能將在 {{time}} 啟用",
|
||||||
|
"custom_retention_input": "輸入保存時長(單位:小時)",
|
||||||
|
"custom_rotation_input": "請輸入輪替週期(單位:小時)",
|
||||||
|
"protection_section_label": "保護",
|
||||||
|
"log_and_stats_section_label": "查詢日誌與統計資料",
|
||||||
|
"ignore_query_log": "在查詢日誌中忽略此客戶端",
|
||||||
|
"ignore_statistics": "在統計資料中忽略此客戶端",
|
||||||
|
"schedule_services": "暫停服務封鎖",
|
||||||
|
"schedule_services_desc": "設定服務封鎖過濾器的暫停排程",
|
||||||
|
"schedule_services_desc_client": "針對此用戶端,設定服務阻擋的暫停排程",
|
||||||
|
"schedule_desc": "設定已封鎖服務的閒置時段",
|
||||||
|
"schedule_invalid_select": "開始時間必須在結束時間之前",
|
||||||
|
"schedule_select_days": "選擇天數",
|
||||||
|
"schedule_timezone": "選擇時區",
|
||||||
|
"schedule_current_timezone": "目前時區:{{value}}",
|
||||||
|
"schedule_time_all_day": "全天",
|
||||||
|
"schedule_modal_description": "這個排程將會取代同一星期中所有現有的排程。每一天只能有一個閒置時段。",
|
||||||
|
"schedule_modal_time_off": "沒有封鎖服務:",
|
||||||
|
"schedule_new": "新排程",
|
||||||
|
"schedule_edit": "編輯排程",
|
||||||
|
"schedule_save": "儲存排程",
|
||||||
|
"schedule_add": "新增排程",
|
||||||
|
"schedule_remove": "移除排程",
|
||||||
|
"schedule_from": "從",
|
||||||
|
"schedule_to": "至",
|
||||||
|
"sunday": "星期日",
|
||||||
|
"monday": "星期一",
|
||||||
|
"tuesday": "星期二",
|
||||||
|
"wednesday": "星期三",
|
||||||
|
"thursday": "星期四",
|
||||||
|
"friday": "星期五",
|
||||||
|
"saturday": "星期六",
|
||||||
"sunday_short": "週日",
|
"sunday_short": "週日",
|
||||||
"monday_short": "週一",
|
"monday_short": "週一",
|
||||||
"tuesday_short": "週二",
|
"tuesday_short": "週二",
|
||||||
"wednesday_short": "週三",
|
"wednesday_short": "週三",
|
||||||
"thursday_short": "週四",
|
"thursday_short": "週四",
|
||||||
"friday_short": "週五",
|
"friday_short": "週五",
|
||||||
"saturday_short": "週六"
|
"saturday_short": "週六",
|
||||||
|
"upstream_dns_cache_configuration": "上游 DNS 快取設定",
|
||||||
|
"enable_upstream_dns_cache": "為此客戶端的自訂上游設定啟用 DNS 快取",
|
||||||
|
"dns_cache_size": "DNS 快取大小(bytes)"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6,31 +6,31 @@
|
|||||||
"upstream_parallel": "透過同時地查詢所有上游的伺服器,使用並行的查詢以加速解析。",
|
"upstream_parallel": "透過同時地查詢所有上游的伺服器,使用並行的查詢以加速解析。",
|
||||||
"parallel_requests": "並行的請求",
|
"parallel_requests": "並行的請求",
|
||||||
"load_balancing": "負載平衡",
|
"load_balancing": "負載平衡",
|
||||||
"load_balancing_desc": "每次查詢一個上游伺服器。AdGuard Home 使用它的加權隨機的演算法來選擇伺服器,以便最快的伺服器被更常使用。",
|
"load_balancing_desc": "一次查詢一台上游伺服器。<br/>AdGuard Home 使用加權隨機演算法來選擇具有最少失敗查詢和最低平均查詢時間的伺服器。",
|
||||||
"bootstrap_dns": "自我啟動(Bootstrap)DNS 伺服器",
|
"bootstrap_dns": "自我啟動(Bootstrap)DNS 伺服器",
|
||||||
"bootstrap_dns_desc": "DNS 伺服器的 IP 位址,用於解析您指定為上游伺服器的 DoH/DoT 解析器的 IP 位址。不允許註釋。",
|
"bootstrap_dns_desc": "DNS 伺服器的 IP 位址,用於解析您指定為上游伺服器的 DoH/DoT 解析器的 IP 位址。不允許註釋。",
|
||||||
"fallback_dns_title": "應變 DNS 伺服器",
|
"fallback_dns_title": "應變 DNS 伺服器",
|
||||||
"fallback_dns_desc": "當上游 DNS 伺服器未回覆時被使用的應變 DNS 伺服器之清單。此語法與在上面主要上游欄位中的相同。",
|
"fallback_dns_desc": "當上游 DNS 伺服器未回覆時被使用的應變 DNS 伺服器之清單。此語法與在上面主要上游欄位中的相同。",
|
||||||
"fallback_dns_placeholder": "每行輸入一個應變 DNS 伺服器",
|
"fallback_dns_placeholder": "每行輸入一個應變 DNS 伺服器",
|
||||||
"local_ptr_title": "私人反向的 DNS 伺服器",
|
"local_ptr_title": "私人反向的 DNS 伺服器",
|
||||||
"local_ptr_desc": "AdGuard Home 用於區域指標(PTR)查詢之 DNS 伺服器。這些伺服器被用於解析有關在私人 IP 範圍的位址之區域指標查詢,例如,\"192.168.12.34\",使用反向的 DNS。如果未被設定,AdGuard Home 使用您的作業系統之預設 DNS 解析器的位址。",
|
"local_ptr_desc": "AdGuard Home 使用的 DNS 伺服器用於私人 PTR、SOA 和 NS 請求。如果請求要求包含私人 IP 範圍內的子網域的 ARPA 網域(例如 \"192.168.12.34\"),並來自具有私人 IP 位址的用戶端,該請求被視為私人。如果未設定,將使用您的作業系統的預設 DNS 解析器,但不包括 AdGuard Home 的 IP 位址。",
|
||||||
"local_ptr_default_resolver": "預設下,AdGuard Home 使用以下反向的 DNS 解析器:{{ip}}。",
|
"local_ptr_default_resolver": "預設下,AdGuard Home 使用以下反向的 DNS 解析器:{{ip}}。",
|
||||||
"local_ptr_no_default_resolver": "AdGuard Home 無法為此系統決定合適的私人反向的 DNS 解析器。",
|
"local_ptr_no_default_resolver": "AdGuard Home 無法為此系統決定合適的私人反向的 DNS 解析器。",
|
||||||
"local_ptr_placeholder": "每行輸入一個 IP 位址",
|
"local_ptr_placeholder": "每行輸入一個 IP 位址",
|
||||||
"resolve_clients_title": "啟用用戶端的 IP 位址之反向的解析",
|
"resolve_clients_title": "啟用用戶端的 IP 位址之反向的解析",
|
||||||
"resolve_clients_desc": "透過傳送指標(PTR)查詢到對應的解析器(私人 DNS 伺服器供區域的用戶端,上游的伺服器供有公共 IP 位址的用戶端),反向地解析用戶端的 IP 位址變為它們的主機名稱。",
|
"resolve_clients_desc": "透過傳送指標(PTR)查詢到對應的解析器(私人 DNS 伺服器供區域的用戶端,上游的伺服器供有公共 IP 位址的用戶端),反向地解析用戶端的 IP 位址變為它們的主機名稱。",
|
||||||
"use_private_ptr_resolvers_title": "使用私人反向的 DNS 解析器",
|
"use_private_ptr_resolvers_title": "使用私人反向的 DNS 解析器",
|
||||||
"use_private_ptr_resolvers_desc": "對於正使用這些上游伺服器之區域服務的位址執行反向的 DNS 查找。如果被禁用,除已知來自 DHCP、/etc/hosts 等等的用戶端之外,AdGuard Home 對於所有此類的區域指標(PTR)請求以 NXDOMAIN 回覆。",
|
"use_private_ptr_resolvers_desc": "使用私人上游伺服器、DHCP、/etc/hosts 等方式解析包含私人 IP 位址的 ARPA 網域的 PTR、SOA 和 NS 請求。如果停用,AdGuard Home 將對所有此類請求以 NXDOMAIN 回應。",
|
||||||
"check_dhcp_servers": "檢查動態主機設定協定(DHCP)伺服器",
|
"check_dhcp_servers": "檢查動態主機設定協定(DHCP)伺服器",
|
||||||
"save_config": "儲存配置",
|
"save_config": "儲存配置",
|
||||||
"enabled_dhcp": "動態主機設定協定(DHCP)伺服器被啟用",
|
"enabled_dhcp": "動態主機設定協定(DHCP)伺服器被啟用",
|
||||||
"disabled_dhcp": "動態主機設定協定(DHCP)伺服器被禁用",
|
"disabled_dhcp": "DHCP 伺服器已停用",
|
||||||
"unavailable_dhcp": "DHCP 為不可用的",
|
"unavailable_dhcp": "DHCP 為不可用的",
|
||||||
"unavailable_dhcp_desc": "AdGuard Home 無法於您的作業系統上執行 DHCP 伺服器",
|
"unavailable_dhcp_desc": "AdGuard Home 無法於您的作業系統上執行 DHCP 伺服器",
|
||||||
"dhcp_title": "動態主機設定協定(DHCP)伺服器(實驗性的!)",
|
"dhcp_title": "動態主機設定協定(DHCP)伺服器(實驗性的!)",
|
||||||
"dhcp_description": "如果您的路由器未提供動態主機設定協定(DHCP)設定,您可使用 AdGuard 自身內建的 DHCP 伺服器。",
|
"dhcp_description": "如果您的路由器未提供動態主機設定協定(DHCP)設定,您可使用 AdGuard 自身內建的 DHCP 伺服器。",
|
||||||
"dhcp_enable": "啟用動態主機設定協定(DHCP)伺服器",
|
"dhcp_enable": "啟用動態主機設定協定(DHCP)伺服器",
|
||||||
"dhcp_disable": "禁用動態主機設定協定(DHCP)伺服器",
|
"dhcp_disable": "停用 DHCP 伺服器",
|
||||||
"dhcp_not_found": "因為 AdGuard Home 於該網路上未發現任何現行的 DHCP 伺服器,啟用內建的動態主機設定協定(DHCP)伺服器為安全的。然而,您應手動地重新檢查那個,因為自動的探查目前不予 100% 保證。",
|
"dhcp_not_found": "因為 AdGuard Home 於該網路上未發現任何現行的 DHCP 伺服器,啟用內建的動態主機設定協定(DHCP)伺服器為安全的。然而,您應手動地重新檢查那個,因為自動的探查目前不予 100% 保證。",
|
||||||
"dhcp_found": "於該網路上,一個現行的動態主機設定協定(DHCP)伺服器被發現。啟用內建的 DHCP 伺服器為不安全的。",
|
"dhcp_found": "於該網路上,一個現行的動態主機設定協定(DHCP)伺服器被發現。啟用內建的 DHCP 伺服器為不安全的。",
|
||||||
"dhcp_leases": "動態主機設定協定(DHCP)租約",
|
"dhcp_leases": "動態主機設定協定(DHCP)租約",
|
||||||
@@ -154,7 +154,7 @@
|
|||||||
"use_adguard_parental": "使用 AdGuard 家長控制之網路服務",
|
"use_adguard_parental": "使用 AdGuard 家長控制之網路服務",
|
||||||
"use_adguard_parental_hint": "AdGuard Home 將檢查網域是否包含成人資料。它使用如同瀏覽安全網路服務一樣之對隱私友好的應用程式介面(API)。",
|
"use_adguard_parental_hint": "AdGuard Home 將檢查網域是否包含成人資料。它使用如同瀏覽安全網路服務一樣之對隱私友好的應用程式介面(API)。",
|
||||||
"enforce_safe_search": "使用安全搜尋",
|
"enforce_safe_search": "使用安全搜尋",
|
||||||
"enforce_save_search_hint": "AdGuard Home 將在下列的搜尋引擎:Google、YouTube、Bing、DuckDuckGo、Yandex 和 Pixabay 中強制執行安全搜尋。",
|
"enforce_save_search_hint": "AdGuard Home 將在下列的搜尋引擎:Google、YouTube、Bing、DuckDuckGo、Ecosia、Yandex 和 Pixabay 中強制執行安全搜尋。",
|
||||||
"no_servers_specified": "無已明確指定的伺服器",
|
"no_servers_specified": "無已明確指定的伺服器",
|
||||||
"general_settings": "一般設定",
|
"general_settings": "一般設定",
|
||||||
"dns_settings": "DNS 設定",
|
"dns_settings": "DNS 設定",
|
||||||
@@ -236,6 +236,7 @@
|
|||||||
"updated_upstream_dns_toast": "上游的伺服器被成功地儲存",
|
"updated_upstream_dns_toast": "上游的伺服器被成功地儲存",
|
||||||
"dns_test_ok_toast": "已明確指定的 DNS 伺服器正在正確地運作",
|
"dns_test_ok_toast": "已明確指定的 DNS 伺服器正在正確地運作",
|
||||||
"dns_test_not_ok_toast": "伺服器 \"{{key}}\":無法被使用,請檢查您已正確地填寫它",
|
"dns_test_not_ok_toast": "伺服器 \"{{key}}\":無法被使用,請檢查您已正確地填寫它",
|
||||||
|
"dns_test_parsing_error_toast": "第 {{section}} 節:第 {{line}} 行:無法使用,請檢查您輸入的是否正確",
|
||||||
"dns_test_warning_toast": "上游 “{{key}}” 不回應測試請求,可能無法正常工作",
|
"dns_test_warning_toast": "上游 “{{key}}” 不回應測試請求,可能無法正常工作",
|
||||||
"unblock": "解除封鎖",
|
"unblock": "解除封鎖",
|
||||||
"block": "封鎖",
|
"block": "封鎖",
|
||||||
@@ -243,6 +244,7 @@
|
|||||||
"allow_this_client": "允許此用戶端",
|
"allow_this_client": "允許此用戶端",
|
||||||
"block_for_this_client_only": "僅對此用戶端封鎖",
|
"block_for_this_client_only": "僅對此用戶端封鎖",
|
||||||
"unblock_for_this_client_only": "僅對此用戶端解除封鎖",
|
"unblock_for_this_client_only": "僅對此用戶端解除封鎖",
|
||||||
|
"add_persistent_client": "新增為永久性客戶端",
|
||||||
"time_table_header": "時間",
|
"time_table_header": "時間",
|
||||||
"date": "日期",
|
"date": "日期",
|
||||||
"domain_name_table_header": "域名",
|
"domain_name_table_header": "域名",
|
||||||
@@ -292,6 +294,9 @@
|
|||||||
"blocked_response_ttl": "已封鎖的回應之存活時間(TTL)",
|
"blocked_response_ttl": "已封鎖的回應之存活時間(TTL)",
|
||||||
"blocked_response_ttl_desc": "對用戶端應快取受過濾的回應,指定多少秒數",
|
"blocked_response_ttl_desc": "對用戶端應快取受過濾的回應,指定多少秒數",
|
||||||
"form_enter_blocked_response_ttl": "請輸入已封鎖回應的存活時間(秒)",
|
"form_enter_blocked_response_ttl": "請輸入已封鎖回應的存活時間(秒)",
|
||||||
|
"upstream_timeout": "上游超時",
|
||||||
|
"upstream_timeout_desc": "指定等待來自此上游伺服器回應的秒數",
|
||||||
|
"form_enter_upstream_timeout": "輸入上游伺服器超時時間(以秒為單位)",
|
||||||
"dnscrypt": "DNSCrypt",
|
"dnscrypt": "DNSCrypt",
|
||||||
"dns_over_https": "DNS-over-HTTPS",
|
"dns_over_https": "DNS-over-HTTPS",
|
||||||
"dns_over_tls": "DNS-over-TLS",
|
"dns_over_tls": "DNS-over-TLS",
|
||||||
@@ -310,15 +315,15 @@
|
|||||||
"edns_use_custom_ip": "為 EDNS 使用自訂的 IP",
|
"edns_use_custom_ip": "為 EDNS 使用自訂的 IP",
|
||||||
"edns_use_custom_ip_desc": "允許為 EDNS 使用自訂的 IP",
|
"edns_use_custom_ip_desc": "允許為 EDNS 使用自訂的 IP",
|
||||||
"rate_limit_desc": "每個用戶端被允許的每秒請求之數量。設定它為 0 表示無限制。",
|
"rate_limit_desc": "每個用戶端被允許的每秒請求之數量。設定它為 0 表示無限制。",
|
||||||
"rate_limit_subnet_len_ipv4": "IPv4 位址的子網路前綴長度",
|
"rate_limit_subnet_len_ipv4": "用於 IPv4 位址的子網路前綴長度",
|
||||||
"rate_limit_subnet_len_ipv4_desc": "用於速率限制的 IPv4 位址的子網路前綴長度。預設值為 24",
|
"rate_limit_subnet_len_ipv4_desc": "用於速率限制的 IPv4 位址的子網路前綴長度。預設值為 24",
|
||||||
"rate_limit_subnet_len_ipv4_error": "IPv4 子網路前綴長度應在 0 至 32 之間",
|
"rate_limit_subnet_len_ipv4_error": "IPv4 子網路前綴長度應在 0 至 32 之間",
|
||||||
"rate_limit_subnet_len_ipv6": "IPv6 位址的子網路前綴長度",
|
"rate_limit_subnet_len_ipv6": "用於 IPv6 位址的子網路前綴長度",
|
||||||
"rate_limit_subnet_len_ipv6_desc": "用於速率限制的 IPv6 位址的子網路前綴長度。預設值為 56",
|
"rate_limit_subnet_len_ipv6_desc": "用於速率限制的 IPv6 位址的子網路前綴長度。預設值為 56",
|
||||||
"rate_limit_subnet_len_ipv6_error": "IPv6 子網路前綴長度應在 0 至 128 之間",
|
"rate_limit_subnet_len_ipv6_error": "IPv6 子網路前綴長度應在 0 至 128 之間",
|
||||||
"form_enter_rate_limit_subnet_len": "輸入用於速率限制的子網路前綴長度",
|
"form_enter_rate_limit_subnet_len": "輸入用於速率限制的子網路前綴長度",
|
||||||
"rate_limit_whitelist": "速率限制允許清單",
|
"rate_limit_whitelist": "速率限制允許清單",
|
||||||
"rate_limit_whitelist_desc": "從速率限制中排除的 IP 位址",
|
"rate_limit_whitelist_desc": "從速率限制被排除的 IP 位址",
|
||||||
"rate_limit_whitelist_placeholder": "每行輸入一個 IP 位址",
|
"rate_limit_whitelist_placeholder": "每行輸入一個 IP 位址",
|
||||||
"blocking_ipv4_desc": "要被返回給已封鎖的 A 請求之 IP 位址",
|
"blocking_ipv4_desc": "要被返回給已封鎖的 A 請求之 IP 位址",
|
||||||
"blocking_ipv6_desc": "要被返回給已封鎖的 AAAA 請求之 IP 位址",
|
"blocking_ipv6_desc": "要被返回給已封鎖的 AAAA 請求之 IP 位址",
|
||||||
@@ -423,6 +428,9 @@
|
|||||||
"encryption_hostnames": "主機名稱",
|
"encryption_hostnames": "主機名稱",
|
||||||
"encryption_reset": "您確定您想要重置加密設定嗎?",
|
"encryption_reset": "您確定您想要重置加密設定嗎?",
|
||||||
"encryption_warning": "警告",
|
"encryption_warning": "警告",
|
||||||
|
"encryption_plain_dns_enable": "啟用一般的 DNS",
|
||||||
|
"encryption_plain_dns_desc": "預設情況下啟用一般的 DNS。使用者可以禁用它,強制所有裝置使用一般的 DNS。為此,必須至少啟用一個一般的 DNS 協定。",
|
||||||
|
"encryption_plain_dns_error": "要禁用一般的 DNS,請至少啟用一個一般的 DNS 協定",
|
||||||
"topline_expiring_certificate": "您的安全通訊端層(SSL)憑證即將到期。更新<0>加密設定</0>。",
|
"topline_expiring_certificate": "您的安全通訊端層(SSL)憑證即將到期。更新<0>加密設定</0>。",
|
||||||
"topline_expired_certificate": "您的安全通訊端層(SSL)憑證為已到期的。更新<0>加密設定</0>。",
|
"topline_expired_certificate": "您的安全通訊端層(SSL)憑證為已到期的。更新<0>加密設定</0>。",
|
||||||
"form_error_port_range": "輸入在 80-65535 之範圍內的連接埠號碼",
|
"form_error_port_range": "輸入在 80-65535 之範圍內的連接埠號碼",
|
||||||
@@ -462,6 +470,7 @@
|
|||||||
"form_add_id": "新增識別碼",
|
"form_add_id": "新增識別碼",
|
||||||
"form_client_name": "輸入用戶端名稱",
|
"form_client_name": "輸入用戶端名稱",
|
||||||
"name": "名稱",
|
"name": "名稱",
|
||||||
|
"client_name": "用戶端 {{id}}",
|
||||||
"client_global_settings": "使用全域的設定",
|
"client_global_settings": "使用全域的設定",
|
||||||
"client_deleted": "用戶端 \"{{key}}\" 被成功地刪除",
|
"client_deleted": "用戶端 \"{{key}}\" 被成功地刪除",
|
||||||
"client_added": "用戶端 \"{{key}}\" 被成功地加入",
|
"client_added": "用戶端 \"{{key}}\" 被成功地加入",
|
||||||
@@ -473,7 +482,7 @@
|
|||||||
"auto_clients_desc": "AdGuard Home 使用或可能使用的裝置的 IP 地址資訊。這些資訊來自多個來源,包括主機檔案、反向 DNS 等。",
|
"auto_clients_desc": "AdGuard Home 使用或可能使用的裝置的 IP 地址資訊。這些資訊來自多個來源,包括主機檔案、反向 DNS 等。",
|
||||||
"access_title": "存取設定",
|
"access_title": "存取設定",
|
||||||
"access_desc": "於此您可配置用於 AdGuard Home DNS 伺服器之存取規則",
|
"access_desc": "於此您可配置用於 AdGuard Home DNS 伺服器之存取規則",
|
||||||
"access_allowed_title": "已允許的用戶端",
|
"access_allowed_title": "被允許的用戶端",
|
||||||
"access_allowed_desc": "無類別網域間路由(CIDRs)、IP 位址或<a>用戶端 IDs</a> 之清單。如果此清單有項目,AdGuard Home 將接受僅來自這些用戶端的請求。",
|
"access_allowed_desc": "無類別網域間路由(CIDRs)、IP 位址或<a>用戶端 IDs</a> 之清單。如果此清單有項目,AdGuard Home 將接受僅來自這些用戶端的請求。",
|
||||||
"access_disallowed_title": "未被允許的用戶端",
|
"access_disallowed_title": "未被允許的用戶端",
|
||||||
"access_disallowed_desc": "無類別網域間路由(CIDRs)、IP 位址或<a>用戶端 IDs</a> 之清單。如果此清單有項目,AdGuard Home 將排除來自這些用戶端的請求。如果在已允許的用戶端中有項目,此欄位被忽略。",
|
"access_disallowed_desc": "無類別網域間路由(CIDRs)、IP 位址或<a>用戶端 IDs</a> 之清單。如果此清單有項目,AdGuard Home 將排除來自這些用戶端的請求。如果在已允許的用戶端中有項目,此欄位被忽略。",
|
||||||
@@ -554,7 +563,7 @@
|
|||||||
"statistics_retention_confirm": "您確定您想要更改統計資料保留嗎?如果您減少該間隔值,某些資料將被丟失",
|
"statistics_retention_confirm": "您確定您想要更改統計資料保留嗎?如果您減少該間隔值,某些資料將被丟失",
|
||||||
"statistics_cleared": "統計資料被成功地清除",
|
"statistics_cleared": "統計資料被成功地清除",
|
||||||
"statistics_enable": "啟用統計資料",
|
"statistics_enable": "啟用統計資料",
|
||||||
"ignore_domains": "忽略的網域(以換行符分隔)",
|
"ignore_domains": "被忽略的網域(被換行分隔)",
|
||||||
"ignore_domains_title": "被忽略的網域",
|
"ignore_domains_title": "被忽略的網域",
|
||||||
"ignore_domains_desc_stats": "符合這些規則的查詢不會被記錄在統計資料中",
|
"ignore_domains_desc_stats": "符合這些規則的查詢不會被記錄在統計資料中",
|
||||||
"ignore_domains_desc_query": "符合這些規則的查詢不會被寫入查詢記錄中",
|
"ignore_domains_desc_query": "符合這些規則的查詢不會被寫入查詢記錄中",
|
||||||
@@ -592,7 +601,7 @@
|
|||||||
"disable_ipv6": "禁用 IPv6 位址之解析",
|
"disable_ipv6": "禁用 IPv6 位址之解析",
|
||||||
"disable_ipv6_desc": "停止所有對於 IPv6 位址(類型 AAAA)的 DNS 查詢,並從 HTTPS 回應中移除 IPv6 的提示。",
|
"disable_ipv6_desc": "停止所有對於 IPv6 位址(類型 AAAA)的 DNS 查詢,並從 HTTPS 回應中移除 IPv6 的提示。",
|
||||||
"fastest_addr": "最快的 IP 位址",
|
"fastest_addr": "最快的 IP 位址",
|
||||||
"fastest_addr_desc": "查詢所有的 DNS 伺服器並返回在所有的回應之中最快的 IP 位址。因為 AdGuard Home 必須等待來自所有的 DNS 伺服器之回應,這使 DNS 查詢變慢,但改善總體的連線。",
|
"fastest_addr_desc": "等待<b>所有</b> DNS 伺服器的回應,測量每個伺服器的 TCP 連線速度,並返回連線速度最快的伺服器的 IP 位址。<br/>如果一個或多個上游伺服器沒有回應,此模式會顯著減慢 DNS 查詢速度。確保您的上游伺服器穩定且上游超時時間短。",
|
||||||
"autofix_warning_text": "如果您點擊\"修復\",AdGuard Home 將配置您的系統使用 AdGuard Home DNS 伺服器。",
|
"autofix_warning_text": "如果您點擊\"修復\",AdGuard Home 將配置您的系統使用 AdGuard Home DNS 伺服器。",
|
||||||
"autofix_warning_list": "它將執行這些任務:<0>撤銷系統 DNSStubListener</0> <0>設定 DNS 伺服器位址為 127.0.0.1</0> <0>用 /run/systemd/resolve/resolv.conf 取代 /etc/resolv.conf 的符號連結目標</0> <0>停止 DNSStubListener(重新載入 systemd-resolved 服務)</0>",
|
"autofix_warning_list": "它將執行這些任務:<0>撤銷系統 DNSStubListener</0> <0>設定 DNS 伺服器位址為 127.0.0.1</0> <0>用 /run/systemd/resolve/resolv.conf 取代 /etc/resolv.conf 的符號連結目標</0> <0>停止 DNSStubListener(重新載入 systemd-resolved 服務)</0>",
|
||||||
"autofix_warning_result": "因此,預設下,來自您的系統之所有的 DNS 請求將被 AdGuard Home 處理。",
|
"autofix_warning_result": "因此,預設下,來自您的系統之所有的 DNS 請求將被 AdGuard Home 處理。",
|
||||||
@@ -631,7 +640,7 @@
|
|||||||
"validated_with_dnssec": "已用網域名稱系統安全性擴充功能(DNSSEC)驗證",
|
"validated_with_dnssec": "已用網域名稱系統安全性擴充功能(DNSSEC)驗證",
|
||||||
"all_queries": "所有的查詢",
|
"all_queries": "所有的查詢",
|
||||||
"show_blocked_responses": "已封鎖的",
|
"show_blocked_responses": "已封鎖的",
|
||||||
"show_whitelisted_responses": "已允許的",
|
"show_whitelisted_responses": "被允許的",
|
||||||
"show_processed_responses": "已處理的",
|
"show_processed_responses": "已處理的",
|
||||||
"blocked_safebrowsing": "被安全瀏覽封鎖",
|
"blocked_safebrowsing": "被安全瀏覽封鎖",
|
||||||
"blocked_adult_websites": "被家長控制封鎖",
|
"blocked_adult_websites": "被家長控制封鎖",
|
||||||
@@ -667,12 +676,12 @@
|
|||||||
"click_to_view_queries": "點擊以檢視查詢",
|
"click_to_view_queries": "點擊以檢視查詢",
|
||||||
"port_53_faq_link": "連接埠 53 常被 \"DNSStubListener\" 或 \"systemd-resolved\" 服務佔用。請閱讀有關如何解決這個的<0>用法說明</0>。",
|
"port_53_faq_link": "連接埠 53 常被 \"DNSStubListener\" 或 \"systemd-resolved\" 服務佔用。請閱讀有關如何解決這個的<0>用法說明</0>。",
|
||||||
"adg_will_drop_dns_queries": "AdGuard Home 將持續排除來自此用戶端之所有的 DNS 查詢。",
|
"adg_will_drop_dns_queries": "AdGuard Home 將持續排除來自此用戶端之所有的 DNS 查詢。",
|
||||||
"filter_allowlist": "警告:此動作也將把 \"{{disallowed_rule}}\" 規則排除在已允許的用戶端的清單之外。",
|
"filter_allowlist": "警告:此動作也將把 \"{{disallowed_rule}}\" 規則排除在被允許的用戶端的清單之外。",
|
||||||
"last_rule_in_allowlist": "因為排除 \"{{disallowed_rule}}\" 規則將禁用\"已允許的用戶端\"清單,無法不允許此用戶端。",
|
"last_rule_in_allowlist": "因為排除 \"{{disallowed_rule}}\" 規則將禁用\"被允許的用戶端\"清單,無法不允許此用戶端。",
|
||||||
"use_saved_key": "使用該先前已儲存的金鑰",
|
"use_saved_key": "使用該先前已儲存的金鑰",
|
||||||
"parental_control": "家長控制",
|
"parental_control": "家長控制",
|
||||||
"safe_browsing": "安全瀏覽",
|
"safe_browsing": "安全瀏覽",
|
||||||
"served_from_cache": "{{value}} <i>(由快取提供)</i>",
|
"served_from_cache_label": "從快取中",
|
||||||
"form_error_password_length": "密碼長度必須為 {{min}} 到 {{max}} 個字符",
|
"form_error_password_length": "密碼長度必須為 {{min}} 到 {{max}} 個字符",
|
||||||
"anonymizer_notification": "<0>注意:</0>IP 匿名化被啟用。您可在<1>一般設定</1>中禁用它。",
|
"anonymizer_notification": "<0>注意:</0>IP 匿名化被啟用。您可在<1>一般設定</1>中禁用它。",
|
||||||
"confirm_dns_cache_clear": "您確定您想要清除 DNS 快取嗎?",
|
"confirm_dns_cache_clear": "您確定您想要清除 DNS 快取嗎?",
|
||||||
|
|||||||
@@ -1,26 +1,17 @@
|
|||||||
import {
|
import { describe, expect, test, afterEach, vi, beforeEach, it } from 'vitest';
|
||||||
sortIp,
|
|
||||||
countClientsStatistics,
|
import { sortIp, countClientsStatistics, findAddressType, subnetMaskToBitMask } from '../helpers/helpers';
|
||||||
findAddressType,
|
|
||||||
subnetMaskToBitMask,
|
|
||||||
} from '../helpers/helpers';
|
|
||||||
import { ADDRESS_TYPES } from '../helpers/constants';
|
import { ADDRESS_TYPES } from '../helpers/constants';
|
||||||
|
|
||||||
describe('sortIp', () => {
|
describe('sortIp', () => {
|
||||||
describe('ipv4', () => {
|
describe('ipv4', () => {
|
||||||
test('one octet differ', () => {
|
test('one octet differ', () => {
|
||||||
const arr = [
|
const arr = ['127.0.2.0', '127.0.3.0', '127.0.1.0'];
|
||||||
'127.0.2.0',
|
const sortedArr = ['127.0.1.0', '127.0.2.0', '127.0.3.0'];
|
||||||
'127.0.3.0',
|
|
||||||
'127.0.1.0',
|
|
||||||
];
|
|
||||||
const sortedArr = [
|
|
||||||
'127.0.1.0',
|
|
||||||
'127.0.2.0',
|
|
||||||
'127.0.3.0',
|
|
||||||
];
|
|
||||||
expect(arr.sort(sortIp)).toStrictEqual(sortedArr);
|
expect(arr.sort(sortIp)).toStrictEqual(sortedArr);
|
||||||
});
|
});
|
||||||
|
|
||||||
test('few octets differ', () => {
|
test('few octets differ', () => {
|
||||||
const arr = [
|
const arr = [
|
||||||
'192.168.11.10',
|
'192.168.11.10',
|
||||||
@@ -58,6 +49,7 @@ describe('sortIp', () => {
|
|||||||
'192.168.11.10',
|
'192.168.11.10',
|
||||||
'192.168.11.11',
|
'192.168.11.11',
|
||||||
];
|
];
|
||||||
|
|
||||||
expect(arr.sort(sortIp)).toStrictEqual(sortedArr);
|
expect(arr.sort(sortIp)).toStrictEqual(sortedArr);
|
||||||
|
|
||||||
// Example from issue https://github.com/AdguardTeam/AdGuardHome/issues/1778#issuecomment-640937599
|
// Example from issue https://github.com/AdguardTeam/AdGuardHome/issues/1778#issuecomment-640937599
|
||||||
@@ -83,36 +75,26 @@ describe('sortIp', () => {
|
|||||||
'192.168.2.200',
|
'192.168.2.200',
|
||||||
'192.168.3.1',
|
'192.168.3.1',
|
||||||
];
|
];
|
||||||
|
|
||||||
expect(arr2.sort(sortIp)).toStrictEqual(sortedArr2);
|
expect(arr2.sort(sortIp)).toStrictEqual(sortedArr2);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
describe('ipv6', () => {
|
describe('ipv6', () => {
|
||||||
test('only long form', () => {
|
test('only long form', () => {
|
||||||
const arr = [
|
const arr = ['2001:db8:11a3:9d7:0:0:0:2', '2001:db8:11a3:9d7:0:0:0:3', '2001:db8:11a3:9d7:0:0:0:1'];
|
||||||
'2001:db8:11a3:9d7:0:0:0:2',
|
const sortedArr = ['2001:db8:11a3:9d7:0:0:0:1', '2001:db8:11a3:9d7:0:0:0:2', '2001:db8:11a3:9d7:0:0:0:3'];
|
||||||
'2001:db8:11a3:9d7:0:0:0:3',
|
|
||||||
'2001:db8:11a3:9d7:0:0:0:1',
|
|
||||||
];
|
|
||||||
const sortedArr = [
|
|
||||||
'2001:db8:11a3:9d7:0:0:0:1',
|
|
||||||
'2001:db8:11a3:9d7:0:0:0:2',
|
|
||||||
'2001:db8:11a3:9d7:0:0:0:3',
|
|
||||||
];
|
|
||||||
expect(arr.sort(sortIp)).toStrictEqual(sortedArr);
|
expect(arr.sort(sortIp)).toStrictEqual(sortedArr);
|
||||||
});
|
});
|
||||||
|
|
||||||
test('only short form', () => {
|
test('only short form', () => {
|
||||||
const arr = [
|
const arr = ['2001:db8::', '2001:db7::', '2001:db9::'];
|
||||||
'2001:db8::',
|
const sortedArr = ['2001:db7::', '2001:db8::', '2001:db9::'];
|
||||||
'2001:db7::',
|
|
||||||
'2001:db9::',
|
|
||||||
];
|
|
||||||
const sortedArr = [
|
|
||||||
'2001:db7::',
|
|
||||||
'2001:db8::',
|
|
||||||
'2001:db9::',
|
|
||||||
];
|
|
||||||
expect(arr.sort(sortIp)).toStrictEqual(sortedArr);
|
expect(arr.sort(sortIp)).toStrictEqual(sortedArr);
|
||||||
});
|
});
|
||||||
|
|
||||||
test('long and short forms', () => {
|
test('long and short forms', () => {
|
||||||
const arr = [
|
const arr = [
|
||||||
'2001:db8::',
|
'2001:db8::',
|
||||||
@@ -130,9 +112,11 @@ describe('sortIp', () => {
|
|||||||
'2001:db7:11a3:9d7:0:0:0:2',
|
'2001:db7:11a3:9d7:0:0:0:2',
|
||||||
'2001:db8::',
|
'2001:db8::',
|
||||||
];
|
];
|
||||||
|
|
||||||
expect(arr.sort(sortIp)).toStrictEqual(sortedArr);
|
expect(arr.sort(sortIp)).toStrictEqual(sortedArr);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
describe('ipv4 and ipv6', () => {
|
describe('ipv4 and ipv6', () => {
|
||||||
test('ipv6 long form', () => {
|
test('ipv6 long form', () => {
|
||||||
const arr = [
|
const arr = [
|
||||||
@@ -151,8 +135,10 @@ describe('sortIp', () => {
|
|||||||
'2001:db8:11a3:9d7:0:0:0:2',
|
'2001:db8:11a3:9d7:0:0:0:2',
|
||||||
'2001:db8:11a3:9d7:0:0:0:3',
|
'2001:db8:11a3:9d7:0:0:0:3',
|
||||||
];
|
];
|
||||||
|
|
||||||
expect(arr.sort(sortIp)).toStrictEqual(sortedArr);
|
expect(arr.sort(sortIp)).toStrictEqual(sortedArr);
|
||||||
});
|
});
|
||||||
|
|
||||||
test('ipv6 short form', () => {
|
test('ipv6 short form', () => {
|
||||||
const arr = [
|
const arr = [
|
||||||
'2001:db8:11a3:9d7::1',
|
'2001:db8:11a3:9d7::1',
|
||||||
@@ -170,8 +156,10 @@ describe('sortIp', () => {
|
|||||||
'2001:db8:11a3:9d7::2',
|
'2001:db8:11a3:9d7::2',
|
||||||
'2001:db8:11a3:9d7::3',
|
'2001:db8:11a3:9d7::3',
|
||||||
];
|
];
|
||||||
|
|
||||||
expect(arr.sort(sortIp)).toStrictEqual(sortedArr);
|
expect(arr.sort(sortIp)).toStrictEqual(sortedArr);
|
||||||
});
|
});
|
||||||
|
|
||||||
test('ipv6 long and short forms', () => {
|
test('ipv6 long and short forms', () => {
|
||||||
const arr = [
|
const arr = [
|
||||||
'2001:db8:11a3:9d7::1',
|
'2001:db8:11a3:9d7::1',
|
||||||
@@ -189,8 +177,10 @@ describe('sortIp', () => {
|
|||||||
'2001:db8:11a3:9d7:0:0:0:2',
|
'2001:db8:11a3:9d7:0:0:0:2',
|
||||||
'2001:db8:11a3:9d7::3',
|
'2001:db8:11a3:9d7::3',
|
||||||
];
|
];
|
||||||
|
|
||||||
expect(arr.sort(sortIp)).toStrictEqual(sortedArr);
|
expect(arr.sort(sortIp)).toStrictEqual(sortedArr);
|
||||||
});
|
});
|
||||||
|
|
||||||
test('always put ipv4 before ipv6', () => {
|
test('always put ipv4 before ipv6', () => {
|
||||||
const arr = [
|
const arr = [
|
||||||
'::1',
|
'::1',
|
||||||
@@ -210,40 +200,26 @@ describe('sortIp', () => {
|
|||||||
'2001:db8:11a3:9d7::1',
|
'2001:db8:11a3:9d7::1',
|
||||||
'2001:db8:11a3:9d7:0:0:0:2',
|
'2001:db8:11a3:9d7:0:0:0:2',
|
||||||
];
|
];
|
||||||
|
|
||||||
expect(arr.sort(sortIp)).toStrictEqual(sortedArr);
|
expect(arr.sort(sortIp)).toStrictEqual(sortedArr);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
describe('cidr', () => {
|
describe('cidr', () => {
|
||||||
test('only ipv4 cidr', () => {
|
test('only ipv4 cidr', () => {
|
||||||
const arr = [
|
const arr = ['192.168.0.1/9', '192.168.0.1/7', '192.168.0.1/8'];
|
||||||
'192.168.0.1/9',
|
const sortedArr = ['192.168.0.1/7', '192.168.0.1/8', '192.168.0.1/9'];
|
||||||
'192.168.0.1/7',
|
|
||||||
'192.168.0.1/8',
|
|
||||||
];
|
|
||||||
const sortedArr = [
|
|
||||||
'192.168.0.1/7',
|
|
||||||
'192.168.0.1/8',
|
|
||||||
'192.168.0.1/9',
|
|
||||||
];
|
|
||||||
expect(arr.sort(sortIp)).toStrictEqual(sortedArr);
|
expect(arr.sort(sortIp)).toStrictEqual(sortedArr);
|
||||||
});
|
});
|
||||||
|
|
||||||
test('ipv4 and cidr ipv4', () => {
|
test('ipv4 and cidr ipv4', () => {
|
||||||
const arr = [
|
const arr = ['192.168.0.1/9', '192.168.0.1', '192.168.0.1/32', '192.168.0.1/7', '192.168.0.1/8'];
|
||||||
'192.168.0.1/9',
|
const sortedArr = ['192.168.0.1/7', '192.168.0.1/8', '192.168.0.1/9', '192.168.0.1/32', '192.168.0.1'];
|
||||||
'192.168.0.1',
|
|
||||||
'192.168.0.1/32',
|
|
||||||
'192.168.0.1/7',
|
|
||||||
'192.168.0.1/8',
|
|
||||||
];
|
|
||||||
const sortedArr = [
|
|
||||||
'192.168.0.1/7',
|
|
||||||
'192.168.0.1/8',
|
|
||||||
'192.168.0.1/9',
|
|
||||||
'192.168.0.1/32',
|
|
||||||
'192.168.0.1',
|
|
||||||
];
|
|
||||||
expect(arr.sort(sortIp)).toStrictEqual(sortedArr);
|
expect(arr.sort(sortIp)).toStrictEqual(sortedArr);
|
||||||
});
|
});
|
||||||
|
|
||||||
test('only ipv6 cidr', () => {
|
test('only ipv6 cidr', () => {
|
||||||
const arr = [
|
const arr = [
|
||||||
'2001:db8:11a3:9d7::1/32',
|
'2001:db8:11a3:9d7::1/32',
|
||||||
@@ -257,8 +233,10 @@ describe('sortIp', () => {
|
|||||||
'2001:db8:11a3:9d7::1/64',
|
'2001:db8:11a3:9d7::1/64',
|
||||||
'2001:db8:11a3:9d7::1/128',
|
'2001:db8:11a3:9d7::1/128',
|
||||||
];
|
];
|
||||||
|
|
||||||
expect(arr.sort(sortIp)).toStrictEqual(sortedArr);
|
expect(arr.sort(sortIp)).toStrictEqual(sortedArr);
|
||||||
});
|
});
|
||||||
|
|
||||||
test('ipv6 and cidr ipv6', () => {
|
test('ipv6 and cidr ipv6', () => {
|
||||||
const arr = [
|
const arr = [
|
||||||
'2001:db8:11a3:9d7::1/32',
|
'2001:db8:11a3:9d7::1/32',
|
||||||
@@ -274,14 +252,16 @@ describe('sortIp', () => {
|
|||||||
'2001:db8:11a3:9d7::1/128',
|
'2001:db8:11a3:9d7::1/128',
|
||||||
'2001:db8:11a3:9d7::1',
|
'2001:db8:11a3:9d7::1',
|
||||||
];
|
];
|
||||||
|
|
||||||
expect(arr.sort(sortIp)).toStrictEqual(sortedArr);
|
expect(arr.sort(sortIp)).toStrictEqual(sortedArr);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
describe('invalid input', () => {
|
describe('invalid input', () => {
|
||||||
const originalWarn = console.warn;
|
const originalWarn = console.warn;
|
||||||
|
|
||||||
beforeEach(() => {
|
beforeEach(() => {
|
||||||
console.warn = jest.fn();
|
console.warn = vi.fn();
|
||||||
});
|
});
|
||||||
|
|
||||||
afterEach(() => {
|
afterEach(() => {
|
||||||
@@ -291,21 +271,29 @@ describe('sortIp', () => {
|
|||||||
|
|
||||||
test('invalid strings', () => {
|
test('invalid strings', () => {
|
||||||
const arr = ['invalid ip', 'invalid cidr'];
|
const arr = ['invalid ip', 'invalid cidr'];
|
||||||
|
|
||||||
expect(arr.sort(sortIp)).toStrictEqual(arr);
|
expect(arr.sort(sortIp)).toStrictEqual(arr);
|
||||||
});
|
});
|
||||||
|
|
||||||
test('invalid ip', () => {
|
test('invalid ip', () => {
|
||||||
const arr = ['127.0.0.2.', '.127.0.0.1.', '.2001:db8:11a3:9d7:0:0:0:0'];
|
const arr = ['127.0.0.2.', '.127.0.0.1.', '.2001:db8:11a3:9d7:0:0:0:0'];
|
||||||
|
|
||||||
expect(arr.sort(sortIp)).toStrictEqual(arr);
|
expect(arr.sort(sortIp)).toStrictEqual(arr);
|
||||||
});
|
});
|
||||||
|
|
||||||
test('invalid cidr', () => {
|
test('invalid cidr', () => {
|
||||||
const arr = ['127.0.0.2/33', '2001:db8:11a3:9d7:0:0:0:0/129'];
|
const arr = ['127.0.0.2/33', '2001:db8:11a3:9d7:0:0:0:0/129'];
|
||||||
|
|
||||||
expect(arr.sort(sortIp)).toStrictEqual(arr);
|
expect(arr.sort(sortIp)).toStrictEqual(arr);
|
||||||
});
|
});
|
||||||
|
|
||||||
test('valid and invalid ip', () => {
|
test('valid and invalid ip', () => {
|
||||||
const arr = ['127.0.0.4.', '127.0.0.1', '.127.0.0.3', '127.0.0.2'];
|
const arr = ['127.0.0.4.', '127.0.0.1', '.127.0.0.3', '127.0.0.2'];
|
||||||
|
|
||||||
expect(arr.sort(sortIp)).toStrictEqual(arr);
|
expect(arr.sort(sortIp)).toStrictEqual(arr);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
describe('mixed', () => {
|
describe('mixed', () => {
|
||||||
test('ipv4, ipv6 in short and long forms and cidr', () => {
|
test('ipv4, ipv6 in short and long forms and cidr', () => {
|
||||||
const arr = [
|
const arr = [
|
||||||
@@ -354,61 +342,81 @@ describe('sortIp', () => {
|
|||||||
'2001:db8:11a3:9d7:0:0:0:1',
|
'2001:db8:11a3:9d7:0:0:0:1',
|
||||||
'2001:db8:11a3:9d7:0:0:0:2',
|
'2001:db8:11a3:9d7:0:0:0:2',
|
||||||
];
|
];
|
||||||
|
|
||||||
expect(arr.sort(sortIp)).toStrictEqual(sortedArr);
|
expect(arr.sort(sortIp)).toStrictEqual(sortedArr);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
describe('findAddressType', () => {
|
describe('findAddressType', () => {
|
||||||
describe('ip', () => {
|
it('should return IP type for IP addresses', () => {
|
||||||
expect(findAddressType('127.0.0.1')).toStrictEqual(ADDRESS_TYPES.IP);
|
expect(findAddressType('127.0.0.1')).toStrictEqual(ADDRESS_TYPES.IP);
|
||||||
});
|
});
|
||||||
describe('cidr', () => {
|
|
||||||
|
it('should return CIDR type for CIDR addresses', () => {
|
||||||
expect(findAddressType('127.0.0.1/8')).toStrictEqual(ADDRESS_TYPES.CIDR);
|
expect(findAddressType('127.0.0.1/8')).toStrictEqual(ADDRESS_TYPES.CIDR);
|
||||||
});
|
});
|
||||||
describe('mac', () => {
|
|
||||||
|
it('should return UNKNOWN type for MAC addresses', () => {
|
||||||
expect(findAddressType('00:1B:44:11:3A:B7')).toStrictEqual(ADDRESS_TYPES.UNKNOWN);
|
expect(findAddressType('00:1B:44:11:3A:B7')).toStrictEqual(ADDRESS_TYPES.UNKNOWN);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
describe('countClientsStatistics', () => {
|
describe('countClientsStatistics', () => {
|
||||||
test('single ip', () => {
|
test('single ip', () => {
|
||||||
expect(countClientsStatistics(['127.0.0.1'], {
|
expect(
|
||||||
'127.0.0.1': 1,
|
countClientsStatistics(['127.0.0.1'], {
|
||||||
})).toStrictEqual(1);
|
'127.0.0.1': 1,
|
||||||
|
}),
|
||||||
|
).toStrictEqual(1);
|
||||||
});
|
});
|
||||||
|
|
||||||
test('multiple ip', () => {
|
test('multiple ip', () => {
|
||||||
expect(countClientsStatistics(['127.0.0.1', '127.0.0.2'], {
|
expect(
|
||||||
'127.0.0.1': 1,
|
countClientsStatistics(['127.0.0.1', '127.0.0.2'], {
|
||||||
'127.0.0.2': 2,
|
'127.0.0.1': 1,
|
||||||
})).toStrictEqual(1 + 2);
|
'127.0.0.2': 2,
|
||||||
|
}),
|
||||||
|
).toStrictEqual(1 + 2);
|
||||||
});
|
});
|
||||||
|
|
||||||
test('cidr', () => {
|
test('cidr', () => {
|
||||||
expect(countClientsStatistics(['127.0.0.0/8'], {
|
expect(
|
||||||
'127.0.0.1': 1,
|
countClientsStatistics(['127.0.0.0/8'], {
|
||||||
'127.0.0.2': 2,
|
'127.0.0.1': 1,
|
||||||
})).toStrictEqual(1 + 2);
|
'127.0.0.2': 2,
|
||||||
|
}),
|
||||||
|
).toStrictEqual(1 + 2);
|
||||||
});
|
});
|
||||||
|
|
||||||
test('cidr and multiple ip', () => {
|
test('cidr and multiple ip', () => {
|
||||||
expect(countClientsStatistics(['1.1.1.1', '2.2.2.2', '3.3.3.0/24'], {
|
expect(
|
||||||
'1.1.1.1': 1,
|
countClientsStatistics(['1.1.1.1', '2.2.2.2', '3.3.3.0/24'], {
|
||||||
'2.2.2.2': 2,
|
'1.1.1.1': 1,
|
||||||
'3.3.3.3': 3,
|
'2.2.2.2': 2,
|
||||||
})).toStrictEqual(1 + 2 + 3);
|
'3.3.3.3': 3,
|
||||||
|
}),
|
||||||
|
).toStrictEqual(1 + 2 + 3);
|
||||||
});
|
});
|
||||||
|
|
||||||
test('mac', () => {
|
test('mac', () => {
|
||||||
expect(countClientsStatistics(['00:1B:44:11:3A:B7', '2.2.2.2', '3.3.3.0/24'], {
|
expect(
|
||||||
'1.1.1.1': 1,
|
countClientsStatistics(['00:1B:44:11:3A:B7', '2.2.2.2', '3.3.3.0/24'], {
|
||||||
'2.2.2.2': 2,
|
'1.1.1.1': 1,
|
||||||
'3.3.3.3': 3,
|
'2.2.2.2': 2,
|
||||||
})).toStrictEqual(2 + 3);
|
'3.3.3.3': 3,
|
||||||
|
}),
|
||||||
|
).toStrictEqual(2 + 3);
|
||||||
});
|
});
|
||||||
|
|
||||||
test('not found', () => {
|
test('not found', () => {
|
||||||
expect(countClientsStatistics(['4.4.4.4', '5.5.5.5', '6.6.6.6'], {
|
expect(
|
||||||
'1.1.1.1': 1,
|
countClientsStatistics(['4.4.4.4', '5.5.5.5', '6.6.6.6'], {
|
||||||
'2.2.2.2': 2,
|
'1.1.1.1': 1,
|
||||||
'3.3.3.3': 3,
|
'2.2.2.2': 2,
|
||||||
})).toStrictEqual(0);
|
'3.3.3.3': 3,
|
||||||
|
}),
|
||||||
|
).toStrictEqual(0);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -451,10 +459,12 @@ describe('subnetMaskToBitMask', () => {
|
|||||||
|
|
||||||
test('correct for all subnetMasks', () => {
|
test('correct for all subnetMasks', () => {
|
||||||
expect(
|
expect(
|
||||||
subnetMasks.map((subnetMask) => {
|
subnetMasks
|
||||||
const bitmask = subnetMaskToBitMask(subnetMask);
|
.map((subnetMask) => {
|
||||||
return subnetMasks[bitmask] === subnetMask;
|
const bitmask = subnetMaskToBitMask(subnetMask);
|
||||||
}).every((res) => res === true),
|
return subnetMasks[bitmask] === subnetMask;
|
||||||
|
})
|
||||||
|
.every((res) => res === true),
|
||||||
).toEqual(true);
|
).toEqual(true);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
@@ -3,13 +3,14 @@ import i18next from 'i18next';
|
|||||||
|
|
||||||
import apiClient from '../api/Api';
|
import apiClient from '../api/Api';
|
||||||
import { addErrorToast, addSuccessToast } from './toasts';
|
import { addErrorToast, addSuccessToast } from './toasts';
|
||||||
|
|
||||||
import { splitByNewLine } from '../helpers/helpers';
|
import { splitByNewLine } from '../helpers/helpers';
|
||||||
|
|
||||||
export const getAccessListRequest = createAction('GET_ACCESS_LIST_REQUEST');
|
export const getAccessListRequest = createAction('GET_ACCESS_LIST_REQUEST');
|
||||||
export const getAccessListFailure = createAction('GET_ACCESS_LIST_FAILURE');
|
export const getAccessListFailure = createAction('GET_ACCESS_LIST_FAILURE');
|
||||||
export const getAccessListSuccess = createAction('GET_ACCESS_LIST_SUCCESS');
|
export const getAccessListSuccess = createAction('GET_ACCESS_LIST_SUCCESS');
|
||||||
|
|
||||||
export const getAccessList = () => async (dispatch) => {
|
export const getAccessList = () => async (dispatch: any) => {
|
||||||
dispatch(getAccessListRequest());
|
dispatch(getAccessListRequest());
|
||||||
try {
|
try {
|
||||||
const data = await apiClient.getAccessList();
|
const data = await apiClient.getAccessList();
|
||||||
@@ -24,7 +25,7 @@ export const setAccessListRequest = createAction('SET_ACCESS_LIST_REQUEST');
|
|||||||
export const setAccessListFailure = createAction('SET_ACCESS_LIST_FAILURE');
|
export const setAccessListFailure = createAction('SET_ACCESS_LIST_FAILURE');
|
||||||
export const setAccessListSuccess = createAction('SET_ACCESS_LIST_SUCCESS');
|
export const setAccessListSuccess = createAction('SET_ACCESS_LIST_SUCCESS');
|
||||||
|
|
||||||
export const setAccessList = (config) => async (dispatch) => {
|
export const setAccessList = (config: any) => async (dispatch: any) => {
|
||||||
dispatch(setAccessListRequest());
|
dispatch(setAccessListRequest());
|
||||||
try {
|
try {
|
||||||
const { allowed_clients, disallowed_clients, blocked_hosts } = config;
|
const { allowed_clients, disallowed_clients, blocked_hosts } = config;
|
||||||
@@ -48,7 +49,7 @@ export const toggleClientBlockRequest = createAction('TOGGLE_CLIENT_BLOCK_REQUES
|
|||||||
export const toggleClientBlockFailure = createAction('TOGGLE_CLIENT_BLOCK_FAILURE');
|
export const toggleClientBlockFailure = createAction('TOGGLE_CLIENT_BLOCK_FAILURE');
|
||||||
export const toggleClientBlockSuccess = createAction('TOGGLE_CLIENT_BLOCK_SUCCESS');
|
export const toggleClientBlockSuccess = createAction('TOGGLE_CLIENT_BLOCK_SUCCESS');
|
||||||
|
|
||||||
export const toggleClientBlock = (ip, disallowed, disallowed_rule) => async (dispatch) => {
|
export const toggleClientBlock = (ip: any, disallowed: any, disallowed_rule: any) => async (dispatch: any) => {
|
||||||
dispatch(toggleClientBlockRequest());
|
dispatch(toggleClientBlockRequest());
|
||||||
try {
|
try {
|
||||||
const accessList = await apiClient.getAccessList();
|
const accessList = await apiClient.getAccessList();
|
||||||
@@ -60,12 +61,10 @@ export const toggleClientBlock = (ip, disallowed, disallowed_rule) => async (dis
|
|||||||
if (!disallowed_rule) {
|
if (!disallowed_rule) {
|
||||||
allowed_clients = allowed_clients.concat(ip);
|
allowed_clients = allowed_clients.concat(ip);
|
||||||
} else {
|
} else {
|
||||||
disallowed_clients = disallowed_clients
|
disallowed_clients = disallowed_clients.filter((client: any) => client !== disallowed_rule);
|
||||||
.filter((client) => client !== disallowed_rule);
|
|
||||||
}
|
}
|
||||||
} else if (allowed_clients.length > 1) {
|
} else if (allowed_clients.length > 1) {
|
||||||
allowed_clients = allowed_clients
|
allowed_clients = allowed_clients.filter((client: any) => client !== disallowed_rule);
|
||||||
.filter((client) => client !== disallowed_rule);
|
|
||||||
} else {
|
} else {
|
||||||
disallowed_clients = disallowed_clients.concat(ip);
|
disallowed_clients = disallowed_clients.concat(ip);
|
||||||
}
|
}
|
||||||
@@ -1,6 +1,7 @@
|
|||||||
import { createAction } from 'redux-actions';
|
import { createAction } from 'redux-actions';
|
||||||
import i18next from 'i18next';
|
import i18next from 'i18next';
|
||||||
import apiClient from '../api/Api';
|
import apiClient from '../api/Api';
|
||||||
|
|
||||||
import { getClients } from './index';
|
import { getClients } from './index';
|
||||||
import { addErrorToast, addSuccessToast } from './toasts';
|
import { addErrorToast, addSuccessToast } from './toasts';
|
||||||
|
|
||||||
@@ -10,7 +11,7 @@ export const addClientRequest = createAction('ADD_CLIENT_REQUEST');
|
|||||||
export const addClientFailure = createAction('ADD_CLIENT_FAILURE');
|
export const addClientFailure = createAction('ADD_CLIENT_FAILURE');
|
||||||
export const addClientSuccess = createAction('ADD_CLIENT_SUCCESS');
|
export const addClientSuccess = createAction('ADD_CLIENT_SUCCESS');
|
||||||
|
|
||||||
export const addClient = (config) => async (dispatch) => {
|
export const addClient = (config: any) => async (dispatch: any) => {
|
||||||
dispatch(addClientRequest());
|
dispatch(addClientRequest());
|
||||||
try {
|
try {
|
||||||
await apiClient.addClient(config);
|
await apiClient.addClient(config);
|
||||||
@@ -28,7 +29,7 @@ export const deleteClientRequest = createAction('DELETE_CLIENT_REQUEST');
|
|||||||
export const deleteClientFailure = createAction('DELETE_CLIENT_FAILURE');
|
export const deleteClientFailure = createAction('DELETE_CLIENT_FAILURE');
|
||||||
export const deleteClientSuccess = createAction('DELETE_CLIENT_SUCCESS');
|
export const deleteClientSuccess = createAction('DELETE_CLIENT_SUCCESS');
|
||||||
|
|
||||||
export const deleteClient = (config) => async (dispatch) => {
|
export const deleteClient = (config: any) => async (dispatch: any) => {
|
||||||
dispatch(deleteClientRequest());
|
dispatch(deleteClientRequest());
|
||||||
try {
|
try {
|
||||||
await apiClient.deleteClient(config);
|
await apiClient.deleteClient(config);
|
||||||
@@ -45,7 +46,7 @@ export const updateClientRequest = createAction('UPDATE_CLIENT_REQUEST');
|
|||||||
export const updateClientFailure = createAction('UPDATE_CLIENT_FAILURE');
|
export const updateClientFailure = createAction('UPDATE_CLIENT_FAILURE');
|
||||||
export const updateClientSuccess = createAction('UPDATE_CLIENT_SUCCESS');
|
export const updateClientSuccess = createAction('UPDATE_CLIENT_SUCCESS');
|
||||||
|
|
||||||
export const updateClient = (config, name) => async (dispatch) => {
|
export const updateClient = (config: any, name: any) => async (dispatch: any) => {
|
||||||
dispatch(updateClientRequest());
|
dispatch(updateClientRequest());
|
||||||
try {
|
try {
|
||||||
const data = { name, data: { ...config } };
|
const data = { name, data: { ...config } };
|
||||||
@@ -2,6 +2,7 @@ import { createAction } from 'redux-actions';
|
|||||||
import i18next from 'i18next';
|
import i18next from 'i18next';
|
||||||
|
|
||||||
import apiClient from '../api/Api';
|
import apiClient from '../api/Api';
|
||||||
|
|
||||||
import { splitByNewLine } from '../helpers/helpers';
|
import { splitByNewLine } from '../helpers/helpers';
|
||||||
import { addErrorToast, addSuccessToast } from './toasts';
|
import { addErrorToast, addSuccessToast } from './toasts';
|
||||||
|
|
||||||
@@ -9,7 +10,7 @@ export const getDnsConfigRequest = createAction('GET_DNS_CONFIG_REQUEST');
|
|||||||
export const getDnsConfigFailure = createAction('GET_DNS_CONFIG_FAILURE');
|
export const getDnsConfigFailure = createAction('GET_DNS_CONFIG_FAILURE');
|
||||||
export const getDnsConfigSuccess = createAction('GET_DNS_CONFIG_SUCCESS');
|
export const getDnsConfigSuccess = createAction('GET_DNS_CONFIG_SUCCESS');
|
||||||
|
|
||||||
export const getDnsConfig = () => async (dispatch) => {
|
export const getDnsConfig = () => async (dispatch: any) => {
|
||||||
dispatch(getDnsConfigRequest());
|
dispatch(getDnsConfigRequest());
|
||||||
try {
|
try {
|
||||||
const data = await apiClient.getDnsConfig();
|
const data = await apiClient.getDnsConfig();
|
||||||
@@ -24,7 +25,7 @@ export const clearDnsCacheRequest = createAction('CLEAR_DNS_CACHE_REQUEST');
|
|||||||
export const clearDnsCacheFailure = createAction('CLEAR_DNS_CACHE_FAILURE');
|
export const clearDnsCacheFailure = createAction('CLEAR_DNS_CACHE_FAILURE');
|
||||||
export const clearDnsCacheSuccess = createAction('CLEAR_DNS_CACHE_SUCCESS');
|
export const clearDnsCacheSuccess = createAction('CLEAR_DNS_CACHE_SUCCESS');
|
||||||
|
|
||||||
export const clearDnsCache = () => async (dispatch) => {
|
export const clearDnsCache = () => async (dispatch: any) => {
|
||||||
dispatch(clearDnsCacheRequest());
|
dispatch(clearDnsCacheRequest());
|
||||||
try {
|
try {
|
||||||
const data = await apiClient.clearCache();
|
const data = await apiClient.clearCache();
|
||||||
@@ -40,7 +41,7 @@ export const setDnsConfigRequest = createAction('SET_DNS_CONFIG_REQUEST');
|
|||||||
export const setDnsConfigFailure = createAction('SET_DNS_CONFIG_FAILURE');
|
export const setDnsConfigFailure = createAction('SET_DNS_CONFIG_FAILURE');
|
||||||
export const setDnsConfigSuccess = createAction('SET_DNS_CONFIG_SUCCESS');
|
export const setDnsConfigSuccess = createAction('SET_DNS_CONFIG_SUCCESS');
|
||||||
|
|
||||||
export const setDnsConfig = (config) => async (dispatch) => {
|
export const setDnsConfig = (config: any) => async (dispatch: any) => {
|
||||||
dispatch(setDnsConfigRequest());
|
dispatch(setDnsConfigRequest());
|
||||||
try {
|
try {
|
||||||
const data = { ...config };
|
const data = { ...config };
|
||||||
@@ -1,5 +1,6 @@
|
|||||||
import { createAction } from 'redux-actions';
|
import { createAction } from 'redux-actions';
|
||||||
import apiClient from '../api/Api';
|
import apiClient from '../api/Api';
|
||||||
|
|
||||||
import { redirectToCurrentProtocol } from '../helpers/helpers';
|
import { redirectToCurrentProtocol } from '../helpers/helpers';
|
||||||
import { addErrorToast, addSuccessToast } from './toasts';
|
import { addErrorToast, addSuccessToast } from './toasts';
|
||||||
|
|
||||||
@@ -7,7 +8,7 @@ export const getTlsStatusRequest = createAction('GET_TLS_STATUS_REQUEST');
|
|||||||
export const getTlsStatusFailure = createAction('GET_TLS_STATUS_FAILURE');
|
export const getTlsStatusFailure = createAction('GET_TLS_STATUS_FAILURE');
|
||||||
export const getTlsStatusSuccess = createAction('GET_TLS_STATUS_SUCCESS');
|
export const getTlsStatusSuccess = createAction('GET_TLS_STATUS_SUCCESS');
|
||||||
|
|
||||||
export const getTlsStatus = () => async (dispatch) => {
|
export const getTlsStatus = () => async (dispatch: any) => {
|
||||||
dispatch(getTlsStatusRequest());
|
dispatch(getTlsStatusRequest());
|
||||||
try {
|
try {
|
||||||
const status = await apiClient.getTlsStatus();
|
const status = await apiClient.getTlsStatus();
|
||||||
@@ -26,7 +27,7 @@ export const setTlsConfigFailure = createAction('SET_TLS_CONFIG_FAILURE');
|
|||||||
export const setTlsConfigSuccess = createAction('SET_TLS_CONFIG_SUCCESS');
|
export const setTlsConfigSuccess = createAction('SET_TLS_CONFIG_SUCCESS');
|
||||||
export const dnsStatusSuccess = createAction('DNS_STATUS_SUCCESS');
|
export const dnsStatusSuccess = createAction('DNS_STATUS_SUCCESS');
|
||||||
|
|
||||||
export const setTlsConfig = (config) => async (dispatch, getState) => {
|
export const setTlsConfig = (config: any) => async (dispatch: any, getState: any) => {
|
||||||
dispatch(setTlsConfigRequest());
|
dispatch(setTlsConfigRequest());
|
||||||
try {
|
try {
|
||||||
const { httpPort } = getState().dashboard;
|
const { httpPort } = getState().dashboard;
|
||||||
@@ -67,7 +68,7 @@ export const validateTlsConfigRequest = createAction('VALIDATE_TLS_CONFIG_REQUES
|
|||||||
export const validateTlsConfigFailure = createAction('VALIDATE_TLS_CONFIG_FAILURE');
|
export const validateTlsConfigFailure = createAction('VALIDATE_TLS_CONFIG_FAILURE');
|
||||||
export const validateTlsConfigSuccess = createAction('VALIDATE_TLS_CONFIG_SUCCESS');
|
export const validateTlsConfigSuccess = createAction('VALIDATE_TLS_CONFIG_SUCCESS');
|
||||||
|
|
||||||
export const validateTlsConfig = (config) => async (dispatch) => {
|
export const validateTlsConfig = (config: any) => async (dispatch: any) => {
|
||||||
dispatch(validateTlsConfigRequest());
|
dispatch(validateTlsConfigRequest());
|
||||||
try {
|
try {
|
||||||
const values = { ...config };
|
const values = { ...config };
|
||||||
@@ -13,7 +13,7 @@ export const getFilteringStatusRequest = createAction('GET_FILTERING_STATUS_REQU
|
|||||||
export const getFilteringStatusFailure = createAction('GET_FILTERING_STATUS_FAILURE');
|
export const getFilteringStatusFailure = createAction('GET_FILTERING_STATUS_FAILURE');
|
||||||
export const getFilteringStatusSuccess = createAction('GET_FILTERING_STATUS_SUCCESS');
|
export const getFilteringStatusSuccess = createAction('GET_FILTERING_STATUS_SUCCESS');
|
||||||
|
|
||||||
export const getFilteringStatus = () => async (dispatch) => {
|
export const getFilteringStatus = () => async (dispatch: any) => {
|
||||||
dispatch(getFilteringStatusRequest());
|
dispatch(getFilteringStatusRequest());
|
||||||
try {
|
try {
|
||||||
const status = await apiClient.getFilteringStatus();
|
const status = await apiClient.getFilteringStatus();
|
||||||
@@ -28,7 +28,7 @@ export const setRulesRequest = createAction('SET_RULES_REQUEST');
|
|||||||
export const setRulesFailure = createAction('SET_RULES_FAILURE');
|
export const setRulesFailure = createAction('SET_RULES_FAILURE');
|
||||||
export const setRulesSuccess = createAction('SET_RULES_SUCCESS');
|
export const setRulesSuccess = createAction('SET_RULES_SUCCESS');
|
||||||
|
|
||||||
export const setRules = (rules) => async (dispatch) => {
|
export const setRules = (rules: any) => async (dispatch: any) => {
|
||||||
dispatch(setRulesRequest());
|
dispatch(setRulesRequest());
|
||||||
try {
|
try {
|
||||||
const normalizedRules = {
|
const normalizedRules = {
|
||||||
@@ -47,83 +47,91 @@ export const addFilterRequest = createAction('ADD_FILTER_REQUEST');
|
|||||||
export const addFilterFailure = createAction('ADD_FILTER_FAILURE');
|
export const addFilterFailure = createAction('ADD_FILTER_FAILURE');
|
||||||
export const addFilterSuccess = createAction('ADD_FILTER_SUCCESS');
|
export const addFilterSuccess = createAction('ADD_FILTER_SUCCESS');
|
||||||
|
|
||||||
export const addFilter = (url, name, whitelist = false) => async (dispatch, getState) => {
|
export const addFilter =
|
||||||
dispatch(addFilterRequest());
|
(url: any, name: any, whitelist = false) =>
|
||||||
try {
|
async (dispatch: any, getState: any) => {
|
||||||
await apiClient.addFilter({ url, name, whitelist });
|
dispatch(addFilterRequest());
|
||||||
dispatch(addFilterSuccess(url));
|
try {
|
||||||
if (getState().filtering.isModalOpen) {
|
await apiClient.addFilter({ url, name, whitelist });
|
||||||
dispatch(toggleFilteringModal());
|
dispatch(addFilterSuccess(url));
|
||||||
|
if (getState().filtering.isModalOpen) {
|
||||||
|
dispatch(toggleFilteringModal());
|
||||||
|
}
|
||||||
|
dispatch(addSuccessToast('filter_added_successfully'));
|
||||||
|
dispatch(getFilteringStatus());
|
||||||
|
} catch (error) {
|
||||||
|
dispatch(addErrorToast({ error }));
|
||||||
|
dispatch(addFilterFailure());
|
||||||
}
|
}
|
||||||
dispatch(addSuccessToast('filter_added_successfully'));
|
};
|
||||||
dispatch(getFilteringStatus());
|
|
||||||
} catch (error) {
|
|
||||||
dispatch(addErrorToast({ error }));
|
|
||||||
dispatch(addFilterFailure());
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
export const removeFilterRequest = createAction('REMOVE_FILTER_REQUEST');
|
export const removeFilterRequest = createAction('REMOVE_FILTER_REQUEST');
|
||||||
export const removeFilterFailure = createAction('REMOVE_FILTER_FAILURE');
|
export const removeFilterFailure = createAction('REMOVE_FILTER_FAILURE');
|
||||||
export const removeFilterSuccess = createAction('REMOVE_FILTER_SUCCESS');
|
export const removeFilterSuccess = createAction('REMOVE_FILTER_SUCCESS');
|
||||||
|
|
||||||
export const removeFilter = (url, whitelist = false) => async (dispatch, getState) => {
|
export const removeFilter =
|
||||||
dispatch(removeFilterRequest());
|
(url: any, whitelist = false) =>
|
||||||
try {
|
async (dispatch: any, getState: any) => {
|
||||||
await apiClient.removeFilter({ url, whitelist });
|
dispatch(removeFilterRequest());
|
||||||
dispatch(removeFilterSuccess(url));
|
try {
|
||||||
if (getState().filtering.isModalOpen) {
|
await apiClient.removeFilter({ url, whitelist });
|
||||||
dispatch(toggleFilteringModal());
|
dispatch(removeFilterSuccess(url));
|
||||||
|
if (getState().filtering.isModalOpen) {
|
||||||
|
dispatch(toggleFilteringModal());
|
||||||
|
}
|
||||||
|
dispatch(addSuccessToast('filter_removed_successfully'));
|
||||||
|
dispatch(getFilteringStatus());
|
||||||
|
} catch (error) {
|
||||||
|
dispatch(addErrorToast({ error }));
|
||||||
|
dispatch(removeFilterFailure());
|
||||||
}
|
}
|
||||||
dispatch(addSuccessToast('filter_removed_successfully'));
|
};
|
||||||
dispatch(getFilteringStatus());
|
|
||||||
} catch (error) {
|
|
||||||
dispatch(addErrorToast({ error }));
|
|
||||||
dispatch(removeFilterFailure());
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
export const toggleFilterRequest = createAction('FILTER_TOGGLE_REQUEST');
|
export const toggleFilterRequest = createAction('FILTER_TOGGLE_REQUEST');
|
||||||
export const toggleFilterFailure = createAction('FILTER_TOGGLE_FAILURE');
|
export const toggleFilterFailure = createAction('FILTER_TOGGLE_FAILURE');
|
||||||
export const toggleFilterSuccess = createAction('FILTER_TOGGLE_SUCCESS');
|
export const toggleFilterSuccess = createAction('FILTER_TOGGLE_SUCCESS');
|
||||||
|
|
||||||
export const toggleFilterStatus = (url, data, whitelist = false) => async (dispatch) => {
|
export const toggleFilterStatus =
|
||||||
dispatch(toggleFilterRequest());
|
(url: any, data: any, whitelist = false) =>
|
||||||
try {
|
async (dispatch: any) => {
|
||||||
await apiClient.setFilterUrl({ url, data, whitelist });
|
dispatch(toggleFilterRequest());
|
||||||
dispatch(toggleFilterSuccess(url));
|
try {
|
||||||
dispatch(getFilteringStatus());
|
await apiClient.setFilterUrl({ url, data, whitelist });
|
||||||
} catch (error) {
|
dispatch(toggleFilterSuccess(url));
|
||||||
dispatch(addErrorToast({ error }));
|
dispatch(getFilteringStatus());
|
||||||
dispatch(toggleFilterFailure());
|
} catch (error) {
|
||||||
}
|
dispatch(addErrorToast({ error }));
|
||||||
};
|
dispatch(toggleFilterFailure());
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
export const editFilterRequest = createAction('EDIT_FILTER_REQUEST');
|
export const editFilterRequest = createAction('EDIT_FILTER_REQUEST');
|
||||||
export const editFilterFailure = createAction('EDIT_FILTER_FAILURE');
|
export const editFilterFailure = createAction('EDIT_FILTER_FAILURE');
|
||||||
export const editFilterSuccess = createAction('EDIT_FILTER_SUCCESS');
|
export const editFilterSuccess = createAction('EDIT_FILTER_SUCCESS');
|
||||||
|
|
||||||
export const editFilter = (url, data, whitelist = false) => async (dispatch, getState) => {
|
export const editFilter =
|
||||||
dispatch(editFilterRequest());
|
(url: any, data: any, whitelist = false) =>
|
||||||
try {
|
async (dispatch: any, getState: any) => {
|
||||||
await apiClient.setFilterUrl({ url, data, whitelist });
|
dispatch(editFilterRequest());
|
||||||
dispatch(editFilterSuccess(url));
|
try {
|
||||||
if (getState().filtering.isModalOpen) {
|
await apiClient.setFilterUrl({ url, data, whitelist });
|
||||||
dispatch(toggleFilteringModal());
|
dispatch(editFilterSuccess(url));
|
||||||
|
if (getState().filtering.isModalOpen) {
|
||||||
|
dispatch(toggleFilteringModal());
|
||||||
|
}
|
||||||
|
dispatch(addSuccessToast('filter_updated'));
|
||||||
|
dispatch(getFilteringStatus());
|
||||||
|
} catch (error) {
|
||||||
|
dispatch(addErrorToast({ error }));
|
||||||
|
dispatch(editFilterFailure());
|
||||||
}
|
}
|
||||||
dispatch(addSuccessToast('filter_updated'));
|
};
|
||||||
dispatch(getFilteringStatus());
|
|
||||||
} catch (error) {
|
|
||||||
dispatch(addErrorToast({ error }));
|
|
||||||
dispatch(editFilterFailure());
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
export const refreshFiltersRequest = createAction('FILTERING_REFRESH_REQUEST');
|
export const refreshFiltersRequest = createAction('FILTERING_REFRESH_REQUEST');
|
||||||
export const refreshFiltersFailure = createAction('FILTERING_REFRESH_FAILURE');
|
export const refreshFiltersFailure = createAction('FILTERING_REFRESH_FAILURE');
|
||||||
export const refreshFiltersSuccess = createAction('FILTERING_REFRESH_SUCCESS');
|
export const refreshFiltersSuccess = createAction('FILTERING_REFRESH_SUCCESS');
|
||||||
|
|
||||||
export const refreshFilters = (config) => async (dispatch) => {
|
export const refreshFilters = (config: any) => async (dispatch: any) => {
|
||||||
dispatch(refreshFiltersRequest());
|
dispatch(refreshFiltersRequest());
|
||||||
dispatch(showLoading());
|
dispatch(showLoading());
|
||||||
try {
|
try {
|
||||||
@@ -150,7 +158,7 @@ export const setFiltersConfigRequest = createAction('SET_FILTERS_CONFIG_REQUEST'
|
|||||||
export const setFiltersConfigFailure = createAction('SET_FILTERS_CONFIG_FAILURE');
|
export const setFiltersConfigFailure = createAction('SET_FILTERS_CONFIG_FAILURE');
|
||||||
export const setFiltersConfigSuccess = createAction('SET_FILTERS_CONFIG_SUCCESS');
|
export const setFiltersConfigSuccess = createAction('SET_FILTERS_CONFIG_SUCCESS');
|
||||||
|
|
||||||
export const setFiltersConfig = (config) => async (dispatch, getState) => {
|
export const setFiltersConfig = (config: any) => async (dispatch: any, getState: any) => {
|
||||||
dispatch(setFiltersConfigRequest());
|
dispatch(setFiltersConfigRequest());
|
||||||
try {
|
try {
|
||||||
const { enabled } = config;
|
const { enabled } = config;
|
||||||
@@ -180,16 +188,18 @@ export const checkHostSuccess = createAction('CHECK_HOST_SUCCESS');
|
|||||||
* @param {string} host.name
|
* @param {string} host.name
|
||||||
* @returns {undefined}
|
* @returns {undefined}
|
||||||
*/
|
*/
|
||||||
export const checkHost = (host) => async (dispatch) => {
|
export const checkHost = (host: any) => async (dispatch: any) => {
|
||||||
dispatch(checkHostRequest());
|
dispatch(checkHostRequest());
|
||||||
try {
|
try {
|
||||||
const data = await apiClient.checkHost(host);
|
const data = await apiClient.checkHost(host);
|
||||||
const { name: hostname } = host;
|
const { name: hostname } = host;
|
||||||
|
|
||||||
dispatch(checkHostSuccess({
|
dispatch(
|
||||||
hostname,
|
checkHostSuccess({
|
||||||
...data,
|
hostname,
|
||||||
}));
|
...data,
|
||||||
|
}),
|
||||||
|
);
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
dispatch(addErrorToast({ error }));
|
dispatch(addErrorToast({ error }));
|
||||||
dispatch(checkHostFailure());
|
dispatch(checkHostFailure());
|
||||||
@@ -19,7 +19,6 @@ import {
|
|||||||
CHECK_TIMEOUT,
|
CHECK_TIMEOUT,
|
||||||
STATUS_RESPONSE,
|
STATUS_RESPONSE,
|
||||||
SETTINGS_NAMES,
|
SETTINGS_NAMES,
|
||||||
FORM_NAME,
|
|
||||||
MANUAL_UPDATE_LINK,
|
MANUAL_UPDATE_LINK,
|
||||||
DISABLE_PROTECTION_TIMINGS,
|
DISABLE_PROTECTION_TIMINGS,
|
||||||
} from '../helpers/constants';
|
} from '../helpers/constants';
|
||||||
@@ -38,7 +37,7 @@ export const showSettingsFailure = createAction('SETTINGS_FAILURE_SHOW');
|
|||||||
* @param {*} status: boolean | SafeSearchConfig
|
* @param {*} status: boolean | SafeSearchConfig
|
||||||
* @returns
|
* @returns
|
||||||
*/
|
*/
|
||||||
export const toggleSetting = (settingKey, status) => async (dispatch) => {
|
export const toggleSetting = (settingKey: any, status: any) => async (dispatch: any) => {
|
||||||
let successMessage = '';
|
let successMessage = '';
|
||||||
try {
|
try {
|
||||||
switch (settingKey) {
|
switch (settingKey) {
|
||||||
@@ -80,64 +79,58 @@ export const initSettingsRequest = createAction('SETTINGS_INIT_REQUEST');
|
|||||||
export const initSettingsFailure = createAction('SETTINGS_INIT_FAILURE');
|
export const initSettingsFailure = createAction('SETTINGS_INIT_FAILURE');
|
||||||
export const initSettingsSuccess = createAction('SETTINGS_INIT_SUCCESS');
|
export const initSettingsSuccess = createAction('SETTINGS_INIT_SUCCESS');
|
||||||
|
|
||||||
export const initSettings = (settingsList = {
|
export const initSettings =
|
||||||
safebrowsing: {}, parental: {},
|
(
|
||||||
}) => async (dispatch) => {
|
settingsList = {
|
||||||
dispatch(initSettingsRequest());
|
safebrowsing: {},
|
||||||
try {
|
parental: {},
|
||||||
const safebrowsingStatus = await apiClient.getSafebrowsingStatus();
|
},
|
||||||
const parentalStatus = await apiClient.getParentalStatus();
|
) =>
|
||||||
const safesearchStatus = await apiClient.getSafesearchStatus();
|
async (dispatch: any) => {
|
||||||
const {
|
dispatch(initSettingsRequest());
|
||||||
safebrowsing,
|
try {
|
||||||
parental,
|
const safebrowsingStatus = await apiClient.getSafebrowsingStatus();
|
||||||
} = settingsList;
|
const parentalStatus = await apiClient.getParentalStatus();
|
||||||
const newSettingsList = {
|
const safesearchStatus = await apiClient.getSafesearchStatus();
|
||||||
safebrowsing: {
|
const { safebrowsing, parental } = settingsList;
|
||||||
...safebrowsing,
|
const newSettingsList = {
|
||||||
enabled: safebrowsingStatus.enabled,
|
safebrowsing: {
|
||||||
},
|
...safebrowsing,
|
||||||
parental: {
|
enabled: safebrowsingStatus.enabled,
|
||||||
...parental,
|
},
|
||||||
enabled: parentalStatus.enabled,
|
parental: {
|
||||||
},
|
...parental,
|
||||||
safesearch: {
|
enabled: parentalStatus.enabled,
|
||||||
...safesearchStatus,
|
},
|
||||||
},
|
safesearch: {
|
||||||
};
|
...safesearchStatus,
|
||||||
dispatch(initSettingsSuccess({ settingsList: newSettingsList }));
|
},
|
||||||
} catch (error) {
|
};
|
||||||
dispatch(addErrorToast({ error }));
|
dispatch(initSettingsSuccess({ settingsList: newSettingsList }));
|
||||||
dispatch(initSettingsFailure());
|
} catch (error) {
|
||||||
}
|
dispatch(addErrorToast({ error }));
|
||||||
};
|
dispatch(initSettingsFailure());
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
export const toggleProtectionRequest = createAction('TOGGLE_PROTECTION_REQUEST');
|
export const toggleProtectionRequest = createAction('TOGGLE_PROTECTION_REQUEST');
|
||||||
export const toggleProtectionFailure = createAction('TOGGLE_PROTECTION_FAILURE');
|
export const toggleProtectionFailure = createAction('TOGGLE_PROTECTION_FAILURE');
|
||||||
export const toggleProtectionSuccess = createAction('TOGGLE_PROTECTION_SUCCESS');
|
export const toggleProtectionSuccess = createAction('TOGGLE_PROTECTION_SUCCESS');
|
||||||
|
|
||||||
const getDisabledMessage = (time) => {
|
const getDisabledMessage = (time: any) => {
|
||||||
switch (time) {
|
switch (time) {
|
||||||
case DISABLE_PROTECTION_TIMINGS.HALF_MINUTE:
|
case DISABLE_PROTECTION_TIMINGS.HALF_MINUTE:
|
||||||
return i18next.t(
|
return i18next.t('disable_notify_for_seconds', {
|
||||||
'disable_notify_for_seconds',
|
count: msToSeconds(DISABLE_PROTECTION_TIMINGS.HALF_MINUTE),
|
||||||
{ count: msToSeconds(DISABLE_PROTECTION_TIMINGS.HALF_MINUTE) },
|
});
|
||||||
);
|
|
||||||
case DISABLE_PROTECTION_TIMINGS.MINUTE:
|
case DISABLE_PROTECTION_TIMINGS.MINUTE:
|
||||||
return i18next.t(
|
return i18next.t('disable_notify_for_minutes', { count: msToMinutes(DISABLE_PROTECTION_TIMINGS.MINUTE) });
|
||||||
'disable_notify_for_minutes',
|
|
||||||
{ count: msToMinutes(DISABLE_PROTECTION_TIMINGS.MINUTE) },
|
|
||||||
);
|
|
||||||
case DISABLE_PROTECTION_TIMINGS.TEN_MINUTES:
|
case DISABLE_PROTECTION_TIMINGS.TEN_MINUTES:
|
||||||
return i18next.t(
|
return i18next.t('disable_notify_for_minutes', {
|
||||||
'disable_notify_for_minutes',
|
count: msToMinutes(DISABLE_PROTECTION_TIMINGS.TEN_MINUTES),
|
||||||
{ count: msToMinutes(DISABLE_PROTECTION_TIMINGS.TEN_MINUTES) },
|
});
|
||||||
);
|
|
||||||
case DISABLE_PROTECTION_TIMINGS.HOUR:
|
case DISABLE_PROTECTION_TIMINGS.HOUR:
|
||||||
return i18next.t(
|
return i18next.t('disable_notify_for_hours', { count: msToHours(DISABLE_PROTECTION_TIMINGS.HOUR) });
|
||||||
'disable_notify_for_hours',
|
|
||||||
{ count: msToHours(DISABLE_PROTECTION_TIMINGS.HOUR) },
|
|
||||||
);
|
|
||||||
case DISABLE_PROTECTION_TIMINGS.TOMORROW:
|
case DISABLE_PROTECTION_TIMINGS.TOMORROW:
|
||||||
return i18next.t('disable_notify_until_tomorrow');
|
return i18next.t('disable_notify_until_tomorrow');
|
||||||
default:
|
default:
|
||||||
@@ -145,22 +138,24 @@ const getDisabledMessage = (time) => {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
export const toggleProtection = (status, time = null) => async (dispatch) => {
|
export const toggleProtection =
|
||||||
dispatch(toggleProtectionRequest());
|
(status: any, time = null) =>
|
||||||
try {
|
async (dispatch: any) => {
|
||||||
const successMessage = status ? getDisabledMessage(time) : 'enabled_protection';
|
dispatch(toggleProtectionRequest());
|
||||||
await apiClient.setProtection({ enabled: !status, duration: time });
|
try {
|
||||||
dispatch(addSuccessToast(successMessage));
|
const successMessage = status ? getDisabledMessage(time) : 'enabled_protection';
|
||||||
dispatch(toggleProtectionSuccess({ disabledDuration: time }));
|
await apiClient.setProtection({ enabled: !status, duration: time });
|
||||||
} catch (error) {
|
dispatch(addSuccessToast(successMessage));
|
||||||
dispatch(addErrorToast({ error }));
|
dispatch(toggleProtectionSuccess({ disabledDuration: time }));
|
||||||
dispatch(toggleProtectionFailure());
|
} catch (error) {
|
||||||
}
|
dispatch(addErrorToast({ error }));
|
||||||
};
|
dispatch(toggleProtectionFailure());
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
export const setDisableDurationTime = createAction('SET_DISABLED_DURATION_TIME');
|
export const setDisableDurationTime = createAction('SET_DISABLED_DURATION_TIME');
|
||||||
|
|
||||||
export const setProtectionTimerTime = (updatedTime) => async (dispatch) => {
|
export const setProtectionTimerTime = (updatedTime: any) => async (dispatch: any) => {
|
||||||
dispatch(setDisableDurationTime({ timeToEnableProtection: updatedTime }));
|
dispatch(setDisableDurationTime({ timeToEnableProtection: updatedTime }));
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -168,40 +163,42 @@ export const getVersionRequest = createAction('GET_VERSION_REQUEST');
|
|||||||
export const getVersionFailure = createAction('GET_VERSION_FAILURE');
|
export const getVersionFailure = createAction('GET_VERSION_FAILURE');
|
||||||
export const getVersionSuccess = createAction('GET_VERSION_SUCCESS');
|
export const getVersionSuccess = createAction('GET_VERSION_SUCCESS');
|
||||||
|
|
||||||
export const getVersion = (recheck = false) => async (dispatch, getState) => {
|
export const getVersion =
|
||||||
dispatch(getVersionRequest());
|
(recheck = false) =>
|
||||||
try {
|
async (dispatch: any, getState: any) => {
|
||||||
const data = await apiClient.getGlobalVersion({ recheck_now: recheck });
|
dispatch(getVersionRequest());
|
||||||
dispatch(getVersionSuccess(data));
|
try {
|
||||||
|
const data = await apiClient.getGlobalVersion({ recheck_now: recheck });
|
||||||
|
dispatch(getVersionSuccess(data));
|
||||||
|
|
||||||
if (recheck) {
|
if (recheck) {
|
||||||
const { dnsVersion } = getState().dashboard;
|
const { dnsVersion } = getState().dashboard;
|
||||||
const currentVersion = dnsVersion === 'undefined' ? 0 : dnsVersion;
|
const currentVersion = dnsVersion === 'undefined' ? 0 : dnsVersion;
|
||||||
|
|
||||||
if (data && !areEqualVersions(currentVersion, data.new_version)) {
|
if (data && !areEqualVersions(currentVersion, data.new_version)) {
|
||||||
dispatch(addSuccessToast('updates_checked'));
|
dispatch(addSuccessToast('updates_checked'));
|
||||||
} else {
|
} else {
|
||||||
dispatch(addSuccessToast('updates_version_equal'));
|
dispatch(addSuccessToast('updates_version_equal'));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
} catch (error) {
|
||||||
|
dispatch(addErrorToast({ error: 'version_request_error' }));
|
||||||
|
dispatch(getVersionFailure());
|
||||||
}
|
}
|
||||||
} catch (error) {
|
};
|
||||||
dispatch(addErrorToast({ error: 'version_request_error' }));
|
|
||||||
dispatch(getVersionFailure());
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
export const getUpdateRequest = createAction('GET_UPDATE_REQUEST');
|
export const getUpdateRequest = createAction('GET_UPDATE_REQUEST');
|
||||||
export const getUpdateFailure = createAction('GET_UPDATE_FAILURE');
|
export const getUpdateFailure = createAction('GET_UPDATE_FAILURE');
|
||||||
export const getUpdateSuccess = createAction('GET_UPDATE_SUCCESS');
|
export const getUpdateSuccess = createAction('GET_UPDATE_SUCCESS');
|
||||||
|
|
||||||
const checkStatus = async (handleRequestSuccess, handleRequestError, attempts = 60) => {
|
const checkStatus = async (handleRequestSuccess: any, handleRequestError: any, attempts = 60) => {
|
||||||
let timeout;
|
let timeout;
|
||||||
|
|
||||||
if (attempts === 0) {
|
if (attempts === 0) {
|
||||||
handleRequestError();
|
handleRequestError();
|
||||||
}
|
}
|
||||||
|
|
||||||
const rmTimeout = (t) => t && clearTimeout(t);
|
const rmTimeout = (t: any) => t && clearTimeout(t);
|
||||||
|
|
||||||
try {
|
try {
|
||||||
const response = await axios.get(`${apiClient.baseUrl}/status`);
|
const response = await axios.get(`${apiClient.baseUrl}/status`);
|
||||||
@@ -220,25 +217,18 @@ const checkStatus = async (handleRequestSuccess, handleRequestError, attempts =
|
|||||||
}
|
}
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
rmTimeout(timeout);
|
rmTimeout(timeout);
|
||||||
timeout = setTimeout(
|
timeout = setTimeout(checkStatus, CHECK_TIMEOUT, handleRequestSuccess, handleRequestError, attempts - 1);
|
||||||
checkStatus,
|
|
||||||
CHECK_TIMEOUT,
|
|
||||||
handleRequestSuccess,
|
|
||||||
handleRequestError,
|
|
||||||
attempts - 1,
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
export const getUpdate = () => async (dispatch, getState) => {
|
export const getUpdate = () => async (dispatch: any, getState: any) => {
|
||||||
const { dnsVersion } = getState().dashboard;
|
const { dnsVersion } = getState().dashboard;
|
||||||
|
|
||||||
dispatch(getUpdateRequest());
|
dispatch(getUpdateRequest());
|
||||||
const handleRequestError = () => {
|
const handleRequestError = () => {
|
||||||
const options = {
|
const options = {
|
||||||
components: {
|
components: {
|
||||||
a: <a href={MANUAL_UPDATE_LINK} target="_blank"
|
a: <a href={MANUAL_UPDATE_LINK} target="_blank" rel="noopener noreferrer" />,
|
||||||
rel="noopener noreferrer" />,
|
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -246,12 +236,13 @@ export const getUpdate = () => async (dispatch, getState) => {
|
|||||||
dispatch(getUpdateFailure());
|
dispatch(getUpdateFailure());
|
||||||
};
|
};
|
||||||
|
|
||||||
const handleRequestSuccess = (response) => {
|
const handleRequestSuccess = (response: any) => {
|
||||||
const responseVersion = response.data?.version;
|
const responseVersion = response.data?.version;
|
||||||
|
|
||||||
if (dnsVersion !== responseVersion) {
|
if (dnsVersion !== responseVersion) {
|
||||||
dispatch(getUpdateSuccess());
|
dispatch(getUpdateSuccess());
|
||||||
window.location.reload(true);
|
|
||||||
|
window.location.reload();
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -267,18 +258,20 @@ export const getClientsRequest = createAction('GET_CLIENTS_REQUEST');
|
|||||||
export const getClientsFailure = createAction('GET_CLIENTS_FAILURE');
|
export const getClientsFailure = createAction('GET_CLIENTS_FAILURE');
|
||||||
export const getClientsSuccess = createAction('GET_CLIENTS_SUCCESS');
|
export const getClientsSuccess = createAction('GET_CLIENTS_SUCCESS');
|
||||||
|
|
||||||
export const getClients = () => async (dispatch) => {
|
export const getClients = () => async (dispatch: any) => {
|
||||||
dispatch(getClientsRequest());
|
dispatch(getClientsRequest());
|
||||||
try {
|
try {
|
||||||
const data = await apiClient.getClients();
|
const data = await apiClient.getClients();
|
||||||
const sortedClients = data.clients && sortClients(data.clients);
|
const sortedClients = data.clients && sortClients(data.clients);
|
||||||
const sortedAutoClients = data.auto_clients && sortClients(data.auto_clients);
|
const sortedAutoClients = data.auto_clients && sortClients(data.auto_clients);
|
||||||
|
|
||||||
dispatch(getClientsSuccess({
|
dispatch(
|
||||||
clients: sortedClients || [],
|
getClientsSuccess({
|
||||||
autoClients: sortedAutoClients || [],
|
clients: sortedClients || [],
|
||||||
supportedTags: data.supported_tags || [],
|
autoClients: sortedAutoClients || [],
|
||||||
}));
|
supportedTags: data.supported_tags || [],
|
||||||
|
}),
|
||||||
|
);
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
dispatch(addErrorToast({ error }));
|
dispatch(addErrorToast({ error }));
|
||||||
dispatch(getClientsFailure());
|
dispatch(getClientsFailure());
|
||||||
@@ -289,7 +282,7 @@ export const getProfileRequest = createAction('GET_PROFILE_REQUEST');
|
|||||||
export const getProfileFailure = createAction('GET_PROFILE_FAILURE');
|
export const getProfileFailure = createAction('GET_PROFILE_FAILURE');
|
||||||
export const getProfileSuccess = createAction('GET_PROFILE_SUCCESS');
|
export const getProfileSuccess = createAction('GET_PROFILE_SUCCESS');
|
||||||
|
|
||||||
export const getProfile = () => async (dispatch) => {
|
export const getProfile = () => async (dispatch: any) => {
|
||||||
dispatch(getProfileRequest());
|
dispatch(getProfileRequest());
|
||||||
try {
|
try {
|
||||||
const profile = await apiClient.getProfile();
|
const profile = await apiClient.getProfile();
|
||||||
@@ -305,16 +298,17 @@ export const dnsStatusFailure = createAction('DNS_STATUS_FAILURE');
|
|||||||
export const dnsStatusSuccess = createAction('DNS_STATUS_SUCCESS');
|
export const dnsStatusSuccess = createAction('DNS_STATUS_SUCCESS');
|
||||||
export const setDnsRunningStatus = createAction('SET_DNS_RUNNING_STATUS');
|
export const setDnsRunningStatus = createAction('SET_DNS_RUNNING_STATUS');
|
||||||
|
|
||||||
export const getDnsStatus = () => async (dispatch) => {
|
export const getDnsStatus = () => async (dispatch: any) => {
|
||||||
dispatch(dnsStatusRequest());
|
dispatch(dnsStatusRequest());
|
||||||
|
|
||||||
const handleRequestError = () => {
|
const handleRequestError = () => {
|
||||||
dispatch(addErrorToast({ error: 'dns_status_error' }));
|
dispatch(addErrorToast({ error: 'dns_status_error' }));
|
||||||
dispatch(dnsStatusFailure());
|
dispatch(dnsStatusFailure());
|
||||||
window.location.reload(true);
|
|
||||||
|
window.location.reload();
|
||||||
};
|
};
|
||||||
|
|
||||||
const handleRequestSuccess = (response) => {
|
const handleRequestSuccess = (response: any) => {
|
||||||
const dnsStatus = response.data;
|
const dnsStatus = response.data;
|
||||||
if (dnsStatus.protection_disabled_duration === 0) {
|
if (dnsStatus.protection_disabled_duration === 0) {
|
||||||
dnsStatus.protection_disabled_duration = null;
|
dnsStatus.protection_disabled_duration = null;
|
||||||
@@ -342,16 +336,17 @@ export const timerStatusRequest = createAction('TIMER_STATUS_REQUEST');
|
|||||||
export const timerStatusFailure = createAction('TIMER_STATUS_FAILURE');
|
export const timerStatusFailure = createAction('TIMER_STATUS_FAILURE');
|
||||||
export const timerStatusSuccess = createAction('TIMER_STATUS_SUCCESS');
|
export const timerStatusSuccess = createAction('TIMER_STATUS_SUCCESS');
|
||||||
|
|
||||||
export const getTimerStatus = () => async (dispatch) => {
|
export const getTimerStatus = () => async (dispatch: any) => {
|
||||||
dispatch(timerStatusRequest());
|
dispatch(timerStatusRequest());
|
||||||
|
|
||||||
const handleRequestError = () => {
|
const handleRequestError = () => {
|
||||||
dispatch(addErrorToast({ error: 'dns_status_error' }));
|
dispatch(addErrorToast({ error: 'dns_status_error' }));
|
||||||
dispatch(dnsStatusFailure());
|
dispatch(dnsStatusFailure());
|
||||||
window.location.reload(true);
|
|
||||||
|
window.location.reload();
|
||||||
};
|
};
|
||||||
|
|
||||||
const handleRequestSuccess = (response) => {
|
const handleRequestSuccess = (response: any) => {
|
||||||
const dnsStatus = response.data;
|
const dnsStatus = response.data;
|
||||||
if (dnsStatus.protection_disabled_duration === 0) {
|
if (dnsStatus.protection_disabled_duration === 0) {
|
||||||
dnsStatus.protection_disabled_duration = null;
|
dnsStatus.protection_disabled_duration = null;
|
||||||
@@ -376,72 +371,80 @@ export const testUpstreamRequest = createAction('TEST_UPSTREAM_REQUEST');
|
|||||||
export const testUpstreamFailure = createAction('TEST_UPSTREAM_FAILURE');
|
export const testUpstreamFailure = createAction('TEST_UPSTREAM_FAILURE');
|
||||||
export const testUpstreamSuccess = createAction('TEST_UPSTREAM_SUCCESS');
|
export const testUpstreamSuccess = createAction('TEST_UPSTREAM_SUCCESS');
|
||||||
|
|
||||||
export const testUpstream = (
|
export const testUpstream =
|
||||||
{
|
({ bootstrap_dns, upstream_dns, local_ptr_upstreams, fallback_dns }: any, upstream_dns_file: any) =>
|
||||||
bootstrap_dns,
|
async (dispatch: any) => {
|
||||||
upstream_dns,
|
dispatch(testUpstreamRequest());
|
||||||
local_ptr_upstreams,
|
try {
|
||||||
fallback_dns,
|
const removeComments = compose(filterOutComments, splitByNewLine);
|
||||||
}, upstream_dns_file,
|
|
||||||
) => async (dispatch) => {
|
|
||||||
dispatch(testUpstreamRequest());
|
|
||||||
try {
|
|
||||||
const removeComments = compose(filterOutComments, splitByNewLine);
|
|
||||||
|
|
||||||
const config = {
|
const config = {
|
||||||
bootstrap_dns: splitByNewLine(bootstrap_dns),
|
bootstrap_dns: splitByNewLine(bootstrap_dns),
|
||||||
private_upstream: splitByNewLine(local_ptr_upstreams),
|
private_upstream: splitByNewLine(local_ptr_upstreams),
|
||||||
fallback_dns: splitByNewLine(fallback_dns),
|
fallback_dns: splitByNewLine(fallback_dns),
|
||||||
...(upstream_dns_file ? null : {
|
...(upstream_dns_file
|
||||||
upstream_dns: removeComments(upstream_dns),
|
? null
|
||||||
}),
|
: {
|
||||||
};
|
upstream_dns: removeComments(upstream_dns),
|
||||||
|
}),
|
||||||
|
};
|
||||||
|
|
||||||
const upstreamResponse = await apiClient.testUpstream(config);
|
const upstreamResponse = await apiClient.testUpstream(config);
|
||||||
const testMessages = Object.keys(upstreamResponse)
|
const testMessages = Object.keys(upstreamResponse).map((key) => {
|
||||||
.map((key) => {
|
|
||||||
const message = upstreamResponse[key];
|
const message = upstreamResponse[key];
|
||||||
if (message.startsWith('WARNING:')) {
|
if (message.startsWith('WARNING:')) {
|
||||||
dispatch(addErrorToast({ error: i18next.t('dns_test_warning_toast', { key }) }));
|
dispatch(addErrorToast({ error: i18next.t('dns_test_warning_toast', { key }) }));
|
||||||
|
} else if (message.endsWith(': parsing error')) {
|
||||||
|
const info = message.substring(0, message.indexOf(':'));
|
||||||
|
const [sectionKey, line] = info.split(' ');
|
||||||
|
const section = i18next.t(sectionKey);
|
||||||
|
dispatch(
|
||||||
|
addErrorToast({
|
||||||
|
error: i18next.t('dns_test_parsing_error_toast', {
|
||||||
|
section,
|
||||||
|
line,
|
||||||
|
}),
|
||||||
|
}),
|
||||||
|
);
|
||||||
} else if (message !== 'OK') {
|
} else if (message !== 'OK') {
|
||||||
dispatch(addErrorToast({ error: i18next.t('dns_test_not_ok_toast', { key }) }));
|
dispatch(addErrorToast({ error: i18next.t('dns_test_not_ok_toast', { key }) }));
|
||||||
}
|
}
|
||||||
return message;
|
return message;
|
||||||
});
|
});
|
||||||
|
|
||||||
if (testMessages.every((message) => message === 'OK' || message.startsWith('WARNING:'))) {
|
if (testMessages.every((message) => message === 'OK' || message.startsWith('WARNING:'))) {
|
||||||
dispatch(addSuccessToast('dns_test_ok_toast'));
|
dispatch(addSuccessToast('dns_test_ok_toast'));
|
||||||
|
}
|
||||||
|
|
||||||
|
dispatch(testUpstreamSuccess());
|
||||||
|
} catch (error) {
|
||||||
|
dispatch(addErrorToast({ error }));
|
||||||
|
dispatch(testUpstreamFailure());
|
||||||
}
|
}
|
||||||
|
};
|
||||||
|
|
||||||
dispatch(testUpstreamSuccess());
|
export const testUpstreamWithFormValues = (formValues: any) => async (dispatch: any, getState: any) => {
|
||||||
} catch (error) {
|
|
||||||
dispatch(addErrorToast({ error }));
|
|
||||||
dispatch(testUpstreamFailure());
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
export const testUpstreamWithFormValues = () => async (dispatch, getState) => {
|
|
||||||
const { upstream_dns_file } = getState().dnsConfig;
|
const { upstream_dns_file } = getState().dnsConfig;
|
||||||
const {
|
const { bootstrap_dns, upstream_dns, local_ptr_upstreams, fallback_dns } = formValues;
|
||||||
bootstrap_dns,
|
|
||||||
upstream_dns,
|
|
||||||
local_ptr_upstreams,
|
|
||||||
fallback_dns,
|
|
||||||
} = getState().form[FORM_NAME.UPSTREAM].values;
|
|
||||||
|
|
||||||
return dispatch(testUpstream({
|
return dispatch(
|
||||||
bootstrap_dns,
|
testUpstream(
|
||||||
upstream_dns,
|
{
|
||||||
local_ptr_upstreams,
|
bootstrap_dns,
|
||||||
fallback_dns,
|
upstream_dns,
|
||||||
}, upstream_dns_file));
|
local_ptr_upstreams,
|
||||||
|
fallback_dns,
|
||||||
|
},
|
||||||
|
upstream_dns_file,
|
||||||
|
),
|
||||||
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
export const changeLanguageRequest = createAction('CHANGE_LANGUAGE_REQUEST');
|
export const changeLanguageRequest = createAction('CHANGE_LANGUAGE_REQUEST');
|
||||||
export const changeLanguageFailure = createAction('CHANGE_LANGUAGE_FAILURE');
|
export const changeLanguageFailure = createAction('CHANGE_LANGUAGE_FAILURE');
|
||||||
export const changeLanguageSuccess = createAction('CHANGE_LANGUAGE_SUCCESS');
|
export const changeLanguageSuccess = createAction('CHANGE_LANGUAGE_SUCCESS');
|
||||||
|
|
||||||
export const changeLanguage = (lang) => async (dispatch) => {
|
export const changeLanguage = (lang: any) => async (dispatch: any) => {
|
||||||
dispatch(changeLanguageRequest());
|
dispatch(changeLanguageRequest());
|
||||||
try {
|
try {
|
||||||
await apiClient.changeLanguage({ language: lang });
|
await apiClient.changeLanguage({ language: lang });
|
||||||
@@ -456,7 +459,7 @@ export const changeThemeRequest = createAction('CHANGE_THEME_REQUEST');
|
|||||||
export const changeThemeFailure = createAction('CHANGE_THEME_FAILURE');
|
export const changeThemeFailure = createAction('CHANGE_THEME_FAILURE');
|
||||||
export const changeThemeSuccess = createAction('CHANGE_THEME_SUCCESS');
|
export const changeThemeSuccess = createAction('CHANGE_THEME_SUCCESS');
|
||||||
|
|
||||||
export const changeTheme = (theme) => async (dispatch) => {
|
export const changeTheme = (theme: any) => async (dispatch: any) => {
|
||||||
dispatch(changeThemeRequest());
|
dispatch(changeThemeRequest());
|
||||||
try {
|
try {
|
||||||
await apiClient.changeTheme({ theme });
|
await apiClient.changeTheme({ theme });
|
||||||
@@ -471,7 +474,7 @@ export const getDhcpStatusRequest = createAction('GET_DHCP_STATUS_REQUEST');
|
|||||||
export const getDhcpStatusSuccess = createAction('GET_DHCP_STATUS_SUCCESS');
|
export const getDhcpStatusSuccess = createAction('GET_DHCP_STATUS_SUCCESS');
|
||||||
export const getDhcpStatusFailure = createAction('GET_DHCP_STATUS_FAILURE');
|
export const getDhcpStatusFailure = createAction('GET_DHCP_STATUS_FAILURE');
|
||||||
|
|
||||||
export const getDhcpStatus = () => async (dispatch) => {
|
export const getDhcpStatus = () => async (dispatch: any) => {
|
||||||
dispatch(getDhcpStatusRequest());
|
dispatch(getDhcpStatusRequest());
|
||||||
try {
|
try {
|
||||||
const globalStatus = await apiClient.getGlobalStatus();
|
const globalStatus = await apiClient.getGlobalStatus();
|
||||||
@@ -492,7 +495,7 @@ export const getDhcpInterfacesRequest = createAction('GET_DHCP_INTERFACES_REQUES
|
|||||||
export const getDhcpInterfacesSuccess = createAction('GET_DHCP_INTERFACES_SUCCESS');
|
export const getDhcpInterfacesSuccess = createAction('GET_DHCP_INTERFACES_SUCCESS');
|
||||||
export const getDhcpInterfacesFailure = createAction('GET_DHCP_INTERFACES_FAILURE');
|
export const getDhcpInterfacesFailure = createAction('GET_DHCP_INTERFACES_FAILURE');
|
||||||
|
|
||||||
export const getDhcpInterfaces = () => async (dispatch) => {
|
export const getDhcpInterfaces = () => async (dispatch: any) => {
|
||||||
dispatch(getDhcpInterfacesRequest());
|
dispatch(getDhcpInterfacesRequest());
|
||||||
try {
|
try {
|
||||||
const interfaces = await apiClient.getDhcpInterfaces();
|
const interfaces = await apiClient.getDhcpInterfaces();
|
||||||
@@ -507,16 +510,15 @@ export const findActiveDhcpRequest = createAction('FIND_ACTIVE_DHCP_REQUEST');
|
|||||||
export const findActiveDhcpSuccess = createAction('FIND_ACTIVE_DHCP_SUCCESS');
|
export const findActiveDhcpSuccess = createAction('FIND_ACTIVE_DHCP_SUCCESS');
|
||||||
export const findActiveDhcpFailure = createAction('FIND_ACTIVE_DHCP_FAILURE');
|
export const findActiveDhcpFailure = createAction('FIND_ACTIVE_DHCP_FAILURE');
|
||||||
|
|
||||||
export const findActiveDhcp = (name) => async (dispatch, getState) => {
|
export const findActiveDhcp = (selectedInterface: any) => async (dispatch: any, getState: any) => {
|
||||||
dispatch(findActiveDhcpRequest());
|
dispatch(findActiveDhcpRequest());
|
||||||
try {
|
try {
|
||||||
const req = {
|
const req = {
|
||||||
interface: name,
|
interface: selectedInterface,
|
||||||
};
|
};
|
||||||
const activeDhcp = await apiClient.findActiveDhcp(req);
|
const activeDhcp = await apiClient.findActiveDhcp(req);
|
||||||
dispatch(findActiveDhcpSuccess(activeDhcp));
|
dispatch(findActiveDhcpSuccess(activeDhcp));
|
||||||
const { check, interface_name, interfaces } = getState().dhcp;
|
const { check, interface_name, interfaces } = getState().dhcp;
|
||||||
const selectedInterface = getState().form[FORM_NAME.DHCP_INTERFACES].values.interface_name;
|
|
||||||
const v4 = check?.v4 ?? { static_ip: {}, other_server: {} };
|
const v4 = check?.v4 ?? { static_ip: {}, other_server: {} };
|
||||||
const v6 = check?.v6 ?? { other_server: {} };
|
const v6 = check?.v6 ?? { other_server: {} };
|
||||||
|
|
||||||
@@ -554,12 +556,12 @@ export const findActiveDhcp = (name) => async (dispatch, getState) => {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((hasV4Interface && v4.other_server.found === STATUS_RESPONSE.YES)
|
if (
|
||||||
|| (hasV6Interface && v6.other_server.found === STATUS_RESPONSE.YES)) {
|
(hasV4Interface && v4.other_server.found === STATUS_RESPONSE.YES) ||
|
||||||
|
(hasV6Interface && v6.other_server.found === STATUS_RESPONSE.YES)
|
||||||
|
) {
|
||||||
dispatch(addErrorToast({ error: 'dhcp_found' }));
|
dispatch(addErrorToast({ error: 'dhcp_found' }));
|
||||||
} else if (hasV4Interface && v4.static_ip.static === STATUS_RESPONSE.NO
|
} else if (hasV4Interface && v4.static_ip.static === STATUS_RESPONSE.NO && v4.static_ip.ip && interface_name) {
|
||||||
&& v4.static_ip.ip
|
|
||||||
&& interface_name) {
|
|
||||||
const warning = i18next.t('dhcp_dynamic_ip_found', {
|
const warning = i18next.t('dhcp_dynamic_ip_found', {
|
||||||
interfaceName: interface_name,
|
interfaceName: interface_name,
|
||||||
ipAddress: v4.static_ip.ip,
|
ipAddress: v4.static_ip.ip,
|
||||||
@@ -582,7 +584,7 @@ export const setDhcpConfigRequest = createAction('SET_DHCP_CONFIG_REQUEST');
|
|||||||
export const setDhcpConfigSuccess = createAction('SET_DHCP_CONFIG_SUCCESS');
|
export const setDhcpConfigSuccess = createAction('SET_DHCP_CONFIG_SUCCESS');
|
||||||
export const setDhcpConfigFailure = createAction('SET_DHCP_CONFIG_FAILURE');
|
export const setDhcpConfigFailure = createAction('SET_DHCP_CONFIG_FAILURE');
|
||||||
|
|
||||||
export const setDhcpConfig = (values) => async (dispatch) => {
|
export const setDhcpConfig = (values: any) => async (dispatch: any) => {
|
||||||
dispatch(setDhcpConfigRequest());
|
dispatch(setDhcpConfigRequest());
|
||||||
try {
|
try {
|
||||||
await apiClient.setDhcpConfig(values);
|
await apiClient.setDhcpConfig(values);
|
||||||
@@ -598,7 +600,7 @@ export const toggleDhcpRequest = createAction('TOGGLE_DHCP_REQUEST');
|
|||||||
export const toggleDhcpFailure = createAction('TOGGLE_DHCP_FAILURE');
|
export const toggleDhcpFailure = createAction('TOGGLE_DHCP_FAILURE');
|
||||||
export const toggleDhcpSuccess = createAction('TOGGLE_DHCP_SUCCESS');
|
export const toggleDhcpSuccess = createAction('TOGGLE_DHCP_SUCCESS');
|
||||||
|
|
||||||
export const toggleDhcp = (values) => async (dispatch) => {
|
export const toggleDhcp = (values: any) => async (dispatch: any) => {
|
||||||
dispatch(toggleDhcpRequest());
|
dispatch(toggleDhcpRequest());
|
||||||
let config = {
|
let config = {
|
||||||
...values,
|
...values,
|
||||||
@@ -628,7 +630,7 @@ export const resetDhcpRequest = createAction('RESET_DHCP_REQUEST');
|
|||||||
export const resetDhcpSuccess = createAction('RESET_DHCP_SUCCESS');
|
export const resetDhcpSuccess = createAction('RESET_DHCP_SUCCESS');
|
||||||
export const resetDhcpFailure = createAction('RESET_DHCP_FAILURE');
|
export const resetDhcpFailure = createAction('RESET_DHCP_FAILURE');
|
||||||
|
|
||||||
export const resetDhcp = () => async (dispatch) => {
|
export const resetDhcp = () => async (dispatch: any) => {
|
||||||
dispatch(resetDhcpRequest());
|
dispatch(resetDhcpRequest());
|
||||||
try {
|
try {
|
||||||
const status = await apiClient.resetDhcp();
|
const status = await apiClient.resetDhcp();
|
||||||
@@ -644,7 +646,7 @@ export const resetDhcpLeasesRequest = createAction('RESET_DHCP_LEASES_REQUEST');
|
|||||||
export const resetDhcpLeasesSuccess = createAction('RESET_DHCP_LEASES_SUCCESS');
|
export const resetDhcpLeasesSuccess = createAction('RESET_DHCP_LEASES_SUCCESS');
|
||||||
export const resetDhcpLeasesFailure = createAction('RESET_DHCP_LEASES_FAILURE');
|
export const resetDhcpLeasesFailure = createAction('RESET_DHCP_LEASES_FAILURE');
|
||||||
|
|
||||||
export const resetDhcpLeases = () => async (dispatch) => {
|
export const resetDhcpLeases = () => async (dispatch: any) => {
|
||||||
dispatch(resetDhcpLeasesRequest());
|
dispatch(resetDhcpLeasesRequest());
|
||||||
try {
|
try {
|
||||||
const status = await apiClient.resetDhcpLeases();
|
const status = await apiClient.resetDhcpLeases();
|
||||||
@@ -662,7 +664,7 @@ export const addStaticLeaseRequest = createAction('ADD_STATIC_LEASE_REQUEST');
|
|||||||
export const addStaticLeaseFailure = createAction('ADD_STATIC_LEASE_FAILURE');
|
export const addStaticLeaseFailure = createAction('ADD_STATIC_LEASE_FAILURE');
|
||||||
export const addStaticLeaseSuccess = createAction('ADD_STATIC_LEASE_SUCCESS');
|
export const addStaticLeaseSuccess = createAction('ADD_STATIC_LEASE_SUCCESS');
|
||||||
|
|
||||||
export const addStaticLease = (config) => async (dispatch) => {
|
export const addStaticLease = (config: any) => async (dispatch: any) => {
|
||||||
dispatch(addStaticLeaseRequest());
|
dispatch(addStaticLeaseRequest());
|
||||||
try {
|
try {
|
||||||
const name = config.hostname || config.ip;
|
const name = config.hostname || config.ip;
|
||||||
@@ -681,7 +683,7 @@ export const removeStaticLeaseRequest = createAction('REMOVE_STATIC_LEASE_REQUES
|
|||||||
export const removeStaticLeaseFailure = createAction('REMOVE_STATIC_LEASE_FAILURE');
|
export const removeStaticLeaseFailure = createAction('REMOVE_STATIC_LEASE_FAILURE');
|
||||||
export const removeStaticLeaseSuccess = createAction('REMOVE_STATIC_LEASE_SUCCESS');
|
export const removeStaticLeaseSuccess = createAction('REMOVE_STATIC_LEASE_SUCCESS');
|
||||||
|
|
||||||
export const removeStaticLease = (config) => async (dispatch) => {
|
export const removeStaticLease = (config: any) => async (dispatch: any) => {
|
||||||
dispatch(removeStaticLeaseRequest());
|
dispatch(removeStaticLeaseRequest());
|
||||||
try {
|
try {
|
||||||
const name = config.hostname || config.ip;
|
const name = config.hostname || config.ip;
|
||||||
@@ -698,7 +700,7 @@ export const updateStaticLeaseRequest = createAction('UPDATE_STATIC_LEASE_REQUES
|
|||||||
export const updateStaticLeaseFailure = createAction('UPDATE_STATIC_LEASE_FAILURE');
|
export const updateStaticLeaseFailure = createAction('UPDATE_STATIC_LEASE_FAILURE');
|
||||||
export const updateStaticLeaseSuccess = createAction('UPDATE_STATIC_LEASE_SUCCESS');
|
export const updateStaticLeaseSuccess = createAction('UPDATE_STATIC_LEASE_SUCCESS');
|
||||||
|
|
||||||
export const updateStaticLease = (config) => async (dispatch) => {
|
export const updateStaticLease = (config: any) => async (dispatch: any) => {
|
||||||
dispatch(updateStaticLeaseRequest());
|
dispatch(updateStaticLeaseRequest());
|
||||||
try {
|
try {
|
||||||
await apiClient.updateStaticLease(config);
|
await apiClient.updateStaticLease(config);
|
||||||
@@ -714,42 +716,42 @@ export const updateStaticLease = (config) => async (dispatch) => {
|
|||||||
|
|
||||||
export const removeToast = createAction('REMOVE_TOAST');
|
export const removeToast = createAction('REMOVE_TOAST');
|
||||||
|
|
||||||
export const toggleBlocking = (
|
export const toggleBlocking =
|
||||||
type, domain, baseRule, baseUnblocking,
|
(type: any, domain: any, baseRule?: string, baseUnblocking?: string) => async (dispatch: any, getState: any) => {
|
||||||
) => async (dispatch, getState) => {
|
const baseBlockingRule = baseRule || `||${domain}^$important`;
|
||||||
const baseBlockingRule = baseRule || `||${domain}^$important`;
|
const baseUnblockingRule = baseUnblocking || `@@${baseBlockingRule}`;
|
||||||
const baseUnblockingRule = baseUnblocking || `@@${baseBlockingRule}`;
|
const { userRules } = getState().filtering;
|
||||||
const { userRules } = getState().filtering;
|
|
||||||
|
|
||||||
const lineEnding = !endsWith(userRules, '\n') ? '\n' : '';
|
const lineEnding = !endsWith(userRules, '\n') ? '\n' : '';
|
||||||
|
|
||||||
const blockingRule = type === BLOCK_ACTIONS.BLOCK ? baseUnblockingRule : baseBlockingRule;
|
const blockingRule = type === BLOCK_ACTIONS.BLOCK ? baseUnblockingRule : baseBlockingRule;
|
||||||
const unblockingRule = type === BLOCK_ACTIONS.BLOCK ? baseBlockingRule : baseUnblockingRule;
|
const unblockingRule = type === BLOCK_ACTIONS.BLOCK ? baseBlockingRule : baseUnblockingRule;
|
||||||
const preparedBlockingRule = new RegExp(`(^|\n)${escapeRegExp(blockingRule)}($|\n)`);
|
const preparedBlockingRule = new RegExp(`(^|\n)${escapeRegExp(blockingRule)}($|\n)`);
|
||||||
const preparedUnblockingRule = new RegExp(`(^|\n)${escapeRegExp(unblockingRule)}($|\n)`);
|
const preparedUnblockingRule = new RegExp(`(^|\n)${escapeRegExp(unblockingRule)}($|\n)`);
|
||||||
|
|
||||||
const matchPreparedBlockingRule = userRules.match(preparedBlockingRule);
|
const matchPreparedBlockingRule = userRules.match(preparedBlockingRule);
|
||||||
const matchPreparedUnblockingRule = userRules.match(preparedUnblockingRule);
|
const matchPreparedUnblockingRule = userRules.match(preparedUnblockingRule);
|
||||||
|
|
||||||
if (matchPreparedBlockingRule) {
|
if (matchPreparedBlockingRule) {
|
||||||
await dispatch(setRules(userRules.replace(`${blockingRule}`, '')));
|
await dispatch(setRules(userRules.replace(`${blockingRule}`, '')));
|
||||||
dispatch(addSuccessToast(i18next.t('rule_removed_from_custom_filtering_toast', { rule: blockingRule })));
|
dispatch(addSuccessToast(i18next.t('rule_removed_from_custom_filtering_toast', { rule: blockingRule })));
|
||||||
} else if (!matchPreparedUnblockingRule) {
|
} else if (!matchPreparedUnblockingRule) {
|
||||||
await dispatch(setRules(`${userRules}${lineEnding}${unblockingRule}\n`));
|
await dispatch(setRules(`${userRules}${lineEnding}${unblockingRule}\n`));
|
||||||
dispatch(addSuccessToast(i18next.t('rule_added_to_custom_filtering_toast', { rule: unblockingRule })));
|
dispatch(addSuccessToast(i18next.t('rule_added_to_custom_filtering_toast', { rule: unblockingRule })));
|
||||||
} else if (matchPreparedUnblockingRule) {
|
} else if (matchPreparedUnblockingRule) {
|
||||||
dispatch(addSuccessToast(i18next.t('rule_added_to_custom_filtering_toast', { rule: unblockingRule })));
|
dispatch(addSuccessToast(i18next.t('rule_added_to_custom_filtering_toast', { rule: unblockingRule })));
|
||||||
return;
|
return;
|
||||||
} else if (!matchPreparedBlockingRule) {
|
} else if (!matchPreparedBlockingRule) {
|
||||||
dispatch(addSuccessToast(i18next.t('rule_removed_from_custom_filtering_toast', { rule: blockingRule })));
|
dispatch(addSuccessToast(i18next.t('rule_removed_from_custom_filtering_toast', { rule: blockingRule })));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
dispatch(getFilteringStatus());
|
dispatch(getFilteringStatus());
|
||||||
};
|
};
|
||||||
|
|
||||||
export const toggleBlockingForClient = (type, domain, client) => {
|
export const toggleBlockingForClient = (type: any, domain: any, client: any) => {
|
||||||
const escapedClientName = client.replace(/'/g, '\\\'')
|
const escapedClientName = client
|
||||||
|
.replace(/'/g, "\\'")
|
||||||
.replace(/"/g, '\\"')
|
.replace(/"/g, '\\"')
|
||||||
.replace(/,/g, '\\,')
|
.replace(/,/g, '\\,')
|
||||||
.replace(/\|/g, '\\|');
|
.replace(/\|/g, '\\|');
|
||||||
@@ -9,7 +9,7 @@ export const getDefaultAddressesRequest = createAction('GET_DEFAULT_ADDRESSES_RE
|
|||||||
export const getDefaultAddressesFailure = createAction('GET_DEFAULT_ADDRESSES_FAILURE');
|
export const getDefaultAddressesFailure = createAction('GET_DEFAULT_ADDRESSES_FAILURE');
|
||||||
export const getDefaultAddressesSuccess = createAction('GET_DEFAULT_ADDRESSES_SUCCESS');
|
export const getDefaultAddressesSuccess = createAction('GET_DEFAULT_ADDRESSES_SUCCESS');
|
||||||
|
|
||||||
export const getDefaultAddresses = () => async (dispatch) => {
|
export const getDefaultAddresses = () => async (dispatch: any) => {
|
||||||
dispatch(getDefaultAddressesRequest());
|
dispatch(getDefaultAddressesRequest());
|
||||||
try {
|
try {
|
||||||
const addresses = await apiClient.getDefaultAddresses();
|
const addresses = await apiClient.getDefaultAddresses();
|
||||||
@@ -24,13 +24,11 @@ export const setAllSettingsRequest = createAction('SET_ALL_SETTINGS_REQUEST');
|
|||||||
export const setAllSettingsFailure = createAction('SET_ALL_SETTINGS_FAILURE');
|
export const setAllSettingsFailure = createAction('SET_ALL_SETTINGS_FAILURE');
|
||||||
export const setAllSettingsSuccess = createAction('SET_ALL_SETTINGS_SUCCESS');
|
export const setAllSettingsSuccess = createAction('SET_ALL_SETTINGS_SUCCESS');
|
||||||
|
|
||||||
export const setAllSettings = (values) => async (dispatch) => {
|
export const setAllSettings = (values: any) => async (dispatch: any) => {
|
||||||
dispatch(setAllSettingsRequest());
|
dispatch(setAllSettingsRequest());
|
||||||
try {
|
try {
|
||||||
const {
|
const config = { ...values };
|
||||||
confirm_password,
|
delete config.confirm_password;
|
||||||
...config
|
|
||||||
} = values;
|
|
||||||
|
|
||||||
await apiClient.setAllSettings(config);
|
await apiClient.setAllSettings(config);
|
||||||
dispatch(setAllSettingsSuccess());
|
dispatch(setAllSettingsSuccess());
|
||||||
@@ -47,11 +45,15 @@ export const checkConfigRequest = createAction('CHECK_CONFIG_REQUEST');
|
|||||||
export const checkConfigFailure = createAction('CHECK_CONFIG_FAILURE');
|
export const checkConfigFailure = createAction('CHECK_CONFIG_FAILURE');
|
||||||
export const checkConfigSuccess = createAction('CHECK_CONFIG_SUCCESS');
|
export const checkConfigSuccess = createAction('CHECK_CONFIG_SUCCESS');
|
||||||
|
|
||||||
export const checkConfig = (values) => async (dispatch) => {
|
export const checkConfig = (values: any) => async (dispatch: any) => {
|
||||||
dispatch(checkConfigRequest());
|
dispatch(checkConfigRequest());
|
||||||
try {
|
try {
|
||||||
const check = await apiClient.checkConfig(values);
|
const check = await apiClient.checkConfig(values);
|
||||||
dispatch(checkConfigSuccess(check));
|
dispatch(checkConfigSuccess({
|
||||||
|
web: { ...values.web, ...check.web },
|
||||||
|
dns: { ...values.dns, ...check.dns },
|
||||||
|
static_ip: check.static_ip,
|
||||||
|
}));
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
dispatch(addErrorToast({ error }));
|
dispatch(addErrorToast({ error }));
|
||||||
dispatch(checkConfigFailure());
|
dispatch(checkConfigFailure());
|
||||||
@@ -8,12 +8,12 @@ export const processLoginRequest = createAction('PROCESS_LOGIN_REQUEST');
|
|||||||
export const processLoginFailure = createAction('PROCESS_LOGIN_FAILURE');
|
export const processLoginFailure = createAction('PROCESS_LOGIN_FAILURE');
|
||||||
export const processLoginSuccess = createAction('PROCESS_LOGIN_SUCCESS');
|
export const processLoginSuccess = createAction('PROCESS_LOGIN_SUCCESS');
|
||||||
|
|
||||||
export const processLogin = (values) => async (dispatch) => {
|
export const processLogin = (values: any) => async (dispatch: any) => {
|
||||||
dispatch(processLoginRequest());
|
dispatch(processLoginRequest());
|
||||||
try {
|
try {
|
||||||
await apiClient.login(values);
|
await apiClient.login(values);
|
||||||
const dashboardUrl = window.location.origin
|
const dashboardUrl =
|
||||||
+ window.location.pathname.replace(HTML_PAGES.LOGIN, HTML_PAGES.MAIN);
|
window.location.origin + window.location.pathname.replace(HTML_PAGES.LOGIN, HTML_PAGES.MAIN);
|
||||||
window.location.replace(dashboardUrl);
|
window.location.replace(dashboardUrl);
|
||||||
dispatch(processLoginSuccess());
|
dispatch(processLoginSuccess());
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
@@ -1,13 +1,13 @@
|
|||||||
import { createAction } from 'redux-actions';
|
import { createAction } from 'redux-actions';
|
||||||
|
|
||||||
import apiClient from '../api/Api';
|
import apiClient from '../api/Api';
|
||||||
import { normalizeLogs } from '../helpers/helpers';
|
|
||||||
import {
|
|
||||||
DEFAULT_LOGS_FILTER, FORM_NAME, QUERY_LOGS_PAGE_LIMIT,
|
|
||||||
} from '../helpers/constants';
|
|
||||||
import { addErrorToast, addSuccessToast } from './toasts';
|
|
||||||
|
|
||||||
const getLogsWithParams = async (config) => {
|
import { normalizeLogs } from '../helpers/helpers';
|
||||||
|
import { DEFAULT_LOGS_FILTER, QUERY_LOGS_PAGE_LIMIT } from '../helpers/constants';
|
||||||
|
import { addErrorToast, addSuccessToast } from './toasts';
|
||||||
|
import { SearchFormValues } from '../components/Logs';
|
||||||
|
|
||||||
|
const getLogsWithParams = async (config: any) => {
|
||||||
const { older_than, filter, ...values } = config;
|
const { older_than, filter, ...values } = config;
|
||||||
const rawLogs = await apiClient.getQueryLog({
|
const rawLogs = await apiClient.getQueryLog({
|
||||||
...filter,
|
...filter,
|
||||||
@@ -28,20 +28,18 @@ export const getAdditionalLogsRequest = createAction('GET_ADDITIONAL_LOGS_REQUES
|
|||||||
export const getAdditionalLogsFailure = createAction('GET_ADDITIONAL_LOGS_FAILURE');
|
export const getAdditionalLogsFailure = createAction('GET_ADDITIONAL_LOGS_FAILURE');
|
||||||
export const getAdditionalLogsSuccess = createAction('GET_ADDITIONAL_LOGS_SUCCESS');
|
export const getAdditionalLogsSuccess = createAction('GET_ADDITIONAL_LOGS_SUCCESS');
|
||||||
|
|
||||||
const shortPollQueryLogs = async (data, filter, dispatch, getState, total) => {
|
const shortPollQueryLogs = async (data: any, filter: any, dispatch: any, currentQuery?: string, total?: any) => {
|
||||||
const { logs, oldest } = data;
|
const { logs, oldest } = data;
|
||||||
const totalData = total || { logs };
|
const totalData = total || { logs };
|
||||||
|
|
||||||
const queryForm = getState().form[FORM_NAME.LOGS_FILTER];
|
|
||||||
const currentQuery = queryForm && queryForm.values.search;
|
|
||||||
const previousQuery = filter?.search;
|
const previousQuery = filter?.search;
|
||||||
const isQueryTheSame = typeof previousQuery === 'string'
|
const isQueryTheSame =
|
||||||
&& typeof currentQuery === 'string'
|
typeof previousQuery === 'string' && typeof currentQuery === 'string' && previousQuery === currentQuery;
|
||||||
&& previousQuery === currentQuery;
|
|
||||||
|
|
||||||
const isShortPollingNeeded = (logs.length < QUERY_LOGS_PAGE_LIMIT
|
const isShortPollingNeeded =
|
||||||
|| totalData.logs.length < QUERY_LOGS_PAGE_LIMIT)
|
(logs.length < QUERY_LOGS_PAGE_LIMIT || totalData.logs.length < QUERY_LOGS_PAGE_LIMIT) &&
|
||||||
&& oldest !== '' && isQueryTheSame;
|
oldest !== '' &&
|
||||||
|
isQueryTheSame;
|
||||||
|
|
||||||
if (isShortPollingNeeded) {
|
if (isShortPollingNeeded) {
|
||||||
dispatch(getAdditionalLogsRequest());
|
dispatch(getAdditionalLogsRequest());
|
||||||
@@ -52,7 +50,7 @@ const shortPollQueryLogs = async (data, filter, dispatch, getState, total) => {
|
|||||||
filter,
|
filter,
|
||||||
});
|
});
|
||||||
if (additionalLogs.oldest.length > 0) {
|
if (additionalLogs.oldest.length > 0) {
|
||||||
return await shortPollQueryLogs(additionalLogs, filter, dispatch, getState, {
|
return await shortPollQueryLogs(additionalLogs, filter, dispatch, currentQuery, {
|
||||||
logs: [...totalData.logs, ...additionalLogs.logs],
|
logs: [...totalData.logs, ...additionalLogs.logs],
|
||||||
oldest: additionalLogs.oldest,
|
oldest: additionalLogs.oldest,
|
||||||
});
|
});
|
||||||
@@ -75,32 +73,35 @@ export const getLogsRequest = createAction('GET_LOGS_REQUEST');
|
|||||||
export const getLogsFailure = createAction('GET_LOGS_FAILURE');
|
export const getLogsFailure = createAction('GET_LOGS_FAILURE');
|
||||||
export const getLogsSuccess = createAction('GET_LOGS_SUCCESS');
|
export const getLogsSuccess = createAction('GET_LOGS_SUCCESS');
|
||||||
|
|
||||||
export const updateLogs = () => async (dispatch, getState) => {
|
export const updateLogs = () => async (dispatch: any, getState: any) => {
|
||||||
try {
|
try {
|
||||||
const { logs, oldest, older_than } = getState().queryLogs;
|
const { logs, oldest, older_than } = getState().queryLogs;
|
||||||
|
|
||||||
dispatch(getLogsSuccess({
|
dispatch(
|
||||||
logs,
|
getLogsSuccess({
|
||||||
oldest,
|
logs,
|
||||||
older_than,
|
oldest,
|
||||||
}));
|
older_than,
|
||||||
|
}),
|
||||||
|
);
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
dispatch(addErrorToast({ error }));
|
dispatch(addErrorToast({ error }));
|
||||||
dispatch(getLogsFailure(error));
|
dispatch(getLogsFailure(error));
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
export const getLogs = () => async (dispatch, getState) => {
|
export const getLogs = (currentQuery?: string) => async (dispatch: any, getState: any) => {
|
||||||
dispatch(getLogsRequest());
|
dispatch(getLogsRequest());
|
||||||
try {
|
try {
|
||||||
const { isFiltered, filter, oldest } = getState().queryLogs;
|
const { isFiltered, filter, oldest } = getState().queryLogs;
|
||||||
|
|
||||||
const data = await getLogsWithParams({
|
const data = await getLogsWithParams({
|
||||||
older_than: oldest,
|
older_than: oldest,
|
||||||
filter,
|
filter,
|
||||||
});
|
});
|
||||||
|
|
||||||
if (isFiltered) {
|
if (isFiltered) {
|
||||||
const additionalData = await shortPollQueryLogs(data, filter, dispatch, getState);
|
const additionalData = await shortPollQueryLogs(data, filter, dispatch, currentQuery);
|
||||||
const updatedData = additionalData.logs ? { ...data, ...additionalData } : data;
|
const updatedData = additionalData.logs ? { ...data, ...additionalData } : data;
|
||||||
dispatch(getLogsSuccess(updatedData));
|
dispatch(getLogsSuccess(updatedData));
|
||||||
} else {
|
} else {
|
||||||
@@ -121,26 +122,31 @@ export const setLogsFilterRequest = createAction('SET_LOGS_FILTER_REQUEST');
|
|||||||
* @param {string} filter.response_status 'QUERY' field of RESPONSE_FILTER object
|
* @param {string} filter.response_status 'QUERY' field of RESPONSE_FILTER object
|
||||||
* @returns function
|
* @returns function
|
||||||
*/
|
*/
|
||||||
export const setLogsFilter = (filter) => setLogsFilterRequest(filter);
|
export const setLogsFilter = (filter: SearchFormValues) => setLogsFilterRequest(filter);
|
||||||
|
|
||||||
export const setFilteredLogsRequest = createAction('SET_FILTERED_LOGS_REQUEST');
|
export const setFilteredLogsRequest = createAction('SET_FILTERED_LOGS_REQUEST');
|
||||||
export const setFilteredLogsFailure = createAction('SET_FILTERED_LOGS_FAILURE');
|
export const setFilteredLogsFailure = createAction('SET_FILTERED_LOGS_FAILURE');
|
||||||
export const setFilteredLogsSuccess = createAction('SET_FILTERED_LOGS_SUCCESS');
|
export const setFilteredLogsSuccess = createAction('SET_FILTERED_LOGS_SUCCESS');
|
||||||
|
|
||||||
export const setFilteredLogs = (filter) => async (dispatch, getState) => {
|
export const setFilteredLogs = (filter?: SearchFormValues) => async (dispatch: any) => {
|
||||||
dispatch(setFilteredLogsRequest());
|
dispatch(setFilteredLogsRequest());
|
||||||
try {
|
try {
|
||||||
const data = await getLogsWithParams({
|
const data = await getLogsWithParams({
|
||||||
older_than: '',
|
older_than: '',
|
||||||
filter,
|
filter,
|
||||||
});
|
});
|
||||||
const additionalData = await shortPollQueryLogs(data, filter, dispatch, getState);
|
|
||||||
|
const currentQuery = filter?.search;
|
||||||
|
|
||||||
|
const additionalData = await shortPollQueryLogs(data, filter, dispatch, currentQuery);
|
||||||
const updatedData = additionalData.logs ? { ...data, ...additionalData } : data;
|
const updatedData = additionalData.logs ? { ...data, ...additionalData } : data;
|
||||||
|
|
||||||
dispatch(setFilteredLogsSuccess({
|
dispatch(
|
||||||
...updatedData,
|
setFilteredLogsSuccess({
|
||||||
filter,
|
...updatedData,
|
||||||
}));
|
filter,
|
||||||
|
}),
|
||||||
|
);
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
dispatch(addErrorToast({ error }));
|
dispatch(addErrorToast({ error }));
|
||||||
dispatch(setFilteredLogsFailure(error));
|
dispatch(setFilteredLogsFailure(error));
|
||||||
@@ -149,7 +155,7 @@ export const setFilteredLogs = (filter) => async (dispatch, getState) => {
|
|||||||
|
|
||||||
export const resetFilteredLogs = () => setFilteredLogs(DEFAULT_LOGS_FILTER);
|
export const resetFilteredLogs = () => setFilteredLogs(DEFAULT_LOGS_FILTER);
|
||||||
|
|
||||||
export const refreshFilteredLogs = () => async (dispatch, getState) => {
|
export const refreshFilteredLogs = () => async (dispatch: any, getState: any) => {
|
||||||
const { filter } = getState().queryLogs;
|
const { filter } = getState().queryLogs;
|
||||||
await dispatch(setFilteredLogs(filter));
|
await dispatch(setFilteredLogs(filter));
|
||||||
};
|
};
|
||||||
@@ -158,7 +164,7 @@ export const clearLogsRequest = createAction('CLEAR_LOGS_REQUEST');
|
|||||||
export const clearLogsFailure = createAction('CLEAR_LOGS_FAILURE');
|
export const clearLogsFailure = createAction('CLEAR_LOGS_FAILURE');
|
||||||
export const clearLogsSuccess = createAction('CLEAR_LOGS_SUCCESS');
|
export const clearLogsSuccess = createAction('CLEAR_LOGS_SUCCESS');
|
||||||
|
|
||||||
export const clearLogs = () => async (dispatch) => {
|
export const clearLogs = () => async (dispatch: any) => {
|
||||||
dispatch(clearLogsRequest());
|
dispatch(clearLogsRequest());
|
||||||
try {
|
try {
|
||||||
await apiClient.clearQueryLog();
|
await apiClient.clearQueryLog();
|
||||||
@@ -174,7 +180,7 @@ export const getLogsConfigRequest = createAction('GET_LOGS_CONFIG_REQUEST');
|
|||||||
export const getLogsConfigFailure = createAction('GET_LOGS_CONFIG_FAILURE');
|
export const getLogsConfigFailure = createAction('GET_LOGS_CONFIG_FAILURE');
|
||||||
export const getLogsConfigSuccess = createAction('GET_LOGS_CONFIG_SUCCESS');
|
export const getLogsConfigSuccess = createAction('GET_LOGS_CONFIG_SUCCESS');
|
||||||
|
|
||||||
export const getLogsConfig = () => async (dispatch) => {
|
export const getLogsConfig = () => async (dispatch: any) => {
|
||||||
dispatch(getLogsConfigRequest());
|
dispatch(getLogsConfigRequest());
|
||||||
try {
|
try {
|
||||||
const data = await apiClient.getQueryLogConfig();
|
const data = await apiClient.getQueryLogConfig();
|
||||||
@@ -189,7 +195,7 @@ export const setLogsConfigRequest = createAction('SET_LOGS_CONFIG_REQUEST');
|
|||||||
export const setLogsConfigFailure = createAction('SET_LOGS_CONFIG_FAILURE');
|
export const setLogsConfigFailure = createAction('SET_LOGS_CONFIG_FAILURE');
|
||||||
export const setLogsConfigSuccess = createAction('SET_LOGS_CONFIG_SUCCESS');
|
export const setLogsConfigSuccess = createAction('SET_LOGS_CONFIG_SUCCESS');
|
||||||
|
|
||||||
export const setLogsConfig = (config) => async (dispatch) => {
|
export const setLogsConfig = (config: any) => async (dispatch: any) => {
|
||||||
dispatch(setLogsConfigRequest());
|
dispatch(setLogsConfigRequest());
|
||||||
try {
|
try {
|
||||||
await apiClient.setQueryLogConfig(config);
|
await apiClient.setQueryLogConfig(config);
|
||||||
@@ -9,7 +9,7 @@ export const getRewritesListRequest = createAction('GET_REWRITES_LIST_REQUEST');
|
|||||||
export const getRewritesListFailure = createAction('GET_REWRITES_LIST_FAILURE');
|
export const getRewritesListFailure = createAction('GET_REWRITES_LIST_FAILURE');
|
||||||
export const getRewritesListSuccess = createAction('GET_REWRITES_LIST_SUCCESS');
|
export const getRewritesListSuccess = createAction('GET_REWRITES_LIST_SUCCESS');
|
||||||
|
|
||||||
export const getRewritesList = () => async (dispatch) => {
|
export const getRewritesList = () => async (dispatch: any) => {
|
||||||
dispatch(getRewritesListRequest());
|
dispatch(getRewritesListRequest());
|
||||||
try {
|
try {
|
||||||
const data = await apiClient.getRewritesList();
|
const data = await apiClient.getRewritesList();
|
||||||
@@ -24,7 +24,7 @@ export const addRewriteRequest = createAction('ADD_REWRITE_REQUEST');
|
|||||||
export const addRewriteFailure = createAction('ADD_REWRITE_FAILURE');
|
export const addRewriteFailure = createAction('ADD_REWRITE_FAILURE');
|
||||||
export const addRewriteSuccess = createAction('ADD_REWRITE_SUCCESS');
|
export const addRewriteSuccess = createAction('ADD_REWRITE_SUCCESS');
|
||||||
|
|
||||||
export const addRewrite = (config) => async (dispatch) => {
|
export const addRewrite = (config: any) => async (dispatch: any) => {
|
||||||
dispatch(addRewriteRequest());
|
dispatch(addRewriteRequest());
|
||||||
try {
|
try {
|
||||||
await apiClient.addRewrite(config);
|
await apiClient.addRewrite(config);
|
||||||
@@ -47,7 +47,7 @@ export const updateRewriteSuccess = createAction('UPDATE_REWRITE_SUCCESS');
|
|||||||
* @param {string} config.target - current DNS rewrite value
|
* @param {string} config.target - current DNS rewrite value
|
||||||
* @param {string} config.update - updated DNS rewrite value
|
* @param {string} config.update - updated DNS rewrite value
|
||||||
*/
|
*/
|
||||||
export const updateRewrite = (config) => async (dispatch) => {
|
export const updateRewrite = (config: any) => async (dispatch: any) => {
|
||||||
dispatch(updateRewriteRequest());
|
dispatch(updateRewriteRequest());
|
||||||
try {
|
try {
|
||||||
await apiClient.updateRewrite(config);
|
await apiClient.updateRewrite(config);
|
||||||
@@ -65,7 +65,7 @@ export const deleteRewriteRequest = createAction('DELETE_REWRITE_REQUEST');
|
|||||||
export const deleteRewriteFailure = createAction('DELETE_REWRITE_FAILURE');
|
export const deleteRewriteFailure = createAction('DELETE_REWRITE_FAILURE');
|
||||||
export const deleteRewriteSuccess = createAction('DELETE_REWRITE_SUCCESS');
|
export const deleteRewriteSuccess = createAction('DELETE_REWRITE_SUCCESS');
|
||||||
|
|
||||||
export const deleteRewrite = (config) => async (dispatch) => {
|
export const deleteRewrite = (config: any) => async (dispatch: any) => {
|
||||||
dispatch(deleteRewriteRequest());
|
dispatch(deleteRewriteRequest());
|
||||||
try {
|
try {
|
||||||
await apiClient.deleteRewrite(config);
|
await apiClient.deleteRewrite(config);
|
||||||
@@ -6,7 +6,7 @@ export const getBlockedServicesRequest = createAction('GET_BLOCKED_SERVICES_REQU
|
|||||||
export const getBlockedServicesFailure = createAction('GET_BLOCKED_SERVICES_FAILURE');
|
export const getBlockedServicesFailure = createAction('GET_BLOCKED_SERVICES_FAILURE');
|
||||||
export const getBlockedServicesSuccess = createAction('GET_BLOCKED_SERVICES_SUCCESS');
|
export const getBlockedServicesSuccess = createAction('GET_BLOCKED_SERVICES_SUCCESS');
|
||||||
|
|
||||||
export const getBlockedServices = () => async (dispatch) => {
|
export const getBlockedServices = () => async (dispatch: any) => {
|
||||||
dispatch(getBlockedServicesRequest());
|
dispatch(getBlockedServicesRequest());
|
||||||
try {
|
try {
|
||||||
const data = await apiClient.getBlockedServices();
|
const data = await apiClient.getBlockedServices();
|
||||||
@@ -21,7 +21,7 @@ export const getAllBlockedServicesRequest = createAction('GET_ALL_BLOCKED_SERVIC
|
|||||||
export const getAllBlockedServicesFailure = createAction('GET_ALL_BLOCKED_SERVICES_FAILURE');
|
export const getAllBlockedServicesFailure = createAction('GET_ALL_BLOCKED_SERVICES_FAILURE');
|
||||||
export const getAllBlockedServicesSuccess = createAction('GET_ALL_BLOCKED_SERVICES_SUCCESS');
|
export const getAllBlockedServicesSuccess = createAction('GET_ALL_BLOCKED_SERVICES_SUCCESS');
|
||||||
|
|
||||||
export const getAllBlockedServices = () => async (dispatch) => {
|
export const getAllBlockedServices = () => async (dispatch: any) => {
|
||||||
dispatch(getAllBlockedServicesRequest());
|
dispatch(getAllBlockedServicesRequest());
|
||||||
try {
|
try {
|
||||||
const data = await apiClient.getAllBlockedServices();
|
const data = await apiClient.getAllBlockedServices();
|
||||||
@@ -36,7 +36,7 @@ export const updateBlockedServicesRequest = createAction('UPDATE_BLOCKED_SERVICE
|
|||||||
export const updateBlockedServicesFailure = createAction('UPDATE_BLOCKED_SERVICES_FAILURE');
|
export const updateBlockedServicesFailure = createAction('UPDATE_BLOCKED_SERVICES_FAILURE');
|
||||||
export const updateBlockedServicesSuccess = createAction('UPDATE_BLOCKED_SERVICES_SUCCESS');
|
export const updateBlockedServicesSuccess = createAction('UPDATE_BLOCKED_SERVICES_SUCCESS');
|
||||||
|
|
||||||
export const updateBlockedServices = (values) => async (dispatch) => {
|
export const updateBlockedServices = (values: any) => async (dispatch: any) => {
|
||||||
dispatch(updateBlockedServicesRequest());
|
dispatch(updateBlockedServicesRequest());
|
||||||
try {
|
try {
|
||||||
await apiClient.updateBlockedServices(values);
|
await apiClient.updateBlockedServices(values);
|
||||||
@@ -1,16 +1,14 @@
|
|||||||
import { createAction } from 'redux-actions';
|
import { createAction } from 'redux-actions';
|
||||||
|
|
||||||
import apiClient from '../api/Api';
|
import apiClient from '../api/Api';
|
||||||
import {
|
import { normalizeTopStats, secondsToMilliseconds, getParamsForClientsSearch, addClientInfo } from '../helpers/helpers';
|
||||||
normalizeTopStats, secondsToMilliseconds, getParamsForClientsSearch, addClientInfo,
|
|
||||||
} from '../helpers/helpers';
|
|
||||||
import { addErrorToast, addSuccessToast } from './toasts';
|
import { addErrorToast, addSuccessToast } from './toasts';
|
||||||
|
|
||||||
export const getStatsConfigRequest = createAction('GET_STATS_CONFIG_REQUEST');
|
export const getStatsConfigRequest = createAction('GET_STATS_CONFIG_REQUEST');
|
||||||
export const getStatsConfigFailure = createAction('GET_STATS_CONFIG_FAILURE');
|
export const getStatsConfigFailure = createAction('GET_STATS_CONFIG_FAILURE');
|
||||||
export const getStatsConfigSuccess = createAction('GET_STATS_CONFIG_SUCCESS');
|
export const getStatsConfigSuccess = createAction('GET_STATS_CONFIG_SUCCESS');
|
||||||
|
|
||||||
export const getStatsConfig = () => async (dispatch) => {
|
export const getStatsConfig = () => async (dispatch: any) => {
|
||||||
dispatch(getStatsConfigRequest());
|
dispatch(getStatsConfigRequest());
|
||||||
try {
|
try {
|
||||||
const data = await apiClient.getStatsConfig();
|
const data = await apiClient.getStatsConfig();
|
||||||
@@ -25,7 +23,7 @@ export const setStatsConfigRequest = createAction('SET_STATS_CONFIG_REQUEST');
|
|||||||
export const setStatsConfigFailure = createAction('SET_STATS_CONFIG_FAILURE');
|
export const setStatsConfigFailure = createAction('SET_STATS_CONFIG_FAILURE');
|
||||||
export const setStatsConfigSuccess = createAction('SET_STATS_CONFIG_SUCCESS');
|
export const setStatsConfigSuccess = createAction('SET_STATS_CONFIG_SUCCESS');
|
||||||
|
|
||||||
export const setStatsConfig = (config) => async (dispatch) => {
|
export const setStatsConfig = (config: any) => async (dispatch: any) => {
|
||||||
dispatch(setStatsConfigRequest());
|
dispatch(setStatsConfigRequest());
|
||||||
try {
|
try {
|
||||||
await apiClient.setStatsConfig(config);
|
await apiClient.setStatsConfig(config);
|
||||||
@@ -41,13 +39,14 @@ export const getStatsRequest = createAction('GET_STATS_REQUEST');
|
|||||||
export const getStatsFailure = createAction('GET_STATS_FAILURE');
|
export const getStatsFailure = createAction('GET_STATS_FAILURE');
|
||||||
export const getStatsSuccess = createAction('GET_STATS_SUCCESS');
|
export const getStatsSuccess = createAction('GET_STATS_SUCCESS');
|
||||||
|
|
||||||
export const getStats = () => async (dispatch) => {
|
export const getStats = () => async (dispatch: any) => {
|
||||||
dispatch(getStatsRequest());
|
dispatch(getStatsRequest());
|
||||||
try {
|
try {
|
||||||
const stats = await apiClient.getStats();
|
const stats = await apiClient.getStats();
|
||||||
const normalizedTopClients = normalizeTopStats(stats.top_clients);
|
const normalizedTopClients = normalizeTopStats(stats.top_clients);
|
||||||
|
|
||||||
const clientsParams = getParamsForClientsSearch(normalizedTopClients, 'name');
|
const clientsParams = getParamsForClientsSearch(normalizedTopClients, 'name');
|
||||||
const clients = await apiClient.findClients(clientsParams);
|
const clients = await apiClient.searchClients(clientsParams);
|
||||||
const topClientsWithInfo = addClientInfo(normalizedTopClients, clients, 'name');
|
const topClientsWithInfo = addClientInfo(normalizedTopClients, clients, 'name');
|
||||||
|
|
||||||
const normalizedStats = {
|
const normalizedStats = {
|
||||||
@@ -71,7 +70,7 @@ export const resetStatsRequest = createAction('RESET_STATS_REQUEST');
|
|||||||
export const resetStatsFailure = createAction('RESET_STATS_FAILURE');
|
export const resetStatsFailure = createAction('RESET_STATS_FAILURE');
|
||||||
export const resetStatsSuccess = createAction('RESET_STATS_SUCCESS');
|
export const resetStatsSuccess = createAction('RESET_STATS_SUCCESS');
|
||||||
|
|
||||||
export const resetStats = () => async (dispatch) => {
|
export const resetStats = () => async (dispatch: any) => {
|
||||||
dispatch(getStatsRequest());
|
dispatch(getStatsRequest());
|
||||||
try {
|
try {
|
||||||
await apiClient.resetStats();
|
await apiClient.resetStats();
|
||||||
@@ -1,17 +1,16 @@
|
|||||||
import axios from 'axios';
|
import axios from 'axios';
|
||||||
|
|
||||||
import { getPathWithQueryString } from '../helpers/helpers';
|
|
||||||
import {
|
|
||||||
QUERY_LOGS_PAGE_LIMIT, HTML_PAGES, R_PATH_LAST_PART, THEMES,
|
|
||||||
} from '../helpers/constants';
|
|
||||||
import { BASE_URL } from '../../constants';
|
import { BASE_URL } from '../../constants';
|
||||||
|
|
||||||
|
import { getPathWithQueryString } from '../helpers/helpers';
|
||||||
|
import { QUERY_LOGS_PAGE_LIMIT, HTML_PAGES, R_PATH_LAST_PART, THEMES } from '../helpers/constants';
|
||||||
import i18n from '../i18n';
|
import i18n from '../i18n';
|
||||||
import { LANGUAGES } from '../helpers/twosky';
|
import { LANGUAGES } from '../helpers/twosky';
|
||||||
|
|
||||||
class Api {
|
class Api {
|
||||||
baseUrl = BASE_URL;
|
baseUrl = BASE_URL;
|
||||||
|
|
||||||
async makeRequest(path, method = 'POST', config) {
|
async makeRequest(path: any, method = 'POST', config: any = {}) {
|
||||||
const url = `${this.baseUrl}/${path}`;
|
const url = `${this.baseUrl}/${path}`;
|
||||||
|
|
||||||
const axiosConfig = config || {};
|
const axiosConfig = config || {};
|
||||||
@@ -29,26 +28,26 @@ class Api {
|
|||||||
return response.data;
|
return response.data;
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
const errorPath = url;
|
const errorPath = url;
|
||||||
|
|
||||||
if (error.response) {
|
if (error.response) {
|
||||||
const { pathname } = document.location;
|
const { pathname } = document.location;
|
||||||
const shouldRedirect = pathname !== HTML_PAGES.LOGIN
|
const shouldRedirect = pathname !== HTML_PAGES.LOGIN && pathname !== HTML_PAGES.INSTALL;
|
||||||
&& pathname !== HTML_PAGES.INSTALL;
|
|
||||||
|
|
||||||
if (error.response.status === 403 && shouldRedirect) {
|
if (error.response.status === 403 && shouldRedirect) {
|
||||||
const loginPageUrl = window.location.href
|
const loginPageUrl = window.location.href.replace(R_PATH_LAST_PART, HTML_PAGES.LOGIN);
|
||||||
.replace(R_PATH_LAST_PART, HTML_PAGES.LOGIN);
|
|
||||||
window.location.replace(loginPageUrl);
|
window.location.replace(loginPageUrl);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
throw new Error(`${errorPath} | ${error.response.data} | ${error.response.status}`);
|
throw new Error(`${errorPath} | ${error.response.data} | ${error.response.status}`);
|
||||||
}
|
}
|
||||||
|
|
||||||
throw new Error(`${errorPath} | ${error.message || error}`);
|
throw new Error(`${errorPath} | ${error.message || error}`);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Global methods
|
// Global methods
|
||||||
GLOBAL_STATUS = { path: 'status', method: 'GET' }
|
GLOBAL_STATUS = { path: 'status', method: 'GET' };
|
||||||
|
|
||||||
GLOBAL_TEST_UPSTREAM_DNS = { path: 'test_upstream_dns', method: 'POST' };
|
GLOBAL_TEST_UPSTREAM_DNS = { path: 'test_upstream_dns', method: 'POST' };
|
||||||
|
|
||||||
@@ -58,10 +57,11 @@ class Api {
|
|||||||
|
|
||||||
getGlobalStatus() {
|
getGlobalStatus() {
|
||||||
const { path, method } = this.GLOBAL_STATUS;
|
const { path, method } = this.GLOBAL_STATUS;
|
||||||
|
|
||||||
return this.makeRequest(path, method);
|
return this.makeRequest(path, method);
|
||||||
}
|
}
|
||||||
|
|
||||||
testUpstream(servers) {
|
testUpstream(servers: any) {
|
||||||
const { path, method } = this.GLOBAL_TEST_UPSTREAM_DNS;
|
const { path, method } = this.GLOBAL_TEST_UPSTREAM_DNS;
|
||||||
const config = {
|
const config = {
|
||||||
data: servers,
|
data: servers,
|
||||||
@@ -69,7 +69,7 @@ class Api {
|
|||||||
return this.makeRequest(path, method, config);
|
return this.makeRequest(path, method, config);
|
||||||
}
|
}
|
||||||
|
|
||||||
getGlobalVersion(data) {
|
getGlobalVersion(data: any) {
|
||||||
const { path, method } = this.GLOBAL_VERSION;
|
const { path, method } = this.GLOBAL_VERSION;
|
||||||
const config = {
|
const config = {
|
||||||
data,
|
data,
|
||||||
@@ -79,6 +79,7 @@ class Api {
|
|||||||
|
|
||||||
getUpdate() {
|
getUpdate() {
|
||||||
const { path, method } = this.GLOBAL_UPDATE;
|
const { path, method } = this.GLOBAL_UPDATE;
|
||||||
|
|
||||||
return this.makeRequest(path, method);
|
return this.makeRequest(path, method);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -101,10 +102,11 @@ class Api {
|
|||||||
|
|
||||||
getFilteringStatus() {
|
getFilteringStatus() {
|
||||||
const { path, method } = this.FILTERING_STATUS;
|
const { path, method } = this.FILTERING_STATUS;
|
||||||
|
|
||||||
return this.makeRequest(path, method);
|
return this.makeRequest(path, method);
|
||||||
}
|
}
|
||||||
|
|
||||||
refreshFilters(config) {
|
refreshFilters(config: any) {
|
||||||
const { path, method } = this.FILTERING_REFRESH;
|
const { path, method } = this.FILTERING_REFRESH;
|
||||||
const parameters = {
|
const parameters = {
|
||||||
data: config,
|
data: config,
|
||||||
@@ -113,7 +115,7 @@ class Api {
|
|||||||
return this.makeRequest(path, method, parameters);
|
return this.makeRequest(path, method, parameters);
|
||||||
}
|
}
|
||||||
|
|
||||||
addFilter(config) {
|
addFilter(config: any) {
|
||||||
const { path, method } = this.FILTERING_ADD_FILTER;
|
const { path, method } = this.FILTERING_ADD_FILTER;
|
||||||
const parameters = {
|
const parameters = {
|
||||||
data: config,
|
data: config,
|
||||||
@@ -122,7 +124,7 @@ class Api {
|
|||||||
return this.makeRequest(path, method, parameters);
|
return this.makeRequest(path, method, parameters);
|
||||||
}
|
}
|
||||||
|
|
||||||
removeFilter(config) {
|
removeFilter(config: any) {
|
||||||
const { path, method } = this.FILTERING_REMOVE_FILTER;
|
const { path, method } = this.FILTERING_REMOVE_FILTER;
|
||||||
const parameters = {
|
const parameters = {
|
||||||
data: config,
|
data: config,
|
||||||
@@ -131,7 +133,7 @@ class Api {
|
|||||||
return this.makeRequest(path, method, parameters);
|
return this.makeRequest(path, method, parameters);
|
||||||
}
|
}
|
||||||
|
|
||||||
setRules(rules) {
|
setRules(rules: any) {
|
||||||
const { path, method } = this.FILTERING_SET_RULES;
|
const { path, method } = this.FILTERING_SET_RULES;
|
||||||
const parameters = {
|
const parameters = {
|
||||||
data: rules,
|
data: rules,
|
||||||
@@ -139,7 +141,7 @@ class Api {
|
|||||||
return this.makeRequest(path, method, parameters);
|
return this.makeRequest(path, method, parameters);
|
||||||
}
|
}
|
||||||
|
|
||||||
setFiltersConfig(config) {
|
setFiltersConfig(config: any) {
|
||||||
const { path, method } = this.FILTERING_CONFIG;
|
const { path, method } = this.FILTERING_CONFIG;
|
||||||
const parameters = {
|
const parameters = {
|
||||||
data: config,
|
data: config,
|
||||||
@@ -147,7 +149,7 @@ class Api {
|
|||||||
return this.makeRequest(path, method, parameters);
|
return this.makeRequest(path, method, parameters);
|
||||||
}
|
}
|
||||||
|
|
||||||
setFilterUrl(config) {
|
setFilterUrl(config: any) {
|
||||||
const { path, method } = this.FILTERING_SET_URL;
|
const { path, method } = this.FILTERING_SET_URL;
|
||||||
const parameters = {
|
const parameters = {
|
||||||
data: config,
|
data: config,
|
||||||
@@ -155,9 +157,10 @@ class Api {
|
|||||||
return this.makeRequest(path, method, parameters);
|
return this.makeRequest(path, method, parameters);
|
||||||
}
|
}
|
||||||
|
|
||||||
checkHost(params) {
|
checkHost(params: any) {
|
||||||
const { path, method } = this.FILTERING_CHECK_HOST;
|
const { path, method } = this.FILTERING_CHECK_HOST;
|
||||||
const url = getPathWithQueryString(path, params);
|
const url = getPathWithQueryString(path, params);
|
||||||
|
|
||||||
return this.makeRequest(url, method);
|
return this.makeRequest(url, method);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -170,16 +173,19 @@ class Api {
|
|||||||
|
|
||||||
getParentalStatus() {
|
getParentalStatus() {
|
||||||
const { path, method } = this.PARENTAL_STATUS;
|
const { path, method } = this.PARENTAL_STATUS;
|
||||||
|
|
||||||
return this.makeRequest(path, method);
|
return this.makeRequest(path, method);
|
||||||
}
|
}
|
||||||
|
|
||||||
enableParentalControl() {
|
enableParentalControl() {
|
||||||
const { path, method } = this.PARENTAL_ENABLE;
|
const { path, method } = this.PARENTAL_ENABLE;
|
||||||
|
|
||||||
return this.makeRequest(path, method);
|
return this.makeRequest(path, method);
|
||||||
}
|
}
|
||||||
|
|
||||||
disableParentalControl() {
|
disableParentalControl() {
|
||||||
const { path, method } = this.PARENTAL_DISABLE;
|
const { path, method } = this.PARENTAL_DISABLE;
|
||||||
|
|
||||||
return this.makeRequest(path, method);
|
return this.makeRequest(path, method);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -192,16 +198,19 @@ class Api {
|
|||||||
|
|
||||||
getSafebrowsingStatus() {
|
getSafebrowsingStatus() {
|
||||||
const { path, method } = this.SAFEBROWSING_STATUS;
|
const { path, method } = this.SAFEBROWSING_STATUS;
|
||||||
|
|
||||||
return this.makeRequest(path, method);
|
return this.makeRequest(path, method);
|
||||||
}
|
}
|
||||||
|
|
||||||
enableSafebrowsing() {
|
enableSafebrowsing() {
|
||||||
const { path, method } = this.SAFEBROWSING_ENABLE;
|
const { path, method } = this.SAFEBROWSING_ENABLE;
|
||||||
|
|
||||||
return this.makeRequest(path, method);
|
return this.makeRequest(path, method);
|
||||||
}
|
}
|
||||||
|
|
||||||
disableSafebrowsing() {
|
disableSafebrowsing() {
|
||||||
const { path, method } = this.SAFEBROWSING_DISABLE;
|
const { path, method } = this.SAFEBROWSING_DISABLE;
|
||||||
|
|
||||||
return this.makeRequest(path, method);
|
return this.makeRequest(path, method);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -212,6 +221,7 @@ class Api {
|
|||||||
|
|
||||||
getSafesearchStatus() {
|
getSafesearchStatus() {
|
||||||
const { path, method } = this.SAFESEARCH_STATUS;
|
const { path, method } = this.SAFESEARCH_STATUS;
|
||||||
|
|
||||||
return this.makeRequest(path, method);
|
return this.makeRequest(path, method);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -228,7 +238,7 @@ class Api {
|
|||||||
* @param {*} data - SafeSearchConfig
|
* @param {*} data - SafeSearchConfig
|
||||||
* @returns 200 ok
|
* @returns 200 ok
|
||||||
*/
|
*/
|
||||||
updateSafesearch(data) {
|
updateSafesearch(data: any) {
|
||||||
const { path, method } = this.SAFESEARCH_UPDATE;
|
const { path, method } = this.SAFESEARCH_UPDATE;
|
||||||
return this.makeRequest(path, method, { data });
|
return this.makeRequest(path, method, { data });
|
||||||
}
|
}
|
||||||
@@ -245,7 +255,7 @@ class Api {
|
|||||||
|
|
||||||
// Language
|
// Language
|
||||||
|
|
||||||
async changeLanguage(config) {
|
async changeLanguage(config: any) {
|
||||||
const profile = await this.getProfile();
|
const profile = await this.getProfile();
|
||||||
profile.language = config.language;
|
profile.language = config.language;
|
||||||
|
|
||||||
@@ -254,7 +264,7 @@ class Api {
|
|||||||
|
|
||||||
// Theme
|
// Theme
|
||||||
|
|
||||||
async changeTheme(config) {
|
async changeTheme(config: any) {
|
||||||
const profile = await this.getProfile();
|
const profile = await this.getProfile();
|
||||||
profile.theme = config.theme;
|
profile.theme = config.theme;
|
||||||
|
|
||||||
@@ -282,15 +292,17 @@ class Api {
|
|||||||
|
|
||||||
getDhcpStatus() {
|
getDhcpStatus() {
|
||||||
const { path, method } = this.DHCP_STATUS;
|
const { path, method } = this.DHCP_STATUS;
|
||||||
|
|
||||||
return this.makeRequest(path, method);
|
return this.makeRequest(path, method);
|
||||||
}
|
}
|
||||||
|
|
||||||
getDhcpInterfaces() {
|
getDhcpInterfaces() {
|
||||||
const { path, method } = this.DHCP_INTERFACES;
|
const { path, method } = this.DHCP_INTERFACES;
|
||||||
|
|
||||||
return this.makeRequest(path, method);
|
return this.makeRequest(path, method);
|
||||||
}
|
}
|
||||||
|
|
||||||
setDhcpConfig(config) {
|
setDhcpConfig(config: any) {
|
||||||
const { path, method } = this.DHCP_SET_CONFIG;
|
const { path, method } = this.DHCP_SET_CONFIG;
|
||||||
const parameters = {
|
const parameters = {
|
||||||
data: config,
|
data: config,
|
||||||
@@ -298,7 +310,7 @@ class Api {
|
|||||||
return this.makeRequest(path, method, parameters);
|
return this.makeRequest(path, method, parameters);
|
||||||
}
|
}
|
||||||
|
|
||||||
findActiveDhcp(req) {
|
findActiveDhcp(req: any) {
|
||||||
const { path, method } = this.DHCP_FIND_ACTIVE;
|
const { path, method } = this.DHCP_FIND_ACTIVE;
|
||||||
const parameters = {
|
const parameters = {
|
||||||
data: req,
|
data: req,
|
||||||
@@ -306,7 +318,7 @@ class Api {
|
|||||||
return this.makeRequest(path, method, parameters);
|
return this.makeRequest(path, method, parameters);
|
||||||
}
|
}
|
||||||
|
|
||||||
addStaticLease(config) {
|
addStaticLease(config: any) {
|
||||||
const { path, method } = this.DHCP_ADD_STATIC_LEASE;
|
const { path, method } = this.DHCP_ADD_STATIC_LEASE;
|
||||||
const parameters = {
|
const parameters = {
|
||||||
data: config,
|
data: config,
|
||||||
@@ -314,7 +326,7 @@ class Api {
|
|||||||
return this.makeRequest(path, method, parameters);
|
return this.makeRequest(path, method, parameters);
|
||||||
}
|
}
|
||||||
|
|
||||||
removeStaticLease(config) {
|
removeStaticLease(config: any) {
|
||||||
const { path, method } = this.DHCP_REMOVE_STATIC_LEASE;
|
const { path, method } = this.DHCP_REMOVE_STATIC_LEASE;
|
||||||
const parameters = {
|
const parameters = {
|
||||||
data: config,
|
data: config,
|
||||||
@@ -322,7 +334,7 @@ class Api {
|
|||||||
return this.makeRequest(path, method, parameters);
|
return this.makeRequest(path, method, parameters);
|
||||||
}
|
}
|
||||||
|
|
||||||
updateStaticLease(config) {
|
updateStaticLease(config: any) {
|
||||||
const { path, method } = this.DHCP_UPDATE_STATIC_LEASE;
|
const { path, method } = this.DHCP_UPDATE_STATIC_LEASE;
|
||||||
const parameters = {
|
const parameters = {
|
||||||
data: config,
|
data: config,
|
||||||
@@ -332,11 +344,13 @@ class Api {
|
|||||||
|
|
||||||
resetDhcp() {
|
resetDhcp() {
|
||||||
const { path, method } = this.DHCP_RESET;
|
const { path, method } = this.DHCP_RESET;
|
||||||
|
|
||||||
return this.makeRequest(path, method);
|
return this.makeRequest(path, method);
|
||||||
}
|
}
|
||||||
|
|
||||||
resetDhcpLeases() {
|
resetDhcpLeases() {
|
||||||
const { path, method } = this.DHCP_LEASES_RESET;
|
const { path, method } = this.DHCP_LEASES_RESET;
|
||||||
|
|
||||||
return this.makeRequest(path, method);
|
return this.makeRequest(path, method);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -349,10 +363,11 @@ class Api {
|
|||||||
|
|
||||||
getDefaultAddresses() {
|
getDefaultAddresses() {
|
||||||
const { path, method } = this.INSTALL_GET_ADDRESSES;
|
const { path, method } = this.INSTALL_GET_ADDRESSES;
|
||||||
|
|
||||||
return this.makeRequest(path, method);
|
return this.makeRequest(path, method);
|
||||||
}
|
}
|
||||||
|
|
||||||
setAllSettings(config) {
|
setAllSettings(config: any) {
|
||||||
const { path, method } = this.INSTALL_CONFIGURE;
|
const { path, method } = this.INSTALL_CONFIGURE;
|
||||||
const parameters = {
|
const parameters = {
|
||||||
data: config,
|
data: config,
|
||||||
@@ -360,7 +375,7 @@ class Api {
|
|||||||
return this.makeRequest(path, method, parameters);
|
return this.makeRequest(path, method, parameters);
|
||||||
}
|
}
|
||||||
|
|
||||||
checkConfig(config) {
|
checkConfig(config: any) {
|
||||||
const { path, method } = this.INSTALL_CHECK_CONFIG;
|
const { path, method } = this.INSTALL_CHECK_CONFIG;
|
||||||
const parameters = {
|
const parameters = {
|
||||||
data: config,
|
data: config,
|
||||||
@@ -377,10 +392,11 @@ class Api {
|
|||||||
|
|
||||||
getTlsStatus() {
|
getTlsStatus() {
|
||||||
const { path, method } = this.TLS_STATUS;
|
const { path, method } = this.TLS_STATUS;
|
||||||
|
|
||||||
return this.makeRequest(path, method);
|
return this.makeRequest(path, method);
|
||||||
}
|
}
|
||||||
|
|
||||||
setTlsConfig(config) {
|
setTlsConfig(config: any) {
|
||||||
const { path, method } = this.TLS_CONFIG;
|
const { path, method } = this.TLS_CONFIG;
|
||||||
const parameters = {
|
const parameters = {
|
||||||
data: config,
|
data: config,
|
||||||
@@ -388,7 +404,7 @@ class Api {
|
|||||||
return this.makeRequest(path, method, parameters);
|
return this.makeRequest(path, method, parameters);
|
||||||
}
|
}
|
||||||
|
|
||||||
validateTlsConfig(config) {
|
validateTlsConfig(config: any) {
|
||||||
const { path, method } = this.TLS_VALIDATE;
|
const { path, method } = this.TLS_VALIDATE;
|
||||||
const parameters = {
|
const parameters = {
|
||||||
data: config,
|
data: config,
|
||||||
@@ -399,7 +415,7 @@ class Api {
|
|||||||
// Per-client settings
|
// Per-client settings
|
||||||
GET_CLIENTS = { path: 'clients', method: 'GET' };
|
GET_CLIENTS = { path: 'clients', method: 'GET' };
|
||||||
|
|
||||||
FIND_CLIENTS = { path: 'clients/find', method: 'GET' };
|
SEARCH_CLIENTS = { path: 'clients/search', method: 'POST' };
|
||||||
|
|
||||||
ADD_CLIENT = { path: 'clients/add', method: 'POST' };
|
ADD_CLIENT = { path: 'clients/add', method: 'POST' };
|
||||||
|
|
||||||
@@ -409,10 +425,11 @@ class Api {
|
|||||||
|
|
||||||
getClients() {
|
getClients() {
|
||||||
const { path, method } = this.GET_CLIENTS;
|
const { path, method } = this.GET_CLIENTS;
|
||||||
|
|
||||||
return this.makeRequest(path, method);
|
return this.makeRequest(path, method);
|
||||||
}
|
}
|
||||||
|
|
||||||
addClient(config) {
|
addClient(config: any) {
|
||||||
const { path, method } = this.ADD_CLIENT;
|
const { path, method } = this.ADD_CLIENT;
|
||||||
const parameters = {
|
const parameters = {
|
||||||
data: config,
|
data: config,
|
||||||
@@ -420,7 +437,7 @@ class Api {
|
|||||||
return this.makeRequest(path, method, parameters);
|
return this.makeRequest(path, method, parameters);
|
||||||
}
|
}
|
||||||
|
|
||||||
deleteClient(config) {
|
deleteClient(config: any) {
|
||||||
const { path, method } = this.DELETE_CLIENT;
|
const { path, method } = this.DELETE_CLIENT;
|
||||||
const parameters = {
|
const parameters = {
|
||||||
data: config,
|
data: config,
|
||||||
@@ -428,7 +445,7 @@ class Api {
|
|||||||
return this.makeRequest(path, method, parameters);
|
return this.makeRequest(path, method, parameters);
|
||||||
}
|
}
|
||||||
|
|
||||||
updateClient(config) {
|
updateClient(config: any) {
|
||||||
const { path, method } = this.UPDATE_CLIENT;
|
const { path, method } = this.UPDATE_CLIENT;
|
||||||
const parameters = {
|
const parameters = {
|
||||||
data: config,
|
data: config,
|
||||||
@@ -436,10 +453,12 @@ class Api {
|
|||||||
return this.makeRequest(path, method, parameters);
|
return this.makeRequest(path, method, parameters);
|
||||||
}
|
}
|
||||||
|
|
||||||
findClients(params) {
|
searchClients(config: any) {
|
||||||
const { path, method } = this.FIND_CLIENTS;
|
const { path, method } = this.SEARCH_CLIENTS;
|
||||||
const url = getPathWithQueryString(path, params);
|
const parameters = {
|
||||||
return this.makeRequest(url, method);
|
data: config,
|
||||||
|
};
|
||||||
|
return this.makeRequest(path, method, parameters);
|
||||||
}
|
}
|
||||||
|
|
||||||
// DNS access settings
|
// DNS access settings
|
||||||
@@ -449,10 +468,11 @@ class Api {
|
|||||||
|
|
||||||
getAccessList() {
|
getAccessList() {
|
||||||
const { path, method } = this.ACCESS_LIST;
|
const { path, method } = this.ACCESS_LIST;
|
||||||
|
|
||||||
return this.makeRequest(path, method);
|
return this.makeRequest(path, method);
|
||||||
}
|
}
|
||||||
|
|
||||||
setAccessList(config) {
|
setAccessList(config: any) {
|
||||||
const { path, method } = this.ACCESS_SET;
|
const { path, method } = this.ACCESS_SET;
|
||||||
const parameters = {
|
const parameters = {
|
||||||
data: config,
|
data: config,
|
||||||
@@ -471,10 +491,11 @@ class Api {
|
|||||||
|
|
||||||
getRewritesList() {
|
getRewritesList() {
|
||||||
const { path, method } = this.REWRITES_LIST;
|
const { path, method } = this.REWRITES_LIST;
|
||||||
|
|
||||||
return this.makeRequest(path, method);
|
return this.makeRequest(path, method);
|
||||||
}
|
}
|
||||||
|
|
||||||
addRewrite(config) {
|
addRewrite(config: any) {
|
||||||
const { path, method } = this.REWRITE_ADD;
|
const { path, method } = this.REWRITE_ADD;
|
||||||
const parameters = {
|
const parameters = {
|
||||||
data: config,
|
data: config,
|
||||||
@@ -482,7 +503,7 @@ class Api {
|
|||||||
return this.makeRequest(path, method, parameters);
|
return this.makeRequest(path, method, parameters);
|
||||||
}
|
}
|
||||||
|
|
||||||
updateRewrite(config) {
|
updateRewrite(config: any) {
|
||||||
const { path, method } = this.REWRITE_UPDATE;
|
const { path, method } = this.REWRITE_UPDATE;
|
||||||
const parameters = {
|
const parameters = {
|
||||||
data: config,
|
data: config,
|
||||||
@@ -490,7 +511,7 @@ class Api {
|
|||||||
return this.makeRequest(path, method, parameters);
|
return this.makeRequest(path, method, parameters);
|
||||||
}
|
}
|
||||||
|
|
||||||
deleteRewrite(config) {
|
deleteRewrite(config: any) {
|
||||||
const { path, method } = this.REWRITE_DELETE;
|
const { path, method } = this.REWRITE_DELETE;
|
||||||
const parameters = {
|
const parameters = {
|
||||||
data: config,
|
data: config,
|
||||||
@@ -507,15 +528,17 @@ class Api {
|
|||||||
|
|
||||||
getAllBlockedServices() {
|
getAllBlockedServices() {
|
||||||
const { path, method } = this.BLOCKED_SERVICES_ALL;
|
const { path, method } = this.BLOCKED_SERVICES_ALL;
|
||||||
|
|
||||||
return this.makeRequest(path, method);
|
return this.makeRequest(path, method);
|
||||||
}
|
}
|
||||||
|
|
||||||
getBlockedServices() {
|
getBlockedServices() {
|
||||||
const { path, method } = this.BLOCKED_SERVICES_GET;
|
const { path, method } = this.BLOCKED_SERVICES_GET;
|
||||||
|
|
||||||
return this.makeRequest(path, method);
|
return this.makeRequest(path, method);
|
||||||
}
|
}
|
||||||
|
|
||||||
updateBlockedServices(config) {
|
updateBlockedServices(config: any) {
|
||||||
const { path, method } = this.BLOCKED_SERVICES_UPDATE;
|
const { path, method } = this.BLOCKED_SERVICES_UPDATE;
|
||||||
const parameters = {
|
const parameters = {
|
||||||
data: config,
|
data: config,
|
||||||
@@ -534,15 +557,17 @@ class Api {
|
|||||||
|
|
||||||
getStats() {
|
getStats() {
|
||||||
const { path, method } = this.GET_STATS;
|
const { path, method } = this.GET_STATS;
|
||||||
|
|
||||||
return this.makeRequest(path, method);
|
return this.makeRequest(path, method);
|
||||||
}
|
}
|
||||||
|
|
||||||
getStatsConfig() {
|
getStatsConfig() {
|
||||||
const { path, method } = this.GET_STATS_CONFIG;
|
const { path, method } = this.GET_STATS_CONFIG;
|
||||||
|
|
||||||
return this.makeRequest(path, method);
|
return this.makeRequest(path, method);
|
||||||
}
|
}
|
||||||
|
|
||||||
setStatsConfig(data) {
|
setStatsConfig(data: any) {
|
||||||
const { path, method } = this.UPDATE_STATS_CONFIG;
|
const { path, method } = this.UPDATE_STATS_CONFIG;
|
||||||
const config = {
|
const config = {
|
||||||
data,
|
data,
|
||||||
@@ -552,6 +577,7 @@ class Api {
|
|||||||
|
|
||||||
resetStats() {
|
resetStats() {
|
||||||
const { path, method } = this.STATS_RESET;
|
const { path, method } = this.STATS_RESET;
|
||||||
|
|
||||||
return this.makeRequest(path, method);
|
return this.makeRequest(path, method);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -564,20 +590,22 @@ class Api {
|
|||||||
|
|
||||||
QUERY_LOG_CLEAR = { path: 'querylog_clear', method: 'POST' };
|
QUERY_LOG_CLEAR = { path: 'querylog_clear', method: 'POST' };
|
||||||
|
|
||||||
getQueryLog(params) {
|
getQueryLog(params: any) {
|
||||||
const { path, method } = this.GET_QUERY_LOG;
|
const { path, method } = this.GET_QUERY_LOG;
|
||||||
// eslint-disable-next-line no-param-reassign
|
// eslint-disable-next-line no-param-reassign
|
||||||
params.limit = QUERY_LOGS_PAGE_LIMIT;
|
params.limit = QUERY_LOGS_PAGE_LIMIT;
|
||||||
const url = getPathWithQueryString(path, params);
|
const url = getPathWithQueryString(path, params);
|
||||||
|
|
||||||
return this.makeRequest(url, method);
|
return this.makeRequest(url, method);
|
||||||
}
|
}
|
||||||
|
|
||||||
getQueryLogConfig() {
|
getQueryLogConfig() {
|
||||||
const { path, method } = this.GET_QUERY_LOG_CONFIG;
|
const { path, method } = this.GET_QUERY_LOG_CONFIG;
|
||||||
|
|
||||||
return this.makeRequest(path, method);
|
return this.makeRequest(path, method);
|
||||||
}
|
}
|
||||||
|
|
||||||
setQueryLogConfig(data) {
|
setQueryLogConfig(data: any) {
|
||||||
const { path, method } = this.UPDATE_QUERY_LOG_CONFIG;
|
const { path, method } = this.UPDATE_QUERY_LOG_CONFIG;
|
||||||
const config = {
|
const config = {
|
||||||
data,
|
data,
|
||||||
@@ -587,13 +615,14 @@ class Api {
|
|||||||
|
|
||||||
clearQueryLog() {
|
clearQueryLog() {
|
||||||
const { path, method } = this.QUERY_LOG_CLEAR;
|
const { path, method } = this.QUERY_LOG_CLEAR;
|
||||||
|
|
||||||
return this.makeRequest(path, method);
|
return this.makeRequest(path, method);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Login
|
// Login
|
||||||
LOGIN = { path: 'login', method: 'POST' };
|
LOGIN = { path: 'login', method: 'POST' };
|
||||||
|
|
||||||
login(data) {
|
login(data: any) {
|
||||||
const { path, method } = this.LOGIN;
|
const { path, method } = this.LOGIN;
|
||||||
const config = {
|
const config = {
|
||||||
data,
|
data,
|
||||||
@@ -608,10 +637,11 @@ class Api {
|
|||||||
|
|
||||||
getProfile() {
|
getProfile() {
|
||||||
const { path, method } = this.GET_PROFILE;
|
const { path, method } = this.GET_PROFILE;
|
||||||
|
|
||||||
return this.makeRequest(path, method);
|
return this.makeRequest(path, method);
|
||||||
}
|
}
|
||||||
|
|
||||||
setProfile(data) {
|
setProfile(data: any) {
|
||||||
const theme = data.theme ? data.theme : THEMES.auto;
|
const theme = data.theme ? data.theme : THEMES.auto;
|
||||||
const defaultLanguage = i18n.language ? i18n.language : LANGUAGES.en;
|
const defaultLanguage = i18n.language ? i18n.language : LANGUAGES.en;
|
||||||
const language = data.language ? data.language : defaultLanguage;
|
const language = data.language ? data.language : defaultLanguage;
|
||||||
@@ -629,10 +659,11 @@ class Api {
|
|||||||
|
|
||||||
getDnsConfig() {
|
getDnsConfig() {
|
||||||
const { path, method } = this.GET_DNS_CONFIG;
|
const { path, method } = this.GET_DNS_CONFIG;
|
||||||
|
|
||||||
return this.makeRequest(path, method);
|
return this.makeRequest(path, method);
|
||||||
}
|
}
|
||||||
|
|
||||||
setDnsConfig(data) {
|
setDnsConfig(data: any) {
|
||||||
const { path, method } = this.SET_DNS_CONFIG;
|
const { path, method } = this.SET_DNS_CONFIG;
|
||||||
const config = {
|
const config = {
|
||||||
data,
|
data,
|
||||||
@@ -642,7 +673,7 @@ class Api {
|
|||||||
|
|
||||||
SET_PROTECTION = { path: 'protection', method: 'POST' };
|
SET_PROTECTION = { path: 'protection', method: 'POST' };
|
||||||
|
|
||||||
setProtection(data) {
|
setProtection(data: any) {
|
||||||
const { enabled, duration } = data;
|
const { enabled, duration } = data;
|
||||||
const { path, method } = this.SET_PROTECTION;
|
const { path, method } = this.SET_PROTECTION;
|
||||||
|
|
||||||
@@ -654,6 +685,7 @@ class Api {
|
|||||||
|
|
||||||
clearCache() {
|
clearCache() {
|
||||||
const { path, method } = this.CLEAR_CACHE;
|
const { path, method } = this.CLEAR_CACHE;
|
||||||
|
|
||||||
return this.makeRequest(path, method);
|
return this.makeRequest(path, method);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -15,8 +15,8 @@
|
|||||||
--btn-success-bgcolor: #5eba00;
|
--btn-success-bgcolor: #5eba00;
|
||||||
--form-disabled-bgcolor: #f8f9fa;
|
--form-disabled-bgcolor: #f8f9fa;
|
||||||
--form-disabled-color: #495057;
|
--form-disabled-color: #495057;
|
||||||
--rt-nodata-bgcolor: rgba(255,255,255,0.8);
|
--rt-nodata-bgcolor: rgba(255, 255, 255, 0.8);
|
||||||
--rt-nodata-color: rgba(0,0,0,0.5);
|
--rt-nodata-color: rgba(0, 0, 0, 0.5);
|
||||||
--modal-overlay-bgcolor: rgba(255, 255, 255, 0.75);
|
--modal-overlay-bgcolor: rgba(255, 255, 255, 0.75);
|
||||||
--logs__table-bgcolor: #fff;
|
--logs__table-bgcolor: #fff;
|
||||||
--logs__row--blue-bgcolor: #e5effd;
|
--logs__row--blue-bgcolor: #e5effd;
|
||||||
@@ -28,7 +28,7 @@
|
|||||||
--gray-d8: #d8d8d8;
|
--gray-d8: #d8d8d8;
|
||||||
--gray-f3: #f3f3f3;
|
--gray-f3: #f3f3f3;
|
||||||
--loading-bg: rgba(255, 255, 255, 0.48);
|
--loading-bg: rgba(255, 255, 255, 0.48);
|
||||||
--font-family-monospace: Monaco, Menlo, "Ubuntu Mono", Consolas, source-code-pro, monospace;
|
--font-family-monospace: Monaco, Menlo, 'Ubuntu Mono', Consolas, source-code-pro, monospace;
|
||||||
--font-size-disable-autozoom: 1rem;
|
--font-size-disable-autozoom: 1rem;
|
||||||
--alert-message-color: #24426c;
|
--alert-message-color: #24426c;
|
||||||
--alert-message-border: #cbdbf2;
|
--alert-message-border: #cbdbf2;
|
||||||
@@ -37,7 +37,7 @@
|
|||||||
--radio-bg: #ffffff;
|
--radio-bg: #ffffff;
|
||||||
}
|
}
|
||||||
|
|
||||||
[data-theme="dark"] {
|
[data-theme='dark'] {
|
||||||
--black: #ffffff;
|
--black: #ffffff;
|
||||||
--bgcolor: #131313;
|
--bgcolor: #131313;
|
||||||
--mcolor: #e6e6e6;
|
--mcolor: #e6e6e6;
|
||||||
@@ -74,12 +74,14 @@
|
|||||||
body {
|
body {
|
||||||
margin: 0;
|
margin: 0;
|
||||||
padding: 0;
|
padding: 0;
|
||||||
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Helvetica Neue", Arial, sans-serif;
|
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Helvetica Neue', Arial, sans-serif;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Disable Auto Zoom in Input - Safari on iPhone https://stackoverflow.com/a/6394497 */
|
/* Disable Auto Zoom in Input - Safari on iPhone https://stackoverflow.com/a/6394497 */
|
||||||
@media screen and (max-width: 767px) {
|
@media screen and (max-width: 767px) {
|
||||||
input, select, textarea {
|
input,
|
||||||
|
select,
|
||||||
|
textarea {
|
||||||
font-size: var(--font-size-disable-autozoom);
|
font-size: var(--font-size-disable-autozoom);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
import React, { useEffect } from 'react';
|
import React, { useEffect } from 'react';
|
||||||
|
|
||||||
import { HashRouter, Route } from 'react-router-dom';
|
import { HashRouter, Route } from 'react-router-dom';
|
||||||
import LoadingBar from 'react-redux-loading-bar';
|
import LoadingBar from 'react-redux-loading-bar';
|
||||||
import { hot } from 'react-hot-loader/root';
|
import { hot } from 'react-hot-loader/root';
|
||||||
@@ -9,8 +10,6 @@ import '../ui/ReactTable.css';
|
|||||||
import './index.css';
|
import './index.css';
|
||||||
|
|
||||||
import { shallowEqual, useDispatch, useSelector } from 'react-redux';
|
import { shallowEqual, useDispatch, useSelector } from 'react-redux';
|
||||||
|
|
||||||
import propTypes from 'prop-types';
|
|
||||||
import Toasts from '../Toasts';
|
import Toasts from '../Toasts';
|
||||||
import Footer from '../ui/Footer';
|
import Footer from '../ui/Footer';
|
||||||
import Status from '../ui/Status';
|
import Status from '../ui/Status';
|
||||||
@@ -19,15 +18,14 @@ import UpdateOverlay from '../ui/UpdateOverlay';
|
|||||||
import EncryptionTopline from '../ui/EncryptionTopline';
|
import EncryptionTopline from '../ui/EncryptionTopline';
|
||||||
import Icons from '../ui/Icons';
|
import Icons from '../ui/Icons';
|
||||||
import i18n from '../../i18n';
|
import i18n from '../../i18n';
|
||||||
|
|
||||||
import Loading from '../ui/Loading';
|
import Loading from '../ui/Loading';
|
||||||
import {
|
import { FILTERS_URLS, MENU_URLS, SETTINGS_URLS, THEMES } from '../../helpers/constants';
|
||||||
FILTERS_URLS,
|
|
||||||
MENU_URLS,
|
|
||||||
SETTINGS_URLS,
|
|
||||||
THEMES,
|
|
||||||
} from '../../helpers/constants';
|
|
||||||
import { getLogsUrlParams, setHtmlLangAttr, setUITheme } from '../../helpers/helpers';
|
import { getLogsUrlParams, setHtmlLangAttr, setUITheme } from '../../helpers/helpers';
|
||||||
|
|
||||||
import Header from '../Header';
|
import Header from '../Header';
|
||||||
|
|
||||||
import { changeLanguage, getDnsStatus, getTimerStatus } from '../../actions';
|
import { changeLanguage, getDnsStatus, getTimerStatus } from '../../actions';
|
||||||
|
|
||||||
import Dashboard from '../../containers/Dashboard';
|
import Dashboard from '../../containers/Dashboard';
|
||||||
@@ -35,15 +33,19 @@ import SetupGuide from '../../containers/SetupGuide';
|
|||||||
import Settings from '../../containers/Settings';
|
import Settings from '../../containers/Settings';
|
||||||
import Dns from '../../containers/Dns';
|
import Dns from '../../containers/Dns';
|
||||||
import Encryption from '../../containers/Encryption';
|
import Encryption from '../../containers/Encryption';
|
||||||
|
|
||||||
import Dhcp from '../Settings/Dhcp';
|
import Dhcp from '../Settings/Dhcp';
|
||||||
import Clients from '../../containers/Clients';
|
import Clients from '../../containers/Clients';
|
||||||
import DnsBlocklist from '../../containers/DnsBlocklist';
|
import DnsBlocklist from '../../containers/DnsBlocklist';
|
||||||
import DnsAllowlist from '../../containers/DnsAllowlist';
|
import DnsAllowlist from '../../containers/DnsAllowlist';
|
||||||
import DnsRewrites from '../../containers/DnsRewrites';
|
import DnsRewrites from '../../containers/DnsRewrites';
|
||||||
import CustomRules from '../../containers/CustomRules';
|
import CustomRules from '../../containers/CustomRules';
|
||||||
|
|
||||||
import Services from '../Filters/Services';
|
import Services from '../Filters/Services';
|
||||||
|
|
||||||
import Logs from '../Logs';
|
import Logs from '../Logs';
|
||||||
import ProtectionTimer from '../ProtectionTimer';
|
import ProtectionTimer from '../ProtectionTimer';
|
||||||
|
import { RootState } from '../../initialState';
|
||||||
|
|
||||||
const ROUTES = [
|
const ROUTES = [
|
||||||
{
|
{
|
||||||
@@ -101,26 +103,17 @@ const ROUTES = [
|
|||||||
},
|
},
|
||||||
];
|
];
|
||||||
|
|
||||||
const renderRoute = ({ path, component, exact }, idx) => <Route
|
|
||||||
key={idx}
|
|
||||||
exact={exact}
|
|
||||||
path={path}
|
|
||||||
component={component}
|
|
||||||
/>;
|
|
||||||
|
|
||||||
const App = () => {
|
const App = () => {
|
||||||
const dispatch = useDispatch();
|
const dispatch = useDispatch();
|
||||||
const {
|
const { language, isCoreRunning, isUpdateAvailable, processing, theme } = useSelector<
|
||||||
language,
|
RootState,
|
||||||
isCoreRunning,
|
RootState['dashboard']
|
||||||
isUpdateAvailable,
|
>((state) => state.dashboard, shallowEqual);
|
||||||
processing,
|
|
||||||
theme,
|
|
||||||
} = useSelector((state) => state.dashboard, shallowEqual);
|
|
||||||
|
|
||||||
const { processing: processingEncryption } = useSelector((
|
const { processing: processingEncryption } = useSelector<RootState, RootState['encryption']>(
|
||||||
state,
|
(state) => state.encryption,
|
||||||
) => state.encryption, shallowEqual);
|
shallowEqual,
|
||||||
|
);
|
||||||
|
|
||||||
const updateAvailable = isCoreRunning && isUpdateAvailable;
|
const updateAvailable = isCoreRunning && isUpdateAvailable;
|
||||||
|
|
||||||
@@ -157,7 +150,7 @@ const App = () => {
|
|||||||
setLanguage();
|
setLanguage();
|
||||||
}, [language]);
|
}, [language]);
|
||||||
|
|
||||||
const handleAutoTheme = (e, accountTheme) => {
|
const handleAutoTheme = (e: any, accountTheme: any) => {
|
||||||
if (accountTheme !== THEMES.auto) {
|
if (accountTheme !== THEMES.auto) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -195,35 +188,50 @@ const App = () => {
|
|||||||
window.location.reload();
|
window.location.reload();
|
||||||
};
|
};
|
||||||
|
|
||||||
return <HashRouter hashType="noslash">
|
return (
|
||||||
{updateAvailable && <>
|
<HashRouter hashType="noslash">
|
||||||
<UpdateTopline />
|
{updateAvailable && (
|
||||||
<UpdateOverlay />
|
<>
|
||||||
</>}
|
<UpdateTopline />
|
||||||
{!processingEncryption && <EncryptionTopline />}
|
|
||||||
<LoadingBar className="loading-bar" updateTime={1000} />
|
|
||||||
<Header />
|
|
||||||
<ProtectionTimer />
|
|
||||||
<div className="container container--wrap pb-5 pt-5">
|
|
||||||
{processing && <Loading />}
|
|
||||||
{!isCoreRunning && <div className="row row-cards">
|
|
||||||
<div className="col-lg-12">
|
|
||||||
<Status reloadPage={reloadPage} message="dns_start" />
|
|
||||||
<Loading />
|
|
||||||
</div>
|
|
||||||
</div>}
|
|
||||||
{!processing && isCoreRunning && ROUTES.map(renderRoute)}
|
|
||||||
</div>
|
|
||||||
<Footer />
|
|
||||||
<Toasts />
|
|
||||||
<Icons />
|
|
||||||
</HashRouter>;
|
|
||||||
};
|
|
||||||
|
|
||||||
renderRoute.propTypes = {
|
<UpdateOverlay />
|
||||||
path: propTypes.oneOfType([propTypes.string, propTypes.arrayOf(propTypes.string)]).isRequired,
|
</>
|
||||||
component: propTypes.element.isRequired,
|
)}
|
||||||
exact: propTypes.bool,
|
|
||||||
|
{!processingEncryption && <EncryptionTopline />}
|
||||||
|
|
||||||
|
<LoadingBar className="loading-bar" updateTime={1000} />
|
||||||
|
|
||||||
|
<Header />
|
||||||
|
|
||||||
|
<ProtectionTimer />
|
||||||
|
|
||||||
|
<div className="container container--wrap pb-5 pt-5">
|
||||||
|
{processing && <Loading />}
|
||||||
|
|
||||||
|
{!isCoreRunning && (
|
||||||
|
<div className="row row-cards">
|
||||||
|
<div className="col-lg-12">
|
||||||
|
<Status reloadPage={reloadPage} message="dns_start" />
|
||||||
|
|
||||||
|
<Loading />
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
)}
|
||||||
|
{!processing &&
|
||||||
|
isCoreRunning &&
|
||||||
|
ROUTES.map((route, index) => (
|
||||||
|
<Route key={index} exact={route.exact} path={route.path} component={route.component} />
|
||||||
|
))}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<Footer />
|
||||||
|
|
||||||
|
<Toasts />
|
||||||
|
|
||||||
|
<Icons />
|
||||||
|
</HashRouter>
|
||||||
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
export default hot(App);
|
export default hot(App);
|
||||||
@@ -1,25 +1,37 @@
|
|||||||
import React from 'react';
|
import React from 'react';
|
||||||
|
|
||||||
|
// @ts-expect-error FIXME: update react-table
|
||||||
import ReactTable from 'react-table';
|
import ReactTable from 'react-table';
|
||||||
import PropTypes from 'prop-types';
|
|
||||||
import { withTranslation, Trans } from 'react-i18next';
|
import { withTranslation, Trans } from 'react-i18next';
|
||||||
|
|
||||||
|
import { TFunction } from 'i18next';
|
||||||
import Card from '../ui/Card';
|
import Card from '../ui/Card';
|
||||||
|
|
||||||
import Cell from '../ui/Cell';
|
import Cell from '../ui/Cell';
|
||||||
|
|
||||||
import DomainCell from './DomainCell';
|
import DomainCell from './DomainCell';
|
||||||
|
|
||||||
import { getPercent } from '../../helpers/helpers';
|
import { getPercent } from '../../helpers/helpers';
|
||||||
import { DASHBOARD_TABLES_DEFAULT_PAGE_SIZE, STATUS_COLORS, TABLES_MIN_ROWS } from '../../helpers/constants';
|
import { DASHBOARD_TABLES_DEFAULT_PAGE_SIZE, STATUS_COLORS, TABLES_MIN_ROWS } from '../../helpers/constants';
|
||||||
|
|
||||||
const CountCell = (totalBlocked) => function cell(row) {
|
const CountCell = (totalBlocked: any) =>
|
||||||
const { value } = row;
|
function cell(row: any) {
|
||||||
const percent = getPercent(totalBlocked, value);
|
const { value } = row;
|
||||||
|
const percent = getPercent(totalBlocked, value);
|
||||||
|
|
||||||
return <Cell value={value}
|
return <Cell value={value} percent={percent} color={STATUS_COLORS.red} search={row.original.domain} />;
|
||||||
percent={percent}
|
};
|
||||||
color={STATUS_COLORS.red}
|
|
||||||
search={row.original.domain}
|
interface BlockedDomainsProps {
|
||||||
/>;
|
topBlockedDomains: unknown[];
|
||||||
};
|
blockedFiltering: number;
|
||||||
|
replacedSafebrowsing: number;
|
||||||
|
replacedSafesearch: number;
|
||||||
|
replacedParental: number;
|
||||||
|
refreshButton: React.ReactNode;
|
||||||
|
subtitle: string;
|
||||||
|
t: TFunction;
|
||||||
|
}
|
||||||
|
|
||||||
const BlockedDomains = ({
|
const BlockedDomains = ({
|
||||||
t,
|
t,
|
||||||
@@ -30,20 +42,13 @@ const BlockedDomains = ({
|
|||||||
replacedSafebrowsing,
|
replacedSafebrowsing,
|
||||||
replacedParental,
|
replacedParental,
|
||||||
replacedSafesearch,
|
replacedSafesearch,
|
||||||
}) => {
|
}: BlockedDomainsProps) => {
|
||||||
const totalBlocked = (
|
const totalBlocked = blockedFiltering + replacedSafebrowsing + replacedParental + replacedSafesearch;
|
||||||
blockedFiltering + replacedSafebrowsing + replacedParental + replacedSafesearch
|
|
||||||
);
|
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Card
|
<Card title={t('top_blocked_domains')} subtitle={subtitle} bodyType="card-table" refresh={refreshButton}>
|
||||||
title={t('top_blocked_domains')}
|
|
||||||
subtitle={subtitle}
|
|
||||||
bodyType="card-table"
|
|
||||||
refresh={refreshButton}
|
|
||||||
>
|
|
||||||
<ReactTable
|
<ReactTable
|
||||||
data={topBlockedDomains.map(({ name: domain, count }) => ({
|
data={topBlockedDomains.map(({ name: domain, count }: any) => ({
|
||||||
domain,
|
domain,
|
||||||
count,
|
count,
|
||||||
}))}
|
}))}
|
||||||
@@ -70,15 +75,4 @@ const BlockedDomains = ({
|
|||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
BlockedDomains.propTypes = {
|
|
||||||
topBlockedDomains: PropTypes.array.isRequired,
|
|
||||||
blockedFiltering: PropTypes.number.isRequired,
|
|
||||||
replacedSafebrowsing: PropTypes.number.isRequired,
|
|
||||||
replacedSafesearch: PropTypes.number.isRequired,
|
|
||||||
replacedParental: PropTypes.number.isRequired,
|
|
||||||
refreshButton: PropTypes.node.isRequired,
|
|
||||||
subtitle: PropTypes.string.isRequired,
|
|
||||||
t: PropTypes.func.isRequired,
|
|
||||||
};
|
|
||||||
|
|
||||||
export default withTranslation()(BlockedDomains);
|
export default withTranslation()(BlockedDomains);
|
||||||
@@ -1,10 +1,12 @@
|
|||||||
import React, { useState } from 'react';
|
import React, { useState } from 'react';
|
||||||
|
|
||||||
|
// @ts-expect-error FIXME: update react-table
|
||||||
import ReactTable from 'react-table';
|
import ReactTable from 'react-table';
|
||||||
import PropTypes from 'prop-types';
|
|
||||||
import { Trans, useTranslation } from 'react-i18next';
|
import { Trans, useTranslation } from 'react-i18next';
|
||||||
|
|
||||||
import { shallowEqual, useDispatch, useSelector } from 'react-redux';
|
import { shallowEqual, useDispatch, useSelector } from 'react-redux';
|
||||||
import classNames from 'classnames';
|
import classNames from 'classnames';
|
||||||
|
|
||||||
import Card from '../ui/Card';
|
import Card from '../ui/Card';
|
||||||
import Cell from '../ui/Cell';
|
import Cell from '../ui/Cell';
|
||||||
|
|
||||||
@@ -16,11 +18,14 @@ import {
|
|||||||
TABLES_MIN_ROWS,
|
TABLES_MIN_ROWS,
|
||||||
} from '../../helpers/constants';
|
} from '../../helpers/constants';
|
||||||
import { toggleClientBlock } from '../../actions/access';
|
import { toggleClientBlock } from '../../actions/access';
|
||||||
|
|
||||||
import { renderFormattedClientCell } from '../../helpers/renderFormattedClientCell';
|
import { renderFormattedClientCell } from '../../helpers/renderFormattedClientCell';
|
||||||
import { getStats } from '../../actions/stats';
|
import { getStats } from '../../actions/stats';
|
||||||
import IconTooltip from '../Logs/Cells/IconTooltip';
|
|
||||||
|
|
||||||
const getClientsPercentColor = (percent) => {
|
import IconTooltip from '../Logs/Cells/IconTooltip';
|
||||||
|
import { RootState } from '../../initialState';
|
||||||
|
|
||||||
|
const getClientsPercentColor = (percent: any) => {
|
||||||
if (percent > 50) {
|
if (percent > 50) {
|
||||||
return STATUS_COLORS.green;
|
return STATUS_COLORS.green;
|
||||||
}
|
}
|
||||||
@@ -30,9 +35,13 @@ const getClientsPercentColor = (percent) => {
|
|||||||
return STATUS_COLORS.red;
|
return STATUS_COLORS.red;
|
||||||
};
|
};
|
||||||
|
|
||||||
const CountCell = (row) => {
|
const CountCell = (row: any) => {
|
||||||
const { value, original: { ip } } = row;
|
const {
|
||||||
const numDnsQueries = useSelector((state) => state.stats.numDnsQueries, shallowEqual);
|
value,
|
||||||
|
original: { ip },
|
||||||
|
} = row;
|
||||||
|
|
||||||
|
const numDnsQueries = useSelector<RootState>((state) => state.stats.numDnsQueries, shallowEqual);
|
||||||
|
|
||||||
const percent = getPercent(numDnsQueries, value);
|
const percent = getPercent(numDnsQueries, value);
|
||||||
const percentColor = getClientsPercentColor(percent);
|
const percentColor = getClientsPercentColor(percent);
|
||||||
@@ -40,22 +49,29 @@ const CountCell = (row) => {
|
|||||||
return <Cell value={value} percent={percent} color={percentColor} search={ip} />;
|
return <Cell value={value} percent={percent} color={percentColor} search={ip} />;
|
||||||
};
|
};
|
||||||
|
|
||||||
const renderBlockingButton = (ip, disallowed, disallowed_rule) => {
|
const renderBlockingButton = (ip: any, disallowed: any, disallowed_rule: any) => {
|
||||||
const dispatch = useDispatch();
|
const dispatch = useDispatch();
|
||||||
const { t } = useTranslation();
|
const { t } = useTranslation();
|
||||||
const processingSet = useSelector((state) => state.access.processingSet);
|
|
||||||
const allowedСlients = useSelector((state) => state.access.allowed_clients, shallowEqual);
|
const processingSet = useSelector<RootState, RootState['access']['processingSet']>(
|
||||||
|
(state) => state.access.processingSet,
|
||||||
|
);
|
||||||
|
|
||||||
|
const allowedClients = useSelector<RootState, RootState['access']['allowed_clients']>(
|
||||||
|
(state) => state.access.allowed_clients,
|
||||||
|
shallowEqual,
|
||||||
|
);
|
||||||
|
|
||||||
const [isOptionsOpened, setOptionsOpened] = useState(false);
|
const [isOptionsOpened, setOptionsOpened] = useState(false);
|
||||||
|
|
||||||
const toggleClientStatus = async (ip, disallowed, disallowed_rule) => {
|
const toggleClientStatus = async (ip: any, disallowed: any, disallowed_rule: any) => {
|
||||||
let confirmMessage;
|
let confirmMessage;
|
||||||
|
|
||||||
if (disallowed) {
|
if (disallowed) {
|
||||||
confirmMessage = t('client_confirm_unblock', { ip: disallowed_rule || ip });
|
confirmMessage = t('client_confirm_unblock', { ip: disallowed_rule || ip });
|
||||||
} else {
|
} else {
|
||||||
confirmMessage = `${t('adg_will_drop_dns_queries')} ${t('client_confirm_block', { ip })}`;
|
confirmMessage = `${t('adg_will_drop_dns_queries')} ${t('client_confirm_block', { ip })}`;
|
||||||
if (allowedСlients.length > 0) {
|
if (allowedClients.length > 0) {
|
||||||
confirmMessage = confirmMessage.concat(`\n\n${t('filter_allowlist', { disallowed_rule })}`);
|
confirmMessage = confirmMessage.concat(`\n\n${t('filter_allowlist', { disallowed_rule })}`);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -73,15 +89,11 @@ const renderBlockingButton = (ip, disallowed, disallowed_rule) => {
|
|||||||
|
|
||||||
const text = disallowed ? BLOCK_ACTIONS.UNBLOCK : BLOCK_ACTIONS.BLOCK;
|
const text = disallowed ? BLOCK_ACTIONS.UNBLOCK : BLOCK_ACTIONS.BLOCK;
|
||||||
|
|
||||||
const lastRuleInAllowlist = !disallowed && allowedСlients === disallowed_rule;
|
const lastRuleInAllowlist = !disallowed && allowedClients === disallowed_rule;
|
||||||
const disabled = processingSet || lastRuleInAllowlist;
|
const disabled = processingSet || lastRuleInAllowlist;
|
||||||
return (
|
return (
|
||||||
<div className="table__action">
|
<div className="table__action">
|
||||||
<button
|
<button type="button" className="btn btn-icon btn-sm px-0" onClick={() => setOptionsOpened(true)}>
|
||||||
type="button"
|
|
||||||
className="btn btn-icon btn-sm px-0"
|
|
||||||
onClick={() => setOptionsOpened(true)}
|
|
||||||
>
|
|
||||||
<svg className="icon24 icon--lightgray button-action__icon">
|
<svg className="icon24 icon--lightgray button-action__icon">
|
||||||
<use xlinkHref="#bullets" />
|
<use xlinkHref="#bullets" />
|
||||||
</svg>
|
</svg>
|
||||||
@@ -92,16 +104,18 @@ const renderBlockingButton = (ip, disallowed, disallowed_rule) => {
|
|||||||
tooltipClass="button-action--arrow-option-container"
|
tooltipClass="button-action--arrow-option-container"
|
||||||
xlinkHref="bullets"
|
xlinkHref="bullets"
|
||||||
triggerClass="btn btn-icon btn-sm px-0 button-action__hidden-trigger"
|
triggerClass="btn btn-icon btn-sm px-0 button-action__hidden-trigger"
|
||||||
content={(
|
content={
|
||||||
<button
|
<button
|
||||||
className={classNames('button-action--arrow-option px-4 py-1', disallowed ? 'bg--green' : 'bg--danger')}
|
className={classNames(
|
||||||
|
'button-action--arrow-option px-4 py-1',
|
||||||
|
disallowed ? 'bg--green' : 'bg--danger',
|
||||||
|
)}
|
||||||
onClick={onClick}
|
onClick={onClick}
|
||||||
disabled={disabled}
|
disabled={disabled}
|
||||||
title={lastRuleInAllowlist ? t('last_rule_in_allowlist', { disallowed_rule }) : ''}
|
title={lastRuleInAllowlist ? t('last_rule_in_allowlist', { disallowed_rule }) : ''}>
|
||||||
>
|
|
||||||
<Trans>{text}</Trans>
|
<Trans>{text}</Trans>
|
||||||
</button>
|
</button>
|
||||||
)}
|
}
|
||||||
placement="bottom-end"
|
placement="bottom-end"
|
||||||
trigger="click"
|
trigger="click"
|
||||||
onVisibilityChange={setOptionsOpened}
|
onVisibilityChange={setOptionsOpened}
|
||||||
@@ -113,35 +127,42 @@ const renderBlockingButton = (ip, disallowed, disallowed_rule) => {
|
|||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
const ClientCell = (row) => {
|
const ClientCell = (row: any) => {
|
||||||
const { value, original: { info, info: { disallowed, disallowed_rule } } } = row;
|
const {
|
||||||
|
value,
|
||||||
return <>
|
original: {
|
||||||
<div className="logs__row logs__row--overflow logs__row--column d-flex align-items-center">
|
info,
|
||||||
{renderFormattedClientCell(value, info, true)}
|
info: { disallowed, disallowed_rule },
|
||||||
{renderBlockingButton(value, disallowed, disallowed_rule)}
|
},
|
||||||
</div>
|
} = row;
|
||||||
</>;
|
|
||||||
};
|
|
||||||
|
|
||||||
const Clients = ({
|
|
||||||
refreshButton,
|
|
||||||
subtitle,
|
|
||||||
}) => {
|
|
||||||
const { t } = useTranslation();
|
|
||||||
const topClients = useSelector((state) => state.stats.topClients, shallowEqual);
|
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Card
|
<>
|
||||||
title={t('top_clients')}
|
<div className="logs__row logs__row--overflow logs__row--column d-flex align-items-center">
|
||||||
subtitle={subtitle}
|
{renderFormattedClientCell(value, info, true)}
|
||||||
bodyType="card-table"
|
{renderBlockingButton(value, disallowed, disallowed_rule)}
|
||||||
refresh={refreshButton}
|
</div>
|
||||||
>
|
</>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
interface ClientsProps {
|
||||||
|
refreshButton: React.ReactNode;
|
||||||
|
subtitle: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
const Clients = ({ refreshButton, subtitle }: ClientsProps) => {
|
||||||
|
const { t } = useTranslation();
|
||||||
|
|
||||||
|
const topClients = useSelector<RootState, RootState['stats']['topClients']>(
|
||||||
|
(state) => state.stats.topClients,
|
||||||
|
shallowEqual,
|
||||||
|
);
|
||||||
|
|
||||||
|
return (
|
||||||
|
<Card title={t('top_clients')} subtitle={subtitle} bodyType="card-table" refresh={refreshButton}>
|
||||||
<ReactTable
|
<ReactTable
|
||||||
data={topClients.map(({
|
data={topClients.map(({ name: ip, count, info, blocked }: any) => ({
|
||||||
name: ip, count, info, blocked,
|
|
||||||
}) => ({
|
|
||||||
ip,
|
ip,
|
||||||
count,
|
count,
|
||||||
info,
|
info,
|
||||||
@@ -167,12 +188,14 @@ const Clients = ({
|
|||||||
minRows={TABLES_MIN_ROWS}
|
minRows={TABLES_MIN_ROWS}
|
||||||
defaultPageSize={DASHBOARD_TABLES_DEFAULT_PAGE_SIZE}
|
defaultPageSize={DASHBOARD_TABLES_DEFAULT_PAGE_SIZE}
|
||||||
className="-highlight card-table-overflow--limited clients__table"
|
className="-highlight card-table-overflow--limited clients__table"
|
||||||
getTrProps={(_state, rowInfo) => {
|
getTrProps={(_state: any, rowInfo: any) => {
|
||||||
if (!rowInfo) {
|
if (!rowInfo) {
|
||||||
return {};
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
const { info: { disallowed } } = rowInfo.original;
|
const {
|
||||||
|
info: { disallowed },
|
||||||
|
} = rowInfo.original;
|
||||||
|
|
||||||
return disallowed ? { className: 'logs__row--red' } : {};
|
return disallowed ? { className: 'logs__row--red' } : {};
|
||||||
}}
|
}}
|
||||||
@@ -181,9 +204,4 @@ const Clients = ({
|
|||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
Clients.propTypes = {
|
|
||||||
refreshButton: PropTypes.node.isRequired,
|
|
||||||
subtitle: PropTypes.string.isRequired,
|
|
||||||
};
|
|
||||||
|
|
||||||
export default Clients;
|
export default Clients;
|
||||||
@@ -1,41 +1,52 @@
|
|||||||
import React from 'react';
|
import React from 'react';
|
||||||
import propTypes from 'prop-types';
|
|
||||||
import { Trans, useTranslation } from 'react-i18next';
|
import { Trans, useTranslation } from 'react-i18next';
|
||||||
import round from 'lodash/round';
|
import round from 'lodash/round';
|
||||||
import { shallowEqual, useSelector } from 'react-redux';
|
import { shallowEqual, useSelector } from 'react-redux';
|
||||||
|
|
||||||
import Card from '../ui/Card';
|
import Card from '../ui/Card';
|
||||||
|
|
||||||
import { formatNumber, msToDays, msToHours } from '../../helpers/helpers';
|
import { formatNumber, msToDays, msToHours } from '../../helpers/helpers';
|
||||||
|
|
||||||
import LogsSearchLink from '../ui/LogsSearchLink';
|
import LogsSearchLink from '../ui/LogsSearchLink';
|
||||||
import { RESPONSE_FILTER, TIME_UNITS } from '../../helpers/constants';
|
import { RESPONSE_FILTER, TIME_UNITS } from '../../helpers/constants';
|
||||||
import Tooltip from '../ui/Tooltip';
|
|
||||||
|
|
||||||
const Row = ({
|
import Tooltip from '../ui/Tooltip';
|
||||||
label, count, response_status, tooltipTitle, translationComponents,
|
import { RootState } from '../../initialState';
|
||||||
}) => {
|
|
||||||
const content = response_status
|
interface RowProps {
|
||||||
? <LogsSearchLink response_status={response_status}>{formatNumber(count)}</LogsSearchLink>
|
label: string;
|
||||||
: count;
|
count: string;
|
||||||
|
response_status?: string;
|
||||||
|
tooltipTitle: string;
|
||||||
|
translationComponents?: React.ReactElement[];
|
||||||
|
}
|
||||||
|
|
||||||
|
const Row = ({ label, count, response_status, tooltipTitle, translationComponents }: RowProps) => {
|
||||||
|
const content = response_status ? (
|
||||||
|
<LogsSearchLink response_status={response_status}>{count}</LogsSearchLink>
|
||||||
|
) : (
|
||||||
|
count
|
||||||
|
);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className="counters__row" key={label}>
|
<div className="counters__row" key={label}>
|
||||||
<div className="counters__column">
|
<div className="counters__column">
|
||||||
<span className="counters__title">
|
<span className="counters__title">
|
||||||
<Trans components={translationComponents}>
|
<Trans components={translationComponents}>{label}</Trans>
|
||||||
{label}
|
|
||||||
</Trans>
|
|
||||||
</span>
|
</span>
|
||||||
|
|
||||||
<span className="counters__tooltip">
|
<span className="counters__tooltip">
|
||||||
<Tooltip
|
<Tooltip
|
||||||
content={tooltipTitle}
|
content={tooltipTitle}
|
||||||
placement="top"
|
placement="top"
|
||||||
className="tooltip-container tooltip-custom--narrow text-center"
|
className="tooltip-container tooltip-custom--narrow text-center">
|
||||||
>
|
|
||||||
<svg className="icons icon--20 icon--lightgray ml-2">
|
<svg className="icons icon--20 icon--lightgray ml-2">
|
||||||
<use xlinkHref="#question" />
|
<use xlinkHref="#question" />
|
||||||
</svg>
|
</svg>
|
||||||
</Tooltip>
|
</Tooltip>
|
||||||
</span>
|
</span>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div className="counters__column counters__column--value">
|
<div className="counters__column counters__column--value">
|
||||||
<strong>{content}</strong>
|
<strong>{content}</strong>
|
||||||
</div>
|
</div>
|
||||||
@@ -43,7 +54,12 @@ const Row = ({
|
|||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
const Counters = ({ refreshButton, subtitle }) => {
|
interface CountersProps {
|
||||||
|
refreshButton: React.ReactNode;
|
||||||
|
subtitle: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
const Counters = ({ refreshButton, subtitle }: CountersProps) => {
|
||||||
const {
|
const {
|
||||||
interval,
|
interval,
|
||||||
numDnsQueries,
|
numDnsQueries,
|
||||||
@@ -53,77 +69,67 @@ const Counters = ({ refreshButton, subtitle }) => {
|
|||||||
numReplacedSafesearch,
|
numReplacedSafesearch,
|
||||||
avgProcessingTime,
|
avgProcessingTime,
|
||||||
timeUnits,
|
timeUnits,
|
||||||
} = useSelector((state) => state.stats, shallowEqual);
|
} = useSelector<RootState, RootState['stats']>((state) => state.stats, shallowEqual);
|
||||||
const { t } = useTranslation();
|
const { t } = useTranslation();
|
||||||
|
|
||||||
const dnsQueryTooltip = timeUnits === TIME_UNITS.HOURS
|
const dnsQueryTooltip =
|
||||||
? t('number_of_dns_query_hours', { count: msToHours(interval) })
|
timeUnits === TIME_UNITS.HOURS
|
||||||
: t('number_of_dns_query_days', { count: msToDays(interval) });
|
? t('number_of_dns_query_hours', { count: msToHours(interval) })
|
||||||
|
: t('number_of_dns_query_days', { count: msToDays(interval) });
|
||||||
|
|
||||||
const rows = [
|
const rows: RowProps[] = [
|
||||||
{
|
{
|
||||||
label: 'dns_query',
|
label: 'dns_query',
|
||||||
count: numDnsQueries,
|
count: formatNumber(numDnsQueries),
|
||||||
tooltipTitle: dnsQueryTooltip,
|
tooltipTitle: dnsQueryTooltip,
|
||||||
response_status: RESPONSE_FILTER.ALL.QUERY,
|
response_status: RESPONSE_FILTER.ALL.QUERY,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: 'blocked_by',
|
label: 'blocked_by',
|
||||||
count: numBlockedFiltering,
|
count: formatNumber(numBlockedFiltering),
|
||||||
tooltipTitle: 'number_of_dns_query_blocked_24_hours',
|
tooltipTitle: 'number_of_dns_query_blocked_24_hours',
|
||||||
response_status: RESPONSE_FILTER.BLOCKED.QUERY,
|
response_status: RESPONSE_FILTER.BLOCKED.QUERY,
|
||||||
translationComponents: [<a href="#filters" key="0">link</a>],
|
|
||||||
|
translationComponents: [
|
||||||
|
<a href="#filters" key="0">
|
||||||
|
link
|
||||||
|
</a>,
|
||||||
|
],
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: 'stats_malware_phishing',
|
label: 'stats_malware_phishing',
|
||||||
count: numReplacedSafebrowsing,
|
count: formatNumber(numReplacedSafebrowsing),
|
||||||
tooltipTitle: 'number_of_dns_query_blocked_24_hours_by_sec',
|
tooltipTitle: 'number_of_dns_query_blocked_24_hours_by_sec',
|
||||||
response_status: RESPONSE_FILTER.BLOCKED_THREATS.QUERY,
|
response_status: RESPONSE_FILTER.BLOCKED_THREATS.QUERY,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: 'stats_adult',
|
label: 'stats_adult',
|
||||||
count: numReplacedParental,
|
count: formatNumber(numReplacedParental),
|
||||||
tooltipTitle: 'number_of_dns_query_blocked_24_hours_adult',
|
tooltipTitle: 'number_of_dns_query_blocked_24_hours_adult',
|
||||||
response_status: RESPONSE_FILTER.BLOCKED_ADULT_WEBSITES.QUERY,
|
response_status: RESPONSE_FILTER.BLOCKED_ADULT_WEBSITES.QUERY,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: 'enforced_save_search',
|
label: 'enforced_save_search',
|
||||||
count: numReplacedSafesearch,
|
count: formatNumber(numReplacedSafesearch),
|
||||||
tooltipTitle: 'number_of_dns_query_to_safe_search',
|
tooltipTitle: 'number_of_dns_query_to_safe_search',
|
||||||
response_status: RESPONSE_FILTER.SAFE_SEARCH.QUERY,
|
response_status: RESPONSE_FILTER.SAFE_SEARCH.QUERY,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: 'average_processing_time',
|
label: 'average_processing_time',
|
||||||
count: avgProcessingTime ? `${round(avgProcessingTime)} ms` : 0,
|
count: avgProcessingTime ? `${round(avgProcessingTime)} ms` : '0',
|
||||||
tooltipTitle: 'average_processing_time_hint',
|
tooltipTitle: 'average_processing_time_hint',
|
||||||
},
|
},
|
||||||
];
|
];
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Card
|
<Card title={t('general_statistics')} subtitle={subtitle} bodyType="card-table" refresh={refreshButton}>
|
||||||
title={t('general_statistics')}
|
|
||||||
subtitle={subtitle}
|
|
||||||
bodyType="card-table"
|
|
||||||
refresh={refreshButton}
|
|
||||||
>
|
|
||||||
<div className="counters">
|
<div className="counters">
|
||||||
{rows.map(Row)}
|
{rows.map((row, index) => {
|
||||||
|
return <Row {...row} key={index} />;
|
||||||
|
})}
|
||||||
</div>
|
</div>
|
||||||
</Card>
|
</Card>
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
Row.propTypes = {
|
|
||||||
label: propTypes.string.isRequired,
|
|
||||||
count: propTypes.string.isRequired,
|
|
||||||
response_status: propTypes.string,
|
|
||||||
tooltipTitle: propTypes.string.isRequired,
|
|
||||||
translationComponents: propTypes.arrayOf(propTypes.element),
|
|
||||||
};
|
|
||||||
|
|
||||||
Counters.propTypes = {
|
|
||||||
refreshButton: propTypes.node.isRequired,
|
|
||||||
subtitle: propTypes.string.isRequired,
|
|
||||||
};
|
|
||||||
|
|
||||||
export default Counters;
|
export default Counters;
|
||||||
@@ -1,77 +0,0 @@
|
|||||||
import React from 'react';
|
|
||||||
import PropTypes from 'prop-types';
|
|
||||||
|
|
||||||
import { Trans } from 'react-i18next';
|
|
||||||
import { getSourceData, getTrackerData } from '../../helpers/trackers/trackers';
|
|
||||||
import Tooltip from '../ui/Tooltip';
|
|
||||||
import { captitalizeWords } from '../../helpers/helpers';
|
|
||||||
|
|
||||||
const renderLabel = (value) => <strong><Trans>{value}</Trans></strong>;
|
|
||||||
|
|
||||||
const renderLink = ({ url, name }) => <a
|
|
||||||
className="tooltip-custom__content-link"
|
|
||||||
target="_blank"
|
|
||||||
rel="noopener noreferrer"
|
|
||||||
href={url}
|
|
||||||
>
|
|
||||||
<strong>{name}</strong>
|
|
||||||
</a>;
|
|
||||||
|
|
||||||
const getTrackerInfo = (trackerData) => [{
|
|
||||||
key: 'name_table_header',
|
|
||||||
value: trackerData,
|
|
||||||
render: renderLink,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
key: 'category_label',
|
|
||||||
value: captitalizeWords(trackerData.category),
|
|
||||||
render: renderLabel,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
key: 'source_label',
|
|
||||||
value: getSourceData(trackerData),
|
|
||||||
render: renderLink,
|
|
||||||
}];
|
|
||||||
|
|
||||||
const DomainCell = ({ value }) => {
|
|
||||||
const trackerData = getTrackerData(value);
|
|
||||||
|
|
||||||
const content = trackerData && <div className="popover__list">
|
|
||||||
<div className="tooltip-custom__content-title mb-1">
|
|
||||||
<Trans>found_in_known_domain_db</Trans>
|
|
||||||
</div>
|
|
||||||
{getTrackerInfo(trackerData)
|
|
||||||
.map(({ key, value, render }) => <div
|
|
||||||
key={key}
|
|
||||||
className="tooltip-custom__content-item"
|
|
||||||
>
|
|
||||||
<Trans>{key}</Trans>: {render(value)}
|
|
||||||
</div>)}
|
|
||||||
</div>;
|
|
||||||
|
|
||||||
return (
|
|
||||||
<div className="logs__row">
|
|
||||||
<div className="logs__text" title={value}>
|
|
||||||
{value}
|
|
||||||
</div>
|
|
||||||
{trackerData
|
|
||||||
&& <Tooltip content={content} placement="top"
|
|
||||||
className="tooltip-container tooltip-custom--wide">
|
|
||||||
<svg className="icons icon--24 icon--green ml-1">
|
|
||||||
<use xlinkHref="#privacy" />
|
|
||||||
</svg>
|
|
||||||
</Tooltip>}
|
|
||||||
</div>
|
|
||||||
);
|
|
||||||
};
|
|
||||||
|
|
||||||
DomainCell.propTypes = {
|
|
||||||
value: PropTypes.string.isRequired,
|
|
||||||
};
|
|
||||||
|
|
||||||
renderLink.propTypes = {
|
|
||||||
url: PropTypes.string.isRequired,
|
|
||||||
name: PropTypes.string.isRequired,
|
|
||||||
};
|
|
||||||
|
|
||||||
export default DomainCell;
|
|
||||||
81
client/src/components/Dashboard/DomainCell.tsx
Normal file
81
client/src/components/Dashboard/DomainCell.tsx
Normal file
@@ -0,0 +1,81 @@
|
|||||||
|
import React from 'react';
|
||||||
|
|
||||||
|
import { Trans } from 'react-i18next';
|
||||||
|
import { getSourceData, getTrackerData } from '../../helpers/trackers/trackers';
|
||||||
|
|
||||||
|
import Tooltip from '../ui/Tooltip';
|
||||||
|
|
||||||
|
import { captitalizeWords } from '../../helpers/helpers';
|
||||||
|
|
||||||
|
const renderLabel = (value: any) => (
|
||||||
|
<strong>
|
||||||
|
<Trans>{value}</Trans>
|
||||||
|
</strong>
|
||||||
|
);
|
||||||
|
|
||||||
|
interface renderLinkProps {
|
||||||
|
url: string;
|
||||||
|
name: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
const renderLink = ({ url, name }: renderLinkProps) => (
|
||||||
|
<a className="tooltip-custom__content-link" target="_blank" rel="noopener noreferrer" href={url}>
|
||||||
|
<strong>{name}</strong>
|
||||||
|
</a>
|
||||||
|
);
|
||||||
|
|
||||||
|
const getTrackerInfo = (trackerData: any) => [
|
||||||
|
{
|
||||||
|
key: 'name_table_header',
|
||||||
|
value: trackerData,
|
||||||
|
render: renderLink,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
key: 'category_label',
|
||||||
|
value: captitalizeWords(trackerData.category),
|
||||||
|
render: renderLabel,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
key: 'source_label',
|
||||||
|
value: getSourceData(trackerData),
|
||||||
|
render: renderLink,
|
||||||
|
},
|
||||||
|
];
|
||||||
|
|
||||||
|
interface DomainCellProps {
|
||||||
|
value: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
const DomainCell = ({ value }: DomainCellProps) => {
|
||||||
|
const trackerData = getTrackerData(value);
|
||||||
|
|
||||||
|
const content = trackerData && (
|
||||||
|
<div className="popover__list">
|
||||||
|
<div className="tooltip-custom__content-title mb-1">
|
||||||
|
<Trans>found_in_known_domain_db</Trans>
|
||||||
|
</div>
|
||||||
|
{getTrackerInfo(trackerData).map(({ key, value, render }) => (
|
||||||
|
<div key={key} className="tooltip-custom__content-item">
|
||||||
|
<Trans>{key}</Trans>: {render(value)}
|
||||||
|
</div>
|
||||||
|
))}
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
|
||||||
|
return (
|
||||||
|
<div className="logs__row">
|
||||||
|
<div className="logs__text" title={value}>
|
||||||
|
{value}
|
||||||
|
</div>
|
||||||
|
{trackerData && (
|
||||||
|
<Tooltip content={content} placement="top" className="tooltip-container tooltip-custom--wide">
|
||||||
|
<svg className="icons icon--24 icon--green ml-1">
|
||||||
|
<use xlinkHref="#privacy" />
|
||||||
|
</svg>
|
||||||
|
</Tooltip>
|
||||||
|
)}
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
export default DomainCell;
|
||||||
@@ -1,6 +1,7 @@
|
|||||||
import React from 'react';
|
import React from 'react';
|
||||||
|
|
||||||
|
// @ts-expect-error FIXME: update react-table
|
||||||
import ReactTable from 'react-table';
|
import ReactTable from 'react-table';
|
||||||
import PropTypes from 'prop-types';
|
|
||||||
import { withTranslation, Trans } from 'react-i18next';
|
import { withTranslation, Trans } from 'react-i18next';
|
||||||
|
|
||||||
import Card from '../ui/Card';
|
import Card from '../ui/Card';
|
||||||
@@ -8,9 +9,10 @@ import Cell from '../ui/Cell';
|
|||||||
import DomainCell from './DomainCell';
|
import DomainCell from './DomainCell';
|
||||||
|
|
||||||
import { DASHBOARD_TABLES_DEFAULT_PAGE_SIZE, STATUS_COLORS, TABLES_MIN_ROWS } from '../../helpers/constants';
|
import { DASHBOARD_TABLES_DEFAULT_PAGE_SIZE, STATUS_COLORS, TABLES_MIN_ROWS } from '../../helpers/constants';
|
||||||
|
|
||||||
import { getPercent } from '../../helpers/helpers';
|
import { getPercent } from '../../helpers/helpers';
|
||||||
|
|
||||||
const getQueriedPercentColor = (percent) => {
|
const getQueriedPercentColor = (percent: any) => {
|
||||||
if (percent > 10) {
|
if (percent > 10) {
|
||||||
return STATUS_COLORS.red;
|
return STATUS_COLORS.red;
|
||||||
}
|
}
|
||||||
@@ -20,26 +22,27 @@ const getQueriedPercentColor = (percent) => {
|
|||||||
return STATUS_COLORS.green;
|
return STATUS_COLORS.green;
|
||||||
};
|
};
|
||||||
|
|
||||||
const countCell = (dnsQueries) => function cell(row) {
|
const countCell = (dnsQueries: any) =>
|
||||||
const { value } = row;
|
function cell(row: any) {
|
||||||
const percent = getPercent(dnsQueries, value);
|
const { value } = row;
|
||||||
const percentColor = getQueriedPercentColor(percent);
|
const percent = getPercent(dnsQueries, value);
|
||||||
|
const percentColor = getQueriedPercentColor(percent);
|
||||||
|
|
||||||
return <Cell value={value} percent={percent} color={percentColor}
|
return <Cell value={value} percent={percent} color={percentColor} search={row.original.domain} />;
|
||||||
search={row.original.domain} />;
|
};
|
||||||
};
|
|
||||||
|
|
||||||
const QueriedDomains = ({
|
interface QueriedDomainsProps {
|
||||||
t, refreshButton, topQueriedDomains, subtitle, dnsQueries,
|
topQueriedDomains: unknown[];
|
||||||
}) => (
|
dnsQueries: number;
|
||||||
<Card
|
refreshButton: React.ReactNode;
|
||||||
title={t('stats_query_domain')}
|
subtitle: string;
|
||||||
subtitle={subtitle}
|
t: (...args: unknown[]) => string;
|
||||||
bodyType="card-table"
|
}
|
||||||
refresh={refreshButton}
|
|
||||||
>
|
const QueriedDomains = ({ t, refreshButton, topQueriedDomains, subtitle, dnsQueries }: QueriedDomainsProps) => (
|
||||||
|
<Card title={t('stats_query_domain')} subtitle={subtitle} bodyType="card-table" refresh={refreshButton}>
|
||||||
<ReactTable
|
<ReactTable
|
||||||
data={topQueriedDomains.map(({ name: domain, count }) => ({
|
data={topQueriedDomains.map(({ name: domain, count }: any) => ({
|
||||||
domain,
|
domain,
|
||||||
count,
|
count,
|
||||||
}))}
|
}))}
|
||||||
@@ -65,12 +68,4 @@ const QueriedDomains = ({
|
|||||||
</Card>
|
</Card>
|
||||||
);
|
);
|
||||||
|
|
||||||
QueriedDomains.propTypes = {
|
|
||||||
topQueriedDomains: PropTypes.array.isRequired,
|
|
||||||
dnsQueries: PropTypes.number.isRequired,
|
|
||||||
refreshButton: PropTypes.node.isRequired,
|
|
||||||
subtitle: PropTypes.string.isRequired,
|
|
||||||
t: PropTypes.func.isRequired,
|
|
||||||
};
|
|
||||||
|
|
||||||
export default withTranslation()(QueriedDomains);
|
export default withTranslation()(QueriedDomains);
|
||||||
@@ -1,15 +1,27 @@
|
|||||||
import React from 'react';
|
import React from 'react';
|
||||||
import PropTypes from 'prop-types';
|
|
||||||
import { Link } from 'react-router-dom';
|
import { Link } from 'react-router-dom';
|
||||||
import { withTranslation, Trans } from 'react-i18next';
|
import { withTranslation, Trans } from 'react-i18next';
|
||||||
|
|
||||||
import StatsCard from './StatsCard';
|
import StatsCard from './StatsCard';
|
||||||
|
|
||||||
import { getPercent, normalizeHistory } from '../../helpers/helpers';
|
import { getPercent, normalizeHistory } from '../../helpers/helpers';
|
||||||
import { RESPONSE_FILTER } from '../../helpers/constants';
|
import { RESPONSE_FILTER } from '../../helpers/constants';
|
||||||
|
|
||||||
const getNormalizedHistory = (data, interval, id) => [
|
const getNormalizedHistory = (data: any, interval: any, id: any) => [{ data: normalizeHistory(data), id }];
|
||||||
{ data: normalizeHistory(data, interval), id },
|
|
||||||
];
|
interface StatisticsProps {
|
||||||
|
interval: number;
|
||||||
|
dnsQueries: number[];
|
||||||
|
blockedFiltering: unknown[];
|
||||||
|
replacedSafebrowsing: unknown[];
|
||||||
|
replacedParental: unknown[];
|
||||||
|
numDnsQueries: number;
|
||||||
|
numBlockedFiltering: number;
|
||||||
|
numReplacedSafebrowsing: number;
|
||||||
|
numReplacedParental: number;
|
||||||
|
refreshButton: React.ReactNode;
|
||||||
|
}
|
||||||
|
|
||||||
const Statistics = ({
|
const Statistics = ({
|
||||||
interval,
|
interval,
|
||||||
@@ -21,61 +33,68 @@ const Statistics = ({
|
|||||||
numBlockedFiltering,
|
numBlockedFiltering,
|
||||||
numReplacedSafebrowsing,
|
numReplacedSafebrowsing,
|
||||||
numReplacedParental,
|
numReplacedParental,
|
||||||
}) => (
|
}: StatisticsProps) => (
|
||||||
<div className="row">
|
<div className="row">
|
||||||
<div className="col-sm-6 col-lg-3">
|
<div className="col-sm-6 col-lg-3">
|
||||||
<StatsCard
|
<StatsCard
|
||||||
total={numDnsQueries}
|
total={numDnsQueries}
|
||||||
lineData={getNormalizedHistory(dnsQueries, interval, 'dnsQuery')}
|
lineData={getNormalizedHistory(dnsQueries, interval, 'dnsQuery')}
|
||||||
title={<Link to="logs"><Trans>dns_query</Trans></Link>}
|
title={
|
||||||
|
<Link to="logs">
|
||||||
|
<Trans>dns_query</Trans>
|
||||||
|
</Link>
|
||||||
|
}
|
||||||
color="blue"
|
color="blue"
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div className="col-sm-6 col-lg-3">
|
<div className="col-sm-6 col-lg-3">
|
||||||
<StatsCard
|
<StatsCard
|
||||||
total={numBlockedFiltering}
|
total={numBlockedFiltering}
|
||||||
lineData={getNormalizedHistory(blockedFiltering, interval, 'blockedFiltering')}
|
lineData={getNormalizedHistory(blockedFiltering, interval, 'blockedFiltering')}
|
||||||
percent={getPercent(numDnsQueries, numBlockedFiltering)}
|
percent={getPercent(numDnsQueries, numBlockedFiltering)}
|
||||||
title={<Trans components={[<Link to={`logs?response_status=${RESPONSE_FILTER.BLOCKED.QUERY}`} key="0">link</Link>]}>blocked_by</Trans>}
|
title={
|
||||||
|
<Trans
|
||||||
|
components={[
|
||||||
|
<Link to={`logs?response_status=${RESPONSE_FILTER.BLOCKED.QUERY}`} key="0">
|
||||||
|
link
|
||||||
|
</Link>,
|
||||||
|
]}>
|
||||||
|
blocked_by
|
||||||
|
</Trans>
|
||||||
|
}
|
||||||
color="red"
|
color="red"
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div className="col-sm-6 col-lg-3">
|
<div className="col-sm-6 col-lg-3">
|
||||||
<StatsCard
|
<StatsCard
|
||||||
total={numReplacedSafebrowsing}
|
total={numReplacedSafebrowsing}
|
||||||
lineData={getNormalizedHistory(
|
lineData={getNormalizedHistory(replacedSafebrowsing, interval, 'replacedSafebrowsing')}
|
||||||
replacedSafebrowsing,
|
|
||||||
interval,
|
|
||||||
'replacedSafebrowsing',
|
|
||||||
)}
|
|
||||||
percent={getPercent(numDnsQueries, numReplacedSafebrowsing)}
|
percent={getPercent(numDnsQueries, numReplacedSafebrowsing)}
|
||||||
title={<Link to={`logs?response_status=${RESPONSE_FILTER.BLOCKED_THREATS.QUERY}`}><Trans>stats_malware_phishing</Trans></Link>}
|
title={
|
||||||
|
<Link to={`logs?response_status=${RESPONSE_FILTER.BLOCKED_THREATS.QUERY}`}>
|
||||||
|
<Trans>stats_malware_phishing</Trans>
|
||||||
|
</Link>
|
||||||
|
}
|
||||||
color="green"
|
color="green"
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div className="col-sm-6 col-lg-3">
|
<div className="col-sm-6 col-lg-3">
|
||||||
<StatsCard
|
<StatsCard
|
||||||
total={numReplacedParental}
|
total={numReplacedParental}
|
||||||
lineData={getNormalizedHistory(replacedParental, interval, 'replacedParental')}
|
lineData={getNormalizedHistory(replacedParental, interval, 'replacedParental')}
|
||||||
percent={getPercent(numDnsQueries, numReplacedParental)}
|
percent={getPercent(numDnsQueries, numReplacedParental)}
|
||||||
title={<Link to={`logs?response_status=${RESPONSE_FILTER.BLOCKED_ADULT_WEBSITES.QUERY}`}><Trans>stats_adult</Trans></Link>}
|
title={
|
||||||
|
<Link to={`logs?response_status=${RESPONSE_FILTER.BLOCKED_ADULT_WEBSITES.QUERY}`}>
|
||||||
|
<Trans>stats_adult</Trans>
|
||||||
|
</Link>
|
||||||
|
}
|
||||||
color="yellow"
|
color="yellow"
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
|
|
||||||
Statistics.propTypes = {
|
|
||||||
interval: PropTypes.number.isRequired,
|
|
||||||
dnsQueries: PropTypes.array.isRequired,
|
|
||||||
blockedFiltering: PropTypes.array.isRequired,
|
|
||||||
replacedSafebrowsing: PropTypes.array.isRequired,
|
|
||||||
replacedParental: PropTypes.array.isRequired,
|
|
||||||
numDnsQueries: PropTypes.number.isRequired,
|
|
||||||
numBlockedFiltering: PropTypes.number.isRequired,
|
|
||||||
numReplacedSafebrowsing: PropTypes.number.isRequired,
|
|
||||||
numReplacedParental: PropTypes.number.isRequired,
|
|
||||||
refreshButton: PropTypes.node.isRequired,
|
|
||||||
};
|
|
||||||
|
|
||||||
export default withTranslation()(Statistics);
|
export default withTranslation()(Statistics);
|
||||||
@@ -1,38 +1,34 @@
|
|||||||
import React from 'react';
|
import React from 'react';
|
||||||
import PropTypes from 'prop-types';
|
|
||||||
|
|
||||||
import { STATUS_COLORS } from '../../helpers/constants';
|
import { STATUS_COLORS } from '../../helpers/constants';
|
||||||
|
|
||||||
import { formatNumber } from '../../helpers/helpers';
|
import { formatNumber } from '../../helpers/helpers';
|
||||||
|
|
||||||
import Card from '../ui/Card';
|
import Card from '../ui/Card';
|
||||||
|
|
||||||
import Line from '../ui/Line';
|
import Line from '../ui/Line';
|
||||||
|
|
||||||
const StatsCard = ({
|
interface StatsCardProps {
|
||||||
total, lineData, percent, title, color,
|
total: number;
|
||||||
}) => (
|
lineData: unknown[];
|
||||||
|
title: object;
|
||||||
|
color: string;
|
||||||
|
percent?: number;
|
||||||
|
}
|
||||||
|
|
||||||
|
const StatsCard = ({ total, lineData, percent, title, color }: StatsCardProps) => (
|
||||||
<Card type="card--full" bodyType="card-wrap">
|
<Card type="card--full" bodyType="card-wrap">
|
||||||
<div className="card-body-stats">
|
<div className="card-body-stats">
|
||||||
<div className={`card-value card-value-stats text-${color}`}>
|
<div className={`card-value card-value-stats text-${color}`}>{formatNumber(total)}</div>
|
||||||
{formatNumber(total)}
|
|
||||||
</div>
|
|
||||||
<div className="card-title-stats">{title}</div>
|
<div className="card-title-stats">{title}</div>
|
||||||
</div>
|
</div>
|
||||||
{percent >= 0 && (
|
{percent >= 0 && <div className={`card-value card-value-percent text-${color}`}>{percent}</div>}
|
||||||
<div className={`card-value card-value-percent text-${color}`}>
|
|
||||||
{percent}
|
|
||||||
</div>
|
|
||||||
)}
|
|
||||||
<div className="card-chart-bg">
|
<div className="card-chart-bg">
|
||||||
<Line data={lineData} color={STATUS_COLORS[color]} />
|
<Line data={lineData} color={STATUS_COLORS[color]} />
|
||||||
</div>
|
</div>
|
||||||
</Card>
|
</Card>
|
||||||
);
|
);
|
||||||
|
|
||||||
StatsCard.propTypes = {
|
|
||||||
total: PropTypes.number.isRequired,
|
|
||||||
lineData: PropTypes.array.isRequired,
|
|
||||||
title: PropTypes.object.isRequired,
|
|
||||||
color: PropTypes.string.isRequired,
|
|
||||||
percent: PropTypes.number,
|
|
||||||
};
|
|
||||||
|
|
||||||
export default StatsCard;
|
export default StatsCard;
|
||||||
@@ -1,50 +1,48 @@
|
|||||||
import React from 'react';
|
import React from 'react';
|
||||||
|
|
||||||
|
// @ts-expect-error FIXME: update react-table
|
||||||
import ReactTable from 'react-table';
|
import ReactTable from 'react-table';
|
||||||
import PropTypes from 'prop-types';
|
|
||||||
import round from 'lodash/round';
|
import round from 'lodash/round';
|
||||||
import { withTranslation, Trans } from 'react-i18next';
|
import { withTranslation, Trans } from 'react-i18next';
|
||||||
|
|
||||||
|
import { TFunction } from 'i18next';
|
||||||
import Card from '../ui/Card';
|
import Card from '../ui/Card';
|
||||||
|
|
||||||
import DomainCell from './DomainCell';
|
import DomainCell from './DomainCell';
|
||||||
import { DASHBOARD_TABLES_DEFAULT_PAGE_SIZE, TABLES_MIN_ROWS } from '../../helpers/constants';
|
import { DASHBOARD_TABLES_DEFAULT_PAGE_SIZE, TABLES_MIN_ROWS } from '../../helpers/constants';
|
||||||
|
import { formatNumber } from '../../helpers/helpers';
|
||||||
|
|
||||||
const TimeCell = ({ value }) => {
|
interface TimeCellProps {
|
||||||
|
value?: string | number;
|
||||||
|
}
|
||||||
|
|
||||||
|
const TimeCell = ({ value }: TimeCellProps) => {
|
||||||
if (!value) {
|
if (!value) {
|
||||||
return '–';
|
return '–';
|
||||||
}
|
}
|
||||||
|
|
||||||
const valueInMilliseconds = round(value * 1000);
|
const valueInMilliseconds = formatNumber(round(Number(value) * 1000));
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className="logs__row o-hidden">
|
<div className="logs__row o-hidden">
|
||||||
<span className="logs__text logs__text--full" title={valueInMilliseconds}>
|
<span className="logs__text logs__text--full" title={valueInMilliseconds.toString()}>
|
||||||
{valueInMilliseconds} ms
|
{valueInMilliseconds} ms
|
||||||
</span>
|
</span>
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
TimeCell.propTypes = {
|
interface UpstreamAvgTimeProps {
|
||||||
value: PropTypes.oneOfType([
|
topUpstreamsAvgTime: { name: string; count: number }[];
|
||||||
PropTypes.string,
|
refreshButton: React.ReactNode;
|
||||||
PropTypes.number,
|
subtitle: string;
|
||||||
]),
|
t: TFunction;
|
||||||
};
|
}
|
||||||
|
|
||||||
const UpstreamAvgTime = ({
|
const UpstreamAvgTime = ({ t, refreshButton, topUpstreamsAvgTime, subtitle }: UpstreamAvgTimeProps) => (
|
||||||
t,
|
<Card title={t('average_upstream_response_time')} subtitle={subtitle} bodyType="card-table" refresh={refreshButton}>
|
||||||
refreshButton,
|
|
||||||
topUpstreamsAvgTime,
|
|
||||||
subtitle,
|
|
||||||
}) => (
|
|
||||||
<Card
|
|
||||||
title={t('average_upstream_response_time')}
|
|
||||||
subtitle={subtitle}
|
|
||||||
bodyType="card-table"
|
|
||||||
refresh={refreshButton}
|
|
||||||
>
|
|
||||||
<ReactTable
|
<ReactTable
|
||||||
data={topUpstreamsAvgTime.map(({ name: domain, count }) => ({
|
data={topUpstreamsAvgTime.map(({ name: domain, count }: { name: string; count: number }) => ({
|
||||||
domain,
|
domain,
|
||||||
count,
|
count,
|
||||||
}))}
|
}))}
|
||||||
@@ -70,11 +68,4 @@ const UpstreamAvgTime = ({
|
|||||||
</Card>
|
</Card>
|
||||||
);
|
);
|
||||||
|
|
||||||
UpstreamAvgTime.propTypes = {
|
|
||||||
topUpstreamsAvgTime: PropTypes.array.isRequired,
|
|
||||||
refreshButton: PropTypes.node.isRequired,
|
|
||||||
subtitle: PropTypes.string.isRequired,
|
|
||||||
t: PropTypes.func.isRequired,
|
|
||||||
};
|
|
||||||
|
|
||||||
export default withTranslation()(UpstreamAvgTime);
|
export default withTranslation()(UpstreamAvgTime);
|
||||||
@@ -1,51 +1,47 @@
|
|||||||
import React from 'react';
|
import React from 'react';
|
||||||
|
|
||||||
|
// @ts-expect-error FIXME: update react-table
|
||||||
import ReactTable from 'react-table';
|
import ReactTable from 'react-table';
|
||||||
import PropTypes from 'prop-types';
|
|
||||||
import { withTranslation, Trans } from 'react-i18next';
|
import { withTranslation, Trans } from 'react-i18next';
|
||||||
|
|
||||||
|
import { TFunction } from 'i18next';
|
||||||
import Card from '../ui/Card';
|
import Card from '../ui/Card';
|
||||||
|
|
||||||
import Cell from '../ui/Cell';
|
import Cell from '../ui/Cell';
|
||||||
|
|
||||||
import DomainCell from './DomainCell';
|
import DomainCell from './DomainCell';
|
||||||
|
|
||||||
import { getPercent } from '../../helpers/helpers';
|
import { getPercent } from '../../helpers/helpers';
|
||||||
import { DASHBOARD_TABLES_DEFAULT_PAGE_SIZE, STATUS_COLORS, TABLES_MIN_ROWS } from '../../helpers/constants';
|
import { DASHBOARD_TABLES_DEFAULT_PAGE_SIZE, STATUS_COLORS, TABLES_MIN_ROWS } from '../../helpers/constants';
|
||||||
|
|
||||||
const CountCell = (totalBlocked) => (
|
const CountCell = (totalBlocked: any) =>
|
||||||
function cell(row) {
|
function cell(row: any) {
|
||||||
const { value } = row;
|
const { value } = row;
|
||||||
const percent = getPercent(totalBlocked, value);
|
const percent = getPercent(totalBlocked, value);
|
||||||
|
|
||||||
return (
|
return <Cell value={value} percent={percent} color={STATUS_COLORS.green} />;
|
||||||
<Cell
|
};
|
||||||
value={value}
|
|
||||||
percent={percent}
|
|
||||||
color={STATUS_COLORS.green}
|
|
||||||
/>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
);
|
|
||||||
|
|
||||||
const getTotalUpstreamRequests = (stats) => {
|
const getTotalUpstreamRequests = (stats: any) => {
|
||||||
let total = 0;
|
let total = 0;
|
||||||
stats.forEach(({ count }) => { total += count; });
|
stats.forEach(({ count }: any) => {
|
||||||
|
total += count;
|
||||||
|
});
|
||||||
|
|
||||||
return total;
|
return total;
|
||||||
};
|
};
|
||||||
|
|
||||||
const UpstreamResponses = ({
|
interface UpstreamResponsesProps {
|
||||||
t,
|
topUpstreamsResponses: { name: string; count: number }[];
|
||||||
refreshButton,
|
refreshButton: React.ReactNode;
|
||||||
topUpstreamsResponses,
|
subtitle: string;
|
||||||
subtitle,
|
t: TFunction;
|
||||||
}) => (
|
}
|
||||||
<Card
|
|
||||||
title={t('top_upstreams')}
|
const UpstreamResponses = ({ t, refreshButton, topUpstreamsResponses, subtitle }: UpstreamResponsesProps) => (
|
||||||
subtitle={subtitle}
|
<Card title={t('top_upstreams')} subtitle={subtitle} bodyType="card-table" refresh={refreshButton}>
|
||||||
bodyType="card-table"
|
|
||||||
refresh={refreshButton}
|
|
||||||
>
|
|
||||||
<ReactTable
|
<ReactTable
|
||||||
data={topUpstreamsResponses.map(({ name: domain, count }) => ({
|
data={topUpstreamsResponses.map(({ name: domain, count }: { name: string; count: number }) => ({
|
||||||
domain,
|
domain,
|
||||||
count,
|
count,
|
||||||
}))}
|
}))}
|
||||||
@@ -71,11 +67,4 @@ const UpstreamResponses = ({
|
|||||||
</Card>
|
</Card>
|
||||||
);
|
);
|
||||||
|
|
||||||
UpstreamResponses.propTypes = {
|
|
||||||
topUpstreamsResponses: PropTypes.array.isRequired,
|
|
||||||
refreshButton: PropTypes.node.isRequired,
|
|
||||||
subtitle: PropTypes.string.isRequired,
|
|
||||||
t: PropTypes.func.isRequired,
|
|
||||||
};
|
|
||||||
|
|
||||||
export default withTranslation()(UpstreamResponses);
|
export default withTranslation()(UpstreamResponses);
|
||||||
@@ -1,270 +0,0 @@
|
|||||||
import React, { useEffect } from 'react';
|
|
||||||
import PropTypes from 'prop-types';
|
|
||||||
import { HashLink as Link } from 'react-router-hash-link';
|
|
||||||
import { Trans, useTranslation } from 'react-i18next';
|
|
||||||
import classNames from 'classnames';
|
|
||||||
|
|
||||||
import Statistics from './Statistics';
|
|
||||||
import Counters from './Counters';
|
|
||||||
import Clients from './Clients';
|
|
||||||
import QueriedDomains from './QueriedDomains';
|
|
||||||
import BlockedDomains from './BlockedDomains';
|
|
||||||
import {
|
|
||||||
DISABLE_PROTECTION_TIMINGS,
|
|
||||||
ONE_SECOND_IN_MS,
|
|
||||||
SETTINGS_URLS,
|
|
||||||
TIME_UNITS,
|
|
||||||
} from '../../helpers/constants';
|
|
||||||
import {
|
|
||||||
msToSeconds,
|
|
||||||
msToMinutes,
|
|
||||||
msToHours,
|
|
||||||
msToDays,
|
|
||||||
} from '../../helpers/helpers';
|
|
||||||
|
|
||||||
import PageTitle from '../ui/PageTitle';
|
|
||||||
import Loading from '../ui/Loading';
|
|
||||||
import './Dashboard.css';
|
|
||||||
import Dropdown from '../ui/Dropdown';
|
|
||||||
import UpstreamResponses from './UpstreamResponses';
|
|
||||||
import UpstreamAvgTime from './UpstreamAvgTime';
|
|
||||||
|
|
||||||
const Dashboard = ({
|
|
||||||
getAccessList,
|
|
||||||
getStats,
|
|
||||||
getStatsConfig,
|
|
||||||
dashboard,
|
|
||||||
dashboard: { protectionEnabled, processingProtection, protectionDisabledDuration },
|
|
||||||
toggleProtection,
|
|
||||||
stats,
|
|
||||||
access,
|
|
||||||
}) => {
|
|
||||||
const { t } = useTranslation();
|
|
||||||
|
|
||||||
const getAllStats = () => {
|
|
||||||
getAccessList();
|
|
||||||
getStats();
|
|
||||||
getStatsConfig();
|
|
||||||
};
|
|
||||||
|
|
||||||
useEffect(() => {
|
|
||||||
getAllStats();
|
|
||||||
}, []);
|
|
||||||
const getSubtitle = () => {
|
|
||||||
if (!stats.enabled) {
|
|
||||||
return t('stats_disabled_short');
|
|
||||||
}
|
|
||||||
|
|
||||||
return stats.timeUnits === TIME_UNITS.HOURS
|
|
||||||
? t('for_last_hours', { count: msToHours(stats.interval) })
|
|
||||||
: t('for_last_days', { count: msToDays(stats.interval) });
|
|
||||||
};
|
|
||||||
|
|
||||||
const buttonClass = classNames('btn btn-sm dashboard-protection-button', {
|
|
||||||
'btn-gray': protectionEnabled,
|
|
||||||
'btn-success': !protectionEnabled,
|
|
||||||
});
|
|
||||||
|
|
||||||
const refreshButton = <button
|
|
||||||
type="button"
|
|
||||||
className="btn btn-icon btn-outline-primary btn-sm"
|
|
||||||
title={t('refresh_btn')}
|
|
||||||
onClick={() => getAllStats()}
|
|
||||||
>
|
|
||||||
<svg className="icons icon12">
|
|
||||||
<use xlinkHref="#refresh" />
|
|
||||||
</svg>
|
|
||||||
</button>;
|
|
||||||
|
|
||||||
const statsProcessing = stats.processingStats
|
|
||||||
|| stats.processingGetConfig
|
|
||||||
|| access.processing;
|
|
||||||
|
|
||||||
const subtitle = getSubtitle();
|
|
||||||
|
|
||||||
const DISABLE_PROTECTION_ITEMS = [
|
|
||||||
{
|
|
||||||
text: t('disable_for_seconds', { count: msToSeconds(DISABLE_PROTECTION_TIMINGS.HALF_MINUTE) }),
|
|
||||||
disableTime: DISABLE_PROTECTION_TIMINGS.HALF_MINUTE,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
text: t('disable_for_minutes', { count: msToMinutes(DISABLE_PROTECTION_TIMINGS.MINUTE) }),
|
|
||||||
disableTime: DISABLE_PROTECTION_TIMINGS.MINUTE,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
text: t('disable_for_minutes', { count: msToMinutes(DISABLE_PROTECTION_TIMINGS.TEN_MINUTES) }),
|
|
||||||
disableTime: DISABLE_PROTECTION_TIMINGS.TEN_MINUTES,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
text: t('disable_for_hours', { count: msToHours(DISABLE_PROTECTION_TIMINGS.HOUR) }),
|
|
||||||
disableTime: DISABLE_PROTECTION_TIMINGS.HOUR,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
text: t('disable_until_tomorrow'),
|
|
||||||
disableTime: DISABLE_PROTECTION_TIMINGS.TOMORROW,
|
|
||||||
},
|
|
||||||
];
|
|
||||||
|
|
||||||
const getDisableProtectionItems = () => (
|
|
||||||
Object.values(DISABLE_PROTECTION_ITEMS)
|
|
||||||
.map((item, index) => (
|
|
||||||
<div
|
|
||||||
key={`disable_timings_${index}`}
|
|
||||||
className="dropdown-item"
|
|
||||||
onClick={() => {
|
|
||||||
toggleProtection(protectionEnabled, item.disableTime - ONE_SECOND_IN_MS);
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
{item.text}
|
|
||||||
</div>
|
|
||||||
))
|
|
||||||
);
|
|
||||||
|
|
||||||
const getRemaningTimeText = (milliseconds) => {
|
|
||||||
if (!milliseconds) {
|
|
||||||
return '';
|
|
||||||
}
|
|
||||||
|
|
||||||
const date = new Date(milliseconds);
|
|
||||||
const hh = date.getUTCHours();
|
|
||||||
const mm = `0${date.getUTCMinutes()}`.slice(-2);
|
|
||||||
const ss = `0${date.getUTCSeconds()}`.slice(-2);
|
|
||||||
const formattedHH = `0${hh}`.slice(-2);
|
|
||||||
|
|
||||||
return hh ? `${formattedHH}:${mm}:${ss}` : `${mm}:${ss}`;
|
|
||||||
};
|
|
||||||
|
|
||||||
const getProtectionBtnText = (status) => (status ? t('disable_protection') : t('enable_protection'));
|
|
||||||
|
|
||||||
return <>
|
|
||||||
<PageTitle title={t('dashboard')} containerClass="page-title--dashboard">
|
|
||||||
<div className="page-title__protection">
|
|
||||||
<button
|
|
||||||
type="button"
|
|
||||||
className={buttonClass}
|
|
||||||
onClick={() => {
|
|
||||||
toggleProtection(protectionEnabled);
|
|
||||||
}}
|
|
||||||
disabled={processingProtection}
|
|
||||||
>
|
|
||||||
{protectionDisabledDuration
|
|
||||||
? `${t('enable_protection_timer')} ${getRemaningTimeText(protectionDisabledDuration)}`
|
|
||||||
: getProtectionBtnText(protectionEnabled)
|
|
||||||
}
|
|
||||||
</button>
|
|
||||||
|
|
||||||
{protectionEnabled && <Dropdown
|
|
||||||
label=""
|
|
||||||
baseClassName="dropdown-protection"
|
|
||||||
icon="arrow-down"
|
|
||||||
controlClassName="dropdown-protection__toggle"
|
|
||||||
menuClassName="dropdown-menu dropdown-menu-arrow dropdown-menu--protection"
|
|
||||||
>
|
|
||||||
{getDisableProtectionItems()}
|
|
||||||
</Dropdown>}
|
|
||||||
</div>
|
|
||||||
<button
|
|
||||||
type="button"
|
|
||||||
className="btn btn-outline-primary btn-sm"
|
|
||||||
onClick={getAllStats}
|
|
||||||
>
|
|
||||||
<Trans>refresh_statics</Trans>
|
|
||||||
</button>
|
|
||||||
</PageTitle>
|
|
||||||
{statsProcessing && <Loading />}
|
|
||||||
{!statsProcessing && <div className="row row-cards dashboard">
|
|
||||||
<div className="col-lg-12">
|
|
||||||
{stats.interval === 0 && (
|
|
||||||
<div className="alert alert-warning" role="alert">
|
|
||||||
<Trans components={[
|
|
||||||
<Link
|
|
||||||
to={`${SETTINGS_URLS.settings}#stats-config`}
|
|
||||||
key="0"
|
|
||||||
>
|
|
||||||
link
|
|
||||||
</Link>,
|
|
||||||
]}>
|
|
||||||
stats_disabled
|
|
||||||
</Trans>
|
|
||||||
</div>
|
|
||||||
)}
|
|
||||||
<Statistics
|
|
||||||
interval={msToDays(stats.interval)}
|
|
||||||
dnsQueries={stats.dnsQueries}
|
|
||||||
blockedFiltering={stats.blockedFiltering}
|
|
||||||
replacedSafebrowsing={stats.replacedSafebrowsing}
|
|
||||||
replacedParental={stats.replacedParental}
|
|
||||||
numDnsQueries={stats.numDnsQueries}
|
|
||||||
numBlockedFiltering={stats.numBlockedFiltering}
|
|
||||||
numReplacedSafebrowsing={stats.numReplacedSafebrowsing}
|
|
||||||
numReplacedParental={stats.numReplacedParental}
|
|
||||||
refreshButton={refreshButton}
|
|
||||||
/>
|
|
||||||
</div>
|
|
||||||
<div className="col-lg-6">
|
|
||||||
<Counters
|
|
||||||
subtitle={subtitle}
|
|
||||||
refreshButton={refreshButton}
|
|
||||||
/>
|
|
||||||
</div>
|
|
||||||
<div className="col-lg-6">
|
|
||||||
<Clients
|
|
||||||
subtitle={subtitle}
|
|
||||||
dnsQueries={stats.numDnsQueries}
|
|
||||||
topClients={stats.topClients}
|
|
||||||
clients={dashboard.clients}
|
|
||||||
autoClients={dashboard.autoClients}
|
|
||||||
refreshButton={refreshButton}
|
|
||||||
processingAccessSet={access.processingSet}
|
|
||||||
disallowedClients={access.disallowed_clients}
|
|
||||||
/>
|
|
||||||
</div>
|
|
||||||
<div className="col-lg-6">
|
|
||||||
<QueriedDomains
|
|
||||||
subtitle={subtitle}
|
|
||||||
dnsQueries={stats.numDnsQueries}
|
|
||||||
topQueriedDomains={stats.topQueriedDomains}
|
|
||||||
refreshButton={refreshButton}
|
|
||||||
/>
|
|
||||||
</div>
|
|
||||||
<div className="col-lg-6">
|
|
||||||
<BlockedDomains
|
|
||||||
subtitle={subtitle}
|
|
||||||
topBlockedDomains={stats.topBlockedDomains}
|
|
||||||
blockedFiltering={stats.numBlockedFiltering}
|
|
||||||
replacedSafebrowsing={stats.numReplacedSafebrowsing}
|
|
||||||
replacedSafesearch={stats.numReplacedSafesearch}
|
|
||||||
replacedParental={stats.numReplacedParental}
|
|
||||||
refreshButton={refreshButton}
|
|
||||||
/>
|
|
||||||
</div>
|
|
||||||
<div className="col-lg-6">
|
|
||||||
<UpstreamResponses
|
|
||||||
subtitle={subtitle}
|
|
||||||
topUpstreamsResponses={stats.topUpstreamsResponses}
|
|
||||||
refreshButton={refreshButton}
|
|
||||||
/>
|
|
||||||
</div>
|
|
||||||
<div className="col-lg-6">
|
|
||||||
<UpstreamAvgTime
|
|
||||||
subtitle={subtitle}
|
|
||||||
topUpstreamsAvgTime={stats.topUpstreamsAvgTime}
|
|
||||||
refreshButton={refreshButton}
|
|
||||||
/>
|
|
||||||
</div>
|
|
||||||
</div>}
|
|
||||||
</>;
|
|
||||||
};
|
|
||||||
|
|
||||||
Dashboard.propTypes = {
|
|
||||||
dashboard: PropTypes.object.isRequired,
|
|
||||||
stats: PropTypes.object.isRequired,
|
|
||||||
access: PropTypes.object.isRequired,
|
|
||||||
getStats: PropTypes.func.isRequired,
|
|
||||||
getStatsConfig: PropTypes.func.isRequired,
|
|
||||||
toggleProtection: PropTypes.func.isRequired,
|
|
||||||
getClients: PropTypes.func.isRequired,
|
|
||||||
getAccessList: PropTypes.func.isRequired,
|
|
||||||
};
|
|
||||||
|
|
||||||
export default Dashboard;
|
|
||||||
260
client/src/components/Dashboard/index.tsx
Normal file
260
client/src/components/Dashboard/index.tsx
Normal file
@@ -0,0 +1,260 @@
|
|||||||
|
import React, { useEffect } from 'react';
|
||||||
|
|
||||||
|
import { HashLink as Link } from 'react-router-hash-link';
|
||||||
|
import { Trans, useTranslation } from 'react-i18next';
|
||||||
|
import classNames from 'classnames';
|
||||||
|
|
||||||
|
import Statistics from './Statistics';
|
||||||
|
import Counters from './Counters';
|
||||||
|
import Clients from './Clients';
|
||||||
|
import QueriedDomains from './QueriedDomains';
|
||||||
|
import BlockedDomains from './BlockedDomains';
|
||||||
|
import { DISABLE_PROTECTION_TIMINGS, ONE_SECOND_IN_MS, SETTINGS_URLS, TIME_UNITS } from '../../helpers/constants';
|
||||||
|
import { msToSeconds, msToMinutes, msToHours, msToDays } from '../../helpers/helpers';
|
||||||
|
|
||||||
|
import PageTitle from '../ui/PageTitle';
|
||||||
|
|
||||||
|
import Loading from '../ui/Loading';
|
||||||
|
import './Dashboard.css';
|
||||||
|
|
||||||
|
import Dropdown from '../ui/Dropdown';
|
||||||
|
import UpstreamResponses from './UpstreamResponses';
|
||||||
|
|
||||||
|
import UpstreamAvgTime from './UpstreamAvgTime';
|
||||||
|
import { AccessData, DashboardData, StatsData } from '../../initialState';
|
||||||
|
|
||||||
|
interface DashboardProps {
|
||||||
|
dashboard: DashboardData;
|
||||||
|
stats: StatsData;
|
||||||
|
access: AccessData;
|
||||||
|
getStats: (...args: unknown[]) => unknown;
|
||||||
|
getStatsConfig: (...args: unknown[]) => unknown;
|
||||||
|
toggleProtection: (...args: unknown[]) => unknown;
|
||||||
|
getClients: (...args: unknown[]) => unknown;
|
||||||
|
getAccessList: () => (dispatch: any) => void;
|
||||||
|
}
|
||||||
|
|
||||||
|
const Dashboard = ({
|
||||||
|
getAccessList,
|
||||||
|
getStats,
|
||||||
|
getStatsConfig,
|
||||||
|
dashboard: { protectionEnabled, processingProtection, protectionDisabledDuration },
|
||||||
|
toggleProtection,
|
||||||
|
stats,
|
||||||
|
access,
|
||||||
|
}: DashboardProps) => {
|
||||||
|
const { t } = useTranslation();
|
||||||
|
|
||||||
|
const getAllStats = () => {
|
||||||
|
getAccessList();
|
||||||
|
getStats();
|
||||||
|
getStatsConfig();
|
||||||
|
};
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
getAllStats();
|
||||||
|
}, []);
|
||||||
|
const getSubtitle = () => {
|
||||||
|
if (!stats.enabled) {
|
||||||
|
return t('stats_disabled_short');
|
||||||
|
}
|
||||||
|
|
||||||
|
const msIn7Days = 604800000;
|
||||||
|
|
||||||
|
if (stats.timeUnits === TIME_UNITS.HOURS && stats.interval === msIn7Days) {
|
||||||
|
return t('for_last_days', { count: msToDays(stats.interval) });
|
||||||
|
}
|
||||||
|
|
||||||
|
return stats.timeUnits === TIME_UNITS.HOURS
|
||||||
|
? t('for_last_hours', { count: msToHours(stats.interval) })
|
||||||
|
: t('for_last_days', { count: msToDays(stats.interval) });
|
||||||
|
};
|
||||||
|
|
||||||
|
const buttonClass = classNames('btn btn-sm dashboard-protection-button', {
|
||||||
|
'btn-gray': protectionEnabled,
|
||||||
|
'btn-success': !protectionEnabled,
|
||||||
|
});
|
||||||
|
|
||||||
|
const refreshButton = (
|
||||||
|
<button
|
||||||
|
type="button"
|
||||||
|
className="btn btn-icon btn-outline-primary btn-sm"
|
||||||
|
title={t('refresh_btn')}
|
||||||
|
onClick={() => getAllStats()}>
|
||||||
|
<svg className="icons icon12">
|
||||||
|
<use xlinkHref="#refresh" />
|
||||||
|
</svg>
|
||||||
|
</button>
|
||||||
|
);
|
||||||
|
|
||||||
|
const statsProcessing = stats.processingStats || stats.processingGetConfig || access.processing;
|
||||||
|
|
||||||
|
const subtitle = getSubtitle();
|
||||||
|
|
||||||
|
const DISABLE_PROTECTION_ITEMS = [
|
||||||
|
{
|
||||||
|
text: t('disable_for_seconds', { count: msToSeconds(DISABLE_PROTECTION_TIMINGS.HALF_MINUTE) }),
|
||||||
|
disableTime: DISABLE_PROTECTION_TIMINGS.HALF_MINUTE,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
text: t('disable_for_minutes', { count: msToMinutes(DISABLE_PROTECTION_TIMINGS.MINUTE) }),
|
||||||
|
disableTime: DISABLE_PROTECTION_TIMINGS.MINUTE,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
text: t('disable_for_minutes', { count: msToMinutes(DISABLE_PROTECTION_TIMINGS.TEN_MINUTES) }),
|
||||||
|
disableTime: DISABLE_PROTECTION_TIMINGS.TEN_MINUTES,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
text: t('disable_for_hours', { count: msToHours(DISABLE_PROTECTION_TIMINGS.HOUR) }),
|
||||||
|
disableTime: DISABLE_PROTECTION_TIMINGS.HOUR,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
text: t('disable_until_tomorrow'),
|
||||||
|
disableTime: DISABLE_PROTECTION_TIMINGS.TOMORROW,
|
||||||
|
},
|
||||||
|
];
|
||||||
|
|
||||||
|
const getDisableProtectionItems = () =>
|
||||||
|
Object.values(DISABLE_PROTECTION_ITEMS).map((item: any, index: any) => (
|
||||||
|
<div
|
||||||
|
key={`disable_timings_${index}`}
|
||||||
|
className="dropdown-item"
|
||||||
|
onClick={() => {
|
||||||
|
toggleProtection(protectionEnabled, item.disableTime - ONE_SECOND_IN_MS);
|
||||||
|
}}>
|
||||||
|
{item.text}
|
||||||
|
</div>
|
||||||
|
));
|
||||||
|
|
||||||
|
const getRemaningTimeText = (milliseconds: any) => {
|
||||||
|
if (!milliseconds) {
|
||||||
|
return '';
|
||||||
|
}
|
||||||
|
|
||||||
|
const date = new Date(milliseconds);
|
||||||
|
const hh = date.getUTCHours();
|
||||||
|
const mm = `0${date.getUTCMinutes()}`.slice(-2);
|
||||||
|
const ss = `0${date.getUTCSeconds()}`.slice(-2);
|
||||||
|
const formattedHH = `0${hh}`.slice(-2);
|
||||||
|
|
||||||
|
return hh ? `${formattedHH}:${mm}:${ss}` : `${mm}:${ss}`;
|
||||||
|
};
|
||||||
|
|
||||||
|
const getProtectionBtnText = (status: any) => (status ? t('disable_protection') : t('enable_protection'));
|
||||||
|
|
||||||
|
return (
|
||||||
|
<>
|
||||||
|
<PageTitle title={t('dashboard')} containerClass="page-title--dashboard">
|
||||||
|
<div className="page-title__protection">
|
||||||
|
<button
|
||||||
|
type="button"
|
||||||
|
className={buttonClass}
|
||||||
|
onClick={() => {
|
||||||
|
toggleProtection(protectionEnabled);
|
||||||
|
}}
|
||||||
|
disabled={processingProtection}>
|
||||||
|
{protectionDisabledDuration
|
||||||
|
? `${t('enable_protection_timer', { time: getRemaningTimeText(protectionDisabledDuration) })}`
|
||||||
|
: getProtectionBtnText(protectionEnabled)}
|
||||||
|
</button>
|
||||||
|
|
||||||
|
{protectionEnabled && (
|
||||||
|
<Dropdown
|
||||||
|
label=""
|
||||||
|
baseClassName="dropdown-protection"
|
||||||
|
icon="arrow-down"
|
||||||
|
controlClassName="dropdown-protection__toggle"
|
||||||
|
menuClassName="dropdown-menu dropdown-menu-arrow dropdown-menu--protection">
|
||||||
|
{getDisableProtectionItems()}
|
||||||
|
</Dropdown>
|
||||||
|
)}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<button type="button" className="btn btn-outline-primary btn-sm" onClick={getAllStats}>
|
||||||
|
<Trans>refresh_statics</Trans>
|
||||||
|
</button>
|
||||||
|
</PageTitle>
|
||||||
|
|
||||||
|
{statsProcessing && <Loading />}
|
||||||
|
|
||||||
|
{!statsProcessing && (
|
||||||
|
<div className="row row-cards dashboard">
|
||||||
|
<div className="col-lg-12">
|
||||||
|
{stats.interval === 0 && (
|
||||||
|
<div className="alert alert-warning" role="alert">
|
||||||
|
<Trans
|
||||||
|
components={[
|
||||||
|
<Link to={`${SETTINGS_URLS.settings}#stats-config`} key="0">
|
||||||
|
link
|
||||||
|
</Link>,
|
||||||
|
]}>
|
||||||
|
stats_disabled
|
||||||
|
</Trans>
|
||||||
|
</div>
|
||||||
|
)}
|
||||||
|
|
||||||
|
<Statistics
|
||||||
|
interval={msToDays(stats.interval)}
|
||||||
|
dnsQueries={stats.dnsQueries}
|
||||||
|
blockedFiltering={stats.blockedFiltering}
|
||||||
|
replacedSafebrowsing={stats.replacedSafebrowsing}
|
||||||
|
replacedParental={stats.replacedParental}
|
||||||
|
numDnsQueries={stats.numDnsQueries}
|
||||||
|
numBlockedFiltering={stats.numBlockedFiltering}
|
||||||
|
numReplacedSafebrowsing={stats.numReplacedSafebrowsing}
|
||||||
|
numReplacedParental={stats.numReplacedParental}
|
||||||
|
refreshButton={refreshButton}
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div className="col-lg-6">
|
||||||
|
<Counters subtitle={subtitle} refreshButton={refreshButton} />
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div className="col-lg-6">
|
||||||
|
<Clients subtitle={subtitle} refreshButton={refreshButton} />
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div className="col-lg-6">
|
||||||
|
<QueriedDomains
|
||||||
|
subtitle={subtitle}
|
||||||
|
dnsQueries={stats.numDnsQueries}
|
||||||
|
topQueriedDomains={stats.topQueriedDomains}
|
||||||
|
refreshButton={refreshButton}
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div className="col-lg-6">
|
||||||
|
<BlockedDomains
|
||||||
|
subtitle={subtitle}
|
||||||
|
topBlockedDomains={stats.topBlockedDomains}
|
||||||
|
blockedFiltering={stats.numBlockedFiltering}
|
||||||
|
replacedSafebrowsing={stats.numReplacedSafebrowsing}
|
||||||
|
replacedSafesearch={stats.numReplacedSafesearch}
|
||||||
|
replacedParental={stats.numReplacedParental}
|
||||||
|
refreshButton={refreshButton}
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div className="col-lg-6">
|
||||||
|
<UpstreamResponses
|
||||||
|
subtitle={subtitle}
|
||||||
|
topUpstreamsResponses={stats.topUpstreamsResponses}
|
||||||
|
refreshButton={refreshButton}
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div className="col-lg-6">
|
||||||
|
<UpstreamAvgTime
|
||||||
|
subtitle={subtitle}
|
||||||
|
topUpstreamsAvgTime={stats.topUpstreamsAvgTime}
|
||||||
|
refreshButton={refreshButton}
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
)}
|
||||||
|
</>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
export default Dashboard;
|
||||||
@@ -1,32 +0,0 @@
|
|||||||
import React from 'react';
|
|
||||||
import PropTypes from 'prop-types';
|
|
||||||
import { withTranslation, Trans } from 'react-i18next';
|
|
||||||
|
|
||||||
const Actions = ({
|
|
||||||
handleAdd, handleRefresh, processingRefreshFilters, whitelist,
|
|
||||||
}) => <div className="card-actions">
|
|
||||||
<button
|
|
||||||
className="btn btn-success btn-standard mr-2 btn-large mb-2"
|
|
||||||
type="submit"
|
|
||||||
onClick={handleAdd}
|
|
||||||
>
|
|
||||||
{whitelist ? <Trans>add_allowlist</Trans> : <Trans>add_blocklist</Trans>}
|
|
||||||
</button>
|
|
||||||
<button
|
|
||||||
className="btn btn-primary btn-standard mb-2"
|
|
||||||
type="submit"
|
|
||||||
onClick={handleRefresh}
|
|
||||||
disabled={processingRefreshFilters}
|
|
||||||
>
|
|
||||||
<Trans>check_updates_btn</Trans>
|
|
||||||
</button>
|
|
||||||
</div>;
|
|
||||||
|
|
||||||
Actions.propTypes = {
|
|
||||||
handleAdd: PropTypes.func.isRequired,
|
|
||||||
handleRefresh: PropTypes.func.isRequired,
|
|
||||||
processingRefreshFilters: PropTypes.bool.isRequired,
|
|
||||||
whitelist: PropTypes.bool,
|
|
||||||
};
|
|
||||||
|
|
||||||
export default withTranslation()(Actions);
|
|
||||||
27
client/src/components/Filters/Actions.tsx
Normal file
27
client/src/components/Filters/Actions.tsx
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
import React from 'react';
|
||||||
|
import { withTranslation, Trans } from 'react-i18next';
|
||||||
|
|
||||||
|
interface ActionsProps {
|
||||||
|
handleAdd: (...args: unknown[]) => unknown;
|
||||||
|
handleRefresh: (...args: unknown[]) => unknown;
|
||||||
|
processingRefreshFilters: boolean;
|
||||||
|
whitelist?: boolean;
|
||||||
|
}
|
||||||
|
|
||||||
|
const Actions = ({ handleAdd, handleRefresh, processingRefreshFilters, whitelist }: ActionsProps) => (
|
||||||
|
<div className="card-actions">
|
||||||
|
<button className="btn btn-success btn-standard mr-2 btn-large mb-2" type="submit" onClick={handleAdd}>
|
||||||
|
{whitelist ? <Trans>add_allowlist</Trans> : <Trans>add_blocklist</Trans>}
|
||||||
|
</button>
|
||||||
|
|
||||||
|
<button
|
||||||
|
className="btn btn-primary btn-standard mb-2"
|
||||||
|
type="submit"
|
||||||
|
onClick={handleRefresh}
|
||||||
|
disabled={processingRefreshFilters}>
|
||||||
|
<Trans>check_updates_btn</Trans>
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
|
||||||
|
export default withTranslation()(Actions);
|
||||||
@@ -15,10 +15,12 @@ import {
|
|||||||
getRulesToFilterList,
|
getRulesToFilterList,
|
||||||
} from '../../../helpers/helpers';
|
} from '../../../helpers/helpers';
|
||||||
import { BLOCK_ACTIONS, FILTERED, FILTERED_STATUS } from '../../../helpers/constants';
|
import { BLOCK_ACTIONS, FILTERED, FILTERED_STATUS } from '../../../helpers/constants';
|
||||||
import { toggleBlocking } from '../../../actions';
|
|
||||||
|
|
||||||
const renderBlockingButton = (isFiltered, domain) => {
|
import { toggleBlocking } from '../../../actions';
|
||||||
const processingRules = useSelector((state) => state.filtering.processingRules);
|
import { RootState } from '../../../initialState';
|
||||||
|
|
||||||
|
const renderBlockingButton = (isFiltered: any, domain: any) => {
|
||||||
|
const processingRules = useSelector((state: RootState) => state.filtering.processingRules);
|
||||||
const dispatch = useDispatch();
|
const dispatch = useDispatch();
|
||||||
const { t } = useTranslation();
|
const { t } = useTranslation();
|
||||||
|
|
||||||
@@ -28,28 +30,32 @@ const renderBlockingButton = (isFiltered, domain) => {
|
|||||||
await dispatch(toggleBlocking(buttonType, domain));
|
await dispatch(toggleBlocking(buttonType, domain));
|
||||||
};
|
};
|
||||||
|
|
||||||
const buttonClass = classNames('mt-3 button-action button-action--main button-action--active button-action--small', {
|
const buttonClass = classNames(
|
||||||
'button-action--unblock': isFiltered,
|
'mt-3 button-action button-action--main button-action--active button-action--small',
|
||||||
});
|
{
|
||||||
|
'button-action--unblock': isFiltered,
|
||||||
|
},
|
||||||
|
);
|
||||||
|
|
||||||
return <button type="button"
|
return (
|
||||||
className={buttonClass}
|
<button type="button" className={buttonClass} onClick={onClick} disabled={processingRules}>
|
||||||
onClick={onClick}
|
|
||||||
disabled={processingRules}
|
|
||||||
>
|
|
||||||
{t(buttonType)}
|
{t(buttonType)}
|
||||||
</button>;
|
</button>
|
||||||
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
const getTitle = () => {
|
const getTitle = () => {
|
||||||
const { t } = useTranslation();
|
const { t } = useTranslation();
|
||||||
|
|
||||||
const filters = useSelector((state) => state.filtering.filters, shallowEqual);
|
const filters = useSelector((state: RootState) => state.filtering.filters, shallowEqual);
|
||||||
const whitelistFilters = useSelector((state) => state.filtering.whitelistFilters, shallowEqual);
|
|
||||||
const rules = useSelector((state) => state.filtering.check.rules, shallowEqual);
|
|
||||||
const reason = useSelector((state) => state.filtering.check.reason);
|
|
||||||
|
|
||||||
const getReasonFiltered = (reason) => {
|
const whitelistFilters = useSelector((state: RootState) => state.filtering.whitelistFilters, shallowEqual);
|
||||||
|
|
||||||
|
const rules = useSelector((state: RootState) => state.filtering.check.rules, shallowEqual);
|
||||||
|
|
||||||
|
const reason = useSelector((state: RootState) => state.filtering.check.reason);
|
||||||
|
|
||||||
|
const getReasonFiltered = (reason: any) => {
|
||||||
const filterKey = reason.replace(FILTERED, '');
|
const filterKey = reason.replace(FILTERED, '');
|
||||||
return i18next.t('query_log_filtered', { filter: filterKey });
|
return i18next.t('query_log_filtered', { filter: filterKey });
|
||||||
};
|
};
|
||||||
@@ -71,24 +77,23 @@ const getTitle = () => {
|
|||||||
return REASON_TO_TITLE_MAP[reason];
|
return REASON_TO_TITLE_MAP[reason];
|
||||||
}
|
}
|
||||||
|
|
||||||
return <>
|
return (
|
||||||
<div>{t('check_reason', { reason })}</div>
|
<>
|
||||||
<div>
|
<div>{t('check_reason', { reason })}</div>
|
||||||
{t('rule_label')}:
|
|
||||||
|
<div>
|
||||||
{ruleAndFilterNames}
|
{t('rule_label')}:
|
||||||
</div>
|
{ruleAndFilterNames}
|
||||||
</>;
|
</div>
|
||||||
|
</>
|
||||||
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
const Info = () => {
|
const Info = () => {
|
||||||
const {
|
const { hostname, reason, service_name, cname, ip_addrs } = useSelector(
|
||||||
hostname,
|
(state: RootState) => state.filtering.check,
|
||||||
reason,
|
shallowEqual,
|
||||||
service_name,
|
);
|
||||||
cname,
|
|
||||||
ip_addrs,
|
|
||||||
} = useSelector((state) => state.filtering.check, shallowEqual);
|
|
||||||
const { t } = useTranslation();
|
const { t } = useTranslation();
|
||||||
|
|
||||||
const title = getTitle();
|
const title = getTitle();
|
||||||
@@ -99,23 +104,29 @@ const Info = () => {
|
|||||||
'logs__row--green': checkWhiteList(reason),
|
'logs__row--green': checkWhiteList(reason),
|
||||||
});
|
});
|
||||||
|
|
||||||
const onlyFiltered = checkSafeSearch(reason)
|
const onlyFiltered = checkSafeSearch(reason) || checkSafeBrowsing(reason) || checkParental(reason);
|
||||||
|| checkSafeBrowsing(reason)
|
|
||||||
|| checkParental(reason);
|
|
||||||
|
|
||||||
const isFiltered = checkFiltered(reason);
|
const isFiltered = checkFiltered(reason);
|
||||||
|
|
||||||
return <div className={className}>
|
return (
|
||||||
<div><strong>{hostname}</strong></div>
|
<div className={className}>
|
||||||
<div>{title}</div>
|
<div>
|
||||||
{!onlyFiltered
|
<strong>{hostname}</strong>
|
||||||
&& <>
|
</div>
|
||||||
{service_name && <div>{t('check_service', { service: service_name })}</div>}
|
|
||||||
{cname && <div>{t('check_cname', { cname })}</div>}
|
<div>{title}</div>
|
||||||
{ip_addrs && <div>{t('check_ip', { ip: ip_addrs.join(', ') })}</div>}
|
{!onlyFiltered && (
|
||||||
{renderBlockingButton(isFiltered, hostname)}
|
<>
|
||||||
</>}
|
{service_name && <div>{t('check_service', { service: service_name })}</div>}
|
||||||
</div>;
|
|
||||||
|
{cname && <div>{t('check_cname', { cname })}</div>}
|
||||||
|
|
||||||
|
{ip_addrs && <div>{t('check_ip', { ip: ip_addrs.join(', ') })}</div>}
|
||||||
|
{renderBlockingButton(isFiltered, hostname)}
|
||||||
|
</>
|
||||||
|
)}
|
||||||
|
</div>
|
||||||
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
export default Info;
|
export default Info;
|
||||||
@@ -1,66 +0,0 @@
|
|||||||
import React from 'react';
|
|
||||||
import PropTypes from 'prop-types';
|
|
||||||
import { useTranslation } from 'react-i18next';
|
|
||||||
import { Field, reduxForm } from 'redux-form';
|
|
||||||
import { useSelector } from 'react-redux';
|
|
||||||
import Card from '../../ui/Card';
|
|
||||||
import { renderInputField } from '../../../helpers/form';
|
|
||||||
import Info from './Info';
|
|
||||||
import { FORM_NAME } from '../../../helpers/constants';
|
|
||||||
|
|
||||||
const Check = (props) => {
|
|
||||||
const {
|
|
||||||
pristine,
|
|
||||||
invalid,
|
|
||||||
handleSubmit,
|
|
||||||
} = props;
|
|
||||||
|
|
||||||
const { t } = useTranslation();
|
|
||||||
|
|
||||||
const processingCheck = useSelector((state) => state.filtering.processingCheck);
|
|
||||||
const hostname = useSelector((state) => state.filtering.check.hostname);
|
|
||||||
|
|
||||||
return <Card
|
|
||||||
title={t('check_title')}
|
|
||||||
subtitle={t('check_desc')}
|
|
||||||
>
|
|
||||||
<form onSubmit={handleSubmit}>
|
|
||||||
<div className="row">
|
|
||||||
<div className="col-12 col-md-6">
|
|
||||||
<div className="input-group">
|
|
||||||
<Field
|
|
||||||
id="name"
|
|
||||||
name="name"
|
|
||||||
component={renderInputField}
|
|
||||||
type="text"
|
|
||||||
className="form-control"
|
|
||||||
placeholder={t('form_enter_host')}
|
|
||||||
/>
|
|
||||||
<span className="input-group-append">
|
|
||||||
<button
|
|
||||||
className="btn btn-success btn-standard btn-large"
|
|
||||||
type="submit"
|
|
||||||
onClick={handleSubmit}
|
|
||||||
disabled={pristine || invalid || processingCheck}
|
|
||||||
>
|
|
||||||
{t('check')}
|
|
||||||
</button>
|
|
||||||
</span>
|
|
||||||
</div>
|
|
||||||
{hostname && <>
|
|
||||||
<hr />
|
|
||||||
<Info />
|
|
||||||
</>}
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</form>
|
|
||||||
</Card>;
|
|
||||||
};
|
|
||||||
|
|
||||||
Check.propTypes = {
|
|
||||||
handleSubmit: PropTypes.func.isRequired,
|
|
||||||
pristine: PropTypes.bool.isRequired,
|
|
||||||
invalid: PropTypes.bool.isRequired,
|
|
||||||
};
|
|
||||||
|
|
||||||
export default reduxForm({ form: FORM_NAME.DOMAIN_CHECK })(Check);
|
|
||||||
82
client/src/components/Filters/Check/index.tsx
Normal file
82
client/src/components/Filters/Check/index.tsx
Normal file
@@ -0,0 +1,82 @@
|
|||||||
|
import React from 'react';
|
||||||
|
import { useTranslation } from 'react-i18next';
|
||||||
|
import { useSelector } from 'react-redux';
|
||||||
|
import { Controller, useForm } from 'react-hook-form';
|
||||||
|
|
||||||
|
import Card from '../../ui/Card';
|
||||||
|
import Info from './Info';
|
||||||
|
|
||||||
|
import { RootState } from '../../../initialState';
|
||||||
|
import { validateRequiredValue } from '../../../helpers/validators';
|
||||||
|
import { Input } from '../../ui/Controls/Input';
|
||||||
|
|
||||||
|
interface FormValues {
|
||||||
|
name: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
type Props = {
|
||||||
|
onSubmit?: (data: FormValues) => void;
|
||||||
|
};
|
||||||
|
|
||||||
|
const Check = ({ onSubmit }: Props) => {
|
||||||
|
const { t } = useTranslation();
|
||||||
|
|
||||||
|
const processingCheck = useSelector((state: RootState) => state.filtering.processingCheck);
|
||||||
|
const hostname = useSelector((state: RootState) => state.filtering.check.hostname);
|
||||||
|
|
||||||
|
const {
|
||||||
|
control,
|
||||||
|
handleSubmit,
|
||||||
|
formState: { isDirty, isValid },
|
||||||
|
} = useForm<FormValues>({
|
||||||
|
mode: 'onBlur',
|
||||||
|
defaultValues: {
|
||||||
|
name: '',
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
return (
|
||||||
|
<Card title={t('check_title')} subtitle={t('check_desc')}>
|
||||||
|
<form onSubmit={handleSubmit(onSubmit)}>
|
||||||
|
<div className="row">
|
||||||
|
<div className="col-12 col-md-6">
|
||||||
|
<Controller
|
||||||
|
name="name"
|
||||||
|
control={control}
|
||||||
|
rules={{ validate: validateRequiredValue }}
|
||||||
|
render={({ field, fieldState }) => (
|
||||||
|
<Input
|
||||||
|
{...field}
|
||||||
|
type="text"
|
||||||
|
data-testid="check_domain_name"
|
||||||
|
placeholder={t('form_enter_host')}
|
||||||
|
error={fieldState.error?.message}
|
||||||
|
rightAddon={
|
||||||
|
<span className="input-group-append">
|
||||||
|
<button
|
||||||
|
className="btn btn-success btn-standard btn-large"
|
||||||
|
type="submit"
|
||||||
|
data-testid="check_domain_submit"
|
||||||
|
disabled={!isDirty || !isValid || processingCheck}>
|
||||||
|
{t('check')}
|
||||||
|
</button>
|
||||||
|
</span>
|
||||||
|
}
|
||||||
|
/>
|
||||||
|
)}
|
||||||
|
/>
|
||||||
|
|
||||||
|
{hostname && (
|
||||||
|
<>
|
||||||
|
<hr />
|
||||||
|
<Info />
|
||||||
|
</>
|
||||||
|
)}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
</Card>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
export default Check;
|
||||||
@@ -1,32 +1,46 @@
|
|||||||
import React, { Component } from 'react';
|
import React, { Component } from 'react';
|
||||||
import PropTypes from 'prop-types';
|
|
||||||
import { Trans, withTranslation } from 'react-i18next';
|
import { Trans, withTranslation } from 'react-i18next';
|
||||||
|
|
||||||
import Card from '../ui/Card';
|
import Card from '../ui/Card';
|
||||||
|
|
||||||
import PageTitle from '../ui/PageTitle';
|
import PageTitle from '../ui/PageTitle';
|
||||||
|
|
||||||
import Examples from './Examples';
|
import Examples from './Examples';
|
||||||
|
|
||||||
import Check from './Check';
|
import Check from './Check';
|
||||||
|
|
||||||
import { getTextareaCommentsHighlight, syncScroll } from '../../helpers/highlightTextareaComments';
|
import { getTextareaCommentsHighlight, syncScroll } from '../../helpers/highlightTextareaComments';
|
||||||
import { COMMENT_LINE_DEFAULT_TOKEN } from '../../helpers/constants';
|
import { COMMENT_LINE_DEFAULT_TOKEN } from '../../helpers/constants';
|
||||||
import '../ui/texareaCommentsHighlight.css';
|
import '../ui/texareaCommentsHighlight.css';
|
||||||
|
import { FilteringData } from '../../initialState';
|
||||||
|
|
||||||
class CustomRules extends Component {
|
interface CustomRulesProps {
|
||||||
|
filtering: FilteringData;
|
||||||
|
setRules: (...args: unknown[]) => unknown;
|
||||||
|
checkHost: (...args: unknown[]) => string;
|
||||||
|
getFilteringStatus: (...args: unknown[]) => unknown;
|
||||||
|
handleRulesChange: (...args: unknown[]) => unknown;
|
||||||
|
t: (...args: unknown[]) => string;
|
||||||
|
}
|
||||||
|
|
||||||
|
class CustomRules extends Component<CustomRulesProps> {
|
||||||
ref = React.createRef();
|
ref = React.createRef();
|
||||||
|
|
||||||
componentDidMount() {
|
componentDidMount() {
|
||||||
this.props.getFilteringStatus();
|
this.props.getFilteringStatus();
|
||||||
}
|
}
|
||||||
|
|
||||||
handleChange = (e) => {
|
handleChange = (e: any) => {
|
||||||
const { value } = e.currentTarget;
|
const { value } = e.currentTarget;
|
||||||
this.handleRulesChange(value);
|
this.handleRulesChange(value);
|
||||||
};
|
};
|
||||||
|
|
||||||
handleSubmit = (e) => {
|
handleSubmit = (e: any) => {
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
this.handleRulesSubmit();
|
this.handleRulesSubmit();
|
||||||
};
|
};
|
||||||
|
|
||||||
handleRulesChange = (value) => {
|
handleRulesChange = (value: any) => {
|
||||||
this.props.handleRulesChange({ userRules: value });
|
this.props.handleRulesChange({ userRules: value });
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -34,23 +48,22 @@ class CustomRules extends Component {
|
|||||||
this.props.setRules(this.props.filtering.userRules);
|
this.props.setRules(this.props.filtering.userRules);
|
||||||
};
|
};
|
||||||
|
|
||||||
handleCheck = (values) => {
|
handleCheck = (values: any) => {
|
||||||
this.props.checkHost(values);
|
this.props.checkHost(values);
|
||||||
};
|
};
|
||||||
|
|
||||||
onScroll = (e) => syncScroll(e, this.ref)
|
onScroll = (e: any) => syncScroll(e, this.ref);
|
||||||
|
|
||||||
render() {
|
render() {
|
||||||
const {
|
const {
|
||||||
t,
|
t,
|
||||||
filtering: {
|
filtering: { userRules },
|
||||||
userRules,
|
|
||||||
},
|
|
||||||
} = this.props;
|
} = this.props;
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
<PageTitle title={t('custom_filtering_rules')} />
|
<PageTitle title={t('custom_filtering_rules')} />
|
||||||
|
|
||||||
<Card subtitle={t('custom_filter_rules_hint')}>
|
<Card subtitle={t('custom_filter_rules_hint')}>
|
||||||
<form onSubmit={this.handleSubmit}>
|
<form onSubmit={this.handleSubmit}>
|
||||||
<div className="text-edit-container mb-4">
|
<div className="text-edit-container mb-4">
|
||||||
@@ -60,39 +73,31 @@ class CustomRules extends Component {
|
|||||||
onChange={this.handleChange}
|
onChange={this.handleChange}
|
||||||
onScroll={this.onScroll}
|
onScroll={this.onScroll}
|
||||||
/>
|
/>
|
||||||
{getTextareaCommentsHighlight(
|
{getTextareaCommentsHighlight(this.ref, userRules, [
|
||||||
this.ref,
|
COMMENT_LINE_DEFAULT_TOKEN,
|
||||||
userRules,
|
'!',
|
||||||
undefined,
|
])}
|
||||||
[COMMENT_LINE_DEFAULT_TOKEN, '!'],
|
|
||||||
)}
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div className="card-actions">
|
<div className="card-actions">
|
||||||
<button
|
<button
|
||||||
className="btn btn-success btn-standard btn-large"
|
className="btn btn-success btn-standard btn-large"
|
||||||
type="submit"
|
type="submit"
|
||||||
onClick={this.handleSubmit}
|
onClick={this.handleSubmit}>
|
||||||
>
|
|
||||||
<Trans>apply_btn</Trans>
|
<Trans>apply_btn</Trans>
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
</form>
|
</form>
|
||||||
|
|
||||||
<hr />
|
<hr />
|
||||||
|
|
||||||
<Examples />
|
<Examples />
|
||||||
</Card>
|
</Card>
|
||||||
|
|
||||||
<Check onSubmit={this.handleCheck} />
|
<Check onSubmit={this.handleCheck} />
|
||||||
</>
|
</>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
CustomRules.propTypes = {
|
|
||||||
filtering: PropTypes.object.isRequired,
|
|
||||||
setRules: PropTypes.func.isRequired,
|
|
||||||
checkHost: PropTypes.func.isRequired,
|
|
||||||
getFilteringStatus: PropTypes.func.isRequired,
|
|
||||||
handleRulesChange: PropTypes.func.isRequired,
|
|
||||||
t: PropTypes.func.isRequired,
|
|
||||||
};
|
|
||||||
|
|
||||||
export default withTranslation()(CustomRules);
|
export default withTranslation()(CustomRules);
|
||||||
@@ -1,5 +1,4 @@
|
|||||||
import React, { Component } from 'react';
|
import React, { Component } from 'react';
|
||||||
import PropTypes from 'prop-types';
|
|
||||||
import { withTranslation } from 'react-i18next';
|
import { withTranslation } from 'react-i18next';
|
||||||
|
|
||||||
import PageTitle from '../ui/PageTitle';
|
import PageTitle from '../ui/PageTitle';
|
||||||
@@ -9,15 +8,41 @@ import Actions from './Actions';
|
|||||||
import Table from './Table';
|
import Table from './Table';
|
||||||
|
|
||||||
import { MODAL_TYPE } from '../../helpers/constants';
|
import { MODAL_TYPE } from '../../helpers/constants';
|
||||||
|
|
||||||
import { getCurrentFilter } from '../../helpers/helpers';
|
import { getCurrentFilter } from '../../helpers/helpers';
|
||||||
|
|
||||||
class DnsAllowlist extends Component {
|
interface DnsAllowlistProps {
|
||||||
|
getFilteringStatus: (...args: unknown[]) => unknown;
|
||||||
|
filtering: {
|
||||||
|
modalType: string;
|
||||||
|
modalFilterUrl: string;
|
||||||
|
isModalOpen: boolean;
|
||||||
|
isFilterAdded: boolean;
|
||||||
|
processingRefreshFilters: boolean;
|
||||||
|
processingRemoveFilter: boolean;
|
||||||
|
processingAddFilter: boolean;
|
||||||
|
processingConfigFilter: boolean;
|
||||||
|
processingFilters: boolean;
|
||||||
|
whitelistFilters: any[];
|
||||||
|
};
|
||||||
|
removeFilter: (...args: unknown[]) => unknown;
|
||||||
|
toggleFilterStatus: (...args: unknown[]) => unknown;
|
||||||
|
addFilter: (...args: unknown[]) => unknown;
|
||||||
|
toggleFilteringModal: (...args: unknown[]) => unknown;
|
||||||
|
handleRulesChange: (...args: unknown[]) => unknown;
|
||||||
|
refreshFilters: (...args: unknown[]) => unknown;
|
||||||
|
editFilter: (...args: unknown[]) => unknown;
|
||||||
|
t: (...args: unknown[]) => string;
|
||||||
|
}
|
||||||
|
|
||||||
|
class DnsAllowlist extends Component<DnsAllowlistProps> {
|
||||||
componentDidMount() {
|
componentDidMount() {
|
||||||
this.props.getFilteringStatus();
|
this.props.getFilteringStatus();
|
||||||
}
|
}
|
||||||
|
|
||||||
handleSubmit = (values) => {
|
handleSubmit = (values: any) => {
|
||||||
const { name, url } = values;
|
const { name, url } = values;
|
||||||
|
|
||||||
const { filtering } = this.props;
|
const { filtering } = this.props;
|
||||||
const whitelist = true;
|
const whitelist = true;
|
||||||
|
|
||||||
@@ -28,15 +53,17 @@ class DnsAllowlist extends Component {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
handleDelete = (url) => {
|
handleDelete = (url: any) => {
|
||||||
if (window.confirm(this.props.t('list_confirm_delete'))) {
|
if (window.confirm(this.props.t('list_confirm_delete'))) {
|
||||||
const whitelist = true;
|
const whitelist = true;
|
||||||
|
|
||||||
this.props.removeFilter(url, whitelist);
|
this.props.removeFilter(url, whitelist);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
toggleFilter = (url, data) => {
|
toggleFilter = (url: any, data: any) => {
|
||||||
const whitelist = true;
|
const whitelist = true;
|
||||||
|
|
||||||
this.props.toggleFilterStatus(url, data, whitelist);
|
this.props.toggleFilterStatus(url, data, whitelist);
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -53,7 +80,6 @@ class DnsAllowlist extends Component {
|
|||||||
t,
|
t,
|
||||||
toggleFilteringModal,
|
toggleFilteringModal,
|
||||||
addFilter,
|
addFilter,
|
||||||
toggleFilterStatus,
|
|
||||||
filtering: {
|
filtering: {
|
||||||
whitelistFilters,
|
whitelistFilters,
|
||||||
isModalOpen,
|
isModalOpen,
|
||||||
@@ -68,19 +94,18 @@ class DnsAllowlist extends Component {
|
|||||||
},
|
},
|
||||||
} = this.props;
|
} = this.props;
|
||||||
const currentFilterData = getCurrentFilter(modalFilterUrl, whitelistFilters);
|
const currentFilterData = getCurrentFilter(modalFilterUrl, whitelistFilters);
|
||||||
const loading = processingConfigFilter
|
const loading =
|
||||||
|| processingFilters
|
processingConfigFilter ||
|
||||||
|| processingAddFilter
|
processingFilters ||
|
||||||
|| processingRemoveFilter
|
processingAddFilter ||
|
||||||
|| processingRefreshFilters;
|
processingRemoveFilter ||
|
||||||
|
processingRefreshFilters;
|
||||||
|
|
||||||
const whitelist = true;
|
const whitelist = true;
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
<PageTitle
|
<PageTitle title={t('dns_allowlists')} subtitle={t('dns_allowlists_desc')} />
|
||||||
title={t('dns_allowlists')}
|
|
||||||
subtitle={t('dns_allowlists_desc')}
|
|
||||||
/>
|
|
||||||
<div className="content">
|
<div className="content">
|
||||||
<div className="row">
|
<div className="row">
|
||||||
<div className="col-md-12">
|
<div className="col-md-12">
|
||||||
@@ -90,11 +115,11 @@ class DnsAllowlist extends Component {
|
|||||||
loading={loading}
|
loading={loading}
|
||||||
processingConfigFilter={processingConfigFilter}
|
processingConfigFilter={processingConfigFilter}
|
||||||
toggleFilteringModal={toggleFilteringModal}
|
toggleFilteringModal={toggleFilteringModal}
|
||||||
toggleFilterStatus={toggleFilterStatus}
|
|
||||||
handleDelete={this.handleDelete}
|
handleDelete={this.handleDelete}
|
||||||
toggleFilter={this.toggleFilter}
|
toggleFilter={this.toggleFilter}
|
||||||
whitelist={whitelist}
|
whitelist={whitelist}
|
||||||
/>
|
/>
|
||||||
|
|
||||||
<Actions
|
<Actions
|
||||||
handleAdd={this.openAddFiltersModal}
|
handleAdd={this.openAddFiltersModal}
|
||||||
handleRefresh={this.handleRefresh}
|
handleRefresh={this.handleRefresh}
|
||||||
@@ -105,6 +130,7 @@ class DnsAllowlist extends Component {
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<Modal
|
<Modal
|
||||||
filters={whitelistFilters}
|
filters={whitelistFilters}
|
||||||
isOpen={isModalOpen}
|
isOpen={isModalOpen}
|
||||||
@@ -123,17 +149,4 @@ class DnsAllowlist extends Component {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
DnsAllowlist.propTypes = {
|
|
||||||
getFilteringStatus: PropTypes.func.isRequired,
|
|
||||||
filtering: PropTypes.object.isRequired,
|
|
||||||
removeFilter: PropTypes.func.isRequired,
|
|
||||||
toggleFilterStatus: PropTypes.func.isRequired,
|
|
||||||
addFilter: PropTypes.func.isRequired,
|
|
||||||
toggleFilteringModal: PropTypes.func.isRequired,
|
|
||||||
handleRulesChange: PropTypes.func.isRequired,
|
|
||||||
refreshFilters: PropTypes.func.isRequired,
|
|
||||||
editFilter: PropTypes.func.isRequired,
|
|
||||||
t: PropTypes.func.isRequired,
|
|
||||||
};
|
|
||||||
|
|
||||||
export default withTranslation()(DnsAllowlist);
|
export default withTranslation()(DnsAllowlist);
|
||||||
@@ -1,27 +1,38 @@
|
|||||||
import React, { Component } from 'react';
|
import React, { Component } from 'react';
|
||||||
import PropTypes from 'prop-types';
|
|
||||||
import { withTranslation } from 'react-i18next';
|
import { withTranslation } from 'react-i18next';
|
||||||
|
|
||||||
import PageTitle from '../ui/PageTitle';
|
import PageTitle from '../ui/PageTitle';
|
||||||
|
|
||||||
import Card from '../ui/Card';
|
import Card from '../ui/Card';
|
||||||
import Modal from './Modal';
|
import Modal from './Modal';
|
||||||
import Actions from './Actions';
|
import Actions from './Actions';
|
||||||
|
|
||||||
import Table from './Table';
|
import Table from './Table';
|
||||||
import { MODAL_TYPE } from '../../helpers/constants';
|
import { MODAL_TYPE } from '../../helpers/constants';
|
||||||
|
|
||||||
import {
|
import { getCurrentFilter } from '../../helpers/helpers';
|
||||||
getCurrentFilter,
|
|
||||||
} from '../../helpers/helpers';
|
|
||||||
|
|
||||||
import filtersCatalog from '../../helpers/filters/filters';
|
import filtersCatalog from '../../helpers/filters/filters';
|
||||||
|
import { FilteringData } from '../../initialState';
|
||||||
|
|
||||||
class DnsBlocklist extends Component {
|
interface DnsBlocklistProps {
|
||||||
|
getFilteringStatus: (...args: unknown[]) => unknown;
|
||||||
|
filtering: FilteringData;
|
||||||
|
removeFilter: (...args: unknown[]) => unknown;
|
||||||
|
toggleFilterStatus: (...args: unknown[]) => unknown;
|
||||||
|
addFilter: (...args: unknown[]) => unknown;
|
||||||
|
toggleFilteringModal: (...args: unknown[]) => unknown;
|
||||||
|
handleRulesChange: (...args: unknown[]) => unknown;
|
||||||
|
refreshFilters: (...args: unknown[]) => unknown;
|
||||||
|
editFilter: (...args: unknown[]) => unknown;
|
||||||
|
t: (...args: unknown[]) => string;
|
||||||
|
}
|
||||||
|
|
||||||
|
class DnsBlocklist extends Component<DnsBlocklistProps> {
|
||||||
componentDidMount() {
|
componentDidMount() {
|
||||||
this.props.getFilteringStatus();
|
this.props.getFilteringStatus();
|
||||||
}
|
}
|
||||||
|
|
||||||
handleSubmit = (values) => {
|
handleSubmit = (values: any) => {
|
||||||
const { modalFilterUrl, modalType } = this.props.filtering;
|
const { modalFilterUrl, modalType } = this.props.filtering;
|
||||||
|
|
||||||
switch (modalType) {
|
switch (modalType) {
|
||||||
@@ -30,23 +41,25 @@ class DnsBlocklist extends Component {
|
|||||||
break;
|
break;
|
||||||
case MODAL_TYPE.ADD_FILTERS: {
|
case MODAL_TYPE.ADD_FILTERS: {
|
||||||
const { name, url } = values;
|
const { name, url } = values;
|
||||||
|
|
||||||
this.props.addFilter(url, name);
|
this.props.addFilter(url, name);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case MODAL_TYPE.CHOOSE_FILTERING_LIST: {
|
case MODAL_TYPE.CHOOSE_FILTERING_LIST: {
|
||||||
const changedValues = Object.entries(values)?.reduce((acc, [key, value]) => {
|
const changedValues = Object.entries(values)?.reduce((acc: any, [key, value]) => {
|
||||||
if (value && key in filtersCatalog.filters) {
|
if (value && key in filtersCatalog.filters) {
|
||||||
acc[key] = value;
|
acc[key] = value;
|
||||||
}
|
}
|
||||||
return acc;
|
return acc;
|
||||||
}, {});
|
}, {});
|
||||||
|
|
||||||
Object.keys(changedValues)
|
Object.keys(changedValues).forEach((fieldName) => {
|
||||||
.forEach((fieldName) => {
|
// filterId is actually in the field name
|
||||||
// filterId is actually in the field name
|
|
||||||
const { source, name } = filtersCatalog.filters[fieldName];
|
const { source, name } = filtersCatalog.filters[fieldName];
|
||||||
this.props.addFilter(source, name);
|
|
||||||
});
|
this.props.addFilter(source, name);
|
||||||
|
});
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
@@ -54,13 +67,13 @@ class DnsBlocklist extends Component {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
handleDelete = (url) => {
|
handleDelete = (url: any) => {
|
||||||
if (window.confirm(this.props.t('list_confirm_delete'))) {
|
if (window.confirm(this.props.t('list_confirm_delete'))) {
|
||||||
this.props.removeFilter(url);
|
this.props.removeFilter(url);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
toggleFilter = (url, data) => {
|
toggleFilter = (url: any, data: any) => {
|
||||||
this.props.toggleFilterStatus(url, data);
|
this.props.toggleFilterStatus(url, data);
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -75,8 +88,11 @@ class DnsBlocklist extends Component {
|
|||||||
render() {
|
render() {
|
||||||
const {
|
const {
|
||||||
t,
|
t,
|
||||||
|
|
||||||
toggleFilteringModal,
|
toggleFilteringModal,
|
||||||
|
|
||||||
addFilter,
|
addFilter,
|
||||||
|
|
||||||
filtering: {
|
filtering: {
|
||||||
filters,
|
filters,
|
||||||
isModalOpen,
|
isModalOpen,
|
||||||
@@ -91,18 +107,17 @@ class DnsBlocklist extends Component {
|
|||||||
},
|
},
|
||||||
} = this.props;
|
} = this.props;
|
||||||
const currentFilterData = getCurrentFilter(modalFilterUrl, filters);
|
const currentFilterData = getCurrentFilter(modalFilterUrl, filters);
|
||||||
const loading = processingConfigFilter
|
const loading =
|
||||||
|| processingFilters
|
processingConfigFilter ||
|
||||||
|| processingAddFilter
|
processingFilters ||
|
||||||
|| processingRemoveFilter
|
processingAddFilter ||
|
||||||
|| processingRefreshFilters;
|
processingRemoveFilter ||
|
||||||
|
processingRefreshFilters;
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
<PageTitle
|
<PageTitle title={t('dns_blocklists')} subtitle={t('dns_blocklists_desc')} />
|
||||||
title={t('dns_blocklists')}
|
|
||||||
subtitle={t('dns_blocklists_desc')}
|
|
||||||
/>
|
|
||||||
<div className="content">
|
<div className="content">
|
||||||
<div className="row">
|
<div className="row">
|
||||||
<div className="col-md-12">
|
<div className="col-md-12">
|
||||||
@@ -115,6 +130,7 @@ class DnsBlocklist extends Component {
|
|||||||
handleDelete={this.handleDelete}
|
handleDelete={this.handleDelete}
|
||||||
toggleFilter={this.toggleFilter}
|
toggleFilter={this.toggleFilter}
|
||||||
/>
|
/>
|
||||||
|
|
||||||
<Actions
|
<Actions
|
||||||
handleAdd={this.openSelectTypeModal}
|
handleAdd={this.openSelectTypeModal}
|
||||||
handleRefresh={this.handleRefresh}
|
handleRefresh={this.handleRefresh}
|
||||||
@@ -124,6 +140,7 @@ class DnsBlocklist extends Component {
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<Modal
|
<Modal
|
||||||
filtersCatalog={filtersCatalog}
|
filtersCatalog={filtersCatalog}
|
||||||
filters={filters}
|
filters={filters}
|
||||||
@@ -142,17 +159,4 @@ class DnsBlocklist extends Component {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
DnsBlocklist.propTypes = {
|
|
||||||
getFilteringStatus: PropTypes.func.isRequired,
|
|
||||||
filtering: PropTypes.object.isRequired,
|
|
||||||
removeFilter: PropTypes.func.isRequired,
|
|
||||||
toggleFilterStatus: PropTypes.func.isRequired,
|
|
||||||
addFilter: PropTypes.func.isRequired,
|
|
||||||
toggleFilteringModal: PropTypes.func.isRequired,
|
|
||||||
handleRulesChange: PropTypes.func.isRequired,
|
|
||||||
refreshFilters: PropTypes.func.isRequired,
|
|
||||||
editFilter: PropTypes.func.isRequired,
|
|
||||||
t: PropTypes.func.isRequired,
|
|
||||||
};
|
|
||||||
|
|
||||||
export default withTranslation()(DnsBlocklist);
|
export default withTranslation()(DnsBlocklist);
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user