mirror of
https://github.com/AdguardTeam/AdGuardHome.git
synced 2024-11-21 20:45:33 +03:00
all: sync with master; upd chlog
This commit is contained in:
parent
3be7676970
commit
7b93f5d7cf
306 changed files with 19770 additions and 4916 deletions
2
.github/workflows/build.yml
vendored
2
.github/workflows/build.yml
vendored
|
@ -1,7 +1,7 @@
|
|||
'name': 'build'
|
||||
|
||||
'env':
|
||||
'GO_VERSION': '1.20.7'
|
||||
'GO_VERSION': '1.20.8'
|
||||
'NODE_VERSION': '14'
|
||||
|
||||
'on':
|
||||
|
|
2
.github/workflows/lint.yml
vendored
2
.github/workflows/lint.yml
vendored
|
@ -1,7 +1,7 @@
|
|||
'name': 'lint'
|
||||
|
||||
'env':
|
||||
'GO_VERSION': '1.20.7'
|
||||
'GO_VERSION': '1.20.8'
|
||||
|
||||
'on':
|
||||
'push':
|
||||
|
|
|
@ -835,7 +835,7 @@ Request:
|
|||
Response:
|
||||
|
||||
200 OK
|
||||
|
||||
|
||||
### API: Validate TLS configuration
|
||||
|
||||
Request:
|
||||
|
@ -2008,7 +2008,7 @@ Request:
|
|||
Response:
|
||||
|
||||
200 OK
|
||||
|
||||
|
||||
DOH plist file
|
||||
|
||||
## API: Get DNS over TLS .mobileconfig
|
||||
|
|
187
CHANGELOG.md
187
CHANGELOG.md
|
@ -14,11 +14,11 @@ and this project adheres to
|
|||
<!--
|
||||
## [v0.108.0] - TBA
|
||||
|
||||
## [v0.107.37] - 2023-08-16 (APPROX.)
|
||||
## [v0.107.38] - 2023-09-20 (APPROX.)
|
||||
|
||||
See also the [v0.107.37 GitHub milestone][ms-v0.107.37].
|
||||
See also the [v0.107.38 GitHub milestone][ms-v0.107.38].
|
||||
|
||||
[ms-v0.107.37]: https://github.com/AdguardTeam/AdGuardHome/milestone/72?closed=1
|
||||
[ms-v0.107.38]: https://github.com/AdguardTeam/AdGuardHome/milestone/73?closed=1
|
||||
|
||||
NOTE: Add new changes BELOW THIS COMMENT.
|
||||
-->
|
||||
|
@ -29,6 +29,174 @@ NOTE: Add new changes ABOVE THIS COMMENT.
|
|||
|
||||
|
||||
|
||||
## [v0.107.37] - 2023-09-07
|
||||
|
||||
See also the [v0.107.37 GitHub milestone][ms-v0.107.37].
|
||||
|
||||
### Security
|
||||
|
||||
- Go version has been updated to prevent the possibility of exploiting the
|
||||
CVE-2023-39318, CVE-2023-39319, and CVE-2023-39320 Go vulnerabilities fixed in
|
||||
[Go 1.20.8][go-1.20.8].
|
||||
|
||||
### Added
|
||||
|
||||
- AdBlock-style syntax support for ignored domains in logs and statistics
|
||||
([#5720]).
|
||||
- [`Strict-Transport-Security`][hsts] header in the HTTP API and DNS-over-HTTPS
|
||||
responses when HTTPS is forced ([#2998]). See [RFC 6797][rfc6797].
|
||||
- UI for the schedule of the service-blocking pause ([#951]).
|
||||
- IPv6 hints are now filtered in case IPv6 addresses resolving is disabled
|
||||
([#6122]).
|
||||
- The ability to set fallback DNS servers in the configuration file and the UI
|
||||
([#3701]).
|
||||
- While adding or updating blocklists, the title can now be parsed from
|
||||
`! Title:` definition of the blocklist's source ([#6020]).
|
||||
- The ability to filter DNS HTTPS records including IPv4 and IPv6 hints
|
||||
([#6053]).
|
||||
- Two new metrics showing total number of responses from each upstream DNS
|
||||
server and their average processing time in the Web UI ([#1453]).
|
||||
- The ability to set the port for the `pprof` debug API, see configuration
|
||||
changes below.
|
||||
|
||||
### Changed
|
||||
|
||||
- `$dnsrewrite` rules containing IPv4-mapped IPv6 addresses are now working
|
||||
consistently with legacy DNS rewrites and match the `AAAA` requests.
|
||||
- For non-A and non-AAAA requests, which has been filtered, the NODATA response
|
||||
is returned if the blocking mode isn't set to `Null IP`. In previous versions
|
||||
it returned NXDOMAIN response in such cases.
|
||||
|
||||
#### Configuration Changes
|
||||
|
||||
In this release, the schema version has changed from 24 to 27.
|
||||
|
||||
- Ignore rules blocking `.` in `querylog.ignored` and `statistics.ignored` have
|
||||
been migrated to AdBlock syntax (`|.^`). To rollback this change, restore the
|
||||
rules and change the `schema_version` back to `26`.
|
||||
|
||||
- Filtering-related settings have been moved from `dns` section of the YAML
|
||||
configuration file to the new section `filtering`:
|
||||
|
||||
```yaml
|
||||
# BEFORE:
|
||||
'dns':
|
||||
'filtering_enabled': true
|
||||
'filters_update_interval': 24
|
||||
'parental_enabled': false
|
||||
'safebrowsing_enabled': false
|
||||
'safebrowsing_cache_size': 1048576
|
||||
'safesearch_cache_size': 1048576
|
||||
'parental_cache_size': 1048576
|
||||
'safe_search':
|
||||
'enabled': false
|
||||
'bing': true
|
||||
'duckduckgo': true
|
||||
'google': true
|
||||
'pixabay': true
|
||||
'yandex': true
|
||||
'youtube': true
|
||||
'rewrites': []
|
||||
'blocked_services':
|
||||
'schedule':
|
||||
'time_zone': 'Local'
|
||||
'ids': []
|
||||
'protection_enabled': true,
|
||||
'blocking_mode': 'custom_ip',
|
||||
'blocking_ipv4': '1.2.3.4',
|
||||
'blocking_ipv6': '1:2:3::4',
|
||||
'blocked_response_ttl': 10,
|
||||
'protection_disabled_until': 'null',
|
||||
'parental_block_host': 'p.dns.adguard.com',
|
||||
'safebrowsing_block_host': 's.dns.adguard.com'
|
||||
|
||||
# AFTER:
|
||||
'filtering':
|
||||
'filtering_enabled': true
|
||||
'filters_update_interval': 24
|
||||
'parental_enabled': false
|
||||
'safebrowsing_enabled': false
|
||||
'safebrowsing_cache_size': 1048576
|
||||
'safesearch_cache_size': 1048576
|
||||
'parental_cache_size': 1048576
|
||||
'safe_search':
|
||||
'enabled': false
|
||||
'bing': true
|
||||
'duckduckgo': true
|
||||
'google': true
|
||||
'pixabay': true
|
||||
'yandex': true
|
||||
'youtube': true
|
||||
'rewrites': []
|
||||
'blocked_services':
|
||||
'schedule':
|
||||
'time_zone': 'Local'
|
||||
'ids': []
|
||||
'protection_enabled': true,
|
||||
'blocking_mode': 'custom_ip',
|
||||
'blocking_ipv4': '1.2.3.4',
|
||||
'blocking_ipv6': '1:2:3::4',
|
||||
'blocked_response_ttl': 10,
|
||||
'protection_disabled_until': 'null',
|
||||
'parental_block_host': 'p.dns.adguard.com',
|
||||
'safebrowsing_block_host': 's.dns.adguard.com',
|
||||
```
|
||||
|
||||
To rollback this change, remove the new object `filtering`, set back filtering
|
||||
properties in `dns` section, and change the `schema_version` back to `25`.
|
||||
|
||||
- Property `debug_pprof` which used to setup profiling HTTP handler, is now
|
||||
moved to the new `pprof` object under `http` section. The new object contains
|
||||
properties `enabled` and `port`:
|
||||
|
||||
```yaml
|
||||
# BEFORE:
|
||||
'debug_pprof': true
|
||||
|
||||
# AFTER:
|
||||
'http':
|
||||
'pprof':
|
||||
'enabled': true
|
||||
'port': 6060
|
||||
```
|
||||
|
||||
Note that the new default `6060` is used as default. To rollback this change,
|
||||
remove the new object `pprof`, set back `debug_pprof`, and change the
|
||||
`schema_version` back to `24`.
|
||||
|
||||
### Fixed
|
||||
|
||||
- Incorrect display date on statistics graph ([#5793]).
|
||||
- Missing query log entries and statistics on service restart ([#6100]).
|
||||
- Occasional DNS-over-QUIC and DNS-over-HTTP/3 errors ([#6133]).
|
||||
- Legacy DNS rewrites containing IPv4-mapped IPv6 addresses are now matching the
|
||||
`AAAA` requests, not `A` ([#6050]).
|
||||
- File log configuration, such as `max_size`, being ignored ([#6093]).
|
||||
- Panic on using a single-slash filtering rule.
|
||||
- Panic on shutting down while DNS requests are in process of filtering
|
||||
([#5948]).
|
||||
|
||||
[#1453]: https://github.com/AdguardTeam/AdGuardHome/issues/1453
|
||||
[#2998]: https://github.com/AdguardTeam/AdGuardHome/issues/2998
|
||||
[#3701]: https://github.com/AdguardTeam/AdGuardHome/issues/3701
|
||||
[#5720]: https://github.com/AdguardTeam/AdGuardHome/issues/5720
|
||||
[#5793]: https://github.com/AdguardTeam/AdGuardHome/issues/5793
|
||||
[#5948]: https://github.com/AdguardTeam/AdGuardHome/issues/5948
|
||||
[#6020]: https://github.com/AdguardTeam/AdGuardHome/issues/6020
|
||||
[#6050]: https://github.com/AdguardTeam/AdGuardHome/issues/6050
|
||||
[#6053]: https://github.com/AdguardTeam/AdGuardHome/issues/6053
|
||||
[#6093]: https://github.com/AdguardTeam/AdGuardHome/issues/6093
|
||||
[#6100]: https://github.com/AdguardTeam/AdGuardHome/issues/6100
|
||||
[#6122]: https://github.com/AdguardTeam/AdGuardHome/issues/6122
|
||||
[#6133]: https://github.com/AdguardTeam/AdGuardHome/issues/6133
|
||||
|
||||
[go-1.20.8]: https://groups.google.com/g/golang-announce/c/Fm51GRLNRvM/m/F5bwBlXMAQAJ
|
||||
[hsts]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Strict-Transport-Security
|
||||
[ms-v0.107.37]: https://github.com/AdguardTeam/AdGuardHome/milestone/72?closed=1
|
||||
[rfc6797]: https://datatracker.ietf.org/doc/html/rfc6797
|
||||
|
||||
|
||||
|
||||
## [v0.107.36] - 2023-08-02
|
||||
|
||||
See also the [v0.107.36 GitHub milestone][ms-v0.107.36].
|
||||
|
@ -539,7 +707,7 @@ In this release, the schema version has changed from 17 to 20.
|
|||
[#5701]: https://github.com/AdguardTeam/AdGuardHome/issues/5701
|
||||
|
||||
[ms-v0.107.28]: https://github.com/AdguardTeam/AdGuardHome/milestone/64?closed=1
|
||||
[rfc6761]: https://www.rfc-editor.org/rfc/rfc6761
|
||||
[rfc6761]: https://datatracker.ietf.org/doc/html/rfc6761
|
||||
|
||||
|
||||
|
||||
|
@ -627,7 +795,6 @@ See also the [v0.107.26 GitHub milestone][ms-v0.107.26].
|
|||
been relaxed to meet those from [RFC 3696][rfc3696] ([#4884]).
|
||||
- Failing service installation via script on FreeBSD ([#5431]).
|
||||
|
||||
[#1472]: https://github.com/AdguardTeam/AdGuardHome/issues/1472
|
||||
[#4884]: https://github.com/AdguardTeam/AdGuardHome/issues/4884
|
||||
[#5270]: https://github.com/AdguardTeam/AdGuardHome/issues/5270
|
||||
[#5281]: https://github.com/AdguardTeam/AdGuardHome/issues/5281
|
||||
|
@ -1246,7 +1413,6 @@ See also the [v0.107.10 GitHub milestone][ms-v0.107.10].
|
|||
[#4342]: https://github.com/AdguardTeam/AdGuardHome/issues/4342
|
||||
[#4358]: https://github.com/AdguardTeam/AdGuardHome/issues/4358
|
||||
[#4670]: https://github.com/AdguardTeam/AdGuardHome/issues/4670
|
||||
[#4836]: https://github.com/AdguardTeam/AdGuardHome/issues/4836
|
||||
[#4843]: https://github.com/AdguardTeam/AdGuardHome/issues/4843
|
||||
|
||||
[ddr-draft]: https://datatracker.ietf.org/doc/html/draft-ietf-add-ddr-08
|
||||
|
@ -1880,9 +2046,7 @@ In this release, the schema version has changed from 10 to 12.
|
|||
[#3558]: https://github.com/AdguardTeam/AdGuardHome/issues/3558
|
||||
[#3564]: https://github.com/AdguardTeam/AdGuardHome/issues/3564
|
||||
[#3567]: https://github.com/AdguardTeam/AdGuardHome/issues/3567
|
||||
[#3568]: https://github.com/AdguardTeam/AdGuardHome/issues/3568
|
||||
[#3579]: https://github.com/AdguardTeam/AdGuardHome/issues/3579
|
||||
[#3607]: https://github.com/AdguardTeam/AdGuardHome/issues/3607
|
||||
[#3638]: https://github.com/AdguardTeam/AdGuardHome/issues/3638
|
||||
[#3655]: https://github.com/AdguardTeam/AdGuardHome/issues/3655
|
||||
[#3707]: https://github.com/AdguardTeam/AdGuardHome/issues/3707
|
||||
|
@ -2300,11 +2464,12 @@ See also the [v0.104.2 GitHub milestone][ms-v0.104.2].
|
|||
|
||||
|
||||
<!--
|
||||
[Unreleased]: https://github.com/AdguardTeam/AdGuardHome/compare/v0.107.37...HEAD
|
||||
[v0.107.37]: https://github.com/AdguardTeam/AdGuardHome/compare/v0.107.36...v0.107.37
|
||||
[Unreleased]: https://github.com/AdguardTeam/AdGuardHome/compare/v0.107.38...HEAD
|
||||
[v0.107.38]: https://github.com/AdguardTeam/AdGuardHome/compare/v0.107.37...v0.107.38
|
||||
-->
|
||||
|
||||
[Unreleased]: https://github.com/AdguardTeam/AdGuardHome/compare/v0.107.36...HEAD
|
||||
[Unreleased]: https://github.com/AdguardTeam/AdGuardHome/compare/v0.107.37...HEAD
|
||||
[v0.107.37]: https://github.com/AdguardTeam/AdGuardHome/compare/v0.107.36...v0.107.37
|
||||
[v0.107.36]: https://github.com/AdguardTeam/AdGuardHome/compare/v0.107.35...v0.107.36
|
||||
[v0.107.35]: https://github.com/AdguardTeam/AdGuardHome/compare/v0.107.34...v0.107.35
|
||||
[v0.107.34]: https://github.com/AdguardTeam/AdGuardHome/compare/v0.107.33...v0.107.34
|
||||
|
|
|
@ -7,7 +7,7 @@
|
|||
# Make sure to sync any changes with the branch overrides below.
|
||||
'variables':
|
||||
'channel': 'edge'
|
||||
'dockerGo': 'adguard/golang-ubuntu:7.0'
|
||||
'dockerGo': 'adguard/golang-ubuntu:7.1'
|
||||
|
||||
'stages':
|
||||
- 'Build frontend':
|
||||
|
@ -272,7 +272,7 @@
|
|||
# need to build a few of these.
|
||||
'variables':
|
||||
'channel': 'beta'
|
||||
'dockerGo': 'adguard/golang-ubuntu:7.0'
|
||||
'dockerGo': 'adguard/golang-ubuntu:7.1'
|
||||
# release-vX.Y.Z branches are the branches from which the actual final
|
||||
# release is built.
|
||||
- '^release-v[0-9]+\.[0-9]+\.[0-9]+':
|
||||
|
@ -287,4 +287,4 @@
|
|||
# are the ones that actually get released.
|
||||
'variables':
|
||||
'channel': 'release'
|
||||
'dockerGo': 'adguard/golang-ubuntu:7.0'
|
||||
'dockerGo': 'adguard/golang-ubuntu:7.1'
|
||||
|
|
|
@ -10,7 +10,7 @@
|
|||
# Make sure to sync any changes with the branch overrides below.
|
||||
'variables':
|
||||
'channel': 'edge'
|
||||
'dockerGo': 'adguard/golang-ubuntu:7.0'
|
||||
'dockerGo': 'adguard/golang-ubuntu:7.1'
|
||||
'snapcraftChannel': 'edge'
|
||||
|
||||
'stages':
|
||||
|
@ -191,7 +191,7 @@
|
|||
# need to build a few of these.
|
||||
'variables':
|
||||
'channel': 'beta'
|
||||
'dockerGo': 'adguard/golang-ubuntu:7.0'
|
||||
'dockerGo': 'adguard/golang-ubuntu:7.1'
|
||||
'snapcraftChannel': 'beta'
|
||||
# release-vX.Y.Z branches are the branches from which the actual final
|
||||
# release is built.
|
||||
|
@ -207,5 +207,5 @@
|
|||
# are the ones that actually get released.
|
||||
'variables':
|
||||
'channel': 'release'
|
||||
'dockerGo': 'adguard/golang-ubuntu:7.0'
|
||||
'dockerGo': 'adguard/golang-ubuntu:7.1'
|
||||
'snapcraftChannel': 'candidate'
|
||||
|
|
|
@ -5,7 +5,7 @@
|
|||
'key': 'AHBRTSPECS'
|
||||
'name': 'AdGuard Home - Build and run tests'
|
||||
'variables':
|
||||
'dockerGo': 'adguard/golang-ubuntu:7.0'
|
||||
'dockerGo': 'adguard/golang-ubuntu:7.1'
|
||||
|
||||
'stages':
|
||||
- 'Tests':
|
||||
|
@ -14,6 +14,12 @@
|
|||
'jobs':
|
||||
- 'Test'
|
||||
|
||||
- 'Artifact':
|
||||
manual: false
|
||||
final: false
|
||||
jobs:
|
||||
- 'Artifact'
|
||||
|
||||
'Test':
|
||||
'docker':
|
||||
'image': '${bamboo.dockerGo}'
|
||||
|
@ -41,6 +47,53 @@
|
|||
'requirements':
|
||||
- 'adg-docker': 'true'
|
||||
|
||||
'Artifact':
|
||||
'docker':
|
||||
'image': '${bamboo.dockerGo}'
|
||||
'volumes':
|
||||
'${system.GO_CACHE_DIR}': '${bamboo.cacheGo}'
|
||||
'${system.GO_PKG_CACHE_DIR}': '${bamboo.cacheGoPkg}'
|
||||
'key': 'ART'
|
||||
'other':
|
||||
'clean-working-dir': true
|
||||
'tasks':
|
||||
- 'checkout':
|
||||
'force-clean-build': true
|
||||
- 'script':
|
||||
'interpreter': 'SHELL'
|
||||
'scripts':
|
||||
- |-
|
||||
#!/bin/sh
|
||||
|
||||
set -e -f -u -x
|
||||
|
||||
# Explicitly checkout the revision that we need.
|
||||
git checkout "${bamboo.repository.revision.number}"
|
||||
|
||||
make\
|
||||
ARCH="amd64"\
|
||||
OS="windows darwin linux"\
|
||||
CHANNEL="development"\
|
||||
SIGN=0\
|
||||
PARALLELISM=1\
|
||||
VERBOSE=2\
|
||||
build-release
|
||||
'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
|
||||
'requirements':
|
||||
- 'adg-docker': 'true'
|
||||
|
||||
'branches':
|
||||
'create': 'for-pull-request'
|
||||
'delete':
|
||||
|
|
15
client/.eslintrc.json
vendored
15
client/.eslintrc.json
vendored
|
@ -81,6 +81,19 @@
|
|||
}
|
||||
],
|
||||
"import/prefer-default-export": "off",
|
||||
"no-alert": "off"
|
||||
"no-alert": "off",
|
||||
"arrow-body-style": "off",
|
||||
"max-len": [
|
||||
"error",
|
||||
120,
|
||||
2,
|
||||
{
|
||||
"ignoreUrls": true,
|
||||
"ignoreComments": false,
|
||||
"ignoreRegExpLiterals": true,
|
||||
"ignoreStrings": true,
|
||||
"ignoreTemplateLiterals": true
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
|
|
2
client/dev.eslintrc
vendored
2
client/dev.eslintrc
vendored
|
@ -1,6 +1,6 @@
|
|||
{
|
||||
"extends": ".eslintrc",
|
||||
"rules": {
|
||||
"no-debugger":"warn",
|
||||
"no-debugger":"warn"
|
||||
}
|
||||
}
|
||||
|
|
5
client/package-lock.json
generated
vendored
5
client/package-lock.json
generated
vendored
|
@ -15094,6 +15094,11 @@
|
|||
"setimmediate": "^1.0.4"
|
||||
}
|
||||
},
|
||||
"timezones-list": {
|
||||
"version": "3.0.2",
|
||||
"resolved": "https://registry.npmjs.org/timezones-list/-/timezones-list-3.0.2.tgz",
|
||||
"integrity": "sha512-I698hm6Jp/xxkwyTSOr39pZkYKETL8LDJeSIhjxXBfPUAHM5oZNuQ4o9UK3PSkDBOkjATecSOBb3pR1IkIBUsg=="
|
||||
},
|
||||
"tiny-invariant": {
|
||||
"version": "1.1.0",
|
||||
"resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.1.0.tgz",
|
||||
|
|
1
client/package.json
vendored
1
client/package.json
vendored
|
@ -43,6 +43,7 @@
|
|||
"redux-form": "^8.3.5",
|
||||
"redux-thunk": "^2.3.0",
|
||||
"string-length": "^5.0.1",
|
||||
"timezones-list": "^3.0.2",
|
||||
"url-polyfill": "^1.1.9"
|
||||
},
|
||||
"devDependencies": {
|
||||
|
|
|
@ -7,7 +7,7 @@
|
|||
"load_balancing": "توزيع الحمل",
|
||||
"load_balancing_desc": "الاستعلام عن خادم واحد في كل مرة سيستخدم AdGuard الرئيسية الخوارزمية العشوائية الموزونة لاختيار الخادم بحيث يتم استخدام أسرع خادم في كثير من الأحيان",
|
||||
"bootstrap_dns": "خوادم Bootstrap DNS",
|
||||
"bootstrap_dns_desc": "يتم استخدام خوادم Bootstrap DNS لحل عناوين IP الخاصة بمحللات DoH / DoT التي تحددها على هيئة تدفقات.",
|
||||
"bootstrap_dns_desc": "عناوين IP لخوادم DNS المستخدمة لحل عناوين IP الخاصة بمحللات DoH/DoT التي تحددها كمصدرين رئيسيين. التعليقات غير مسموح بها.",
|
||||
"local_ptr_title": "خوادم DNS العكسية الخاصة",
|
||||
"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}}.",
|
||||
|
@ -125,6 +125,8 @@
|
|||
"top_clients": "كبار العملاء",
|
||||
"no_clients_found": "لم يتم العثور على عملاء",
|
||||
"general_statistics": "الإحصاءات العامة",
|
||||
"top_upstreams": "أعلى الخوادم upstream",
|
||||
"no_upstreams_data_found": "لم يتم العثور على بيانات خوادم upstream",
|
||||
"number_of_dns_query_days": "عدد استعلامات DNS التي تمت معالجتها لآخر {{count}} يوم",
|
||||
"number_of_dns_query_days_plural": "عدد استعلامات DNS التي تمت معالجتها لآخر {{count}} أيام",
|
||||
"number_of_dns_query_24_hours": "عدد استعلامات DNS التي تمت معالجتها لآخر 24 ساعة",
|
||||
|
@ -158,6 +160,7 @@
|
|||
"upstream_dns_configured_in_file": "تم اعداده في {{path}}",
|
||||
"test_upstream_btn": "اختبار upstream",
|
||||
"upstreams": "Upstreams",
|
||||
"upstream": "Upstream",
|
||||
"apply_btn": "تطبيق",
|
||||
"disabled_filtering_toast": "تم تعطيل الفلترة",
|
||||
"enabled_filtering_toast": "تم تمكين الفلترة",
|
||||
|
@ -212,6 +215,7 @@
|
|||
"example_upstream_udp": "regular DNS (over UDP, hostname);",
|
||||
"example_upstream_dot": "مشفر<0>DNS-over-TLS</0>;",
|
||||
"example_upstream_doh": "مشفر <0>DNS-over-HTTPS</0>;",
|
||||
"example_upstream_doh3": "DNS-over-HTTPS المشفر مع فرض <0> HTTP / 3</0> ولا يوجد رجوع إلى HTTP / 2 أو أقل ؛",
|
||||
"example_upstream_doq": "encrypted <0>DNS-over-QUIC</0>;",
|
||||
"example_upstream_sdns": "<0>DNS Stamps</0> for <1>DNSCrypt</1> or <2>DNS-over-HTTPS</2> resolvers;",
|
||||
"example_upstream_tcp": "regular DNS (over TCP);",
|
||||
|
@ -552,7 +556,7 @@
|
|||
"rewrite_A": "<0> A </0>: قيمة خاصة ، احتفظ بسجلات <0> A </0> من upstream",
|
||||
"rewrite_AAAA": "<0> AAAA </0>: قيمة خاصة ، احتفظ بسجلات <0> AAAA </0> من upstream",
|
||||
"disable_ipv6": "قم بتعطيل تحليل عناوين IPv6",
|
||||
"disable_ipv6_desc": "قم بإسقاط جميع استعلامات DNS لعناوين IPv6 (اكتب AAAA).",
|
||||
"disable_ipv6_desc": "قم بإسقاط كافة استعلامات DNS لعناوين IPv6 (اكتب AAAA) وقم بإزالة تلميحات IPv6 من استجابات HTTPS.",
|
||||
"fastest_addr": "أسرع عنوان IP",
|
||||
"fastest_addr_desc": "استعلم عن جميع خوادم DNS وأعد عنوان IP الأسرع بين جميع الاستجابات. يؤدي هذا إلى إبطاء استعلامات DNS حيث يتعين على AdGuard Home انتظار الاستجابات من جميع خوادم DNS ، ولكنه يحسن الاتصال الكلي.",
|
||||
"autofix_warning_text": "إذا قمت بالنقر فوق \"إصلاح\" ، فسيقوم AdGuard Home بتهيئة نظامك لاستخدام خادم AdGuard Home DNS.",
|
||||
|
@ -636,5 +640,12 @@
|
|||
"safe_browsing": "تصفح آمن",
|
||||
"served_from_cache": "{{value}} <i>(يتم تقديمه من ذاكرة التخزين المؤقت)</i>",
|
||||
"form_error_password_length": "يجب أن تتكون كلمة المرور من {{value}} من الأحرف على الأقل",
|
||||
"protection_section_label": "الحماية"
|
||||
"protection_section_label": "الحماية",
|
||||
"sunday_short": "الاحد",
|
||||
"monday_short": "الإثنين",
|
||||
"tuesday_short": "الثلاثاء",
|
||||
"wednesday_short": "الاربعاء",
|
||||
"thursday_short": "الخميس",
|
||||
"friday_short": "الجمعة",
|
||||
"saturday_short": "السبت"
|
||||
}
|
||||
|
|
|
@ -7,7 +7,10 @@
|
|||
"load_balancing": "Размеркаванне нагрузкі",
|
||||
"load_balancing_desc": "Запытвайце па адным серверы за раз. AdGuard Home будзе выкарыстоўваць выпадковы алгарытм для выбару сервера, так што самы хуткі сервер будзе выкарыстоўвацца часцей.",
|
||||
"bootstrap_dns": "Bootstrap DNS-серверы",
|
||||
"bootstrap_dns_desc": "Bootstrap DNS-серверы выкарыстоўваюцца для пошуку IP-адрасоў DoH/DoT сервераў, якія вы паказалі.",
|
||||
"bootstrap_dns_desc": "IP-адрасы DNS-сервераў, якія выкарыстоўваюцца для вырашэння IP-адрасоў распознавальнікаў DoH/DoT, якія вы ўказваеце ў якасці перадачы. Каментары не дапускаюцца.",
|
||||
"fallback_dns_title": "Рэзервовыя DNS-серверы",
|
||||
"fallback_dns_desc": "Спіс рэзервовых DNS-сервераў, якія выкарыстоўваюцца, калі вышэйшыя DNS-серверы не адказваюць. Сінтаксіс такі ж, як і ў галоўным полі ўверх.",
|
||||
"fallback_dns_placeholder": "Увядзіце па адным рэзервовым серверы DNS у радку",
|
||||
"local_ptr_title": "Прыватныя DNS-серверы",
|
||||
"local_ptr_desc": "DNS-серверы, якія AdGuard Home выкарыстоўвае для лакальных PTR-запытаў. Гэтыя серверы выкарыстоўваюцца, каб атрымаць даменавыя імёны кліентаў з прыватнымі IP-адрасамі, напрыклад «192.168.12.34», з дапамогай rDNS. Калі спіс пусты, AdGuard Home выкарыстоўвае прадвызначаныя DNS-серверы вашай АС.",
|
||||
"local_ptr_default_resolver": "Па змаўчанні AdGuard Home выкарыстоўвае наступныя зваротныя DNS-рэзолверы: {{ip}}.",
|
||||
|
@ -125,6 +128,8 @@
|
|||
"top_clients": "Частыя кліенты",
|
||||
"no_clients_found": "Кліентаў не знойдзена",
|
||||
"general_statistics": "Агульная статыстыка",
|
||||
"top_upstreams": "Часта запытаныя upstream серверы",
|
||||
"no_upstreams_data_found": "Няма дадзеных аб upstream серверах",
|
||||
"number_of_dns_query_days": "Колькасць DNS-запытаў за апошні {{count}} дзень",
|
||||
"number_of_dns_query_days_plural": "Колькасць DNS запытаў, апрацаваных за апошнія {{count}} дзён",
|
||||
"number_of_dns_query_24_hours": "Колькасць DNS-запытаў за 24 гадзіны",
|
||||
|
@ -134,6 +139,7 @@
|
|||
"enforced_save_search": "Ужыты бяспечны пошук",
|
||||
"number_of_dns_query_to_safe_search": "Колькасць запытаў DNS для пошукавых сістэм, для якіх быў ужыты Бяспечны пошук",
|
||||
"average_processing_time": "Сярэдні час апрацоўкі запыту",
|
||||
"processing_time": "Час апрацоўкі",
|
||||
"average_processing_time_hint": "Сярэдні час для апрацоўкі запыту DNS у мілісекундах",
|
||||
"block_domain_use_filters_and_hosts": "Блакаваць дамены з выкарыстаннем фільтраў і файлаў хастоў",
|
||||
"filters_block_toggle_hint": "Вы можаце наладзіць правілы блакавання ў «<a>Фільтрах</a>».",
|
||||
|
@ -158,6 +164,7 @@
|
|||
"upstream_dns_configured_in_file": "Наладжаны ў {{path}}",
|
||||
"test_upstream_btn": "Тэст upstream сервераў",
|
||||
"upstreams": "Upstreams",
|
||||
"upstream": "Upstream сервер",
|
||||
"apply_btn": "Ужыць",
|
||||
"disabled_filtering_toast": "Фільтрацыя выкл.",
|
||||
"enabled_filtering_toast": "Фільтрацыя ўкл.",
|
||||
|
@ -441,7 +448,7 @@
|
|||
"client_confirm_delete": "Вы ўпэўнены, што хочаце выдаліць кліента «{{key}}»?",
|
||||
"list_confirm_delete": "Вы ўпэўнены, што хочаце выдаліць гэты спіс?",
|
||||
"auto_clients_title": "Кліенты (runtime)",
|
||||
"auto_clients_desc": "Прылады, якіх няма ў спісе пастаянных кліентаў, якія ўсё яшчэ могуць выкарыстоўваць AdGuard Home",
|
||||
"auto_clients_desc": "Інфармацыя аб IP-адрасах прылад, якія выкарыстоўваюць або могуць выкарыстоўваць AdGuard Home. Гэтая інфармацыя збіраецца з некалькіх крыніц, уключаючы файлы хостаў, зваротны DNS і г.д.",
|
||||
"access_title": "Налады доступу",
|
||||
"access_desc": "Тут вы можаце наладзіць правілы доступу да DNS-серверу AdGuard Home",
|
||||
"access_allowed_title": "Дазволеныя кліенты",
|
||||
|
@ -557,7 +564,7 @@
|
|||
"rewrite_A": "<0>A</0>: адмысловае значэнне, захоўваць запісы <0>A</0> з сервера для выгрузкі даных",
|
||||
"rewrite_AAAA": "<0>AAAA</0>: адмысловае значэнне, захоўваць запісы <0>AAAA</0> з сервера для выгрузкі даных",
|
||||
"disable_ipv6": "Адключыць IPv6",
|
||||
"disable_ipv6_desc": "Калі гэта опцыя ўлучана, усе DNS-запыты адрасоў IPv6 (тып AAAA) будуць ігнаравацца.",
|
||||
"disable_ipv6_desc": "Ігнараваць усе запыты DNS для адрасоў IPv6 (тып AAAA) і выдаленне дадзеных IPv6 з адказаў тыпу HTTPS.",
|
||||
"fastest_addr": "Найхуткі IP-адрас",
|
||||
"fastest_addr_desc": "Апытайце ўсе DNS-серверы і вярніце самы хуткі IP-адрас сярод усіх адказаў. Гэта замарудзіць выкананне DNS-запытаў, бо нам давядзецца чакаць адказаў ад усіх DNS-сервераў, але палепшыць агульную ўзаемасувязь.",
|
||||
"autofix_warning_text": "Пры націску «Выправіць» AdGuard Home наладзіць вашу сістэму на выкарыстанне DNS-сервера AdGuard Home.",
|
||||
|
@ -645,5 +652,42 @@
|
|||
"confirm_dns_cache_clear": "Вы ўпэўнены, што хочаце ачысціць кэш DNS?",
|
||||
"cache_cleared": "Кэш DNS паспяхова ачышчаны",
|
||||
"clear_cache": "Ачысціць кэш",
|
||||
"protection_section_label": "Ахова"
|
||||
"theme_dark_desc": "Цёмная тэма",
|
||||
"theme_light_desc": "Светлая тэма",
|
||||
"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": "Нд.",
|
||||
"monday_short": "Пн.",
|
||||
"tuesday_short": "Аў.",
|
||||
"wednesday_short": "Ср.",
|
||||
"thursday_short": "Чц.",
|
||||
"friday_short": "Пт.",
|
||||
"saturday_short": "Сб."
|
||||
}
|
||||
|
|
|
@ -265,7 +265,7 @@
|
|||
"domain": "Домейн",
|
||||
"ecs": "ECS",
|
||||
"statistics_clear": "Нулирай статистиката",
|
||||
"disabled": "Деактивиран",
|
||||
"disabled": "Изключен",
|
||||
"username_label": "Потребител",
|
||||
"username_placeholder": "Въведете потребител",
|
||||
"password_label": "Парола",
|
||||
|
|
|
@ -7,12 +7,15 @@
|
|||
"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.",
|
||||
"bootstrap_dns": "Bootstrap DNS servery",
|
||||
"bootstrap_dns_desc": "Servery Bootstrap DNS se používají k řešení IP adres DoH/DoT, které zadáváte jako upstreamy.",
|
||||
"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_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",
|
||||
"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_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_placeholder": "Zadejte jednu adresu serveru na řádek",
|
||||
"local_ptr_placeholder": "Zadejte jednu IP adresu na řádek",
|
||||
"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).",
|
||||
"use_private_ptr_resolvers_title": "Použít soukromé reverzní rDNS řešitele",
|
||||
|
@ -125,6 +128,8 @@
|
|||
"top_clients": "Nejčastější klienti",
|
||||
"no_clients_found": "Nenalezeny žádní klienti",
|
||||
"general_statistics": "Obecné statistiky",
|
||||
"top_upstreams": "Top odchozí připojení",
|
||||
"no_upstreams_data_found": "Nebyla nalezena žádná data odchozích připojení",
|
||||
"number_of_dns_query_days": "Počet DNS dotazů zpracovaných za posledních {{count}} den",
|
||||
"number_of_dns_query_days_plural": "Počet DNS dotazů zpracovaných za posledních {{count}} dní",
|
||||
"number_of_dns_query_24_hours": "Počet DNS dotazů zpracovaných za posledních 24 hodin",
|
||||
|
@ -134,6 +139,7 @@
|
|||
"enforced_save_search": "Vynucené bezpečné vyhledávání",
|
||||
"number_of_dns_query_to_safe_search": "Počet požadavků DNS na vyhledávače, při kterých bylo vynucené bezpečné vyhledávání",
|
||||
"average_processing_time": "Průměrný čas zpracování",
|
||||
"processing_time": "Doba zpracování",
|
||||
"average_processing_time_hint": "Průměrný čas zpracování požadavků DNS v milisekundách",
|
||||
"block_domain_use_filters_and_hosts": "Blokovat domény pomocí filtrů a seznamů adres",
|
||||
"filters_block_toggle_hint": "Pravidla blokování můžete nastavit v nastavení <a>Filtry</a>.",
|
||||
|
@ -158,6 +164,7 @@
|
|||
"upstream_dns_configured_in_file": "Konfigurováno v {{path}}",
|
||||
"test_upstream_btn": "Test upstreamů",
|
||||
"upstreams": "Odesláno",
|
||||
"upstream": "Odchozí připojení",
|
||||
"apply_btn": "Použít",
|
||||
"disabled_filtering_toast": "Vypnuté filtrování",
|
||||
"enabled_filtering_toast": "Zapnuté filtrování",
|
||||
|
@ -564,7 +571,7 @@
|
|||
"rewrite_A": "<0>A</0>: speciální hodnota, udržet záznamy typu <0>A</0> z odchozího serveru",
|
||||
"rewrite_AAAA": "<0>AAAA</0>: speciální hodnota, udržet záznamy typu <0>AAAA</0> z odchozího serveru",
|
||||
"disable_ipv6": "Zakázat řešení IPv6 adres",
|
||||
"disable_ipv6_desc": "Zrušit všechny dotazy DNS pro adresy IPv6 (typ AAAA).",
|
||||
"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_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ší.",
|
||||
"autofix_warning_text": "Pokud kliknete na „Opravit“, AdGuard Home nakonfiguruje váš systém tak, aby používal DNS server AdGuard Home.",
|
||||
|
@ -676,5 +683,37 @@
|
|||
"protection_section_label": "Ochrana",
|
||||
"log_and_stats_section_label": "Protokol dotazů a statistiky",
|
||||
"ignore_query_log": "Ignorovat tohoto klienta v protokolu dotazů",
|
||||
"ignore_statistics": "Ignorovat tohoto klienta ve statistikách"
|
||||
"ignore_statistics": "Ignorovat tohoto klienta ve statistikách",
|
||||
"schedule_services": "Pozastavit blokování služeb",
|
||||
"schedule_services_desc": "Konfigurace plánu pozastavení filtru blokování služeb",
|
||||
"schedule_services_desc_client": "Konfigurace plánu pozastavení filtru blokování služeb pro tohoto klienta",
|
||||
"schedule_desc": "Nastavení doby nečinnosti pro blokované služby",
|
||||
"schedule_invalid_select": "Čas zahájení musí být před časem ukončení",
|
||||
"schedule_select_days": "Vyberte dny",
|
||||
"schedule_timezone": "Vyberte časové pásmo",
|
||||
"schedule_current_timezone": "Aktuální časové pásmo: {{value}}",
|
||||
"schedule_time_all_day": "Všechny dny",
|
||||
"schedule_modal_description": "Tento plán nahradí všechny stávající plány pro stejný den v týdnu. Každý den v týdnu může mít pouze jedno období nečinnosti.",
|
||||
"schedule_modal_time_off": "Žádné blokování služeb:",
|
||||
"schedule_new": "Nový plán",
|
||||
"schedule_edit": "Upravit plán",
|
||||
"schedule_save": "Uložit plán",
|
||||
"schedule_add": "Přidat plán",
|
||||
"schedule_remove": "Odstranit plán",
|
||||
"schedule_from": "Od",
|
||||
"schedule_to": "Do",
|
||||
"sunday": "Neděle",
|
||||
"monday": "Pondělí",
|
||||
"tuesday": "Úterý",
|
||||
"wednesday": "Středa",
|
||||
"thursday": "Čtvrtek",
|
||||
"friday": "Pátek",
|
||||
"saturday": "Sobota",
|
||||
"sunday_short": "Neděle",
|
||||
"monday_short": "Pondělí",
|
||||
"tuesday_short": "Úterý",
|
||||
"wednesday_short": "Středa",
|
||||
"thursday_short": "Čtvrtek",
|
||||
"friday_short": "Pátek",
|
||||
"saturday_short": "Sobota"
|
||||
}
|
||||
|
|
|
@ -7,12 +7,15 @@
|
|||
"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.",
|
||||
"bootstrap_dns": "Bootstrap DNS-servere",
|
||||
"bootstrap_dns_desc": "Bootstrap DNS-servere bruges til at fortolke IP-adresser for de DoH-/DoT-resolvere, du angiver som upstream.",
|
||||
"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_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",
|
||||
"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_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_placeholder": "Indtast en serveradresse 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_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",
|
||||
|
@ -125,6 +128,8 @@
|
|||
"top_clients": "Hyppigste klienter",
|
||||
"no_clients_found": "Ingen klienter fundet",
|
||||
"general_statistics": "Generelle statistikker",
|
||||
"top_upstreams": "Top-upstreams",
|
||||
"no_upstreams_data_found": "Ingen upstreams-data fundet",
|
||||
"number_of_dns_query_days": "Antallet af DNS-forespørgsler behandlet den seneste {{count}} dag",
|
||||
"number_of_dns_query_days_plural": "Antallet af DNS-forespørgsler behandlet de seneste {{count}} dage",
|
||||
"number_of_dns_query_24_hours": "Antallet af DNS-forespørgsler behandlet de seneste 24 timer",
|
||||
|
@ -134,6 +139,7 @@
|
|||
"enforced_save_search": "Håndhævet sikker søgning",
|
||||
"number_of_dns_query_to_safe_search": "Antallet af DNS-forespørgsler til søgemaskiner, hvor Sikker Søgning blev håndhævet",
|
||||
"average_processing_time": "Gennemsnitlig behandlingstid",
|
||||
"processing_time": "Behandlingstid",
|
||||
"average_processing_time_hint": "Gennemsnitlig behandlingstid i millisekunder af DNS-forespørgsel",
|
||||
"block_domain_use_filters_and_hosts": "Blokér domæner vha. filtre og værtsfiler",
|
||||
"filters_block_toggle_hint": "Du kan opsætte blokeringsregler i <a>Filterindstillingerne</a>.",
|
||||
|
@ -158,6 +164,7 @@
|
|||
"upstream_dns_configured_in_file": "Opsat i {{path}}",
|
||||
"test_upstream_btn": "Test upstreams",
|
||||
"upstreams": "Upstreams",
|
||||
"upstream": "Upstream",
|
||||
"apply_btn": "Anvend",
|
||||
"disabled_filtering_toast": "Filtrering deaktiveret",
|
||||
"enabled_filtering_toast": "Filtrering aktiveret",
|
||||
|
@ -564,7 +571,7 @@
|
|||
"rewrite_A": "<0>A</0>: Særlig værdi, hold <0>A</0> poster fra upstream",
|
||||
"rewrite_AAAA": "<0>AAAA</0>: Særlig værdi, hold <0>AAAA</0> poster fra upstream",
|
||||
"disable_ipv6": "Deaktivér IPv6-adresseopløsning",
|
||||
"disable_ipv6_desc": "Drop alle DNS-forespørgsler for IPv6-adresser (type AAAA).",
|
||||
"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_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.",
|
||||
"autofix_warning_text": "Klikker du på \"Reparér\", opsætter AdGuard Home dit system til brug med AdGuard Home DNS-server.",
|
||||
|
@ -676,5 +683,37 @@
|
|||
"protection_section_label": "Beskyttelse",
|
||||
"log_and_stats_section_label": "Forespørgselslog og statistik",
|
||||
"ignore_query_log": "Ignorér denne klient i forespørgselslog",
|
||||
"ignore_statistics": "Ignorér denne klient i statistik"
|
||||
"ignore_statistics": "Ignorér denne klient i statistik",
|
||||
"schedule_services": "Pausering af tjenesteblokering",
|
||||
"schedule_services_desc": "Opsæt pauseringstidsplan for det tjenesteblokerende filter",
|
||||
"schedule_services_desc_client": "Opsæt pauseringstidsplan for det tjenesteblokerende filter for denne klient",
|
||||
"schedule_desc": "Sæt inaktivitetsperioder for blokerede tjenester",
|
||||
"schedule_invalid_select": "Starttidspunkt skal være før sluttidspunkt",
|
||||
"schedule_select_days": "Vælg dage",
|
||||
"schedule_timezone": "Vælg tidszone",
|
||||
"schedule_current_timezone": "Aktuel tidszone: {{value}}",
|
||||
"schedule_time_all_day": "Hele dagen",
|
||||
"schedule_modal_description": "Denne tidsplan vil erstatte alle eksisterende tidsplaner for den samme ugedag. Hver ugedag kan kun have én inaktivitetsperiode.",
|
||||
"schedule_modal_time_off": "Ingen tjenesteblokering:",
|
||||
"schedule_new": "Ny tidsplan",
|
||||
"schedule_edit": "Redigér tidsplan",
|
||||
"schedule_save": "Gem tidsplan",
|
||||
"schedule_add": "Tilføj tidsplan",
|
||||
"schedule_remove": "Fjern tidsplan",
|
||||
"schedule_from": "Fra",
|
||||
"schedule_to": "Til",
|
||||
"sunday": "Søndag",
|
||||
"monday": "Mandag",
|
||||
"tuesday": "Tirsdag",
|
||||
"wednesday": "Onsdag",
|
||||
"thursday": "Torsdag",
|
||||
"friday": "Fredag",
|
||||
"saturday": "Lørdag",
|
||||
"sunday_short": "Søn",
|
||||
"monday_short": "Man",
|
||||
"tuesday_short": "Tirs",
|
||||
"wednesday_short": "Ons",
|
||||
"thursday_short": "Tors",
|
||||
"friday_short": "Fre",
|
||||
"saturday_short": "Lør"
|
||||
}
|
||||
|
|
|
@ -7,12 +7,15 @@
|
|||
"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.",
|
||||
"bootstrap_dns": "Bootstrap DNS-Server",
|
||||
"bootstrap_dns_desc": "Bootstrap-DNS-Server werden verwendet, um IP-Adressen der DoH/DoT-Resolver aufzulösen, die Sie als Upstreams angeben.",
|
||||
"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_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",
|
||||
"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_default_resolver": "Standardmäßig verwendet AdGuard Home die folgenden Invers-DNS-Resolver: {{ip}}.",
|
||||
"local_ptr_no_default_resolver": "AdGuard Home konnte keine geeigneten privaten Invers-DNS-Resolver für dieses System ermitteln.",
|
||||
"local_ptr_placeholder": "Eine Serveradresse pro Zeile eingeben",
|
||||
"local_ptr_placeholder": "Geben Sie eine IP-Adresse pro Zeile ein",
|
||||
"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).",
|
||||
"use_private_ptr_resolvers_title": "Private Reverse-DNS-Resolver verwenden",
|
||||
|
@ -125,6 +128,8 @@
|
|||
"top_clients": "Top Clients",
|
||||
"no_clients_found": "Keine Clients gefunden",
|
||||
"general_statistics": "Allgemeine Statistiken",
|
||||
"top_upstreams": "Top Upstreams",
|
||||
"no_upstreams_data_found": "Keine Upstream-Daten gefunden",
|
||||
"number_of_dns_query_days": "Anzahl der in den letzten {{count}} Tagen verarbeiteten DNS-Anfragen",
|
||||
"number_of_dns_query_days_plural": "Anzahl der DNS-Abfragen, die in den letzten {{count}} Tagen verarbeitet wurden",
|
||||
"number_of_dns_query_24_hours": "Anzahl der in den letzten 24 Stunden durchgeführten DNS-Anfragen",
|
||||
|
@ -134,6 +139,7 @@
|
|||
"enforced_save_search": "Sichere Suche erzwungen",
|
||||
"number_of_dns_query_to_safe_search": "Anzahl der DNS-Anfragen bei denen Sichere Suche für Suchanfragen erzwungen wurde",
|
||||
"average_processing_time": "Durchschnittliche Bearbeitungsdauer",
|
||||
"processing_time": "Verarbeitungszeit",
|
||||
"average_processing_time_hint": "Durchschnittliche Zeit in Millisekunden zur Bearbeitung von DNS-Anfragen",
|
||||
"block_domain_use_filters_and_hosts": "Domains durch Filter und Host-Dateien sperren",
|
||||
"filters_block_toggle_hint": "Sie können Blockierregeln in den <a>Filter</a>einstellungen erstellen.",
|
||||
|
@ -158,6 +164,7 @@
|
|||
"upstream_dns_configured_in_file": "Konfiguriert in {{path}}",
|
||||
"test_upstream_btn": "Upstreams testen",
|
||||
"upstreams": "Upstreams",
|
||||
"upstream": "Upstream",
|
||||
"apply_btn": "Anwenden",
|
||||
"disabled_filtering_toast": "Filtern deaktiviert",
|
||||
"enabled_filtering_toast": "Filtern aktiviert",
|
||||
|
@ -564,7 +571,7 @@
|
|||
"rewrite_A": "<0>A</0>: spezieller Wert, <0>A</0>-Datensätze des \n vorgeschalteten Servers beibehalten",
|
||||
"rewrite_AAAA": "<0>AAAA</0>: spezieller Wert, <0>AAAA</0>-Datensätze des vorgeschalteten Servers beibehalten",
|
||||
"disable_ipv6": "IPv6 deaktivieren",
|
||||
"disable_ipv6_desc": "Löschen Sie alle DNS-Abfragen für IPv6-Adressen (Typ AAAA).",
|
||||
"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_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.",
|
||||
"autofix_warning_text": "Wenn Sie auf „Beheben“ klicken, konfiguriert AdGuardHome Ihr System für die Verwendung des AdGuardHome-DNS-Servers.",
|
||||
|
@ -676,5 +683,37 @@
|
|||
"protection_section_label": "Schutz",
|
||||
"log_and_stats_section_label": "Abfrageprotokoll und Statistik",
|
||||
"ignore_query_log": "Diesen Client im Abfrageprotokoll ignorieren",
|
||||
"ignore_statistics": "Diesen Client in der Statistik ignorieren"
|
||||
"ignore_statistics": "Diesen Client in der Statistik ignorieren",
|
||||
"schedule_services": "Dienstblockierung anhalten",
|
||||
"schedule_services_desc": "Konfigurieren Sie den Pausenplan des Dienstblockierungsfilters",
|
||||
"schedule_services_desc_client": "Konfigurieren Sie den Pausenplan des Dienstblockierungsfilters für diesen Client",
|
||||
"schedule_desc": "Inaktivitätszeiträume für blockierte Dienste festlegen",
|
||||
"schedule_invalid_select": "Die Startzeit muss vor der Endzeit liegen",
|
||||
"schedule_select_days": "Tage auswählen",
|
||||
"schedule_timezone": "Wählen Sie eine Zeitzone",
|
||||
"schedule_current_timezone": "Aktuelle Zeitzone: {{value}}",
|
||||
"schedule_time_all_day": "Ganzen Tag",
|
||||
"schedule_modal_description": "Dieser Zeitplan wird alle bestehenden Zeitpläne für denselben Wochentag ersetzen. Jeder Wochentag kann nur einen Inaktivitätszeitraum haben.",
|
||||
"schedule_modal_time_off": "Keine Dienstblockierung:",
|
||||
"schedule_new": "Neuer Zeitplan",
|
||||
"schedule_edit": "Zeitplan bearbeiten",
|
||||
"schedule_save": "Zeitplan speichern",
|
||||
"schedule_add": "Zeitplan hinzufügen",
|
||||
"schedule_remove": "Zeitplan entfernen",
|
||||
"schedule_from": "Von",
|
||||
"schedule_to": "Bis",
|
||||
"sunday": "Sonntag",
|
||||
"monday": "Montag",
|
||||
"tuesday": "Dienstag",
|
||||
"wednesday": "Mittwoch",
|
||||
"thursday": "Donnerstag",
|
||||
"friday": "Freitag",
|
||||
"saturday": "Samstag",
|
||||
"sunday_short": "So",
|
||||
"monday_short": "Mo",
|
||||
"tuesday_short": "Di",
|
||||
"wednesday_short": "Mi",
|
||||
"thursday_short": "Do",
|
||||
"friday_short": "Fr",
|
||||
"saturday_short": "Sa"
|
||||
}
|
||||
|
|
|
@ -7,12 +7,15 @@
|
|||
"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.",
|
||||
"bootstrap_dns": "Bootstrap DNS servers",
|
||||
"bootstrap_dns_desc": "Bootstrap DNS servers are used to resolve IP addresses of the DoH/DoT resolvers you specify as upstreams.",
|
||||
"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_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",
|
||||
"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_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_placeholder": "Enter one server address per line",
|
||||
"local_ptr_placeholder": "Enter one IP address per line",
|
||||
"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).",
|
||||
"use_private_ptr_resolvers_title": "Use private reverse DNS resolvers",
|
||||
|
@ -125,6 +128,8 @@
|
|||
"top_clients": "Top clients",
|
||||
"no_clients_found": "No clients found",
|
||||
"general_statistics": "General statistics",
|
||||
"top_upstreams": "Top upstreams",
|
||||
"no_upstreams_data_found": "No upstreams data found",
|
||||
"number_of_dns_query_days": "The number of DNS queries processed for the last {{count}} day",
|
||||
"number_of_dns_query_days_plural": "The number of DNS queries processed for the last {{count}} days",
|
||||
"number_of_dns_query_24_hours": "The number of DNS queries processed for the last 24 hours",
|
||||
|
@ -134,6 +139,7 @@
|
|||
"enforced_save_search": "Enforced safe search",
|
||||
"number_of_dns_query_to_safe_search": "The number of DNS requests to search engines for which Safe Search was enforced",
|
||||
"average_processing_time": "Average processing time",
|
||||
"processing_time": "Processing time",
|
||||
"average_processing_time_hint": "Average time in milliseconds on processing a DNS request",
|
||||
"block_domain_use_filters_and_hosts": "Block domains using filters and hosts files",
|
||||
"filters_block_toggle_hint": "You can setup blocking rules in the <a>Filters</a> settings.",
|
||||
|
@ -158,6 +164,7 @@
|
|||
"upstream_dns_configured_in_file": "Configured in {{path}}",
|
||||
"test_upstream_btn": "Test upstreams",
|
||||
"upstreams": "Upstreams",
|
||||
"upstream": "Upstream",
|
||||
"apply_btn": "Apply",
|
||||
"disabled_filtering_toast": "Disabled filtering",
|
||||
"enabled_filtering_toast": "Enabled filtering",
|
||||
|
@ -530,8 +537,8 @@
|
|||
"statistics_enable": "Enable statistics",
|
||||
"ignore_domains": "Ignored domains (separated by newline)",
|
||||
"ignore_domains_title": "Ignored domains",
|
||||
"ignore_domains_desc_stats": "Queries for these domains are not written to the statistics",
|
||||
"ignore_domains_desc_query": "Queries for these domains are not written to the query log",
|
||||
"ignore_domains_desc_stats": "Queries matching these rules are not written to the statistics",
|
||||
"ignore_domains_desc_query": "Queries matching these rules are not written to the query log",
|
||||
"interval_hours": "{{count}} hour",
|
||||
"interval_hours_plural": "{{count}} hours",
|
||||
"filters_configuration": "Filters configuration",
|
||||
|
@ -564,7 +571,7 @@
|
|||
"rewrite_A": "<0>A</0>: special value, keep <0>A</0> records from the upstream",
|
||||
"rewrite_AAAA": "<0>AAAA</0>: special value, keep <0>AAAA</0> records from the upstream",
|
||||
"disable_ipv6": "Disable resolving of IPv6 addresses",
|
||||
"disable_ipv6_desc": "Drop all DNS queries for IPv6 addresses (type AAAA).",
|
||||
"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_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.",
|
||||
"autofix_warning_text": "If you click \"Fix\", AdGuard Home will configure your system to use AdGuard Home DNS server.",
|
||||
|
@ -676,5 +683,37 @@
|
|||
"protection_section_label": "Protection",
|
||||
"log_and_stats_section_label": "Query log and statistics",
|
||||
"ignore_query_log": "Ignore this client in query log",
|
||||
"ignore_statistics": "Ignore this client in statistics"
|
||||
"ignore_statistics": "Ignore this client in statistics",
|
||||
"schedule_services": "Pause service blocking",
|
||||
"schedule_services_desc": "Configure the pause schedule of the service-blocking filter",
|
||||
"schedule_services_desc_client": "Configure the pause schedule of the service-blocking filter for this client",
|
||||
"schedule_desc": "Set inactivity periods for blocked services",
|
||||
"schedule_invalid_select": "Start time must be before end time",
|
||||
"schedule_select_days": "Select days",
|
||||
"schedule_timezone": "Select a time zone",
|
||||
"schedule_current_timezone": "Current time zone: {{value}}",
|
||||
"schedule_time_all_day": "All day",
|
||||
"schedule_modal_description": "This schedule will replace any existing schedules for the same day of the week. Each day of the week can have only one inactivity period.",
|
||||
"schedule_modal_time_off": "No service blocking:",
|
||||
"schedule_new": "New schedule",
|
||||
"schedule_edit": "Edit schedule",
|
||||
"schedule_save": "Save schedule",
|
||||
"schedule_add": "Add schedule",
|
||||
"schedule_remove": "Remove schedule",
|
||||
"schedule_from": "From",
|
||||
"schedule_to": "To",
|
||||
"sunday": "Sunday",
|
||||
"monday": "Monday",
|
||||
"tuesday": "Tuesday",
|
||||
"wednesday": "Wednesday",
|
||||
"thursday": "Thursday",
|
||||
"friday": "Friday",
|
||||
"saturday": "Saturday",
|
||||
"sunday_short": "Sun",
|
||||
"monday_short": "Mon",
|
||||
"tuesday_short": "Tue",
|
||||
"wednesday_short": "Wed",
|
||||
"thursday_short": "Thu",
|
||||
"friday_short": "Fri",
|
||||
"saturday_short": "Sat"
|
||||
}
|
||||
|
|
|
@ -7,12 +7,15 @@
|
|||
"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.",
|
||||
"bootstrap_dns": "Servidores DNS de arranque",
|
||||
"bootstrap_dns_desc": "Los servidores DNS de arranque se utilizan para resolver las direcciones IP de los resolutores DoH/DoT que especifiques como DNS de subida.",
|
||||
"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 de fallback",
|
||||
"fallback_dns_desc": "La lista de DNS de fallback serán usadas cuando los servidores de upstream de DNS no respondan. La sintaxis es la misma que en los principales del campo anterior.",
|
||||
"fallback_dns_placeholder": "Ingresa un servidor de DNS alternativo por línea",
|
||||
"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_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_placeholder": "Ingresa una dirección de servidor 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_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",
|
||||
|
@ -125,6 +128,8 @@
|
|||
"top_clients": "Clientes más frecuentes",
|
||||
"no_clients_found": "No se han encontrado clientes",
|
||||
"general_statistics": "Estadísticas generales",
|
||||
"top_upstreams": "Mejores upstreams",
|
||||
"no_upstreams_data_found": "No se han encontrado datos de upstreams",
|
||||
"number_of_dns_query_days": "Número de consultas DNS procesadas durante el último {{count}} día",
|
||||
"number_of_dns_query_days_plural": "Número de consultas DNS procesadas durante los últimos {{count}} días",
|
||||
"number_of_dns_query_24_hours": "Número de consultas DNS procesadas durante las últimas 24 horas",
|
||||
|
@ -134,6 +139,7 @@
|
|||
"enforced_save_search": "Búsquedas seguras forzadas",
|
||||
"number_of_dns_query_to_safe_search": "Número de peticiones DNS a los motores de búsqueda para los que se aplicó la búsqueda segura forzada",
|
||||
"average_processing_time": "Tiempo promedio de procesamiento",
|
||||
"processing_time": "Tiempo de procesamiento",
|
||||
"average_processing_time_hint": "Tiempo promedio en milisegundos al procesar una petición DNS",
|
||||
"block_domain_use_filters_and_hosts": "Bloquear dominios usando filtros y archivos hosts",
|
||||
"filters_block_toggle_hint": "Puedes configurar las reglas de bloqueo en la configuración de <a>filtros</a>.",
|
||||
|
@ -158,6 +164,7 @@
|
|||
"upstream_dns_configured_in_file": "Configurado en {{path}}",
|
||||
"test_upstream_btn": "Probar DNS de subida",
|
||||
"upstreams": "DNS de subida",
|
||||
"upstream": "Upstream",
|
||||
"apply_btn": "Aplicar",
|
||||
"disabled_filtering_toast": "Filtrado deshabilitado",
|
||||
"enabled_filtering_toast": "Filtrado habilitado",
|
||||
|
@ -564,7 +571,7 @@
|
|||
"rewrite_A": "<0>A</0>: valor especial, mantiene registros <0>A</0> del DNS de subida",
|
||||
"rewrite_AAAA": "<0>AAAA</0>: valor especial, mantiene registros <0>AAAA</0> del DNS de subida",
|
||||
"disable_ipv6": "Deshabilitar resolución de direcciones IPv6",
|
||||
"disable_ipv6_desc": "Descarta todas las consultas DNS para direcciones IPv6 (tipo AAAA).",
|
||||
"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_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.",
|
||||
"autofix_warning_text": "Si haces clic en \"Corregir\", AdGuard Home configurará tu sistema para utilizar el servidor DNS de AdGuard Home.",
|
||||
|
@ -676,5 +683,37 @@
|
|||
"protection_section_label": "Protección",
|
||||
"log_and_stats_section_label": "Registro de consultas y estadísticas",
|
||||
"ignore_query_log": "Ignorar este cliente en el registro de consultas",
|
||||
"ignore_statistics": "Ignorar este cliente en las estadísticas"
|
||||
"ignore_statistics": "Ignorar este cliente en las estadísticas",
|
||||
"schedule_services": "Pausar el servicio de bloqueo",
|
||||
"schedule_services_desc": "Configura el horario programado de pausa del servicio de bloqueo",
|
||||
"schedule_services_desc_client": "Configurar el horario programado de pausa del bloqueo de servicio filtrado para este cliente",
|
||||
"schedule_desc": "Establecer periodos de inactividad para servicios bloqueados",
|
||||
"schedule_invalid_select": "El tiempo de inicio debe de ir antes del tiempo de finalización",
|
||||
"schedule_select_days": "Selecciona los dias",
|
||||
"schedule_timezone": "Selecciona una zona horaria",
|
||||
"schedule_current_timezone": "Zona horaria actual: {{value}}",
|
||||
"schedule_time_all_day": "Todo el dia",
|
||||
"schedule_modal_description": "Este horario sustituirá cualquier horario existente para el mismo día de la semana. Cada día de la semana solo puede tener un periodo de inactividad.",
|
||||
"schedule_modal_time_off": "Detener el servicio de bloqueo:",
|
||||
"schedule_new": "Nuevo horario",
|
||||
"schedule_edit": "Editar horario",
|
||||
"schedule_save": "Guardar horario",
|
||||
"schedule_add": "Añadir horario",
|
||||
"schedule_remove": "Eliminar horario",
|
||||
"schedule_from": "De",
|
||||
"schedule_to": "A",
|
||||
"sunday": "Domingo",
|
||||
"monday": "Lunes",
|
||||
"tuesday": "Martes",
|
||||
"wednesday": "Miércoles",
|
||||
"thursday": "Jueves",
|
||||
"friday": "Viernes",
|
||||
"saturday": "Sábado",
|
||||
"sunday_short": "Dom.",
|
||||
"monday_short": "Lun.",
|
||||
"tuesday_short": "Mar.",
|
||||
"wednesday_short": "Mié.",
|
||||
"thursday_short": "Jue.",
|
||||
"friday_short": "Vie.",
|
||||
"saturday_short": "Sáb."
|
||||
}
|
||||
|
|
|
@ -5,8 +5,12 @@
|
|||
"upstream_parallel": "استفاده از جستار موازی برای سرعت دادن به تفکیک با جستار همزمان همه جریان های ارسالی",
|
||||
"parallel_requests": "درخواست های موازی",
|
||||
"load_balancing": "متعادل کننده بار",
|
||||
"load_balancing_desc": "یک سرور بالادستی را در یک زمان پرس و جو کنید. AdGuard Home از الگوریتم تصادفی وزنی خود برای انتخاب سرور استفاده می کند تا سریع ترین سرور بیشتر مورد استفاده قرار گیرد.",
|
||||
"bootstrap_dns": "خودراه انداز سرورهای DNS",
|
||||
"bootstrap_dns_desc": "خودراه انداز سرورهای DNS برای تفکیک آدرس آی پی تفکیک کننده های DoH/DoT که شما بعنوان جریان ارسالی تعیین کردید استفاده میشود.",
|
||||
"bootstrap_dns_desc": "آدرسهای IP سرورهای DNS که برای حل کردن آدرسهای IP حلکنندههای DoH/DoT که بهعنوان upstream مشخص میکنید، استفاده میشوند. اظهار نظر مجاز نیست.",
|
||||
"fallback_dns_title": "سرورهای DNS بازگشتی",
|
||||
"fallback_dns_desc": "لیست سرورهای DNS بازگشتی که در زمانی که سرورهای DNS بالادستی پاسخ نمیدهند استفاده میشوند. نحو مانند فیلد بالادستی اصلی بالا است.",
|
||||
"fallback_dns_placeholder": "یک سرور DNS بازگشتی در هر خط وارد کنید",
|
||||
"local_ptr_title": "سرورهای خصوصی DNS",
|
||||
"local_ptr_desc": "سرور یا سرور های DNS ای که AdGuard Home برای درخواست های منابع محلی ارائه شده مورد استفاده قرار خواهد داد. برای مثال، این سرور برای تعیین نام های سرویس دهنده برای سرویس گیرنده با آدرس های آی پی خصوصی مورد استفاده قرار خواهد گرفت. اگر تعیین نشود،AdGuard Home به طور خودکار از تعیین کننده ی DNS پیش فرض شما استفاده خواهد کرد.",
|
||||
"local_ptr_default_resolver": "به طور پیش فرض، AdGuard Home از تعیین کننده های DNS معکوس زیر استفاده می کند: {{ip}}.",
|
||||
|
@ -20,6 +24,8 @@
|
|||
"save_config": "ذخیره پیکربندی",
|
||||
"enabled_dhcp": "سرور DHCP فعال شده است",
|
||||
"disabled_dhcp": "سرور DHCP غیرفعال شده است",
|
||||
"unavailable_dhcp": "DHCP در دسترس نیست",
|
||||
"unavailable_dhcp_desc": "AdGuard Home نمی تواند سرور DHCP را روی سیستم عامل شما اجرا کند",
|
||||
"dhcp_title": "سرور DHCP",
|
||||
"dhcp_description": "اگر روتر شما تنظیمات DHCP ارائه نمی کند،میتوانید از سرور DHCP تو-کار خود AdGuard استفاده کنید.",
|
||||
"dhcp_enable": "فعالسازی سرور DHCP",
|
||||
|
@ -30,6 +36,8 @@
|
|||
"dhcp_static_leases": "اجاره DHCP ایستا",
|
||||
"dhcp_leases_not_found": "اجاره DHCP یافت نشد",
|
||||
"dhcp_config_saved": "پیکربندی سرور DHCP ذخیره شده است",
|
||||
"dhcp_ipv4_settings": "تنظیمات DHCP IPv4",
|
||||
"dhcp_ipv6_settings": "تنظیمات DHCP IPv4",
|
||||
"form_error_required": "فیلد مورد نیاز",
|
||||
"form_error_ip4_format": "فرمت نامعتبر IPv4",
|
||||
"form_error_ip4_gateway_format": "قالب IPv4 درگاه نامعتبر است",
|
||||
|
@ -37,8 +45,10 @@
|
|||
"form_error_ip_format": "فرمت IPv4 نامعتبر است",
|
||||
"form_error_mac_format": "فرمت مَک نامعتبر است",
|
||||
"form_error_client_id_format": "فرمت شناسه کلاینت نامعتبر است",
|
||||
"form_error_server_name": "نام سرور نامعتبر است",
|
||||
"form_error_subnet": "زیرشبکه\"{{cidr}}\"آدرس آی پی {{ip}} را در بر ندارد",
|
||||
"form_error_positive": "باید بزرگتر از 0 باشد",
|
||||
"form_error_gateway_ip": "Lease نمی تواند آدرس IP دروازه را داشته باشد",
|
||||
"out_of_range_error": "باید خارج از دامنه باشد\"{{start}}\"-\"{{end}}\"",
|
||||
"lower_range_start_error": "باید کمتر از شروع دامنه باشد",
|
||||
"greater_range_start_error": "باید بیشتر از شروع دامنه باشد",
|
||||
|
@ -118,6 +128,8 @@
|
|||
"top_clients": "بالاترین کلاینت ها",
|
||||
"no_clients_found": "کلاینتی یافت نشد",
|
||||
"general_statistics": "آمار عمومی",
|
||||
"top_upstreams": "سرورهای بالادست بالا",
|
||||
"no_upstreams_data_found": "هیچ اطلاعاتی در مورد سرورهای بالادست یافت نشد",
|
||||
"number_of_dns_query_days": "تعداد جستار DNS پردازش شده در {{count}} روز آخر",
|
||||
"number_of_dns_query_days_plural": "تعداد جستار DNS پردازش شده در {{count}} روز گذشته",
|
||||
"number_of_dns_query_24_hours": "تعداد جستار DNS پردازش شده در 24 ساعت گذشته",
|
||||
|
@ -127,6 +139,7 @@
|
|||
"enforced_save_search": "جستجوی اَمن اجبار شده",
|
||||
"number_of_dns_query_to_safe_search": "تعداد درخواست های DNS برای موتور جستجو که جستجوی اَمن اجبار شده",
|
||||
"average_processing_time": "میانگین زمان پردازش",
|
||||
"processing_time": "زمان پردازش",
|
||||
"average_processing_time_hint": "زمان میانگین بر هزارم ثانیه در پردازش درخواست DNS",
|
||||
"block_domain_use_filters_and_hosts": "مسدودسازی دامنه ها توسط فیلترها و فایل های میزبان",
|
||||
"filters_block_toggle_hint": "میتوانید دستورات مسدودسازی را در تنظیمات <a>فیلترها</a> راه اندازی کنید.",
|
||||
|
@ -149,6 +162,7 @@
|
|||
"upstream_dns": "سرورهای DNS جریان ارسالی",
|
||||
"test_upstream_btn": "تست جریان ارسالی",
|
||||
"upstreams": "جریان ارسالی",
|
||||
"upstream": "سرور مادر",
|
||||
"apply_btn": "اِعمال",
|
||||
"disabled_filtering_toast": "فیلترینگ غیرفعال شده است",
|
||||
"enabled_filtering_toast": "فیلترینگ فعال شده است",
|
||||
|
@ -181,6 +195,8 @@
|
|||
"new_allowlist": "لیست مجاز جدید",
|
||||
"edit_blocklist": "ویرایش لیست سیاه",
|
||||
"edit_allowlist": "ویرایش لیست مجاز",
|
||||
"choose_blocklist": "لیست های مسدود را انتخاب کنید",
|
||||
"choose_allowlist": "لیست های مسدود را انتخاب کنید",
|
||||
"enter_valid_blocklist": "آدرس معتبر برای لیست سیاه وارد کنید.",
|
||||
"enter_valid_allowlist": "آدرس معتبر برای لیست مجاز وارد کنید.",
|
||||
"form_error_url_format": "فرمت آدرس نامعتبر است",
|
||||
|
@ -246,6 +262,8 @@
|
|||
"anonymize_client_ip": "گمنام کردن IP کلاینت",
|
||||
"anonymize_client_ip_desc": "آدرس IP کلاینت در وقایع و آمارها را ذخیره نکن",
|
||||
"dns_config": "پیکربندی DNS سرور",
|
||||
"dns_cache_config": "تنظیمات کش DNS",
|
||||
"dns_cache_config_desc": "در اینجا می توانید کش DNS را تنظیم کنید",
|
||||
"blocking_mode": "حالت مسدودسازی",
|
||||
"default": "پيش فرض",
|
||||
"nxdomain": "NXDOMAIN",
|
||||
|
@ -514,7 +532,7 @@
|
|||
"example_rewrite_domain": "فقط بازنویسی پاسخ برای این دامنه.",
|
||||
"example_rewrite_wildcard": "بازنویسی پاسخ ها برای همه زیردامنه های <0>example.org</0>.",
|
||||
"disable_ipv6": "غیرفعالسازی IPv6",
|
||||
"disable_ipv6_desc": "اگر این ویژگی فعال شده، همه جستارهای DNS برای آدرس های IPv6 (نوع AAAA) رها میشود.",
|
||||
"disable_ipv6_desc": "تمام درخواستهای DNS برای آدرسهای IPv6 را رها کنید (تایپ AAAA) و نکات IPv6 را از پاسخهای HTTPS حذف کنید.",
|
||||
"fastest_addr": "سریعترین آدرس آی پی",
|
||||
"fastest_addr_desc": "جستار همه سرورهای DNS و بازگرداندن سریعترین آدرس IP از میان همه پاسخ ها",
|
||||
"autofix_warning_text": "اگر روی \"تعمیر\" کلیک کنید، AdGuardHome سیستم شما را برای استفاده از DNS سرور AdGuardHome پیکربندی می کند.",
|
||||
|
@ -572,5 +590,40 @@
|
|||
"parental_control": "نظارت والدین",
|
||||
"safe_browsing": "وب گردی اَمن",
|
||||
"form_error_password_length": "رمزعبور باید حداقل {{value}} کاراکتر باشد.",
|
||||
"protection_section_label": "حفاظت"
|
||||
"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": "یکشنبه",
|
||||
"monday_short": "دوشنبه",
|
||||
"tuesday_short": "سه شنبه",
|
||||
"wednesday_short": "چهارشنبه",
|
||||
"thursday_short": "پنج شنبه",
|
||||
"friday_short": "جمعه",
|
||||
"saturday_short": "شنبه"
|
||||
}
|
||||
|
|
|
@ -7,12 +7,15 @@
|
|||
"load_balancing": "Kuormantasaus",
|
||||
"load_balancing_desc": "Lähetä pyyntö yhdelle ylävirtapalvelimelle kerrallaan. AdGuard Home pyrkii valitsemaan nopeimman palvelimen painotetun satunnaisalgoritminsa avulla.",
|
||||
"bootstrap_dns": "Bootstrap DNS-palvelimet",
|
||||
"bootstrap_dns_desc": "Bootstrap DNS-palvelimia käytetään ylävirroiksi määritettyjen DoH/DoT-resolvereiden IP-osoitteiden selvitykseen.",
|
||||
"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_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",
|
||||
"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_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_placeholder": "Syötä yksi palvelimen 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_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",
|
||||
|
@ -125,6 +128,8 @@
|
|||
"top_clients": "Käytetyimmät päätelaitteet",
|
||||
"no_clients_found": "Päätelaitteita ei löytynyt",
|
||||
"general_statistics": "Yleiset tilastot",
|
||||
"top_upstreams": "Käytetyimmät ylävirrat",
|
||||
"no_upstreams_data_found": "Ylävirtatietoja ei löytynyt",
|
||||
"number_of_dns_query_days": "Käsiteltyjen DNS-pyyntöjen määrä viimeisten {{count}} päivän ajalta",
|
||||
"number_of_dns_query_days_plural": "Käsiteltyjen DNS-pyyntöjen määrä viimeisten {{count}} päivän ajalta",
|
||||
"number_of_dns_query_24_hours": "Käsiteltyjen DNS-pyyntöjen määrä viimeisten 24 tunnin ajalta",
|
||||
|
@ -134,6 +139,7 @@
|
|||
"enforced_save_search": "Turvallinen haku pakotettiin",
|
||||
"number_of_dns_query_to_safe_search": "DNS-pyyntöjen määrä, joille turvallinen haku pakotettiin käyttöön",
|
||||
"average_processing_time": "Keskimääräinen käsittelyaika",
|
||||
"processing_time": "Käsittelyaika",
|
||||
"average_processing_time_hint": "Keskimääräinen DNS-pyynnön käsittelyyn kulutettu aika millisekunteina",
|
||||
"block_domain_use_filters_and_hosts": "Estä verkkotunnuksia suodattimilla ja hosts-tiedostoilla",
|
||||
"filters_block_toggle_hint": "Voit määrittää estosääntöjä <a>suodatinasetuksissa</a>.",
|
||||
|
@ -158,6 +164,7 @@
|
|||
"upstream_dns_configured_in_file": "Määritetty tiedostossa {{path}}",
|
||||
"test_upstream_btn": "Testaa ylävirtoja",
|
||||
"upstreams": "Ylävirrat",
|
||||
"upstream": "Ylävirta",
|
||||
"apply_btn": "Käytä",
|
||||
"disabled_filtering_toast": "Suodatus poistettiin käytöstä",
|
||||
"enabled_filtering_toast": "Suodatus otettiin käyttöön",
|
||||
|
@ -564,7 +571,7 @@
|
|||
"rewrite_A": "<0>A</0>: erityinen arvo, säilytä ylävirran <0>A</0>-tiedot",
|
||||
"rewrite_AAAA": "<0>AAAA</0>: erityinen arvo, säilytä ylävirran <0>AAAA</0>-tiedot",
|
||||
"disable_ipv6": "Älä selvitä IPv6-osoitteita",
|
||||
"disable_ipv6_desc": "Hylkää kaikki IPv6-osoitteiden DNS-pyynnöt (tyyppi AAAA).",
|
||||
"disable_ipv6_desc": "Hylkää kaikki IPv6-osoitteiden DNS-pyynnöt (tyyppi AAAA) ja poista HTTPS-vastausten IPv6-tiedot.",
|
||||
"fastest_addr": "Nopein IP-osoite",
|
||||
"fastest_addr_desc": "Lähetä pyynnöt kaikille DNS-palvelimille ja valitse vastauksista nopein IP-osoite. Tämä parantaa yleistä liitettävyyttä, joskin hidastaa DNS-pyyntöjä, koska AdGuard Homen on odotettava kaikkien DNS-palvelinten vastauksia.",
|
||||
"autofix_warning_text": "Jos painat \"Korjaa\", AdGuard Home määrittää järjestelmäsi käyttämään AdGuard Homen DNS-palvelinta.",
|
||||
|
@ -676,5 +683,37 @@
|
|||
"protection_section_label": "Suojaus",
|
||||
"log_and_stats_section_label": "Kyselyhistoria ja tilastot",
|
||||
"ignore_query_log": "Älä huomioi tätä päätettä kyselyhistoriassa",
|
||||
"ignore_statistics": "Älä huomioi tätä päätettä tilastoissa"
|
||||
"ignore_statistics": "Älä huomioi tätä päätettä tilastoissa",
|
||||
"schedule_services": "Keskeytä palveluesto",
|
||||
"schedule_services_desc": "Määritä palvelunestosuodattimen keskeytysajoitus.",
|
||||
"schedule_services_desc_client": "Määritä palvelunestosuodattimen keskeytysajoitus tälle päätteelle.",
|
||||
"schedule_desc": "Aseta estettujen palveluiden käyttämättömyysjaksot",
|
||||
"schedule_invalid_select": "Aloitusaika on oltava ennen lopetusaikaa",
|
||||
"schedule_select_days": "Valitse päivät",
|
||||
"schedule_timezone": "Valitse aikavyöhyke",
|
||||
"schedule_current_timezone": "Nykyinen aikavyöhyke: {{value}}",
|
||||
"schedule_time_all_day": "Koko päivän",
|
||||
"schedule_modal_description": "Tämä ajoitus korvaa kaikki nykyiset kyseisen viikonpäivän ajoitukset. Jokaisella viikonpäivällä voi olla vain yksi toimettomuusjakso.",
|
||||
"schedule_modal_time_off": "Ei palveluestoa:",
|
||||
"schedule_new": "Uusi ajoitus",
|
||||
"schedule_edit": "Muokkaa ajoitus",
|
||||
"schedule_save": "Tallenna ajoitus",
|
||||
"schedule_add": "Lisää ajoitus",
|
||||
"schedule_remove": "Poista ajoitus",
|
||||
"schedule_from": "Alkaen",
|
||||
"schedule_to": "Päättyen",
|
||||
"sunday": "Sunnuntai",
|
||||
"monday": "Maanantai",
|
||||
"tuesday": "Tiistai",
|
||||
"wednesday": "Keskiviikko",
|
||||
"thursday": "Torstai",
|
||||
"friday": "Perjantai",
|
||||
"saturday": "Lauantai",
|
||||
"sunday_short": "Su",
|
||||
"monday_short": "Ma",
|
||||
"tuesday_short": "Ti",
|
||||
"wednesday_short": "Ke",
|
||||
"thursday_short": "To",
|
||||
"friday_short": "Pe",
|
||||
"saturday_short": "La"
|
||||
}
|
||||
|
|
|
@ -3,16 +3,19 @@
|
|||
"example_upstream_reserved": "un amont <0>pour des domaines spécifiques</0> ;",
|
||||
"example_upstream_comment": " un commentaire.",
|
||||
"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": "Demandes en parallèle",
|
||||
"parallel_requests": "Requêtes en parallèle",
|
||||
"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.",
|
||||
"bootstrap_dns": "Serveurs DNS d'amorçage",
|
||||
"bootstrap_dns_desc": "Les serveurs DNS d'amorçage sont utilisés pour résoudre les adresses IP des résolveurs DoH/DoT que vous spécifiez comme upstream.",
|
||||
"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_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",
|
||||
"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_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_placeholder": "Saisissez une adresse de serveur 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_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",
|
||||
|
@ -125,6 +128,8 @@
|
|||
"top_clients": "Meilleurs clients",
|
||||
"no_clients_found": "Pas de clients trouvés",
|
||||
"general_statistics": "Statistiques générales",
|
||||
"top_upstreams": "Top amonts",
|
||||
"no_upstreams_data_found": "Aucune donnée en amont trouvée",
|
||||
"number_of_dns_query_days": "Le nombre de requêtes DNS traitées pour les {{count}} derniers jours",
|
||||
"number_of_dns_query_days_plural": "Le nombre de requêtes DNS traitées ces {{count}} derniers jours",
|
||||
"number_of_dns_query_24_hours": "Le nombre de requêtes DNS traitées au cours des 24 dernières heures",
|
||||
|
@ -134,6 +139,7 @@
|
|||
"enforced_save_search": "Recherche sécurisée forcée",
|
||||
"number_of_dns_query_to_safe_search": "Le nombre de requêtes DNS faites avec la Recherche securisée",
|
||||
"average_processing_time": "Temps moyen de traitement",
|
||||
"processing_time": "Délai de traitement",
|
||||
"average_processing_time_hint": "Temps moyen (en millisecondes) de traitement d'une requête DNS",
|
||||
"block_domain_use_filters_and_hosts": "Bloquez les domaines à l'aide des filtres et fichiers hosts",
|
||||
"filters_block_toggle_hint": "Vous pouvez configurer les règles de filtrage dans les paramètres des <a>Filtres</a>.",
|
||||
|
@ -149,7 +155,7 @@
|
|||
"dns_blocklists": "Listes de blocage DNS",
|
||||
"dns_allowlists": "Listes d’autorisation DNS",
|
||||
"dns_blocklists_desc": "AdGuard Home bloquera les domaines correspondant aux listes de blocage.",
|
||||
"dns_allowlists_desc": "Les domaines provenant de listes d’autorisation DNS seront autorisés même s’ils figurent dans l’une des listes de blocage.",
|
||||
"dns_allowlists_desc": "Les domaines des listes blanches des DNS seront autorisés même s’ils figurent dans une des listes de blocage.",
|
||||
"custom_filtering_rules": "Règles de filtrage personnalisées",
|
||||
"encryption_settings": "Paramètres de chiffrement",
|
||||
"dhcp_settings": "Paramètres DHCP",
|
||||
|
@ -158,6 +164,7 @@
|
|||
"upstream_dns_configured_in_file": "Configuré dans {{path}}",
|
||||
"test_upstream_btn": "Tester les upstreams",
|
||||
"upstreams": "En amont",
|
||||
"upstream": "Amont",
|
||||
"apply_btn": "Appliquer",
|
||||
"disabled_filtering_toast": "Filtrage désactivé",
|
||||
"enabled_filtering_toast": "Filtrage activé",
|
||||
|
@ -191,8 +198,8 @@
|
|||
"new_allowlist": "Nouvelle liste d’autorisation",
|
||||
"edit_blocklist": "Modifier la liste de blocage",
|
||||
"edit_allowlist": "Modifier la liste d’autorisation",
|
||||
"choose_blocklist": "Choisir des listes de blocage",
|
||||
"choose_allowlist": "Choisir des listes d’autorisation",
|
||||
"choose_blocklist": "Choisir les listes de blocage",
|
||||
"choose_allowlist": "Choisir les listes blanches",
|
||||
"enter_valid_blocklist": "Saisissez une URL valide vers la liste de blocage.",
|
||||
"enter_valid_allowlist": "Saisissez une URL valide vers la liste d’autorisation.",
|
||||
"form_error_url_format": "Format d’URL incorrect",
|
||||
|
@ -304,7 +311,7 @@
|
|||
"theme_auto": "Auto",
|
||||
"theme_light": "Thème clair",
|
||||
"theme_dark": "Thème sombre",
|
||||
"upstream_dns_client_desc": "Si vous laissez ce champ vide, AdGuard Home utilisera les serveurs configurés dans les <0>paramètres DNS</0>.",
|
||||
"upstream_dns_client_desc": "Si vous laissez ce champ vide, AdGuard Home utilisera les serveurs configurés dans les <0>Paramètres DNS</0>.",
|
||||
"tracker_source": "Source du traceur",
|
||||
"source_label": "Source",
|
||||
"found_in_known_domain_db": "Trouvé dans la base de données des domaines connus",
|
||||
|
@ -485,7 +492,7 @@
|
|||
"rewrite_confirm_delete": "Voulez-vous vraiment supprimer la réécriture DNS pour « {{key}} » ?",
|
||||
"rewrite_desc": "Permet de configurer facilement la réponse DNS personnalisée pour un nom de domaine spécifique.",
|
||||
"rewrite_applied": "Règle de réécriture appliquée",
|
||||
"rewrite_hosts_applied": "Réécrit par la règle du fichier d’hôtes",
|
||||
"rewrite_hosts_applied": "Réécrit par la règle du fichier hosts",
|
||||
"dns_rewrites": "Réécritures DNS",
|
||||
"form_domain": "Saisissez un domaine ou caracrtère générique",
|
||||
"form_answer": "Saisissez une adresse IP ou un nom de domaine",
|
||||
|
@ -552,7 +559,7 @@
|
|||
"network": "Réseau",
|
||||
"descr": "Description",
|
||||
"whois": "WHOIS",
|
||||
"filtering_rules_learn_more": "<0>Apprenez-en plus</0> à propos de la création de vos propres listes de blocage d’hôtes.",
|
||||
"filtering_rules_learn_more": "<0>Apprenez plus</0> sur la création de vos propres listes hosts.",
|
||||
"blocked_by_response": "Bloqué par un CNAME ou une réponse IP",
|
||||
"blocked_by_cname_or_ip": "Bloqué par CNAME ou adresse IP",
|
||||
"try_again": "Réessayer",
|
||||
|
@ -564,7 +571,7 @@
|
|||
"rewrite_A": "<0>A</0> : valeur spéciale, conserver les enregistrements <0>A</0> de l’amont",
|
||||
"rewrite_AAAA": "<0>AAAA</0> : valeur spéciale, conserver les enregistrements <0>AAAA</0> de l’amont",
|
||||
"disable_ipv6": "Désactiver la résolution des adresses IPv6",
|
||||
"disable_ipv6_desc": "Abandonner toutes les requêtes DNS pour les adresses IPv6 (type AAAA).",
|
||||
"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_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.",
|
||||
"autofix_warning_text": "Si vous cliquez sur « Réparer », AdGuard Home configurera votre système pour utiliser le serveur DNS AdGuard Home.",
|
||||
|
@ -638,7 +645,7 @@
|
|||
"filter_category_other_desc": "Autres listes noires",
|
||||
"setup_config_to_enable_dhcp_server": "Configurer les paramètres pour activer le serveur DHCP",
|
||||
"original_response": "Réponse originale",
|
||||
"click_to_view_queries": "Cliquez pour voir les requêtes",
|
||||
"click_to_view_queries": "Cliquer pour voir les requêtes",
|
||||
"port_53_faq_link": "Le port 53 est souvent occupé par les services « DNSStubListener » ou « systemd-resolved ». Veuillez lire <0>cette instruction</0> pour savoir comment résoudre ce problème.",
|
||||
"adg_will_drop_dns_queries": "AdGuard Home ignorera toutes les requêtes DNS de ce client.",
|
||||
"filter_allowlist": "ATTENTION : Cette action exclura également la règle « {{disallowed_rule}} » de la liste des clients autorisés.",
|
||||
|
@ -676,5 +683,37 @@
|
|||
"protection_section_label": "Protection",
|
||||
"log_and_stats_section_label": "Journal des requêtes et statistiques",
|
||||
"ignore_query_log": "Ignorer ce client dans le journal des requêtes",
|
||||
"ignore_statistics": "Ignorer ce client dans les statistiques"
|
||||
"ignore_statistics": "Ignorer ce client dans les statistiques",
|
||||
"schedule_services": "Suspendre le blocage des services",
|
||||
"schedule_services_desc": "Configurez l'horaire de pauses du filtre de blocage de services",
|
||||
"schedule_services_desc_client": "Configurez l'horaire de pauses du filtre de blocage de services pour ce client",
|
||||
"schedule_desc": "Définissez les périodes d'inactivité pour les services bloqués",
|
||||
"schedule_invalid_select": "Le temps du début doit précéder le temps de la fin",
|
||||
"schedule_select_days": "Sélectionnez les jours",
|
||||
"schedule_timezone": "Sélectionnez un fuseau horaire",
|
||||
"schedule_current_timezone": "Fuseau horaire actuel : {{value}}",
|
||||
"schedule_time_all_day": "Toute la journée",
|
||||
"schedule_modal_description": "Cet horaire remplacera tout autre planning existant pour le même jour de la semaine. Chaque jour de la semaine ne peut avoir qu'une seule période d'inactivité.",
|
||||
"schedule_modal_time_off": "Suspendre le blocage :",
|
||||
"schedule_new": "Nouvel horaire",
|
||||
"schedule_edit": "Modifier l'horaire",
|
||||
"schedule_save": "Enregistrer l'horaire",
|
||||
"schedule_add": "Ajouter un horaire",
|
||||
"schedule_remove": "Supprimer l'horaire",
|
||||
"schedule_from": "Du",
|
||||
"schedule_to": "Au",
|
||||
"sunday": "Dimanche",
|
||||
"monday": "Lundi",
|
||||
"tuesday": "Mardi",
|
||||
"wednesday": "Mercredi",
|
||||
"thursday": "Jeudi",
|
||||
"friday": "Vendredi",
|
||||
"saturday": "Samedi",
|
||||
"sunday_short": "Dim.",
|
||||
"monday_short": "Lun.",
|
||||
"tuesday_short": "Mar.",
|
||||
"wednesday_short": "Mer.",
|
||||
"thursday_short": "Jeu.",
|
||||
"friday_short": "Ven.",
|
||||
"saturday_short": "Sam."
|
||||
}
|
||||
|
|
|
@ -7,7 +7,10 @@
|
|||
"load_balancing": "Load-balancing",
|
||||
"load_balancing_desc": "Pitajte jedan po jedan uzvodni poslužitelj. AdGuard Home koristi svoj ponderirani slučajni algoritam za odabir poslužitelja tako da se najbrži poslužitelj koristi češće.",
|
||||
"bootstrap_dns": "Bootstrap DNS poslužitelji",
|
||||
"bootstrap_dns_desc": "Bootstrap DNS poslužitelji koriste se za rezolvanje IP adresa DoH/DoT rezolvera koje navedete kao upstreams.",
|
||||
"bootstrap_dns_desc": "IP adrese DNS poslužitelja koji se koriste za rješavanje IP adresa DoH/DoT razrjeđivača koje navedete kao uzvodne. Komentari nisu dopušteni.",
|
||||
"fallback_dns_title": "Rezervni DNS poslužitelji",
|
||||
"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",
|
||||
"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_default_resolver": "Prema zadanim postavkama AdGuard Home koristi sljedeće obrnute DNS razrješivače: {{ip}}.",
|
||||
|
@ -125,6 +128,8 @@
|
|||
"top_clients": "Top klijenti",
|
||||
"no_clients_found": "Nema pronađenih klijenata",
|
||||
"general_statistics": "Opća statistika",
|
||||
"top_upstreams": "Top upstream poslužitelji",
|
||||
"no_upstreams_data_found": "Nema podataka o upstream poslužiteljima",
|
||||
"number_of_dns_query_days": "Broj DNS upita obrađenih u posljednja {{count}} dan",
|
||||
"number_of_dns_query_days_plural": "Broj DNS upita obrađenih u posljednja {{count}} dana",
|
||||
"number_of_dns_query_24_hours": "Broj DNS upita obrađenih u posljednja 24 sata",
|
||||
|
@ -134,6 +139,7 @@
|
|||
"enforced_save_search": "Omogućeno sigurno pretraživanje",
|
||||
"number_of_dns_query_to_safe_search": "Broj DNS zahtjeva prema pretraživačima za koje je omogućeno Sigurno pretraživanje",
|
||||
"average_processing_time": "Prosječno vrijeme obrade",
|
||||
"processing_time": "Vrijeme obrade",
|
||||
"average_processing_time_hint": "Prosječno vrijeme u milisekundama za obradu DNS zahtjeva",
|
||||
"block_domain_use_filters_and_hosts": "Blokiraj domene koristeći filtre ili hosts datoteke",
|
||||
"filters_block_toggle_hint": "Pravila blokiranja možete postaviti u postavkama <a>filtara</a>.",
|
||||
|
@ -158,6 +164,7 @@
|
|||
"upstream_dns_configured_in_file": "Postavljeno u {{path}}",
|
||||
"test_upstream_btn": "Testiraj upstream-ove",
|
||||
"upstreams": "Upstreams",
|
||||
"upstream": "Upstream poslužitelj",
|
||||
"apply_btn": "Primijeni",
|
||||
"disabled_filtering_toast": "Onemogućeno filtriranje",
|
||||
"enabled_filtering_toast": "Omogućeno filtriranje",
|
||||
|
@ -564,7 +571,7 @@
|
|||
"rewrite_A": "<0>A</0>: posebna vrijednost, ukloni <0>A</0> zapis od upstreama",
|
||||
"rewrite_AAAA": "<0>AAAA</0>: posebna vrijednost, ukloni <0>AAAA</0> zapis od upstreama",
|
||||
"disable_ipv6": "Onemogući razrješavanje IPv6 adresa",
|
||||
"disable_ipv6_desc": "Ispustite sve DNS upite za IPv6 adrese (upišite AAAA).",
|
||||
"disable_ipv6_desc": "Ignorirajte sve DNS zahtjeve adresa IPv6 (tipa AAAA) i uklonite IPv6 podatke iz HTTPS odgovora.",
|
||||
"fastest_addr": "Najbrža IP adresa",
|
||||
"fastest_addr_desc": "Ispitajte sve DNS poslužitelje i vratite najbržu IP adresu među svim odgovorima. To usporava DNS upite jer AdGuard Home mora čekati odgovore svih DNS poslužitelja, ali poboljšava ukupnu povezanost.",
|
||||
"autofix_warning_text": "Ako pritisnete \"Popravi\", AdGuard Home će postaviti vaš sustav da koristi AdGuardHome DNS poslužitelj.",
|
||||
|
@ -676,5 +683,37 @@
|
|||
"protection_section_label": "Zaštita",
|
||||
"log_and_stats_section_label": "Zapisnik upita i statistika",
|
||||
"ignore_query_log": "Zanemari ovog klijenta u zapisniku upita",
|
||||
"ignore_statistics": "Ignorirajte ovog klijenta u statistici"
|
||||
"ignore_statistics": "Ignorirajte ovog klijenta u statistici",
|
||||
"schedule_services": "Pauziraj blokiranje servisa",
|
||||
"schedule_services_desc": "Konfiguriranje rasporeda pauziranja filtra za blokiranje servisa",
|
||||
"schedule_services_desc_client": "Konfiguriranje rasporeda pauziranja filtra za blokiranje servisa za ovog klijenta",
|
||||
"schedule_desc": "Postavljanje razdoblja neaktivnosti za blokirane servise",
|
||||
"schedule_invalid_select": "Vrijeme početka mora biti prije vremena završetka",
|
||||
"schedule_select_days": "Odabir dana",
|
||||
"schedule_timezone": "Odabir vremenske zone",
|
||||
"schedule_current_timezone": "Trenutna vremenska zona: {{value}}",
|
||||
"schedule_time_all_day": "Cijeli dan",
|
||||
"schedule_modal_description": "Ovaj raspored zamijenit će sve postojeće rasporede za isti dan u tjednu. Svaki dan u tjednu može imati samo jedno razdoblje neaktivnosti.",
|
||||
"schedule_modal_time_off": "Blokiranje usluga je onemogućeno:",
|
||||
"schedule_new": "Novi raspored",
|
||||
"schedule_edit": "Uredi raspored",
|
||||
"schedule_save": "Spremi raspored",
|
||||
"schedule_add": "Dodaj raspored",
|
||||
"schedule_remove": "Ukloni raspored",
|
||||
"schedule_from": "Od",
|
||||
"schedule_to": "Do",
|
||||
"sunday": "Nedjelja",
|
||||
"monday": "Ponedjeljak",
|
||||
"tuesday": "Utorak",
|
||||
"wednesday": "Srijeda",
|
||||
"thursday": "Četvrtak",
|
||||
"friday": "Petak",
|
||||
"saturday": "Subota",
|
||||
"sunday_short": "Ned",
|
||||
"monday_short": "Pon",
|
||||
"tuesday_short": "Uto",
|
||||
"wednesday_short": "Sri",
|
||||
"thursday_short": "Čet",
|
||||
"friday_short": "Pet",
|
||||
"saturday_short": "Sub"
|
||||
}
|
||||
|
|
|
@ -7,12 +7,15 @@
|
|||
"load_balancing": "Terheléselosztás",
|
||||
"load_balancing_desc": "Egyszerre csak egy szerverről történjen lekérdezés. Az AdGuard Home egy súlyozott, véletlenszerű algoritmust fog használni a megfelelő szerver kiválasztására, így a leggyorsabb szervert fogja a leggyakrabban használni.",
|
||||
"bootstrap_dns": "Bootstrap DNS kiszolgálók",
|
||||
"bootstrap_dns_desc": "A Bootstrap DNS szerverek a DoH/DoT feloldók IP-címeinek feloldására szolgálnak.",
|
||||
"bootstrap_dns_desc": "A DNS-kiszolgálók IP-címei, amelyek a DoH/DoT-feloldók IP-címeinek feloldására szolgálnak, amelyeket upstreamként megadott. Megjegyzések nem megengedettek.",
|
||||
"fallback_dns_title": "Tartalék DNS-szerverek",
|
||||
"fallback_dns_desc": "Azoknak a tartalék DNS-szervereknek a listája, amelyeket akkor használnak, ha a felsőbbrendű DNS-szerverek nem válaszolnak. A szintaxis ugyanaz, mint a fő felsőbbrendű mezőben.",
|
||||
"fallback_dns_placeholder": "Adjon meg egy alternatív DNS szervert soronként",
|
||||
"local_ptr_title": "Privát DNS szerverek",
|
||||
"local_ptr_desc": "Azok a DNS szerverek, amiket az AdGuard Home a helyi PTR kérésekhez használ. ",
|
||||
"local_ptr_default_resolver": "Alapesetben az AdGuard Home a következő reverse DNS feloldókat használja: {{ip}}.",
|
||||
"local_ptr_no_default_resolver": "Az AdGuard Home nem tudta meghatározni a privát reverse DNS feloldókat ehhez a rendszerhez.",
|
||||
"local_ptr_placeholder": "Adjon meg soronként egy kiszolgáló címet",
|
||||
"local_ptr_placeholder": "Adjon meg egy IP-címet soronként",
|
||||
"resolve_clients_title": "Kliensek IP címeinek fordított feloldása",
|
||||
"resolve_clients_desc": "Fordítva oldja fel a kliensek IP címeit a hosztneveikre azáltal, hogy PTR lekérdezéseket küld a megfelelő feloldóknak (privát DNS szerverek a helyi kliensek számára, upstream szerverek a nyilvános IP címmel rendelkező kliensek számára).",
|
||||
"use_private_ptr_resolvers_title": "Privát reverse DNS feloldók használata",
|
||||
|
@ -125,6 +128,8 @@
|
|||
"top_clients": "Legaktívabb kliensek",
|
||||
"no_clients_found": "Nem található kliens",
|
||||
"general_statistics": "Általános statisztikák",
|
||||
"top_upstreams": "Top upstream szerverek",
|
||||
"no_upstreams_data_found": "Nem található upstream szerver adat",
|
||||
"number_of_dns_query_days": "Lekérdezések száma az utolsó {{count}} napban",
|
||||
"number_of_dns_query_days_plural": "Feldolgozott DNS lekérdezések száma az utolsó {{count}} napban",
|
||||
"number_of_dns_query_24_hours": "Az elmúlt 24 órában feldolgozott DNS lekérdezések száma",
|
||||
|
@ -134,6 +139,7 @@
|
|||
"enforced_save_search": "Kényszerített biztonságos keresés",
|
||||
"number_of_dns_query_to_safe_search": "A biztonságos keresésre kényszerített DNS lekérdezések száma",
|
||||
"average_processing_time": "Átlagos feldolgozási idő",
|
||||
"processing_time": "Feldolgozási idő",
|
||||
"average_processing_time_hint": "A DNS lekérdezések feldolgozásához szükséges átlagos idő milliszekundumban",
|
||||
"block_domain_use_filters_and_hosts": "Domainek blokkolása szűrők és hosztfájlok használatával",
|
||||
"filters_block_toggle_hint": "A <a> szűrőbeállításoknál</a> megadhatja a blokkolási szabályokat.",
|
||||
|
@ -158,6 +164,7 @@
|
|||
"upstream_dns_configured_in_file": "Beállítva itt: {{path}}",
|
||||
"test_upstream_btn": "Upstreamek tesztelése",
|
||||
"upstreams": "Upstream-ek",
|
||||
"upstream": "Upstream szerver",
|
||||
"apply_btn": "Alkalmaz",
|
||||
"disabled_filtering_toast": "Szűrés letiltva",
|
||||
"enabled_filtering_toast": "Szűrés engedélyezve",
|
||||
|
@ -493,7 +500,7 @@
|
|||
"form_error_answer_format": "Érvénytelen válasz formátum",
|
||||
"configure": "Beállítás",
|
||||
"main_settings": "Fő beállítások",
|
||||
"block_services": "Speciális szolgáltatások blokkolása",
|
||||
"block_services": "Adott szolgáltatások blokkolása",
|
||||
"blocked_services": "Blokkolt szolgáltatások",
|
||||
"blocked_services_desc": "Lehetővé teszi a népszerű oldalak és szolgáltatások blokkolását.",
|
||||
"blocked_services_saved": "Blokkolt szolgáltatások sikeresen mentve",
|
||||
|
@ -564,7 +571,7 @@
|
|||
"rewrite_A": "<0>A</0>: speciális érték, megtartja az upstream felől érkező <0>A</0> rekordokat",
|
||||
"rewrite_AAAA": "<0>AAAA</0>: speciális érték, megtartja az upstream felől érkező <0>AAAA</0> rekordokat",
|
||||
"disable_ipv6": "IPv6 címek feloldásának tiltása",
|
||||
"disable_ipv6_desc": "Összes DNS kérés eldobása az IPv6 címekhez (AAAA típus).",
|
||||
"disable_ipv6_desc": "Dobja el az IPv6-címekre vonatkozó összes DNS-lekérdezést (AAAA típusú), és távolítsa el az IPv6-tippeket a HTTPS-válaszokból.",
|
||||
"fastest_addr": "Leggyorsabb IP-cím",
|
||||
"fastest_addr_desc": "Kérdezze le az összes DNS-kiszolgálót, és adja vissza a leggyorsabb IP-címet a válaszok közül. Ez lelassítja a DNS-lekérdezéseket, mivel az összes DNS-kiszolgáló esetében meg kell várnunk a válaszokat, de javítja az összeköttetést.",
|
||||
"autofix_warning_text": "Ha a \"Javítás\" lehetőségre kattint, az AdGuard Home megpróbálja beállítani a rendszerét, hogy használja az AdGuard Home DNS szervert.",
|
||||
|
@ -676,5 +683,37 @@
|
|||
"protection_section_label": "Védelem",
|
||||
"log_and_stats_section_label": "Lekérdezési napló és statisztikák",
|
||||
"ignore_query_log": "Figyelmen kívül hagyja ezt az ügyfelet a lekérdezési naplóban",
|
||||
"ignore_statistics": "Hagyja figyelmen kívül ezt az ügyfelet a statisztikákban"
|
||||
"ignore_statistics": "Hagyja figyelmen kívül ezt az ügyfelet a statisztikákban",
|
||||
"schedule_services": "A szolgáltatás blokkolásának szüneteltetése",
|
||||
"schedule_services_desc": "Állítsa be a szolgáltatásblokkoló szűrő szüneteltetési ütemezését",
|
||||
"schedule_services_desc_client": "Állítsa be a szolgáltatásblokkoló szűrő szüneteltetési ütemezését ehhez az ügyfélhez",
|
||||
"schedule_desc": "Inaktivitási időszakok beállítása a blokkolt szolgáltatásokhoz",
|
||||
"schedule_invalid_select": "A kezdési időpontnak a befejezési időpont előtt kell lennie",
|
||||
"schedule_select_days": "Napok kiválasztása",
|
||||
"schedule_timezone": "Válasszon időzónát",
|
||||
"schedule_current_timezone": "Jelenlegi időzóna: {{value}}",
|
||||
"schedule_time_all_day": "Egész nap",
|
||||
"schedule_modal_description": "Ez az ütemezés felváltja a hét ugyanazon napjára vonatkozó meglévő ütemezéseket. A hét minden napján csak egy inaktivitási időszak lehet.",
|
||||
"schedule_modal_time_off": "Nincs szolgáltatás blokkolás:",
|
||||
"schedule_new": "Új ütemezés",
|
||||
"schedule_edit": "Ütemezés szerkesztése",
|
||||
"schedule_save": "Ütemezés mentése",
|
||||
"schedule_add": "Ütemezés hozzáadása",
|
||||
"schedule_remove": "Ütemezés eltávolítása",
|
||||
"schedule_from": "Ettől:",
|
||||
"schedule_to": "Eddig:",
|
||||
"sunday": "Vasárnap",
|
||||
"monday": "Hétfő",
|
||||
"tuesday": "Kedd",
|
||||
"wednesday": "Szerda",
|
||||
"thursday": "Csütörtök",
|
||||
"friday": "Péntek",
|
||||
"saturday": "Szombat",
|
||||
"sunday_short": "Vas",
|
||||
"monday_short": "Hét",
|
||||
"tuesday_short": "Kedd",
|
||||
"wednesday_short": "Szer",
|
||||
"thursday_short": "Csüt",
|
||||
"friday_short": "Pén",
|
||||
"saturday_short": "Szom"
|
||||
}
|
||||
|
|
|
@ -7,7 +7,7 @@
|
|||
"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.",
|
||||
"bootstrap_dns": "Server DNS bootstrap",
|
||||
"bootstrap_dns_desc": "Server Bootstrap DNS dapat digunakan untuk meresolve alamat IP pada DoH/DoT resolvers yang Anda tentukan sebagai upstreams.",
|
||||
"bootstrap_dns_desc": "Alamat IP server DNS yang digunakan untuk menyelesaikan alamat IP resolver DoH/DoT yang Anda tentukan sebagai upstream. Komentar tidak diizinkan.",
|
||||
"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_default_resolver": "Secara bawaan, AdGuard Home menggunakan pemecah DNS terbalik: {{ip}}.",
|
||||
|
@ -125,6 +125,8 @@
|
|||
"top_clients": "Klien teratas",
|
||||
"no_clients_found": "Tidak ditemukan klien",
|
||||
"general_statistics": "Statistik umum",
|
||||
"top_upstreams": "Top servers upstream",
|
||||
"no_upstreams_data_found": "Tidak ada data server upstream yang ditemukan",
|
||||
"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_24_hours": "Jumlah kueri DNS diproses selama 24 jam terakhir",
|
||||
|
@ -158,6 +160,7 @@
|
|||
"upstream_dns_configured_in_file": "Diatur dalam {{path}}",
|
||||
"test_upstream_btn": "Uji hulu",
|
||||
"upstreams": "Upstream",
|
||||
"upstream": "Server upstream",
|
||||
"apply_btn": "Terapkan",
|
||||
"disabled_filtering_toast": "Penyaringan nonaktif",
|
||||
"enabled_filtering_toast": "Penyaringan aktif",
|
||||
|
@ -556,7 +559,7 @@
|
|||
"rewrite_A": "<0>A</0>: nilai khusus, biarkan <0>A</0> merekam dari upstream",
|
||||
"rewrite_AAAA": "<0>AAAA</0>: nilai khusus, biarkan <0>AAAA</0> merekam dari upstream",
|
||||
"disable_ipv6": "Nonaktifkan penyelesaian alamat IPv6",
|
||||
"disable_ipv6_desc": "Jatuhkan semua kueri DNS untuk alamat IPv6 (ketik AAAA).",
|
||||
"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_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.",
|
||||
|
@ -644,5 +647,27 @@
|
|||
"confirm_dns_cache_clear": "Apakah Anda yakin ingin menghapus cache DNS?",
|
||||
"cache_cleared": "Cache DNS berhasil dibersihkan",
|
||||
"clear_cache": "Hapus cache",
|
||||
"protection_section_label": "Perlindungan"
|
||||
"theme_light_desc": "Tema terang",
|
||||
"protection_section_label": "Perlindungan",
|
||||
"schedule_services": "Menjeda 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_desc": "Tetapkan periode tidak aktif untuk layanan yang diblokir",
|
||||
"schedule_invalid_select": "Waktu mulai harus sebelum waktu akhir",
|
||||
"schedule_select_days": "Pilih hari",
|
||||
"schedule_timezone": "Pilih zona waktu",
|
||||
"schedule_current_timezone": "Zona waktu saat ini: {{value}}",
|
||||
"schedule_time_all_day": "Sepanjang hari",
|
||||
"schedule_modal_description": "Jadwal ini akan menggantikan jadwal sekarang untuk hari yang sama. Setiap hari di setiap minggu hanya boleh ada satu periode tidak aktif.",
|
||||
"schedule_modal_time_off": "Tidak ada pemblokiran layanan:",
|
||||
"schedule_new": "Jadwal baru",
|
||||
"schedule_edit": "Edit jadwal",
|
||||
"schedule_save": "Simpan jadwal",
|
||||
"sunday_short": "Ming",
|
||||
"monday_short": "Sen",
|
||||
"tuesday_short": "Sel",
|
||||
"wednesday_short": "Rab",
|
||||
"thursday_short": "Kam",
|
||||
"friday_short": "Jum",
|
||||
"saturday_short": "Sab"
|
||||
}
|
||||
|
|
|
@ -7,12 +7,15 @@
|
|||
"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.",
|
||||
"bootstrap_dns": "Server DNS bootstrap",
|
||||
"bootstrap_dns_desc": "I server DNS di bootstrap sono utilizzati per risolvere gli indirizzi IP dei risolutori DoH/DoT specificati come upstream.",
|
||||
"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_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",
|
||||
"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_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_placeholder": "Inserisci un indirizzo server 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_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",
|
||||
|
@ -125,6 +128,8 @@
|
|||
"top_clients": "Client più utilizzati",
|
||||
"no_clients_found": "Nessun client trovato",
|
||||
"general_statistics": "Statistiche generali",
|
||||
"top_upstreams": "Top upstream",
|
||||
"no_upstreams_data_found": "Nessun dato upstream trovato",
|
||||
"number_of_dns_query_days": "Numero di richieste DNS elaborate negli ultimi {{count}} giorni",
|
||||
"number_of_dns_query_days_plural": "Numero di richieste DNS elaborate negli ultimi {{count}} giorni",
|
||||
"number_of_dns_query_24_hours": "Numero di richieste DNS elaborate nelle ultime 24 ore",
|
||||
|
@ -134,6 +139,7 @@
|
|||
"enforced_save_search": "Ricerca sicura forzata",
|
||||
"number_of_dns_query_to_safe_search": "Numero di richieste DNS dai motori di ricerca per i quali la Ricerca Sicura è stata forzata",
|
||||
"average_processing_time": "Tempo di elaborazione medio",
|
||||
"processing_time": "Tempo di elaborazione",
|
||||
"average_processing_time_hint": "Tempo medio in millisecondi per elaborare una richiesta DNS",
|
||||
"block_domain_use_filters_and_hosts": "Blocca domini utilizzando filtri e file hosts",
|
||||
"filters_block_toggle_hint": "Puoi impostare le regole di blocco nelle impostazioni dei <a>Filtri</a>.",
|
||||
|
@ -158,6 +164,7 @@
|
|||
"upstream_dns_configured_in_file": "Configurato su {{path}}",
|
||||
"test_upstream_btn": "Testa gli upstream",
|
||||
"upstreams": "Upstream",
|
||||
"upstream": "Upstream",
|
||||
"apply_btn": "Applica",
|
||||
"disabled_filtering_toast": "Disattiva filtri",
|
||||
"enabled_filtering_toast": "Attiva filtri",
|
||||
|
@ -564,7 +571,7 @@
|
|||
"rewrite_A": "<0>A</0>: valore speciale, mantieni registrazioni <0>A</0> dall'upstream",
|
||||
"rewrite_AAAA": "<0>AAAA</0>: valore speciale, mantieni registrazioni <0>AAAA</0> dall'upstream",
|
||||
"disable_ipv6": "Disattiva risoluzione indirizzi IPv6",
|
||||
"disable_ipv6_desc": "Elimina tutte le richieste DNS per gli indirizzi IPv6 (tipo AAAA).",
|
||||
"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_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à.",
|
||||
"autofix_warning_text": "Se fai clic su \"Correggi\", AdGuardHome configurerà il tuo sistema per utilizzare il server DNS AdGuardHome.",
|
||||
|
@ -676,5 +683,37 @@
|
|||
"protection_section_label": "Protezione",
|
||||
"log_and_stats_section_label": "Registro richieste e statistiche",
|
||||
"ignore_query_log": "Ignora questo client nel registro delle richieste",
|
||||
"ignore_statistics": "Ignora questo cliente nelle statistiche"
|
||||
"ignore_statistics": "Ignora questo cliente nelle statistiche",
|
||||
"schedule_services": "Sospendere il blocco del servizio",
|
||||
"schedule_services_desc": "Configura la pianificazione della pausa del filtro di blocco dei servizi",
|
||||
"schedule_services_desc_client": "Configura la pianificazione della pausa del filtro di blocco dei servizi per questo client",
|
||||
"schedule_desc": "Impostare periodi di inattività per i servizi bloccati",
|
||||
"schedule_invalid_select": "L'ora di inizio deve essere precedente all'ora di fine",
|
||||
"schedule_select_days": "Selezionare i giorni",
|
||||
"schedule_timezone": "Selezionare un fuso orario",
|
||||
"schedule_current_timezone": "Fuso orario attuale: {{value}}",
|
||||
"schedule_time_all_day": "Tutto il giorno",
|
||||
"schedule_modal_description": "Questo pianificazione sostituirà tutti gli orari esistenti per lo stesso giorno della settimana. Ogni giorno della settimana può avere un solo periodo d'inattività.",
|
||||
"schedule_modal_time_off": "Sospendere il blocco del servizio:",
|
||||
"schedule_new": "Nuovo programma",
|
||||
"schedule_edit": "Modificare programma",
|
||||
"schedule_save": "Salvare programma",
|
||||
"schedule_add": "Aggiungere programma",
|
||||
"schedule_remove": "Rimuovere programma",
|
||||
"schedule_from": "Dal",
|
||||
"schedule_to": "Al",
|
||||
"sunday": "Domenica",
|
||||
"monday": "Lunedi",
|
||||
"tuesday": "Martedì",
|
||||
"wednesday": "Mercoledì",
|
||||
"thursday": "Giovedì",
|
||||
"friday": "Venerdì",
|
||||
"saturday": "Sabato",
|
||||
"sunday_short": "Dom",
|
||||
"monday_short": "Lun",
|
||||
"tuesday_short": "Mar",
|
||||
"wednesday_short": "Mer",
|
||||
"thursday_short": "Gio",
|
||||
"friday_short": "Ven",
|
||||
"saturday_short": "Sab"
|
||||
}
|
||||
|
|
|
@ -7,16 +7,19 @@
|
|||
"load_balancing": "ロードバランシング",
|
||||
"load_balancing_desc": "一度に1つのアップストリームサーバに処理要求します。 AdGuard Homeは、重み付きランダムアルゴリズム(weighted random algorithm)を使用してサーバを選択するため、最速のサーバがより頻繁に使用されます。",
|
||||
"bootstrap_dns": "ブートストラップDNSサーバ",
|
||||
"bootstrap_dns_desc": "ブートストラップDNSサーバは、上流として指定したDoH/DoTリゾルバのIPアドレスを解決するために使用されます。",
|
||||
"bootstrap_dns_desc": "アップストリームとして指定したDoH/DoTリゾルバのIPアドレスを解決するために使用されるDNSサーバーのIPアドレスです。(コメントは許可されていません)",
|
||||
"fallback_dns_title": "フォールバックDNSサーバー",
|
||||
"fallback_dns_desc": "アップストリームDNSサーバーが応答しない場合に使用されるフォールバックDNSサーバーのリストです。構文は上記のmain upstreamsフィールドと同じです。",
|
||||
"fallback_dns_placeholder": "フォールバックDNSサーバーを1行に1つずつ入力してください。",
|
||||
"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_default_resolver": "デフォルトでは、AdGuard Homeは次のリバースDNSリゾルバを使用します: {{ip}}",
|
||||
"local_ptr_no_default_resolver": "AdGuard Homeは、このシステムに適したプライベートリバースDNSリゾルバを特定できませんでした。",
|
||||
"local_ptr_placeholder": "1行に1つのサーバを入力してください。",
|
||||
"local_ptr_placeholder": "IPアドレスを1行に1つずづ入力してください。",
|
||||
"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_desc": "これらの上流サーバを使用して、ローカルで提供されるアドレスのリバースDNSルックアップを実行します。無効にすると、AdGuard Homeは、DHCP, /etc/hosts などから認識されるクライアントを除き、すべてのこのようなPTR要求にNXDOMAINで応答します。",
|
||||
"use_private_ptr_resolvers_desc": "これらのアップストリームサーバーを使用して、ローカルで提供されるアドレスのリバースDNSルックアップを実行します。無効にすると、AdGuard Homeは、DHCP, /etc/hosts などから認識されるクライアントを除き、すべてのこのようなPTR要求にNXDOMAINで応答します。",
|
||||
"check_dhcp_servers": "DHCPサーバをチェックする",
|
||||
"save_config": "構成を保存する",
|
||||
"enabled_dhcp": "DHCPサーバを有効にしました",
|
||||
|
@ -125,6 +128,8 @@
|
|||
"top_clients": "トップクライアント",
|
||||
"no_clients_found": "クライアント情報はありません",
|
||||
"general_statistics": "全般的な統計",
|
||||
"top_upstreams": "上位のアップストリーム",
|
||||
"no_upstreams_data_found": "アップストリームのデータが見つかりません",
|
||||
"number_of_dns_query_days": "過去{{count}}日間に処理されたDNSクエリの数",
|
||||
"number_of_dns_query_days_plural": "過去{{count}}日間に処理されたDNSクエリの数",
|
||||
"number_of_dns_query_24_hours": "過去24時間に処理されたDNSクエリの数",
|
||||
|
@ -134,6 +139,7 @@
|
|||
"enforced_save_search": "強制されたセーフサーチ",
|
||||
"number_of_dns_query_to_safe_search": "セーフサーチが強制適用された検索エンジンへのDNSリクエストの数",
|
||||
"average_processing_time": "平均処理時間",
|
||||
"processing_time": "処理時間",
|
||||
"average_processing_time_hint": "DNSリクエストの処理にかかる平均時間(ミリ秒単位)",
|
||||
"block_domain_use_filters_and_hosts": "フィルタとhostsファイルを使用してドメインをブロックする",
|
||||
"filters_block_toggle_hint": "<a>フィルタ</a>の設定でブロックするルールを設定することができます。",
|
||||
|
@ -153,11 +159,12 @@
|
|||
"custom_filtering_rules": "カスタム・フィルタリングルール",
|
||||
"encryption_settings": "暗号化設定",
|
||||
"dhcp_settings": "DHCP設定",
|
||||
"upstream_dns": "上流DNSサーバ",
|
||||
"upstream_dns_help": "サーバのアドレスは1行に1つずつ入力してください。上流DNSサーバの構成設定について詳しくは<a>こちら</a>でご確認いただけます。",
|
||||
"upstream_dns": "アップストリームDNSサーバー",
|
||||
"upstream_dns_help": "サーバのアドレスは1行に1つずつ入力してください。アップストリームDNSサーバーの構成設定について詳しくは<a>こちら</a>でご確認いただけます。",
|
||||
"upstream_dns_configured_in_file": "{{path}} にて設定されています",
|
||||
"test_upstream_btn": "上流サーバをテストする",
|
||||
"upstreams": "上流",
|
||||
"test_upstream_btn": "アップストリームをテストする",
|
||||
"upstreams": "アップストリーム",
|
||||
"upstream": "アップストリーム",
|
||||
"apply_btn": "適用する",
|
||||
"disabled_filtering_toast": "フィルタリングを無効にしました",
|
||||
"enabled_filtering_toast": "フィルタリングを有効にしました",
|
||||
|
@ -220,7 +227,7 @@
|
|||
"example_upstream_tcp_port": "レギュラーDNS(over TCP、ポート付き);",
|
||||
"example_upstream_tcp_hostname": "通常のDNS(over TCP, ホスト名)。",
|
||||
"all_lists_up_to_date_toast": "すべてのリストは既に最新です",
|
||||
"updated_upstream_dns_toast": "上流DNSサーバを保存しました。",
|
||||
"updated_upstream_dns_toast": "アップストリームサーバーを保存しました。",
|
||||
"dns_test_ok_toast": "指定されたDNSサーバは正しく動作しています",
|
||||
"dns_test_not_ok_toast": "サーバ \"{{key}}\": 使用できませんでした。正しく入力されているかどうかを確認してください",
|
||||
"dns_test_warning_toast": "アップストリーム\"{{key}}\"はテストリクエストに応答せず、正しく動作しない可能性があります。",
|
||||
|
@ -564,7 +571,7 @@
|
|||
"rewrite_A": "<0>A</0>:特別な値、アップストリームからの<0>A</0>記録を保持します。",
|
||||
"rewrite_AAAA": "<0>AAAA</0>:特別な値、アップストリームからの<0>AAAA</0>記録を保持します。",
|
||||
"disable_ipv6": "IPv6アドレスの解決を無効にする",
|
||||
"disable_ipv6_desc": "IPv6アドレス(タイプAAAA)に対するすべてのDNSクエリをドロップします。",
|
||||
"disable_ipv6_desc": "IPv6アドレス(タイプAAAA)に対するDNSクエリをすべて破棄し、HTTPS応答から IPv6 hint を削除します。",
|
||||
"fastest_addr": "最速のIPアドレス",
|
||||
"fastest_addr_desc": "すべてのDNSサーバーに処理要求し、全応答の中で最速のIPアドレスを返します。これにより、AdGuard HomeがすべてのDNSサーバーからの応答を待つ必要があるため、DNSクエリが遅くなりますが、全体的な接続性は向上します。",
|
||||
"autofix_warning_text": "「修正」をクリックすると、AdGuardHomeはAdGuardHome DNSサーバを使用するようにシステムを構成します。",
|
||||
|
@ -623,7 +630,7 @@
|
|||
"enter_cache_size": "キャッシュサイズ(バイト単位)を入力してください",
|
||||
"enter_cache_ttl_min_override": "最小TTL(秒単位)を入力してください",
|
||||
"enter_cache_ttl_max_override": "最大TTL(秒単位)を入力してください",
|
||||
"cache_ttl_min_override_desc": "DNS応答をキャッシュするとき、上流サーバから受信した短いTTL(秒単位)を延長します。",
|
||||
"cache_ttl_min_override_desc": "DNS応答をキャッシュするとき、アップストリームサーバーから受信した短いTTL(秒単位)を延長します。",
|
||||
"cache_ttl_max_override_desc": "DNSキャッシュ内のエントリの最大TTL(秒単位)を設定します。",
|
||||
"ttl_cache_validation": "最小キャッシュTTL上書き値は最大値以下にする必要があります",
|
||||
"cache_optimistic": "Optimistic cashing (オプティミスティック・キャッシュ)",
|
||||
|
@ -676,5 +683,37 @@
|
|||
"protection_section_label": "AdGuardによる保護",
|
||||
"log_and_stats_section_label": "クエリ・ログと統計情報",
|
||||
"ignore_query_log": "クエリ・ログでこのクライアントを無視する",
|
||||
"ignore_statistics": "統計でこのクライアントを無視する"
|
||||
"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": "※このスケジュールは、同じ曜日に対する既存スケジュールがある場合、すべて置き換えます。\n各曜日ごとに設定できる非アクティブ期間は一つに限ります。",
|
||||
"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": "月",
|
||||
"tuesday_short": "火",
|
||||
"wednesday_short": "水",
|
||||
"thursday_short": "木",
|
||||
"friday_short": "金",
|
||||
"saturday_short": "土"
|
||||
}
|
||||
|
|
|
@ -7,12 +7,15 @@
|
|||
"load_balancing": "로드 밸런싱",
|
||||
"load_balancing_desc": "한 번에 하나의 서버씩 질의합니다. AdGuard Home은 가중 랜덤 알고리즘를 사용해서 가장 빠른 서버가 자주 사용되도록 서버를 선택합니다.",
|
||||
"bootstrap_dns": "부트스트랩 DNS 서버",
|
||||
"bootstrap_dns_desc": "부트스트랩 DNS 서버는 업스트림으로 지정한 DoH/DoT 서버의 IP 주소를 확인하는 데 사용합니다.",
|
||||
"bootstrap_dns_desc": "업스트림으로 지정한 DoH/DoT 리졸버의 IP 주소를 확인하는 데 사용되는 DNS 서버의 IP 주소입니다. 주석은 허용되지 않습니다.",
|
||||
"fallback_dns_title": "폴백 DNS 서버",
|
||||
"fallback_dns_desc": "업스트림 DNS 서버가 응답하지 않을 때 사용되는 폴백 DNS 서버 목록입니다. 구문은 위의 기본 업스트림 필드와 동일합니다.",
|
||||
"fallback_dns_placeholder": "한 줄에 하나의 폴백 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_default_resolver": "기본적으로 AdGuard Home에서는 {{ip}} 역방향 DNS 서버를 이용합니다.",
|
||||
"local_ptr_no_default_resolver": "AdGuard Home에서 이 시스템에 적합한 사설 역방향 프라이빗 DNS 서버를 결정할 수 없습니다.",
|
||||
"local_ptr_placeholder": "한 줄에 하나씩 서버 주소 입력",
|
||||
"local_ptr_placeholder": "한 줄에 하나씩 IP 주소를 입력하세요.",
|
||||
"resolve_clients_title": "클라이언트 IP 주소에 대한 호스트명 확인 활성화",
|
||||
"resolve_clients_desc": "해당 서버에 대한 PTR 쿼리를 통해 클라이언트의 도메인 이름을 정의합니다. (로컬 클라이언트의 경우 프라이빗 DNS 서버, 공용 IP 주소가 있는 클라이언트의 경우 업스트림 서버).",
|
||||
"use_private_ptr_resolvers_title": "프라이빗 역방향 DNS 리졸버 사용",
|
||||
|
@ -125,6 +128,8 @@
|
|||
"top_clients": "클라이언트",
|
||||
"no_clients_found": "클라이언트가 없습니다",
|
||||
"general_statistics": "일반 통계",
|
||||
"top_upstreams": "상위 업스트림",
|
||||
"no_upstreams_data_found": "업스트림 데이터 없음",
|
||||
"number_of_dns_query_days": "최근 {{count}}일 동안 처리된 DNS 쿼리의 수",
|
||||
"number_of_dns_query_days_plural": "최근 {{count}}일 동안 처리된 DNS 쿼리의 수",
|
||||
"number_of_dns_query_24_hours": "최근 24시간 동안 처리된 DNS 쿼리의 수",
|
||||
|
@ -134,6 +139,7 @@
|
|||
"enforced_save_search": "세이프서치 강제",
|
||||
"number_of_dns_query_to_safe_search": "세이프서치가 적용된 검색 엔진에 대해 DNS 요청 수",
|
||||
"average_processing_time": "평균처리 시간",
|
||||
"processing_time": "처리 시간",
|
||||
"average_processing_time_hint": "DNS 요청 처리시 평균 시간(밀리초)",
|
||||
"block_domain_use_filters_and_hosts": "필터 및 호스트 파일을 사용하여 도메인 차단",
|
||||
"filters_block_toggle_hint": "차단규칙<a>필터</a>을 설정할 수 있습니다.",
|
||||
|
@ -158,6 +164,7 @@
|
|||
"upstream_dns_configured_in_file": "{{path}}에서 구성됨",
|
||||
"test_upstream_btn": "업스트림 테스트",
|
||||
"upstreams": "업스트림",
|
||||
"upstream": "업스트림",
|
||||
"apply_btn": "적용",
|
||||
"disabled_filtering_toast": "필터링 비활성화됨",
|
||||
"enabled_filtering_toast": "필터링 활성화됨",
|
||||
|
@ -564,7 +571,7 @@
|
|||
"rewrite_A": "<0> A</0>: 특수 값, 업스트림에서 <0> A</0> 기록 유지",
|
||||
"rewrite_AAAA": "<0> AAAA</0>: 특수 값, 업스트림에서 <0> AAAA</0> 기록 유지",
|
||||
"disable_ipv6": "IPv6 주소 확인 비활성화",
|
||||
"disable_ipv6_desc": "IPv6 주소(타입 AAAA)의 모든 DNS 쿼리가 무시됩니다.",
|
||||
"disable_ipv6_desc": "IPv6 주소(AAAA 유형)에 대한 모든 DNS 쿼리를 무시하고 HTTPS 유형 응답에서 IPv6 데이터를 제거합니다.",
|
||||
"fastest_addr": "가장 빠른 IP 주소",
|
||||
"fastest_addr_desc": "모든 DNS 서버에 쿼리를 수행한 다음 반응이 가장 빠른 IP주소를 반송합니다. AdGuard Home이 모든 DNS 서버의 응답을 기다려야 하기 때문에 DNS 쿼리 속도가 느려지지만 전반적인 연결이 향상됩니다.",
|
||||
"autofix_warning_text": "'수정'을 클릭하면 AdGuard Home이 AdGuard Home DNS 서버를 사용하도록 시스템을 설정합니다.",
|
||||
|
@ -676,5 +683,37 @@
|
|||
"protection_section_label": "보호",
|
||||
"log_and_stats_section_label": "쿼리 로그 및 통계",
|
||||
"ignore_query_log": "쿼리 로그에서 이 클라이언트 무시",
|
||||
"ignore_statistics": "통계에서 이 클라이언트 무시"
|
||||
"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": "월",
|
||||
"tuesday_short": "화",
|
||||
"wednesday_short": "수",
|
||||
"thursday_short": "목",
|
||||
"friday_short": "금",
|
||||
"saturday_short": "토"
|
||||
}
|
||||
|
|
|
@ -7,12 +7,15 @@
|
|||
"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.",
|
||||
"bootstrap_dns": "Bootstrap DNS-servers",
|
||||
"bootstrap_dns_desc": "Bootstrap DNS-servers worden gebruikt om IP-adressen op te lossen van de DoH / DoT-resolvers die u opgeeft als upstreams.",
|
||||
"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_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",
|
||||
"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_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_placeholder": "Voer één serveradres per regel in",
|
||||
"local_ptr_placeholder": "Voer één IP-adres per regel in",
|
||||
"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).",
|
||||
"use_private_ptr_resolvers_title": "Private omgekeerde DNS-resolvers gebruiken",
|
||||
|
@ -125,6 +128,8 @@
|
|||
"top_clients": "Top gebruikers",
|
||||
"no_clients_found": "Geen gebruikers gevonden",
|
||||
"general_statistics": "Algemene statistieken",
|
||||
"top_upstreams": "Top upstreams",
|
||||
"no_upstreams_data_found": "Geen upstreams-gegevens gevonden",
|
||||
"number_of_dns_query_days": "Aantal verwerkte DNS aanvragen van de laatste {{count}} dag",
|
||||
"number_of_dns_query_days_plural": "Aantal verwerkte DNS aanvragen van de laatste {{count}} dagen",
|
||||
"number_of_dns_query_24_hours": "Aantal verwerkte DNS aanvragen van de laatste 24 uur",
|
||||
|
@ -134,6 +139,7 @@
|
|||
"enforced_save_search": "Geforceerd veilig zoeken",
|
||||
"number_of_dns_query_to_safe_search": "Aantal DNS aanvragen in zoekmachines dmv geforceerd veilig zoeken",
|
||||
"average_processing_time": "Gemiddelde procestijd",
|
||||
"processing_time": "Verwerkingstijd",
|
||||
"average_processing_time_hint": "Gemiddelde verwerkingstijd in milliseconden van een DNS aanvraag",
|
||||
"block_domain_use_filters_and_hosts": "Domeinen blokkeren d.m.v. filters en host-bestanden",
|
||||
"filters_block_toggle_hint": "Je kan blokkeringsregels toevoegen in de <a>Filters</a> instellingen.",
|
||||
|
@ -158,6 +164,7 @@
|
|||
"upstream_dns_configured_in_file": "Geconfigureerd in {{path}}",
|
||||
"test_upstream_btn": "Test upstream",
|
||||
"upstreams": "Upstreams",
|
||||
"upstream": "Upstream",
|
||||
"apply_btn": "Toepassen",
|
||||
"disabled_filtering_toast": "Filters uitgeschakeld",
|
||||
"enabled_filtering_toast": "Filters ingeschakeld",
|
||||
|
@ -564,7 +571,7 @@
|
|||
"rewrite_A": "<0>A</0>: speciale waarde, <0>A</0> records uit de upstream bewaren",
|
||||
"rewrite_AAAA": "<0>AAAA</0>: speciale waarde, <0>AAAA</0> records uit de upstream bewaren",
|
||||
"disable_ipv6": "Oplossen IPv6-adressen uitschakelen",
|
||||
"disable_ipv6_desc": "Alle DNS-query's voor IPv6-adressen (type AAAA) 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_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.",
|
||||
"autofix_warning_text": "Als je op \"Repareren\" klikt, configureert AdGuard Home jouw systeem om de AdGuard Home DNS-server te gebruiken.",
|
||||
|
@ -676,5 +683,37 @@
|
|||
"protection_section_label": "Bescherming",
|
||||
"log_and_stats_section_label": "Aanvragenlogboek en statistieken",
|
||||
"ignore_query_log": "Deze client negeren in het aanvragenlogboek",
|
||||
"ignore_statistics": "Deze client negeren in de statistieken"
|
||||
"ignore_statistics": "Deze client negeren in de statistieken",
|
||||
"schedule_services": "Serviceblokkering onderbreken",
|
||||
"schedule_services_desc": "Het pauzeschema van het serviceblokkeringsfilter configureren",
|
||||
"schedule_services_desc_client": "Het pauzeschema van het serviceblokkeringsfilter voor deze client configureren",
|
||||
"schedule_desc": "Inactiviteitsperioden instellen voor geblokkeerde services",
|
||||
"schedule_invalid_select": "Begintijd moet vóór eindtijd liggen",
|
||||
"schedule_select_days": "Selecteer dagen",
|
||||
"schedule_timezone": "Selecteer een tijdzone",
|
||||
"schedule_current_timezone": "Huidige tijdzone: {{value}}",
|
||||
"schedule_time_all_day": "De hele dag",
|
||||
"schedule_modal_description": "Dit schema vervangt alle bestaande schema's voor dezelfde dag van de week. Elke dag van de week kan slechts één inactiviteitsperiode hebben.",
|
||||
"schedule_modal_time_off": "Geen serviceblokkering:",
|
||||
"schedule_new": "Nieuw schema",
|
||||
"schedule_edit": "Schema bewerken",
|
||||
"schedule_save": "Schema opslaan",
|
||||
"schedule_add": "Schema toevoegen",
|
||||
"schedule_remove": "Schema verwijderen",
|
||||
"schedule_from": "Van",
|
||||
"schedule_to": "tot",
|
||||
"sunday": "zondag",
|
||||
"monday": "maandag",
|
||||
"tuesday": "dinsdag",
|
||||
"wednesday": "woensdag",
|
||||
"thursday": "donderdag",
|
||||
"friday": "vrijdag",
|
||||
"saturday": "zaterdag",
|
||||
"sunday_short": "zo",
|
||||
"monday_short": "ma",
|
||||
"tuesday_short": "di",
|
||||
"wednesday_short": "wo",
|
||||
"thursday_short": "do",
|
||||
"friday_short": "vr",
|
||||
"saturday_short": "za"
|
||||
}
|
||||
|
|
|
@ -7,7 +7,10 @@
|
|||
"load_balancing": "Pågangstrykk-utjevning",
|
||||
"load_balancing_desc": "Forespør én tjener om gangen. AdGuard Home vil bruke en 'vektlagt tilfeldig valg'-algoritme for å velge tjener, slik at den raskeste tjeneren blir brukt oftere.",
|
||||
"bootstrap_dns": "Bootstrap-DNS-tjenere",
|
||||
"bootstrap_dns_desc": "Bootstrap-DNS-tjenere brukes til å oppklare IP-adressene til DoH/DoT-oppklarerene som du har valgt som oppstrømstjenere.",
|
||||
"bootstrap_dns_desc": "IP-adresser til DNS-servere som brukes til å løse IP-adresser til DoH/DoT-løsere du spesifiserer som oppstrøms. Kommentarer er ikke tillatt.",
|
||||
"fallback_dns_title": "Reserve DNS-servere",
|
||||
"fallback_dns_desc": "Liste over reserve-DNS-servere som brukes når oppstrøms DNS-servere ikke svarer. Syntaksen er den samme som i hovedoppstrømsfeltet ovenfor.",
|
||||
"fallback_dns_placeholder": "Angi én reserve-DNS-server per linje",
|
||||
"local_ptr_title": "Private DNS-tjenere",
|
||||
"local_ptr_desc": "DNS-tjenerne som AdGuard Home bruker for lokale PTR-spørringer. Disse tjenerne brukes til å løse vertsnavnene til klienter med private IP-adresser, for eksempel \"192.168.12.34\", ved bruk av omvendt DNS. Hvis det ikke er angitt, bruker AdGuard Home adressene til standard-DNS-løserne til operativsystemet ditt, bortsett fra adressene til selve AdGuard Home.",
|
||||
"local_ptr_default_resolver": "Som standard, bruker AdGuard Home følgende revers-DNS-oppletere: {{ip}}.",
|
||||
|
@ -114,6 +117,8 @@
|
|||
"top_clients": "Vanligste klienter",
|
||||
"no_clients_found": "Ingen klienter ble funnet",
|
||||
"general_statistics": "Generelle statistikker",
|
||||
"top_upstreams": "Topp oppstrøms servere",
|
||||
"no_upstreams_data_found": "Ingen oppstrøms servere data funnet",
|
||||
"number_of_dns_query_days": "Antall DNS-spørringer behandlet for de siste {{count}} dagene",
|
||||
"number_of_dns_query_days_plural": "Antall DNS-forespørsler som ble behandlet de siste {{count}} dagene",
|
||||
"number_of_dns_query_24_hours": "Antall DNS-forespørsler som ble behandlet de siste 24 timene",
|
||||
|
@ -123,6 +128,7 @@
|
|||
"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",
|
||||
"average_processing_time": "Gjennomsnittlig behandlingstid",
|
||||
"processing_time": "Behandlingstid",
|
||||
"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",
|
||||
"filters_block_toggle_hint": "Du kan sette opp blokkeringsoppføringer i <a>Filtre</a>-innstillingene.",
|
||||
|
@ -147,6 +153,7 @@
|
|||
"upstream_dns_configured_in_file": "Satt opp i {{path}}",
|
||||
"test_upstream_btn": "Test oppstrømstilkoblinger",
|
||||
"upstreams": "Oppstrømstjenere",
|
||||
"upstream": "Oppstrøms server",
|
||||
"apply_btn": "Benytt",
|
||||
"disabled_filtering_toast": "Skrudde av filtrering",
|
||||
"enabled_filtering_toast": "Skrudde på filtrering",
|
||||
|
@ -239,7 +246,7 @@
|
|||
"query_log_cleared": "Forespørselsloggen ble vellykket slettet",
|
||||
"query_log_updated": "Forespørselsloggen ble vellykket oppdatert",
|
||||
"query_log_clear": "Tøm forespørselsloggene",
|
||||
"query_log_retention": "Beholding av forespørselsloggføringene",
|
||||
"query_log_retention": "Rotasjon av forespørselsloggføringene",
|
||||
"query_log_enable": "Skru på loggføring",
|
||||
"query_log_configuration": "Loggføringskonfigurasjon",
|
||||
"query_log_disabled": "Forespørselsloggen er skrudd av og kan bli satt opp i <0>innstillingene</0>",
|
||||
|
@ -423,7 +430,7 @@
|
|||
"client_confirm_delete": "Er du sikker på at du vil slette klienten «{{key}}»?",
|
||||
"list_confirm_delete": "Er du sikker på at du vil slette denne listen?",
|
||||
"auto_clients_title": "Klienter (kjørende)",
|
||||
"auto_clients_desc": "Loggføring over klientene som bruker AdGuard Home, men som ikke har blitt lagret i oppsettet",
|
||||
"auto_clients_desc": "Informasjon om IP-adresser til enheter som bruker eller kan bruke AdGuard Home. Denne informasjonen er samlet inn fra flere kilder, inkludert vertsfiler, omvendt DNS, etc.",
|
||||
"access_title": "Tilgangsinnstillinger",
|
||||
"access_desc": "Her kan du sette opp tilgangsregler for AdGuard Home-DNS-tjeneren.",
|
||||
"access_allowed_title": "Tillatte klienter",
|
||||
|
@ -493,6 +500,7 @@
|
|||
"interval_days": "{{count}} dag",
|
||||
"interval_days_plural": "{{count}} dager",
|
||||
"domain": "Domene",
|
||||
"ecs": "ECS",
|
||||
"punycode": "Punycode",
|
||||
"answer": "Svar",
|
||||
"filter_added_successfully": "Filteret har blitt vellykket lagt til",
|
||||
|
@ -538,7 +546,7 @@
|
|||
"rewrite_A": "<0>A</0>: spesialverdi, behold <0>A</0>-statutter fra oppstrømstjeneren",
|
||||
"rewrite_AAAA": "<0>AAAA</0>: spesialverdi, behold <0>AAAA</0>-statutter fra oppstrømstjeneren",
|
||||
"disable_ipv6": "Skru av IPv6",
|
||||
"disable_ipv6_desc": "Hvis dette er skrudd på, vil alle DNS-forespørslene til IPv6-adresser (AAAA-type) bli droppet.",
|
||||
"disable_ipv6_desc": "Slipp alle DNS-spørringer for IPv6-adresser (type AAAA) og fjern IPv6-hint fra HTTPS-svar.",
|
||||
"fastest_addr": "Raskeste IP-adresse",
|
||||
"fastest_addr_desc": "Forespør alle DNS-tjenerne og hent den raskeste IP-adressen blant alle svarene. Dette vil gjøre DNS-forespørslene tregere, siden vi må vente på svar fra alle DNS-tjenerne, men det vil forbedre tilkoblingen generelt.",
|
||||
"autofix_warning_text": "Hvis du klikker på «Fiks», vil AdGuard Home sette opp systemet ditt til å bruke 'AdGuard Home'-DNS-tjeneren.",
|
||||
|
@ -619,5 +627,44 @@
|
|||
"parental_control": "Foreldrekontroll",
|
||||
"safe_browsing": "Sikker surfing",
|
||||
"served_from_cache": "{{value}} <i>(formidlet fra mellomlageret)</i>",
|
||||
"protection_section_label": "Beskyttelse"
|
||||
"theme_dark_desc": "Mørkt tema",
|
||||
"theme_light_desc": "Lyst tema",
|
||||
"disable_notify_until_tomorrow": "Deaktiver beskyttelsen til i morgen",
|
||||
"enable_protection_timer": "Beskyttelse vil være aktivert i {{time}}",
|
||||
"custom_retention_input": "Angi oppbevaring i timer",
|
||||
"custom_rotation_input": "Angi rotasjon i timer",
|
||||
"protection_section_label": "Beskyttelse",
|
||||
"ignore_statistics": "Ignorer denne klienten i statistikken",
|
||||
"schedule_services": "Sett blokkering av tjenesten på pause",
|
||||
"schedule_services_desc": "Konfigurer pauseplanen for tjenesteblokkeringsfilteret",
|
||||
"schedule_services_desc_client": "Konfigurer pauseplanen for tjenesteblokkeringsfilteret for denne klienten",
|
||||
"schedule_desc": "Angi inaktivitetsperioder for blokkerte tjenester",
|
||||
"schedule_invalid_select": "Starttid må være før sluttid",
|
||||
"schedule_select_days": "Velg dager",
|
||||
"schedule_timezone": "Velg en tidssone",
|
||||
"schedule_current_timezone": "Gjeldende tidssone: {{value}}",
|
||||
"schedule_time_all_day": "Hele dagen",
|
||||
"schedule_modal_description": "Denne tidsplanen vil erstatte alle eksisterende tidsplaner for samme ukedag. Hver dag i uken kan bare ha én inaktivitetsperiode.",
|
||||
"schedule_modal_time_off": "Ingen tjenesteblokkering:",
|
||||
"schedule_new": "Ny tidsplan",
|
||||
"schedule_edit": "Endre tidsplan",
|
||||
"schedule_save": "Lagre tidsplan",
|
||||
"schedule_add": "Legg til tidsplan",
|
||||
"schedule_remove": "Fjern tidsplanen",
|
||||
"schedule_from": "Fra",
|
||||
"schedule_to": "Til",
|
||||
"sunday": "Søndag",
|
||||
"monday": "Mandag",
|
||||
"tuesday": "Tirsdag",
|
||||
"wednesday": "Onsdag",
|
||||
"thursday": "Torsdag",
|
||||
"friday": "Fredag",
|
||||
"saturday": "Lørdag",
|
||||
"sunday_short": "søn",
|
||||
"monday_short": "man",
|
||||
"tuesday_short": "tir",
|
||||
"wednesday_short": "ons",
|
||||
"thursday_short": "tor",
|
||||
"friday_short": "fre",
|
||||
"saturday_short": "lør"
|
||||
}
|
||||
|
|
|
@ -7,12 +7,15 @@
|
|||
"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.",
|
||||
"bootstrap_dns": "Serwery DNS Bootstrap",
|
||||
"bootstrap_dns_desc": "Serwery DNS Bootstrap są używane do ustalenia adresu IP serwerów DoH/DoT, które oznaczysz jako główne serwery DNS.",
|
||||
"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_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",
|
||||
"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_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_placeholder": "Wprowadź po jednym adresie serwera 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_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",
|
||||
|
@ -125,6 +128,8 @@
|
|||
"top_clients": "Główni klienci",
|
||||
"no_clients_found": "Nie znaleziono klienta",
|
||||
"general_statistics": "Ogólne statystyki",
|
||||
"top_upstreams": "Często żądane serwery nadrzędne",
|
||||
"no_upstreams_data_found": "Brak danych dotyczących serwerów nadrzędnych",
|
||||
"number_of_dns_query_days": "Liczba przetworzonych zapytań DNS w ciągu ostatnich {{count}} dni",
|
||||
"number_of_dns_query_days_plural": "Liczba przetworzonych zapytań DNS w ciągu ostatnich {{count}} dni",
|
||||
"number_of_dns_query_24_hours": "Liczba zapytań DNS przetworzonych w ciągu ostatnich 24 godzin",
|
||||
|
@ -134,6 +139,7 @@
|
|||
"enforced_save_search": "Wymuszone bezpieczne wyszukiwanie",
|
||||
"number_of_dns_query_to_safe_search": "Liczba żądań DNS kierowanych do wyszukiwarek, dla których wymuszono Bezpieczne wyszukiwanie",
|
||||
"average_processing_time": "Średni czas przetwarzania",
|
||||
"processing_time": "Czas przetwarzania",
|
||||
"average_processing_time_hint": "Średni czas przetwarzania żądania DNS liczony w milisekundach",
|
||||
"block_domain_use_filters_and_hosts": "Zablokuj domeny za pomocą filtrów i plików host",
|
||||
"filters_block_toggle_hint": "Możesz skonfigurować reguły blokowania w ustawieniach <a>Filtry</a>.",
|
||||
|
@ -158,6 +164,7 @@
|
|||
"upstream_dns_configured_in_file": "Skonfigurowano w {{path}}",
|
||||
"test_upstream_btn": "Test głównych serwerów DNS",
|
||||
"upstreams": "Główne serwery DNS",
|
||||
"upstream": "Serwer nadrzędny",
|
||||
"apply_btn": "Zastosuj",
|
||||
"disabled_filtering_toast": "Wyłączone filtrowanie",
|
||||
"enabled_filtering_toast": "Włączone filtrowanie",
|
||||
|
@ -564,7 +571,7 @@
|
|||
"rewrite_A": "<0>A</0>: wartość specjalna, zachowaj rekord <0>A</0> z głównego serwera DNS",
|
||||
"rewrite_AAAA": "<0>AAAA</0>: wartość specjalna, zachowaj rekord <0>AAAA</0> z głównego serwera DNS",
|
||||
"disable_ipv6": "Wyłącz rozwiązywanie adresów IPv6",
|
||||
"disable_ipv6_desc": "Usuń wszystkie zapytania DNS dla adresów IPv6 (typ AAAA).",
|
||||
"disable_ipv6_desc": "Ignorować wszystkie zapytania DNS dotyczące adresów IPv6 (typ AAAA) i usuwać dane IPv6 z odpowiedzi HTTPS.",
|
||||
"fastest_addr": "Najszybszy adres IP",
|
||||
"fastest_addr_desc": "Zapytaj wszystkie serwery DNS i zwróć najszybszy adres IP spośród wszystkich odpowiedzi. Spowalnia to zapytania DNS, ponieważ AdGuard Home musi czekać na odpowiedzi ze wszystkich serwerów DNS, ale poprawia ogólną łączność.",
|
||||
"autofix_warning_text": "Jeśli klikniesz „Napraw”, AdGuardHome skonfiguruje system do korzystania z serwera DNS AdGuardHome.",
|
||||
|
@ -676,5 +683,37 @@
|
|||
"protection_section_label": "Ochrona",
|
||||
"log_and_stats_section_label": "Dziennik zapytań i statystyki",
|
||||
"ignore_query_log": "Zignoruj tego klienta w dzienniku zapytań",
|
||||
"ignore_statistics": "Ignoruj tego klienta w statystykach"
|
||||
"ignore_statistics": "Ignoruj tego klienta w statystykach",
|
||||
"schedule_services": "Wstrzymanie blokowania serwisów",
|
||||
"schedule_services_desc": "Ustawianie harmonogramu wstrzymywania filtru blokowania serwisów",
|
||||
"schedule_services_desc_client": "Ustawianie harmonogramu wstrzymywania filtru blokowania serwisów dla tego klienta",
|
||||
"schedule_desc": "Ustawianie okresów bezczynności dla zablokowanych serwisów",
|
||||
"schedule_invalid_select": "Czas rozpoczęcia musi być przed czasem zakończenia",
|
||||
"schedule_select_days": "Wybierz dni",
|
||||
"schedule_timezone": "Wybierz strefę czasową",
|
||||
"schedule_current_timezone": "Aktualna strefa czasowa: {{value}}",
|
||||
"schedule_time_all_day": "Cały dzień",
|
||||
"schedule_modal_description": "Ten harmonogram zastąpi wszystkie istniejące harmonogramy na ten sam dzień tygodnia. Każdy dzień tygodnia może mieć tylko jeden okres bezczynności.",
|
||||
"schedule_modal_time_off": "Blokowanie serwisu jest wyłączone:",
|
||||
"schedule_new": "Nowy harmonogram",
|
||||
"schedule_edit": "Edytuj harmonogram",
|
||||
"schedule_save": "Zapisz harmonogram",
|
||||
"schedule_add": "Dodaj harmonogram",
|
||||
"schedule_remove": "Usuń harmonogram",
|
||||
"schedule_from": "Od",
|
||||
"schedule_to": "Do",
|
||||
"sunday": "Niedziela",
|
||||
"monday": "Poniedziałek",
|
||||
"tuesday": "Wtorek",
|
||||
"wednesday": "Środa",
|
||||
"thursday": "Czwartek",
|
||||
"friday": "Piątek",
|
||||
"saturday": "Sobota",
|
||||
"sunday_short": "Ndz",
|
||||
"monday_short": "Pon",
|
||||
"tuesday_short": "Wt",
|
||||
"wednesday_short": "Śro",
|
||||
"thursday_short": "Czw",
|
||||
"friday_short": "Pt",
|
||||
"saturday_short": "Sob"
|
||||
}
|
||||
|
|
|
@ -2,17 +2,20 @@
|
|||
"client_settings": "Configurações do cliente",
|
||||
"example_upstream_reserved": "um DNS primário <0>para o domínios especificos</0>;",
|
||||
"example_upstream_comment": "um comentário.",
|
||||
"upstream_parallel": "Usar consultas paralelas para acelerar a resolução consultando simultaneamente todos oss 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",
|
||||
"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.",
|
||||
"bootstrap_dns": "Servidores DNS de inicialização",
|
||||
"bootstrap_dns_desc": "Servidores DNS de inicialização são usados para resolver endereços IP dos resolvedores DoH/DoT que você especifica como upstreams.",
|
||||
"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_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",
|
||||
"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_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_placeholder": "Insira um endereço de servidor 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_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",
|
||||
|
@ -125,6 +128,8 @@
|
|||
"top_clients": "Principais clientes",
|
||||
"no_clients_found": "Nenhuma cliente encontrado",
|
||||
"general_statistics": "Estatísticas gerais",
|
||||
"top_upstreams": "Melhores servidores DNS primários",
|
||||
"no_upstreams_data_found": "Nenhum dado de servidor DNS primário encontrado",
|
||||
"number_of_dns_query_days": "O número de consultas DNS processadas nos últimos {{count}} dias",
|
||||
"number_of_dns_query_days_plural": "Número de consultas DNS processadas nos últimos {{count}} dias",
|
||||
"number_of_dns_query_24_hours": "O número de consultas DNS processadas nas últimas 24 horas",
|
||||
|
@ -134,6 +139,7 @@
|
|||
"enforced_save_search": "Forçar pesquisa segura",
|
||||
"number_of_dns_query_to_safe_search": "O número de solicitações de DNS para mecanismos de pesquisa para os quais a pesquisa segura foi aplicada",
|
||||
"average_processing_time": "Tempo médio de processamento",
|
||||
"processing_time": "Tempo de processamento",
|
||||
"average_processing_time_hint": "Tempo médio em milissegundos no processamento de uma solicitação DNS",
|
||||
"block_domain_use_filters_and_hosts": "Bloquear domínios usando arquivos de filtros e hosts",
|
||||
"filters_block_toggle_hint": "Você pode configurar as regras de bloqueio nas configurações de <a>Filtros</a>.",
|
||||
|
@ -154,10 +160,11 @@
|
|||
"encryption_settings": "Configurações de criptografia",
|
||||
"dhcp_settings": "Configurações de DHCP",
|
||||
"upstream_dns": "Servidores DNS primário",
|
||||
"upstream_dns_help": "Insira um endereço de servidor. um por linha. <a>Saber mais</a> sobre a configuração de servidores DNS primários.",
|
||||
"upstream_dns_help": "Insira o endereço de servidor, um por linha. <a>Saber mais</a> sobre a configuração de servidores DNS primários.",
|
||||
"upstream_dns_configured_in_file": "Configurado em {{path}}",
|
||||
"test_upstream_btn": "Testar DNS primário",
|
||||
"upstreams": "DNS primário",
|
||||
"upstream": "Servidor DNS primário",
|
||||
"apply_btn": "Aplicar",
|
||||
"disabled_filtering_toast": "Filtragem desativada",
|
||||
"enabled_filtering_toast": "Filtragem ativada",
|
||||
|
@ -564,7 +571,7 @@
|
|||
"rewrite_A": "<0>A</0>: valor especial, mantenha <0>A</0> nos registros do upstream",
|
||||
"rewrite_AAAA": "<0>AAAA</0>: valor especial, mantenha <0>AAAA</0> nos registros do servidor DNS primário",
|
||||
"disable_ipv6": "Desativar resolução de endereços IPv6",
|
||||
"disable_ipv6_desc": "Descarta todas as consultas DNS para endereços IPv6 (tipo AAAA).",
|
||||
"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_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.",
|
||||
"autofix_warning_text": "Se clicar em \"Corrigir\", o AdGuardHome irá configurar o seu sistema para utilizar o servidor DNS do AdGuardHome.",
|
||||
|
@ -676,5 +683,37 @@
|
|||
"protection_section_label": "Proteção",
|
||||
"log_and_stats_section_label": "Registro de consultas e estatísticas",
|
||||
"ignore_query_log": "Ignorar este cliente no registo de consultas",
|
||||
"ignore_statistics": "Ignorar este cliente nas estatísticas"
|
||||
"ignore_statistics": "Ignorar este cliente nas estatísticas",
|
||||
"schedule_services": "Pausa o bloqueio de serviço",
|
||||
"schedule_services_desc": "Configura o agendamento de pausa do filtro de bloqueio de serviço",
|
||||
"schedule_services_desc_client": "Configura o agendamento de pausa do filtro de bloqueio de serviço para este cliente",
|
||||
"schedule_desc": "Define períodos de inatividade para serviços bloqueados",
|
||||
"schedule_invalid_select": "O horário de início deve ser antes do horário de término",
|
||||
"schedule_select_days": "Selecionar dias",
|
||||
"schedule_timezone": "Selecione um fuso horário",
|
||||
"schedule_current_timezone": "Fuso horário atual: {{value}}",
|
||||
"schedule_time_all_day": "O dia todo",
|
||||
"schedule_modal_description": "Este agendamento substituirá qualquer agendamento existente para o mesmo dia da semana. Cada dia da semana pode ter apenas um período de inatividade.",
|
||||
"schedule_modal_time_off": "Sem bloqueio de serviço:",
|
||||
"schedule_new": "Novo agendamento",
|
||||
"schedule_edit": "Editar agendamento",
|
||||
"schedule_save": "Salvar agendamento",
|
||||
"schedule_add": "Adicionar agendamento",
|
||||
"schedule_remove": "Remover agendamento",
|
||||
"schedule_from": "De",
|
||||
"schedule_to": "Para",
|
||||
"sunday": "Domingo",
|
||||
"monday": "Segunda-feira",
|
||||
"tuesday": "Terça-feira",
|
||||
"wednesday": "Quarta-feira",
|
||||
"thursday": "Quinta-feira",
|
||||
"friday": "Sexta-feira",
|
||||
"saturday": "Sábado",
|
||||
"sunday_short": "Dom",
|
||||
"monday_short": "Seg",
|
||||
"tuesday_short": "Ter",
|
||||
"wednesday_short": "Quar",
|
||||
"thursday_short": "Qui",
|
||||
"friday_short": "Sex",
|
||||
"saturday_short": "Sab"
|
||||
}
|
||||
|
|
|
@ -7,12 +7,15 @@
|
|||
"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.",
|
||||
"bootstrap_dns": "Servidores DNS de arranque",
|
||||
"bootstrap_dns_desc": "Servidores DNS de inicialização são usados para resolver endereços IP dos resolvedores DoH/DoT que especifica como upstreams.",
|
||||
"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_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",
|
||||
"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_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_placeholder": "Insira um endereço de servidor 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_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",
|
||||
|
@ -125,6 +128,8 @@
|
|||
"top_clients": "Principais clientes",
|
||||
"no_clients_found": "Nenhum cliente foi encontrado",
|
||||
"general_statistics": "Estatísticas gerais",
|
||||
"top_upstreams": "Melhores servidores DNS primários",
|
||||
"no_upstreams_data_found": "Nenhum dado de servidor DNS primário encontrado",
|
||||
"number_of_dns_query_days": "Número de consultas DNS processadas durante los últimos {{count}} días",
|
||||
"number_of_dns_query_days_plural": "Número de consultas DNS processadas durante os últimos {{count}} dias",
|
||||
"number_of_dns_query_24_hours": "O número de consultas DNS processadas nas últimas 24 horas",
|
||||
|
@ -134,6 +139,7 @@
|
|||
"enforced_save_search": "Forçar pesquisa segura",
|
||||
"number_of_dns_query_to_safe_search": "O número de solicitações de DNS para motores de busca para os quais a pesquisa segura foi aplicada",
|
||||
"average_processing_time": "Tempo médio de processamento",
|
||||
"processing_time": "Tempo de processamento",
|
||||
"average_processing_time_hint": "Tempo médio em milissegundos no processamento de uma solicitação DNS",
|
||||
"block_domain_use_filters_and_hosts": "Bloquear domínios usando ficheiros de filtros e hosts",
|
||||
"filters_block_toggle_hint": "Pode configurar as regras de bloqueio nas configurações de <a>Filtros</a>.",
|
||||
|
@ -158,6 +164,7 @@
|
|||
"upstream_dns_configured_in_file": "Configurado em {{path}}",
|
||||
"test_upstream_btn": "Testar DNS primário",
|
||||
"upstreams": "DNS primário",
|
||||
"upstream": "Servidor DNS primário",
|
||||
"apply_btn": "Aplicar",
|
||||
"disabled_filtering_toast": "Filtragem desativada",
|
||||
"enabled_filtering_toast": "Filtragem ativada",
|
||||
|
@ -564,7 +571,7 @@
|
|||
"rewrite_A": "<0>A</0>: valor especial, mantenha <0>A</0> nos registos do upstream",
|
||||
"rewrite_AAAA": "<0>AAAA</0>: valor especial, mantenha <0>AAAA</0> nos registos do servidor DNS primário",
|
||||
"disable_ipv6": "Desativar resolução de endereços IPv6",
|
||||
"disable_ipv6_desc": "Descarta todas as consultas DNS para endereços IPv6 (tipo AAAA).",
|
||||
"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_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.",
|
||||
"autofix_warning_text": "Se clicar em \"Corrigir\", o AdGuardHome irá configurar o seu sistema para utilizar o servidor DNS do AdGuardHome.",
|
||||
|
@ -676,5 +683,37 @@
|
|||
"protection_section_label": "Proteção",
|
||||
"log_and_stats_section_label": "Log de consulta e estatísticas",
|
||||
"ignore_query_log": "Ignorar este cliente no log de consulta",
|
||||
"ignore_statistics": "Ignorar este cliente nas estatísticas"
|
||||
"ignore_statistics": "Ignorar este cliente nas estatísticas",
|
||||
"schedule_services": "Pausar bloqueio de serviço",
|
||||
"schedule_services_desc": "Configure o agendamento de pausa do filtro de bloqueio de serviço",
|
||||
"schedule_services_desc_client": "Configure o agendamento de pausa do filtro de bloqueio de serviço para este cliente",
|
||||
"schedule_desc": "Defina períodos de inatividade para serviços bloqueados",
|
||||
"schedule_invalid_select": "O horário de início deve ser antes do horário de término",
|
||||
"schedule_select_days": "Selecione os dias",
|
||||
"schedule_timezone": "Selecione um fuso horário",
|
||||
"schedule_current_timezone": "Fuso horário atual: {{value}}",
|
||||
"schedule_time_all_day": "O dia todo",
|
||||
"schedule_modal_description": "Este horário substituirá quaisquer horários existentes para o mesmo dia da semana. Cada dia da semana só pode ter um período de inatividade.",
|
||||
"schedule_modal_time_off": "Sem bloqueio de serviço:",
|
||||
"schedule_new": "Novo agendamento",
|
||||
"schedule_edit": "Editar agendamento",
|
||||
"schedule_save": "Salvar agendamento",
|
||||
"schedule_add": "Adicionar agendamento",
|
||||
"schedule_remove": "Remover agendamento",
|
||||
"schedule_from": "De",
|
||||
"schedule_to": "Para",
|
||||
"sunday": "Domingo",
|
||||
"monday": "Segunda-feira",
|
||||
"tuesday": "Terça-feira",
|
||||
"wednesday": "Quarta-feira",
|
||||
"thursday": "Quinta-feira",
|
||||
"friday": "Sexta-feira",
|
||||
"saturday": "Sábado",
|
||||
"sunday_short": "Domingo",
|
||||
"monday_short": "Seg",
|
||||
"tuesday_short": "Terça",
|
||||
"wednesday_short": "Quarta",
|
||||
"thursday_short": "Quinta",
|
||||
"friday_short": "Sexta",
|
||||
"saturday_short": "Sábado"
|
||||
}
|
||||
|
|
|
@ -7,12 +7,15 @@
|
|||
"load_balancing": "Echilibrare-sarcini",
|
||||
"load_balancing_desc": "Interoghează câte un server în amonte la un moment dat. AdGuard Home utilizează un algoritm de randomizare ponderat pentru a alege serverul, astfel încât cel mai rapid server să fie utilizat mai des.",
|
||||
"bootstrap_dns": "Serverele DNS Bootstrap",
|
||||
"bootstrap_dns_desc": "Serverele DNS Bootstrap sunt folosite pentru a rezolva adresele IP ale rezolvatorilor DoH/DoT indicați ca upstreams.",
|
||||
"bootstrap_dns_desc": "Adresele IP ale serverelor DNS utilizate pentru a rezolva adresele IP ale soluțiilor DoH/DoT pe care le specificați ca fiind în amonte. Comentariile nu sunt permise.",
|
||||
"fallback_dns_title": "Servere DNS de rezervă",
|
||||
"fallback_dns_desc": "Lista serverelor DNS de rezervă utilizate atunci când serverele DNS din amonte nu răspund. Sintaxa este aceeași ca în câmpul principal din amonte de mai sus.",
|
||||
"fallback_dns_placeholder": "Introduceți un server DNS de rezervă pe linie",
|
||||
"local_ptr_title": "Servere DNS inverse private",
|
||||
"local_ptr_desc": "Serverele DNS pe care AdGuard Home le utilizează pentru interogările PTR locale. Aceste servere sunt utilizate pentru a rezolva solicitările PTR pentru adrese din intervale IP private, de exemplu „192.168.12.34”, utilizând DNS invers. Dacă nu este configurat, AdGuard Home utilizează adresele rezolvatorilor DNS impliciți ai sistemului dvs. de operare, cu excepția adreselor AdGuard Home în sine.",
|
||||
"local_ptr_default_resolver": "În mod implicit, AdGuard Home utilizează următorii rezolvatori DNS inverși: {{ip}}.",
|
||||
"local_ptr_no_default_resolver": "AdGuard Home nu a putut determina rezolvatorii DNS privați adecvați pentru acest sistem.",
|
||||
"local_ptr_placeholder": "Introduceți o adresă de server per linie",
|
||||
"local_ptr_placeholder": "Introduceți o adresă IP per linie",
|
||||
"resolve_clients_title": "Permiteți rezolvarea inversa a adreselor IP ale clienților",
|
||||
"resolve_clients_desc": "Rezolvă invers adresele IP ale clienților în numele lor de gazde prin trimiterea interogărilor PTR la rezolvatorii corespunzători (servere DNS private pentru clienți locali, servere în amonte pentru clienți cu adrese IP publice).",
|
||||
"use_private_ptr_resolvers_title": "Utilizați rezolvatori DNS inverși privați",
|
||||
|
@ -125,6 +128,8 @@
|
|||
"top_clients": "Clienți de top",
|
||||
"no_clients_found": "Nu au fost găsiți clienți",
|
||||
"general_statistics": "Statistici generale",
|
||||
"top_upstreams": "Top servere în amonte",
|
||||
"no_upstreams_data_found": "Nu există date despre serverele din amonte",
|
||||
"number_of_dns_query_days": "Numărul de interogări DNS procesate în ultima {{count}} zi",
|
||||
"number_of_dns_query_days_plural": "Numărul de interogări DNS procesate în ultimele {{count}} zile",
|
||||
"number_of_dns_query_24_hours": "Numărul de interogări DNS procesate în ultimele 24 de ore",
|
||||
|
@ -134,6 +139,7 @@
|
|||
"enforced_save_search": "Căutare protejată întărită",
|
||||
"number_of_dns_query_to_safe_search": "Numărul de interogări DNS pe motoarele de căutare pentru care a fost impusă Căutarea Sigură",
|
||||
"average_processing_time": "Timpul mediu de procesare",
|
||||
"processing_time": "Timp de procesare",
|
||||
"average_processing_time_hint": "Timp mediu în milisecunde la procesarea unei cereri DNS",
|
||||
"block_domain_use_filters_and_hosts": "Blocați domenii folosind filtre și fișiere hosts",
|
||||
"filters_block_toggle_hint": "Puteți configura regulile de blocare în setările <a>Filtre</a>.",
|
||||
|
@ -158,6 +164,7 @@
|
|||
"upstream_dns_configured_in_file": "Configurat în {{path}}",
|
||||
"test_upstream_btn": "Testați upstreams",
|
||||
"upstreams": "Upstreams",
|
||||
"upstream": "Server în amonte",
|
||||
"apply_btn": "Aplică",
|
||||
"disabled_filtering_toast": "Filtrare dezactivată",
|
||||
"enabled_filtering_toast": "Filtrare activată",
|
||||
|
@ -564,7 +571,7 @@
|
|||
"rewrite_A": "<0>A</0>: valoare specială, păstrați <0>A</0> înregistrări din amonte",
|
||||
"rewrite_AAAA": "<0>AAAA</0>: valoare specială, păstrați <0>AAAA</0> înregistrări din amonte",
|
||||
"disable_ipv6": "Dezactivați rezolvarea adreselor IPv6",
|
||||
"disable_ipv6_desc": "Anulați toate interogările DNS pentru adresele IPv6 (tip AAAA).",
|
||||
"disable_ipv6_desc": "Renunțați la toate interogările DNS pentru adresele IPv6 (tip AAAA) și eliminați indicațiile IPv6 din răspunsurile HTTPS.",
|
||||
"fastest_addr": "Cea mai rapidă adresă IP",
|
||||
"fastest_addr_desc": "Interoghează toate serverele DNS și întoarce adresa IP cea mai rapidă din răspunsuri. Acest lucru încetinește interogările DNS, deoarece AdGuard Home trebuie să aștepte răspunsuri de la toate serverele DNS, dar îmbunătățește conectivitatea generală.",
|
||||
"autofix_warning_text": "Dacă clicați pe \"Fix\", AdGuardHome va configura sistemul dvs. pentru a utiliza serverul DNS AdGuardHome.",
|
||||
|
@ -676,5 +683,37 @@
|
|||
"protection_section_label": "Protecție",
|
||||
"log_and_stats_section_label": "Jurnal de interogări și statistici",
|
||||
"ignore_query_log": "Ignorați acest client în jurnalul de interogări",
|
||||
"ignore_statistics": "Ignorați acest client în statistici"
|
||||
"ignore_statistics": "Ignorați acest client în statistici",
|
||||
"schedule_services": "Întrerupeți blocarea serviciului",
|
||||
"schedule_services_desc": "Configurați programul de pauză al filtrului de blocare a serviciului",
|
||||
"schedule_services_desc_client": "Configurați programul de pauză al filtrului de blocare a serviciului pentru acest client",
|
||||
"schedule_desc": "Setați perioade de inactivitate pentru serviciile blocate",
|
||||
"schedule_invalid_select": "Ora de început trebuie să fie înaintea orei de sfârșit",
|
||||
"schedule_select_days": "Selectați zile",
|
||||
"schedule_timezone": "Selectați un fus orar",
|
||||
"schedule_current_timezone": "Fus orar curent: {{value}}",
|
||||
"schedule_time_all_day": "Toată ziua",
|
||||
"schedule_modal_description": "Acest program va înlocui orice program existent pentru aceeași zi a săptămânii. Fiecare zi a săptămânii poate avea o singură perioadă de inactivitate.",
|
||||
"schedule_modal_time_off": "Fără blocare a serviciului:",
|
||||
"schedule_new": "Program nou",
|
||||
"schedule_edit": "Editare program",
|
||||
"schedule_save": "Salvați programul",
|
||||
"schedule_add": "Adăugați program",
|
||||
"schedule_remove": "Înlăturați programul",
|
||||
"schedule_from": "De",
|
||||
"schedule_to": "Până",
|
||||
"sunday": "Duminică",
|
||||
"monday": "Luni",
|
||||
"tuesday": "Marți",
|
||||
"wednesday": "Miercuri",
|
||||
"thursday": "Joi",
|
||||
"friday": "Vineri",
|
||||
"saturday": "Sâmbătă",
|
||||
"sunday_short": "du",
|
||||
"monday_short": "lu",
|
||||
"tuesday_short": "ma",
|
||||
"wednesday_short": "mi",
|
||||
"thursday_short": "jo",
|
||||
"friday_short": "vi",
|
||||
"saturday_short": "sa"
|
||||
}
|
||||
|
|
|
@ -7,7 +7,10 @@
|
|||
"load_balancing": "Распределение нагрузки\n",
|
||||
"load_balancing_desc": "Запрашивать по одному серверу за раз. AdGuard Home использует алгоритм взвешенного случайного выбора сервера, так что самый быстрый сервер используется чаще.",
|
||||
"bootstrap_dns": "Bootstrap DNS-серверы",
|
||||
"bootstrap_dns_desc": "Bootstrap DNS-серверы используются для поиска IP-адресов DoH/DoT серверов, которые вы указали.",
|
||||
"bootstrap_dns_desc": "IP-адреса DNS-серверов, используемых для поиска IP-адресов DoH/DoT upstream-серверов, которые вы указали. Комментарии не допускаются.",
|
||||
"fallback_dns_title": "Резервные DNS-серверы",
|
||||
"fallback_dns_desc": "Список резервных DNS-серверов, используемых в тех случаях, когда вышестоящие DNS-серверы недоступны. Синтаксис такой же, как и в поле Upstream DNS-серверы выше.",
|
||||
"fallback_dns_placeholder": "Введите один резервный DNS-сервер в каждой строке",
|
||||
"local_ptr_title": "Приватные серверы для обратного DNS",
|
||||
"local_ptr_desc": "DNS-серверы, которые AdGuard Home использует для локальных PTR-запросов. Эти серверы используются, чтобы получить доменные имена клиентов с приватными IP-адресами, например «192.168.12.34», с помощью обратного DNS. Если список пуст, AdGuard Home использует DNS-серверы по умолчанию вашей ОС.",
|
||||
"local_ptr_default_resolver": "По умолчанию AdGuard Home использует следующие обратные DNS-резолверы: {{ip}}.",
|
||||
|
@ -125,6 +128,8 @@
|
|||
"top_clients": "Частые клиенты",
|
||||
"no_clients_found": "Клиентов не найдено",
|
||||
"general_statistics": "Общая статистика",
|
||||
"top_upstreams": "Часто запрашиваемые upstream-серверы",
|
||||
"no_upstreams_data_found": "Нет данных об upstream-серверах",
|
||||
"number_of_dns_query_days": "Количество DNS-запросов за последний {{count}} день",
|
||||
"number_of_dns_query_days_plural": "Количество DNS запросов, обработанных за последние {{count}} дней",
|
||||
"number_of_dns_query_24_hours": "Количество DNS-запросов за последние 24 часа",
|
||||
|
@ -134,6 +139,7 @@
|
|||
"enforced_save_search": "Применён безопасный поиск",
|
||||
"number_of_dns_query_to_safe_search": "Количество запросов DNS для поисковых систем, для которых был применён Безопасный поиск",
|
||||
"average_processing_time": "Среднее время обработки запроса",
|
||||
"processing_time": "Время обработки",
|
||||
"average_processing_time_hint": "Среднее время для обработки запроса DNS в миллисекундах",
|
||||
"block_domain_use_filters_and_hosts": "Блокировать домены с использованием фильтров и файлов hosts",
|
||||
"filters_block_toggle_hint": "Вы можете настроить правила блокировки в <a>«Фильтрах»</a>.",
|
||||
|
@ -158,6 +164,7 @@
|
|||
"upstream_dns_configured_in_file": "Настроен в {{path}}",
|
||||
"test_upstream_btn": "Тест upstream серверов",
|
||||
"upstreams": "Upstreams",
|
||||
"upstream": "Upstream-сервер",
|
||||
"apply_btn": "Применить",
|
||||
"disabled_filtering_toast": "Фильтрация выкл.",
|
||||
"enabled_filtering_toast": "Фильтрация вкл.",
|
||||
|
@ -564,7 +571,7 @@
|
|||
"rewrite_A": "<0>A</0>: специальное значение, хранить записи <0>A</0> с upstream-сервера",
|
||||
"rewrite_AAAA": "<0>AAAA</0>: специальное значение, хранить записи <0>AAAA</0> с upstream-сервера",
|
||||
"disable_ipv6": "Отключить обработку IPv6-адресов",
|
||||
"disable_ipv6_desc": "Игнорировать все DNS-запросы адресов IPv6 (тип AAAA).",
|
||||
"disable_ipv6_desc": "Игнорировать все DNS-запросы адресов IPv6 (тип AAAA) и удалять IPv6-данные из ответов типа HTTPS.",
|
||||
"fastest_addr": "Самый быстрый IP-адрес",
|
||||
"fastest_addr_desc": "Опросить все DNS-серверы и вернуть самый быстрый IP-адрес из полученных ответов. Это замедлит DNS-запросы, так как нужно будет дождаться ответов со всех DNS-серверов, но улучшит соединение.",
|
||||
"autofix_warning_text": "При нажатии «Исправить» AdGuard Home настроит вашу систему на использование DNS-сервера AdGuard Home.",
|
||||
|
@ -676,5 +683,37 @@
|
|||
"protection_section_label": "Защита",
|
||||
"log_and_stats_section_label": "Журнал запросов и статистика",
|
||||
"ignore_query_log": "Игнорировать этого клиента в журнале запросов",
|
||||
"ignore_statistics": "Игнорировать этого клиента в статистике"
|
||||
"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": "Пн",
|
||||
"tuesday_short": "Вт",
|
||||
"wednesday_short": "Ср",
|
||||
"thursday_short": "Чт",
|
||||
"friday_short": "Пт",
|
||||
"saturday_short": "Сб"
|
||||
}
|
||||
|
|
|
@ -4,20 +4,20 @@
|
|||
"parallel_requests": "සමාන්තර ඉල්ලීම්",
|
||||
"load_balancing": "ධාරිතාව තුලනය",
|
||||
"local_ptr_title": "පෞද්ගලික ප්රතිවර්ත ව.නා.ප. සේවාදායක",
|
||||
"local_ptr_desc": "ස්ථානීය PTR විමසුම් සඳහා ඇඩ්ගාර්ඩ් හෝම් භාවිතා කරන ව.නා.ප. සේවාදායක. මෙම සේවාදායක පුද්ගලික අ.ජා.කෙ. ලිපින සහිත අනුග්රාහකවල සත්කාරක නාම විසඳීමට භාවිතා කරයි, උදාහරණයක් ලෙස ප්රතිවර්ත ව.නා.ප. භාවිතයෙන් \"192.168.12.34\". නැති නම්, ඇඩ්ගාර්ඩ් හෝම් හි ලිපින සඳහා හැරුනු විට ඔබගේ මෙහෙයුම් පද්ධතියේ පෙරනිමි ව.නා.ප. විසදුම්වල ලිපින භාවිතා කරයි.",
|
||||
"local_ptr_default_resolver": "පෙරනිමි ලෙස, ඇඩ්ගාර්ඩ් හෝම් පහත ප්රතිවර්තත ව.නා.ප. පිළිවිසඳු භාවිතා කරයි: {{ip}}.",
|
||||
"local_ptr_desc": "ස්ථානීය PTR විමසුම් සඳහා ඇඩ්ගාර්ඩ් හෝම් භාවිතා කරන ව.නා.ප. සේවාදායක. මෙම සේවාදායක පුද්ගලික අ.ජා.කෙ. ලිපින පරාසවල PTR විමසුම් විසඳීමට භාවිතා කරයි, උදාහරණයක් ලෙස ප්රතිවර්ත ව.නා.ප. භාවිතයෙන් \"192.168.12.34\". මෙය සකසා නැති නම්, ඇඩ්ගාර්ඩ් හෝම් හි ලිපින සඳහා හැරුනු විට ඔබගේ මෙහෙයුම් පද්ධතියේ පෙරනිමි ව.නා.ප. විසදුම්වල ලිපින භාවිතා කරයි.",
|
||||
"local_ptr_default_resolver": "පෙරනිමි පරිදි, ඇඩ්ගාර්ඩ් හෝම් පහත ප්රතිවර්ත ව.නා.ප. පිළිවිසඳු භාවිතා කරයි: {{ip}}.",
|
||||
"local_ptr_no_default_resolver": "ඇඩ්ගාර්ඩ් හෝම් හට මෙම පද්ධතිය සඳහා සුදුසු පුද්ගලික ප්රතිවර්ත ව.නා.ප. පිළිවිසඳු නිශ්චය කරගත නොහැකි විය.",
|
||||
"local_ptr_placeholder": "පේළියකට එක් සේවාදායක ලිපිනය බැගින් යොදන්න",
|
||||
"resolve_clients_title": "අනුග්රාහකවල අ.ජා.කෙ. ලිපින ප්රතිවර්ත විසඳීම සබල කරන්න",
|
||||
"use_private_ptr_resolvers_title": "පෞද්. ප්රතිවර්ත ව.නා.ප. පිළිවිසඳු භාවිතය",
|
||||
"check_dhcp_servers": "ග.ධා.වි.කෙ. සේවාදායක සඳහා පරීක්ෂා කරන්න",
|
||||
"check_dhcp_servers": "ග.ධා.වි.කෙ. සේවාදායක පරීක්ෂා කරන්න",
|
||||
"save_config": "වින්යාසය සුරකින්න",
|
||||
"enabled_dhcp": "ග.ධා.වි.කෙ. සේවාදායකය සබල කෙරිණි",
|
||||
"disabled_dhcp": "ග.ධා.වි.කෙ. සේවාදායකය අබල කෙරිණි",
|
||||
"unavailable_dhcp": "ග.ධා.වි.කෙ. නැත",
|
||||
"unavailable_dhcp_desc": "ඇඩ්ගාර්ඩ් හෝම් හට ඔබගේ මෙහෙයුම් පද්ධතියේ ග.ධා.වි.කෙ. සේවාදායකයක් ධාවනය කිරීමට නොහැකිය",
|
||||
"dhcp_title": "ග.ධා.වි.කෙ. සේවාදායකය (පර්යේෂණාත්මක!)",
|
||||
"dhcp_description": "ඔබගේ මාර්ගකාරකය ග.ධා.වි.කෙ. (DHCP) සැකසුම් ලබා නොදෙන්නේ නම්, ඔබට ඇඩ්ගාර්ඩ් හි තිළෑලි ග.ධා.වි.කෙ. සේවාදායකය භාවිතා කළ හැකිය.",
|
||||
"dhcp_description": "ඔබගේ මාර්ගකාරකය ග.ධා.වි.කෙ. (DHCP) සැකසුම් ලබා නොදෙන්නේ නම්, ඔබට ඇඩ්ගාර්ඩ් තිළෑලි ග.ධා.වි.කෙ. සේවාදායකය භාවිතා කිරීමට හැකිය.",
|
||||
"dhcp_enable": "ග.ධා.වි.කෙ. සේවාදායකය සබල කරන්න",
|
||||
"dhcp_disable": "ග.ධා.වි.කෙ. සේවාදායකය අබල කරන්න",
|
||||
"dhcp_not_found": "ඇඩ්ගාර්ඩ් හෝම් සඳහා ජාලයෙහි කිසිදු ක්රියාත්මක ග.ධා.වි.කෙ. සේවාදායකයක් හමු නොවූ නිසා තිළෑලි සේවාදායකය සබල කිරීම ආරක්ෂිත වේ. කෙසේ වෙතත්, ස්වයංක්රීය ඒෂණය ඉතා නිවැරදි නොවිය හැකි බැවින් ඔබ එය අතින් නැවත පරීක්ෂා කළ යුතුය.",
|
||||
|
@ -26,11 +26,11 @@
|
|||
"dhcp_static_leases": "ස්ථිර ග.ධා.වි.කෙ. කල්පැවරීම",
|
||||
"dhcp_leases_not_found": "ග.ධා.වි.කෙ. කල්පැවරීම් නැත",
|
||||
"dhcp_config_saved": "ග.ධා.වි.කෙ. වින්යාසය සාර්ථකව සුරකින ලදි",
|
||||
"dhcp_ipv4_settings": "ග.ධා.වි.කෙ. අ.ජා.කෙ. 4 සැකසුම්",
|
||||
"dhcp_ipv6_settings": "ග.ධා.වි.කෙ. අ.ජා.කෙ. 6 සැකසුම්",
|
||||
"dhcp_ipv4_settings": "ග.ධා.වි.කෙ. IPv4 සැකසුම්",
|
||||
"dhcp_ipv6_settings": "ග.ධා.වි.කෙ. IPv6 සැකසුම්",
|
||||
"form_error_required": "ඇවැසි ක්ෂේත්රයකි",
|
||||
"form_error_ip4_format": "IPv4 ලිපිනය වලංගු නොවේ",
|
||||
"form_error_ip6_format": "වලංගු නොවන අ.ජා.කෙ.6 ලිපිනයකි",
|
||||
"form_error_ip6_format": "වලංගු නොවන IPv6 ලිපිනයකි",
|
||||
"form_error_ip_format": "අ.ජා.කෙ. (IP) ලිපිනය වලංගු නොවේ",
|
||||
"form_error_mac_format": "මා.ප්ර.පා. ලිපිනය වලංගු නොවේ",
|
||||
"form_error_client_id_format": "අනුග්රාහකයේ හැඳු. වලංගු නොවේ",
|
||||
|
@ -41,7 +41,7 @@
|
|||
"lower_range_start_error": "පරාසය ආරම්භයට වඩා අඩු විය යුතුය",
|
||||
"greater_range_start_error": "පරාසය ආරම්භයට වඩා වැඩි විය යුතුය",
|
||||
"subnet_error": "ලිපින එක් අනුජාලයක තිබිය යුතුය",
|
||||
"dhcp_form_range_title": "අ.ජා. කෙ. (IP) ලිපින පරාසය",
|
||||
"dhcp_form_range_title": "අ.ජා.කෙ. (IP) ලිපින පරාසය",
|
||||
"dhcp_form_range_start": "පරාසය ආරම්භය",
|
||||
"dhcp_form_range_end": "පරාසය අවසානය",
|
||||
"dhcp_form_lease_title": "ග.ධා.වි.කෙ. කල්පැවරීම (තත්. වලින්)",
|
||||
|
@ -50,7 +50,7 @@
|
|||
"dhcp_hardware_address": "දෘඩාංග ලිපිනය",
|
||||
"dhcp_ip_addresses": "අ.ජා.කෙ. (IP) ලිපින",
|
||||
"ip": "අ.ජා.කෙ. (IP)",
|
||||
"dhcp_table_hostname": "ධාරක නාමය",
|
||||
"dhcp_table_hostname": "සත්කාරක නාමය",
|
||||
"dhcp_table_expires": "කල් ඉකුත් වීම",
|
||||
"dhcp_warning": "ඔබට කෙසේ හෝ ග.ධා.වි.කෙ. සේවාදායකය සබල කිරීමට අවශ්ය නම්, ඔබගේ ජාලයේ වෙනත් ක්රියාකාරී ග.ධා.වි.කෙ. සේවාදායකයක් නැති බව තහවුරු කරගන්න. මෙය සම්බන්ධිත උපාංග සඳහා අන්තර්ජාලය බිඳ දැමිය හැකිය!",
|
||||
"dhcp_error": "ජාලයේ තවත් ක්රියාත්මක ග.ධා.වි.කෙ. සේවාදායකයක් තිබේද යන්න නිශ්චය කළ නොහැකි විය",
|
||||
|
@ -62,13 +62,13 @@
|
|||
"dhcp_static_leases_not_found": "ග.ධා.වි.කෙ. ස්ථිර කල්පැවරීම් නැත",
|
||||
"dhcp_add_static_lease": "ස්ථිර කල්පැවරීමක් යොදන්න",
|
||||
"dhcp_reset_leases": "කල්පැවරීම් යළි සකසන්න",
|
||||
"dhcp_reset_leases_confirm": "සියළු කල්පැවරීම් යළි සැකසීමට වුවමනා ද?",
|
||||
"dhcp_reset_leases_confirm": "සියළුම කල්පැවරීම් යළි සැකසීමට වුවමනා ද?",
|
||||
"dhcp_reset_leases_success": "ග.ධා.වි.කෙ. කල්පැවරීම් යළි සැකසිණි",
|
||||
"dhcp_reset": "ග.ධා.වි.කෙ. වින්යාසය යළි පිහිටුවීමට අවශ්ය බව ඔබට විශ්වාස ද?",
|
||||
"country": "රට",
|
||||
"city": "නගරය",
|
||||
"delete_confirm": "\"{{key}}\" මකා දැමීමට අවශ්ය බව ඔබට විශ්වාසද?",
|
||||
"form_enter_hostname": "ධාරක නාමය ඇතුල් කරන්න",
|
||||
"form_enter_hostname": "සත්කාරක නාමය යොදන්න",
|
||||
"error_details": "දෝෂ විස්තර",
|
||||
"response_details": "ප්රතිචාරයෙහි විස්තර",
|
||||
"request_details": "ඉල්ලීමෙහි විස්තර",
|
||||
|
@ -116,19 +116,20 @@
|
|||
"number_of_dns_query_days": "පසුගිය දවස් {{count}} සඳහා සැකසූ ව.නා.ප. විමසුම් ගණන",
|
||||
"number_of_dns_query_days_plural": "පසුගිය දවස් {{count}} සඳහා සැකසූ ව.නා.ප. විමසුම් ගණන",
|
||||
"number_of_dns_query_24_hours": "පසුගිය පැය 24 සඳහා සැකසූ ව.නා.ප. විමසුම් ගණන",
|
||||
"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_adult": "අවහිර කළ වැඩිහිටි වියමන අඩවි ගණන",
|
||||
"enforced_save_search": "ආරක්ෂිත සෙවීම බලාත්මක කළ",
|
||||
"number_of_dns_query_to_safe_search": "ආරක්ෂිත සෙවීම බලාත්මක කළ සෙවුම් යන්ත්ර සඳහා ව.නා.ප. ඉල්ලීම් ගණන",
|
||||
"enforced_save_search": "ආරක්ෂිත සෙවීම බලාත්මක කළ",
|
||||
"number_of_dns_query_to_safe_search": "ආරක්ෂිත සෙවීම බලාත්මක කළ සෙවුම් යන්ත්ර සඳහා ව.නා.ප. ඉල්ලීම් ගණන",
|
||||
"average_processing_time": "සාමාන්ය සැකසුම් කාලය",
|
||||
"processing_time": "සැකසුම් කාලය",
|
||||
"average_processing_time_hint": "ව.නා.ප. ඉල්ලීමක් සැකසීමේ සාමාන්ය කාලය මිලි තත්පර වලින්",
|
||||
"block_domain_use_filters_and_hosts": "පෙරහන් හා සත්කාරක ගොනු භාවිතයෙන් වසම් අවහිර කරන්න",
|
||||
"filters_block_toggle_hint": "ඔබට අවහිර කිරීමේ නීති <a>පෙරහන්</a> තුළ පිහිටුවිය හැකිය.",
|
||||
"use_adguard_browsing_sec": "ඇඩ්ගාර්ඩ් පිරික්සුම් ආරක්ෂණ වියමන සේවාව භාවිතා කරන්න",
|
||||
"use_adguard_browsing_sec_hint": "ඇඩ්ගාර්ඩ් හෝම් විසින් පිරික්සුම් ආරක්ෂණ වියමන සේවාව මගින් වසම අවහිර කර ඇත්දැයි පරීක්ෂා කරයි. එය සිදු කිරීමට රහස්යතා-හිතකාමී බැලීමේ යෙ.ක්ර.මු. භාවිතා කෙරේ: වසමේ කෙටි උපසර්ගයක SHA256 පූරකයක් පමණක් සේවාදායකය වෙත යවනු ලැබේ.",
|
||||
"use_adguard_parental": "ඇඩ්ගාර්ඩ් දෙමාපිය පාලන වියමන සේවාව භාවිතා කරන්න",
|
||||
"use_adguard_parental_hint": "වසමේ වැඩිහිටියන්ට අදාල කරුණු අඩංගු දැයි ඇඩ්ගාර්ඩ් හෝම් විසින් පරීක්ෂා කරනු ඇත. එය පිරික්සුම් ආරක්ෂණ වියමන සේවාව මෙන් රහස්යතා හිතකාමී යෙ.ක්ර. අ.මු. (API) භාවිතා කරයි.",
|
||||
"use_adguard_parental_hint": "වසමේ වැඩිහිටියන්ට අදාල කරුණු අඩංගු දැයි ඇඩ්ගාර්ඩ් හෝම් විසින් පරීක්ෂා කරනු ඇත. එය පිරික්සුම් ආරක්ෂණ වියමන සේවාව මෙන් රහස්යතා හිතකාමී යෙ.ක්ර. අ.මු. (API) භාවිතා කරයි.",
|
||||
"enforce_safe_search": "ආරක්ෂිත සෙවුම භාවිතා කරන්න",
|
||||
"enforce_save_search_hint": "ඇඩ්ගාර්ඩ් හෝම් පහත සෙවුම් යන්ත්ර තුළ ආරක්ෂිත සෙවුම බලාත්මක කරනු ඇත: ගූගල්, යූටියුබ්, බින්ග්, ඩක්ඩක්ගෝ, යාන්ඩෙක්ස් සහ පික්සාබේ.",
|
||||
"no_servers_specified": "සේවාදායක කිසිවක් නිශ්චිතව දක්වා නැත",
|
||||
|
@ -144,6 +145,7 @@
|
|||
"upstream_dns": "Upstream ව.නා.ප. සේවාදායක",
|
||||
"upstream_dns_help": "පේළියකට එක් සේවාදායක ලිපිනය බැගින් ඇතුල් කරන්න. upstream ව.නා.ප. (DNS) \n සේවාදායක වින්යාසගත කිරීම ගැන <a>තව දැනගන්න</a>.",
|
||||
"upstream_dns_configured_in_file": "{{path}} හි වින්යාසගත කර ඇත",
|
||||
"test_upstream_btn": "අත්හදා බලන්න",
|
||||
"apply_btn": "යොදන්න",
|
||||
"disabled_filtering_toast": "පෙරීම අබල කෙරිණි",
|
||||
"enabled_filtering_toast": "පෙරීම සබල කෙරිණි",
|
||||
|
@ -164,7 +166,7 @@
|
|||
"edit_table_action": "සංස්කරණය කරන්න",
|
||||
"delete_table_action": "මකන්න",
|
||||
"elapsed": "ගත වූ කාලය",
|
||||
"filters_and_hosts_hint": "ඇඩ්ගාර්ඩ් හෝම් මූලික දැන්වීම් වාරණ නීති සහ ධාරක ගොනු පද ගැලපුම් තේරුම් ගනී.",
|
||||
"filters_and_hosts_hint": "ඇඩ්ගාර්ඩ් හෝම් මූලික දැන්වීම් වාරණ නීති සහ සත්කාරක ගොනු පද ගැලපුම් තේරුම් ගනී.",
|
||||
"no_blocklist_added": "අවහිර කිරීමේ ලැයිස්තු එකතු කර නැත",
|
||||
"no_whitelist_added": "ඉඩ දීමේ ලැයිස්තු එකතු කර නැත",
|
||||
"add_blocklist": "අවහිර කිරීමේ ලැයිස්තුවක් එකතු කරන්න",
|
||||
|
@ -184,11 +186,11 @@
|
|||
"form_error_url_format": "වලංගු නොවන ඒ.ස.නි.(URL) ආකෘතියකි",
|
||||
"form_error_url_or_path_format": "වලංගු නොවන ඒ.ස.නි.(URL) හෝ ස්ථීර මාර්ගයකි",
|
||||
"custom_filter_rules": "අභිරුචි පෙරීමේ නීති",
|
||||
"custom_filter_rules_hint": "පේළියකට එක් නීතියක් බැගින් ඇතුල් කරන්න. ඔබට දැන්වීම් අවහිර කිරීමේ නීති හෝ ධාරක ගොනු පද ගැලපුම් භාවිතා කළ හැකිය.",
|
||||
"custom_filter_rules_hint": "පේළියකට එක් නීතියක් බැගින් ඇතුල් කරන්න. ඔබට දැන්වීම් අවහිර කිරීමේ නීති හෝ සත්කාරක ගොනු පද ගැලපුම් භාවිතා කිරීමට හැකිය.",
|
||||
"system_host_files": "පද්ධතියේ සත්කාරක ගොනු",
|
||||
"examples_title": "උදාහරණ",
|
||||
"example_meaning_filter_block": "උදාහරණය.ලංකා වසමට සහ එහි සියළු උප වසම් වලට ප්රවේශය අවහිර කරයි;",
|
||||
"example_meaning_filter_whitelist": "උදාහරණය.ලංකා වසමට සහ එහි සියළු උප වසම් වලට ප්රවේශය අනවහිර කරයි;",
|
||||
"example_meaning_filter_block": "උදාහරණය.ලංකා වසමට සහ එහි සියළුම උප වසම් වලට ප්රවේශය අවහිර කරයි;",
|
||||
"example_meaning_filter_whitelist": "උදාහරණය.ලංකා වසමට සහ එහි සියළුම උප වසම් වලට ප්රවේශය අනවහිර කරයි;",
|
||||
"example_meaning_host_block": "උදාහරණය.ලංකා වසම සඳහා 127.0.0.1 සමඟ ප්රතිචාර දක්වයි (නමුත් එහි උප ලිපින සඳහා නොවේ);",
|
||||
"example_comment": "! මෙතැන අදහස් දැක්වීමක්.",
|
||||
"example_comment_meaning": "අදහසක්;",
|
||||
|
@ -232,7 +234,7 @@
|
|||
"updated_custom_filtering_toast": "අභිරුචි නීති සාර්ථකව සුරකින ලදි",
|
||||
"rule_removed_from_custom_filtering_toast": "අභිරුචි පෙරීමේ නීති තුළින් නීතියක් ඉවත් කෙරිණි: {{rule}}",
|
||||
"rule_added_to_custom_filtering_toast": "අභිරුචි පෙරීමේ නීති තුළට මෙම නීතිය එකතු කෙරිණි: {{rule}}",
|
||||
"query_log_response_status": "තත්වය: {{value}}",
|
||||
"query_log_response_status": "තත්වය: {{value}}",
|
||||
"query_log_filtered": "{{filter}} මගින් පෙරිණි",
|
||||
"query_log_confirm_clear": "සමස්ථ විමසුම් සටහන හිස් කිරීමට ඇවැසි බව ඔබට විශ්වාසද?",
|
||||
"query_log_cleared": "විමසුම් සටහන සාර්ථකව හිස් කර ඇත",
|
||||
|
@ -255,8 +257,8 @@
|
|||
"refused": "REFUSED",
|
||||
"null_ip": "අභිශූන්යය අ.ජා.කෙ.",
|
||||
"custom_ip": "අභිරුචි අ.ජා.කෙ.",
|
||||
"blocking_ipv4": "අ.ජා.කෙ.4 අවහිර කිරීම",
|
||||
"blocking_ipv6": "අ.ජා.කෙ.6 අවහිර කිරීම",
|
||||
"blocking_ipv4": "IPv4 අවහිර කිරීම",
|
||||
"blocking_ipv6": "IPv6 අවහිර කිරීම",
|
||||
"dnscrypt": "DNSCrypt",
|
||||
"dns_over_https": "HTTPS-මගින්-ව.නා.ප.",
|
||||
"dns_over_tls": "TLS-මගින්-ව.නා.ප.",
|
||||
|
@ -276,7 +278,7 @@
|
|||
"rate_limit_desc": "එක් අනුග්රාහකයකට ඉඩ දී ඇති තත්පරයට ඉල්ලීම් ගණන. එය 0 ලෙස සැකසීම යනුවෙන් අදහස් කරන්නේ සීමාවක් නැති බවයි.",
|
||||
"blocking_ipv4_desc": "අවහිර කළ A ඉල්ලීමක් සඳහා ආපසු එවිය යුතු අ.ජා.කෙ. (IP) ලිපිනය",
|
||||
"blocking_ipv6_desc": "අවහිර කළ AAAA ඉල්ලීමක් සඳහා ආපසු එවිය යුතු අ.ජා.කෙ. (IP) ලිපිනය",
|
||||
"blocking_mode_default": "පොදු: දැන්වීම් අවහිර කරන ආකාරයේ නීතියක් මගින් අවහිර කළ විට REFUSED සමඟ ප්රතිචාර දක්වයි; /etc/host-style ආකාරයේ නීතියක් මගින් අවහිර කළ විට නීතියේ දක්වා ඇති අ.ජා. කෙ. ලිපිනය සමඟ ප්රතිචාර දක්වයි",
|
||||
"blocking_mode_default": "පොදු: දැන්වීම් අවහිර කරන ආකාරයේ නීතියක් මගින් අවහිර කළ විට REFUSED සමඟ ප්රතිචාර දක්වයි; /etc/host-style ආකාරයේ නීතියක් මගින් අවහිර කළ විට නීතියේ දක්වා ඇති අ.ජා.කෙ. ලිපිනය සමඟ ප්රතිචාර දක්වයි",
|
||||
"blocking_mode_refused": "REFUSED: REFUSED කේතය සමඟ ප්රතිචාර දක්වයි",
|
||||
"blocking_mode_nxdomain": "නොපවතින වසම: NXDOMAIN කේතය සමඟ ප්රතිචාර දක්වයි",
|
||||
"blocking_mode_null_ip": "අභිශූන්යය අ.ජා.කෙ.: ශුන්ය අ.ජා.කෙ. ලිපිනය සමඟ ප්රතිචාර දක්වයි (A සඳහා 0.0.0.0; AAAA සඳහා ::)",
|
||||
|
@ -284,7 +286,7 @@
|
|||
"theme_auto": "ස්වයං",
|
||||
"theme_light": "දීප්ත",
|
||||
"theme_dark": "අඳුරු",
|
||||
"upstream_dns_client_desc": "ඔබ මෙම ක්ෂේත්රය හිස්ව තබා ගන්නේ නම්, ඇඩ්ගාර්ඩ් හෝම් විසින් <0>ව.නා.ප. සැකසුම්</0> හි වින්යාසගත කර ඇති සේවාදායක භාවිතා කරනු ඇත.",
|
||||
"upstream_dns_client_desc": "ඔබ මෙම ක්ෂේත්රය හිස්ව තබා ගන්නේ නම්, <0>ව.නා.ප. සැකසුම්</0> හි වින්යාසගත කර ඇති සේවාදායක ඇඩ්ගාර්ඩ් හෝම් විසින් භාවිතා කරනු ඇත.",
|
||||
"tracker_source": "ලුහුබැඳීම් මූලාශ්රය",
|
||||
"source_label": "මූලාශ්රය",
|
||||
"found_in_known_domain_db": "දැනුවත් වසම් දත්ත ගබඩාවේ හමු විය.",
|
||||
|
@ -294,38 +296,38 @@
|
|||
"unknown_filter": "{{filterId}} නොදන්නා පෙරහනකි",
|
||||
"known_tracker": "දැනුවත් ලුහුබැඳීමකි",
|
||||
"install_welcome_title": "ඇඩ්ගාර්ඩ් හෝම් වෙත සාදරයෙන් පිළිගනිමු!",
|
||||
"install_welcome_desc": "ඇඩ්ගාර්ඩ් හෝම් යනු ජාලය පුරා ඇති දැන්වීම් සහ ලුහුබැඳීම අවහිර කරන ව.නා.ප. සේවාදායකයකි. ඔබගේ මුළු ජාලය සහ සියළුම උපාංග පාලනය කිරීමට ඉඩ සලසා දීම එහි පරමාර්ථය යි, එයට අනුග්රාහක පාර්ශවීය වැඩසටහනක් භාවිතා කිරීම අවශ්ය නොවේ.",
|
||||
"install_welcome_desc": "ඇඩ්ගාර්ඩ් හෝම් යනු ජාලය පුරා දැන්වීම් සහ ලුහුබැඳීම අවහිර කරන ව.නා.ප. සේවාදායකයකි. ඔබගේ සමස්ත ජාලය සහ සියළුම උපාංග පාලනයට ඉඩ සලසා දීම එහි පරමාර්ථය යි, එයට අනුග්රාහක පාර්ශ්ව වැඩසටහනක් වුවමනා නොවේ.",
|
||||
"install_settings_title": "පරිපාලක වියමන අතුරු මුහුණත",
|
||||
"install_settings_listen": "සවන් දෙන අතුරු මුහුණත",
|
||||
"install_settings_port": "තොට",
|
||||
"install_settings_interface_link": "ඔබගේ ඇඩ්ගාර්ඩ් හෝම් පරිපාලක වියමන අතුරු මුහුණතට පහත ලිපින වලින් ප්රවේශ වීමට හැකිය:",
|
||||
"form_error_port": "වලංගු තොටක අගයක් යොදන්න",
|
||||
"install_settings_dns": "ව.නා.ප. සේවාදායකය",
|
||||
"install_settings_dns_desc": "පහත ලිපිනයන්හි ව.නා.ප. සේවාදායකය භාවිතා කිරීම සඳහා ඔබගේ උපාංග හෝ මාර්ගකාරකය වින්යාසගත කිරීමට අවශ්ය වනු ඇත:",
|
||||
"install_settings_all_interfaces": "සියළු අතුරුමුහුණත්",
|
||||
"install_settings_dns_desc": "ව.නා.ප. සේවාදායකය පහත ලිපිනවල භාවිතා කිරීම සඳහා ඔබගේ උපාංග හෝ මාර්ගකාරකය වින්යාසගත කිරීමට අවශ්ය වනු ඇත:",
|
||||
"install_settings_all_interfaces": "සියළුම අතුරුමුහුණත්",
|
||||
"install_auth_title": "සත්යාපනය",
|
||||
"install_auth_desc": "ඔබගේ ඇඩ්ගාර්ඩ් හෝම් පරිපාලන වියමන අතුරු මුහුණතට මුරපද සත්යාපනය වින්යාසගත කළ යුතුය. එය ඔබගේ ස්ථානීය ජාලයෙන් පමණක් ප්රවේශ විය හැකි වුවද, එය තව දුරටත් සීමා රහිත ප්රවේශයකින් ආරක්ෂා කර ගැනීම වැදගත් ය.",
|
||||
"install_auth_username": "පරිශීලක නාමය",
|
||||
"install_auth_desc": "ඔබගේ ඇඩ්ගාර්ඩ් හෝම් පරිපාලන වියමන අතුරු මුහුණතට මුරපද සත්යාපනය වින්යාසගත කළ යුතුය. ඔබගේ ස්ථානීය ජාලයෙන් පමණක් ප්රවේශ වීමට හැකි වුවද, එය තව දුරටත් සීමා රහිත ප්රවේශයකින් ආරක්ෂා කර ගැනීම වැදගත් ය.",
|
||||
"install_auth_username": "පරිශ්රීලක නාමය",
|
||||
"install_auth_password": "මුරපදය",
|
||||
"install_auth_confirm": "මුරපදය තහවුරු කරන්න",
|
||||
"install_auth_username_enter": "පරිශීලක නාමය යොදන්න",
|
||||
"install_auth_username_enter": "පරිශ්රීලක නාමය යොදන්න",
|
||||
"install_auth_password_enter": "මුරපදය ඇතුල් කරන්න",
|
||||
"install_step": "පියවර",
|
||||
"install_devices_title": "ඔබගේ උපාංග වින්යාසගත කරන්න",
|
||||
"install_devices_desc": "ඇඩ්ගාර්ඩ් හෝම් භාවිතා කිරීම ආරම්භයට, ඔබගේ උපාංග එය පරිශ්රීලනයට වින්යාසගත කළ යුතුය.",
|
||||
"install_devices_desc": "ඇඩ්ගාර්ඩ් හෝම් භාවිතා කිරීමට, ඔබගේ උපාංග එය පරිශ්රීලනයට වින්යාසගත කළ යුතුය.",
|
||||
"install_submit_title": "සුභ පැතුම්!",
|
||||
"install_submit_desc": "පිහිටුවීමේ ක්රියා පටිපාටිය අවසන් වී ඇති අතර ඔබ දැන් ඇඩ්ගාර්ඩ් හෝම් භාවිතය ආරම්භ කිරීමට සූදානම්ය.",
|
||||
"install_submit_desc": "පිහිටුවීමේ ක්රියා පටිපාටිය අවසන් වී ඇති අතර ඔබ දැන් ඇඩ්ගාර්ඩ් හෝම් භාවිතා කිරීමට සූදානම් ය.",
|
||||
"install_devices_router": "මාර්ගකාරකය",
|
||||
"install_devices_router_desc": "මෙම පිහිටුම ඔබගේ නිවසේ මාර්ගකාරකයට සම්බන්ධිත සියළුම උපාංග ස්වයංක්රීයව ආවරණය කරන අතර ඔබට ඒ සෑම එකක්ම අතින් වින්යාසගත කිරීමට අවශ්ය නොවේ.",
|
||||
"install_devices_address": "ඇඩ්ගාර්ඩ් හෝම් ව.නා.ප. සේවාදායකය පහත ලිපිනයන්ට සවන් දෙමින් පවතී",
|
||||
"install_devices_router_list_1": "ඔබගේ මාර්ගකාරකයෙහි අභිප්රේත විවෘත කරන්න. සාමාන්යයෙන්, එය ඔබගේ අතිරික්සුවෙන් ඒ.ස.නි.(URL) ක් හරහා (http://192.168.0.1/ හෝ http://192.168.1.1/ වැනි) ප්රවේශ විය හැකිය. මුරපදය ඇතුල් කිරීමට සිදු විය හැකි නමුත් එය මතක නැතිනම් බොහෝ විට මාර්ගකාරකයේ බොත්තමක් එබීමෙන් මුරපදය නැවත සැකසීමට හැකිය. නමුත් මෙම ක්රියා පටිපාටිය තෝරා ගන්නේ නම්, බොහෝ විට ඔබගේ මාර්ගකාරකයේ සමස්ථ වින්යාසය අහිමි වනු ඇති බව මතක තබා ගන්න. මෙය පිහිටුවීමට ඔබගේ මාර්ගකාරකයට යෙදුමක් ඇවැසි නම්, කරුණාකර එය ඔබගේ පරිගණකයේ හෝ දුරකථනයේ ස්ථාපනය කර මාර්ගකාරකයේ සැකසුම් වෙත ප්රවේශ වීමට භාවිතා කරන්න.",
|
||||
"install_devices_router_list_2": "ග.ධා.වි.කෙ. (DHCP)/ ව.නා.ප. (DNS) සැකසුම් සොයා ගන්න. අංක කට්ටල දෙකකට හෝ තුනකට ඉඩ දෙන ක්ෂේත්රයක් අසල ඇති ව.නා.ප. අකුරු බලන්න, සෑම එකක්ම ඉලක්කම් එකේ සිට තුන දක්වා කාණ්ඩ හතරකට බෙදා ඇත.",
|
||||
"install_devices_router_list_1": "ඔබගේ මාර්ගකාරකයෙහි අභිප්රේත විවෘත කරන්න. සාමාන්යයෙන්, එය ඔබගේ අතිරික්සුවෙන් ඒ.ස.නි.(URL) ක් හරහා (http://192.168.0.1/ හෝ http://192.168.1.1/ වැනි) ප්රවේශ වීමට හැකිය. මුරපදය ඇතුල් කිරීමට සිදු විය හැකි නමුත් එය මතක නැතිනම් බොහෝ විට මාර්ගකාරකයේ බොත්තමක් එබීමෙන් මුරපදය නැවත සැකසීමට හැකිය. නමුත් මෙම ක්රියා පටිපාටිය තෝරා ගන්නේ නම්, බොහෝ විට ඔබගේ මාර්ගකාරකයේ සමස්ථ වින්යාසය අහිමි වනු ඇති බව මතක තබා ගන්න. මෙය පිහිටුවීමට ඔබගේ මාර්ගකාරකයට යෙදුමක් වුවමනා නම්, කරුණාකර එය ඔබගේ පරිගණකයේ හෝ දුරකථනයේ ස්ථාපනය කර මාර්ගකාරකයේ සැකසුම් වෙත ප්රවේශ වීමට භාවිතා කරන්න.",
|
||||
"install_devices_router_list_2": "ග.ධා.වි.කෙ. (DHCP)/ ව.නා.ප. (DNS) සැකසුම් සොයා ගන්න. අංක කට්ටල දෙකකට හෝ තුනකට ඉඩ දෙන ක්ෂේත්රයක් අසල ඇති ව.නා.ප. අකුරු බලන්න, සෑම එකක්ම ඉලක්කම් එකේ සිට තුන දක්වා කාණ්ඩ හතරකට බෙදා ඇත.",
|
||||
"install_devices_router_list_3": "ඔබගේ ඇඩ්ගාර්ඩ් හෝම් සේවාදායක ලිපින එහි ඇතුල් කරන්න.",
|
||||
"install_devices_router_list_4": "සමහර වර්ගයේ මාර්ගකාරක වල අභිරුචි ව.නා.ප. සේවාදායකයක් සැකසීමට නොහැකිය. මෙම අවස්ථාවේදී ඇඩ්ගාර්ඩ් හෝම් <0>ග.ධා.වි.කෙ. සේවාදායකයක්</0> ලෙස පිහිටුවන්නේ නම් එය උපකාර වනු ඇත. එසේ නැතිනම්, ඔබගේ විශේෂිත මාර්ගකාරකය සඳහා වූ ව.නා.ප. සේවාදායක රිසිකරණය කරන්නේ කෙසේද යන්න පිළිබඳ අත්පොත පරීක්ෂා කළ යුතුය.",
|
||||
"install_devices_router_list_4": "සමහර මාර්ගකාරක වර්ගවල අභිරුචි ව.නා.ප. සේවාදායකයක් සැකසීමට නොහැකිය. මෙම අවස්ථාවේ දී ඇඩ්ගාර්ඩ් හෝම් <0>ග.ධා.වි.කෙ. සේවාදායකයක්</0> ලෙස පිහිටුවන්නේ නම් එය විසඳුමක් වනු ඇත. එසේ නැතිනම්, ඔබගේ විශේෂිත මාර්ගකාරකයේ අත්පොත පරීක්ෂා කර අභිරුචි ව.නා.ප. සේවාදායක යොදන ආකාරය සොයා ගත යුතුය.",
|
||||
"install_devices_windows_list_1": "පාලන වට්ටෝරුව හෝ වින්ඩෝස් සෙවුම හරහා පාලන මඬල අරින්න.",
|
||||
"install_devices_windows_list_2": "ජාල සහ අන්තර්ජාල ප්රවර්ගයට ගොස් පසුව ජාල සහ බෙදාගැනීමේ මධ්යස්ථානය වෙත යන්න.",
|
||||
"install_devices_windows_list_3": "වම් තීරුවෙහි \"උපයුක්තකයෙහි සැකසුම් වෙනස් කිරීම\" ඔබන්න.",
|
||||
"install_devices_windows_list_4": "ඔබගේ ක්රියාකාරී සම්බන්ධතාවය මත දකුණු-ක්ලික් කර ගුණාංග තෝරන්න.",
|
||||
"install_devices_windows_list_4": "ඔබගේ සක්රිය සම්බන්ධතාවය මත දකුණින් ඔබා ගුණාංග තෝරන්න.",
|
||||
"install_devices_windows_list_5": "ලැයිස්තුවෙන් \"අන්තර්ජාල කෙටුම්පත් අනුවාදය 4 (TCP/IPv4)\" (හෝ, IPv6 සඳහා, \"අන්තර්ජාල කෙටුම්පත් අනුවාදය 6 (TCP/IPv6)\") සොයාගෙන එය තෝරා ඉන්පසු ගුණාංග මත නැවත ඔබන්න.",
|
||||
"install_devices_windows_list_6": "'පහත සඳහන් ව.නා.ප. සේවාදායක ලිපින භාවිතා කරන්න' යන්න තෝරා ඔබගේ ඇඩ්ගාර්ඩ් හෝම් සේවාදායක ලිපින ඇතුල් කරන්න.",
|
||||
"install_devices_macos_list_1": "ඇපල් නිරූපකය එබීමෙන් පසු පද්ධතියේ අභිප්රේත වෙත යන්න.",
|
||||
|
@ -334,27 +336,27 @@
|
|||
"install_devices_macos_list_4": "ව.නා.ප. (DNS) තීරුව තෝරා ඔබගේ ඇඩ්ගාර්ඩ් හෝම් සේවාදායක ලිපින ඇතුල් කරන්න.",
|
||||
"install_devices_android_list_1": "ඇන්ඩ්රොයිඩ් මුල් තිරයෙන්, සැකසුම් මත තට්ටු කරන්න.",
|
||||
"install_devices_android_list_2": "වට්ටෝරුවෙහි වයි-ෆයි මත තට්ටු කරන්න. පවතින සියළුම ජාල ලේඛන ගතවී තිබෙන තිරය පෙන්වනු ඇත (ජංගම සම්බන්ධතාවය සඳහා අභිරුචි ව.නා.ප. සැකසීමට නොහැකිය).",
|
||||
"install_devices_android_list_3": "සම්බන්ධිත ජාලය මත දිගු වේලාවක් ඔබන්න, ඉන්පසුව ජාලය වෙනස් කිරීම මත තට්ටු කරන්න.",
|
||||
"install_devices_android_list_4": "ඔබට සමහර උපාංගවල සියළු සැකසුම් බැලීමට \"වැඩිදුර\" සඳහා වූ කොටුව සලකුණු කිරීමට අවශ්ය විය හැකිය. එමෙන්ම ඔබගේ ඇන්ඩ්රොයිඩ් ව.නා.ප. (DNS) සැකසුම් වෙනස් කිරීමට අ.ජා.කෙ. (IP) සැකසුම්, ග.ධා.වි.කෙ. (DHCP) සිට ස්ථිතික වෙත මාරු කළ යුතුය.",
|
||||
"install_devices_android_list_3": "සම්බන්ධිත ජාලය මත මද වේලාවක් ඔබාගෙන ඉන්න, ඉන්පසුව ජාලය වෙනස් කිරීම මත තට්ටු කරන්න.",
|
||||
"install_devices_android_list_4": "ඔබට සමහර උපාංගවල සියළුම සැකසුම් බැලීමට \"වැඩිදුර\" සඳහා වූ කොටුව සලකුණු කිරීමට අවශ්ය විය හැකිය. එමෙන්ම ග.ධා.වි.කෙ. (DHCP) සිට ස්ථිතික වෙත අ.ජා.කෙ. (IP) සැකසුම් මාරු කිරීමෙන් ඔබගේ ඇන්ඩ්රොයිඩ් ව.නා.ප. (DNS) සැකසුම් වෙනස් කිරීමට හැකිය.",
|
||||
"install_devices_android_list_5": "ව.නා.ප. 1 සහ ව.නා.ප. 2 පිහිටුවීම් අගයන් ඔබගේ ඇඩ්ගාර්ඩ් හෝම් සේවාදායක ලිපින වලට වෙනස් කරන්න.",
|
||||
"install_devices_ios_list_1": "මුල් තිරයේ සිට, සැකසුම් මත තට්ටු කරන්න.",
|
||||
"install_devices_ios_list_2": "වම්පස මෙනුවෙහි වයි-ෆයි තෝරන්න (ජං. දු.ක. සඳහා ව.නා.ප. වින්යාසගත කිරීමට නොහැකිය).",
|
||||
"install_devices_ios_list_3": "දැනට ක්රියාකාරී ජාලයයහෙි නම මත තට්ටු කරන්න.",
|
||||
"install_devices_ios_list_4": "ව.නා.ප. (DNS) ක්ෂේත්රය තුළ ඔබගේ ඇඩ්ගාර්ඩ් හෝම් සේවාදායක ලිපින ඇතුල් කරන්න.",
|
||||
"install_devices_ios_list_1": "මුල් තිරයෙන්, සැකසුම් මත තට්ටු කරන්න.",
|
||||
"install_devices_ios_list_2": "වම්පස වට්ටෝරුවෙන් වයි-ෆයි තෝරන්න (ජංගම දුරකථන සඳහා ව.නා.ප. වින්යාසගත කිරීමට නොහැකිය).",
|
||||
"install_devices_ios_list_3": "දැනට සක්රිය ජාලයේ නම මත තට්ටු කරන්න.",
|
||||
"install_devices_ios_list_4": "ව.නා.ප. (DNS) ක්ෂේත්රය තුළ ඔබගේ ඇඩ්ගාර්ඩ් හෝම් සේවාදායක ලිපින ඇතුල් කරන්න.",
|
||||
"get_started": "පටන් ගන්න",
|
||||
"next": "ඊළඟ",
|
||||
"open_dashboard": "උපකරණ පුවරුව විවෘත කරන්න",
|
||||
"open_dashboard": "උපකරණ පුවරුව අරින්න",
|
||||
"install_saved": "සාර්ථකව සුරකින ලදි",
|
||||
"encryption_title": "සංකේතනය",
|
||||
"encryption_desc": "ගුප්තකේතනය (HTTPS/QUIC/TLS) සඳහා ව.නා.ප. සහ පරිපාලක වියමන අතුරු මුහුණත සහය දක්වයි",
|
||||
"encryption_desc": "සංකේතනය (HTTPS/QUIC/TLS) සඳහා ව.නා.ප. සහ පරිපාලක වියමන අතුරු මුහුණත සහය දක්වයි",
|
||||
"encryption_config_saved": "සංකේතන වින්යාසය සුරකින ලදි",
|
||||
"encryption_server": "සේවාදායකයේ නම",
|
||||
"encryption_server_enter": "ඔබගේ වසම් නාමය ඇතුල් කරන්න",
|
||||
"encryption_server_desc": "සැකසා ඇත්නම්, ඇඩ්ගාර්ඩ් හෝම් විසින් අනුග්රාහක හැඳුනුම් හඳුනා ගැනෙයි, සෘ.ද.ඉ. (DDR) විමසුම්වලට ප්රතිචාර දක්වයි, සහ අතිරේක සම්බන්ධතා වලංගුකරණය සිදු කරයි. නොඑසේ නම්, මෙම විශේෂාංග අබලව ඇත. සහතිකයේ තිබෙන ව.නා.ප. නම් වලින් එකකට ගැළපිය යුතුය.",
|
||||
"encryption_server_enter": "වසමේ නම ඇතුල් කරන්න",
|
||||
"encryption_server_desc": "සකසා ඇත්නම්, ඇඩ්ගාර්ඩ් හෝම් විසින් අනුග්රාහක හැඳුනුම් හඳුනා ගැනෙයි, සෘ.ද.ඉ. (DDR) විමසුම් වලට ප්රතිචාර දක්වයි, සහ අතිරේක සම්බන්ධතා වලංගුකරණය සිදු කරයි. නොඑසේ නම්, මෙම විශේෂාංග අබලව පවතී. සහතිකයේ අඩංගු ව.නා.ප. නම් වලින් එකකට ගැළපිය යුතුය.",
|
||||
"encryption_redirect": "ස්වයංක්රීයව HTTPS වෙත හරවා යවන්න",
|
||||
"encryption_redirect_desc": "සබල කර ඇත්නම්, ඇඩ්ගාර්ඩ් හෝම් ඔබව ස්වයංක්රීයව HTTP සිට HTTPS ලිපින වෙත හරවා යවනු ඇත.",
|
||||
"encryption_redirect_desc": "සබල කර ඇත්නම්, ඇඩ්ගාර්ඩ් හෝම් ඔබව ස්වයංක්රීයව HTTP වෙතින් HTTPS ලිපින වෙත හරවා යවනු ඇත.",
|
||||
"encryption_https": "HTTPS තොට",
|
||||
"encryption_https_desc": "HTTPS තොට වින්යාසගත නම්, ඇඩ්ගාර්ඩ් හෝම් පරිපාලක අතුරුමුහුණත HTTPS හරහා ප්රවේශ විය හැකි අතර එය '/dns-query' ස්ථානයේ HTTPS-මගින්-ව.නා.ප. ද ලබා දෙනු ඇත.",
|
||||
"encryption_https_desc": "HTTPS තොට වින්යාසගත නම්, ඇඩ්ගාර්ඩ් හෝම් පරිපාලක අතුරුමුහුණතට HTTPS හරහා ප්රවේශ විය හැකි අතර එය '/dns-query' ස්ථානයේ HTTPS-මගින්-ව.නා.ප. ද ලබා දෙනු ඇත.",
|
||||
"encryption_dot": "TLS-මගින්-ව.නා.ප. තොට",
|
||||
"encryption_dot_desc": "මෙම තොට වින්යාසගත නම්, ඇඩ්ගාර්ඩ් හෝම් විසින් මෙම කවුළුව හරහා TLS-මගින්-ව.නා.ප. සේවාදායකයක් ධාවනය කෙරේ.",
|
||||
"encryption_doq": "QUIC-මගින්-ව.නා.ප. තොට",
|
||||
|
@ -362,19 +364,19 @@
|
|||
"encryption_certificates": "සහතික",
|
||||
"encryption_certificates_desc": "සංකේතනය භාවිතයට, ඔබගේ වසම සඳහා වලංගු SSL සහතික දාමයක් සැපයිය යුතුය. <0>{{link}}</0> වෙතින් නොමිලේ සහතිකයක් ලබා ගැනීමට හැකිය හෝ විශ්වාසදායක සහතික අධිකාරියකින් මිලදී ගන්න.",
|
||||
"encryption_certificates_input": "ඔබගේ PEM-කේතනය කළ සහතික පිටපත් කර මෙහි අලවන්න.",
|
||||
"encryption_status": "තත්වය",
|
||||
"encryption_status": "තත්වය",
|
||||
"encryption_expire": "කල් ඉකුත් වීම",
|
||||
"encryption_key": "පුද්ගලික යතුර",
|
||||
"encryption_key_input": "ඔබගේ සහතිකය සඳහා PEM-කේතනය කළ පුද්ගලික යතුර පිටපත් කර මෙහි අලවන්න.",
|
||||
"encryption_enable": "සංකේතනය සබල කරන්න (HTTPS, HTTPS-මගින්-ව.නා.ප. සහ TLS-මගින්-ව.නා.ප.)",
|
||||
"encryption_enable_desc": "සංකේතනය සබල කර ඇත්නම්, ඇඩ්ගාර්ඩ් හෝම් පරිපාලක අතුරුමුහුණත HTTPS හරහා ක්රියා කරනු ඇති අතර ව.නා.ප. සේවාදායකය HTTPS-මගින්-ව.නා.ප. සහ TLS-මගින්-ව.නා.ප. හරහා ලැබෙන ඉල්ලීම් සඳහා සවන් දෙනු ඇත.",
|
||||
"encryption_enable_desc": "සංකේතනය සබල කළ විට, ඇඩ්ගාර්ඩ් හෝම් පරිපාලක අතුරුමුහුණත HTTPS හරහා ක්රියා කරන අතර ව.නා.ප. සේවාදායකය HTTPS-මගින්-ව.නා.ප. සහ TLS-මගින්-ව.නා.ප. හරහා ලැබෙන ඉල්ලීම් වලට සවන් දෙනු ඇත.",
|
||||
"encryption_chain_valid": "සහතික දාමය වලංගු ය",
|
||||
"encryption_chain_invalid": "සහතික දාමය වලංගු නොවේ",
|
||||
"encryption_key_valid": "මෙය වලංගු {{type}} පුද්ගලික යතුරකි",
|
||||
"encryption_key_invalid": "මෙය වලංගු නොවන {{type}} පුද්ගලික යතුරකි",
|
||||
"encryption_subject": "මාතෘකාව",
|
||||
"encryption_issuer": "නිකුත් කරන්නා",
|
||||
"encryption_hostnames": "ධාරක නාම",
|
||||
"encryption_hostnames": "සත්කාරක නාම",
|
||||
"encryption_reset": "සංකේතාංකන සැකසුම් යළි පිහිටුවීමට අවශ්ය බව ඔබට විශ්වාස ද?",
|
||||
"encryption_warning": "අවවාදයයි",
|
||||
"topline_expiring_certificate": "ඔබගේ SSL සහතිකය කල් ඉකුත්වීමට ආසන්න වී ඇත. <0>සංකේතන සැකසුම්</0> යාවත්කාල කරන්න.",
|
||||
|
@ -423,14 +425,14 @@
|
|||
"clients_not_found": "අනුග්රාහක හමු නොවිණි",
|
||||
"client_confirm_delete": "\"{{key}}\" අනුග්රාහකය ඉවත් කිරීමට අවශ්ය බව ඔබට විශ්වාසද?",
|
||||
"list_confirm_delete": "මෙම ලැයිස්තුව ඉවත් කිරීමට අවශ්ය බව ඔබට විශ්වාස ද?",
|
||||
"auto_clients_desc": "ඇඩ්ගාර්ඩ් හෝම් භාවිතා කරන නිබැඳි අනුග්රාහක තුළ නැති උපාංග",
|
||||
"access_title": "ප්රවේශවීමට සැකසුම්",
|
||||
"access_desc": "මෙහිදී ඔබට ඇඩ්ගාර්ඩ් හෝම් ව.නා.ප. සේවාදායකයට ප්රවේශ වීමේ නීති වින්යාසගත කළ හැකිය",
|
||||
"access_allowed_title": "ඉඩ ලත් අනුග්රාහකයින්",
|
||||
"access_allowed_desc": "අන.ජා.(CIDR), අ.ජා.කෙ. ලිපින හෝ <a>අනුග්රාහක හැඳු.</a> ලේඛනයකි. මෙහි නිවේශිත ඇත්නම්, ඇඩ්ගාර්ඩ් හෝම් විසින් එම අනුග්රාහක වලින් පමණක් ඉල්ලීම් පිළිගනු ඇත.",
|
||||
"access_disallowed_title": "නොඉඩ ලත් අනුග්රාහකයින්",
|
||||
"access_disallowed_desc": "අන.ජා.(CIDR), අ.ජා.කෙ. ලිපින හෝ <a>අනුග්රාහක හැඳු.</a> ලේඛනයකි. මෙහි නිවේශිත ඇත්නම්, ඇඩ්ගාර්ඩ් හෝම් විසින් එම අනුග්රාහක වලින් ඉල්ලීම් අත්හරිනු ඇත. ඉඩ ලත් අනුග්රාහකවල නිවේශිත තිබේ නම්, මෙම ක්ෂේත්රය නොසලකා හරිනු ඇත.",
|
||||
"access_blocked_title": "නොඉඩ ලත් වසම්",
|
||||
"auto_clients_desc": "ඇඩ්ගාර්ඩ් හෝම් භාවිතා කරන හෝ භාවිතයට ඉඩ තිබෙන උපාංගවල අ.ජා.කෙ. (IP) ලිපින පිළිබඳ තොරතුරු. මෙම තොරතුරු සත්කාරක ගොනු, ප්රතිවර්ත ව.නා.ප. ආදී මූලාශ්ර කිහිපයකින් රැස් කෙරේ.",
|
||||
"access_title": "ප්රවේශ සැකසුම්",
|
||||
"access_desc": "මෙහි දී ඔබට ඇඩ්ගාර්ඩ් හෝම් ව.නා.ප. සේවාදායකයට ප්රවේශ වීමේ නීති වින්යාසගත කිරීමට හැකිය",
|
||||
"access_allowed_title": "ඉඩ දෙන අනුග්රාහක",
|
||||
"access_allowed_desc": "අන.ජා.(CIDR), අ.ජා.කෙ. ලිපින හෝ <a>අනුග්රාහක හැඳු.</a> ලේඛනයකි. මෙහි නිවේශිත ඇත්නම්, ඇඩ්ගාර්ඩ් හෝම් එම අනුග්රාහක වලින් පමණක් ඉල්ලීම් පිළිගනු ඇත.",
|
||||
"access_disallowed_title": "ඉඩ නොදෙන අනුග්රාහක",
|
||||
"access_disallowed_desc": "අන.ජා.(CIDR), අ.ජා.කෙ. ලිපින හෝ <a>අනුග්රාහක හැඳු.</a> ලේඛනයකි. මෙහි නිවේශිත ඇත්නම්, ඇඩ්ගාර්ඩ් හෝම් එම අනුග්රාහක වලින් ඉල්ලීම් අත්හරිනු ඇත. ඉඩ දෙන අනුග්රාහක කොටසේ නිවේශිත තිබේ නම්, මෙම ක්ෂේත්රය නොසලකා හරිනු ඇත.",
|
||||
"access_blocked_title": "ඉඩ නොදෙන වසම්",
|
||||
"access_settings_saved": "ප්රවේශ වීමේ සැකසුම් සාර්ථකව සුරකින ලදි",
|
||||
"updates_checked": "ඇඩ්ගාර්ඩ් හෝම් හි නව අනුවාදයක් තිබේ",
|
||||
"updates_version_equal": "ඇඩ්ගාර්ඩ් හෝම් යාවත්කාලීනයි",
|
||||
|
@ -461,7 +463,7 @@
|
|||
"rewrite_confirm_delete": "\"{{key}}\" සඳහා ව.නා.ප. නැවත ලිවීම ඉවත් කිරීමට අවශ්ය බව ඔබට විශ්වාසද?",
|
||||
"rewrite_desc": "නිශ්චිත වසම් නාමයක් සඳහා අභිරුචි ව.නා.ප. ප්රතිචාර පහසුවෙන් වින්යාසගත කිරීමට ඉඩ දෙයි.",
|
||||
"rewrite_applied": "නැවත ලිවීමේ නීතිය යොදා ඇත",
|
||||
"rewrite_hosts_applied": "ධාරක ගොනු නීතිය මගින් නැවත ලියා ඇත",
|
||||
"rewrite_hosts_applied": "සත්කාරක ගොනුවක නීතියකින් නැවත ලියා ඇත",
|
||||
"dns_rewrites": "ව.නා.ප. නැවත ලිවීම්",
|
||||
"form_answer": "අ.ජා.කෙ. (IP) ලිපිනය හෝ වසම ඇතුල් කරන්න ",
|
||||
"form_error_domain_format": "වලංගු නොවන වසම් ආකෘතියකි",
|
||||
|
@ -504,51 +506,53 @@
|
|||
"statistics_enable": "සංඛ්යාලේඛන සබල කරන්න",
|
||||
"ignore_domains": "නොසලකන වසම් (පේළියකට එක බැගින්)",
|
||||
"ignore_domains_title": "නොසලකන වසම්",
|
||||
"ignore_domains_desc_stats": "සංඛ්යාලේඛනයෙහි මෙම වසම් සඳහා විමසුම් නොලියැවෙයි",
|
||||
"ignore_domains_desc_query": "විමසුම් සටහනෙහි මෙම වසම් සඳහා විමසුම් නොලියැවෙයි",
|
||||
"interval_hours": "පැය {{count}}",
|
||||
"interval_hours_plural": "පැය {{count}}",
|
||||
"filters_configuration": "පෙරහන් වින්යාසය",
|
||||
"filters_enable": "පෙරහන් සබල කරන්න",
|
||||
"filters_interval": "පෙරහන් යාවත්කාල කාල පරතරය",
|
||||
"disabled": "අබල කර ඇත",
|
||||
"username_label": "පරිශීලක නාමය",
|
||||
"username_placeholder": "පරිශීලක නාමය යොදන්න",
|
||||
"username_label": "පරිශ්රීලක නාමය",
|
||||
"username_placeholder": "පරිශ්රීලක නාමය යොදන්න",
|
||||
"password_label": "මුරපදය",
|
||||
"password_placeholder": "මුරපදය ඇතුල් කරන්න",
|
||||
"sign_in": "පුරන්න",
|
||||
"sign_out": "වරන්න",
|
||||
"forgot_password": "මුරපදය අමතක වුණා ද?",
|
||||
"forgot_password_desc": "ඔබගේ පරිශීලක ගිණුම සඳහා නව මුරපදයක් සෑදීමට කරුණාකර <0>මෙම පියවර</0> අනුගමනය කරන්න.",
|
||||
"forgot_password_desc": "ඔබගේ පරිශ්රීලක ගිණුම සඳහා නව මුරපදයක් සෑදීමට කරුණාකර <0>මෙම පියවර</0> අනුගමනය කරන්න.",
|
||||
"location": "ස්ථානය",
|
||||
"orgname": "සංවිධානයේ නම",
|
||||
"netname": "ජාලයේ නම",
|
||||
"network": "ජාලය",
|
||||
"descr": "සවිස්තරය",
|
||||
"whois": "Whois",
|
||||
"filtering_rules_learn_more": "ඔබගේ ම ධාරක ලැයිස්තු සෑදීම පිළිබඳව <0>තව දැනගන්න</0>.",
|
||||
"filtering_rules_learn_more": "ඔබගේ ම සත්කාරක ලැයිස්තු සෑදීම පිළිබඳව <0>තව දැනගන්න</0>.",
|
||||
"blocked_by_response": "ප්රතිචාරය අන්. නාමයක් (CNAME) හෝ අ.ජා.කෙ. මගින් අවහිර කර ඇත",
|
||||
"blocked_by_cname_or_ip": "අන්. නාමයක් (CNAME) හෝ අ.ජා.කෙ. මගින් අවහිර කර ඇත",
|
||||
"try_again": "යළි උත්සාහය",
|
||||
"example_rewrite_domain": "මෙම වසම් නාමය සඳහා පමණක් ප්රතිචාර නැවත ලියන්න.",
|
||||
"example_rewrite_domain": "මෙම වසම් නාමය සඳහා පමණක් ප්රතිචාර නැවත ලියයි.",
|
||||
"example_rewrite_wildcard": "<0>උදාහරණය.ලංකා</0> සහ එහි සියළුම උප වසම් සඳහා ප්රතිචාර නැවත ලියයි.",
|
||||
"rewrite_ip_address": "අ.ජා.කෙ. ලිපිනය: මෙම අ.ජා.කෙ. A හෝ AAAA ප්රතිචාරයකට ගන්න",
|
||||
"rewrite_domain_name": "වසම් නාමය: අන්. නාම (CNAME) වාර්තාවක් එක්කරන්න",
|
||||
"disable_ipv6": "අයිපීවී6 ලිපින විසඳීම අබල කරන්න",
|
||||
"disable_ipv6_desc": "අ.ජා.කෙ. අනු.6 ලිපින (AAAA වර්ගය) සඳහා වන සියළුම ව.නා.ප. විමසුම් අතහැර දමයි.",
|
||||
"fastest_addr": "වේගවත්ම අන්තර්ජාල කෙටුම්පත් (IP) ලිපිනය",
|
||||
"fastest_addr_desc": "සියළුම ව.නා.ප. සේවාදායක වලින් විමසා සියළු ප්රතිචාර අතරින් වේගවත්ම අ.ජා.කෙ. ලිපිනය ලබා දෙයි. සියළුම ව.නා.ප. ප්රතිචාර සඳහා ඇඩ්ගාර්ඩ් හෝම් රැඳී සිටිය යුතු බැවින් මෙය ව.නා.ප. විමසුම් මන්දගාමී කරන නමුත් සමස්ත සම්බන්ධතාවය වැඩි දියුණු කරයි.",
|
||||
"rewrite_ip_address": "අ.ජා.කෙ. ලිපිනය: A හෝ AAAA ප්රතිචාරයකට අ.ජා.කෙ. ලිපිනයක් යොදන්න",
|
||||
"rewrite_domain_name": "වසම් නාමය: අන්වර්ථ නාමයක් (CNAME) එක් කරන්න",
|
||||
"disable_ipv6": "IPv6 ලිපින විසඳීම අබල කරන්න",
|
||||
"disable_ipv6_desc": "IPv6 ලිපින (AAAA වර්ගය) සඳහා වන සියළුම ව.නා.ප. විමසුම් අතහැර දමයි. HTTPS ප්රතිචාර වලින් IPv6 ඉඟි ඉවත් කරයි.",
|
||||
"fastest_addr": "වේගවත්ම අන්තර්ජාල කෙටුම්පතක (IP) ලිපිනය",
|
||||
"fastest_addr_desc": "සියළුම ව.නා.ප. සේවාදායක වලින් විමසා එම ප්රතිචාර අතරින් වේගවත්ම අ.ජා.කෙ. ලිපිනය ලබා දෙයි. සියළුම ව.නා.ප. ප්රතිචාර සඳහා ඇඩ්ගාර්ඩ් හෝම් රැඳී සිටිය යුතු බැවින් මෙය ව.නා.ප. විමසුම් මන්දගාමී කරන නමුත් සමස්ත සම්බන්ධතාවය වැඩි දියුණු කරයි.",
|
||||
"autofix_warning_text": "ඔබ \"නිරාකරණය\" යන්න එබුවහොත්, ඔබගේ පද්ධතිය ඇඩ්ගාර්ඩ් හෝම් ව.නා.ප. සේවාදායකය භාවිතයට වින්යාසගත කෙරෙනු ඇත.",
|
||||
"autofix_warning_result": "ප්රතිඵලයක් ලෙස ඔබගේ පද්ධතියෙන් ලැබෙන සියළුම ව.නා.ප. ඉල්ලීම් මූලිකවම ඇඩ්ගාර්ඩ් හෝම් විසින් සකසනු ඇත.",
|
||||
"tags_title": "අනන්යන",
|
||||
"tags_desc": "අනුග්රාහකයට අනුරූපව අනන්යන ඔබට තෝරා ගත හැකිය. ඒවා වඩාත් නිවැරදිව යෙදීමට \nඅනන්යන පෙරහන් නීති වලට ඇතුළත් කරන්න. <0>තව දැන ගන්න</0>.",
|
||||
"tags_desc": "අනුග්රාහකයට අනුරූප වන අනන්යන ඔබට තේරීමට හැකිය. ඒවා වඩාත් නිවැරදිව යෙදීමට \nඅනන්යන පෙරහන් නීති වලට ඇතුළත් කරන්න. <0>තව දැන ගන්න</0>.",
|
||||
"form_select_tags": "අනුග්රාහක අනන්යන තෝරන්න",
|
||||
"check_title": "පෙරීම පරීක්ෂා කරන්න",
|
||||
"check_desc": "සත්කාරක නාමය පෙරෙනවා දැයි පරීක්ෂා කරන්න.",
|
||||
"check": "පරීක්ෂාව",
|
||||
"form_enter_host": "ධාරක නාමයක් ඇතුල් කරන්න",
|
||||
"form_enter_host": "සත්කාරක නාමයක් යොදන්න",
|
||||
"filtered_custom_rules": "අභිරුචි පෙරීමේ නීති මගින් පෙරහන් කරන ලදි",
|
||||
"choose_from_list": "ලැයිස්තුවෙන් තෝරන්න",
|
||||
"add_custom_list": "අභිරුචි ලැයිස්තුවක් එක්කරන්න",
|
||||
"host_whitelisted": "ධාරකයට ඉඩ දී ඇත",
|
||||
"add_custom_list": "අභිරුචි ලැයිස්තුවක්",
|
||||
"host_whitelisted": "සත්කාරකයට ඉඩ දී ඇත",
|
||||
"check_ip": "අ.ජා.කෙ. ලිපින: {{ip}}",
|
||||
"check_cname": "අන්. නාමය (CNAME): {{cname}}",
|
||||
"check_reason": "හේතුව: {{reason}}",
|
||||
|
@ -560,7 +564,7 @@
|
|||
"client_blocked": "අනුග්රාහකය \"{{ip}}\" සාර්ථකව අවහිර කෙරිණි",
|
||||
"client_unblocked": "අනුග්රාහකය \"{{ip}}\" සාර්ථකව අනවහිර කෙරිණි",
|
||||
"static_ip": "ස්ථිතික අ.ජා. කෙ. ලිපිනය",
|
||||
"static_ip_desc": "ඇඩ්ගාර්ඩ් හෝම් යනු සේවාදායකයක් බැවින් එය නිසි ලෙස ක්රියා කිරීමට ස්ථිතික අන්තර්ජාල කෙටුම්පත් (IP) ලිපිනයක් ඇවැසිය. එසේ නැතිනම්, යම් අවස්ථාවක දී ඔබගේ මාර්ගකාරකය මෙම උපාංගයට වෙනත් අ.ජා. කෙ. ලිපිනයක් ලබා දිය හැකිය.",
|
||||
"static_ip_desc": "ඇඩ්ගාර්ඩ් හෝම් යනු සේවාදායකයක් බැවින් එය නිසි ලෙස ක්රියා කිරීමට ස්ථිතික අන්තර්ජාල කෙටුම්පත් (IP) ලිපිනයක් ඇවැසිය. එසේ නැතිනම්, යම් අවස්ථාවක දී ඔබගේ මාර්ගකාරකය මෙම උපාංගයට වෙනත් අ.ජා. කෙ. ලිපිනයක් ලබා දීමට ඉඩ තිබේ.",
|
||||
"set_static_ip": "ස්ථිතික අ.ජා.කෙ. (IP) ලිපිනයක් සකසන්න",
|
||||
"install_static_ok": "සුභ තොරතුරක්! ස්ථිතික අන්තර්ජාල කෙටුම්පත් (IP) ලිපිනය දැනටමත් වින්යාසගත කර ඇත",
|
||||
"install_static_error": "මෙම ජාල අතුරුමුහුණත සඳහා ඇඩ්ගාර්ඩ් හෝම් හට එය ස්වයංක්රීයව වින්යාසගත කිරීමට නොහැකිය. මෙය අතින් කරන්නේ කෙසේද යන්න පිළිබඳ උපදෙස් සොයා ගන්න.",
|
||||
|
@ -593,7 +597,7 @@
|
|||
"cache_ttl_max_override_desc": "ව.නා.ප. නිහිතයෙහි නිවේශිත සඳහා උපරිම පවත්නා කාලයක අගයක් (තත්.) සකසන්න.",
|
||||
"ttl_cache_validation": "නිහිතයෙහි පාගාගෙන යන අවම පව. කා. (TTL) උපරිමයට වඩා අඩු හෝ සමාන විය යුතුය",
|
||||
"cache_optimistic": "සර්වශුභවාදී නිහිතගතය",
|
||||
"cache_optimistic_desc": "නිවේශිත කල් ඉකුත් වූ විට පවා ඇඩ්ගාර්ඩ් හෝම් ට නිහිතයෙන් ප්රතිචාර දැක්වීමට සලස්වයි එමෙන්ම ඒවා නැවත නැවුම් කිරීමට ද උත්සාහ කරයි.",
|
||||
"cache_optimistic_desc": "නිවේශිත කල් ඉකුත් වූ විට පවා ඇඩ්ගාර්ඩ් හෝම් නිහිතයෙන් ප්රතිචාර දැක්වීමට සලස්වයි එමෙන්ම ඒවා නැවත නැවුම් කිරීමට ද උත්සාහ කරයි.",
|
||||
"filter_category_general": "පොදු",
|
||||
"filter_category_security": "ආරක්ෂණ",
|
||||
"filter_category_regional": "ප්රාදේශීය",
|
||||
|
@ -641,6 +645,13 @@
|
|||
"custom_rotation_input": "රඳවා ගැනීම පැය වලින්",
|
||||
"protection_section_label": "රැකවරණය",
|
||||
"log_and_stats_section_label": "විමසුම් සටහන හා සංඛ්යාලේඛන",
|
||||
"ignore_query_log": "සටහනෙහි අනුග්රාහකය නොසලකන්න",
|
||||
"ignore_statistics": "සංඛ්යාලේඛනයට අනුග්රාහකය නොසලකන්න"
|
||||
"ignore_query_log": "විමසුම් සටහනට මෙම අනුග්රාහකය යොදන්න එපා",
|
||||
"ignore_statistics": "සංඛ්යාලේඛනයට මෙම අනුග්රාහකය යොදන්න එපා",
|
||||
"sunday_short": "ඉරිදා",
|
||||
"monday_short": "සඳුදා",
|
||||
"tuesday_short": "අඟහ",
|
||||
"wednesday_short": "බදාදා",
|
||||
"thursday_short": "බ්රහස්",
|
||||
"friday_short": "සිකු",
|
||||
"saturday_short": "සෙන"
|
||||
}
|
||||
|
|
|
@ -7,12 +7,15 @@
|
|||
"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.",
|
||||
"bootstrap_dns": "Bootstrap DNS servery",
|
||||
"bootstrap_dns_desc": "Bootstrap DNS servery sa používajú na rozlíšenie IP adries DoH/DoT rezolverov, ktoré zadáte ako upstreams.",
|
||||
"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_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",
|
||||
"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_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_placeholder": "Na každý riadok zadajte 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_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",
|
||||
|
@ -125,6 +128,8 @@
|
|||
"top_clients": "Najčastejší klienti",
|
||||
"no_clients_found": "Neboli nájdení žiadni klienti",
|
||||
"general_statistics": "Všeobecná štatistika",
|
||||
"top_upstreams": "Často požadované upstream servery",
|
||||
"no_upstreams_data_found": "Nenašli sa žiadne údaje o upstream serveroch",
|
||||
"number_of_dns_query_days": "Počet DNS dopytov spracovaných za posledný {{count}} deň",
|
||||
"number_of_dns_query_days_plural": "Počet DNS dopytov spracovaných za posledných {{count}} dní",
|
||||
"number_of_dns_query_24_hours": "Počet DNS dopytov spracovaných za posledných 24 hodín",
|
||||
|
@ -134,6 +139,7 @@
|
|||
"enforced_save_search": "Vynútené bezpečné vyhľadávanie",
|
||||
"number_of_dns_query_to_safe_search": "Počet DNS dopytov na vyhľadávače, pri ktorých bolo vynútené bezpečné vyhľadávanie",
|
||||
"average_processing_time": "Priemerný čas spracovania",
|
||||
"processing_time": "Doba spracovania",
|
||||
"average_processing_time_hint": "Priemerný čas spracovania DNS dopytu v milisekundách",
|
||||
"block_domain_use_filters_and_hosts": "Blokovať domény pomocou filtrov a zoznamov adries",
|
||||
"filters_block_toggle_hint": "Pravidlá blokovania môžete nastaviť v nastaveniach <a>Filtre</a>.",
|
||||
|
@ -158,6 +164,7 @@
|
|||
"upstream_dns_configured_in_file": "Konfigurované v {{path}}",
|
||||
"test_upstream_btn": "Test upstreamov",
|
||||
"upstreams": "Upstreams",
|
||||
"upstream": "Upstream server",
|
||||
"apply_btn": "Použiť",
|
||||
"disabled_filtering_toast": "Vypnutá filtrácia",
|
||||
"enabled_filtering_toast": "Zapnutá filtrácia",
|
||||
|
@ -564,7 +571,7 @@
|
|||
"rewrite_A": "<0>A</0>: špeciálna hodnota, uchovávajte záznamy <0>A</0> z upstream",
|
||||
"rewrite_AAAA": "<0>AAAA</0>: špeciálna hodnota, uchovávajte záznamy <0>AAAA</0> z upstream",
|
||||
"disable_ipv6": "Vypnúť rozlišovanie IPv6 adries",
|
||||
"disable_ipv6_desc": "Vynechať všetky dotazy DNS na IPv6 adresy (typ AAAA).",
|
||||
"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_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.",
|
||||
"autofix_warning_text": "Ak kliknete na „Opraviť“, AdGuardHome nakonfiguruje Váš systém tak, aby používal DNS server AdGuardHome.",
|
||||
|
@ -676,5 +683,37 @@
|
|||
"protection_section_label": "Ochrana",
|
||||
"log_and_stats_section_label": "Protokol dopytov a štatistiky",
|
||||
"ignore_query_log": "Ignorovať tohto klienta v denníku dopytov",
|
||||
"ignore_statistics": "Ignorovanie tohto klienta v štatistikách"
|
||||
"ignore_statistics": "Ignorovanie tohto klienta v štatistikách",
|
||||
"schedule_services": "Pozastavenie blokovania služby",
|
||||
"schedule_services_desc": "Konfigurácia plánu pozastavenia filtra blokovania služieb",
|
||||
"schedule_services_desc_client": "Konfigurácia plánu pozastavenia filtra blokovania služieb pre tohto klienta",
|
||||
"schedule_desc": "Nastavenie doby nečinnosti pre blokované služby",
|
||||
"schedule_invalid_select": "Čas začiatku musí byť pred časom ukončenia",
|
||||
"schedule_select_days": "Zvoliť dni",
|
||||
"schedule_timezone": "Vyberte časové pásmo",
|
||||
"schedule_current_timezone": "Aktuálne časové pásmo: {{value}}",
|
||||
"schedule_time_all_day": "Celý deň",
|
||||
"schedule_modal_description": "Tento plán nahradí všetky existujúce plány na rovnaký deň v týždni. Každý deň v týždni môže mať iba jedno obdobie nečinnosti.",
|
||||
"schedule_modal_time_off": "Žiadne blokovanie služby:",
|
||||
"schedule_new": "Nový časový plán",
|
||||
"schedule_edit": "Upraviť časový plán",
|
||||
"schedule_save": "Uložiť časový plán",
|
||||
"schedule_add": "Pridať časový plán",
|
||||
"schedule_remove": "Odstrániť časový plán",
|
||||
"schedule_from": "Od",
|
||||
"schedule_to": "Do",
|
||||
"sunday": "Nedeľa",
|
||||
"monday": "Pondelok",
|
||||
"tuesday": "Utorok",
|
||||
"wednesday": "Streda",
|
||||
"thursday": "Štvrtok",
|
||||
"friday": "Piatok",
|
||||
"saturday": "Sobota",
|
||||
"sunday_short": "Ned",
|
||||
"monday_short": "Pon",
|
||||
"tuesday_short": "Uto",
|
||||
"wednesday_short": "Str",
|
||||
"thursday_short": "Štr",
|
||||
"friday_short": "Pia",
|
||||
"saturday_short": "Sob"
|
||||
}
|
||||
|
|
|
@ -7,12 +7,15 @@
|
|||
"load_balancing": "Uravnavanje obremenitve",
|
||||
"load_balancing_desc": "Poizvedujte po enem strežniku navzgor. AdGuard Home s pomočjo tehtanega naključnega algoritma izbere strežnik, tako da se najpogosteje uporablja najhitrejši strežnik.",
|
||||
"bootstrap_dns": "Zagonski DNS strežniki",
|
||||
"bootstrap_dns_desc": "Zagonski DNS strežniki se uporabljajo za razreševanje IP naslovov DoH/DoT reševalcev, ki jih določite kot navzgornje.",
|
||||
"bootstrap_dns_desc": "Naslovi IP strežnikov DNS, ki se uporabljajo za razreševanje naslovov IP razreševalcev DoH/DoT, ki jih določite kot navzgor. Komentarji niso dovoljeni.",
|
||||
"fallback_dns_title": "Rezervni strežniki DNS",
|
||||
"fallback_dns_desc": "Seznam rezervnih strežnikov DNS, ki se uporabljajo, ko se gorvodni strežniki DNS ne odzivajo. Sintaksa je enaka kot v zgornjem gorvodnem polju.",
|
||||
"fallback_dns_placeholder": "Vnesite en rezervni strežnik DNS na vrstico",
|
||||
"local_ptr_title": "Zasebni povratni strežniki DNS",
|
||||
"local_ptr_desc": "Strežniki DNS, ki jih AdGuard Home uporablja za lokalne PTR poizvedbe. Ti strežniki se uporabljajo za reševanje zahtev PTR za naslove v zasebnih obsegih IP, na primer \"192.168.12.34\", z uporabo obratnega DNS. Če ni nastavljen, AdGuard Home uporablja naslove privzetih razreševalnikov DNS vašega OS, razen naslovov samega AdGuard Home.",
|
||||
"local_ptr_default_resolver": "AdGuard Home privzeto uporablja te povratne razreševalnike DNS: {{ip}}.",
|
||||
"local_ptr_no_default_resolver": "AdGuard Home ni mogel določiti ustreznih zasebnih povratnih reševalcev DNS za ta sistem.",
|
||||
"local_ptr_placeholder": "V vrstico vnesite en naslov strežnika",
|
||||
"local_ptr_placeholder": "Vnesite en naslov IP na vrstico",
|
||||
"resolve_clients_title": "Omogoči obratno reševanje naslovov IP gostiteljev",
|
||||
"resolve_clients_desc": "Povratno razrešite naslove IP odjemalcev v njihova gostiteljska imena, tako da pošljete poizvedbe PTR ustreznim razreševalcem (zasebni strežniki DNS za lokalne odjemalce, gorvodni strežniki za odjemalce z javnimi naslovi IP).",
|
||||
"use_private_ptr_resolvers_title": "Uporabi zasebne povratne razreševalnike rDNS",
|
||||
|
@ -125,6 +128,8 @@
|
|||
"top_clients": "Najpogostejši odjemalci",
|
||||
"no_clients_found": "Ni najdenih odjemalcev",
|
||||
"general_statistics": "Splošna statistika",
|
||||
"top_upstreams": "Pogosto zahtevani gorvodni strežniki",
|
||||
"no_upstreams_data_found": "Ni podatkov o gorvodnih strežnikih",
|
||||
"number_of_dns_query_days": "Število obdelanih poizvedb DNS v zadnjem {{count}} dnevu",
|
||||
"number_of_dns_query_days_plural": "Število obdelanih poizvedb DNS v zadnjih {{count}} dneh",
|
||||
"number_of_dns_query_24_hours": "Število obdelanih poizvedb DNS v zadnjih 24 urah",
|
||||
|
@ -134,6 +139,7 @@
|
|||
"enforced_save_search": "Prisilno varno iskanje",
|
||||
"number_of_dns_query_to_safe_search": "Število zahtev DNS za iskalnike, za katere je bilo uveljavljeno varno iskanje",
|
||||
"average_processing_time": "Povprečni čas obdelave",
|
||||
"processing_time": "Čas obdelave",
|
||||
"average_processing_time_hint": "Povprečni čas v milisekundah pri obdelavi zahteve DNS",
|
||||
"block_domain_use_filters_and_hosts": "Onemogoči domene s filtri in gostiteljskimi datotekami",
|
||||
"filters_block_toggle_hint": "Pravila zaviranja lahko nastavite v nastavitvah <a>Filtri</a>.",
|
||||
|
@ -158,6 +164,7 @@
|
|||
"upstream_dns_configured_in_file": "Nastavljen v {{path}}",
|
||||
"test_upstream_btn": "Preizkusi upstreame",
|
||||
"upstreams": "Tokovi navzgor",
|
||||
"upstream": "Gorvodni strežnik",
|
||||
"apply_btn": "Uporabi",
|
||||
"disabled_filtering_toast": "Onemogočeno filtriranje",
|
||||
"enabled_filtering_toast": "Omogočeno filtriranje",
|
||||
|
@ -564,7 +571,7 @@
|
|||
"rewrite_A": ">A</0>: posebna vrednost, obdrži <0>A</0> zapise iz gorvodnega toka",
|
||||
"rewrite_AAAA": ">A</0>: posebna vrednost, obdrži <0>AAAA</0> zapise iz gorvodnega toka",
|
||||
"disable_ipv6": "Onemogoči reševanje naslovov IPv6",
|
||||
"disable_ipv6_desc": "Spusti vse poizvedbe DNS za naslove IPv6 (vnesite AAAA).",
|
||||
"disable_ipv6_desc": "Spustite vse poizvedbe DNS za naslove IPv6 (tip AAAA) in odstranite namige IPv6 iz odgovorov HTTPS.",
|
||||
"fastest_addr": "Najhitrejši IP naslov",
|
||||
"fastest_addr_desc": "Zahtevajte vse strežnike DNS in vrne najhitrejši naslov IP med vsemi odgovori. To upočasni zahteve DNS, saj mora AdGuard Home čakati na odgovore vseh strežnikov DNS, vendar izboljša splošno povezljivost.",
|
||||
"autofix_warning_text": "Če kliknete 'Popravi', bo AdGuardHome konfiguriral vaš sistem za uporabo strežnika AdGuardHome DNS.",
|
||||
|
@ -676,5 +683,37 @@
|
|||
"protection_section_label": "Zaščita",
|
||||
"log_and_stats_section_label": "Dnevnik poizvedb in statistika",
|
||||
"ignore_query_log": "Ignorirajte tega odjemalca v dnevniku poizvedb",
|
||||
"ignore_statistics": "Ignoriranje tega odjemalca v statistiki"
|
||||
"ignore_statistics": "Ignoriranje tega odjemalca v statistiki",
|
||||
"schedule_services": "Začasno ustavi onemogočanje storitve",
|
||||
"schedule_services_desc": "Nastavite rokovnik premora filtra za onemogočanje storitev",
|
||||
"schedule_services_desc_client": "Nastavite rokovnik premora filtra za onemogočanje storitev za tega odjemalca",
|
||||
"schedule_desc": "Nastavite obdobja nedejavnosti onemogočenih storitev",
|
||||
"schedule_invalid_select": "Začetni čas mora biti pred končnim časom",
|
||||
"schedule_select_days": "Izberite dneve",
|
||||
"schedule_timezone": "Izberite časovni pas",
|
||||
"schedule_current_timezone": "Trenutni časovni pas: {{value}}",
|
||||
"schedule_time_all_day": "Ves dan",
|
||||
"schedule_modal_description": "Ta rokovnik bo nadomestil vse obstoječe rokovnike za isti dan v tednu. Vsak dan v tednu ima lahko samo eno obdobje neaktivnosti.",
|
||||
"schedule_modal_time_off": "Brez onemogočanja storitve:",
|
||||
"schedule_new": "Nov rokovnik",
|
||||
"schedule_edit": "Uredi rokovnik",
|
||||
"schedule_save": "Shrani rokovnik",
|
||||
"schedule_add": "Dodaj rokovnik",
|
||||
"schedule_remove": "Odstrani rokovnik",
|
||||
"schedule_from": "Od",
|
||||
"schedule_to": "Do",
|
||||
"sunday": "Nedelja",
|
||||
"monday": "Ponedeljek",
|
||||
"tuesday": "Torek",
|
||||
"wednesday": "Sreda",
|
||||
"thursday": "Četrtek",
|
||||
"friday": "Petek",
|
||||
"saturday": "Sobota",
|
||||
"sunday_short": "Ned",
|
||||
"monday_short": "Pon",
|
||||
"tuesday_short": "Tor",
|
||||
"wednesday_short": "Sre",
|
||||
"thursday_short": "Čet",
|
||||
"friday_short": "Pet",
|
||||
"saturday_short": "Sob"
|
||||
}
|
||||
|
|
|
@ -7,12 +7,15 @@
|
|||
"load_balancing": "Load-balancing",
|
||||
"load_balancing_desc": "Koristi jedan upstream server. AdGuard Home koristi najnoviji nasumični algoritam da izabere server tako da se najbrži server češće koristi.",
|
||||
"bootstrap_dns": "Bootstrap DNS serveri",
|
||||
"bootstrap_dns_desc": "Bootstrap DNS serveri se koriste da reše IP adrese od DoH/DoT razrešivača koje ste odredili kao upstream.",
|
||||
"bootstrap_dns_desc": "IP adrese DNS servera koje se koriste za rešavanje IP adresa DoH/DoT razrešivača koje navodite kao uzvodne. Komentari nisu dozvoljeni.",
|
||||
"fallback_dns_title": "Odstupajući DNS serveri",
|
||||
"fallback_dns_desc": "Lista povratnih DNS servera koji se koriste kada se uzvodni DNS serveri ne odaziva. Sintaksa je ista kao u glavnom uzvodnom polju iznad.",
|
||||
"fallback_dns_placeholder": "Unesite jedan povratni DNS server po liniji",
|
||||
"local_ptr_title": "Private reverse DNS serveri",
|
||||
"local_ptr_desc": "DNS serveri koje AdGuard Home koristi za lokalne PTR upite. Ovi serveri se koriste za rešavanje imena domaćina klijenata sa privatnim IP adresama, na primer \"192.168.12.34\", koristeći obrnuti DNS. Ako nije podešen, AdGuard Home koristi adrese podrazumevanih DNS razrešivača vašeg OS-a osim adresa samog AdGuard Home-a.",
|
||||
"local_ptr_default_resolver": "Podrazumevano, AdGuard Home koristi sledeće obrnute DNS razrešivače: {{ip}}.",
|
||||
"local_ptr_no_default_resolver": "AdGuard Home ne može da odredi pogodne privatne obrnute DNS razrešivače za ovaj sistem.",
|
||||
"local_ptr_placeholder": "Unesite jednu adresu servera po redu",
|
||||
"local_ptr_placeholder": "Unesite jednu IP adresu servera po redu",
|
||||
"resolve_clients_title": "Uključi obrnuto razrešavanje klijentskih IP adresa",
|
||||
"resolve_clients_desc": "Obrnuto razrešite IP adrese klijenata u njihova imena domaćina slanjem PTR upita odgovarajućim razrešivačima (privatni DNS serveri za lokalne klijente, uzvodni serveri za klijente sa javnim IP adresama).",
|
||||
"use_private_ptr_resolvers_title": "Koristi privatne obrnute razrešivače",
|
||||
|
@ -125,6 +128,8 @@
|
|||
"top_clients": "Najčešći klijenti",
|
||||
"no_clients_found": "Nema pronađenih klijenata",
|
||||
"general_statistics": "Opšte statistike",
|
||||
"top_upstreams": "Često traženi upstream serveri",
|
||||
"no_upstreams_data_found": "Nema podataka o upstream serverima",
|
||||
"number_of_dns_query_days": "Broj obrađenih DNS unosa u poslednjih {{count}} dan",
|
||||
"number_of_dns_query_days_plural": "Broj obrađenih DNS unosa u poslednjih {{count}} dana",
|
||||
"number_of_dns_query_24_hours": "Broj obrađenih DNS unosa u poslednja 24 časa",
|
||||
|
@ -134,6 +139,7 @@
|
|||
"enforced_save_search": "Nametni sigurno pretraživanje",
|
||||
"number_of_dns_query_to_safe_search": "Broj DNS zahteva ka pretraživačima za koje je nametnuto sigurno pretraživanje",
|
||||
"average_processing_time": "Prosečno vreme obrade",
|
||||
"processing_time": "Vreme obrade",
|
||||
"average_processing_time_hint": "Prosečno vreme u milisekundama za obradu DNS zahteva",
|
||||
"block_domain_use_filters_and_hosts": "Blokiraj domene koristeći filtere i hosts datoteke",
|
||||
"filters_block_toggle_hint": "Možete postaviti pravila blokiranja u <a>Filters</a> postavkama.",
|
||||
|
@ -158,6 +164,7 @@
|
|||
"upstream_dns_configured_in_file": "Konfiguriši u {{path}}",
|
||||
"test_upstream_btn": "Testiraj upstreams",
|
||||
"upstreams": "Upstreams",
|
||||
"upstream": "Upstream-server",
|
||||
"apply_btn": "Primeni",
|
||||
"disabled_filtering_toast": "Isključeno filtriranje",
|
||||
"enabled_filtering_toast": "Uključeno filtriranje",
|
||||
|
@ -564,7 +571,7 @@
|
|||
"rewrite_A": "<0>A</0>: posebna vrednost, zadrži <0>A</0> records iz apstrima",
|
||||
"rewrite_AAAA": "<0>AAAA</0>: posebna vrednost, zadržite <0>AAAA</0> records iz apstrima",
|
||||
"disable_ipv6": "Onemogući rešavanje IPv6 adresa",
|
||||
"disable_ipv6_desc": "Otpustite sve DNS upite za IPv6 adrese (otkucajte AAAA).",
|
||||
"disable_ipv6_desc": "Ignorisanje svih DNS upite za IPv6 adrese (tip AAAA) i uklanjanje IPv6 podataka iz HTTPS odgovora.",
|
||||
"fastest_addr": "Najbrža IP adresa",
|
||||
"fastest_addr_desc": "Pretražuje sve DNS servere i vraća najbržu IP adresu među svim odgovorima. Ovo će usporiti DNS pretragu jer moramo da čekamo na odgovore od svih DNS servera, ali će poboljšati sveukupnu povezanost.",
|
||||
"autofix_warning_text": "Ako kliknete \"Popravi\", AdGuardHome će konfigurisati vaš sistem da koristi AdGuardHome DNS server.",
|
||||
|
@ -676,5 +683,37 @@
|
|||
"protection_section_label": "Zaštita",
|
||||
"log_and_stats_section_label": "Evidencija upita i statistika",
|
||||
"ignore_query_log": "Zanemari ovog klijenta u evidenciji upita",
|
||||
"ignore_statistics": "Zanemari ovog klijenta u statističkim podacima"
|
||||
"ignore_statistics": "Zanemari ovog klijenta u statističkim podacima",
|
||||
"schedule_services": "Pauziranje blokiranja usluge",
|
||||
"schedule_services_desc": "Konfigurisanje rasporeda pauziranja filtera za blokiranje usluga",
|
||||
"schedule_services_desc_client": "Konfigurišite raspored pauziranja filtera za blokiranje usluga za ovog klijenta",
|
||||
"schedule_desc": "Podešavanje perioda neaktivnosti za blokirane usluge",
|
||||
"schedule_invalid_select": "Vreme početka mora biti pre vremena završetka",
|
||||
"schedule_select_days": "Izaberite dane",
|
||||
"schedule_timezone": "Izaberite vremensku zonu",
|
||||
"schedule_current_timezone": "Trenutna vremenska zona: {{value}}",
|
||||
"schedule_time_all_day": "Ceo dan",
|
||||
"schedule_modal_description": "Ovaj raspored će zameniti sve postojeće rasporede za isti dan u sedmici. Svaki dan u sedmici može imati samo jedan period neaktivnosti.",
|
||||
"schedule_modal_time_off": "Nema blokiranja usluge:",
|
||||
"schedule_new": "Novi raspored",
|
||||
"schedule_edit": "Uredi raspored",
|
||||
"schedule_save": "Sačuvaj raspored",
|
||||
"schedule_add": "Dodaj raspored",
|
||||
"schedule_remove": "Ukloni raspored",
|
||||
"schedule_from": "Od",
|
||||
"schedule_to": "Do",
|
||||
"sunday": "Nedelja",
|
||||
"monday": "Ponedeljak",
|
||||
"tuesday": "Utorak",
|
||||
"wednesday": "Sreda",
|
||||
"thursday": "Četvrtak",
|
||||
"friday": "Petak",
|
||||
"saturday": "Subota",
|
||||
"sunday_short": "Ned",
|
||||
"monday_short": "Pon",
|
||||
"tuesday_short": "Uto",
|
||||
"wednesday_short": "Sre",
|
||||
"thursday_short": "Čet",
|
||||
"friday_short": "Pet",
|
||||
"saturday_short": "Sub"
|
||||
}
|
||||
|
|
|
@ -7,12 +7,15 @@
|
|||
"load_balancing": "Lastbalansering",
|
||||
"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_desc": "Bootstrap-DNS-servrar används för att slå upp DoH/DoT-resolvrarnas IP-adresser som du specificerat som uppström.",
|
||||
"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_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",
|
||||
"local_ptr_title": "Privata omvända DNS-servrar",
|
||||
"local_ptr_desc": "DNS servrarna som AdGuard Home använder för lokala PTR frågor. Dessa servrar används för att lösa värdnamnen på klienter med privata IP-adresser, till exempel \"192.168.12.34\", genom omvänd DNS. Om inga servrar angetts använder AdGuard Home adresserna till standard DNS servrar för ditt operativsystem förutom adresserna till AdGuard Home själv.",
|
||||
"local_ptr_default_resolver": "Som standard använder AdGuard Home följande omvända DNS upplösare: {{ip}}.",
|
||||
"local_ptr_no_default_resolver": "AdGuard Home kunde inte fastställa lämpliga privata omvända DNS upplösare för detta system.",
|
||||
"local_ptr_placeholder": "Ange en serveradress per rad",
|
||||
"local_ptr_placeholder": "Ange en IP-adress per rad",
|
||||
"resolve_clients_title": "Aktivera omvänd upplösning av klienters IP-adresser",
|
||||
"resolve_clients_desc": "Lös upp klienternas värdnamn med omvänt uppslag av klienternas IP-adresser genom att skicka PTR-frågor till motsvarande upplösare (privata DNS-servrar för lokala klienter, uppströmsservrar för klienter med offentliga IP-adresser).",
|
||||
"use_private_ptr_resolvers_title": "Använd privata omvända DNS upplösare",
|
||||
|
@ -125,6 +128,8 @@
|
|||
"top_clients": "Toppklienter",
|
||||
"no_clients_found": "Inga klienter hittade",
|
||||
"general_statistics": "Allmän statistik",
|
||||
"top_upstreams": "Topp uppströmsservrar",
|
||||
"no_upstreams_data_found": "Inga uppströmsdata hittades",
|
||||
"number_of_dns_query_days": "Antalet DNS-förfrågningar som utfördes under senaste {{count}} dagen",
|
||||
"number_of_dns_query_days_plural": "Ett antal DNS förfrågningar utfördes under de senaste {{count}} dagarna",
|
||||
"number_of_dns_query_24_hours": "Antalet DNS-förfrågningar som utfördes under de senaste 24 timmarna",
|
||||
|
@ -134,6 +139,7 @@
|
|||
"enforced_save_search": "Aktivering av Säker surf",
|
||||
"number_of_dns_query_to_safe_search": "Antalet DNS-förfrågningar mot sökmotorer där Säker surf tvingats",
|
||||
"average_processing_time": "Genomsnittlig processtid",
|
||||
"processing_time": "Bearbetningstid",
|
||||
"average_processing_time_hint": "Genomsnittlig processtid i millisekunder för DNS-förfrågning",
|
||||
"block_domain_use_filters_and_hosts": "Blockera domäner med filter- och värdfiler",
|
||||
"filters_block_toggle_hint": "Du kan ställa in egna blockerings regler i <a>Filterinställningar</a>.",
|
||||
|
@ -158,6 +164,7 @@
|
|||
"upstream_dns_configured_in_file": "Konfigurerad i {{path}}",
|
||||
"test_upstream_btn": "Testa uppströmmar",
|
||||
"upstreams": "Uppströms",
|
||||
"upstream": "Uppströms server",
|
||||
"apply_btn": "Tillämpa",
|
||||
"disabled_filtering_toast": "Filtrering bortkopplad",
|
||||
"enabled_filtering_toast": "Filtrering inkopplad",
|
||||
|
@ -290,6 +297,8 @@
|
|||
"rate_limit": "Förfrågnings gräns",
|
||||
"edns_enable": "Aktivera EDNS-klient subnät",
|
||||
"edns_cs_desc": "Skicka klienternas subnät till DNS servrarna.",
|
||||
"edns_use_custom_ip": "Använd anpassad IP för EDNS",
|
||||
"edns_use_custom_ip_desc": "Tillåt att använda anpassad IP för EDNS",
|
||||
"rate_limit_desc": "Antalet förfrågningar per sekund som tillåts per klient. Att sätta den till 0 innebär ingen gräns.",
|
||||
"blocking_ipv4_desc": "IP adress som ska returneras för en blockerad A förfrågan",
|
||||
"blocking_ipv6_desc": "IP adress som ska returneras för en blockerad AAAA förfrågan",
|
||||
|
@ -441,7 +450,7 @@
|
|||
"client_confirm_delete": "Är du säker på att du vill ta bort klient \"{{key}}\"?",
|
||||
"list_confirm_delete": "Är du säker på att du vill ta bort den här listan?",
|
||||
"auto_clients_title": "Klienter (körtid)",
|
||||
"auto_clients_desc": "Enheter som inte finns på listan över beständiga klienter som fortfarande kan använda AdGuard Home",
|
||||
"auto_clients_desc": "Information om IP-adresser för enheter som använder eller kan använda AdGuard Home. Denna information samlas in från flera källor, inklusive värdfiler, omvänd DNS, etc.",
|
||||
"access_title": "Åtkomstinställningar",
|
||||
"access_desc": "Här kan du konfigurera åtkomstregler för AdGuard Homes DNS-server",
|
||||
"access_allowed_title": "Tillåtna klienter",
|
||||
|
@ -525,7 +534,10 @@
|
|||
"statistics_retention_confirm": "Är du säker på att du vill ändra retentionstiden för statistik? Om du minskar intervallet kommer viss data att gå förlorad",
|
||||
"statistics_cleared": "Statistiken har rensats",
|
||||
"statistics_enable": "Aktivera statistik",
|
||||
"ignore_domains": "Ignorerade domäner (avgränsade med ny rad)",
|
||||
"ignore_domains_title": "Ignorerade domäner",
|
||||
"ignore_domains_desc_stats": "Förfrågningar för dessa domäner skrivs inte till statistiken",
|
||||
"ignore_domains_desc_query": "Förfrågningar för dessa domäner skrivs inte till frågeloggningen",
|
||||
"interval_hours": "{{count}} timme",
|
||||
"interval_hours_plural": "{{count}} timmar",
|
||||
"filters_configuration": "Filterinställningar",
|
||||
|
@ -558,7 +570,7 @@
|
|||
"rewrite_A": "<0>A</0>: specialvärde, behåll <0>A</0> poster från uppströms",
|
||||
"rewrite_AAAA": "<0>AAAA</0>: specialvärde, behåll <0>AAAA</0> poster från uppströms",
|
||||
"disable_ipv6": "Inaktivera upplösning av IPv6 adresser",
|
||||
"disable_ipv6_desc": "Kasta alla DNS-frågor för IPv6-adresser (typ AAAA).",
|
||||
"disable_ipv6_desc": "Släpp alla DNS-frågor för IPv6-adresser (typ AAAA) och ta bort IPv6-tips från HTTPS-svar.",
|
||||
"fastest_addr": "Snabbaste IP adressen",
|
||||
"fastest_addr_desc": "Fråga alla DNS servrar och returnera den snabbaste IP adressen bland alla svar. Detta saktar ner DNS-frågor eftersom AdGuard Home måste vänta på svar från alla DNS servrar, men förbättrar den övergripande anslutningen.",
|
||||
"autofix_warning_text": "Om du klickar på \"Fix\" kommer AdGuard Home att konfigurera ditt system för att använda AdGuard Home DNS server.",
|
||||
|
@ -646,6 +658,8 @@
|
|||
"confirm_dns_cache_clear": "Är du säker på att du vill rensa DNS-cache?",
|
||||
"cache_cleared": "DNS-cacheminnet har rensats",
|
||||
"clear_cache": "Rensa cache",
|
||||
"make_static": "Gör statisk",
|
||||
"theme_auto_desc": "Auto (baserat på färgschemat på din enhet)",
|
||||
"theme_dark_desc": "Mörkt tema",
|
||||
"theme_light_desc": "Ljust tema",
|
||||
"disable_for_seconds": "I {{count}} sekund",
|
||||
|
@ -654,5 +668,40 @@
|
|||
"disable_for_minutes_plural": "I {{count}} minuter",
|
||||
"disable_for_hours": "I {{count}} timme",
|
||||
"disable_for_hours_plural": "I {{count}} timmar",
|
||||
"disable_until_tomorrow": "Tills imorgon"
|
||||
"disable_until_tomorrow": "Tills imorgon",
|
||||
"protection_section_label": "Skydd",
|
||||
"log_and_stats_section_label": "Förfrågningslogg och statistik",
|
||||
"ignore_statistics": "Ignorera denna kund i statistiken",
|
||||
"schedule_services": "Pausa blockering av tjänst",
|
||||
"schedule_services_desc": "Konfigurera pausschemat för det tjänsteblockerande filtret",
|
||||
"schedule_services_desc_client": "Konfigurera pausschemat för det tjänsteblockerande filtret för den här klienten",
|
||||
"schedule_desc": "Ange inaktivitetsperioder för blockerade tjänster",
|
||||
"schedule_invalid_select": "Starttid måste vara före sluttid",
|
||||
"schedule_select_days": "Välj dagar",
|
||||
"schedule_timezone": "Välj en tidszon",
|
||||
"schedule_current_timezone": "Aktuell tidszon: {{value}}",
|
||||
"schedule_time_all_day": "Hela dagen",
|
||||
"schedule_modal_description": "Detta schema ersätter alla befintliga scheman för samma veckodag. Varje veckodag kan bara ha en inaktivitetsperiod.",
|
||||
"schedule_modal_time_off": "Ingen blockering av tjänster:",
|
||||
"schedule_new": "Nytt schema",
|
||||
"schedule_edit": "Redigera schema",
|
||||
"schedule_save": "Spara schema",
|
||||
"schedule_add": "Lägg till schema",
|
||||
"schedule_remove": "Ta bort schema",
|
||||
"schedule_from": "Från",
|
||||
"schedule_to": "Till",
|
||||
"sunday": "Söndag",
|
||||
"monday": "Måndag",
|
||||
"tuesday": "Tisdag",
|
||||
"wednesday": "Onsdag",
|
||||
"thursday": "Torsdag",
|
||||
"friday": "Fredag",
|
||||
"saturday": "Lördag",
|
||||
"sunday_short": "Sön",
|
||||
"monday_short": "Mån",
|
||||
"tuesday_short": "Tis",
|
||||
"wednesday_short": "Ons",
|
||||
"thursday_short": "Tor",
|
||||
"friday_short": "Fre",
|
||||
"saturday_short": "Lör"
|
||||
}
|
||||
|
|
|
@ -395,5 +395,12 @@
|
|||
"safe_search": "ค้นหาอย่างปลอดภัย",
|
||||
"blocklist": "บัญชีดำ",
|
||||
"filter_category_other": "อื่น ๆ",
|
||||
"parental_control": "ควบคุมโดยผู้ปกครอง"
|
||||
"parental_control": "ควบคุมโดยผู้ปกครอง",
|
||||
"sunday_short": "อาทิตย์",
|
||||
"monday_short": "จันทร์",
|
||||
"tuesday_short": "อังคาร",
|
||||
"wednesday_short": "พุธ",
|
||||
"thursday_short": "พฤหัส",
|
||||
"friday_short": "ศุกร์",
|
||||
"saturday_short": "เสาร์"
|
||||
}
|
||||
|
|
|
@ -7,12 +7,15 @@
|
|||
"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.",
|
||||
"bootstrap_dns": "DNS Önyükleme sunucuları",
|
||||
"bootstrap_dns_desc": "DNS Önyükleme sunucuları, belirttiğiniz üst sunucuların DoH/DoT çözümleyicilerine ait IP adreslerinin çözümlemek için kullanılır.",
|
||||
"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_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",
|
||||
"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_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_placeholder": "Her satıra bir sunucu 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_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",
|
||||
|
@ -125,6 +128,8 @@
|
|||
"top_clients": "Başlıca istemciler",
|
||||
"no_clients_found": "İstemci bulunamadı",
|
||||
"general_statistics": "Genel istatistikler",
|
||||
"top_upstreams": "Başlıca üst kaynaklar",
|
||||
"no_upstreams_data_found": "Üst kaynak verisi bulunamadı",
|
||||
"number_of_dns_query_days": "Son {{count}} gün boyunca işlenen DNS sorgularının sayısı",
|
||||
"number_of_dns_query_days_plural": "Son {{count}} gün boyunca işlenen DNS sorgularının sayısı",
|
||||
"number_of_dns_query_24_hours": "Son 24 saat içinde işlenen DNS sorgularının sayısı",
|
||||
|
@ -134,6 +139,7 @@
|
|||
"enforced_save_search": "Uygulanan güvenli arama",
|
||||
"number_of_dns_query_to_safe_search": "Güvenli Aramanın uygulandığı arama motorlarına gönderilen DNS isteklerinin sayısı",
|
||||
"average_processing_time": "Ortalama işlem süresi",
|
||||
"processing_time": "İş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",
|
||||
"filters_block_toggle_hint": "<a>Filtreler</a> ayarlarında engelleme kuralları oluşturabilirsiniz.",
|
||||
|
@ -158,6 +164,7 @@
|
|||
"upstream_dns_configured_in_file": "{{path}} dosyasında yapılandırıldı",
|
||||
"test_upstream_btn": "Üst sunucuyu test et",
|
||||
"upstreams": "Üst kaynak",
|
||||
"upstream": "Üst kaynak",
|
||||
"apply_btn": "Uygula",
|
||||
"disabled_filtering_toast": "Filtreleme devre dışı",
|
||||
"enabled_filtering_toast": "Filtreleme etkin",
|
||||
|
@ -564,7 +571,7 @@
|
|||
"rewrite_A": "<0>A</0>: özel değer, üst sunucudan gelen <0>A</0> kayıtlarını tutun",
|
||||
"rewrite_AAAA": "<0>AAA</0>: özel değer, üst sunucudan gelen <0>AAA</0> kayıtlarını tutun",
|
||||
"disable_ipv6": "IPv6 adreslerinin çözümlenmesini devre dışı bırak",
|
||||
"disable_ipv6_desc": "IPv6 adresleri için tüm DNS sorgularını yanıtsız bırakır (AAAA yazar).",
|
||||
"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_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.",
|
||||
"autofix_warning_text": "\"Düzelt\" seçeneğine tıklarsanız, AdGuard Home, sisteminizi AdGuard Home DNS sunucusunu kullanacak şekilde yapılandırır.",
|
||||
|
@ -676,5 +683,37 @@
|
|||
"protection_section_label": "Koruma",
|
||||
"log_and_stats_section_label": "Sorgu günlüğü ve istatistikler",
|
||||
"ignore_query_log": "Sorgu günlüğünde bu istemciyi yoksay",
|
||||
"ignore_statistics": "İstatistiklerde bu istemciyi yoksay"
|
||||
"ignore_statistics": "İstatistiklerde bu istemciyi yoksay",
|
||||
"schedule_services": "Hizmet engellemeyi duraklat",
|
||||
"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_desc": "Engellenen hizmetler için hareketsizlik sürelerini ayarlayın",
|
||||
"schedule_invalid_select": "Başlangıç zamanı, bitiş zamanından önce olmalıdır",
|
||||
"schedule_select_days": "Günleri seçin",
|
||||
"schedule_timezone": "Saat dilimi seçin",
|
||||
"schedule_current_timezone": "Şu anki saat dilimi: {{value}}",
|
||||
"schedule_time_all_day": "Tüm gün",
|
||||
"schedule_modal_description": "Bu plan, haftanın aynı günü için mevcut planların yerini alır. Haftanın her gününde yalnızca bir hareketsizlik süresine sahip olabilir.",
|
||||
"schedule_modal_time_off": "Hizmet engelleme yok:",
|
||||
"schedule_new": "Yeni plan",
|
||||
"schedule_edit": "Planı düzenle",
|
||||
"schedule_save": "Planı kaydet",
|
||||
"schedule_add": "Plan ekle",
|
||||
"schedule_remove": "Planı kaldır",
|
||||
"schedule_from": "Başlangıç",
|
||||
"schedule_to": "Bitiş",
|
||||
"sunday": "Pazar",
|
||||
"monday": "Pazartesi",
|
||||
"tuesday": "Salı",
|
||||
"wednesday": "Çarşamba",
|
||||
"thursday": "Perşembe",
|
||||
"friday": "Cuma",
|
||||
"saturday": "Cumartesi",
|
||||
"sunday_short": "Paz",
|
||||
"monday_short": "Pzt",
|
||||
"tuesday_short": "Sal",
|
||||
"wednesday_short": "Çar",
|
||||
"thursday_short": "Per",
|
||||
"friday_short": "Cum",
|
||||
"saturday_short": "Cmt"
|
||||
}
|
||||
|
|
|
@ -7,7 +7,10 @@
|
|||
"load_balancing": "Балансування навантаження",
|
||||
"load_balancing_desc": "Запитувати один сервер за раз. AdGuard Home використовуватиме зважений випадковий алгоритм для вибору сервера, щоб найшвидший сервер використовувався частіше.",
|
||||
"bootstrap_dns": "Bootstrap DNS-сервери",
|
||||
"bootstrap_dns_desc": "Bootstrap DNS-сервери використовуються для вирішення IP-адрес встановлених серверів DoH/DoT.",
|
||||
"bootstrap_dns_desc": "IP-адреси DNS-серверів, які використовуються для визначення IP-адрес DoH/DoT-розпізнавачів, які ви вказуєте як висхідні. Коментарі заборонені.",
|
||||
"fallback_dns_title": "Резервні DNS-сервери",
|
||||
"fallback_dns_desc": "Список резервних DNS-серверів, які використовуються, коли upstream DNS-сервери не відповідають. Синтаксис такий самий, як і в полі upstream сервера вище.",
|
||||
"fallback_dns_placeholder": "Вводьте один резервний DNS-сервер на рядок",
|
||||
"local_ptr_title": "Приватні сервери для зворотного DNS",
|
||||
"local_ptr_desc": "DNS-сервери, які AdGuard Home використовує для локальних PTR-запитів. Ці сервери використовуються для вирішення PTR-запитів для адрес у приватних мережах, наприклад, «192.168.12.34». Якщо список порожній, AdGuard Home буде усталено використовувати системний DNS-сервер.",
|
||||
"local_ptr_default_resolver": "Стандартно AdGuard Home користується такими зворотними DNS-вирішувачами: {{ip}}.",
|
||||
|
@ -125,6 +128,8 @@
|
|||
"top_clients": "Найактивніші клієнти",
|
||||
"no_clients_found": "Клієнтів не знайдено",
|
||||
"general_statistics": "Загальна статистика",
|
||||
"top_upstreams": "Часто запитувані upstream-сервери",
|
||||
"no_upstreams_data_found": "Немає даних про upstream-сервери",
|
||||
"number_of_dns_query_days": "Кількість DNS-запитів, оброблених за останні {{count}} дні",
|
||||
"number_of_dns_query_days_plural": "Кількість DNS-запитів, оброблених за останні {{count}} днів",
|
||||
"number_of_dns_query_24_hours": "Кількість DNS-запитів, оброблених за останні 24 години",
|
||||
|
@ -134,6 +139,7 @@
|
|||
"enforced_save_search": "Примусовий безпечний пошук",
|
||||
"number_of_dns_query_to_safe_search": "Кількість DNS-запитів до пошукових систем, для яких примусово застосований безпечний пошук",
|
||||
"average_processing_time": "Середній час обробки",
|
||||
"processing_time": "Час обробки",
|
||||
"average_processing_time_hint": "Середній час обробки DNS запиту в мілісекундах",
|
||||
"block_domain_use_filters_and_hosts": "Блокування доменів за допомогою фільтрів та hosts-файлів",
|
||||
"filters_block_toggle_hint": "Ви можете налаштувати правила блокування в розділі <a>Фільтри</a>.",
|
||||
|
@ -158,6 +164,7 @@
|
|||
"upstream_dns_configured_in_file": "Налаштовано в {{path}}",
|
||||
"test_upstream_btn": "Перевірити сервери",
|
||||
"upstreams": "Upstreams",
|
||||
"upstream": "Upstream-сервер",
|
||||
"apply_btn": "Застосувати",
|
||||
"disabled_filtering_toast": "Фільтрування вимкнено",
|
||||
"enabled_filtering_toast": "Фільтрування увімкнено",
|
||||
|
@ -564,7 +571,7 @@
|
|||
"rewrite_A": "<0>A</0>: спеціальне значення, зберігайте <0>A</0> записи із вищого сервера",
|
||||
"rewrite_AAAA": "<0>AAAA</0>: спеціальне значення, зберігайте <0>AAAA</0> записи із вищого сервера",
|
||||
"disable_ipv6": "Вимкнути вирішення IPv6-адрес",
|
||||
"disable_ipv6_desc": "Ігнорувати DNS-запити для IPv6-адрес (тип AAAA).",
|
||||
"disable_ipv6_desc": "Ігнорувати всі DNS-запити адрес IPv6 (тип AAAA) та видаляти IPv6-дані з відповідей типу HTTPS.",
|
||||
"fastest_addr": "Найшвидша IP-адреса",
|
||||
"fastest_addr_desc": "Опитати всі DNS-сервери й повернути найшвидшу IP-адресу серед усіх наданих. Це сповільнить швидкість DNS-запитів, оскільки AdGuard Home повинен буде чекати відповіді усіх DNS-серверів, але водночас може покращити якість з'єднання.",
|
||||
"autofix_warning_text": "Якщо ви натиснете «Виправити», AdGuard Home налаштує вашу систему на використання DNS-сервера AdGuard Home.",
|
||||
|
@ -676,5 +683,37 @@
|
|||
"protection_section_label": "Захист",
|
||||
"log_and_stats_section_label": "Журнал запитів і статистика",
|
||||
"ignore_query_log": "Ігнорувати цей клієнт у журналі запитів",
|
||||
"ignore_statistics": "Ігноруйте цей клієнт в статистиці"
|
||||
"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": "ПН",
|
||||
"tuesday_short": "ВТ",
|
||||
"wednesday_short": "СР",
|
||||
"thursday_short": "ЧТ",
|
||||
"friday_short": "ПТ",
|
||||
"saturday_short": "СБ"
|
||||
}
|
||||
|
|
|
@ -7,12 +7,15 @@
|
|||
"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.",
|
||||
"bootstrap_dns": "Máy chủ DNS Bootstrap",
|
||||
"bootstrap_dns_desc": "Máy chủ DNS Bootstrap được sử dụng để phân giải địa chỉ IP của bộ phân giải DoH/DoT mà bạn chỉ định là ngược tuyến.",
|
||||
"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_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",
|
||||
"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_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_placeholder": "Nhập một địa chỉ máy chủ 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_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ư",
|
||||
|
@ -125,6 +128,8 @@
|
|||
"top_clients": "Người dùng hàng đầu",
|
||||
"no_clients_found": "Không có người dùng",
|
||||
"general_statistics": "Thống kê chung",
|
||||
"top_upstreams": "Máy chủ thượng nguồn hàng đầu",
|
||||
"no_upstreams_data_found": "Không tìm thấy dữ liệu máy chủ ngược dòng",
|
||||
"number_of_dns_query_days": "Một số truy vấn DNS được xử lý trong {{count}} ngày qua",
|
||||
"number_of_dns_query_days_plural": "Một số truy vấn DNS được xử lý trong {{count}} ngày qua",
|
||||
"number_of_dns_query_24_hours": "Số yêu cầu DNS đã xử lý trong 24 giờ qua",
|
||||
|
@ -134,6 +139,7 @@
|
|||
"enforced_save_search": "Bắt buộc tìm kiếm an toàn",
|
||||
"number_of_dns_query_to_safe_search": "Số yêu cầu DNS tới công cụ tìm kiếm đã chuyển thành tìm kiếm an toàn",
|
||||
"average_processing_time": "Thời gian xử lý trung bình",
|
||||
"processing_time": "Thời gian xử lý",
|
||||
"average_processing_time_hint": "Thời gian trung bình cho một yêu cầu DNS tính bằng mili giây",
|
||||
"block_domain_use_filters_and_hosts": "Chặn tên miền sử dụng các bộ lọc và file hosts",
|
||||
"filters_block_toggle_hint": "Bạn có thể thiết lập quy tắc chặn tại cài đặt <a>Bộ lọc</a>.",
|
||||
|
@ -158,6 +164,7 @@
|
|||
"upstream_dns_configured_in_file": "Cấu hình tại {{path}}",
|
||||
"test_upstream_btn": "Kiểm tra",
|
||||
"upstreams": "Nguồn",
|
||||
"upstream": "Máy chủ thượng nguồn",
|
||||
"apply_btn": "Áp dụng",
|
||||
"disabled_filtering_toast": "Đã tắt chặn quảng cáo",
|
||||
"enabled_filtering_toast": "Đã bật chặn quảng cáo",
|
||||
|
@ -564,7 +571,7 @@
|
|||
"rewrite_A": "<0>A</0>: giá trị đặc biệt, giữ bản ghi <0>A</0> từ nguồn",
|
||||
"rewrite_AAAA": "<0>A</0>: giá trị đặc biệt, giữ bản ghi <0>A</0> từ nguồn",
|
||||
"disable_ipv6": "Tắt IPv6",
|
||||
"disable_ipv6_desc": "Nếu tính năng này được bật, tất cả các truy vấn DNS cho địa chỉ IPv6 (loại AAAA) sẽ bị loại bỏ.",
|
||||
"disable_ipv6_desc": "Bỏ tất cả truy vấn DNS cho địa chỉ IPv6 (loại AAAA) và xóa gợi ý IPv6 khỏi phản hồi HTTPS.",
|
||||
"fastest_addr": "Địa chỉ IP nhanh nhất",
|
||||
"fastest_addr_desc": "Truy vấn tất cả các máy chủ DNS và trả về địa chỉ IP nhanh nhất trong số tất cả các phản hồi",
|
||||
"autofix_warning_text": "Nếu bạn nhấp vào \"Khắc phục\", AdGuard Home sẽ định cấu hình hệ thống của bạn để sử dụng máy chủ DNS của AdGuard Home.",
|
||||
|
@ -676,5 +683,37 @@
|
|||
"protection_section_label": "Sự bảo vệ",
|
||||
"log_and_stats_section_label": "Nhật ký truy vấn và thống kê",
|
||||
"ignore_query_log": "Bỏ qua máy khách này trong nhật ký truy vấn",
|
||||
"ignore_statistics": "Bỏ qua máy khách này trong thống kê"
|
||||
"ignore_statistics": "Bỏ qua máy khách này trong thống kê",
|
||||
"schedule_services": "Tạm dừng chặn dịch vụ",
|
||||
"schedule_services_desc": "Định cấu hình lịch tạm dừng của bộ lọc chặn dịch vụ",
|
||||
"schedule_services_desc_client": "Định cấu hình lịch tạm dừng của bộ lọc chặn dịch vụ cho máy khách này",
|
||||
"schedule_desc": "Đặt khoảng thời gian không hoạt động cho các dịch vụ bị chặn",
|
||||
"schedule_invalid_select": "Thời gian bắt đầu phải trước thời gian kết thúc",
|
||||
"schedule_select_days": "Chọn ngày",
|
||||
"schedule_timezone": "Chọn múi giờ",
|
||||
"schedule_current_timezone": "Múi giờ hiện tại: {{value}}",
|
||||
"schedule_time_all_day": "Cả ngày",
|
||||
"schedule_modal_description": "Lịch trình này sẽ thay thế mọi lịch trình hiện có cho cùng một ngày trong tuần. Mỗi ngày trong tuần chỉ có thể có một khoảng thời gian không hoạt động.",
|
||||
"schedule_modal_time_off": "Chặn dịch vụ bị vô hiệu hóa:",
|
||||
"schedule_new": "Kế hoạch mới",
|
||||
"schedule_edit": "Chỉnh sửa lịch trình",
|
||||
"schedule_save": "Lưu lịch trình",
|
||||
"schedule_add": "Thêm lịch trình",
|
||||
"schedule_remove": "Xóa lịch biểu",
|
||||
"schedule_from": "Từ",
|
||||
"schedule_to": "Đến",
|
||||
"sunday": "Chủ nhật",
|
||||
"monday": "Thứ hai",
|
||||
"tuesday": "Thứ ba",
|
||||
"wednesday": "Thứ Tư",
|
||||
"thursday": "Thứ năm",
|
||||
"friday": "Thứ sáu",
|
||||
"saturday": "Thứ bảy",
|
||||
"sunday_short": "Chủ nhật",
|
||||
"monday_short": "Thứ 2",
|
||||
"tuesday_short": "Thứ 3",
|
||||
"wednesday_short": "Thứ 4",
|
||||
"thursday_short": "Thứ 5",
|
||||
"friday_short": "Thứ 6",
|
||||
"saturday_short": "Thứ 7"
|
||||
}
|
||||
|
|
|
@ -7,12 +7,15 @@
|
|||
"load_balancing": "负载均衡",
|
||||
"load_balancing_desc": "一次查询一台服务器。AdGuard Home 将使用加权随机算法来选择服务器,以便更常使用最快的服务器。",
|
||||
"bootstrap_dns": "Bootstrap DNS 服务器",
|
||||
"bootstrap_dns_desc": "Bootstrap DNS 服务器用于解析您指定为上游的 DoH / DoT 解析器的 IP 地址。",
|
||||
"bootstrap_dns_desc": "DNS 服务器的 IP 地址,用于解析指定为上游的 DoH/DoT 解析器的 IP 地址。不允许评论。",
|
||||
"fallback_dns_title": "后备 DNS 服务器",
|
||||
"fallback_dns_desc": "当上游 DNS 服务器没有响应时使用的后备 DNS 服务器列表。语法与上面的主要上游字段相同。",
|
||||
"fallback_dns_placeholder": "每行输入一个后备 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_default_resolver": "AdGuard Home 默认使用下列反向 DNS 解析器: {{ip}}",
|
||||
"local_ptr_no_default_resolver": "AdGuard Home 无法为这个系统确定合适的私人反向 DNS 解析器。",
|
||||
"local_ptr_placeholder": "每行输入一个服务器地址",
|
||||
"local_ptr_placeholder": "每行输入一个 IP 地址",
|
||||
"resolve_clients_title": "启用客户端的 IP 地址的反向解析",
|
||||
"resolve_clients_desc": "通过发送 PTR 查询到对应的解析器 (本地客户端的私人 DNS 服务器,公共 IP 客户端的上游服务器) 将 IP 地址反向解析成其客户端主机名。",
|
||||
"use_private_ptr_resolvers_title": "使用私人反向 DNS 解析器",
|
||||
|
@ -125,6 +128,8 @@
|
|||
"top_clients": "客户端排行",
|
||||
"no_clients_found": "未找到客户端",
|
||||
"general_statistics": "概况统计",
|
||||
"top_upstreams": "经常请求的上游服务器",
|
||||
"no_upstreams_data_found": "未找到上游服务器数据",
|
||||
"number_of_dns_query_days": "过去 {{count}} 天内处理的 DNS 查询总数",
|
||||
"number_of_dns_query_days_plural": "在过去的 {{count}} 天内处理了多少个 DNS 查询",
|
||||
"number_of_dns_query_24_hours": "过去 24 小时内处理的 DNS 请求总数",
|
||||
|
@ -134,6 +139,7 @@
|
|||
"enforced_save_search": "强制安全搜索",
|
||||
"number_of_dns_query_to_safe_search": "启用强制安全搜索后对搜索引擎的 DNS 请求总数",
|
||||
"average_processing_time": "平均处理时间",
|
||||
"processing_time": "处理时间",
|
||||
"average_processing_time_hint": "处理 DNS 请求的平均时间(毫秒)",
|
||||
"block_domain_use_filters_and_hosts": "使用过滤器和 Hosts 文件以拦截指定域名",
|
||||
"filters_block_toggle_hint": "你可以在 <a>过滤器</a> 设置中添加过滤规则。",
|
||||
|
@ -158,6 +164,7 @@
|
|||
"upstream_dns_configured_in_file": "配置路径{{path}}",
|
||||
"test_upstream_btn": "测试上游 DNS",
|
||||
"upstreams": "上游服务器",
|
||||
"upstream": "上游服务器",
|
||||
"apply_btn": "应用",
|
||||
"disabled_filtering_toast": "过滤器已禁用",
|
||||
"enabled_filtering_toast": "过滤器已启用",
|
||||
|
@ -564,7 +571,7 @@
|
|||
"rewrite_A": "<0>A</0>:特殊值,保持来自上游的<0>A</0>记录",
|
||||
"rewrite_AAAA": "<0>AAAA</0>:特殊值,保持来自上游的<0>AAAA</0>记录",
|
||||
"disable_ipv6": "禁用 IPv6 地址的解析",
|
||||
"disable_ipv6_desc": "丢弃所有 IPv6 地址 (AAAA) 的 DNS 查询。",
|
||||
"disable_ipv6_desc": "删除对 IPv6 地址(类型 AAAA)的所有 DNS 查询,并从 HTTPS 响应中删除 IPv6 提示。",
|
||||
"fastest_addr": "最快的 IP 地址",
|
||||
"fastest_addr_desc": "查询所有 DNS 服务器并返回所有响应中速度最快的 IP 地址。因 AdGuard Home 必须等待全部 DNS 服务器均有所回应,因而会降低 DNS 查询的速度,但同时,此举将会改善总体的连接。",
|
||||
"autofix_warning_text": "若您单击「修复」,AdGuardHome 将会配置您的系统以使用 AdGuardHome 的 DNS 服务器。",
|
||||
|
@ -676,5 +683,37 @@
|
|||
"protection_section_label": "防护",
|
||||
"log_and_stats_section_label": "查询日志和统计数据",
|
||||
"ignore_query_log": "在查询日志中忽略此客户端",
|
||||
"ignore_statistics": "在统计数据中忽略此客户端"
|
||||
"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": "周一",
|
||||
"tuesday_short": "周二",
|
||||
"wednesday_short": "周三",
|
||||
"thursday_short": "周四",
|
||||
"friday_short": "周五",
|
||||
"saturday_short": "周六"
|
||||
}
|
||||
|
|
|
@ -648,5 +648,12 @@
|
|||
"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": "暫停防護 {{count}} 小時",
|
||||
"sunday_short": "週日",
|
||||
"monday_short": "週一",
|
||||
"tuesday_short": "週二",
|
||||
"wednesday_short": "週三",
|
||||
"thursday_short": "週四",
|
||||
"friday_short": "週五",
|
||||
"saturday_short": "週六"
|
||||
}
|
||||
|
|
|
@ -7,12 +7,15 @@
|
|||
"load_balancing": "負載平衡",
|
||||
"load_balancing_desc": "每次查詢一個上游伺服器。AdGuard Home 使用它的加權隨機的演算法來選擇伺服器,以便最快的伺服器被更常使用。",
|
||||
"bootstrap_dns": "自我啟動(Bootstrap)DNS 伺服器",
|
||||
"bootstrap_dns_desc": "自我啟動(Bootstrap)DNS 伺服器被用於解析您明確指定作為上游的 DoH/DoT 解析器之 IP 位址。",
|
||||
"bootstrap_dns_desc": "DNS 伺服器的 IP 位址,用於解析您指定為上游伺服器的 DoH/DoT 解析器的 IP 位址。不允許註釋。",
|
||||
"fallback_dns_title": "備援 DNS 伺服器",
|
||||
"fallback_dns_desc": "當上游 DNS 伺服器未回應時使用的備援 DNS 伺服器清單。語法與上面的主要上游欄位相同。",
|
||||
"fallback_dns_placeholder": "每行輸入一個備援 DNS 伺服器",
|
||||
"local_ptr_title": "私人反向的 DNS 伺服器",
|
||||
"local_ptr_desc": "AdGuard Home 用於區域指標(PTR)查詢之 DNS 伺服器。這些伺服器被用於解析有關在私人 IP 範圍的位址之區域指標查詢,例如,\"192.168.12.34\",使用反向的 DNS。如果未被設定,AdGuard Home 使用您的作業系統之預設 DNS 解析器的位址。",
|
||||
"local_ptr_default_resolver": "預設下,AdGuard Home 使用以下反向的 DNS 解析器:{{ip}}。",
|
||||
"local_ptr_no_default_resolver": "AdGuard Home 無法為此系統決定合適的私人反向的 DNS 解析器。",
|
||||
"local_ptr_placeholder": "每行輸入一個伺服器位址",
|
||||
"local_ptr_placeholder": "每行輸入一個 IP 位址",
|
||||
"resolve_clients_title": "啟用用戶端的 IP 位址之反向的解析",
|
||||
"resolve_clients_desc": "透過傳送指標(PTR)查詢到對應的解析器(私人 DNS 伺服器供區域的用戶端,上游的伺服器供有公共 IP 位址的用戶端),反向地解析用戶端的 IP 位址變為它們的主機名稱。",
|
||||
"use_private_ptr_resolvers_title": "使用私人反向的 DNS 解析器",
|
||||
|
@ -125,6 +128,8 @@
|
|||
"top_clients": "熱門用戶端",
|
||||
"no_clients_found": "無已發現之用戶端",
|
||||
"general_statistics": "一般的統計資料",
|
||||
"top_upstreams": "經常請求的上游伺服器",
|
||||
"no_upstreams_data_found": "找不到上游伺服器資料",
|
||||
"number_of_dns_query_days": "在最近的 {{count}} 日內已處理的 DNS 查詢之數量",
|
||||
"number_of_dns_query_days_plural": "在最近的 {{count}} 日內已處理的 DNS 查詢之數量",
|
||||
"number_of_dns_query_24_hours": "在最近的 24 小時內已處理的 DNS 查詢之數量",
|
||||
|
@ -134,6 +139,7 @@
|
|||
"enforced_save_search": "已強制執行的安全搜尋",
|
||||
"number_of_dns_query_to_safe_search": "安全搜尋已被強制執行之屬於搜尋引擎的 DNS 請求之數量",
|
||||
"average_processing_time": "平均的處理時間",
|
||||
"processing_time": "處理時間",
|
||||
"average_processing_time_hint": "在處理一項 DNS 請求時以毫秒(ms)計的平均時間",
|
||||
"block_domain_use_filters_and_hosts": "透過過濾器和主機檔案封鎖網域",
|
||||
"filters_block_toggle_hint": "您可在<a>過濾器</a>設定中設置封鎖規則。",
|
||||
|
@ -158,6 +164,7 @@
|
|||
"upstream_dns_configured_in_file": "被配置在 {{path}}",
|
||||
"test_upstream_btn": "測試上行資料流",
|
||||
"upstreams": "上游",
|
||||
"upstream": "上游伺服器",
|
||||
"apply_btn": "套用",
|
||||
"disabled_filtering_toast": "已禁用過濾",
|
||||
"enabled_filtering_toast": "已啟用過濾",
|
||||
|
@ -564,7 +571,7 @@
|
|||
"rewrite_A": "<0>A</0>:特殊的數值,阻止 <0>A</0> 記錄免於該上游",
|
||||
"rewrite_AAAA": "<0>AAAA</0>:特殊的數值,阻止 <0>AAAA</0> 記錄免於該上游",
|
||||
"disable_ipv6": "禁用 IPv6 位址之解析",
|
||||
"disable_ipv6_desc": "丟棄所有對於 IPv6 位址(類型 AAAA)的 DNS 查詢。",
|
||||
"disable_ipv6_desc": "停止所有對於 IPv6 位址(類型 AAAA)的 DNS 查詢,並從 HTTPS 回應中移除 IPv6 的提示。",
|
||||
"fastest_addr": "最快的 IP 位址",
|
||||
"fastest_addr_desc": "查詢所有的 DNS 伺服器並返回在所有的回應之中最快的 IP 位址。因為 AdGuard Home 必須等待來自所有的 DNS 伺服器之回應,這使 DNS 查詢變慢,但改善總體的連線。",
|
||||
"autofix_warning_text": "如果您點擊\"修復\",AdGuard Home 將配置您的系統使用 AdGuard Home DNS 伺服器。",
|
||||
|
@ -676,5 +683,37 @@
|
|||
"protection_section_label": "防護",
|
||||
"log_and_stats_section_label": "查詢記錄和統計資料",
|
||||
"ignore_query_log": "在查詢記錄中忽略此用戶端",
|
||||
"ignore_statistics": "在統計資料中忽略此用戶端"
|
||||
"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": "週一",
|
||||
"tuesday_short": "週二",
|
||||
"wednesday_short": "週三",
|
||||
"thursday_short": "週四",
|
||||
"friday_short": "週五",
|
||||
"saturday_short": "週六"
|
||||
}
|
||||
|
|
|
@ -50,6 +50,10 @@ export const setDnsConfig = (config) => async (dispatch) => {
|
|||
data.bootstrap_dns = splitByNewLine(config.bootstrap_dns);
|
||||
hasDnsSettings = true;
|
||||
}
|
||||
if (Object.prototype.hasOwnProperty.call(data, 'fallback_dns')) {
|
||||
data.fallback_dns = splitByNewLine(config.fallback_dns);
|
||||
hasDnsSettings = true;
|
||||
}
|
||||
if (Object.prototype.hasOwnProperty.call(data, 'local_ptr_upstreams')) {
|
||||
data.local_ptr_upstreams = splitByNewLine(config.local_ptr_upstreams);
|
||||
hasDnsSettings = true;
|
||||
|
|
|
@ -343,7 +343,12 @@ export const testUpstreamFailure = createAction('TEST_UPSTREAM_FAILURE');
|
|||
export const testUpstreamSuccess = createAction('TEST_UPSTREAM_SUCCESS');
|
||||
|
||||
export const testUpstream = (
|
||||
{ bootstrap_dns, upstream_dns, local_ptr_upstreams }, upstream_dns_file,
|
||||
{
|
||||
bootstrap_dns,
|
||||
upstream_dns,
|
||||
local_ptr_upstreams,
|
||||
fallback_dns,
|
||||
}, upstream_dns_file,
|
||||
) => async (dispatch) => {
|
||||
dispatch(testUpstreamRequest());
|
||||
try {
|
||||
|
@ -352,6 +357,7 @@ export const testUpstream = (
|
|||
const config = {
|
||||
bootstrap_dns: splitByNewLine(bootstrap_dns),
|
||||
private_upstream: splitByNewLine(local_ptr_upstreams),
|
||||
fallback_dns: splitByNewLine(fallback_dns),
|
||||
...(upstream_dns_file ? null : {
|
||||
upstream_dns: removeComments(upstream_dns),
|
||||
}),
|
||||
|
@ -386,12 +392,14 @@ export const testUpstreamWithFormValues = () => async (dispatch, getState) => {
|
|||
bootstrap_dns,
|
||||
upstream_dns,
|
||||
local_ptr_upstreams,
|
||||
fallback_dns,
|
||||
} = getState().form[FORM_NAME.UPSTREAM].values;
|
||||
|
||||
return dispatch(testUpstream({
|
||||
bootstrap_dns,
|
||||
upstream_dns,
|
||||
local_ptr_upstreams,
|
||||
fallback_dns,
|
||||
}, upstream_dns_file));
|
||||
};
|
||||
|
||||
|
|
|
@ -32,19 +32,19 @@ export const getAllBlockedServices = () => async (dispatch) => {
|
|||
}
|
||||
};
|
||||
|
||||
export const setBlockedServicesRequest = createAction('SET_BLOCKED_SERVICES_REQUEST');
|
||||
export const setBlockedServicesFailure = createAction('SET_BLOCKED_SERVICES_FAILURE');
|
||||
export const setBlockedServicesSuccess = createAction('SET_BLOCKED_SERVICES_SUCCESS');
|
||||
export const updateBlockedServicesRequest = createAction('UPDATE_BLOCKED_SERVICES_REQUEST');
|
||||
export const updateBlockedServicesFailure = createAction('UPDATE_BLOCKED_SERVICES_FAILURE');
|
||||
export const updateBlockedServicesSuccess = createAction('UPDATE_BLOCKED_SERVICES_SUCCESS');
|
||||
|
||||
export const setBlockedServices = (values) => async (dispatch) => {
|
||||
dispatch(setBlockedServicesRequest());
|
||||
export const updateBlockedServices = (values) => async (dispatch) => {
|
||||
dispatch(updateBlockedServicesRequest());
|
||||
try {
|
||||
await apiClient.setBlockedServices(values);
|
||||
dispatch(setBlockedServicesSuccess());
|
||||
await apiClient.updateBlockedServices(values);
|
||||
dispatch(updateBlockedServicesSuccess());
|
||||
dispatch(getBlockedServices());
|
||||
dispatch(addSuccessToast('blocked_services_saved'));
|
||||
} catch (error) {
|
||||
dispatch(addErrorToast({ error }));
|
||||
dispatch(setBlockedServicesFailure());
|
||||
dispatch(updateBlockedServicesFailure());
|
||||
}
|
||||
};
|
||||
|
|
|
@ -56,6 +56,8 @@ export const getStats = () => async (dispatch) => {
|
|||
top_clients: topClientsWithInfo,
|
||||
top_queried_domains: normalizeTopStats(stats.top_queried_domains),
|
||||
avg_processing_time: secondsToMilliseconds(stats.avg_processing_time),
|
||||
top_upstreams_responses: normalizeTopStats(stats.top_upstreams_responses),
|
||||
top_upstrems_avg_time: normalizeTopStats(stats.top_upstreams_avg_time),
|
||||
};
|
||||
|
||||
dispatch(getStatsSuccess(normalizedStats));
|
||||
|
|
|
@ -489,9 +489,9 @@ class Api {
|
|||
}
|
||||
|
||||
// Blocked services
|
||||
BLOCKED_SERVICES_LIST = { path: 'blocked_services/list', method: 'GET' };
|
||||
BLOCKED_SERVICES_GET = { path: 'blocked_services/get', method: 'GET' };
|
||||
|
||||
BLOCKED_SERVICES_SET = { path: 'blocked_services/set', method: 'POST' };
|
||||
BLOCKED_SERVICES_UPDATE = { path: 'blocked_services/update', method: 'PUT' };
|
||||
|
||||
BLOCKED_SERVICES_ALL = { path: 'blocked_services/all', method: 'GET' };
|
||||
|
||||
|
@ -501,12 +501,12 @@ class Api {
|
|||
}
|
||||
|
||||
getBlockedServices() {
|
||||
const { path, method } = this.BLOCKED_SERVICES_LIST;
|
||||
const { path, method } = this.BLOCKED_SERVICES_GET;
|
||||
return this.makeRequest(path, method);
|
||||
}
|
||||
|
||||
setBlockedServices(config) {
|
||||
const { path, method } = this.BLOCKED_SERVICES_SET;
|
||||
updateBlockedServices(config) {
|
||||
const { path, method } = this.BLOCKED_SERVICES_UPDATE;
|
||||
const parameters = {
|
||||
data: config,
|
||||
};
|
||||
|
|
|
@ -89,18 +89,18 @@ body {
|
|||
}
|
||||
|
||||
.container--wrap {
|
||||
min-height: calc(100vh - 160px);
|
||||
min-height: calc(100vh - 372px);
|
||||
}
|
||||
|
||||
@media screen and (min-width: 768px) {
|
||||
.container--wrap {
|
||||
min-height: calc(100vh - 168px);
|
||||
}
|
||||
}
|
||||
|
||||
@media screen and (min-width: 992px) {
|
||||
.container--wrap {
|
||||
min-height: calc(100vh - 117px);
|
||||
}
|
||||
}
|
||||
|
||||
@media screen and (max-width: 992px) {
|
||||
.container--wrap {
|
||||
min-height: calc(100vh);
|
||||
min-height: calc(100vh - 187px);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -192,7 +192,7 @@ const App = () => {
|
|||
<LoadingBar className="loading-bar" updateTime={1000} />
|
||||
<Header />
|
||||
<ProtectionTimer />
|
||||
<div className="container container--wrap pb-5">
|
||||
<div className="container container--wrap pb-5 pt-5">
|
||||
{processing && <Loading />}
|
||||
{!isCoreRunning && <div className="row row-cards">
|
||||
<div className="col-lg-12">
|
||||
|
|
79
client/src/components/Dashboard/UpstreamAvgTime.js
Normal file
79
client/src/components/Dashboard/UpstreamAvgTime.js
Normal file
|
@ -0,0 +1,79 @@
|
|||
import React from 'react';
|
||||
import ReactTable from 'react-table';
|
||||
import PropTypes from 'prop-types';
|
||||
import round from 'lodash/round';
|
||||
import { withTranslation, Trans } from 'react-i18next';
|
||||
|
||||
import Card from '../ui/Card';
|
||||
import DomainCell from './DomainCell';
|
||||
|
||||
const TimeCell = ({ value }) => {
|
||||
if (!value) {
|
||||
return '–';
|
||||
}
|
||||
|
||||
const valueInMilliseconds = round(value * 1000);
|
||||
|
||||
return (
|
||||
<div className="logs__row o-hidden">
|
||||
<span className="logs__text logs__text--full" title={valueInMilliseconds}>
|
||||
{valueInMilliseconds} ms
|
||||
</span>
|
||||
</div>
|
||||
);
|
||||
};
|
||||
|
||||
TimeCell.propTypes = {
|
||||
value: PropTypes.oneOfType([
|
||||
PropTypes.string,
|
||||
PropTypes.number,
|
||||
]),
|
||||
};
|
||||
|
||||
const UpstreamAvgTime = ({
|
||||
t,
|
||||
refreshButton,
|
||||
topUpstreamsAvgTime,
|
||||
subtitle,
|
||||
}) => (
|
||||
<Card
|
||||
title={t('average_processing_time')}
|
||||
subtitle={subtitle}
|
||||
bodyType="card-table"
|
||||
refresh={refreshButton}
|
||||
>
|
||||
<ReactTable
|
||||
data={topUpstreamsAvgTime.map(({ name: domain, count }) => ({
|
||||
domain,
|
||||
count,
|
||||
}))}
|
||||
columns={[
|
||||
{
|
||||
Header: <Trans>upstream</Trans>,
|
||||
accessor: 'domain',
|
||||
Cell: DomainCell,
|
||||
},
|
||||
{
|
||||
Header: <Trans>processing_time</Trans>,
|
||||
accessor: 'count',
|
||||
maxWidth: 190,
|
||||
Cell: TimeCell,
|
||||
},
|
||||
]}
|
||||
showPagination={false}
|
||||
noDataText={t('no_upstreams_data_found')}
|
||||
minRows={6}
|
||||
defaultPageSize={100}
|
||||
className="-highlight card-table-overflow--limited stats__table"
|
||||
/>
|
||||
</Card>
|
||||
);
|
||||
|
||||
UpstreamAvgTime.propTypes = {
|
||||
topUpstreamsAvgTime: PropTypes.array.isRequired,
|
||||
refreshButton: PropTypes.node.isRequired,
|
||||
subtitle: PropTypes.string.isRequired,
|
||||
t: PropTypes.func.isRequired,
|
||||
};
|
||||
|
||||
export default withTranslation()(UpstreamAvgTime);
|
81
client/src/components/Dashboard/UpstreamResponses.js
Normal file
81
client/src/components/Dashboard/UpstreamResponses.js
Normal file
|
@ -0,0 +1,81 @@
|
|||
import React from 'react';
|
||||
import ReactTable from 'react-table';
|
||||
import PropTypes from 'prop-types';
|
||||
import { withTranslation, Trans } from 'react-i18next';
|
||||
|
||||
import Card from '../ui/Card';
|
||||
import Cell from '../ui/Cell';
|
||||
import DomainCell from './DomainCell';
|
||||
|
||||
import { getPercent } from '../../helpers/helpers';
|
||||
import { STATUS_COLORS } from '../../helpers/constants';
|
||||
|
||||
const CountCell = (totalBlocked) => (
|
||||
function cell(row) {
|
||||
const { value } = row;
|
||||
const percent = getPercent(totalBlocked, value);
|
||||
|
||||
return (
|
||||
<Cell
|
||||
value={value}
|
||||
percent={percent}
|
||||
color={STATUS_COLORS.green}
|
||||
/>
|
||||
);
|
||||
}
|
||||
);
|
||||
|
||||
const getTotalUpstreamRequests = (stats) => {
|
||||
let total = 0;
|
||||
stats.forEach(({ count }) => { total += count; });
|
||||
|
||||
return total;
|
||||
};
|
||||
|
||||
const UpstreamResponses = ({
|
||||
t,
|
||||
refreshButton,
|
||||
topUpstreamsResponses,
|
||||
subtitle,
|
||||
}) => (
|
||||
<Card
|
||||
title={t('top_upstreams')}
|
||||
subtitle={subtitle}
|
||||
bodyType="card-table"
|
||||
refresh={refreshButton}
|
||||
>
|
||||
<ReactTable
|
||||
data={topUpstreamsResponses.map(({ name: domain, count }) => ({
|
||||
domain,
|
||||
count,
|
||||
}))}
|
||||
columns={[
|
||||
{
|
||||
Header: <Trans>upstream</Trans>,
|
||||
accessor: 'domain',
|
||||
Cell: DomainCell,
|
||||
},
|
||||
{
|
||||
Header: <Trans>requests_count</Trans>,
|
||||
accessor: 'count',
|
||||
maxWidth: 190,
|
||||
Cell: CountCell(getTotalUpstreamRequests(topUpstreamsResponses)),
|
||||
},
|
||||
]}
|
||||
showPagination={false}
|
||||
noDataText={t('no_upstreams_data_found')}
|
||||
minRows={6}
|
||||
defaultPageSize={100}
|
||||
className="-highlight card-table-overflow--limited stats__table"
|
||||
/>
|
||||
</Card>
|
||||
);
|
||||
|
||||
UpstreamResponses.propTypes = {
|
||||
topUpstreamsResponses: PropTypes.array.isRequired,
|
||||
refreshButton: PropTypes.node.isRequired,
|
||||
subtitle: PropTypes.string.isRequired,
|
||||
t: PropTypes.func.isRequired,
|
||||
};
|
||||
|
||||
export default withTranslation()(UpstreamResponses);
|
|
@ -21,6 +21,8 @@ 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,
|
||||
|
@ -136,12 +138,12 @@ const Dashboard = ({
|
|||
<PageTitle title={t('dashboard')} containerClass="page-title--dashboard">
|
||||
<div className="page-title__protection">
|
||||
<button
|
||||
type="button"
|
||||
className={buttonClass}
|
||||
onClick={() => {
|
||||
toggleProtection(protectionEnabled);
|
||||
}}
|
||||
disabled={processingProtection}
|
||||
type="button"
|
||||
className={buttonClass}
|
||||
onClick={() => {
|
||||
toggleProtection(protectionEnabled);
|
||||
}}
|
||||
disabled={processingProtection}
|
||||
>
|
||||
{protectionDisabledDuration
|
||||
? `${t('enable_protection_timer')} ${getRemaningTimeText(protectionDisabledDuration)}`
|
||||
|
@ -160,9 +162,9 @@ const Dashboard = ({
|
|||
</Dropdown>}
|
||||
</div>
|
||||
<button
|
||||
type="button"
|
||||
className="btn btn-outline-primary btn-sm"
|
||||
onClick={getAllStats}
|
||||
type="button"
|
||||
className="btn btn-outline-primary btn-sm"
|
||||
onClick={getAllStats}
|
||||
>
|
||||
<Trans>refresh_statics</Trans>
|
||||
</button>
|
||||
|
@ -185,53 +187,67 @@ const Dashboard = ({
|
|||
</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}
|
||||
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}
|
||||
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}
|
||||
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}
|
||||
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}
|
||||
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>}
|
||||
|
|
|
@ -134,7 +134,6 @@ const Form = (props) => {
|
|||
component={renderInputField}
|
||||
className="form-control"
|
||||
placeholder={t('enter_name_hint')}
|
||||
validate={[validateRequiredValue]}
|
||||
normalizeOnBlur={(data) => data.trim()}
|
||||
/>
|
||||
</div>
|
||||
|
|
220
client/src/components/Filters/Services/ScheduleForm/Modal.js
Normal file
220
client/src/components/Filters/Services/ScheduleForm/Modal.js
Normal file
|
@ -0,0 +1,220 @@
|
|||
import React, { useState, useEffect } from 'react';
|
||||
import PropTypes from 'prop-types';
|
||||
import { useTranslation } from 'react-i18next';
|
||||
import ReactModal from 'react-modal';
|
||||
|
||||
import { Timezone } from './Timezone';
|
||||
import { TimeSelect } from './TimeSelect';
|
||||
import { TimePeriod } from './TimePeriod';
|
||||
import { getFullDayName, getShortDayName } from './helpers';
|
||||
import { LOCAL_TIMEZONE_VALUE } from '../../../../helpers/constants';
|
||||
|
||||
export const DAYS_OF_WEEK = ['sun', 'mon', 'tue', 'wed', 'thu', 'fri', 'sat'];
|
||||
|
||||
const INITIAL_START_TIME_MS = 0;
|
||||
const INITIAL_END_TIME_MS = 86340000;
|
||||
|
||||
export const Modal = ({
|
||||
isOpen,
|
||||
currentDay,
|
||||
schedule,
|
||||
onClose,
|
||||
onSubmit,
|
||||
}) => {
|
||||
const [t] = useTranslation();
|
||||
|
||||
const intialTimezone = schedule.time_zone === LOCAL_TIMEZONE_VALUE
|
||||
? Intl.DateTimeFormat().resolvedOptions().timeZone
|
||||
: schedule.time_zone;
|
||||
|
||||
const [timezone, setTimezone] = useState(intialTimezone);
|
||||
const [days, setDays] = useState(new Set());
|
||||
|
||||
const [startTime, setStartTime] = useState(INITIAL_START_TIME_MS);
|
||||
const [endTime, setEndTime] = useState(INITIAL_END_TIME_MS);
|
||||
|
||||
const [wrongPeriod, setWrongPeriod] = useState(true);
|
||||
|
||||
useEffect(() => {
|
||||
if (currentDay) {
|
||||
const newDays = new Set([currentDay]);
|
||||
setDays(newDays);
|
||||
|
||||
setStartTime(schedule[currentDay].start);
|
||||
setEndTime(schedule[currentDay].end);
|
||||
}
|
||||
}, [currentDay]);
|
||||
|
||||
useEffect(() => {
|
||||
if (startTime >= endTime) {
|
||||
setWrongPeriod(true);
|
||||
} else {
|
||||
setWrongPeriod(false);
|
||||
}
|
||||
}, [startTime, endTime]);
|
||||
|
||||
const addDays = (day) => {
|
||||
const newDays = new Set(days);
|
||||
|
||||
if (newDays.has(day)) {
|
||||
newDays.delete(day);
|
||||
} else {
|
||||
newDays.add(day);
|
||||
}
|
||||
|
||||
setDays(newDays);
|
||||
};
|
||||
|
||||
const activeDay = (day) => {
|
||||
return days.has(day);
|
||||
};
|
||||
|
||||
const onFormSubmit = (e) => {
|
||||
e.preventDefault();
|
||||
|
||||
if (currentDay) {
|
||||
const newSchedule = schedule;
|
||||
|
||||
Array.from(days).forEach((day) => {
|
||||
newSchedule[day] = {
|
||||
start: startTime,
|
||||
end: endTime,
|
||||
};
|
||||
});
|
||||
|
||||
onSubmit(newSchedule);
|
||||
} else {
|
||||
const newSchedule = {
|
||||
time_zone: timezone,
|
||||
};
|
||||
|
||||
Array.from(days).forEach((day) => {
|
||||
newSchedule[day] = {
|
||||
start: startTime,
|
||||
end: endTime,
|
||||
};
|
||||
});
|
||||
|
||||
onSubmit(newSchedule);
|
||||
}
|
||||
};
|
||||
|
||||
return (
|
||||
<ReactModal
|
||||
className="Modal__Bootstrap modal-dialog modal-dialog-centered modal-dialog--schedule"
|
||||
closeTimeoutMS={0}
|
||||
isOpen={isOpen}
|
||||
onRequestClose={onClose}
|
||||
>
|
||||
<div className="modal-content">
|
||||
<div className="modal-header">
|
||||
<h4 className="modal-title">
|
||||
{currentDay ? t('schedule_edit') : t('schedule_new')}
|
||||
</h4>
|
||||
<button type="button" className="close" onClick={onClose}>
|
||||
<span className="sr-only">Close</span>
|
||||
</button>
|
||||
</div>
|
||||
<form onSubmit={onFormSubmit}>
|
||||
<div className="modal-body">
|
||||
<Timezone
|
||||
timezone={timezone}
|
||||
setTimezone={setTimezone}
|
||||
/>
|
||||
|
||||
<div className="schedule__days">
|
||||
{DAYS_OF_WEEK.map((day) => (
|
||||
<button
|
||||
type="button"
|
||||
key={day}
|
||||
className="btn schedule__button-day"
|
||||
data-active={activeDay(day)}
|
||||
onClick={() => addDays(day)}
|
||||
>
|
||||
{getShortDayName(t, day)}
|
||||
</button>
|
||||
)) }
|
||||
</div>
|
||||
|
||||
<div className="schedule__time-wrap">
|
||||
<div className="schedule__time-row">
|
||||
<TimeSelect
|
||||
value={startTime}
|
||||
onChange={(v) => setStartTime(v)}
|
||||
/>
|
||||
|
||||
<TimeSelect
|
||||
value={endTime}
|
||||
onChange={(v) => setEndTime(v)}
|
||||
/>
|
||||
</div>
|
||||
|
||||
{wrongPeriod && (
|
||||
<div className="schedule__error">
|
||||
{t('schedule_invalid_select')}
|
||||
</div>
|
||||
)}
|
||||
</div>
|
||||
|
||||
<div className="schedule__info">
|
||||
<div className="schedule__info-title">
|
||||
{t('schedule_modal_time_off')}
|
||||
</div>
|
||||
<div className="schedule__info-row">
|
||||
<svg className="icons schedule__info-icon">
|
||||
<use xlinkHref="#calendar" />
|
||||
</svg>
|
||||
{days.size ? (
|
||||
Array.from(days).map((day) => getFullDayName(t, day)).join(', ')
|
||||
) : (
|
||||
<span>
|
||||
—
|
||||
</span>
|
||||
)}
|
||||
</div>
|
||||
<div className="schedule__info-row">
|
||||
<svg className="icons schedule__info-icon">
|
||||
<use xlinkHref="#watch" />
|
||||
</svg>
|
||||
{wrongPeriod ? (
|
||||
<span>
|
||||
—
|
||||
</span>
|
||||
) : (
|
||||
<TimePeriod
|
||||
startTimeMs={startTime}
|
||||
endTimeMs={endTime}
|
||||
/>
|
||||
)}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div className="schedule__notice">
|
||||
{t('schedule_modal_description')}
|
||||
</div>
|
||||
</div>
|
||||
<div className="modal-footer">
|
||||
<div className="btn-list">
|
||||
<button
|
||||
type="button"
|
||||
className="btn btn-success btn-standard"
|
||||
disabled={days.size === 0 || wrongPeriod}
|
||||
onClick={onFormSubmit}
|
||||
>
|
||||
{currentDay ? t('schedule_save') : t('schedule_add')}
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</ReactModal>
|
||||
);
|
||||
};
|
||||
|
||||
Modal.propTypes = {
|
||||
schedule: PropTypes.object.isRequired,
|
||||
currentDay: PropTypes.string,
|
||||
isOpen: PropTypes.bool.isRequired,
|
||||
onClose: PropTypes.func.isRequired,
|
||||
onSubmit: PropTypes.func.isRequired,
|
||||
};
|
|
@ -0,0 +1,25 @@
|
|||
import React from 'react';
|
||||
import PropTypes from 'prop-types';
|
||||
|
||||
import { getTimeFromMs } from './helpers';
|
||||
|
||||
export const TimePeriod = ({
|
||||
startTimeMs,
|
||||
endTimeMs,
|
||||
}) => {
|
||||
const startTime = getTimeFromMs(startTimeMs);
|
||||
const endTime = getTimeFromMs(endTimeMs);
|
||||
|
||||
return (
|
||||
<div className="schedule__time">
|
||||
<time>{startTime.hours}:{startTime.minutes}</time>
|
||||
–
|
||||
<time>{endTime.hours}:{endTime.minutes}</time>
|
||||
</div>
|
||||
);
|
||||
};
|
||||
|
||||
TimePeriod.propTypes = {
|
||||
startTimeMs: PropTypes.number.isRequired,
|
||||
endTimeMs: PropTypes.number.isRequired,
|
||||
};
|
|
@ -0,0 +1,60 @@
|
|||
import React, { useState } from 'react';
|
||||
import PropTypes from 'prop-types';
|
||||
|
||||
import { getTimeFromMs, convertTimeToMs } from './helpers';
|
||||
|
||||
export const TimeSelect = ({
|
||||
value,
|
||||
onChange,
|
||||
}) => {
|
||||
const { hours: initialHours, minutes: initialMinutes } = getTimeFromMs(value);
|
||||
|
||||
const [hours, setHours] = useState(initialHours);
|
||||
const [minutes, setMinutes] = useState(initialMinutes);
|
||||
|
||||
const hourOptions = Array.from({ length: 24 }, (_, i) => i.toString().padStart(2, '0'));
|
||||
const minuteOptions = Array.from({ length: 60 }, (_, i) => i.toString().padStart(2, '0'));
|
||||
|
||||
const onHourChange = (event) => {
|
||||
setHours(event.target.value);
|
||||
onChange(convertTimeToMs(event.target.value, minutes));
|
||||
};
|
||||
|
||||
const onMinuteChange = (event) => {
|
||||
setMinutes(event.target.value);
|
||||
onChange(convertTimeToMs(hours, event.target.value));
|
||||
};
|
||||
|
||||
return (
|
||||
<div className="schedule__time-select">
|
||||
<select
|
||||
value={hours}
|
||||
onChange={onHourChange}
|
||||
className="form-control custom-select"
|
||||
>
|
||||
{hourOptions.map((hour) => (
|
||||
<option key={hour} value={hour}>
|
||||
{hour}
|
||||
</option>
|
||||
))}
|
||||
</select>
|
||||
:
|
||||
<select
|
||||
value={minutes}
|
||||
onChange={onMinuteChange}
|
||||
className="form-control custom-select"
|
||||
>
|
||||
{minuteOptions.map((minute) => (
|
||||
<option key={minute} value={minute}>
|
||||
{minute}
|
||||
</option>
|
||||
))}
|
||||
</select>
|
||||
</div>
|
||||
);
|
||||
};
|
||||
|
||||
TimeSelect.propTypes = {
|
||||
value: PropTypes.number.isRequired,
|
||||
onChange: PropTypes.func.isRequired,
|
||||
};
|
|
@ -0,0 +1,46 @@
|
|||
import React from 'react';
|
||||
import timezones from 'timezones-list';
|
||||
import { useTranslation } from 'react-i18next';
|
||||
import PropTypes from 'prop-types';
|
||||
|
||||
import { LOCAL_TIMEZONE_VALUE } from '../../../../helpers/constants';
|
||||
|
||||
export const Timezone = ({
|
||||
timezone,
|
||||
setTimezone,
|
||||
}) => {
|
||||
const [t] = useTranslation();
|
||||
|
||||
const onTimeZoneChange = (event) => {
|
||||
setTimezone(event.target.value);
|
||||
};
|
||||
|
||||
return (
|
||||
<div className="schedule__timezone">
|
||||
<label className="form__label form__label--with-desc mb-2">
|
||||
{t('schedule_timezone')}
|
||||
</label>
|
||||
|
||||
<select
|
||||
className="form-control custom-select"
|
||||
value={timezone}
|
||||
onChange={onTimeZoneChange}
|
||||
>
|
||||
<option value={LOCAL_TIMEZONE_VALUE}>
|
||||
{t('schedule_timezone')}
|
||||
</option>
|
||||
{/* TODO: get timezones from backend method when the method is ready */}
|
||||
{timezones.map((zone) => (
|
||||
<option key={zone.name} value={zone.tzCode}>
|
||||
{zone.label}
|
||||
</option>
|
||||
))}
|
||||
</select>
|
||||
</div>
|
||||
);
|
||||
};
|
||||
|
||||
Timezone.propTypes = {
|
||||
timezone: PropTypes.string.isRequired,
|
||||
setTimezone: PropTypes.func.isRequired,
|
||||
};
|
|
@ -0,0 +1,46 @@
|
|||
export const getFullDayName = (t, abbreviation) => {
|
||||
const dayMap = {
|
||||
sun: t('sunday'),
|
||||
mon: t('monday'),
|
||||
tue: t('tuesday'),
|
||||
wed: t('wednesday'),
|
||||
thu: t('thursday'),
|
||||
fri: t('friday'),
|
||||
sat: t('saturday'),
|
||||
};
|
||||
|
||||
return dayMap[abbreviation] || '';
|
||||
};
|
||||
|
||||
export const getShortDayName = (t, abbreviation) => {
|
||||
const dayMap = {
|
||||
sun: t('sunday_short'),
|
||||
mon: t('monday_short'),
|
||||
tue: t('tuesday_short'),
|
||||
wed: t('wednesday_short'),
|
||||
thu: t('thursday_short'),
|
||||
fri: t('friday_short'),
|
||||
sat: t('saturday_short'),
|
||||
};
|
||||
|
||||
return dayMap[abbreviation] || '';
|
||||
};
|
||||
|
||||
export const getTimeFromMs = (value) => {
|
||||
const selectedTime = new Date(value);
|
||||
const hours = selectedTime.getUTCHours();
|
||||
const minutes = selectedTime.getUTCMinutes();
|
||||
|
||||
return {
|
||||
hours: hours.toString().padStart(2, '0'),
|
||||
minutes: minutes.toString().padStart(2, '0'),
|
||||
};
|
||||
};
|
||||
|
||||
export const convertTimeToMs = (hours, minutes) => {
|
||||
const selectedTime = new Date(0);
|
||||
selectedTime.setUTCHours(parseInt(hours, 10));
|
||||
selectedTime.setUTCMinutes(parseInt(minutes, 10));
|
||||
|
||||
return selectedTime.getTime();
|
||||
};
|
140
client/src/components/Filters/Services/ScheduleForm/index.js
Normal file
140
client/src/components/Filters/Services/ScheduleForm/index.js
Normal file
|
@ -0,0 +1,140 @@
|
|||
import React, { useState, useMemo } from 'react';
|
||||
import { useTranslation } from 'react-i18next';
|
||||
import PropTypes from 'prop-types';
|
||||
import cn from 'classnames';
|
||||
|
||||
import { Modal } from './Modal';
|
||||
import { getFullDayName, getShortDayName } from './helpers';
|
||||
import { LOCAL_TIMEZONE_VALUE } from '../../../../helpers/constants';
|
||||
import { TimePeriod } from './TimePeriod';
|
||||
import './styles.css';
|
||||
|
||||
export const ScheduleForm = ({
|
||||
schedule,
|
||||
onScheduleSubmit,
|
||||
clientForm,
|
||||
}) => {
|
||||
const [t] = useTranslation();
|
||||
const [modalOpen, setModalOpen] = useState(false);
|
||||
const [currentDay, setCurrentDay] = useState();
|
||||
|
||||
const onModalOpen = () => setModalOpen(true);
|
||||
const onModalClose = () => setModalOpen(false);
|
||||
|
||||
const filteredScheduleKeys = useMemo(() => (
|
||||
schedule ? Object.keys(schedule).filter((v) => v !== 'time_zone') : []
|
||||
), [schedule]);
|
||||
|
||||
const scheduleMap = new Map();
|
||||
filteredScheduleKeys.forEach((day) => scheduleMap.set(day, schedule[day]));
|
||||
|
||||
const onSubmit = (values) => {
|
||||
onScheduleSubmit(values);
|
||||
onModalClose();
|
||||
};
|
||||
|
||||
const onDelete = (day) => {
|
||||
scheduleMap.delete(day);
|
||||
|
||||
const scheduleWeek = Object.fromEntries(Array.from(scheduleMap.entries()));
|
||||
|
||||
onScheduleSubmit({
|
||||
time_zone: schedule.time_zone,
|
||||
...scheduleWeek,
|
||||
});
|
||||
};
|
||||
|
||||
const onEdit = (day) => {
|
||||
setCurrentDay(day);
|
||||
onModalOpen();
|
||||
};
|
||||
|
||||
const onAdd = () => {
|
||||
setCurrentDay(undefined);
|
||||
onModalOpen();
|
||||
};
|
||||
|
||||
return (
|
||||
<div>
|
||||
<div className="schedule__current-timezone">
|
||||
{t('schedule_current_timezone', { value: schedule?.time_zone || LOCAL_TIMEZONE_VALUE })}
|
||||
</div>
|
||||
|
||||
<div className="schedule__rows">
|
||||
{filteredScheduleKeys.map((day) => {
|
||||
const data = schedule[day];
|
||||
|
||||
if (!data) {
|
||||
return undefined;
|
||||
}
|
||||
|
||||
return (
|
||||
<div key={day} className="schedule__row">
|
||||
<div className="schedule__day">
|
||||
{getFullDayName(t, day)}
|
||||
</div>
|
||||
<div className="schedule__day schedule__day--mobile">
|
||||
{getShortDayName(t, day)}
|
||||
</div>
|
||||
<TimePeriod
|
||||
startTimeMs={data.start}
|
||||
endTimeMs={data.end}
|
||||
/>
|
||||
<div className="schedule__actions">
|
||||
<button
|
||||
type="button"
|
||||
className="btn btn-icon btn-outline-primary btn-sm schedule__button"
|
||||
title={t('edit_table_action')}
|
||||
onClick={() => onEdit(day)}
|
||||
>
|
||||
<svg className="icons icon12">
|
||||
<use xlinkHref="#edit" />
|
||||
</svg>
|
||||
</button>
|
||||
|
||||
<button
|
||||
type="button"
|
||||
className="btn btn-icon btn-outline-secondary btn-sm schedule__button"
|
||||
title={t('delete_table_action')}
|
||||
onClick={() => onDelete(day)}
|
||||
>
|
||||
<svg className="icons">
|
||||
<use xlinkHref="#delete" />
|
||||
</svg>
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
})}
|
||||
</div>
|
||||
|
||||
<button
|
||||
type="button"
|
||||
className={cn(
|
||||
'btn',
|
||||
{ 'btn-outline-success btn-sm': clientForm },
|
||||
{ 'btn-success btn-standard': !clientForm },
|
||||
)}
|
||||
onClick={onAdd}
|
||||
>
|
||||
{t('schedule_new')}
|
||||
</button>
|
||||
|
||||
{modalOpen && (
|
||||
<Modal
|
||||
isOpen={modalOpen}
|
||||
onClose={onModalClose}
|
||||
onSubmit={onSubmit}
|
||||
schedule={schedule}
|
||||
currentDay={currentDay}
|
||||
/>
|
||||
)}
|
||||
</div>
|
||||
);
|
||||
};
|
||||
|
||||
ScheduleForm.propTypes = {
|
||||
schedule: PropTypes.object,
|
||||
onScheduleSubmit: PropTypes.func.isRequired,
|
||||
clientForm: PropTypes.bool,
|
||||
};
|
134
client/src/components/Filters/Services/ScheduleForm/styles.css
Normal file
134
client/src/components/Filters/Services/ScheduleForm/styles.css
Normal file
|
@ -0,0 +1,134 @@
|
|||
.schedule__row {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: space-between;
|
||||
margin-bottom: 8px;
|
||||
}
|
||||
|
||||
.schedule__row:last-child {
|
||||
margin-bottom: 0;
|
||||
}
|
||||
|
||||
.schedule__rows {
|
||||
margin-bottom: 24px;
|
||||
}
|
||||
|
||||
.schedule__day {
|
||||
display: none;
|
||||
min-width: 110px;
|
||||
}
|
||||
|
||||
.schedule__day--mobile {
|
||||
display: block;
|
||||
min-width: 50px;
|
||||
}
|
||||
|
||||
@media screen and (min-width: 767px) {
|
||||
.schedule__row {
|
||||
justify-content: flex-start;
|
||||
}
|
||||
|
||||
.schedule__day {
|
||||
display: block;
|
||||
}
|
||||
|
||||
.schedule__day--mobile {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.schedule__actions {
|
||||
margin-left: 32px;
|
||||
white-space: nowrap;
|
||||
}
|
||||
}
|
||||
|
||||
.schedule__time {
|
||||
min-width: 110px;
|
||||
}
|
||||
|
||||
.schedule__button {
|
||||
border: 0;
|
||||
}
|
||||
|
||||
.schedule__days {
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
gap: 8px;
|
||||
margin-bottom: 24px;
|
||||
}
|
||||
|
||||
.schedule__button-day {
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
min-width: 60px;
|
||||
height: 32px;
|
||||
font-size: 14px;
|
||||
line-height: 14px;
|
||||
color: #495057;
|
||||
background-color: transparent;
|
||||
border: 1px solid var(--card-border-color);
|
||||
border-radius: 4px;
|
||||
cursor: pointer;
|
||||
outline: 0;
|
||||
}
|
||||
|
||||
.schedule__button-day[data-active="true"] {
|
||||
color: var(--btn-success-bgcolor);
|
||||
border-color: var(--btn-success-bgcolor);
|
||||
}
|
||||
|
||||
.schedule__time-wrap {
|
||||
margin-bottom: 24px;
|
||||
}
|
||||
|
||||
.schedule__time-row {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 16px;
|
||||
}
|
||||
|
||||
.schedule__time-select {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
.schedule__error {
|
||||
margin-top: 4px;
|
||||
font-size: 13px;
|
||||
color: #cd201f;
|
||||
}
|
||||
|
||||
.schedule__timezone {
|
||||
margin-bottom: 24px;
|
||||
}
|
||||
|
||||
.schedule__current-timezone {
|
||||
margin-bottom: 16px;
|
||||
}
|
||||
|
||||
.schedule__info {
|
||||
margin-bottom: 24px;
|
||||
}
|
||||
|
||||
.schedule__notice {
|
||||
font-size: 13px;
|
||||
}
|
||||
|
||||
.schedule__info-title {
|
||||
margin-bottom: 8px;
|
||||
}
|
||||
|
||||
.schedule__info-row {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
margin-bottom: 4px;
|
||||
}
|
||||
|
||||
.schedule__info-icon {
|
||||
width: 24px;
|
||||
height: 24px;
|
||||
margin-right: 8px;
|
||||
color: #495057;
|
||||
flex-shrink: 0;
|
||||
}
|
|
@ -4,9 +4,11 @@ import { useTranslation } from 'react-i18next';
|
|||
import { useDispatch, useSelector } from 'react-redux';
|
||||
import Form from './Form';
|
||||
import Card from '../../ui/Card';
|
||||
import { getBlockedServices, getAllBlockedServices, setBlockedServices } from '../../../actions/services';
|
||||
import { getBlockedServices, getAllBlockedServices, updateBlockedServices } from '../../../actions/services';
|
||||
import PageTitle from '../../ui/PageTitle';
|
||||
|
||||
import { ScheduleForm } from './ScheduleForm';
|
||||
|
||||
const getInitialDataForServices = (initial) => (initial ? initial.reduce(
|
||||
(acc, service) => {
|
||||
acc.blocked_services[service] = true;
|
||||
|
@ -33,10 +35,24 @@ const Services = () => {
|
|||
.keys(values.blocked_services)
|
||||
.filter((service) => values.blocked_services[service]);
|
||||
|
||||
dispatch(setBlockedServices(blocked_services));
|
||||
dispatch(updateBlockedServices({
|
||||
ids: blocked_services,
|
||||
schedule: services.list.schedule,
|
||||
}));
|
||||
};
|
||||
|
||||
const initialValues = getInitialDataForServices(services.list);
|
||||
const handleScheduleSubmit = (values) => {
|
||||
dispatch(updateBlockedServices({
|
||||
ids: services.list.ids,
|
||||
schedule: values,
|
||||
}));
|
||||
};
|
||||
|
||||
const initialValues = getInitialDataForServices(services.list.ids);
|
||||
|
||||
if (!initialValues) {
|
||||
return null;
|
||||
}
|
||||
|
||||
return (
|
||||
<>
|
||||
|
@ -57,6 +73,17 @@ const Services = () => {
|
|||
/>
|
||||
</div>
|
||||
</Card>
|
||||
|
||||
<Card
|
||||
title={t('schedule_services')}
|
||||
subtitle={t('schedule_services_desc')}
|
||||
bodyType="card-body box-body--settings"
|
||||
>
|
||||
<ScheduleForm
|
||||
schedule={services.list.schedule}
|
||||
onScheduleSubmit={handleScheduleSubmit}
|
||||
/>
|
||||
</Card>
|
||||
</>
|
||||
);
|
||||
};
|
||||
|
|
|
@ -74,6 +74,12 @@
|
|||
color: #295a9f;
|
||||
}
|
||||
|
||||
[data-theme="dark"] .logs__text--link,
|
||||
[data-theme="dark"] .logs__text--link:hover,
|
||||
[data-theme="dark"] .logs__text--link:focus {
|
||||
color: var(--gray-f3);
|
||||
}
|
||||
|
||||
.icon--selected {
|
||||
background-color: var(--gray-f3);
|
||||
border: solid 1px var(--gray-d8);
|
||||
|
|
|
@ -6,7 +6,7 @@ import { Trans, useTranslation } from 'react-i18next';
|
|||
import { useDispatch, useSelector } from 'react-redux';
|
||||
import ReactTable from 'react-table';
|
||||
|
||||
import { getAllBlockedServices } from '../../../../actions/services';
|
||||
import { getAllBlockedServices, getBlockedServices } from '../../../../actions/services';
|
||||
import { initSettings } from '../../../../actions';
|
||||
import {
|
||||
splitByNewLine,
|
||||
|
@ -14,7 +14,7 @@ import {
|
|||
sortIp,
|
||||
getService,
|
||||
} from '../../../../helpers/helpers';
|
||||
import { MODAL_TYPE } from '../../../../helpers/constants';
|
||||
import { MODAL_TYPE, LOCAL_TIMEZONE_VALUE } from '../../../../helpers/constants';
|
||||
import Card from '../../../ui/Card';
|
||||
import CellWrap from '../../../ui/CellWrap';
|
||||
import LogsSearchLink from '../../../ui/LogsSearchLink';
|
||||
|
@ -45,6 +45,7 @@ const ClientsTable = ({
|
|||
|
||||
useEffect(() => {
|
||||
dispatch(getAllBlockedServices());
|
||||
dispatch(getBlockedServices());
|
||||
dispatch(initSettings());
|
||||
}, []);
|
||||
|
||||
|
@ -112,6 +113,9 @@ const ClientsTable = ({
|
|||
tags: [],
|
||||
use_global_settings: true,
|
||||
use_global_blocked_services: true,
|
||||
blocked_services_schedule: {
|
||||
time_zone: LOCAL_TIMEZONE_VALUE,
|
||||
},
|
||||
safe_search: { ...(safesearch || {}) },
|
||||
};
|
||||
};
|
||||
|
|
|
@ -11,6 +11,7 @@ import Select from 'react-select';
|
|||
import i18n from '../../../i18n';
|
||||
import Tabs from '../../ui/Tabs';
|
||||
import Examples from '../Dns/Upstream/Examples';
|
||||
import { ScheduleForm } from '../../Filters/Services/ScheduleForm';
|
||||
import { toggleAllServices, trimLinesAndRemoveEmpty, captitalizeWords } from '../../../helpers/helpers';
|
||||
import {
|
||||
renderInputField,
|
||||
|
@ -137,10 +138,10 @@ let Form = (props) => {
|
|||
handleSubmit,
|
||||
reset,
|
||||
change,
|
||||
pristine,
|
||||
submitting,
|
||||
useGlobalSettings,
|
||||
useGlobalServices,
|
||||
blockedServicesSchedule,
|
||||
toggleClientModal,
|
||||
processingAdding,
|
||||
processingUpdating,
|
||||
|
@ -155,6 +156,10 @@ let Form = (props) => {
|
|||
|
||||
const [activeTabLabel, setActiveTabLabel] = useState('settings');
|
||||
|
||||
const handleScheduleSubmit = (values) => {
|
||||
change('blocked_services_schedule', values);
|
||||
};
|
||||
|
||||
const tabs = {
|
||||
settings: {
|
||||
title: 'settings',
|
||||
|
@ -269,6 +274,21 @@ let Form = (props) => {
|
|||
</div>
|
||||
</div>,
|
||||
},
|
||||
schedule_services: {
|
||||
title: 'schedule_services',
|
||||
component: (
|
||||
<>
|
||||
<div className="form__desc mb-4">
|
||||
<Trans>schedule_services_desc_client</Trans>
|
||||
</div>
|
||||
<ScheduleForm
|
||||
schedule={blockedServicesSchedule}
|
||||
onScheduleSubmit={handleScheduleSubmit}
|
||||
clientForm
|
||||
/>
|
||||
</>
|
||||
),
|
||||
},
|
||||
upstream_dns: {
|
||||
title: 'upstream_dns',
|
||||
component: <div label="upstream" title={props.t('upstream_dns')}>
|
||||
|
@ -355,8 +375,12 @@ let Form = (props) => {
|
|||
</div>
|
||||
</div>
|
||||
|
||||
<Tabs controlClass="form" tabs={tabs} activeTabLabel={activeTabLabel}
|
||||
setActiveTabLabel={setActiveTabLabel}>
|
||||
<Tabs
|
||||
controlClass="form"
|
||||
tabs={tabs}
|
||||
activeTabLabel={activeTabLabel}
|
||||
setActiveTabLabel={setActiveTabLabel}
|
||||
>
|
||||
{activeTab}
|
||||
</Tabs>
|
||||
</div>
|
||||
|
@ -380,7 +404,6 @@ let Form = (props) => {
|
|||
disabled={
|
||||
submitting
|
||||
|| invalid
|
||||
|| pristine
|
||||
|| processingAdding
|
||||
|| processingUpdating
|
||||
}
|
||||
|
@ -402,6 +425,7 @@ Form.propTypes = {
|
|||
toggleClientModal: PropTypes.func.isRequired,
|
||||
useGlobalSettings: PropTypes.bool,
|
||||
useGlobalServices: PropTypes.bool,
|
||||
blockedServicesSchedule: PropTypes.object,
|
||||
t: PropTypes.func.isRequired,
|
||||
processingAdding: PropTypes.bool.isRequired,
|
||||
processingUpdating: PropTypes.bool.isRequired,
|
||||
|
@ -415,9 +439,11 @@ const selector = formValueSelector(FORM_NAME.CLIENT);
|
|||
Form = connect((state) => {
|
||||
const useGlobalSettings = selector(state, 'use_global_settings');
|
||||
const useGlobalServices = selector(state, 'use_global_blocked_services');
|
||||
const blockedServicesSchedule = selector(state, 'blocked_services_schedule');
|
||||
return {
|
||||
useGlobalSettings,
|
||||
useGlobalServices,
|
||||
blockedServicesSchedule,
|
||||
};
|
||||
})(Form);
|
||||
|
||||
|
|
|
@ -179,6 +179,30 @@ const Form = ({
|
|||
<Examples />
|
||||
<hr />
|
||||
</div>
|
||||
<div className="col-12">
|
||||
<label
|
||||
className="form__label form__label--with-desc"
|
||||
htmlFor="fallback_dns"
|
||||
>
|
||||
<Trans>fallback_dns_title</Trans>
|
||||
</label>
|
||||
<div className="form__desc form__desc--top">
|
||||
<Trans>fallback_dns_desc</Trans>
|
||||
</div>
|
||||
<Field
|
||||
id="fallback_dns"
|
||||
name="fallback_dns"
|
||||
component={renderTextareaField}
|
||||
type="text"
|
||||
className="form-control form-control--textarea form-control--textarea-small font-monospace"
|
||||
placeholder={t('fallback_dns_placeholder')}
|
||||
disabled={processingSetConfig}
|
||||
normalizeOnBlur={removeEmptyLines}
|
||||
/>
|
||||
</div>
|
||||
<div className="col-12">
|
||||
<hr />
|
||||
</div>
|
||||
<div className="col-12 mb-2">
|
||||
<label
|
||||
className="form__label form__label--with-desc"
|
||||
|
@ -286,6 +310,7 @@ Form.propTypes = {
|
|||
invalid: PropTypes.bool,
|
||||
initialValues: PropTypes.object,
|
||||
upstream_dns: PropTypes.string,
|
||||
fallback_dns: PropTypes.string,
|
||||
bootstrap_dns: PropTypes.string,
|
||||
};
|
||||
|
||||
|
|
|
@ -10,6 +10,7 @@ const Upstream = () => {
|
|||
const dispatch = useDispatch();
|
||||
const {
|
||||
upstream_dns,
|
||||
fallback_dns,
|
||||
bootstrap_dns,
|
||||
upstream_mode,
|
||||
resolve_clients,
|
||||
|
@ -21,6 +22,7 @@ const Upstream = () => {
|
|||
|
||||
const handleSubmit = (values) => {
|
||||
const {
|
||||
fallback_dns,
|
||||
bootstrap_dns,
|
||||
upstream_dns,
|
||||
upstream_mode,
|
||||
|
@ -30,6 +32,7 @@ const Upstream = () => {
|
|||
} = values;
|
||||
|
||||
const dnsConfig = {
|
||||
fallback_dns,
|
||||
bootstrap_dns,
|
||||
upstream_mode,
|
||||
resolve_clients,
|
||||
|
@ -52,6 +55,7 @@ const Upstream = () => {
|
|||
<Form
|
||||
initialValues={{
|
||||
upstream_dns: upstreamDns,
|
||||
fallback_dns,
|
||||
bootstrap_dns,
|
||||
upstream_mode,
|
||||
resolve_clients,
|
||||
|
|
|
@ -13,8 +13,11 @@ import flow from 'lodash/flow';
|
|||
import {
|
||||
CheckboxField,
|
||||
toFloatNumber,
|
||||
renderTextareaField, renderInputField, renderRadioField,
|
||||
renderTextareaField,
|
||||
renderInputField,
|
||||
renderRadioField,
|
||||
} from '../../../helpers/form';
|
||||
import { trimLinesAndRemoveEmpty } from '../../../helpers/helpers';
|
||||
import {
|
||||
FORM_NAME,
|
||||
QUERY_LOG_INTERVALS_DAYS,
|
||||
|
@ -147,6 +150,7 @@ let Form = (props) => {
|
|||
component={renderTextareaField}
|
||||
placeholder={t('ignore_domains')}
|
||||
disabled={processing}
|
||||
normalizeOnBlur={trimLinesAndRemoveEmpty}
|
||||
/>
|
||||
</div>
|
||||
<div className="mt-5">
|
||||
|
|
|
@ -24,6 +24,7 @@ import {
|
|||
CUSTOM_INTERVAL,
|
||||
RETENTION_RANGE,
|
||||
} from '../../../helpers/constants';
|
||||
import { trimLinesAndRemoveEmpty } from '../../../helpers/helpers';
|
||||
import '../FormButton.css';
|
||||
|
||||
const getIntervalTitle = (intervalMs, t) => {
|
||||
|
@ -135,6 +136,7 @@ let Form = (props) => {
|
|||
component={renderTextareaField}
|
||||
placeholder={t('ignore_domains')}
|
||||
disabled={processing}
|
||||
normalizeOnBlur={trimLinesAndRemoveEmpty}
|
||||
/>
|
||||
</div>
|
||||
<div className="mt-5">
|
||||
|
|
|
@ -1,25 +1,39 @@
|
|||
import React from 'react';
|
||||
import PropTypes from 'prop-types';
|
||||
|
||||
import LogsSearchLink from './LogsSearchLink';
|
||||
import { formatNumber } from '../../helpers/helpers';
|
||||
|
||||
const Cell = ({
|
||||
value, percent, color, search,
|
||||
}) => <div className="stats__row">
|
||||
<div className="stats__row-value mb-1">
|
||||
<strong><LogsSearchLink search={search}>{formatNumber(value)}</LogsSearchLink></strong>
|
||||
<small className="ml-3 text-muted">{percent}%</small>
|
||||
value,
|
||||
percent,
|
||||
color,
|
||||
search,
|
||||
}) => (
|
||||
<div className="stats__row">
|
||||
<div className="stats__row-value mb-1">
|
||||
<strong>
|
||||
{search ? (
|
||||
<LogsSearchLink search={search}>
|
||||
{formatNumber(value)}
|
||||
</LogsSearchLink>
|
||||
) : (
|
||||
formatNumber(value)
|
||||
)}
|
||||
</strong>
|
||||
<small className="ml-3 text-muted">{percent}%</small>
|
||||
</div>
|
||||
<div className="progress progress-xs">
|
||||
<div
|
||||
className="progress-bar"
|
||||
style={{
|
||||
width: `${percent}%`,
|
||||
backgroundColor: color,
|
||||
}}
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
<div className="progress progress-xs">
|
||||
<div
|
||||
className="progress-bar"
|
||||
style={{
|
||||
width: `${percent}%`,
|
||||
backgroundColor: color,
|
||||
}}
|
||||
/>
|
||||
</div>
|
||||
</div>;
|
||||
);
|
||||
|
||||
Cell.propTypes = {
|
||||
value: PropTypes.number.isRequired,
|
||||
|
|
|
@ -225,6 +225,20 @@ const Icons = () => (
|
|||
<path stroke="currentColor" strokeWidth="1.5" strokeLinecap="round" d="M8.036 10.93l3.93 4.07 4.068-3.93" />
|
||||
</g>
|
||||
</symbol>
|
||||
|
||||
<symbol id="calendar" fill="none" height="24" viewBox="0 0 24 24" width="24" stroke="currentColor" strokeWidth="1.5" strokeLinecap="round" strokeLinejoin="round">
|
||||
<rect x="4" y="5.5" width="16" height="14" rx="3" />
|
||||
<path d="M12 4V7" />
|
||||
<path d="M8 4L8 7" />
|
||||
<path d="M16 4V7" />
|
||||
<path d="M9.7397 15.5V11L8 13" />
|
||||
<path d="M14.7397 15.5V11L13 13" />
|
||||
</symbol>
|
||||
|
||||
<symbol id="watch" fill="none" height="24" viewBox="0 0 24 24" width="24" stroke="currentColor" strokeWidth="1.5" strokeLinecap="round" strokeLinejoin="round">
|
||||
<circle cx="12" cy="12" r="9" />
|
||||
<path d="M16.1215 12.1213H11.8789V7.87866" />
|
||||
</symbol>
|
||||
</svg>
|
||||
);
|
||||
|
||||
|
|
|
@ -44,7 +44,7 @@ const Line = ({
|
|||
enableGridY={false}
|
||||
enablePoints={false}
|
||||
xFormat={(x) => {
|
||||
if (interval === 1 || interval === 7) {
|
||||
if (interval >= 0 && interval <= 7) {
|
||||
const hoursAgo = subHours(Date.now(), 24 * interval);
|
||||
return dateFormat(addHours(hoursAgo, x), 'D MMM HH:00');
|
||||
}
|
||||
|
|
|
@ -41,7 +41,8 @@
|
|||
}
|
||||
|
||||
@media (min-width: 576px) {
|
||||
.modal-dialog--clients {
|
||||
.modal-dialog--clients,
|
||||
.modal-dialog--schedule {
|
||||
max-width: 650px;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -6,7 +6,7 @@
|
|||
.page-header--logs {
|
||||
flex-direction: row;
|
||||
align-items: flex-end;
|
||||
margin: 2rem 0 2.8rem;
|
||||
margin: 0.5rem 0 2.8rem;
|
||||
}
|
||||
|
||||
.page-header--logs .page-title {
|
||||
|
@ -18,7 +18,7 @@
|
|||
.page-header--logs {
|
||||
flex-direction: column;
|
||||
align-items: center;
|
||||
margin: 1.1rem 0;
|
||||
margin-bottom: 0 0 1.1rem;
|
||||
}
|
||||
|
||||
.page-header--logs .page-title {
|
||||
|
|
|
@ -470,6 +470,10 @@ hr {
|
|||
border-top: 1px solid rgba(0, 40, 100, 0.12);
|
||||
}
|
||||
|
||||
[data-theme=dark] hr {
|
||||
border-color: var(--card-border-color);
|
||||
}
|
||||
|
||||
small,
|
||||
.small {
|
||||
font-size: 87.5%;
|
||||
|
@ -10204,7 +10208,7 @@ body.fixed-header .page {
|
|||
-ms-flex-align: center;
|
||||
align-items: center;
|
||||
flex-direction: column;
|
||||
margin: 1.5rem 0 1.5rem;
|
||||
margin: 0 0 1.5rem;
|
||||
-ms-flex-wrap: wrap;
|
||||
flex-wrap: wrap;
|
||||
}
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
import { connect } from 'react-redux';
|
||||
import { initSettings, toggleSetting } from '../actions';
|
||||
import { getBlockedServices, setBlockedServices } from '../actions/services';
|
||||
import { getBlockedServices, updateBlockedServices } from '../actions/services';
|
||||
import { getStatsConfig, setStatsConfig, resetStats } from '../actions/stats';
|
||||
import { clearLogs, getLogsConfig, setLogsConfig } from '../actions/queryLogs';
|
||||
import { getFilteringStatus, setFiltersConfig } from '../actions/filtering';
|
||||
|
@ -24,7 +24,7 @@ const mapDispatchToProps = {
|
|||
initSettings,
|
||||
toggleSetting,
|
||||
getBlockedServices,
|
||||
setBlockedServices,
|
||||
updateBlockedServices,
|
||||
getStatsConfig,
|
||||
setStatsConfig,
|
||||
resetStats,
|
||||
|
|
|
@ -552,3 +552,5 @@ export const DISABLE_PROTECTION_TIMINGS = {
|
|||
};
|
||||
|
||||
export const LOCAL_STORAGE_THEME_KEY = 'account_theme';
|
||||
|
||||
export const LOCAL_TIMEZONE_VALUE = 'Local';
|
||||
|
|
|
@ -64,6 +64,12 @@ export default {
|
|||
"homepage": "https://github.com/MasterKia/PersianBlocker",
|
||||
"source": "https://adguardteam.github.io/HostlistsRegistry/assets/filter_19.txt"
|
||||
},
|
||||
"ISR_easyList_hebrew": {
|
||||
"name": "ISR: EasyList Hebrew",
|
||||
"categoryId": "regional",
|
||||
"homepage": "https://github.com/easylist/EasyListHebrew",
|
||||
"source": "https://adguardteam.github.io/HostlistsRegistry/assets/filter_43.txt"
|
||||
},
|
||||
"KOR_list_kr": {
|
||||
"name": "KOR: List-KR DNS",
|
||||
"categoryId": "regional",
|
||||
|
@ -172,12 +178,36 @@ export default {
|
|||
"homepage": "https://github.com/DandelionSprout/adfilt",
|
||||
"source": "https://adguardteam.github.io/HostlistsRegistry/assets/filter_6.txt"
|
||||
},
|
||||
"hagezi_allowlist_referral": {
|
||||
"name": "HaGeZi's Allowlist Referral",
|
||||
"categoryId": "other",
|
||||
"homepage": "https://github.com/hagezi/dns-blocklists#referral",
|
||||
"source": "https://adguardteam.github.io/HostlistsRegistry/assets/filter_45.txt"
|
||||
},
|
||||
"hagezi_antipiracy_blocklist": {
|
||||
"name": "HaGeZi's Anti-Piracy Blocklist",
|
||||
"categoryId": "other",
|
||||
"homepage": "https://github.com/hagezi/dns-blocklists#piracy",
|
||||
"source": "https://adguardteam.github.io/HostlistsRegistry/assets/filter_46.txt"
|
||||
},
|
||||
"hagezi_gambling_blocklist": {
|
||||
"name": "HaGeZi's Gambling Blocklist",
|
||||
"categoryId": "other",
|
||||
"homepage": "https://github.com/hagezi/dns-blocklists#gambling",
|
||||
"source": "https://adguardteam.github.io/HostlistsRegistry/assets/filter_47.txt"
|
||||
},
|
||||
"hagezi_multinormal": {
|
||||
"name": "HaGeZi Multi NORMAL",
|
||||
"categoryId": "general",
|
||||
"homepage": "https://github.com/hagezi/dns-blocklists",
|
||||
"source": "https://adguardteam.github.io/HostlistsRegistry/assets/filter_34.txt"
|
||||
},
|
||||
"hagezi_threat_intelligence_feeds": {
|
||||
"name": "HaGeZi's Threat Intelligence Feeds",
|
||||
"categoryId": "security",
|
||||
"homepage": "https://github.com/hagezi/dns-blocklists",
|
||||
"source": "https://adguardteam.github.io/HostlistsRegistry/assets/filter_44.txt"
|
||||
},
|
||||
"no_google": {
|
||||
"name": "No Google",
|
||||
"categoryId": "other",
|
||||
|
@ -220,6 +250,12 @@ export default {
|
|||
"homepage": "https://pgl.yoyo.org/adservers/",
|
||||
"source": "https://adguardteam.github.io/HostlistsRegistry/assets/filter_3.txt"
|
||||
},
|
||||
"phishing_army": {
|
||||
"name": "Phishing Army",
|
||||
"categoryId": "security",
|
||||
"homepage": "https://gitlab.com/malware-filter/phishing-filter",
|
||||
"source": "https://adguardteam.github.io/HostlistsRegistry/assets/filter_18.txt"
|
||||
},
|
||||
"scam_blocklist_by_durablenapkin": {
|
||||
"name": "Scam Blocklist by DurableNapkin",
|
||||
"categoryId": "security",
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
{
|
||||
"timeUpdated": "2023-08-01T00:10:42.759Z",
|
||||
"timeUpdated": "2023-09-01T00:09:16.088Z",
|
||||
"categories": {
|
||||
"0": "audio_video_player",
|
||||
"1": "comments",
|
||||
|
@ -181,7 +181,7 @@
|
|||
"name": "7plus",
|
||||
"categoryId": 0,
|
||||
"url": "https://7plus.com.au/",
|
||||
"companyId": "7plus",
|
||||
"companyId": "seven_group_holdings",
|
||||
"source": "AdGuard"
|
||||
},
|
||||
"7tv.de": {
|
||||
|
@ -994,10 +994,10 @@
|
|||
"companyId": "adjug"
|
||||
},
|
||||
"adjust": {
|
||||
"name": "Adjust",
|
||||
"name": "Adjust GmbH",
|
||||
"categoryId": 101,
|
||||
"url": "https://www.adjust.com/",
|
||||
"companyId": "adjust",
|
||||
"companyId": "applovin",
|
||||
"source": "AdGuard"
|
||||
},
|
||||
"adk2": {
|
||||
|
@ -2234,8 +2234,9 @@
|
|||
"alenty": {
|
||||
"name": "Alenty",
|
||||
"categoryId": 4,
|
||||
"url": "http://www.alenty.com/",
|
||||
"companyId": "appnexus"
|
||||
"url": "https://about.ads.microsoft.com/en-us/solutions/xandr/xandr-premium-programmatic-advertising",
|
||||
"companyId": "microsoft",
|
||||
"source": "AdGuard"
|
||||
},
|
||||
"alephd.com": {
|
||||
"name": "alephd",
|
||||
|
@ -2617,8 +2618,9 @@
|
|||
"appnexus": {
|
||||
"name": "AppNexus",
|
||||
"categoryId": 4,
|
||||
"url": "http://www.appnexus.com/",
|
||||
"companyId": "appnexus"
|
||||
"url": "https://about.ads.microsoft.com/en-us/solutions/xandr/xandr-premium-programmatic-advertising",
|
||||
"companyId": "microsoft",
|
||||
"source": "AdGuard"
|
||||
},
|
||||
"appsflyer": {
|
||||
"name": "AppsFlyer",
|
||||
|
@ -3359,7 +3361,7 @@
|
|||
"name": "Binge",
|
||||
"categoryId": 0,
|
||||
"url": "https://binge.com.au/",
|
||||
"companyId": "foxtel",
|
||||
"companyId": "news_corp",
|
||||
"source": "AdGuard"
|
||||
},
|
||||
"binlayer": {
|
||||
|
@ -7196,7 +7198,7 @@
|
|||
"name": "Flash",
|
||||
"categoryId": 0,
|
||||
"url": "https://flashnews.com.au/",
|
||||
"companyId": "foxtel",
|
||||
"companyId": "news_corp",
|
||||
"source": "AdGuard"
|
||||
},
|
||||
"flashtalking": {
|
||||
|
@ -7408,7 +7410,7 @@
|
|||
"name": "Fox Sports",
|
||||
"categoryId": 0,
|
||||
"url": "https://foxsports.com.au/",
|
||||
"companyId": "foxtel",
|
||||
"companyId": "news_corp",
|
||||
"source": "AdGuard"
|
||||
},
|
||||
"foxnews_static": {
|
||||
|
@ -7427,7 +7429,7 @@
|
|||
"name": "Foxtel",
|
||||
"categoryId": 0,
|
||||
"url": "https://foxtel.com.au/",
|
||||
"companyId": "foxtel",
|
||||
"companyId": "news_corp",
|
||||
"source": "AdGuard"
|
||||
},
|
||||
"foxydeal_com": {
|
||||
|
@ -7834,10 +7836,11 @@
|
|||
"companyId": null
|
||||
},
|
||||
"github": {
|
||||
"name": "GitHub",
|
||||
"name": "GitHub, Inc.",
|
||||
"categoryId": 2,
|
||||
"url": "https://github.com/",
|
||||
"companyId": "github"
|
||||
"companyId": "microsoft",
|
||||
"source": "AdGuard"
|
||||
},
|
||||
"github_apps": {
|
||||
"name": "GitHub Apps",
|
||||
|
@ -9529,10 +9532,11 @@
|
|||
"source": "AdGuard"
|
||||
},
|
||||
"ironsource": {
|
||||
"name": "ironSource",
|
||||
"name": "ironSource Ltd.",
|
||||
"categoryId": 4,
|
||||
"url": "https://www.ironsrc.com/",
|
||||
"companyId": "ironsource"
|
||||
"url": "https://www.is.com",
|
||||
"companyId": "unity",
|
||||
"source": "AdGuard"
|
||||
},
|
||||
"isocket": {
|
||||
"name": "isocket",
|
||||
|
@ -9924,7 +9928,7 @@
|
|||
"name": "Kayo Sports",
|
||||
"categoryId": 0,
|
||||
"url": "https://kayosports.com.au/",
|
||||
"companyId": "foxtel",
|
||||
"companyId": "news_corp",
|
||||
"source": "AdGuard"
|
||||
},
|
||||
"keen_io": {
|
||||
|
@ -11251,10 +11255,11 @@
|
|||
"companyId": "mediaad"
|
||||
},
|
||||
"mediaglu": {
|
||||
"name": "Mediaglu",
|
||||
"name": "MediaGlu",
|
||||
"categoryId": 4,
|
||||
"url": "http://mlnadvertising.com/",
|
||||
"companyId": "appnexus"
|
||||
"url": "https://www.mediaglu.com/",
|
||||
"companyId": "microsoft",
|
||||
"source": "AdGuard"
|
||||
},
|
||||
"mediahub": {
|
||||
"name": "MediaHub",
|
||||
|
@ -12762,8 +12767,9 @@
|
|||
"open_adstream": {
|
||||
"name": "Open Adstream",
|
||||
"categoryId": 4,
|
||||
"url": "https://www.appnexus.com/en",
|
||||
"companyId": "appnexus"
|
||||
"url": "https://about.ads.microsoft.com/en-us/solutions/xandr/xandr-premium-programmatic-advertising",
|
||||
"companyId": "microsoft",
|
||||
"source": "AdGuard"
|
||||
},
|
||||
"open_share_count": {
|
||||
"name": "Open Share Count",
|
||||
|
@ -14345,6 +14351,13 @@
|
|||
"url": "http://www.rdstation.com/en/",
|
||||
"companyId": "rd_station"
|
||||
},
|
||||
"rea_group": {
|
||||
"name": "REA Group Ltd.",
|
||||
"categoryId": 4,
|
||||
"url": "https://www.rea-group.com/",
|
||||
"companyId": "news_corp",
|
||||
"source": "AdGuard"
|
||||
},
|
||||
"reachforce": {
|
||||
"name": "ReachForce",
|
||||
"categoryId": 6,
|
||||
|
@ -14405,6 +14418,13 @@
|
|||
"url": "http://www.realclick.co.kr/",
|
||||
"companyId": "realclick"
|
||||
},
|
||||
"realestate.com.au": {
|
||||
"name": "realestate.com.au Pty Limited",
|
||||
"categoryId": 4,
|
||||
"url": "https://www.realestate.com.au/",
|
||||
"companyId": "news_corp",
|
||||
"source": "AdGuard"
|
||||
},
|
||||
"realperson.de": {
|
||||
"name": "Realperson Chat",
|
||||
"categoryId": 2,
|
||||
|
@ -15298,7 +15318,7 @@
|
|||
"sectigo": {
|
||||
"name": "Sectigo Limited",
|
||||
"categoryId": 5,
|
||||
"url": "https://www.solaredge.com/",
|
||||
"url": "https://www.sectigo.com",
|
||||
"companyId": "sectigo",
|
||||
"source": "AdGuard"
|
||||
},
|
||||
|
@ -16657,7 +16677,7 @@
|
|||
"name": "Streamotion",
|
||||
"categoryId": 0,
|
||||
"url": "https://streamotion.com.au/",
|
||||
"companyId": "foxtel",
|
||||
"companyId": "news_corp",
|
||||
"source": "AdGuard"
|
||||
},
|
||||
"streamrail.com": {
|
||||
|
@ -17762,10 +17782,11 @@
|
|||
"companyId": "amazon_associates"
|
||||
},
|
||||
"twitter": {
|
||||
"name": "Twitter",
|
||||
"name": "X (formerly Twitter)",
|
||||
"categoryId": 7,
|
||||
"url": "https://twitter.com",
|
||||
"companyId": "twitter"
|
||||
"companyId": "twitter",
|
||||
"source": "AdGuard"
|
||||
},
|
||||
"twitter_ads": {
|
||||
"name": "Twitter Advertising",
|
||||
|
@ -18746,6 +18767,13 @@
|
|||
"url": null,
|
||||
"companyId": null
|
||||
},
|
||||
"vungle": {
|
||||
"name": "Vungle",
|
||||
"categoryId": 4,
|
||||
"url": "https://vungle.com/",
|
||||
"companyId": "blackstone",
|
||||
"source": "AdGuard"
|
||||
},
|
||||
"vuukle": {
|
||||
"name": "Vuukle",
|
||||
"categoryId": 6,
|
||||
|
@ -22457,7 +22485,10 @@
|
|||
"delivery47.com": "ironsource",
|
||||
"ironsrc.com": "ironsource",
|
||||
"ironsrc.net": "ironsource",
|
||||
"is.com": "ironsource",
|
||||
"soom.la": "ironsource",
|
||||
"supersonicads.com": "ironsource",
|
||||
"tapjoy.com": "ironsource",
|
||||
"adsbyisocket.com": "isocket",
|
||||
"isocket.com": "isocket",
|
||||
"isolarcloud.com": "isolarcloud",
|
||||
|
@ -23571,6 +23602,7 @@
|
|||
"rcs.it": "rcs.it",
|
||||
"rcsmediagroup.it": "rcs.it",
|
||||
"d335luupugsy2.cloudfront.net": "rd_station",
|
||||
"rea-group.com": "rea_group",
|
||||
"d12ulf131zb0yj.cloudfront.net": "reachforce",
|
||||
"reachforce.com": "reachforce",
|
||||
"reachjunction.com": "reachjunction",
|
||||
|
@ -23586,6 +23618,7 @@
|
|||
"readme.io": "readme",
|
||||
"readspeaker.com": "readspeaker.com",
|
||||
"realclick.co.kr": "realclick",
|
||||
"realestate.com.au": "realestate.com.au",
|
||||
"realperson.de": "realperson.de",
|
||||
"powermarketing.com": "realtime",
|
||||
"realtime.co": "realtime",
|
||||
|
@ -24349,6 +24382,9 @@
|
|||
"trafmag.com": "trafmag.com",
|
||||
"api.transcend.io": "transcend",
|
||||
"cdn.transcend.io": "transcend",
|
||||
"sync-transcend-cdn.com": "transcend",
|
||||
"transcend-cdn.com": "transcend",
|
||||
"transcend.io": "transcend",
|
||||
"telemetry.transcend.io": "transcend_telemetry",
|
||||
"backoffice.transmatico.com": "transmatic",
|
||||
"travelaudience.com": "travel_audience",
|
||||
|
@ -24636,6 +24672,8 @@
|
|||
"v0cdn.net": "vscode",
|
||||
"vscode-cdn.net": "vscode",
|
||||
"vtracy.de": "vtracy.de",
|
||||
"liftoff.io": "vungle",
|
||||
"vungle.com": "vungle",
|
||||
"vuukle.com": "vuukle",
|
||||
"view.vzaar.com": "vzaar",
|
||||
"w3counter.com": "w3counter",
|
||||
|
|
|
@ -6,13 +6,14 @@
|
|||
}
|
||||
|
||||
.setup {
|
||||
min-height: calc(100vh - 71px);
|
||||
min-height: calc(100vh - 345px);
|
||||
line-height: 1.48;
|
||||
}
|
||||
|
||||
@media screen and (min-width: 768px) {
|
||||
.setup {
|
||||
padding: 50px 0;
|
||||
min-height: calc(100vh - 141px);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -15,6 +15,7 @@ const dnsConfig = handleActions(
|
|||
blocking_ipv4,
|
||||
blocking_ipv6,
|
||||
upstream_dns,
|
||||
fallback_dns,
|
||||
bootstrap_dns,
|
||||
local_ptr_upstreams,
|
||||
...values
|
||||
|
@ -26,6 +27,7 @@ const dnsConfig = handleActions(
|
|||
blocking_ipv4: blocking_ipv4 || DEFAULT_BLOCKING_IPV4,
|
||||
blocking_ipv6: blocking_ipv6 || DEFAULT_BLOCKING_IPV6,
|
||||
upstream_dns: (upstream_dns && upstream_dns.join('\n')) || '',
|
||||
fallback_dns: (fallback_dns && fallback_dns.join('\n')) || '',
|
||||
bootstrap_dns: (bootstrap_dns && bootstrap_dns.join('\n')) || '',
|
||||
local_ptr_upstreams: (local_ptr_upstreams && local_ptr_upstreams.join('\n')) || '',
|
||||
processingGetConfig: false,
|
||||
|
|
|
@ -20,9 +20,9 @@ const services = handleActions(
|
|||
processingAll: false,
|
||||
}),
|
||||
|
||||
[actions.setBlockedServicesRequest]: (state) => ({ ...state, processingSet: true }),
|
||||
[actions.setBlockedServicesFailure]: (state) => ({ ...state, processingSet: false }),
|
||||
[actions.setBlockedServicesSuccess]: (state) => ({
|
||||
[actions.updateBlockedServicesRequest]: (state) => ({ ...state, processingSet: true }),
|
||||
[actions.updateBlockedServicesFailure]: (state) => ({ ...state, processingSet: false }),
|
||||
[actions.updateBlockedServicesSuccess]: (state) => ({
|
||||
...state,
|
||||
processingSet: false,
|
||||
}),
|
||||
|
@ -31,7 +31,7 @@ const services = handleActions(
|
|||
processing: true,
|
||||
processingAll: true,
|
||||
processingSet: false,
|
||||
list: [],
|
||||
list: {},
|
||||
allServices: [],
|
||||
},
|
||||
);
|
||||
|
|
|
@ -58,6 +58,8 @@ const stats = handleActions(
|
|||
num_replaced_safebrowsing: numReplacedSafebrowsing,
|
||||
num_replaced_safesearch: numReplacedSafesearch,
|
||||
avg_processing_time: avgProcessingTime,
|
||||
top_upstreams_responses: topUpstreamsResponses,
|
||||
top_upstrems_avg_time: topUpstreamsAvgTime,
|
||||
} = payload;
|
||||
|
||||
const newState = {
|
||||
|
@ -77,6 +79,8 @@ const stats = handleActions(
|
|||
numReplacedSafebrowsing,
|
||||
numReplacedSafesearch,
|
||||
avgProcessingTime,
|
||||
topUpstreamsResponses,
|
||||
topUpstreamsAvgTime,
|
||||
};
|
||||
|
||||
return newState;
|
||||
|
|
34
go.mod
34
go.mod
|
@ -3,9 +3,9 @@ module github.com/AdguardTeam/AdGuardHome
|
|||
go 1.20
|
||||
|
||||
require (
|
||||
github.com/AdguardTeam/dnsproxy v0.52.1-0.20230726165924-30c459b0cdef
|
||||
github.com/AdguardTeam/golibs v0.13.6
|
||||
github.com/AdguardTeam/urlfilter v0.16.1
|
||||
github.com/AdguardTeam/dnsproxy v0.54.0
|
||||
github.com/AdguardTeam/golibs v0.15.0
|
||||
github.com/AdguardTeam/urlfilter v0.17.0
|
||||
github.com/NYTimes/gziphandler v1.1.1
|
||||
github.com/ameshkov/dnscrypt/v2 v2.2.7
|
||||
github.com/bluele/gcache v0.0.2
|
||||
|
@ -16,8 +16,8 @@ require (
|
|||
github.com/google/go-cmp v0.5.9
|
||||
github.com/google/gopacket v1.1.19
|
||||
github.com/google/renameio/v2 v2.0.0
|
||||
github.com/google/uuid v1.3.0
|
||||
github.com/insomniacslk/dhcp v0.0.0-20230720093626-5648422c16cd
|
||||
github.com/google/uuid v1.3.1
|
||||
github.com/insomniacslk/dhcp v0.0.0-20230816195147-b3ca2534940d
|
||||
github.com/josharian/native v1.1.1-0.20230202152459-5c7d0dd6ab86
|
||||
github.com/kardianos/service v1.2.2
|
||||
github.com/mdlayher/ethernet v0.0.0-20220221185849-529eae5b6118
|
||||
|
@ -27,17 +27,14 @@ require (
|
|||
// own code for that. Perhaps, use gopacket.
|
||||
github.com/mdlayher/raw v0.1.0
|
||||
github.com/miekg/dns v1.1.55
|
||||
// TODO(a.garipov): Update to ≥ v0.37.0 once we update to Go 1.20.
|
||||
github.com/quic-go/quic-go v0.36.2
|
||||
github.com/quic-go/quic-go v0.38.0
|
||||
github.com/stretchr/testify v1.8.4
|
||||
github.com/ti-mo/netfilter v0.5.0
|
||||
go.etcd.io/bbolt v1.3.7
|
||||
golang.org/x/crypto v0.11.0
|
||||
// TODO(a.garipov): Update after updating slices.Sort and friends to
|
||||
// stdlib versions in dnsproxy and golibs in Go 1.20.
|
||||
golang.org/x/exp v0.0.0-20230724220655-d98519c11495
|
||||
golang.org/x/net v0.12.0
|
||||
golang.org/x/sys v0.10.0
|
||||
golang.org/x/crypto v0.12.0
|
||||
golang.org/x/exp v0.0.0-20230817173708-d852ddb80c63
|
||||
golang.org/x/net v0.14.0
|
||||
golang.org/x/sys v0.11.0
|
||||
gopkg.in/natefinch/lumberjack.v2 v2.2.1
|
||||
gopkg.in/yaml.v3 v3.0.1
|
||||
howett.net/plist v1.0.0
|
||||
|
@ -51,19 +48,18 @@ require (
|
|||
github.com/davecgh/go-spew v1.1.1 // indirect
|
||||
github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 // indirect
|
||||
github.com/golang/mock v1.6.0 // indirect
|
||||
github.com/google/pprof v0.0.0-20230705174524-200ffdc848b8 // indirect
|
||||
github.com/google/pprof v0.0.0-20230821062121-407c9e7a662f // indirect
|
||||
github.com/mdlayher/socket v0.4.1 // indirect
|
||||
github.com/onsi/ginkgo/v2 v2.11.0 // indirect
|
||||
github.com/onsi/ginkgo/v2 v2.12.0 // indirect
|
||||
github.com/patrickmn/go-cache v2.1.0+incompatible // indirect
|
||||
github.com/pierrec/lz4/v4 v4.1.18 // indirect
|
||||
github.com/pkg/errors v0.9.1 // indirect
|
||||
github.com/pmezard/go-difflib v1.0.0 // indirect
|
||||
github.com/quic-go/qpack v0.4.0 // indirect
|
||||
github.com/quic-go/qtls-go1-19 v0.3.2 // indirect
|
||||
github.com/quic-go/qtls-go1-20 v0.2.2 // indirect
|
||||
github.com/quic-go/qtls-go1-20 v0.3.3 // indirect
|
||||
github.com/u-root/uio v0.0.0-20230305220412-3e8cd9d6bf63 // indirect
|
||||
golang.org/x/mod v0.12.0 // indirect
|
||||
golang.org/x/sync v0.3.0 // indirect
|
||||
golang.org/x/text v0.11.0 // indirect
|
||||
golang.org/x/tools v0.11.0 // indirect
|
||||
golang.org/x/text v0.12.0 // indirect
|
||||
golang.org/x/tools v0.12.1-0.20230815132531-74c255bcf846 // indirect
|
||||
)
|
||||
|
|
106
go.sum
106
go.sum
|
@ -1,16 +1,11 @@
|
|||
github.com/AdguardTeam/dnsproxy v0.52.1-0.20230726165924-30c459b0cdef h1:3ZJieG+PV+wJEXLgUndW4yL9/7iubyipbDmA0w3sa7Y=
|
||||
github.com/AdguardTeam/dnsproxy v0.52.1-0.20230726165924-30c459b0cdef/go.mod h1:Jo2zeRe97Rxt3yikXc+fn0LdLtqCj0Xlyh1PNBj6bpM=
|
||||
github.com/AdguardTeam/golibs v0.4.0/go.mod h1:skKsDKIBB7kkFflLJBpfGX+G8QFTx0WKUzB6TIgtUj4=
|
||||
github.com/AdguardTeam/golibs v0.10.4/go.mod h1:rSfQRGHIdgfxriDDNgNJ7HmE5zRoURq8R+VdR81Zuzw=
|
||||
github.com/AdguardTeam/golibs v0.13.6 h1:z/0Q25pRLdaQxtoxvfSaooz5mdv8wj0R8KREj54q8yQ=
|
||||
github.com/AdguardTeam/golibs v0.13.6/go.mod h1:hOtcb8dPfKcFjWTPA904hTA4dl1aWvzeebdJpE72IPk=
|
||||
github.com/AdguardTeam/gomitmproxy v0.2.0/go.mod h1:Qdv0Mktnzer5zpdpi5rAwixNJzW2FN91LjKJCkVbYGU=
|
||||
github.com/AdguardTeam/urlfilter v0.16.1 h1:ZPi0rjqo8cQf2FVdzo6cqumNoHZx2KPXj2yZa1A5BBw=
|
||||
github.com/AdguardTeam/urlfilter v0.16.1/go.mod h1:46YZDOV1+qtdRDuhZKVPSSp7JWWes0KayqHrKAFBdEI=
|
||||
github.com/AdguardTeam/dnsproxy v0.54.0 h1:OgSitM/EKrMMOi+guWZNwaU1cqRqJKWgR3l3fPWWayI=
|
||||
github.com/AdguardTeam/dnsproxy v0.54.0/go.mod h1:tG/treaQekcKnugYoKOfm8vt3JGi6CliWta0MkQr15U=
|
||||
github.com/AdguardTeam/golibs v0.15.0 h1:yOv/fdVkJIOWKr0NlUXAE9RA0DK9GKiBbiGzq47vY7o=
|
||||
github.com/AdguardTeam/golibs v0.15.0/go.mod h1:66ZLs8P7nk/3IfKroQ1rqtieLk+5eXYXMBKXlVL7KeI=
|
||||
github.com/AdguardTeam/urlfilter v0.17.0 h1:tUzhtR9wMx704GIP3cibsDQJrixlMHfwoQbYJfPdFow=
|
||||
github.com/AdguardTeam/urlfilter v0.17.0/go.mod h1:bbuZjPUzm/Ip+nz5qPPbwIP+9rZyQbQad8Lt/0fCulU=
|
||||
github.com/NYTimes/gziphandler v1.1.1 h1:ZUDjpQae29j0ryrS0u/B8HZfJBtBQHjqw2rQ2cqUQ3I=
|
||||
github.com/NYTimes/gziphandler v1.1.1/go.mod h1:n/CVRwUEOgIxrgPvAQhUUr9oeUtvrhMomdKFjzJNB0c=
|
||||
github.com/StackExchange/wmi v1.2.1 h1:VIkavFPXSjcnS+O8yTq7NI32k0R5Aj+v39y29VYDOSA=
|
||||
github.com/StackExchange/wmi v1.2.1/go.mod h1:rcmrprowKIVzvc+NUiLncP2uuArMWLCbu9SBzvHz7e8=
|
||||
github.com/aead/chacha20 v0.0.0-20180709150244-8b13a72661da h1:KjTM2ks9d14ZYCvmHS9iAKVt9AyzRSqNU1qabPih5BY=
|
||||
github.com/aead/chacha20 v0.0.0-20180709150244-8b13a72661da/go.mod h1:eHEWzANqSiWQsof+nXEI9bUVUyV6F53Fp89EuCh2EAA=
|
||||
github.com/aead/poly1305 v0.0.0-20180717145839-3fee0db0b635 h1:52m0LGchQBBVqJRyYYufQuIbVqRawmubW3OFGqK1ekw=
|
||||
|
@ -23,7 +18,6 @@ github.com/beefsack/go-rate v0.0.0-20220214233405-116f4ca011a0 h1:0b2vaepXIfMsG+
|
|||
github.com/beefsack/go-rate v0.0.0-20220214233405-116f4ca011a0/go.mod h1:6YNgTHLutezwnBvyneBbwvB8C82y3dcoOj5EQJIdGXA=
|
||||
github.com/bluele/gcache v0.0.2 h1:WcbfdXICg7G/DGBh1PFfcirkWOQV+v077yF1pSy3DGw=
|
||||
github.com/bluele/gcache v0.0.2/go.mod h1:m15KV+ECjptwSPxKhOhQoAFQVtUFjTVkc3H8o0t/fp0=
|
||||
github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
|
||||
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
|
||||
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||
|
@ -34,8 +28,7 @@ github.com/dimfeld/httptreemux/v5 v5.5.0/go.mod h1:QeEylH57C0v3VO0tkKraVz9oD3Uu9
|
|||
github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY=
|
||||
github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw=
|
||||
github.com/go-logr/logr v1.2.4 h1:g01GSCwiDw2xSZfjJ2/T9M+S6pFdcNtFYsp+Y43HYDQ=
|
||||
github.com/go-ole/go-ole v1.2.5 h1:t4MGB5xEDZvXI+0rMjjsfBsD7yAgp/s9ZDkL1JndXwY=
|
||||
github.com/go-ole/go-ole v1.2.5/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0=
|
||||
github.com/go-ole/go-ole v1.2.6 h1:/Fpf6oFPoeFik9ty7siob0G6Ke8QvQEuVcuChpwXzpY=
|
||||
github.com/go-ping/ping v1.1.0 h1:3MCGhVX4fyEUuhsfwPrsEdQw6xspHkv5zHsiSoDFZYw=
|
||||
github.com/go-ping/ping v1.1.0/go.mod h1:xIFjORFzTxqIV/tDVGO4eDy/bLuSyawEeojSm3GfRGk=
|
||||
github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 h1:tfuBGBXKqDEevZMzYi5KSi8KkcZtzBcTgAUUtapy0OI=
|
||||
|
@ -50,16 +43,16 @@ github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38=
|
|||
github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
|
||||
github.com/google/gopacket v1.1.19 h1:ves8RnFZPGiFnTS0uPQStjwru6uO6h+nlr9j6fL7kF8=
|
||||
github.com/google/gopacket v1.1.19/go.mod h1:iJ8V8n6KS+z2U1A8pUwu8bW5SyEMkXJB8Yo/Vo+TKTo=
|
||||
github.com/google/pprof v0.0.0-20230705174524-200ffdc848b8 h1:n6vlPhxsA+BW/XsS5+uqi7GyzaLa5MH7qlSLBZtRdiA=
|
||||
github.com/google/pprof v0.0.0-20230705174524-200ffdc848b8/go.mod h1:Jh3hGz2jkYak8qXPD19ryItVnUgpgeqzdkY/D0EaeuA=
|
||||
github.com/google/pprof v0.0.0-20230821062121-407c9e7a662f h1:pDhu5sgp8yJlEF/g6osliIIpF9K4F5jvkULXa4daRDQ=
|
||||
github.com/google/pprof v0.0.0-20230821062121-407c9e7a662f/go.mod h1:czg5+yv1E0ZGTi6S6vVK1mke0fV+FaUhNGcd6VRS9Ik=
|
||||
github.com/google/renameio/v2 v2.0.0 h1:UifI23ZTGY8Tt29JbYFiuyIU3eX+RNFtUwefq9qAhxg=
|
||||
github.com/google/renameio/v2 v2.0.0/go.mod h1:BtmJXm5YlszgC+TD4HOEEUFgkJP3nLxehU6hfe7jRt4=
|
||||
github.com/google/uuid v1.2.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
|
||||
github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I=
|
||||
github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
|
||||
github.com/google/uuid v1.3.1 h1:KjJaJ9iWZ3jOFZIf1Lqf4laDRCasjl0BCmnEGxkdLb4=
|
||||
github.com/google/uuid v1.3.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
|
||||
github.com/hugelgupf/socketpair v0.0.0-20190730060125-05d35a94e714 h1:/jC7qQFrv8CrSJVmaolDVOxTfS9kc36uB6H40kdbQq8=
|
||||
github.com/insomniacslk/dhcp v0.0.0-20230720093626-5648422c16cd h1:D772X7igTag7yKErVWAR7boXpOml3fqqBzH1wNaD/jk=
|
||||
github.com/insomniacslk/dhcp v0.0.0-20230720093626-5648422c16cd/go.mod h1:7474bZ1YNCvarT6WFKie4kEET6J0KYRDC4XJqqXzQW4=
|
||||
github.com/insomniacslk/dhcp v0.0.0-20230816195147-b3ca2534940d h1:Ka64cclWedOkGzm9M2/XYuwJUdmWRUozmsxW0PyKA3A=
|
||||
github.com/insomniacslk/dhcp v0.0.0-20230816195147-b3ca2534940d/go.mod h1:7474bZ1YNCvarT6WFKie4kEET6J0KYRDC4XJqqXzQW4=
|
||||
github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI=
|
||||
github.com/josharian/native v1.0.0/go.mod h1:7X/raswPFr05uY3HiLlYeyQntB6OO7E/d2Cu7qoaN2w=
|
||||
github.com/josharian/native v1.0.1-0.20221213033349-c1e37c09b531/go.mod h1:7X/raswPFr05uY3HiLlYeyQntB6OO7E/d2Cu7qoaN2w=
|
||||
|
@ -67,10 +60,8 @@ github.com/josharian/native v1.1.1-0.20230202152459-5c7d0dd6ab86 h1:elKwZS1OcdQ0
|
|||
github.com/josharian/native v1.1.1-0.20230202152459-5c7d0dd6ab86/go.mod h1:aFAMtuldEgx/4q7iSGazk22+IcgvtiC+HIimFO9XlS8=
|
||||
github.com/kardianos/service v1.2.2 h1:ZvePhAHfvo0A7Mftk/tEzqEZ7Q4lgnR8sGz4xu1YX60=
|
||||
github.com/kardianos/service v1.2.2/go.mod h1:CIMRFEJVL+0DS1a3Nx06NaMn4Dz63Ng6O7dl0qH0zVM=
|
||||
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
|
||||
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
|
||||
github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
|
||||
github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
|
||||
github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0 h1:6E+4a0GO5zZEnZ81pIr0yLvtUWk2if982qA3F3QD6H4=
|
||||
github.com/mdlayher/ethernet v0.0.0-20220221185849-529eae5b6118 h1:2oDp6OOhLxQ9JBoUuysVz9UZ9uI6oLUbvAZu0x8o+vE=
|
||||
github.com/mdlayher/ethernet v0.0.0-20220221185849-529eae5b6118/go.mod h1:ZFUnHIVchZ9lJoWoEGUg8Q3M4U8aNNWA3CVSUTkW4og=
|
||||
github.com/mdlayher/netlink v0.0.0-20190313131330-258ea9dff42c/go.mod h1:eQB3mZE4aiYnlUsyGGCOpPETfdQq4Jhsgf1fk3cwQaA=
|
||||
|
@ -84,14 +75,12 @@ github.com/mdlayher/raw v0.1.0/go.mod h1:yXnxvs6c0XoF/aK52/H5PjsVHmWBCFfZUfoh/Y5
|
|||
github.com/mdlayher/socket v0.2.1/go.mod h1:QLlNPkFR88mRUNQIzRBMfXxwKal8H7u1h3bL1CV+f0E=
|
||||
github.com/mdlayher/socket v0.4.1 h1:eM9y2/jlbs1M615oshPQOHZzj6R6wMT7bX5NPiQvn2U=
|
||||
github.com/mdlayher/socket v0.4.1/go.mod h1:cAqeGjoufqdxWkD7DkpyS+wcefOtmu5OQ8KuoJGIReA=
|
||||
github.com/miekg/dns v1.1.43/go.mod h1:+evo5L0630/F6ca/Z9+GAqzhjGyn8/c+TBaOyfEl0V4=
|
||||
github.com/miekg/dns v1.1.55 h1:GoQ4hpsj0nFLYe+bWiCToyrBEJXkQfOOIvFGFy0lEgo=
|
||||
github.com/miekg/dns v1.1.55/go.mod h1:uInx36IzPl7FYnDcMeVWxj9byh7DutNykX4G9Sj60FY=
|
||||
github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e h1:fD57ERR4JtEqsWbfPhv4DMiApHyliiK5xCTNVSPiaAs=
|
||||
github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno=
|
||||
github.com/onsi/ginkgo/v2 v2.11.0 h1:WgqUCUt/lT6yXoQ8Wef0fsNn5cAuMK7+KT9UFRz2tcU=
|
||||
github.com/onsi/ginkgo/v2 v2.11.0/go.mod h1:ZhrRA5XmEE3x3rhlzamx/JJvujdZoJ2uvgI7kR0iZvM=
|
||||
github.com/onsi/gomega v1.27.8 h1:gegWiwZjBsf2DgiSbf5hpokZ98JVDMcWkUiigk6/KXc=
|
||||
github.com/onsi/ginkgo/v2 v2.12.0 h1:UIVDowFPwpg6yMUpPjGkYvf06K3RAiJXUhCxEwQVHRI=
|
||||
github.com/onsi/ginkgo/v2 v2.12.0/go.mod h1:ZNEzXISYlqpb8S36iN71ifqLi3vVD1rVJGvWRCJOUpQ=
|
||||
github.com/onsi/gomega v1.27.10 h1:naR28SdDFlqrG6kScpT8VWpu1xWY5nJRCF3XaYyBjhI=
|
||||
github.com/patrickmn/go-cache v2.1.0+incompatible h1:HRMgzkcYKYpi3C8ajMPV8OFXaaRUnok+kx1WdO15EQc=
|
||||
github.com/patrickmn/go-cache v2.1.0+incompatible/go.mod h1:3Qf8kWWT7OJRJbdiICTKqZju1ZixQ/KpMGzzAfe6+WQ=
|
||||
github.com/pierrec/lz4/v4 v4.1.14/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4=
|
||||
|
@ -102,42 +91,38 @@ github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
|
|||
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
|
||||
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
|
||||
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
||||
github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c h1:ncq/mPwQF4JjgDlrVEn3C11VoGHZN7m8qihwgMEtzYw=
|
||||
github.com/quic-go/qpack v0.4.0 h1:Cr9BXA1sQS2SmDUWjSofMPNKmvF6IiIfDRmgU0w1ZCo=
|
||||
github.com/quic-go/qpack v0.4.0/go.mod h1:UZVnYIfi5GRk+zI9UMaCPsmZ2xKJP7XBUvVyT1Knj9A=
|
||||
github.com/quic-go/qtls-go1-19 v0.3.2 h1:tFxjCFcTQzK+oMxG6Zcvp4Dq8dx4yD3dDiIiyc86Z5U=
|
||||
github.com/quic-go/qtls-go1-19 v0.3.2/go.mod h1:ySOI96ew8lnoKPtSqx2BlI5wCpUVPT05RMAlajtnyOI=
|
||||
github.com/quic-go/qtls-go1-20 v0.2.2 h1:WLOPx6OY/hxtTxKV1Zrq20FtXtDEkeY00CGQm8GEa3E=
|
||||
github.com/quic-go/qtls-go1-20 v0.2.2/go.mod h1:JKtK6mjbAVcUTN/9jZpvLbGxvdWIKS8uT7EiStoU1SM=
|
||||
github.com/quic-go/quic-go v0.36.2 h1:ZX/UNQ4gvpCv2RmwdbA6lrRjF6EBm5yZ7TMoT4NQVrA=
|
||||
github.com/quic-go/quic-go v0.36.2/go.mod h1:zPetvwDlILVxt15n3hr3Gf/I3mDf7LpLKPhR4Ez0AZQ=
|
||||
github.com/shirou/gopsutil/v3 v3.21.8 h1:nKct+uP0TV8DjjNiHanKf8SAuub+GNsbrOtM9Nl9biA=
|
||||
github.com/shirou/gopsutil/v3 v3.21.8/go.mod h1:YWp/H8Qs5fVmf17v7JNZzA0mPJ+mS2e9JdiUF9LlKzQ=
|
||||
github.com/quic-go/qtls-go1-20 v0.3.3 h1:17/glZSLI9P9fDAeyCHBFSWSqJcwx1byhLwP5eUIDCM=
|
||||
github.com/quic-go/qtls-go1-20 v0.3.3/go.mod h1:X9Nh97ZL80Z+bX/gUXMbipO6OxdiDi58b/fMC9mAL+k=
|
||||
github.com/quic-go/quic-go v0.38.0 h1:T45lASr5q/TrVwt+jrVccmqHhPL2XuSyoCLVCpfOSLc=
|
||||
github.com/quic-go/quic-go v0.38.0/go.mod h1:MPCuRq7KBK2hNcfKj/1iD1BGuN3eAYMeNxp3T42LRUg=
|
||||
github.com/shirou/gopsutil/v3 v3.23.7 h1:C+fHO8hfIppoJ1WdsVm1RoI0RwXoNdfTK7yWXV0wVj4=
|
||||
github.com/shoenig/go-m1cpu v0.1.6 h1:nxdKQNcEB6vzgA2E2bvzKIYRuNj7XNJ4S/aRSwKzFtM=
|
||||
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
||||
github.com/stretchr/objx v0.5.0 h1:1zr/of2m5FGMsad5YfcqgdqdWrIhu+EBEJRhR1U7z/c=
|
||||
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
|
||||
github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=
|
||||
github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
|
||||
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
|
||||
github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk=
|
||||
github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=
|
||||
github.com/ti-mo/netfilter v0.2.0/go.mod h1:8GbBGsY/8fxtyIdfwy29JiluNcPK4K7wIT+x42ipqUU=
|
||||
github.com/ti-mo/netfilter v0.5.0 h1:MZmsUw5bFRecOb0AeyjOPxTHg4UxYzyEs0Ek/6Lxoy8=
|
||||
github.com/ti-mo/netfilter v0.5.0/go.mod h1:nt+8B9hx/QpqHr7Hazq+2qMCCA8u2OTkyc/7+U9ARz8=
|
||||
github.com/tklauser/go-sysconf v0.3.9 h1:JeUVdAOWhhxVcU6Eqr/ATFHgXk/mmiItdKeJPev3vTo=
|
||||
github.com/tklauser/go-sysconf v0.3.9/go.mod h1:11DU/5sG7UexIrp/O6g35hrWzu0JxlwQ3LSFUzyeuhs=
|
||||
github.com/tklauser/numcpus v0.3.0 h1:ILuRUQBtssgnxw0XXIjKUC56fgnOrFoQQ/4+DeU2biQ=
|
||||
github.com/tklauser/numcpus v0.3.0/go.mod h1:yFGUr7TUHQRAhyqBcEg0Ge34zDBAsIvJJcyE6boqnA8=
|
||||
github.com/tklauser/go-sysconf v0.3.11 h1:89WgdJhk5SNwJfu+GKyYveZ4IaJ7xAkecBo+KdJV0CM=
|
||||
github.com/tklauser/numcpus v0.6.0 h1:kebhY2Qt+3U6RNK7UqpYNA+tJ23IBEGKkB7JQBfDYms=
|
||||
github.com/u-root/uio v0.0.0-20230305220412-3e8cd9d6bf63 h1:YcojQL98T/OO+rybuzn2+5KrD5dBwXIvYBvQ2cD3Avg=
|
||||
github.com/u-root/uio v0.0.0-20230305220412-3e8cd9d6bf63/go.mod h1:eLL9Nub3yfAho7qB0MzZizFhTU2QkLeoVsWdHtDW264=
|
||||
github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=
|
||||
github.com/yusufpapurcu/wmi v1.2.3 h1:E1ctvB7uKFMOJw3fdOW32DwGE9I7t++CRUEMKvFoFiw=
|
||||
go.etcd.io/bbolt v1.3.7 h1:j+zJOnnEjF/kyHlDDgGnVL/AIqIJPq8UoB2GSNfkUfQ=
|
||||
go.etcd.io/bbolt v1.3.7/go.mod h1:N9Mkw9X8x5fupy0IKsmuqVtoGDyxsaDlbk4Rd05IAQw=
|
||||
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
|
||||
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
||||
golang.org/x/crypto v0.11.0 h1:6Ewdq3tDic1mg5xRO4milcWCfMVQhI4NkqWWvqejpuA=
|
||||
golang.org/x/crypto v0.11.0/go.mod h1:xgJhtzW8F9jGdVFWZESrid1U1bjeNy4zgy5cRr/CIio=
|
||||
golang.org/x/exp v0.0.0-20230724220655-d98519c11495 h1:zKGKw2WlGb8oPoRGqQ2PT8g2YoCN1w/YbbQjHXCdUWE=
|
||||
golang.org/x/exp v0.0.0-20230724220655-d98519c11495/go.mod h1:FXUEEKJgO7OQYeo8N01OfiKP8RXMtf6e8aTskBGqWdc=
|
||||
golang.org/x/crypto v0.12.0 h1:tFM/ta59kqch6LlvYnPa0yx5a83cL2nHflFhYKvv9Yk=
|
||||
golang.org/x/crypto v0.12.0/go.mod h1:NF0Gs7EO5K4qLn+Ylc+fih8BSTeIjAP05siRnAh98yw=
|
||||
golang.org/x/exp v0.0.0-20230817173708-d852ddb80c63 h1:m64FZMko/V45gv0bNmrNYoDEq8U5YUhetc9cBWKS1TQ=
|
||||
golang.org/x/exp v0.0.0-20230817173708-d852ddb80c63/go.mod h1:0v4NqG35kSWCMzLaMeX+IQrlSnVE/bqGSyC2cz/9Le8=
|
||||
golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=
|
||||
golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=
|
||||
golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
|
||||
|
@ -148,12 +133,10 @@ golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn
|
|||
golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
||||
golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks=
|
||||
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||
golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
|
||||
golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc=
|
||||
golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=
|
||||
golang.org/x/net v0.0.0-20210929193557-e81a3d93ecf6/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
|
||||
golang.org/x/net v0.12.0 h1:cfawfvKITfUsFCeJIHJrbSxpeu/E81khclypR0GVT50=
|
||||
golang.org/x/net v0.12.0/go.mod h1:zEVYFnQC7m/vmpQFELhcD1EWkZlX69l4oqgmer6hfKA=
|
||||
golang.org/x/net v0.14.0 h1:BONx9s002vGdD9umnlX1Po8vOZmrgH34qlHcD1MfK14=
|
||||
golang.org/x/net v0.14.0/go.mod h1:PpSgVXXLK0OxS0F31C1/tv6XNguvCrnXIDrFMspZIUI=
|
||||
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
golang.org/x/sync v0.3.0 h1:ftCYgMx6zT/asHUrPw8BLLscYtGznsLAnjq5RH9P66E=
|
||||
|
@ -162,37 +145,29 @@ golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5h
|
|||
golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20190322080309-f49334f85ddc/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20201015000850-e3ed0017c211/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20210303074136-134d130e1a04/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.0.0-20210816074244-15123e1e1f71/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.0.0-20210909193231-528a39cd75f3/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.0.0-20220622161953-175b2fd9d664/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.4.1-0.20230131160137-e7d7f63158de/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.10.0 h1:SqMFp9UcQJZa+pmYuAKjd9xq1f0j5rLcDIk0mj4qAsA=
|
||||
golang.org/x/sys v0.10.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.11.0 h1:eG7RXZHdqOJ1i+0lgLgCpSXAp6M3LYlAo6osgSi0xOM=
|
||||
golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
|
||||
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
||||
golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
|
||||
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
||||
golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
||||
golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
|
||||
golang.org/x/text v0.11.0 h1:LAntKIrcmeSKERyiOh0XMV39LXS8IE9UL2yP7+f5ij4=
|
||||
golang.org/x/text v0.11.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=
|
||||
golang.org/x/text v0.12.0 h1:k+n5B8goJNdU7hSvEtMUz3d1Q6D/XW4COJSJR6fN0mc=
|
||||
golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=
|
||||
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
||||
golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
|
||||
golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
|
||||
golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
|
||||
golang.org/x/tools v0.11.0 h1:EMCa6U9S2LtZXLAMoWiR/R8dAQFRqbAitmbJ2UKhoi8=
|
||||
golang.org/x/tools v0.11.0/go.mod h1:anzJrxPjNtfgiYQYirP2CPGzGLxrH2u2QBhn6Bf3qY8=
|
||||
golang.org/x/tools v0.12.1-0.20230815132531-74c255bcf846 h1:Vve/L0v7CXXuxUmaMGIEK/dEeq7uiqb5qBgQrZzIE7E=
|
||||
golang.org/x/tools v0.12.1-0.20230815132531-74c255bcf846/go.mod h1:Sc0INKfu04TlqNoRA1hgpFZbhYXHPr4V5DzpSBTPqQM=
|
||||
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||
|
@ -200,12 +175,9 @@ golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8T
|
|||
google.golang.org/protobuf v1.28.0 h1:w43yiav+6bVFTBQFZX0r7ipe9JQ1QsbMgHwbBziscLw=
|
||||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||
gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f h1:BLraFXnmrev5lT+xlilqcH8XK9/i0At2xKjWk4p6zsU=
|
||||
gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||
gopkg.in/natefinch/lumberjack.v2 v2.2.1 h1:bBRl1b0OH9s/DuPhuXpNl+VtCaJXFZ5/uEFST95x9zc=
|
||||
gopkg.in/natefinch/lumberjack.v2 v2.2.1/go.mod h1:YD8tP3GAjkrDg1eZH7EGmyESg/lsYskCTPBJVb9jqSc=
|
||||
gopkg.in/yaml.v1 v1.0.0-20140924161607-9f9df34309c0/go.mod h1:WDnlLJ4WF5VGsH/HVa3CI79GS0ol3YnhVnKP89i0kNg=
|
||||
gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
||||
gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
||||
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
||||
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
|
||||
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
||||
|
|
|
@ -2,7 +2,6 @@
|
|||
package aghhttp
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"io"
|
||||
"net/http"
|
||||
|
@ -61,23 +60,3 @@ func WriteTextPlainDeprecated(w http.ResponseWriter, r *http.Request) (isPlainTe
|
|||
|
||||
return true
|
||||
}
|
||||
|
||||
// WriteJSONResponse sets the content-type header in w.Header() to
|
||||
// "application/json", writes a header with a "200 OK" status, encodes resp to
|
||||
// w, calls [Error] on any returned error, and returns it as well.
|
||||
func WriteJSONResponse(w http.ResponseWriter, r *http.Request, resp any) (err error) {
|
||||
return WriteJSONResponseCode(w, r, http.StatusOK, resp)
|
||||
}
|
||||
|
||||
// WriteJSONResponseCode is like [WriteJSONResponse] but adds the ability to
|
||||
// redefine the status code.
|
||||
func WriteJSONResponseCode(w http.ResponseWriter, r *http.Request, code int, resp any) (err error) {
|
||||
w.Header().Set(httphdr.ContentType, HdrValApplicationJSON)
|
||||
w.WriteHeader(code)
|
||||
err = json.NewEncoder(w).Encode(resp)
|
||||
if err != nil {
|
||||
Error(r, w, http.StatusInternalServerError, "encoding resp: %s", err)
|
||||
}
|
||||
|
||||
return err
|
||||
}
|
||||
|
|
|
@ -4,6 +4,7 @@ package aghhttp
|
|||
|
||||
// HTTP header value constants.
|
||||
const (
|
||||
HdrValApplicationJSON = "application/json"
|
||||
HdrValTextPlain = "text/plain"
|
||||
HdrValApplicationJSON = "application/json"
|
||||
HdrValStrictTransportSecurity = "max-age=31536000; includeSubDomains"
|
||||
HdrValTextPlain = "text/plain"
|
||||
)
|
||||
|
|
142
internal/aghhttp/json.go
Normal file
142
internal/aghhttp/json.go
Normal file
|
@ -0,0 +1,142 @@
|
|||
package aghhttp
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"net/http"
|
||||
"strconv"
|
||||
"time"
|
||||
|
||||
"github.com/AdguardTeam/golibs/httphdr"
|
||||
"github.com/AdguardTeam/golibs/log"
|
||||
)
|
||||
|
||||
// JSON Utilities
|
||||
|
||||
// nsecPerMsec is the number of nanoseconds in a millisecond.
|
||||
const nsecPerMsec = float64(time.Millisecond / time.Nanosecond)
|
||||
|
||||
// JSONDuration is a time.Duration that can be decoded from JSON and encoded
|
||||
// into JSON according to our API conventions.
|
||||
type JSONDuration time.Duration
|
||||
|
||||
// type check
|
||||
var _ json.Marshaler = JSONDuration(0)
|
||||
|
||||
// MarshalJSON implements the json.Marshaler interface for JSONDuration. err is
|
||||
// always nil.
|
||||
func (d JSONDuration) MarshalJSON() (b []byte, err error) {
|
||||
msec := float64(time.Duration(d)) / nsecPerMsec
|
||||
b = strconv.AppendFloat(nil, msec, 'f', -1, 64)
|
||||
|
||||
return b, nil
|
||||
}
|
||||
|
||||
// type check
|
||||
var _ json.Unmarshaler = (*JSONDuration)(nil)
|
||||
|
||||
// UnmarshalJSON implements the json.Marshaler interface for *JSONDuration.
|
||||
func (d *JSONDuration) UnmarshalJSON(b []byte) (err error) {
|
||||
if d == nil {
|
||||
return fmt.Errorf("json duration is nil")
|
||||
}
|
||||
|
||||
msec, err := strconv.ParseFloat(string(b), 64)
|
||||
if err != nil {
|
||||
return fmt.Errorf("parsing json time: %w", err)
|
||||
}
|
||||
|
||||
*d = JSONDuration(int64(msec * nsecPerMsec))
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
// JSONTime is a time.Time that can be decoded from JSON and encoded into JSON
|
||||
// according to our API conventions.
|
||||
type JSONTime time.Time
|
||||
|
||||
// type check
|
||||
var _ json.Marshaler = JSONTime{}
|
||||
|
||||
// MarshalJSON implements the json.Marshaler interface for JSONTime. err is
|
||||
// always nil.
|
||||
func (t JSONTime) MarshalJSON() (b []byte, err error) {
|
||||
msec := float64(time.Time(t).UnixNano()) / nsecPerMsec
|
||||
b = strconv.AppendFloat(nil, msec, 'f', -1, 64)
|
||||
|
||||
return b, nil
|
||||
}
|
||||
|
||||
// type check
|
||||
var _ json.Unmarshaler = (*JSONTime)(nil)
|
||||
|
||||
// UnmarshalJSON implements the json.Marshaler interface for *JSONTime.
|
||||
func (t *JSONTime) UnmarshalJSON(b []byte) (err error) {
|
||||
if t == nil {
|
||||
return fmt.Errorf("json time is nil")
|
||||
}
|
||||
|
||||
msec, err := strconv.ParseFloat(string(b), 64)
|
||||
if err != nil {
|
||||
return fmt.Errorf("parsing json time: %w", err)
|
||||
}
|
||||
|
||||
*t = JSONTime(time.Unix(0, int64(msec*nsecPerMsec)).UTC())
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
// WriteJSONResponse writes headers with the code, encodes resp into w, and logs
|
||||
// any errors it encounters. r is used to get additional information from the
|
||||
// request.
|
||||
func WriteJSONResponse(w http.ResponseWriter, r *http.Request, code int, resp any) {
|
||||
h := w.Header()
|
||||
h.Set(httphdr.ContentType, HdrValApplicationJSON)
|
||||
h.Set(httphdr.Server, UserAgent())
|
||||
|
||||
w.WriteHeader(code)
|
||||
|
||||
err := json.NewEncoder(w).Encode(resp)
|
||||
if err != nil {
|
||||
log.Error("aghhttp: writing json resp to %s %s: %s", r.Method, r.URL.Path, err)
|
||||
}
|
||||
}
|
||||
|
||||
// WriteJSONResponseOK writes headers with the code 200 OK, encodes v into w,
|
||||
// and logs any errors it encounters. r is used to get additional information
|
||||
// from the request.
|
||||
func WriteJSONResponseOK(w http.ResponseWriter, r *http.Request, v any) {
|
||||
WriteJSONResponse(w, r, http.StatusOK, v)
|
||||
}
|
||||
|
||||
// ErrorCode is the error code as used by the HTTP API. See the ErrorCode
|
||||
// definition in the OpenAPI specification.
|
||||
type ErrorCode string
|
||||
|
||||
// ErrorCode constants.
|
||||
//
|
||||
// TODO(a.garipov): Expand and document codes.
|
||||
const (
|
||||
// ErrorCodeTMP000 is the temporary error code used for all errors.
|
||||
ErrorCodeTMP000 = ""
|
||||
)
|
||||
|
||||
// HTTPAPIErrorResp is the error response as used by the HTTP API. See the
|
||||
// BadRequestResp, InternalServerErrorResp, and similar objects in the OpenAPI
|
||||
// specification.
|
||||
type HTTPAPIErrorResp struct {
|
||||
Code ErrorCode `json:"code"`
|
||||
Msg string `json:"msg"`
|
||||
}
|
||||
|
||||
// WriteJSONResponseError encodes err as a JSON error into w, and logs any
|
||||
// errors it encounters. r is used to get additional information from the
|
||||
// request.
|
||||
func WriteJSONResponseError(w http.ResponseWriter, r *http.Request, err error) {
|
||||
log.Error("aghhttp: writing json error to %s %s: %s", r.Method, r.URL.Path, err)
|
||||
|
||||
WriteJSONResponse(w, r, http.StatusUnprocessableEntity, &HTTPAPIErrorResp{
|
||||
Code: ErrorCodeTMP000,
|
||||
Msg: err.Error(),
|
||||
})
|
||||
}
|
114
internal/aghhttp/json_test.go
Normal file
114
internal/aghhttp/json_test.go
Normal file
|
@ -0,0 +1,114 @@
|
|||
package aghhttp_test
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"testing"
|
||||
"time"
|
||||
|
||||
"github.com/AdguardTeam/AdGuardHome/internal/aghhttp"
|
||||
"github.com/AdguardTeam/golibs/testutil"
|
||||
"github.com/stretchr/testify/assert"
|
||||
"github.com/stretchr/testify/require"
|
||||
)
|
||||
|
||||
// testJSONTime is the JSON time for tests.
|
||||
var testJSONTime = aghhttp.JSONTime(time.Unix(1_234_567_890, 123_456_000).UTC())
|
||||
|
||||
// testJSONTimeStr is the string with the JSON encoding of testJSONTime.
|
||||
const testJSONTimeStr = "1234567890123.456"
|
||||
|
||||
func TestJSONTime_MarshalJSON(t *testing.T) {
|
||||
testCases := []struct {
|
||||
name string
|
||||
wantErrMsg string
|
||||
in aghhttp.JSONTime
|
||||
want []byte
|
||||
}{{
|
||||
name: "unix_zero",
|
||||
wantErrMsg: "",
|
||||
in: aghhttp.JSONTime(time.Unix(0, 0)),
|
||||
want: []byte("0"),
|
||||
}, {
|
||||
name: "empty",
|
||||
wantErrMsg: "",
|
||||
in: aghhttp.JSONTime{},
|
||||
want: []byte("-6795364578871.345"),
|
||||
}, {
|
||||
name: "time",
|
||||
wantErrMsg: "",
|
||||
in: testJSONTime,
|
||||
want: []byte(testJSONTimeStr),
|
||||
}}
|
||||
|
||||
for _, tc := range testCases {
|
||||
t.Run(tc.name, func(t *testing.T) {
|
||||
got, err := tc.in.MarshalJSON()
|
||||
testutil.AssertErrorMsg(t, tc.wantErrMsg, err)
|
||||
|
||||
assert.Equal(t, tc.want, got)
|
||||
})
|
||||
}
|
||||
|
||||
t.Run("json", func(t *testing.T) {
|
||||
in := &struct {
|
||||
A aghhttp.JSONTime
|
||||
}{
|
||||
A: testJSONTime,
|
||||
}
|
||||
|
||||
got, err := json.Marshal(in)
|
||||
require.NoError(t, err)
|
||||
|
||||
assert.Equal(t, []byte(`{"A":`+testJSONTimeStr+`}`), got)
|
||||
})
|
||||
}
|
||||
|
||||
func TestJSONTime_UnmarshalJSON(t *testing.T) {
|
||||
testCases := []struct {
|
||||
name string
|
||||
wantErrMsg string
|
||||
want aghhttp.JSONTime
|
||||
data []byte
|
||||
}{{
|
||||
name: "time",
|
||||
wantErrMsg: "",
|
||||
want: testJSONTime,
|
||||
data: []byte(testJSONTimeStr),
|
||||
}, {
|
||||
name: "bad",
|
||||
wantErrMsg: `parsing json time: strconv.ParseFloat: parsing "{}": ` +
|
||||
`invalid syntax`,
|
||||
want: aghhttp.JSONTime{},
|
||||
data: []byte(`{}`),
|
||||
}}
|
||||
|
||||
for _, tc := range testCases {
|
||||
t.Run(tc.name, func(t *testing.T) {
|
||||
var got aghhttp.JSONTime
|
||||
err := got.UnmarshalJSON(tc.data)
|
||||
testutil.AssertErrorMsg(t, tc.wantErrMsg, err)
|
||||
|
||||
assert.Equal(t, tc.want, got)
|
||||
})
|
||||
}
|
||||
|
||||
t.Run("nil", func(t *testing.T) {
|
||||
err := (*aghhttp.JSONTime)(nil).UnmarshalJSON([]byte("0"))
|
||||
require.Error(t, err)
|
||||
|
||||
msg := err.Error()
|
||||
assert.Equal(t, "json time is nil", msg)
|
||||
})
|
||||
|
||||
t.Run("json", func(t *testing.T) {
|
||||
want := testJSONTime
|
||||
var got struct {
|
||||
A aghhttp.JSONTime
|
||||
}
|
||||
|
||||
err := json.Unmarshal([]byte(`{"A":`+testJSONTimeStr+`}`), &got)
|
||||
require.NoError(t, err)
|
||||
|
||||
assert.Equal(t, want, got.A)
|
||||
})
|
||||
}
|
|
@ -60,7 +60,7 @@ func ifaceIPv4Subnet(iface *net.Interface) (subnet netip.Prefix, err error) {
|
|||
}
|
||||
|
||||
if ip = ip.To4(); ip != nil {
|
||||
return netip.PrefixFrom(netip.AddrFrom4(*(*[4]byte)(ip)), maskLen), nil
|
||||
return netip.PrefixFrom(netip.AddrFrom4([4]byte(ip)), maskLen), nil
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -1,25 +1,19 @@
|
|||
package aghnet
|
||||
|
||||
import (
|
||||
"bufio"
|
||||
"fmt"
|
||||
"io"
|
||||
"io/fs"
|
||||
"net/netip"
|
||||
"path"
|
||||
"strings"
|
||||
"sync"
|
||||
"sync/atomic"
|
||||
|
||||
"github.com/AdguardTeam/AdGuardHome/internal/aghos"
|
||||
"github.com/AdguardTeam/golibs/errors"
|
||||
"github.com/AdguardTeam/golibs/hostsfile"
|
||||
"github.com/AdguardTeam/golibs/log"
|
||||
"github.com/AdguardTeam/golibs/netutil"
|
||||
"github.com/AdguardTeam/golibs/stringutil"
|
||||
"github.com/AdguardTeam/urlfilter"
|
||||
"github.com/AdguardTeam/urlfilter/filterlist"
|
||||
"github.com/AdguardTeam/urlfilter/rules"
|
||||
"github.com/miekg/dns"
|
||||
"golang.org/x/exp/maps"
|
||||
"golang.org/x/exp/slices"
|
||||
)
|
||||
|
||||
// DefaultHostsPaths returns the slice of paths default for the operating system
|
||||
|
@ -29,95 +23,51 @@ func DefaultHostsPaths() (paths []string) {
|
|||
return defaultHostsPaths()
|
||||
}
|
||||
|
||||
// requestMatcher combines the logic for matching requests and translating the
|
||||
// appropriate rules.
|
||||
type requestMatcher struct {
|
||||
// stateLock protects all the fields of requestMatcher.
|
||||
stateLock *sync.RWMutex
|
||||
|
||||
// rulesStrg stores the rules obtained from the hosts' file.
|
||||
rulesStrg *filterlist.RuleStorage
|
||||
// engine serves rulesStrg.
|
||||
engine *urlfilter.DNSEngine
|
||||
|
||||
// translator maps generated $dnsrewrite rules into hosts-syntax rules.
|
||||
//
|
||||
// TODO(e.burkov): Store the filename from which the rule was parsed.
|
||||
translator map[string]string
|
||||
}
|
||||
|
||||
// MatchRequest processes the request rewriting hostnames and addresses read
|
||||
// from the operating system's hosts files. res is nil for any request having
|
||||
// not an A/AAAA or PTR type, see man 5 hosts.
|
||||
//
|
||||
// It's safe for concurrent use.
|
||||
func (rm *requestMatcher) MatchRequest(
|
||||
req *urlfilter.DNSRequest,
|
||||
) (res *urlfilter.DNSResult, ok bool) {
|
||||
switch req.DNSType {
|
||||
case dns.TypeA, dns.TypeAAAA, dns.TypePTR:
|
||||
log.Debug(
|
||||
"%s: handling %s request for %s",
|
||||
hostsContainerPrefix,
|
||||
dns.Type(req.DNSType),
|
||||
req.Hostname,
|
||||
)
|
||||
|
||||
rm.stateLock.RLock()
|
||||
defer rm.stateLock.RUnlock()
|
||||
|
||||
return rm.engine.MatchRequest(req)
|
||||
default:
|
||||
return nil, false
|
||||
// MatchAddr returns the records for the IP address.
|
||||
func (hc *HostsContainer) MatchAddr(ip netip.Addr) (recs []*hostsfile.Record) {
|
||||
cur := hc.current.Load()
|
||||
if cur == nil {
|
||||
return nil
|
||||
}
|
||||
|
||||
return cur.addrs[ip]
|
||||
}
|
||||
|
||||
// Translate returns the source hosts-syntax rule for the generated dnsrewrite
|
||||
// rule or an empty string if the last doesn't exist. The returned rules are in
|
||||
// a processed format like:
|
||||
//
|
||||
// ip host1 host2 ...
|
||||
func (rm *requestMatcher) Translate(rule string) (hostRule string) {
|
||||
rm.stateLock.RLock()
|
||||
defer rm.stateLock.RUnlock()
|
||||
// MatchName returns the records for the hostname.
|
||||
func (hc *HostsContainer) MatchName(name string) (recs []*hostsfile.Record) {
|
||||
cur := hc.current.Load()
|
||||
if cur != nil {
|
||||
recs = cur.names[name]
|
||||
}
|
||||
|
||||
return rm.translator[rule]
|
||||
}
|
||||
|
||||
// resetEng updates container's engine and the translation map.
|
||||
func (rm *requestMatcher) resetEng(rulesStrg *filterlist.RuleStorage, tr map[string]string) {
|
||||
rm.stateLock.Lock()
|
||||
defer rm.stateLock.Unlock()
|
||||
|
||||
rm.rulesStrg = rulesStrg
|
||||
rm.engine = urlfilter.NewDNSEngine(rm.rulesStrg)
|
||||
|
||||
rm.translator = tr
|
||||
return recs
|
||||
}
|
||||
|
||||
// hostsContainerPrefix is a prefix for logging and wrapping errors in
|
||||
// HostsContainer's methods.
|
||||
const hostsContainerPrefix = "hosts container"
|
||||
|
||||
// Hosts is a map of IP addresses to the records, as it primarily stored in the
|
||||
// [HostsContainer]. It should not be accessed for writing since it may be read
|
||||
// concurrently, users should clone it before modifying.
|
||||
//
|
||||
// The order of records for each address is preserved from original files, but
|
||||
// the order of the addresses, being a map key, is not.
|
||||
//
|
||||
// TODO(e.burkov): Probably, this should be a sorted slice of records.
|
||||
type Hosts map[netip.Addr][]*hostsfile.Record
|
||||
|
||||
// HostsContainer stores the relevant hosts database provided by the OS and
|
||||
// processes both A/AAAA and PTR DNS requests for those.
|
||||
//
|
||||
// TODO(e.burkov): Improve API and move to golibs.
|
||||
type HostsContainer struct {
|
||||
// requestMatcher matches the requests and translates the rules. It's
|
||||
// embedded to implement MatchRequest and Translate for *HostsContainer.
|
||||
//
|
||||
// TODO(a.garipov, e.burkov): Consider fully merging into HostsContainer.
|
||||
requestMatcher
|
||||
|
||||
// done is the channel to sign closing the container.
|
||||
done chan struct{}
|
||||
|
||||
// updates is the channel for receiving updated hosts.
|
||||
updates chan HostsRecords
|
||||
updates chan Hosts
|
||||
|
||||
// last is the set of hosts that was cached within last detected change.
|
||||
last HostsRecords
|
||||
// current is the last set of hosts parsed.
|
||||
current atomic.Pointer[hostsIndex]
|
||||
|
||||
// fsys is the working file system to read hosts files from.
|
||||
fsys fs.FS
|
||||
|
@ -127,30 +77,6 @@ type HostsContainer struct {
|
|||
|
||||
// patterns stores specified paths in the fs.Glob-compatible form.
|
||||
patterns []string
|
||||
|
||||
// listID is the identifier for the list of generated rules.
|
||||
listID int
|
||||
}
|
||||
|
||||
// HostsRecords is a mapping of an IP address to its hosts data.
|
||||
type HostsRecords map[netip.Addr]*HostsRecord
|
||||
|
||||
// HostsRecord represents a single hosts file record.
|
||||
type HostsRecord struct {
|
||||
Aliases *stringutil.Set
|
||||
Canonical string
|
||||
}
|
||||
|
||||
// Equal returns true if all fields of rec are equal to field in other or they
|
||||
// both are nil.
|
||||
func (rec *HostsRecord) Equal(other *HostsRecord) (ok bool) {
|
||||
if rec == nil {
|
||||
return other == nil
|
||||
} else if other == nil {
|
||||
return false
|
||||
}
|
||||
|
||||
return rec.Canonical == other.Canonical && rec.Aliases.Equal(other.Aliases)
|
||||
}
|
||||
|
||||
// ErrNoHostsPaths is returned when there are no valid paths to watch passed to
|
||||
|
@ -162,7 +88,6 @@ const ErrNoHostsPaths errors.Error = "no valid paths to hosts files provided"
|
|||
// shouldn't be empty and each of paths should locate either a file or a
|
||||
// directory in fsys. fsys and w must be non-nil.
|
||||
func NewHostsContainer(
|
||||
listID int,
|
||||
fsys fs.FS,
|
||||
w aghos.FSWatcher,
|
||||
paths ...string,
|
||||
|
@ -182,12 +107,8 @@ func NewHostsContainer(
|
|||
}
|
||||
|
||||
hc = &HostsContainer{
|
||||
requestMatcher: requestMatcher{
|
||||
stateLock: &sync.RWMutex{},
|
||||
},
|
||||
listID: listID,
|
||||
done: make(chan struct{}, 1),
|
||||
updates: make(chan HostsRecords, 1),
|
||||
updates: make(chan Hosts, 1),
|
||||
fsys: fsys,
|
||||
watcher: w,
|
||||
patterns: patterns,
|
||||
|
@ -233,7 +154,7 @@ func (hc *HostsContainer) Close() (err error) {
|
|||
}
|
||||
|
||||
// Upd returns the channel into which the updates are sent.
|
||||
func (hc *HostsContainer) Upd() (updates <-chan HostsRecords) {
|
||||
func (hc *HostsContainer) Upd() (updates <-chan Hosts) {
|
||||
return hc.updates
|
||||
}
|
||||
|
||||
|
@ -280,7 +201,7 @@ func (hc *HostsContainer) handleEvents() {
|
|||
}
|
||||
|
||||
if err := hc.refresh(); err != nil {
|
||||
log.Error("%s: %s", hostsContainerPrefix, err)
|
||||
log.Error("%s: warning: refreshing: %s", hostsContainerPrefix, err)
|
||||
}
|
||||
case _, ok = <-hc.done:
|
||||
// Go on.
|
||||
|
@ -288,198 +209,83 @@ func (hc *HostsContainer) handleEvents() {
|
|||
}
|
||||
}
|
||||
|
||||
// hostsParser is a helper type to parse rules from the operating system's hosts
|
||||
// file. It exists for only a single refreshing session.
|
||||
type hostsParser struct {
|
||||
// rulesBuilder builds the resulting rules list content.
|
||||
rulesBuilder *strings.Builder
|
||||
|
||||
// translations maps generated rules into actual hosts file lines.
|
||||
translations map[string]string
|
||||
|
||||
// table stores only the unique IP-hostname pairs. It's also sent to the
|
||||
// updates channel afterwards.
|
||||
table HostsRecords
|
||||
}
|
||||
|
||||
// newHostsParser creates a new *hostsParser with buffers of size taken from the
|
||||
// previous parse.
|
||||
func (hc *HostsContainer) newHostsParser() (hp *hostsParser) {
|
||||
return &hostsParser{
|
||||
rulesBuilder: &strings.Builder{},
|
||||
translations: map[string]string{},
|
||||
table: make(HostsRecords, len(hc.last)),
|
||||
}
|
||||
}
|
||||
|
||||
// parseFile is a aghos.FileWalker for parsing the files with hosts syntax. It
|
||||
// never signs to stop walking and never returns any additional patterns.
|
||||
//
|
||||
// See man hosts(5).
|
||||
func (hp *hostsParser) parseFile(r io.Reader) (patterns []string, cont bool, err error) {
|
||||
s := bufio.NewScanner(r)
|
||||
for s.Scan() {
|
||||
ip, hosts := hp.parseLine(s.Text())
|
||||
if ip == (netip.Addr{}) || len(hosts) == 0 {
|
||||
continue
|
||||
}
|
||||
|
||||
hp.addRecord(ip, hosts)
|
||||
}
|
||||
|
||||
return nil, true, s.Err()
|
||||
}
|
||||
|
||||
// parseLine parses the line having the hosts syntax ignoring invalid ones.
|
||||
func (hp *hostsParser) parseLine(line string) (ip netip.Addr, hosts []string) {
|
||||
fields := strings.Fields(line)
|
||||
if len(fields) < 2 {
|
||||
return netip.Addr{}, nil
|
||||
}
|
||||
|
||||
ip, err := netip.ParseAddr(fields[0])
|
||||
if err != nil {
|
||||
return netip.Addr{}, nil
|
||||
}
|
||||
|
||||
for _, f := range fields[1:] {
|
||||
hashIdx := strings.IndexByte(f, '#')
|
||||
if hashIdx == 0 {
|
||||
// The rest of the fields are a part of the comment so return.
|
||||
break
|
||||
} else if hashIdx > 0 {
|
||||
// Only a part of the field is a comment.
|
||||
f = f[:hashIdx]
|
||||
}
|
||||
|
||||
// Make sure that invalid hosts aren't turned into rules.
|
||||
//
|
||||
// See https://github.com/AdguardTeam/AdGuardHome/issues/3946.
|
||||
//
|
||||
// TODO(e.burkov): Investigate if hosts may contain DNS-SD domains.
|
||||
err = netutil.ValidateHostname(f)
|
||||
if err != nil {
|
||||
log.Error("%s: host %q is invalid, ignoring", hostsContainerPrefix, f)
|
||||
|
||||
continue
|
||||
}
|
||||
|
||||
hosts = append(hosts, f)
|
||||
}
|
||||
|
||||
return ip, hosts
|
||||
}
|
||||
|
||||
// addRecord puts the record for the IP address to the rules builder if needed.
|
||||
// The first host is considered to be the canonical name for the IP address.
|
||||
// hosts must have at least one name.
|
||||
func (hp *hostsParser) addRecord(ip netip.Addr, hosts []string) {
|
||||
line := strings.Join(append([]string{ip.String()}, hosts...), " ")
|
||||
|
||||
rec, ok := hp.table[ip]
|
||||
if !ok {
|
||||
rec = &HostsRecord{
|
||||
Aliases: stringutil.NewSet(),
|
||||
}
|
||||
|
||||
rec.Canonical, hosts = hosts[0], hosts[1:]
|
||||
hp.addRules(ip, rec.Canonical, line)
|
||||
hp.table[ip] = rec
|
||||
}
|
||||
|
||||
for _, host := range hosts {
|
||||
if rec.Canonical == host || rec.Aliases.Has(host) {
|
||||
continue
|
||||
}
|
||||
|
||||
rec.Aliases.Add(host)
|
||||
|
||||
hp.addRules(ip, host, line)
|
||||
}
|
||||
}
|
||||
|
||||
// addRules adds rules and rule translations for the line.
|
||||
func (hp *hostsParser) addRules(ip netip.Addr, host, line string) {
|
||||
rule, rulePtr := hp.writeRules(host, ip)
|
||||
hp.translations[rule], hp.translations[rulePtr] = line, line
|
||||
|
||||
log.Debug("%s: added ip-host pair %q-%q", hostsContainerPrefix, ip, host)
|
||||
}
|
||||
|
||||
// writeRules writes the actual rule for the qtype and the PTR for the host-ip
|
||||
// pair into internal builders.
|
||||
func (hp *hostsParser) writeRules(host string, ip netip.Addr) (rule, rulePtr string) {
|
||||
// TODO(a.garipov): Add a netip.Addr version to netutil.
|
||||
arpa, err := netutil.IPToReversedAddr(ip.AsSlice())
|
||||
if err != nil {
|
||||
return "", ""
|
||||
}
|
||||
|
||||
const (
|
||||
nl = "\n"
|
||||
|
||||
rwSuccess = "^$dnsrewrite=NOERROR;"
|
||||
rwSuccessPTR = "^$dnsrewrite=NOERROR;PTR;"
|
||||
|
||||
modLen = len(rules.MaskPipe) + len(rwSuccess) + len(";")
|
||||
modLenPTR = len(rules.MaskPipe) + len(rwSuccessPTR)
|
||||
)
|
||||
|
||||
var qtype string
|
||||
// The validation of the IP address has been performed earlier so it is
|
||||
// guaranteed to be either an IPv4 or an IPv6.
|
||||
if ip.Is4() {
|
||||
qtype = "A"
|
||||
} else {
|
||||
qtype = "AAAA"
|
||||
}
|
||||
|
||||
ipStr := ip.String()
|
||||
fqdn := dns.Fqdn(host)
|
||||
|
||||
ruleBuilder := &strings.Builder{}
|
||||
ruleBuilder.Grow(modLen + len(host) + len(qtype) + len(ipStr))
|
||||
stringutil.WriteToBuilder(ruleBuilder, rules.MaskPipe, host, rwSuccess, qtype, ";", ipStr)
|
||||
rule = ruleBuilder.String()
|
||||
|
||||
ruleBuilder.Reset()
|
||||
|
||||
ruleBuilder.Grow(modLenPTR + len(arpa) + len(fqdn))
|
||||
stringutil.WriteToBuilder(ruleBuilder, rules.MaskPipe, arpa, rwSuccessPTR, fqdn)
|
||||
|
||||
rulePtr = ruleBuilder.String()
|
||||
|
||||
hp.rulesBuilder.Grow(len(rule) + len(rulePtr) + 2*len(nl))
|
||||
stringutil.WriteToBuilder(hp.rulesBuilder, rule, nl, rulePtr, nl)
|
||||
|
||||
return rule, rulePtr
|
||||
}
|
||||
|
||||
// sendUpd tries to send the parsed data to the ch.
|
||||
func (hp *hostsParser) sendUpd(ch chan HostsRecords) {
|
||||
func (hc *HostsContainer) sendUpd(recs Hosts) {
|
||||
log.Debug("%s: sending upd", hostsContainerPrefix)
|
||||
|
||||
upd := hp.table
|
||||
ch := hc.updates
|
||||
select {
|
||||
case ch <- upd:
|
||||
case ch <- recs:
|
||||
// Updates are delivered. Go on.
|
||||
case <-ch:
|
||||
ch <- upd
|
||||
ch <- recs
|
||||
log.Debug("%s: replaced the last update", hostsContainerPrefix)
|
||||
case ch <- upd:
|
||||
case ch <- recs:
|
||||
// The previous update was just read and the next one pushed. Go on.
|
||||
default:
|
||||
log.Error("%s: the updates channel is broken", hostsContainerPrefix)
|
||||
}
|
||||
}
|
||||
|
||||
// newStrg creates a new rules storage from parsed data.
|
||||
func (hp *hostsParser) newStrg(id int) (s *filterlist.RuleStorage, err error) {
|
||||
return filterlist.NewRuleStorage([]filterlist.RuleList{&filterlist.StringRuleList{
|
||||
ID: id,
|
||||
RulesText: hp.rulesBuilder.String(),
|
||||
IgnoreCosmetic: true,
|
||||
}})
|
||||
// hostsIndex is a [hostsfile.Set] to enumerate all the records.
|
||||
type hostsIndex struct {
|
||||
// addrs maps IP addresses to the records.
|
||||
addrs Hosts
|
||||
|
||||
// names maps hostnames to the records.
|
||||
names map[string][]*hostsfile.Record
|
||||
}
|
||||
|
||||
// walk is a file walking function for hostsIndex.
|
||||
func (idx *hostsIndex) walk(r io.Reader) (patterns []string, cont bool, err error) {
|
||||
return nil, true, hostsfile.Parse(idx, r, nil)
|
||||
}
|
||||
|
||||
// type check
|
||||
var _ hostsfile.Set = (*hostsIndex)(nil)
|
||||
|
||||
// Add implements the [hostsfile.Set] interface for *hostsIndex.
|
||||
func (idx *hostsIndex) Add(rec *hostsfile.Record) {
|
||||
idx.addrs[rec.Addr] = append(idx.addrs[rec.Addr], rec)
|
||||
for _, name := range rec.Names {
|
||||
idx.names[name] = append(idx.names[name], rec)
|
||||
}
|
||||
}
|
||||
|
||||
// type check
|
||||
var _ hostsfile.HandleSet = (*hostsIndex)(nil)
|
||||
|
||||
// HandleInvalid implements the [hostsfile.HandleSet] interface for *hostsIndex.
|
||||
func (idx *hostsIndex) HandleInvalid(src string, _ []byte, err error) {
|
||||
lineErr := &hostsfile.LineError{}
|
||||
if !errors.As(err, &lineErr) {
|
||||
// Must not happen if idx passed to [hostsfile.Parse].
|
||||
return
|
||||
} else if errors.Is(lineErr, hostsfile.ErrEmptyLine) {
|
||||
// Ignore empty lines.
|
||||
return
|
||||
}
|
||||
|
||||
log.Info("%s: warning: parsing %q: %s", hostsContainerPrefix, src, lineErr)
|
||||
}
|
||||
|
||||
// equalRecs is an equality function for [*hostsfile.Record].
|
||||
func equalRecs(a, b *hostsfile.Record) (ok bool) {
|
||||
return a.Addr == b.Addr && a.Source == b.Source && slices.Equal(a.Names, b.Names)
|
||||
}
|
||||
|
||||
// equalRecSlices is an equality function for slices of [*hostsfile.Record].
|
||||
func equalRecSlices(a, b []*hostsfile.Record) (ok bool) { return slices.EqualFunc(a, b, equalRecs) }
|
||||
|
||||
// Equal returns true if indexes are equal.
|
||||
func (idx *hostsIndex) Equal(other *hostsIndex) (ok bool) {
|
||||
if idx == nil {
|
||||
return other == nil
|
||||
} else if other == nil {
|
||||
return false
|
||||
}
|
||||
|
||||
return maps.EqualFunc(idx.addrs, other.addrs, equalRecSlices)
|
||||
}
|
||||
|
||||
// refresh gets the data from specified files and propagates the updates if
|
||||
|
@ -489,27 +295,27 @@ func (hp *hostsParser) newStrg(id int) (s *filterlist.RuleStorage, err error) {
|
|||
func (hc *HostsContainer) refresh() (err error) {
|
||||
log.Debug("%s: refreshing", hostsContainerPrefix)
|
||||
|
||||
hp := hc.newHostsParser()
|
||||
if _, err = aghos.FileWalker(hp.parseFile).Walk(hc.fsys, hc.patterns...); err != nil {
|
||||
return fmt.Errorf("refreshing : %w", err)
|
||||
var addrLen, nameLen int
|
||||
last := hc.current.Load()
|
||||
if last != nil {
|
||||
addrLen, nameLen = len(last.addrs), len(last.names)
|
||||
}
|
||||
idx := &hostsIndex{
|
||||
addrs: make(Hosts, addrLen),
|
||||
names: make(map[string][]*hostsfile.Record, nameLen),
|
||||
}
|
||||
|
||||
// hc.last is nil on the first refresh, so let that one through.
|
||||
if hc.last != nil && maps.EqualFunc(hp.table, hc.last, (*HostsRecord).Equal) {
|
||||
log.Debug("%s: no changes detected", hostsContainerPrefix)
|
||||
|
||||
return nil
|
||||
}
|
||||
defer hp.sendUpd(hc.updates)
|
||||
|
||||
hc.last = maps.Clone(hp.table)
|
||||
|
||||
var rulesStrg *filterlist.RuleStorage
|
||||
if rulesStrg, err = hp.newStrg(hc.listID); err != nil {
|
||||
return fmt.Errorf("initializing rules storage: %w", err)
|
||||
_, err = aghos.FileWalker(idx.walk).Walk(hc.fsys, hc.patterns...)
|
||||
if err != nil {
|
||||
// Don't wrap the error since it's informative enough as is.
|
||||
return err
|
||||
}
|
||||
|
||||
hc.resetEng(rulesStrg, hp.translations)
|
||||
// TODO(e.burkov): Serialize updates using time.
|
||||
if !last.Equal(idx) {
|
||||
hc.current.Store(idx)
|
||||
hc.sendUpd(idx.addrs)
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
|
|
@ -2,13 +2,11 @@ package aghnet
|
|||
|
||||
import (
|
||||
"io/fs"
|
||||
"net/netip"
|
||||
"path"
|
||||
"testing"
|
||||
"testing/fstest"
|
||||
|
||||
"github.com/AdguardTeam/golibs/errors"
|
||||
"github.com/AdguardTeam/golibs/netutil"
|
||||
"github.com/AdguardTeam/golibs/testutil/fakefs"
|
||||
"github.com/stretchr/testify/assert"
|
||||
"github.com/stretchr/testify/require"
|
||||
|
@ -76,69 +74,3 @@ func TestHostsContainer_PathsToPatterns(t *testing.T) {
|
|||
assert.ErrorIs(t, err, errStat)
|
||||
})
|
||||
}
|
||||
|
||||
func TestUniqueRules_ParseLine(t *testing.T) {
|
||||
ip := netutil.IPv4Localhost()
|
||||
ipStr := ip.String()
|
||||
|
||||
testCases := []struct {
|
||||
name string
|
||||
line string
|
||||
wantIP netip.Addr
|
||||
wantHosts []string
|
||||
}{{
|
||||
name: "simple",
|
||||
line: ipStr + ` hostname`,
|
||||
wantIP: ip,
|
||||
wantHosts: []string{"hostname"},
|
||||
}, {
|
||||
name: "aliases",
|
||||
line: ipStr + ` hostname alias`,
|
||||
wantIP: ip,
|
||||
wantHosts: []string{"hostname", "alias"},
|
||||
}, {
|
||||
name: "invalid_line",
|
||||
line: ipStr,
|
||||
wantIP: netip.Addr{},
|
||||
wantHosts: nil,
|
||||
}, {
|
||||
name: "invalid_line_hostname",
|
||||
line: ipStr + ` # hostname`,
|
||||
wantIP: ip,
|
||||
wantHosts: nil,
|
||||
}, {
|
||||
name: "commented_aliases",
|
||||
line: ipStr + ` hostname # alias`,
|
||||
wantIP: ip,
|
||||
wantHosts: []string{"hostname"},
|
||||
}, {
|
||||
name: "whole_comment",
|
||||
line: `# ` + ipStr + ` hostname`,
|
||||
wantIP: netip.Addr{},
|
||||
wantHosts: nil,
|
||||
}, {
|
||||
name: "partial_comment",
|
||||
line: ipStr + ` host#name`,
|
||||
wantIP: ip,
|
||||
wantHosts: []string{"host"},
|
||||
}, {
|
||||
name: "empty",
|
||||
line: ``,
|
||||
wantIP: netip.Addr{},
|
||||
wantHosts: nil,
|
||||
}, {
|
||||
name: "bad_hosts",
|
||||
line: ipStr + ` bad..host bad._tld empty.tld. ok.host`,
|
||||
wantIP: ip,
|
||||
wantHosts: []string{"ok.host"},
|
||||
}}
|
||||
|
||||
for _, tc := range testCases {
|
||||
hp := hostsParser{}
|
||||
t.Run(tc.name, func(t *testing.T) {
|
||||
got, hosts := hp.parseLine(tc.line)
|
||||
assert.Equal(t, tc.wantIP, got)
|
||||
assert.Equal(t, tc.wantHosts, hosts)
|
||||
})
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,9 +1,9 @@
|
|||
package aghnet_test
|
||||
|
||||
import (
|
||||
"net"
|
||||
"net/netip"
|
||||
"path"
|
||||
"strings"
|
||||
"path/filepath"
|
||||
"sync/atomic"
|
||||
"testing"
|
||||
"testing/fstest"
|
||||
|
@ -13,18 +13,146 @@ import (
|
|||
"github.com/AdguardTeam/AdGuardHome/internal/aghnet"
|
||||
"github.com/AdguardTeam/AdGuardHome/internal/aghtest"
|
||||
"github.com/AdguardTeam/golibs/errors"
|
||||
"github.com/AdguardTeam/golibs/hostsfile"
|
||||
"github.com/AdguardTeam/golibs/netutil"
|
||||
"github.com/AdguardTeam/golibs/stringutil"
|
||||
"github.com/AdguardTeam/golibs/testutil"
|
||||
"github.com/AdguardTeam/urlfilter"
|
||||
"github.com/AdguardTeam/urlfilter/rules"
|
||||
"github.com/miekg/dns"
|
||||
"github.com/stretchr/testify/assert"
|
||||
"github.com/stretchr/testify/require"
|
||||
)
|
||||
|
||||
// nl is a newline character.
|
||||
const nl = "\n"
|
||||
|
||||
// Variables mirroring the etc_hosts file from testdata.
|
||||
var (
|
||||
addr1000 = netip.MustParseAddr("1.0.0.0")
|
||||
addr1001 = netip.MustParseAddr("1.0.0.1")
|
||||
addr1002 = netip.MustParseAddr("1.0.0.2")
|
||||
addr1003 = netip.MustParseAddr("1.0.0.3")
|
||||
addr1004 = netip.MustParseAddr("1.0.0.4")
|
||||
addr1357 = netip.MustParseAddr("1.3.5.7")
|
||||
addr4216 = netip.MustParseAddr("4.2.1.6")
|
||||
addr7531 = netip.MustParseAddr("7.5.3.1")
|
||||
|
||||
addr0 = netip.MustParseAddr("::")
|
||||
addr1 = netip.MustParseAddr("::1")
|
||||
addr2 = netip.MustParseAddr("::2")
|
||||
addr3 = netip.MustParseAddr("::3")
|
||||
addr4 = netip.MustParseAddr("::4")
|
||||
addr42 = netip.MustParseAddr("::42")
|
||||
addr13 = netip.MustParseAddr("::13")
|
||||
addr31 = netip.MustParseAddr("::31")
|
||||
|
||||
hostsSrc = "./" + filepath.Join("./testdata", "etc_hosts")
|
||||
|
||||
testHosts = map[netip.Addr][]*hostsfile.Record{
|
||||
addr1000: {{
|
||||
Addr: addr1000,
|
||||
Source: hostsSrc,
|
||||
Names: []string{"hello", "hello.world"},
|
||||
}, {
|
||||
Addr: addr1000,
|
||||
Source: hostsSrc,
|
||||
Names: []string{"hello.world.again"},
|
||||
}, {
|
||||
Addr: addr1000,
|
||||
Source: hostsSrc,
|
||||
Names: []string{"hello.world"},
|
||||
}},
|
||||
addr1001: {{
|
||||
Addr: addr1001,
|
||||
Source: hostsSrc,
|
||||
Names: []string{"simplehost"},
|
||||
}, {
|
||||
Addr: addr1001,
|
||||
Source: hostsSrc,
|
||||
Names: []string{"simplehost"},
|
||||
}},
|
||||
addr1002: {{
|
||||
Addr: addr1002,
|
||||
Source: hostsSrc,
|
||||
Names: []string{"a.whole", "lot.of", "aliases", "for.testing"},
|
||||
}},
|
||||
addr1003: {{
|
||||
Addr: addr1003,
|
||||
Source: hostsSrc,
|
||||
Names: []string{"*"},
|
||||
}},
|
||||
addr1004: {{
|
||||
Addr: addr1004,
|
||||
Source: hostsSrc,
|
||||
Names: []string{"*.com"},
|
||||
}},
|
||||
addr1357: {{
|
||||
Addr: addr1357,
|
||||
Source: hostsSrc,
|
||||
Names: []string{"domain4", "domain4.alias"},
|
||||
}},
|
||||
addr7531: {{
|
||||
Addr: addr7531,
|
||||
Source: hostsSrc,
|
||||
Names: []string{"domain4.alias", "domain4"},
|
||||
}},
|
||||
addr4216: {{
|
||||
Addr: addr4216,
|
||||
Source: hostsSrc,
|
||||
Names: []string{"domain", "domain.alias"},
|
||||
}},
|
||||
addr0: {{
|
||||
Addr: addr0,
|
||||
Source: hostsSrc,
|
||||
Names: []string{"hello", "hello.world"},
|
||||
}, {
|
||||
Addr: addr0,
|
||||
Source: hostsSrc,
|
||||
Names: []string{"hello.world.again"},
|
||||
}, {
|
||||
Addr: addr0,
|
||||
Source: hostsSrc,
|
||||
Names: []string{"hello.world"},
|
||||
}},
|
||||
addr1: {{
|
||||
Addr: addr1,
|
||||
Source: hostsSrc,
|
||||
Names: []string{"simplehost"},
|
||||
}, {
|
||||
Addr: addr1,
|
||||
Source: hostsSrc,
|
||||
Names: []string{"simplehost"},
|
||||
}},
|
||||
addr2: {{
|
||||
Addr: addr2,
|
||||
Source: hostsSrc,
|
||||
Names: []string{"a.whole", "lot.of", "aliases", "for.testing"},
|
||||
}},
|
||||
addr3: {{
|
||||
Addr: addr3,
|
||||
Source: hostsSrc,
|
||||
Names: []string{"*"},
|
||||
}},
|
||||
addr4: {{
|
||||
Addr: addr4,
|
||||
Source: hostsSrc,
|
||||
Names: []string{"*.com"},
|
||||
}},
|
||||
addr42: {{
|
||||
Addr: addr42,
|
||||
Source: hostsSrc,
|
||||
Names: []string{"domain.alias", "domain"},
|
||||
}},
|
||||
addr13: {{
|
||||
Addr: addr13,
|
||||
Source: hostsSrc,
|
||||
Names: []string{"domain6", "domain6.alias"},
|
||||
}},
|
||||
addr31: {{
|
||||
Addr: addr31,
|
||||
Source: hostsSrc,
|
||||
Names: []string{"domain6.alias", "domain6"},
|
||||
}},
|
||||
}
|
||||
)
|
||||
|
||||
func TestNewHostsContainer(t *testing.T) {
|
||||
const dirname = "dir"
|
||||
const filename = "file1"
|
||||
|
@ -73,7 +201,7 @@ func TestNewHostsContainer(t *testing.T) {
|
|||
return eventsCh
|
||||
}
|
||||
|
||||
hc, err := aghnet.NewHostsContainer(0, testFS, &aghtest.FSWatcher{
|
||||
hc, err := aghnet.NewHostsContainer(testFS, &aghtest.FSWatcher{
|
||||
OnEvents: onEvents,
|
||||
OnAdd: onAdd,
|
||||
OnClose: func() (err error) { return nil },
|
||||
|
@ -99,7 +227,7 @@ func TestNewHostsContainer(t *testing.T) {
|
|||
|
||||
t.Run("nil_fs", func(t *testing.T) {
|
||||
require.Panics(t, func() {
|
||||
_, _ = aghnet.NewHostsContainer(0, nil, &aghtest.FSWatcher{
|
||||
_, _ = aghnet.NewHostsContainer(nil, &aghtest.FSWatcher{
|
||||
// Those shouldn't panic.
|
||||
OnEvents: func() (e <-chan struct{}) { return nil },
|
||||
OnAdd: func(name string) (err error) { return nil },
|
||||
|
@ -110,7 +238,7 @@ func TestNewHostsContainer(t *testing.T) {
|
|||
|
||||
t.Run("nil_watcher", func(t *testing.T) {
|
||||
require.Panics(t, func() {
|
||||
_, _ = aghnet.NewHostsContainer(0, testFS, nil, p)
|
||||
_, _ = aghnet.NewHostsContainer(testFS, nil, p)
|
||||
})
|
||||
})
|
||||
|
||||
|
@ -123,7 +251,7 @@ func TestNewHostsContainer(t *testing.T) {
|
|||
OnClose: func() (err error) { return nil },
|
||||
}
|
||||
|
||||
hc, err := aghnet.NewHostsContainer(0, testFS, errWatcher, p)
|
||||
hc, err := aghnet.NewHostsContainer(testFS, errWatcher, p)
|
||||
require.ErrorIs(t, err, errOnAdd)
|
||||
|
||||
assert.Nil(t, hc)
|
||||
|
@ -136,6 +264,9 @@ func TestHostsContainer_refresh(t *testing.T) {
|
|||
ip := netutil.IPv4Localhost()
|
||||
ipStr := ip.String()
|
||||
|
||||
anotherIPStr := "1.2.3.4"
|
||||
anotherIP := netip.MustParseAddr(anotherIPStr)
|
||||
|
||||
testFS := fstest.MapFS{"dir/file1": &fstest.MapFile{Data: []byte(ipStr + ` hostname` + nl)}}
|
||||
|
||||
// event is a convenient alias for an empty struct{} to emit test events.
|
||||
|
@ -154,40 +285,44 @@ func TestHostsContainer_refresh(t *testing.T) {
|
|||
OnClose: func() (err error) { return nil },
|
||||
}
|
||||
|
||||
hc, err := aghnet.NewHostsContainer(0, testFS, w, "dir")
|
||||
hc, err := aghnet.NewHostsContainer(testFS, w, "dir")
|
||||
require.NoError(t, err)
|
||||
testutil.CleanupAndRequireSuccess(t, hc.Close)
|
||||
|
||||
checkRefresh := func(t *testing.T, want *aghnet.HostsRecord) {
|
||||
checkRefresh := func(t *testing.T, want aghnet.Hosts) {
|
||||
t.Helper()
|
||||
|
||||
upd, ok := aghchan.MustReceive(hc.Upd(), 1*time.Second)
|
||||
require.True(t, ok)
|
||||
require.NotNil(t, upd)
|
||||
|
||||
assert.Len(t, upd, 1)
|
||||
|
||||
rec, ok := upd[ip]
|
||||
require.True(t, ok)
|
||||
require.NotNil(t, rec)
|
||||
|
||||
assert.Truef(t, rec.Equal(want), "%+v != %+v", rec, want)
|
||||
assert.Equal(t, want, upd)
|
||||
}
|
||||
|
||||
t.Run("initial_refresh", func(t *testing.T) {
|
||||
checkRefresh(t, &aghnet.HostsRecord{
|
||||
Aliases: stringutil.NewSet(),
|
||||
Canonical: "hostname",
|
||||
checkRefresh(t, aghnet.Hosts{
|
||||
ip: {{
|
||||
Addr: ip,
|
||||
Source: "file1",
|
||||
Names: []string{"hostname"},
|
||||
}},
|
||||
})
|
||||
})
|
||||
|
||||
t.Run("second_refresh", func(t *testing.T) {
|
||||
testFS["dir/file2"] = &fstest.MapFile{Data: []byte(ipStr + ` alias` + nl)}
|
||||
testFS["dir/file2"] = &fstest.MapFile{Data: []byte(anotherIPStr + ` alias` + nl)}
|
||||
eventsCh <- event{}
|
||||
|
||||
checkRefresh(t, &aghnet.HostsRecord{
|
||||
Aliases: stringutil.NewSet("alias"),
|
||||
Canonical: "hostname",
|
||||
checkRefresh(t, aghnet.Hosts{
|
||||
ip: {{
|
||||
Addr: ip,
|
||||
Source: "file1",
|
||||
Names: []string{"hostname"},
|
||||
}},
|
||||
anotherIP: {{
|
||||
Addr: anotherIP,
|
||||
Source: "file2",
|
||||
Names: []string{"alias"},
|
||||
}},
|
||||
})
|
||||
})
|
||||
|
||||
|
@ -198,12 +333,9 @@ func TestHostsContainer_refresh(t *testing.T) {
|
|||
|
||||
// Require the changes are written.
|
||||
require.Eventually(t, func() bool {
|
||||
res, ok := hc.MatchRequest(&urlfilter.DNSRequest{
|
||||
Hostname: "hostname",
|
||||
DNSType: dns.TypeA,
|
||||
})
|
||||
ips := hc.MatchName("hostname")
|
||||
|
||||
return !ok && res.DNSRewrites() == nil
|
||||
return len(ips) == 0
|
||||
}, 5*time.Second, time.Second/2)
|
||||
|
||||
// Make a change again.
|
||||
|
@ -212,285 +344,117 @@ func TestHostsContainer_refresh(t *testing.T) {
|
|||
|
||||
// Require the changes are written.
|
||||
require.Eventually(t, func() bool {
|
||||
res, ok := hc.MatchRequest(&urlfilter.DNSRequest{
|
||||
Hostname: "hostname",
|
||||
DNSType: dns.TypeA,
|
||||
})
|
||||
ips := hc.MatchName("hostname")
|
||||
|
||||
return !ok && res.DNSRewrites() != nil
|
||||
return len(ips) > 0
|
||||
}, 5*time.Second, time.Second/2)
|
||||
|
||||
assert.Len(t, hc.Upd(), 1)
|
||||
})
|
||||
}
|
||||
|
||||
func TestHostsContainer_Translate(t *testing.T) {
|
||||
func TestHostsContainer_MatchName(t *testing.T) {
|
||||
require.NoError(t, fstest.TestFS(testdata, "etc_hosts"))
|
||||
|
||||
stubWatcher := aghtest.FSWatcher{
|
||||
OnEvents: func() (e <-chan struct{}) { return nil },
|
||||
OnAdd: func(name string) (err error) { return nil },
|
||||
OnClose: func() (err error) { return nil },
|
||||
}
|
||||
|
||||
require.NoError(t, fstest.TestFS(testdata, "etc_hosts"))
|
||||
|
||||
hc, err := aghnet.NewHostsContainer(0, testdata, &stubWatcher, "etc_hosts")
|
||||
require.NoError(t, err)
|
||||
testutil.CleanupAndRequireSuccess(t, hc.Close)
|
||||
|
||||
testCases := []struct {
|
||||
name string
|
||||
rule string
|
||||
wantTrans []string
|
||||
}{{
|
||||
name: "simplehost",
|
||||
rule: "|simplehost^$dnsrewrite=NOERROR;A;1.0.0.1",
|
||||
wantTrans: []string{"1.0.0.1", "simplehost"},
|
||||
}, {
|
||||
name: "hello",
|
||||
rule: "|hello^$dnsrewrite=NOERROR;A;1.0.0.0",
|
||||
wantTrans: []string{"1.0.0.0", "hello", "hello.world"},
|
||||
}, {
|
||||
name: "hello-alias",
|
||||
rule: "|hello.world.again^$dnsrewrite=NOERROR;A;1.0.0.0",
|
||||
wantTrans: []string{"1.0.0.0", "hello.world.again"},
|
||||
}, {
|
||||
name: "simplehost_v6",
|
||||
rule: "|simplehost^$dnsrewrite=NOERROR;AAAA;::1",
|
||||
wantTrans: []string{"::1", "simplehost"},
|
||||
}, {
|
||||
name: "hello_v6",
|
||||
rule: "|hello^$dnsrewrite=NOERROR;AAAA;::",
|
||||
wantTrans: []string{"::", "hello", "hello.world"},
|
||||
}, {
|
||||
name: "hello_v6-alias",
|
||||
rule: "|hello.world.again^$dnsrewrite=NOERROR;AAAA;::",
|
||||
wantTrans: []string{"::", "hello.world.again"},
|
||||
}, {
|
||||
name: "simplehost_ptr",
|
||||
rule: "|1.0.0.1.in-addr.arpa^$dnsrewrite=NOERROR;PTR;simplehost.",
|
||||
wantTrans: []string{"1.0.0.1", "simplehost"},
|
||||
}, {
|
||||
name: "hello_ptr",
|
||||
rule: "|0.0.0.1.in-addr.arpa^$dnsrewrite=NOERROR;PTR;hello.",
|
||||
wantTrans: []string{"1.0.0.0", "hello", "hello.world"},
|
||||
}, {
|
||||
name: "hello_ptr-alias",
|
||||
rule: "|0.0.0.1.in-addr.arpa^$dnsrewrite=NOERROR;PTR;hello.world.again.",
|
||||
wantTrans: []string{"1.0.0.0", "hello.world.again"},
|
||||
}, {
|
||||
name: "simplehost_ptr_v6",
|
||||
rule: "|1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.ip6.arpa" +
|
||||
"^$dnsrewrite=NOERROR;PTR;simplehost.",
|
||||
wantTrans: []string{"::1", "simplehost"},
|
||||
}, {
|
||||
name: "hello_ptr_v6",
|
||||
rule: "|0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.ip6.arpa" +
|
||||
"^$dnsrewrite=NOERROR;PTR;hello.",
|
||||
wantTrans: []string{"::", "hello", "hello.world"},
|
||||
}, {
|
||||
name: "hello_ptr_v6-alias",
|
||||
rule: "|0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.ip6.arpa" +
|
||||
"^$dnsrewrite=NOERROR;PTR;hello.world.again.",
|
||||
wantTrans: []string{"::", "hello.world.again"},
|
||||
}}
|
||||
|
||||
for _, tc := range testCases {
|
||||
t.Run(tc.name, func(t *testing.T) {
|
||||
got := stringutil.NewSet(strings.Fields(hc.Translate(tc.rule))...)
|
||||
assert.True(t, stringutil.NewSet(tc.wantTrans...).Equal(got))
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func TestHostsContainer(t *testing.T) {
|
||||
const listID = 1234
|
||||
|
||||
require.NoError(t, fstest.TestFS(testdata, "etc_hosts"))
|
||||
|
||||
testCases := []struct {
|
||||
req *urlfilter.DNSRequest
|
||||
req string
|
||||
name string
|
||||
want []*rules.DNSRewrite
|
||||
want []*hostsfile.Record
|
||||
}{{
|
||||
req: &urlfilter.DNSRequest{
|
||||
Hostname: "simplehost",
|
||||
DNSType: dns.TypeA,
|
||||
},
|
||||
req: "simplehost",
|
||||
name: "simple",
|
||||
want: []*rules.DNSRewrite{{
|
||||
RCode: dns.RcodeSuccess,
|
||||
Value: net.IPv4(1, 0, 0, 1),
|
||||
RRType: dns.TypeA,
|
||||
}, {
|
||||
RCode: dns.RcodeSuccess,
|
||||
Value: net.ParseIP("::1"),
|
||||
RRType: dns.TypeAAAA,
|
||||
}},
|
||||
want: append(testHosts[addr1001], testHosts[addr1]...),
|
||||
}, {
|
||||
req: &urlfilter.DNSRequest{
|
||||
Hostname: "hello.world",
|
||||
DNSType: dns.TypeA,
|
||||
},
|
||||
req: "hello.world",
|
||||
name: "hello_alias",
|
||||
want: []*rules.DNSRewrite{{
|
||||
RCode: dns.RcodeSuccess,
|
||||
Value: net.IPv4(1, 0, 0, 0),
|
||||
RRType: dns.TypeA,
|
||||
}, {
|
||||
RCode: dns.RcodeSuccess,
|
||||
Value: net.ParseIP("::"),
|
||||
RRType: dns.TypeAAAA,
|
||||
}},
|
||||
}, {
|
||||
req: &urlfilter.DNSRequest{
|
||||
Hostname: "hello.world.again",
|
||||
DNSType: dns.TypeA,
|
||||
want: []*hostsfile.Record{
|
||||
testHosts[addr1000][0],
|
||||
testHosts[addr1000][2],
|
||||
testHosts[addr0][0],
|
||||
testHosts[addr0][2],
|
||||
},
|
||||
}, {
|
||||
req: "hello.world.again",
|
||||
name: "other_line_alias",
|
||||
want: []*rules.DNSRewrite{{
|
||||
RCode: dns.RcodeSuccess,
|
||||
Value: net.IPv4(1, 0, 0, 0),
|
||||
RRType: dns.TypeA,
|
||||
}, {
|
||||
RCode: dns.RcodeSuccess,
|
||||
Value: net.ParseIP("::"),
|
||||
RRType: dns.TypeAAAA,
|
||||
}},
|
||||
}, {
|
||||
req: &urlfilter.DNSRequest{
|
||||
Hostname: "say.hello",
|
||||
DNSType: dns.TypeA,
|
||||
want: []*hostsfile.Record{
|
||||
testHosts[addr1000][1],
|
||||
testHosts[addr0][1],
|
||||
},
|
||||
}, {
|
||||
req: "say.hello",
|
||||
name: "hello_subdomain",
|
||||
want: []*rules.DNSRewrite{},
|
||||
}, {
|
||||
req: &urlfilter.DNSRequest{
|
||||
Hostname: "say.hello.world",
|
||||
DNSType: dns.TypeA,
|
||||
},
|
||||
name: "hello_alias_subdomain",
|
||||
want: []*rules.DNSRewrite{},
|
||||
}, {
|
||||
req: &urlfilter.DNSRequest{
|
||||
Hostname: "for.testing",
|
||||
DNSType: dns.TypeA,
|
||||
},
|
||||
name: "lots_of_aliases",
|
||||
want: []*rules.DNSRewrite{{
|
||||
RCode: dns.RcodeSuccess,
|
||||
RRType: dns.TypeA,
|
||||
Value: net.IPv4(1, 0, 0, 2),
|
||||
}, {
|
||||
RCode: dns.RcodeSuccess,
|
||||
RRType: dns.TypeAAAA,
|
||||
Value: net.ParseIP("::2"),
|
||||
}},
|
||||
}, {
|
||||
req: &urlfilter.DNSRequest{
|
||||
Hostname: "1.0.0.1.in-addr.arpa",
|
||||
DNSType: dns.TypePTR,
|
||||
},
|
||||
name: "reverse",
|
||||
want: []*rules.DNSRewrite{{
|
||||
RCode: dns.RcodeSuccess,
|
||||
RRType: dns.TypePTR,
|
||||
Value: "simplehost.",
|
||||
}},
|
||||
}, {
|
||||
req: &urlfilter.DNSRequest{
|
||||
Hostname: "nonexistent.example",
|
||||
DNSType: dns.TypeA,
|
||||
},
|
||||
name: "non-existing",
|
||||
want: []*rules.DNSRewrite{},
|
||||
}, {
|
||||
req: &urlfilter.DNSRequest{
|
||||
Hostname: "1.0.0.1.in-addr.arpa",
|
||||
DNSType: dns.TypeSRV,
|
||||
},
|
||||
name: "bad_type",
|
||||
want: nil,
|
||||
}, {
|
||||
req: &urlfilter.DNSRequest{
|
||||
Hostname: "domain",
|
||||
DNSType: dns.TypeA,
|
||||
},
|
||||
req: "say.hello.world",
|
||||
name: "hello_alias_subdomain",
|
||||
want: nil,
|
||||
}, {
|
||||
req: "for.testing",
|
||||
name: "lots_of_aliases",
|
||||
want: append(testHosts[addr1002], testHosts[addr2]...),
|
||||
}, {
|
||||
req: "nonexistent.example",
|
||||
name: "non-existing",
|
||||
want: nil,
|
||||
}, {
|
||||
req: "domain",
|
||||
name: "issue_4216_4_6",
|
||||
want: []*rules.DNSRewrite{{
|
||||
RCode: dns.RcodeSuccess,
|
||||
RRType: dns.TypeA,
|
||||
Value: net.IPv4(4, 2, 1, 6),
|
||||
}, {
|
||||
RCode: dns.RcodeSuccess,
|
||||
RRType: dns.TypeAAAA,
|
||||
Value: net.ParseIP("::42"),
|
||||
}},
|
||||
want: append(testHosts[addr4216], testHosts[addr42]...),
|
||||
}, {
|
||||
req: &urlfilter.DNSRequest{
|
||||
Hostname: "domain4",
|
||||
DNSType: dns.TypeA,
|
||||
},
|
||||
req: "domain4",
|
||||
name: "issue_4216_4",
|
||||
want: []*rules.DNSRewrite{{
|
||||
RCode: dns.RcodeSuccess,
|
||||
RRType: dns.TypeA,
|
||||
Value: net.IPv4(7, 5, 3, 1),
|
||||
}, {
|
||||
RCode: dns.RcodeSuccess,
|
||||
RRType: dns.TypeA,
|
||||
Value: net.IPv4(1, 3, 5, 7),
|
||||
}},
|
||||
want: append(testHosts[addr1357], testHosts[addr7531]...),
|
||||
}, {
|
||||
req: &urlfilter.DNSRequest{
|
||||
Hostname: "domain6",
|
||||
DNSType: dns.TypeAAAA,
|
||||
},
|
||||
req: "domain6",
|
||||
name: "issue_4216_6",
|
||||
want: []*rules.DNSRewrite{{
|
||||
RCode: dns.RcodeSuccess,
|
||||
RRType: dns.TypeAAAA,
|
||||
Value: net.ParseIP("::13"),
|
||||
}, {
|
||||
RCode: dns.RcodeSuccess,
|
||||
RRType: dns.TypeAAAA,
|
||||
Value: net.ParseIP("::31"),
|
||||
}},
|
||||
want: append(testHosts[addr13], testHosts[addr31]...),
|
||||
}}
|
||||
|
||||
hc, err := aghnet.NewHostsContainer(testdata, &stubWatcher, "etc_hosts")
|
||||
require.NoError(t, err)
|
||||
testutil.CleanupAndRequireSuccess(t, hc.Close)
|
||||
|
||||
for _, tc := range testCases {
|
||||
t.Run(tc.name, func(t *testing.T) {
|
||||
recs := hc.MatchName(tc.req)
|
||||
assert.Equal(t, tc.want, recs)
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func TestHostsContainer_MatchAddr(t *testing.T) {
|
||||
require.NoError(t, fstest.TestFS(testdata, "etc_hosts"))
|
||||
|
||||
stubWatcher := aghtest.FSWatcher{
|
||||
OnEvents: func() (e <-chan struct{}) { return nil },
|
||||
OnAdd: func(name string) (err error) { return nil },
|
||||
OnClose: func() (err error) { return nil },
|
||||
}
|
||||
|
||||
hc, err := aghnet.NewHostsContainer(listID, testdata, &stubWatcher, "etc_hosts")
|
||||
hc, err := aghnet.NewHostsContainer(testdata, &stubWatcher, "etc_hosts")
|
||||
require.NoError(t, err)
|
||||
testutil.CleanupAndRequireSuccess(t, hc.Close)
|
||||
|
||||
testCases := []struct {
|
||||
req netip.Addr
|
||||
name string
|
||||
want []*hostsfile.Record
|
||||
}{{
|
||||
req: netip.AddrFrom4([4]byte{1, 0, 0, 1}),
|
||||
name: "reverse",
|
||||
want: testHosts[addr1001],
|
||||
}}
|
||||
|
||||
for _, tc := range testCases {
|
||||
t.Run(tc.name, func(t *testing.T) {
|
||||
res, ok := hc.MatchRequest(tc.req)
|
||||
require.False(t, ok)
|
||||
|
||||
if tc.want == nil {
|
||||
assert.Nil(t, res)
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
require.NotNil(t, res)
|
||||
|
||||
rewrites := res.DNSRewrites()
|
||||
require.Len(t, rewrites, len(tc.want))
|
||||
|
||||
for i, rewrite := range rewrites {
|
||||
require.Equal(t, listID, rewrite.FilterListID)
|
||||
|
||||
rw := rewrite.DNSRewrite
|
||||
require.NotNil(t, rw)
|
||||
|
||||
assert.Equal(t, tc.want[i], rw)
|
||||
}
|
||||
recs := hc.MatchAddr(tc.req)
|
||||
assert.Equal(t, tc.want, recs)
|
||||
})
|
||||
}
|
||||
}
|
||||
|
|
56
internal/aghnet/ignore.go
Normal file
56
internal/aghnet/ignore.go
Normal file
|
@ -0,0 +1,56 @@
|
|||
package aghnet
|
||||
|
||||
import (
|
||||
"strings"
|
||||
|
||||
"github.com/AdguardTeam/urlfilter"
|
||||
"github.com/AdguardTeam/urlfilter/filterlist"
|
||||
"golang.org/x/exp/slices"
|
||||
)
|
||||
|
||||
// IgnoreEngine contains the list of rules for ignoring hostnames and matches
|
||||
// them.
|
||||
//
|
||||
// TODO(s.chzhen): Move all urlfilter stuff to aghfilter.
|
||||
type IgnoreEngine struct {
|
||||
// engine is the filtering engine that can match rules for ignoring
|
||||
// hostnames.
|
||||
engine *urlfilter.DNSEngine
|
||||
|
||||
// ignored is the list of rules for ignoring hostnames.
|
||||
ignored []string
|
||||
}
|
||||
|
||||
// NewIgnoreEngine creates a new instance of the IgnoreEngine and stores the
|
||||
// list of rules for ignoring hostnames.
|
||||
func NewIgnoreEngine(ignored []string) (e *IgnoreEngine, err error) {
|
||||
ruleList := &filterlist.StringRuleList{
|
||||
RulesText: strings.ToLower(strings.Join(ignored, "\n")),
|
||||
IgnoreCosmetic: true,
|
||||
}
|
||||
ruleStorage, err := filterlist.NewRuleStorage([]filterlist.RuleList{ruleList})
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return &IgnoreEngine{
|
||||
engine: urlfilter.NewDNSEngine(ruleStorage),
|
||||
ignored: ignored,
|
||||
}, nil
|
||||
}
|
||||
|
||||
// Has returns true if IgnoreEngine matches the host.
|
||||
func (e *IgnoreEngine) Has(host string) (ignore bool) {
|
||||
if e == nil {
|
||||
return false
|
||||
}
|
||||
|
||||
_, ignore = e.engine.Match(host)
|
||||
|
||||
return ignore
|
||||
}
|
||||
|
||||
// Values returns a copy of list of rules for ignoring hostnames.
|
||||
func (e *IgnoreEngine) Values() (ignored []string) {
|
||||
return slices.Clone(e.ignored)
|
||||
}
|
46
internal/aghnet/ignore_test.go
Normal file
46
internal/aghnet/ignore_test.go
Normal file
|
@ -0,0 +1,46 @@
|
|||
package aghnet_test
|
||||
|
||||
import (
|
||||
"testing"
|
||||
|
||||
"github.com/AdguardTeam/AdGuardHome/internal/aghnet"
|
||||
"github.com/stretchr/testify/require"
|
||||
)
|
||||
|
||||
func TestIgnoreEngine_Has(t *testing.T) {
|
||||
hostnames := []string{
|
||||
"*.example.com",
|
||||
"example.com",
|
||||
"|.^",
|
||||
}
|
||||
|
||||
engine, err := aghnet.NewIgnoreEngine(hostnames)
|
||||
require.NotNil(t, engine)
|
||||
require.NoError(t, err)
|
||||
|
||||
testCases := []struct {
|
||||
name string
|
||||
host string
|
||||
ignore bool
|
||||
}{{
|
||||
name: "basic",
|
||||
host: "example.com",
|
||||
ignore: true,
|
||||
}, {
|
||||
name: "root",
|
||||
host: ".",
|
||||
ignore: true,
|
||||
}, {
|
||||
name: "wildcard",
|
||||
host: "www.example.com",
|
||||
ignore: true,
|
||||
}, {
|
||||
name: "not_ignored",
|
||||
host: "something.com",
|
||||
ignore: false,
|
||||
}}
|
||||
|
||||
for _, tc := range testCases {
|
||||
require.Equal(t, tc.ignore, engine.Has(tc.host))
|
||||
}
|
||||
}
|
|
@ -4,7 +4,6 @@ package aghnet
|
|||
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"net"
|
||||
"os"
|
||||
"syscall"
|
||||
|
@ -24,20 +23,9 @@ func reuseAddrCtrl(_, _ string, c syscall.RawConn) (err error) {
|
|||
}
|
||||
})
|
||||
|
||||
const (
|
||||
errMsg = "setting control options"
|
||||
errMsgFmt = errMsg + ": %w"
|
||||
)
|
||||
err = errors.Join(err, cerr)
|
||||
|
||||
if err != nil && cerr != nil {
|
||||
err = errors.List(errMsg, err, cerr)
|
||||
} else if err != nil {
|
||||
err = fmt.Errorf(errMsgFmt, err)
|
||||
} else if cerr != nil {
|
||||
err = fmt.Errorf(errMsgFmt, cerr)
|
||||
}
|
||||
|
||||
return err
|
||||
return errors.Annotate(err, "setting control options: %w")
|
||||
}
|
||||
|
||||
// listenPacketReusable announces on the local network address additionally
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue