Compare commits

...

6 Commits

Author SHA1 Message Date
Ainar Garipov
f7d259f653 all: fix chlog 2023-11-13 18:00:38 +03:00
Ainar Garipov
82ab4328d4 all: sync with master; upd chlog 2023-11-13 17:39:48 +03:00
Ainar Garipov
b21e19a223 all: sync with master; upd chlog 2023-10-18 17:04:44 +03:00
Ainar Garipov
c6aed4eb57 cherry-pick: 6180 revert 2023-10-11 18:35:46 +03:00
Ainar Garipov
760d466b38 all: sync with master; upd chlog 2023-10-11 17:31:41 +03:00
Ainar Garipov
258eecc55b all: sync with master; upd chlog 2023-09-11 17:51:50 +03:00
182 changed files with 41954 additions and 19627 deletions

View File

@@ -1,8 +1,8 @@
'name': 'build'
'env':
'GO_VERSION': '1.20.8'
'NODE_VERSION': '14'
'GO_VERSION': '1.20.11'
'NODE_VERSION': '16'
'on':
'push':

View File

@@ -1,7 +1,7 @@
'name': 'lint'
'env':
'GO_VERSION': '1.20.8'
'GO_VERSION': '1.20.11'
'on':
'push':

View File

@@ -14,11 +14,11 @@ and this project adheres to
<!--
## [v0.108.0] - TBA
## [v0.107.38] - 2023-09-20 (APPROX.)
## [v0.107.42] - 2023-12-06 (APPROX.)
See also the [v0.107.38 GitHub milestone][ms-v0.107.38].
See also the [v0.107.42 GitHub milestone][ms-v0.107.42].
[ms-v0.107.38]: https://github.com/AdguardTeam/AdGuardHome/milestone/73?closed=1
[ms-v0.107.42]: https://github.com/AdguardTeam/AdGuardHome/milestone/76?closed=1
NOTE: Add new changes BELOW THIS COMMENT.
-->
@@ -29,6 +29,150 @@ NOTE: Add new changes ABOVE THIS COMMENT.
## [v0.107.41] - 2023-11-13
See also the [v0.107.41 GitHub milestone][ms-v0.107.41].
### Security
- Go version has been updated to prevent the possibility of exploiting the
CVE-2023-45283 and CVE-2023-45284 Go vulnerabilities fixed in
[Go 1.20.11][go-1.20.11].
### Added
- Ability to specify subnet lengths for IPv4 and IPv6 addresses, used for rate
limiting requests, in the configuration file ([#6368]).
- Ability to specify multiple domain specific upstreams per line, e.g.
`[/domain1/../domain2/]upstream1 upstream2 .. upstreamN` ([#4977]).
### Changed
- The height of ready-to-use filter lists has been increased ([#6358]).
- Improved authentication failure logging ([#6357]).
#### Configuration Changes
- New properties `dns.ratelimit_subnet_len_ipv4` and
`dns.ratelimit_subnet_len_ipv6` in the configuration file ([#6368]).
### Fixed
- Missing timezone on schedule form submission ([#6401]).
- Average request processing time calculation ([#6220]).
- Redundant shortening long client names in the Top Clients table ([#6338]).
- Scrolling column headers in the tables ([#6337]).
- `$important,dnsrewrite` rules do not take precedence over allowlist rules
([#6204]).
- Dark mode DNS rewrite background ([#6329]).
- Issues with QUIC and HTTP/3 upstreams on Linux ([#6335]).
[#4977]: https://github.com/AdguardTeam/AdGuardHome/issues/4977
[#6204]: https://github.com/AdguardTeam/AdGuardHome/issues/6204
[#6220]: https://github.com/AdguardTeam/AdGuardHome/issues/6220
[#6329]: https://github.com/AdguardTeam/AdGuardHome/issues/6329
[#6335]: https://github.com/AdguardTeam/AdGuardHome/issues/6335
[#6337]: https://github.com/AdguardTeam/AdGuardHome/issues/6337
[#6338]: https://github.com/AdguardTeam/AdGuardHome/issues/6338
[#6357]: https://github.com/AdguardTeam/AdGuardHome/issues/6357
[#6358]: https://github.com/AdguardTeam/AdGuardHome/issues/6358
[#6368]: https://github.com/AdguardTeam/AdGuardHome/issues/6368
[#6401]: https://github.com/AdguardTeam/AdGuardHome/issues/6401
[go-1.20.11]: https://groups.google.com/g/golang-announce/c/4tU8LZfBFkY/m/d-jSKR_jBwAJ
[ms-v0.107.41]: https://github.com/AdguardTeam/AdGuardHome/milestone/76?closed=1
## [v0.107.40] - 2023-10-18
See also the [v0.107.40 GitHub milestone][ms-v0.107.40].
### Changed
- *Block* and *Unblock* buttons of the query log moved to the tooltip menu
([#684]).
### Fixed
- Dashboard tables scroll issue ([#6180]).
- The time shown in the statistics is one hour less than the current time
([#6296]).
- Issues with QUIC and HTTP/3 upstreams on FreeBSD ([#6301]).
- Panic on clearing the query log ([#6304]).
[#684]: https://github.com/AdguardTeam/AdGuardHome/issues/684
[#6180]: https://github.com/AdguardTeam/AdGuardHome/issues/6180
[#6296]: https://github.com/AdguardTeam/AdGuardHome/issues/6296
[#6301]: https://github.com/AdguardTeam/AdGuardHome/issues/6301
[#6304]: https://github.com/AdguardTeam/AdGuardHome/issues/6304
[ms-v0.107.40]: https://github.com/AdguardTeam/AdGuardHome/milestone/75?closed=1
## [v0.107.39] - 2023-10-11
See also the [v0.107.39 GitHub milestone][ms-v0.107.39].
### Security
- Go version has been updated to prevent the possibility of exploiting the
CVE-2023-39323 and CVE-2023-39325 Go vulnerabilities fixed in
[Go 1.20.9][go-1.20.9] and [Go 1.20.10][go-1.20.10].
### Added
- Ability to edit static leases on *DHCP settings* page ([#1700]).
- Ability to specify for how long clients should cache a filtered response,
using the *Blocked response TTL* field on the *DNS settings* page ([#4569]).
### Changed
- `ipset` entries are updated more frequently ([#6233]).
- Node.JS 16 is now required to build the frontend.
### Fixed
- Incorrect domain-specific upstream matching for `DS` queries ([#6156]).
- Improper validation of password length ([#6280]).
- Wrong algorithm for filtering self addresses from the list of private upstream
DNS servers ([#6231]).
- An accidental change in DNS rewrite priority ([#6226]).
[#1700]: https://github.com/AdguardTeam/AdGuardHome/issues/1700
[#4569]: https://github.com/AdguardTeam/AdGuardHome/issues/4569
[#6156]: https://github.com/AdguardTeam/AdGuardHome/issues/6156
[#6226]: https://github.com/AdguardTeam/AdGuardHome/issues/6226
[#6231]: https://github.com/AdguardTeam/AdGuardHome/issues/6231
[#6233]: https://github.com/AdguardTeam/AdGuardHome/issues/6233
[#6280]: https://github.com/AdguardTeam/AdGuardHome/issues/6280
[go-1.20.10]: https://groups.google.com/g/golang-announce/c/iNNxDTCjZvo/m/UDd7VKQuAAAJ
[go-1.20.9]: https://groups.google.com/g/golang-announce/c/XBa1oHDevAo/m/desYyx3qAgAJ
[ms-v0.107.39]: https://github.com/AdguardTeam/AdGuardHome/milestone/74?closed=1
## [v0.107.38] - 2023-09-11
See also the [v0.107.38 GitHub milestone][ms-v0.107.38].
### Fixed
- Incorrect original answer when a response is filtered ([#6183]).
- Comments in the *Fallback DNS servers* field in the UI ([#6182]).
- Empty or default Safe Browsing and Parental Control settings ([#6181]).
- Various UI issues.
[#6181]: https://github.com/AdguardTeam/AdGuardHome/issues/6181
[#6182]: https://github.com/AdguardTeam/AdGuardHome/issues/6182
[#6183]: https://github.com/AdguardTeam/AdGuardHome/issues/6183
[ms-v0.107.38]: https://github.com/AdguardTeam/AdGuardHome/milestone/73?closed=1
## [v0.107.37] - 2023-09-07
See also the [v0.107.37 GitHub milestone][ms-v0.107.37].
@@ -219,6 +363,10 @@ See also the [v0.107.36 GitHub milestone][ms-v0.107.36].
- Client hostnames not resolving when upstream server responds with zero-TTL
records ([#6046]).
### Removed
- Go 1.19 support, as it has reached end of life.
[#6046]: https://github.com/AdguardTeam/AdGuardHome/issues/6046
[#6049]: https://github.com/AdguardTeam/AdGuardHome/issues/6049
@@ -2464,11 +2612,15 @@ See also the [v0.104.2 GitHub milestone][ms-v0.104.2].
<!--
[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.42...HEAD
[v0.107.42]: https://github.com/AdguardTeam/AdGuardHome/compare/v0.107.41...v0.107.42
-->
[Unreleased]: https://github.com/AdguardTeam/AdGuardHome/compare/v0.107.37...HEAD
[Unreleased]: https://github.com/AdguardTeam/AdGuardHome/compare/v0.107.41...HEAD
[v0.107.41]: https://github.com/AdguardTeam/AdGuardHome/compare/v0.107.40...v0.107.41
[v0.107.40]: https://github.com/AdguardTeam/AdGuardHome/compare/v0.107.39...v0.107.40
[v0.107.39]: https://github.com/AdguardTeam/AdGuardHome/compare/v0.107.38...v0.107.39
[v0.107.38]: https://github.com/AdguardTeam/AdGuardHome/compare/v0.107.37...v0.107.38
[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

View File

@@ -24,6 +24,7 @@ CHANNEL = development
CLIENT_DIR = client
COMMIT = $$( git rev-parse --short HEAD )
DIST_DIR = dist
GOAMD64 = v1
GOPROXY = https://goproxy.cn|https://proxy.golang.org|direct
GOSUMDB = sum.golang.google.cn
GPG_KEY = devteam@adguard.com
@@ -37,6 +38,8 @@ SIGN = 1
VERSION = v0.0.0
YARN = yarn
NEXTAPI = 0
# Macros for the build-release target. If FRONTEND_PREBUILT is 0, the
# default, the macro $(BUILD_RELEASE_DEPS_$(FRONTEND_PREBUILT)) expands
# into BUILD_RELEASE_DEPS_0, and so both frontend and backend
@@ -59,11 +62,13 @@ ENV = env\
GPG_KEY_PASSPHRASE='$(GPG_KEY_PASSPHRASE)'\
DIST_DIR='$(DIST_DIR)'\
GO="$(GO.MACRO)"\
GOAMD64="$(GOAMD64)"\
GOPROXY='$(GOPROXY)'\
GOSUMDB='$(GOSUMDB)'\
PATH="$${PWD}/bin:$$( "$(GO.MACRO)" env GOPATH )/bin:$${PATH}"\
RACE='$(RACE)'\
SIGN='$(SIGN)'\
NEXTAPI='$(NEXTAPI)'\
VERBOSE="$(VERBOSE.MACRO)"\
VERSION='$(VERSION)'\

View File

@@ -201,7 +201,7 @@ opinion, this cannot be legitimately counted as a Pi-Hole's feature.
| Cross-platform | ✅ | ❌ (not natively, only via Docker) |
| Running as a DNS-over-HTTPS or DNS-over-TLS server | ✅ | ❌ (requires additional software) |
| Blocking phishing and malware domains | ✅ | ❌ (requires non-default blocklists) |
| Parental control (blocking adult domains) | ✅ | ❌ |
| Parental control (blocking adult domains) | ✅ | ❌ (requires non-default blocklists) |
| Force Safe search on search engines | ✅ | ❌ |
| Per-client (device) configuration | ✅ | ✅ |
| Access settings (choose who can use AGH DNS) | ✅ | ❌ |
@@ -262,8 +262,8 @@ Run `make init` to prepare the development environment.
You will need this to build AdGuard Home:
* [Go](https://golang.org/dl/) v1.20 or later;
* [Node.js](https://nodejs.org/en/download/) v10.16.2 or later;
* [npm](https://www.npmjs.com/) v6.14 or later;
* [Node.js](https://nodejs.org/en/download/) v16 or later;
* [npm](https://www.npmjs.com/) v8 or later;
* [yarn](https://yarnpkg.com/) v1.22.5 or later.

View File

@@ -7,7 +7,7 @@
# Make sure to sync any changes with the branch overrides below.
'variables':
'channel': 'edge'
'dockerGo': 'adguard/golang-ubuntu:7.1'
'dockerGo': 'adguard/golang-ubuntu:7.5'
'stages':
- 'Build frontend':
@@ -272,7 +272,7 @@
# need to build a few of these.
'variables':
'channel': 'beta'
'dockerGo': 'adguard/golang-ubuntu:7.1'
'dockerGo': 'adguard/golang-ubuntu:7.5'
# 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.1'
'dockerGo': 'adguard/golang-ubuntu:7.5'

View File

@@ -10,7 +10,7 @@
# Make sure to sync any changes with the branch overrides below.
'variables':
'channel': 'edge'
'dockerGo': 'adguard/golang-ubuntu:7.1'
'dockerGo': 'adguard/golang-ubuntu:7.5'
'snapcraftChannel': 'edge'
'stages':
@@ -191,7 +191,7 @@
# need to build a few of these.
'variables':
'channel': 'beta'
'dockerGo': 'adguard/golang-ubuntu:7.1'
'dockerGo': 'adguard/golang-ubuntu:7.5'
'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.1'
'dockerGo': 'adguard/golang-ubuntu:7.5'
'snapcraftChannel': 'candidate'

View File

@@ -5,7 +5,7 @@
'key': 'AHBRTSPECS'
'name': 'AdGuard Home - Build and run tests'
'variables':
'dockerGo': 'adguard/golang-ubuntu:7.1'
'dockerGo': 'adguard/golang-ubuntu:7.5'
'stages':
- 'Tests':

53565
client/package-lock.json generated vendored

File diff suppressed because it is too large Load Diff

1
client/package.json vendored
View File

@@ -42,7 +42,6 @@
"redux-actions": "^2.6.5",
"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"
},

View File

@@ -278,6 +278,7 @@
"custom_ip": "عنوان IP مخصص",
"blocking_ipv4": "حجب عنوان IPv4",
"blocking_ipv6": "حجب عنوان IPv6",
"blocked_response_ttl": "زمن حظر الاستجابة",
"dnscrypt": "DNSCrypt",
"dns_over_https": "DNS-over-HTTPS",
"dns_over_tls": "DNS-over-TLS",
@@ -598,7 +599,7 @@
"all_queries": "كافة الاستفسارات",
"show_blocked_responses": "حظر",
"show_whitelisted_responses": "القائمة البيضاء",
"show_processed_responses": "المعالجة",
"show_processed_responses": "معالجة",
"blocked_safebrowsing": "محظور بواسطة التصفح الآمن",
"blocked_adult_websites": "محظور بواسطة الرقابة الأبوية",
"blocked_threats": "التهديدات المحظورة",

View File

@@ -73,7 +73,9 @@
"dhcp_dynamic_ip_found": "Ваша сістэма выкарыстоўвае дынамічны IP-адрас для інтэрфейсу <0>{{interfaceName}}</0>. Каб выкарыстоўваць DHCP-сервер трэба ўсталяваць статычны IP-адрас. Ваш бягучы IP-адрас <0>{{ipAddress}}</0>. Мы аўтаматычна ўсталюем яго як статычны, калі вы націснеце кнопку «Ўключыць DHCP».",
"dhcp_lease_added": "Статычная арэнда «{{key}}» паспяхова дададзена",
"dhcp_lease_deleted": "Статычная арэнда «{{key}}» паспяхова выдалена",
"dhcp_lease_updated": "Статычная арэнда \"{{key}}\" паспяхова абноўлена",
"dhcp_new_static_lease": "Новая статычная арэнда",
"dhcp_edit_static_lease": "Рэдагаваць статычную арэнду",
"dhcp_static_leases_not_found": "Не знойдзена статычных арэнд DHCP",
"dhcp_add_static_lease": "Дадаць статычную арэнду",
"dhcp_reset_leases": "Скінуць усё арэнды",
@@ -117,7 +119,8 @@
"stats_malware_phishing": "Заблакаваныя шкодныя і фішынгавыя сайты",
"stats_adult": "Заблакаваныя «дарослыя» сайты",
"stats_query_domain": "Часта запытаныя дамены",
"for_last_24_hours": "за 24 гадзіны",
"for_last_hours": "за апошнюю {{count}} гадзіну",
"for_last_hours_plural": "за апошнія {{count}} гадзін",
"for_last_days": "за апошні {{count}} дзень",
"for_last_days_plural": "за апошнія {{count}} дзён",
"stats_disabled": "Статыстыка была адключаная. Вы можаце ўключыць яго <0>на старонцы налад </0>.",
@@ -132,14 +135,14 @@
"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 гадзіны",
"number_of_dns_query_hours": "Колькасць DNS-запытаў, апрацаваных за апошнюю {{count}} гадзіну",
"number_of_dns_query_hours_plural": "Колькасць DNS-запытаў, апрацаваных за апошнія {{count}} гадзін",
"number_of_dns_query_blocked_24_hours": "Колькасць DNS-запытаў, заблакаваных фільтрамі і блок-спісамі",
"number_of_dns_query_blocked_24_hours_by_sec": "Колькасць DNS-запытаў, заблакаваных модулем Антыфішынгу AdGuard",
"number_of_dns_query_blocked_24_hours_adult": "Колькасць заблакаваных «сайтаў для дарослых»",
"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>».",
@@ -174,6 +177,7 @@
"enabled_parental_toast": "Уключаны бацькоўскі кантроль",
"disabled_safe_search_toast": "Адключаны бяспечны пошук",
"enabled_save_search_toast": "Уключаны бяспечны пошук",
"updated_save_search_toast": "Налады бяспечнага пошуку абноўлены",
"enabled_table_header": "УКЛ.",
"name_table_header": "Імя",
"list_url_table_header": "URL-адрас спіса",
@@ -282,6 +286,9 @@
"custom_ip": "Свой IP",
"blocking_ipv4": "Блакаванне IPv4",
"blocking_ipv6": "Блакаванне IPv6",
"blocked_response_ttl": "TTL заблакаванага адказу",
"blocked_response_ttl_desc": "Паказвае, на працягу колькіх секунд кліенты павінны кэшаваць адфільтраваць адказ",
"form_enter_blocked_response_ttl": "Увядзіце TTL заблакіраванага адказу (у секундах)",
"dnscrypt": "DNSCrypt",
"dns_over_https": "DNS-over-HTTPS",
"dns_over_tls": "DNS-over-TLS",
@@ -297,6 +304,8 @@
"rate_limit": "Ограничение скорости",
"edns_enable": "Уключыць адпраўленне EDNS Client Subnet",
"edns_cs_desc": "Дадайце опцыю кліенцкай падсеткі EDNS (ECS) да запытаў вышэй па плыні і запісвайце значэнні, адпраўленыя кліентамі, у журнал запытаў.",
"edns_use_custom_ip": "Выкарыстоўваць указаны IP для DNS",
"edns_use_custom_ip_desc": "Дазволіць выкарыстоўваць уласны IP для DNS",
"rate_limit_desc": "Абмежаванне на колькасць запытаў у секунду для кожнага кліента (0 — неабмежавана)",
"blocking_ipv4_desc": "IP-адрас, што вяртаецца пры блакаванню A-запыту",
"blocking_ipv6_desc": "IP-адрас, што вяртаецца пры блакаванню AAAA-запыту",
@@ -532,6 +541,10 @@
"statistics_retention_confirm": "Вы ўпэўнены, што хочаце змяніць тэрмін захоўвання статыстыкі? Пры памяншэнні інтэрвалу, некаторыя даныя могуць быць страчаны",
"statistics_cleared": "Статыстыка паспяхова вычышчана",
"statistics_enable": "Уключыць статыстыку",
"ignore_domains": "Ігнаруемыя дамены (парадкова)",
"ignore_domains_title": "Ігнаруемыя дамены",
"ignore_domains_desc_stats": "Запыты, якія адпавядаюць гэтым правілам, не запісваюцца ў статыстыку",
"ignore_domains_desc_query": "Запыты, якія адпавядаюць гэтым правілам, не запісваюцца ў часопіс запытаў",
"interval_hours": "{{count}} гадзіна",
"interval_hours_plural": "{{count}} гадзін",
"filters_configuration": "Налада фільтраў",
@@ -647,13 +660,32 @@
"parental_control": "Бацькоўскі кантроль",
"safe_browsing": "Бяспечны інтэрнэт",
"served_from_cache": "{{value}} <i>(атрымана з кэша)</i>",
"form_error_password_length": "Пароль павінен быць не менш за {{value}} сімвалаў",
"form_error_password_length": "Пароль павінен утрымліваць ад {{min}} да {{max}} сімвалаў",
"anonymizer_notification": "<0>Заўвага:</0> Ананімізацыя IP уключана. Вы можаце адключыць яе ў <1>Агульных наладах</1>.",
"confirm_dns_cache_clear": "Вы ўпэўнены, што хочаце ачысціць кэш DNS?",
"cache_cleared": "Кэш DNS паспяхова ачышчаны",
"clear_cache": "Ачысціць кэш",
"make_static": "Зрабіць статычнай",
"theme_auto_desc": "Аўто (на аснове каляровай схемы вашага прылады)",
"theme_dark_desc": "Цёмная тэма",
"theme_light_desc": "Светлая тэма",
"disable_for_seconds": "На {{count}} секунд",
"disable_for_seconds_plural": "На {{count}} секунд",
"disable_for_minutes": "На {{count}} хвіліну",
"disable_for_minutes_plural": "На {{count}} хвілін",
"disable_for_hours": "На {{count}} гадзін",
"disable_for_hours_plural": "На {{count}} гадзін",
"disable_until_tomorrow": "Да заўтра",
"disable_notify_for_seconds": "Адключыць абарону на {{count}} секунд",
"disable_notify_for_seconds_plural": "Адключыць абарону на {{count}} секунд",
"disable_notify_for_minutes": "Адключыць абарону на {{count}} хвіліну",
"disable_notify_for_minutes_plural": "Адключыць абарону на {{count}} хвілін",
"disable_notify_for_hours": "Адключыць абарону на {{count}} гадзін",
"disable_notify_for_hours_plural": "Адключыць абарону на {{count}} гадзін",
"disable_notify_until_tomorrow": "Адключыць абарону да заўтра",
"enable_protection_timer": "Абарона будзе ўключана ў {{time}}",
"custom_retention_input": "Увядзіце тэрмін захоўвання ў гадзінах",
"custom_rotation_input": "Увядзіце частату ратацыі ў гадзінах",
"protection_section_label": "Ахова",
"log_and_stats_section_label": "Журнал запытаў і статыстыка",
"ignore_query_log": "Ігнараваць гэтага кліента ў журнале запытаў",

View File

@@ -1,6 +1,7 @@
{
"client_settings": "Nastavení klienta",
"example_upstream_reserved": "odchozí DNS připojení <0>pro konkrétní doménu(y)</0>;",
"example_multiple_upstreams_reserved": "více odchozích připojení <0>pro konkrétní domény</0>;",
"example_upstream_comment": "komentář.",
"upstream_parallel": "Použijte paralelní požadavky na urychlení řešení simultánním dotazováním na všechny navazující servery.",
"parallel_requests": "Paralelní požadavky",
@@ -73,7 +74,9 @@
"dhcp_dynamic_ip_found": "Váš systém používá konfiguraci dynamické IP adresy pro rozhraní <0>{{interfaceName}}</0>. Pro použití serveru DHCP musí být nastavena statická IP adresa. Vaše aktuální IP adresa je <0>{{ipAddress}}</0>. AdGuard Home automaticky nastaví tuto IP adresu jako statickou, pokud stisknete tlačítko \"Zapnout DHCP server\".",
"dhcp_lease_added": "Statický pronájem \"{{key}}\" byl úspěšně přidán",
"dhcp_lease_deleted": "Statický pronájem \"{{key}}\" byl úspěšně odstraněn",
"dhcp_lease_updated": "Statický pronájem \"{{key}}\" byl úspěšně aktualizován",
"dhcp_new_static_lease": "Nový statický pronájem",
"dhcp_edit_static_lease": "Upravit statický pronájem",
"dhcp_static_leases_not_found": "Nebyly nalezeny žádné statické pronájmy DHCP",
"dhcp_add_static_lease": "Přidat statický pronájem",
"dhcp_reset_leases": "Resetovat všechny pronájmy",
@@ -117,7 +120,8 @@
"stats_malware_phishing": "Blokovaný malware/podvody",
"stats_adult": "Blokované stránky pro dospělé",
"stats_query_domain": "Nejčastěji dotazované domény",
"for_last_24_hours": "za posledních 24 hodin",
"for_last_hours": "za poslední {{count}} hodinu",
"for_last_hours_plural": "za posledních {{count}} hodin",
"for_last_days": "za posledních {{count}} dní",
"for_last_days_plural": "za posledních {{count}} dní",
"stats_disabled": "Statistiky byly vypnuty. Můžete je zapnout ze <0>stránky nastavení</0>.",
@@ -132,14 +136,16 @@
"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",
"number_of_dns_query_hours": "Počet DNS dotazů zpracovaných za poslední {{count}} hodinu",
"number_of_dns_query_hours_plural": "Počet DNS dotazů zpracovaných za posledních {{count}} hodin",
"number_of_dns_query_blocked_24_hours": "Počet požadavků DNS zablokovaných filtrem reklam a seznamy blokování hostitelů",
"number_of_dns_query_blocked_24_hours_by_sec": "Počet požadavků DNS zablokovaných AdGuard modulem Bezpečné prohlížení",
"number_of_dns_query_blocked_24_hours_adult": "Počet zablokovaných stránek pro dospělé",
"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_upstream_response_time": "Průměrná doba odezvy odchozích připojení",
"response_time": "Čas odezvy",
"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>.",
@@ -283,6 +289,9 @@
"custom_ip": "Vlastní IP",
"blocking_ipv4": "Blokování IPv4",
"blocking_ipv6": "Blokování IPv6",
"blocked_response_ttl": "TTL blokované odezvy",
"blocked_response_ttl_desc": "Určuje, na kolik sekund by měli klienti ukládat filtrovanou odezvu do mezipaměti",
"form_enter_blocked_response_ttl": "Zadejte TTL blokované odezvy (v sekundách)",
"dnscrypt": "DNSCrypt",
"dns_over_https": "DNS skrze HTTPS",
"dns_over_tls": "DNS skrze TLS",
@@ -537,8 +546,8 @@
"statistics_enable": "Povolit statistiky",
"ignore_domains": "Ignorované domény (oddělené novým řádkem)",
"ignore_domains_title": "Ignorované domény",
"ignore_domains_desc_stats": "Dotazy pro tyto domény se do statistik nezapisují",
"ignore_domains_desc_query": "Dotazy pro tyto domény se do záznamu dotazů nezapisují",
"ignore_domains_desc_stats": "Dotazy odpovídající těmto pravidlům se do statistik nezapisují",
"ignore_domains_desc_query": "Dotazy odpovídající těmto pravidlům se do záznamu dotazů nezapisují",
"interval_hours": "Hodiny: {{count}}",
"interval_hours_plural": "Hodiny: {{count}}",
"filters_configuration": "Konfigurace filtrů",
@@ -654,7 +663,7 @@
"parental_control": "Rodičovská ochrana",
"safe_browsing": "Bezpečné prohlížení",
"served_from_cache": "{{value}} <i>(převzato z mezipaměti)</i>",
"form_error_password_length": "Heslo musí být alespoň {{value}} znaků dlouhé",
"form_error_password_length": "Heslo musí obsahovat od {{min}} do {{max}} znaků",
"anonymizer_notification": "<0>Poznámka:</0> Anonymizace IP je zapnuta. Můžete ji vypnout v <1>Obecných nastaveních</1>.",
"confirm_dns_cache_clear": "Opravdu chcete vymazat mezipaměť DNS?",
"cache_cleared": "Mezipaměť DNS úspěšně vymazána",

View File

@@ -1,6 +1,7 @@
{
"client_settings": "Klientindstillinger",
"example_upstream_reserved": "en upstream <0>for bestemte domæner</0>;",
"example_multiple_upstreams_reserved": "flere upstreams <0>til bestemte domæner</0>;",
"example_upstream_comment": "en kommentaren.",
"upstream_parallel": "Brug parallelforespørgsler til at accelerere fortolkningen ved at forespørge alle upstream-servere samtidigt.",
"parallel_requests": "Parallelle forespørgsler",
@@ -73,7 +74,9 @@
"dhcp_dynamic_ip_found": "Dit system bruger en dynamisk IP-adresseopsætning til interface <0>{{interfaceName}}</0>. For at kunne bruge DHCP-serveren skal en statisk IP-adresse indstilles. Din aktuelle IP-adresse er <0>{{ipAddress}}</0>. AdGuard Home vil automatisk indstille denne IP-adresse som din statiske hvis du trykker på knappen \"Aktivér DHCP-server\".",
"dhcp_lease_added": "Statisk lease \"{{key}}\" tilføjet",
"dhcp_lease_deleted": "Statisk lease \"{{key}}\" slettet",
"dhcp_lease_updated": "Statisk tildeling \"{{key}}\" hermed opdateret",
"dhcp_new_static_lease": "Ny statisk lease",
"dhcp_edit_static_lease": "Redigér statisk tildeling",
"dhcp_static_leases_not_found": "Intet DHCP statisk leases fundet",
"dhcp_add_static_lease": "Tilføj statisk lease",
"dhcp_reset_leases": "Nulstil alle gyldighedsperioder",
@@ -117,7 +120,8 @@
"stats_malware_phishing": "Blokeret malware/phishing",
"stats_adult": "Blokerede voksne websteder",
"stats_query_domain": "Mest forespurgte domæner",
"for_last_24_hours": "de seneste 24 timer",
"for_last_hours": "den seneste {{count}} time",
"for_last_hours_plural": "de seneste {{count}} timer",
"for_last_days": "den seneste {{count}} dag",
"for_last_days_plural": "de seneste {{count}} dage",
"stats_disabled": "Statistikker er deaktiveret. De kan aktiveres via <0>indstillingssiden</0>.",
@@ -132,14 +136,16 @@
"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",
"number_of_dns_query_hours": "Antallet af DNS-forespørgsler behandlet den seneste {{count}} time",
"number_of_dns_query_hours_plural": "Antallet af DNS-forespørgsler behandlet de seneste {{count}} timer",
"number_of_dns_query_blocked_24_hours": "Antallet af DNS-forespørgsler blokeret af adblockfiltre og værtssortlister",
"number_of_dns_query_blocked_24_hours_by_sec": "Antallet af DNS-forespørgsler blokeret af AdGuards browsingsikkerhedsmodul",
"number_of_dns_query_blocked_24_hours_adult": "Antallet af blokerede voksenwebsteder",
"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_upstream_response_time": "Gennemsnitlig upstream-responstid",
"response_time": "Responstid",
"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>.",
@@ -283,6 +289,9 @@
"custom_ip": "Tilpasset IP",
"blocking_ipv4": "IPv4-blokering",
"blocking_ipv6": "IPv6-blokering",
"blocked_response_ttl": "Blokeret svar TTL",
"blocked_response_ttl_desc": "Angiver, i hvor mange sekunder klienterne skal cache-lagre et filtreret svar",
"form_enter_blocked_response_ttl": "Angiv blokeringssvar TTL (sekunder)",
"dnscrypt": "DNSCrypt",
"dns_over_https": "DNS-over-HTTPS",
"dns_over_tls": "DNS-over-TLS",
@@ -537,8 +546,8 @@
"statistics_enable": "Aktivér statistikker",
"ignore_domains": "Ignorerede domæner (adskilt af ny linje)",
"ignore_domains_title": "Ignorerede domæner",
"ignore_domains_desc_stats": "Forespørgsler til disse domæner opføres ikke i statistikken",
"ignore_domains_desc_query": "Forespørgsler til disse domæner opføres ikke i forespørgselsloggen",
"ignore_domains_desc_stats": "Forespørgsler, der matcher disse regler, skrives ikke til statistikken",
"ignore_domains_desc_query": "Forespørgsler, der matcher disse regler, skrives ikke til forespørgselsloggen",
"interval_hours": "{{count}} time",
"interval_hours_plural": "{{count}} timer",
"filters_configuration": "Filteropsætninger",
@@ -654,7 +663,7 @@
"parental_control": "Forældrekontrol",
"safe_browsing": "Sikker Browsing",
"served_from_cache": "{{value}} <i>(leveret fra cache)</i>",
"form_error_password_length": "Adgangskoden skal udgøre mindst {{value}} tegn.",
"form_error_password_length": "Adgangskode skal udgøre fra {{min}} til {{max}} tegn",
"anonymizer_notification": "<0>Bemærk:</0> IP-anonymisering er aktiveret. Det kan deaktiveres via <1>Generelle indstillinger</1>.",
"confirm_dns_cache_clear": "Sikker på, at DNS-cache skal ryddes?",
"cache_cleared": "DNS-cache hermed ryddet",

View File

@@ -1,19 +1,20 @@
{
"client_settings": "Client-Einstellungen",
"example_upstream_reserved": "ein Upstream <0>für bestimmte Domains</0>;",
"example_multiple_upstreams_reserved": "mehrere Upstreams <0>für bestimmte Domains</0>;",
"example_upstream_comment": "ein Kommentar.",
"upstream_parallel": "Parallele Abfragen verwenden, um das Auflösen zu beschleunigen, indem alle Upstream-Server gleichzeitig abgefragt werden.",
"parallel_requests": "Paralleles Abfragen",
"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": "Bootstrap-DNS-Server",
"bootstrap_dns_desc": "IP-Adressen der DNS-Server, die zum Auflösen der IP-Adressen von DoH/DoT Upstream-Servern verwendet werden, die Sie angegeben haben. Kommentare sind nicht erlaubt.",
"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_default_resolver": "Standardmäßig verwendet AdGuard Home die folgenden inversen DNS-Resolver: {{ip}}.",
"local_ptr_no_default_resolver": "AdGuard Home konnte keine geeigneten privaten Invers-DNS-Resolver für dieses System ermitteln.",
"local_ptr_placeholder": "Geben Sie eine IP-Adresse pro Zeile ein",
"resolve_clients_title": "Hostnamenauflösung der Clients aktivieren",
@@ -73,7 +74,9 @@
"dhcp_dynamic_ip_found": "Ihr System verwendet die dynamische Konfiguration der IP-Adresse für die Schnittstelle <0>{{interfaceName}}</0>. Um den DHCP-Server nutzen zu können, muss eine statische IP-Adresse festgelegt werden. Ihre aktuelle IP-Adresse ist <0>{{ipAddress}}</0>. Diese IP-Adresse wird automatisch als statisch festgelegt, sobald Sie auf die Schaltfläche „DHCP-Server aktivieren“ klicken.",
"dhcp_lease_added": "Statische Zuweisung „{{key}}“ erfolgreich hinzugefügt",
"dhcp_lease_deleted": "Statische Zuweisung „{{key}}“ erfolgreich entfernt",
"dhcp_lease_updated": "Statische Zuweisung „{{key}}“ erfolgreich aktualisiert",
"dhcp_new_static_lease": "Neue statische Zuweisung",
"dhcp_edit_static_lease": "Statische Zuweisung bearbeiten",
"dhcp_static_leases_not_found": "Keine statischen DHCP-Zuweisungen gefunden",
"dhcp_add_static_lease": "Statische Zuweisung hinzufügen",
"dhcp_reset_leases": "Alle Zuweisungen zurücksetzen",
@@ -117,7 +120,8 @@
"stats_malware_phishing": "Gesperrte Schädliche/Phishing-Websites",
"stats_adult": "Gesperrte jugendgefährdende Websites",
"stats_query_domain": "Am häufigsten angefragte Domains",
"for_last_24_hours": "für die letzten 24 Stunden",
"for_last_hours": "in die letzte {{count}} Stunde",
"for_last_hours_plural": "in die letzten {{count}} Stunden",
"for_last_days": "am letzten {{count}} Tag",
"for_last_days_plural": "in den letzten {{count}} Tage",
"stats_disabled": "Die Statistik wurde deaktiviert. Sie können diese in den <0>Einstellungen</0> erneut aktivieren.",
@@ -132,14 +136,16 @@
"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",
"number_of_dns_query_hours": "Die Anzahl der DNS-Anfragen, die in der letzten {{count}} Stunde verarbeitet wurden",
"number_of_dns_query_hours_plural": "Die Anzahl der DNS-Anfragen, die in den letzten {{count}} Stunden verarbeitet wurden",
"number_of_dns_query_blocked_24_hours": "Anzahl der durch Werbefilter und Host-Sperrlisten abgelehnte DNS-Anfragen",
"number_of_dns_query_blocked_24_hours_by_sec": "Anzahl der durch das AdGuard-Modul „Internetsicherheit“ gesperrten DNS-Anfragen",
"number_of_dns_query_blocked_24_hours_adult": "Anzahl der gesperrten Websites mit jugendgefährdenden Inhalten",
"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_upstream_response_time": "Durchschnittliche Upstream-Antwortzeit",
"response_time": "Antwortzeit",
"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.",
@@ -283,6 +289,9 @@
"custom_ip": "Benutzerdefinierte IP",
"blocking_ipv4": "IPv4-Sperren",
"blocking_ipv6": "IPv6-Sperren",
"blocked_response_ttl": "Gültigkeitsdauer der blockierten Antwort",
"blocked_response_ttl_desc": "Gibt an, wie viele Sekunden lang die Clients eine gefilterte Antwort zwischenspeichern sollen",
"form_enter_blocked_response_ttl": "Geben Sie die Gültigkeitsdauer für blockierte Antworten ein (in Sekunden)",
"dnscrypt": "DNSCrypt",
"dns_over_https": "DNS-over-HTTPS",
"dns_over_tls": "DNS-over-TLS",
@@ -296,7 +305,7 @@
"plain_dns": "Einfaches DNS",
"form_enter_rate_limit": "Begrenzungswert eingeben",
"rate_limit": "Begrenzungswert",
"edns_enable": "EDNS Client Subnetz aktivieren",
"edns_enable": "EDNS-Client-Subnetz aktivieren",
"edns_cs_desc": "Die Option EDNS Client Subnetz (ECS) zu Upstream-Anfragen hinzufügen und die von Clients gesendeten Werte protokollieren.",
"edns_use_custom_ip": "Benutzerdefinierte IP für EDNS verwenden",
"edns_use_custom_ip_desc": "Benutzerdefinierte IP für EDNS zulassen",
@@ -322,16 +331,16 @@
"known_tracker": "Bekannte Tracker",
"install_welcome_title": "Willkommen bei AdGuard Home!",
"install_welcome_desc": "AdGuard Home ist ein netzwerkweiter Werbung- und Tracking sperrender DNS-Server. Sein Zweck ist es, Ihnen die Kontrolle über Ihr gesamtes Netzwerk und alle Ihre Geräte zu ermöglichen, und es ist nicht erforderlich, eine clientseitige Anwendung zu verwenden.",
"install_settings_title": "Admin Weboberfläche",
"install_settings_title": "Admin-Weboberfläche",
"install_settings_listen": "Netzwerk-Schnittstelle\n",
"install_settings_port": "Port",
"install_settings_interface_link": "Ihre AdGuard Home Admin-Weboberfläche ist unter den folgenden Adressen verfügbar:",
"install_settings_interface_link": "Ihre AdGuard-Home-Admin-Weboberfläche ist unter den folgenden Adressen verfügbar:",
"form_error_port": "Geben Sie eine gültige Portnummer ein",
"install_settings_dns": "DNS-Server",
"install_settings_dns_desc": "Sie müssen Ihre Geräte oder Ihren Router so konfigurieren, dass er den DNS-Server unter den folgenden Adressen verwendet:",
"install_settings_all_interfaces": "Alle Schnittstellen",
"install_auth_title": "Authentifizierung",
"install_auth_desc": "Die Passwort-Authentifizierung für Ihre AdGuard Home Admin-Web-Oberfläche muss konfiguriert werden. Auch wenn AdGuard Home nur in Ihrem lokalen Netzwerk zugänglich ist, ist es dennoch wichtig, es vor unberechtigtem Zugriff zu schützen.",
"install_auth_desc": "Die Passwort-Authentifizierung für Ihre AdGuard-Home-Admin-Web-Oberfläche muss konfiguriert werden. Auch wenn AdGuard Home nur in Ihrem lokalen Netzwerk zugänglich ist, so ist es dennoch wichtig, es vor unberechtigtem Zugriff zu schützen.",
"install_auth_username": "Benutzername",
"install_auth_password": "Passwort",
"install_auth_confirm": "Passwort bestätigen",
@@ -344,7 +353,7 @@
"install_submit_desc": "Die Einrichtung ist abgeschlossen und Sie können mit der Verwendung von AdGuard Home beginnen.",
"install_devices_router": "Router",
"install_devices_router_desc": "Diese Einrichtung deckt automatisch alle an Ihren Heimrouter angeschlossenen Geräte ab, und Sie müssen nicht jedes einzelne davon manuell konfigurieren.",
"install_devices_address": "Der AdGuard Home DNS-Server belauscht die folgenden Adressen",
"install_devices_address": "Der AdGuard-Home-DNS-Server lauscht unter folgenden Adressen",
"install_devices_router_list_1": "Öffnen Sie die Einstellungen für Ihren Router. In der Regel können Sie über eine URL (z. B. http://192.168.0.1/ oder http://192.168.1.1) von Ihrem Browser aus darauf zugreifen. Möglicherweise werden Sie aufgefordert, ein Passwort einzugeben. Wenn Sie sich nicht mehr daran erinnern, können Sie das Passwort oft durch Drücken einer Taste am Router selbst zurücksetzen, aber seien Sie sich bewusst, dass Sie bei dieser Vorgehensweise wahrscheinlich die gesamte Routerkonfiguration verlieren. Wenn für die Einrichtung Ihres Routers eine App erforderlich ist, installieren Sie bitte die App auf Ihrem mobilen Endgerät oder PC und verwenden Sie sie für den Zugriff auf die Einstellungen des Routers.",
"install_devices_router_list_2": "Wechseln Sie zu den DHCP/DNS-Einstellungen. Suchen sie dort nach einem Eintrag „DNS“ und einem Bereich, welches zwei oder drei Zahlengruppen zulässt, die jeweils in vier Blöcke von ein bis drei Ziffern unterteilt sind.",
"install_devices_router_list_3": "Geben Sie dort Ihre AdGuard Home Server-Adressen ein.",
@@ -537,8 +546,8 @@
"statistics_enable": "Statistiken aktivieren",
"ignore_domains": "Ignorierte Domains (durch Zeilenumbruch getrennt)",
"ignore_domains_title": "Ignorierte Domains",
"ignore_domains_desc_stats": "Abfragen für diese Domains werden nicht in die Statistik aufgenommen",
"ignore_domains_desc_query": "Abfragen für diese Domains werden nicht in das Abfrageprotokoll aufgenommen",
"ignore_domains_desc_stats": "Abfragen, die diesen Regeln entsprechen, werden nicht in die Statistik aufgenommen",
"ignore_domains_desc_query": "Abfragen, die diesen Regeln entsprechen, werden nicht in das Anfragenprotokoll aufgenommen",
"interval_hours": "{{count}} Stunde",
"interval_hours_plural": "{{count}} Stunden",
"filters_configuration": "Filterkonfiguration",
@@ -640,7 +649,7 @@
"filter_category_regional": "Regional",
"filter_category_other": "Weitere",
"filter_category_general_desc": "Listen, die Tracking und Werbung auf den meisten Geräten sperren",
"filter_category_security_desc": "Listen, die auf das Sperren von Malware, Phishing- oder Scam-Domains spezialisiert sind",
"filter_category_security_desc": "Listen, die auf das Sperren von Malware-, Phishing- oder Scam-Domains spezialisiert sind",
"filter_category_regional_desc": "Listen, die sich auf regionale Werbeanzeigen und Tracking-Server konzentrieren",
"filter_category_other_desc": "Weitere Sperrlisten",
"setup_config_to_enable_dhcp_server": "Einrichten der Konfiguration zur Aktivierung des DHCP-Servers",
@@ -654,7 +663,7 @@
"parental_control": "Kindersicherung",
"safe_browsing": "Internetsicherheit",
"served_from_cache": "{{value}} <i>(aus dem Cache abgerufen)</i>",
"form_error_password_length": "Das Passwort muss mindestens {{value}} Zeichen enthalten",
"form_error_password_length": "Das Passwort muss zwischen {{min}} und {{max}} Zeichen enthalten",
"anonymizer_notification": "<0>Hinweis:</0> Die IP-Anonymisierung ist aktiviert. Sie können sie in den <1>Allgemeinen Einstellungen</1> deaktivieren.",
"confirm_dns_cache_clear": "Möchten Sie den DNS-Cache wirklich leeren?",
"cache_cleared": "DNS-Cache erfolgreich geleert",

View File

@@ -1,6 +1,7 @@
{
"client_settings": "Client settings",
"example_upstream_reserved": "an upstream <0>for specific domains</0>;",
"example_multiple_upstreams_reserved": "multiple upstreams <0>for specific domains</0>;",
"example_upstream_comment": "a comment.",
"upstream_parallel": "Use parallel queries to speed up resolving by querying all upstream servers simultaneously.",
"parallel_requests": "Parallel requests",
@@ -73,7 +74,9 @@
"dhcp_dynamic_ip_found": "Your system uses dynamic IP address configuration for interface <0>{{interfaceName}}</0>. In order to use DHCP server, a static IP address must be set. Your current IP address is <0>{{ipAddress}}</0>. AdGuard Home will automatically set this IP address as static if you press the \"Enable DHCP server\" button.",
"dhcp_lease_added": "Static lease \"{{key}}\" successfully added",
"dhcp_lease_deleted": "Static lease \"{{key}}\" successfully deleted",
"dhcp_lease_updated": "Static lease \"{{key}}\" successfully updated",
"dhcp_new_static_lease": "New static lease",
"dhcp_edit_static_lease": "Edit static lease",
"dhcp_static_leases_not_found": "No DHCP static leases found",
"dhcp_add_static_lease": "Add static lease",
"dhcp_reset_leases": "Reset all leases",
@@ -117,7 +120,8 @@
"stats_malware_phishing": "Blocked malware/phishing",
"stats_adult": "Blocked adult websites",
"stats_query_domain": "Top queried domains",
"for_last_24_hours": "for the last 24 hours",
"for_last_hours": "for the last {{count}} hour",
"for_last_hours_plural": "for the last {{count}} hours",
"for_last_days": "for the last {{count}} day",
"for_last_days_plural": "for the last {{count}} days",
"stats_disabled": "The statistics have been disabled. You can turn it on from the <0>settings page</0>.",
@@ -132,14 +136,16 @@
"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",
"number_of_dns_query_hours": "The number of DNS queries processed for the last {{count}} hour",
"number_of_dns_query_hours_plural": "The number of DNS queries processed for the last {{count}} hours",
"number_of_dns_query_blocked_24_hours": "The number of DNS requests blocked by adblock filters and hosts blocklists",
"number_of_dns_query_blocked_24_hours_by_sec": "The number of DNS requests blocked by the AdGuard browsing security module",
"number_of_dns_query_blocked_24_hours_adult": "The number of adult websites blocked",
"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_upstream_response_time": "Average upstream response time",
"response_time": "Response 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.",
@@ -283,6 +289,9 @@
"custom_ip": "Custom IP",
"blocking_ipv4": "Blocking IPv4",
"blocking_ipv6": "Blocking IPv6",
"blocked_response_ttl": "Blocked response TTL",
"blocked_response_ttl_desc": "Specifies for how many seconds the clients should cache a filtered response",
"form_enter_blocked_response_ttl": "Enter blocked response TTL (seconds)",
"dnscrypt": "DNSCrypt",
"dns_over_https": "DNS-over-HTTPS",
"dns_over_tls": "DNS-over-TLS",
@@ -654,7 +663,7 @@
"parental_control": "Parental Control",
"safe_browsing": "Safe Browsing",
"served_from_cache": "{{value}} <i>(served from cache)</i>",
"form_error_password_length": "Password must be at least {{value}} characters long",
"form_error_password_length": "Password must be {{min}} to {{max}} characters long",
"anonymizer_notification": "<0>Note:</0> IP anonymization is enabled. You can disable it in <1>General settings</1>.",
"confirm_dns_cache_clear": "Are you sure you want to clear DNS cache?",
"cache_cleared": "DNS cache successfully cleared",

View File

@@ -1,6 +1,7 @@
{
"client_settings": "Configuración de clientes",
"example_upstream_reserved": "un DNS de subida <0>para un dominio específico</0>.",
"example_multiple_upstreams_reserved": "múltiples upstreams <0>para dominios específicos</0>;",
"example_upstream_comment": "un comentario.",
"upstream_parallel": "Usar consultas paralelas para acelerar la resolución al consultar simultáneamente a todos los servidores DNS de subida.",
"parallel_requests": "Consultas paralelas",
@@ -8,9 +9,9 @@
"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": "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",
"fallback_dns_title": "Servidores DNS alternativos",
"fallback_dns_desc": "Lista de servidores DNS alternativos utilizados cuando los servidores DNS de subida no responden. La sintaxis es la misma que en el campo de los principales DNS de subida anterior.",
"fallback_dns_placeholder": "Ingresa un servidor 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}}.",
@@ -73,7 +74,9 @@
"dhcp_dynamic_ip_found": "Tu sistema utiliza la configuración de dirección IP dinámica para la interfaz <0>{{interfaceName}}</0>. Para poder utilizar el servidor DHCP se debe establecer una dirección IP estática. Tu dirección IP actual es <0>{{ipAddress}}</0>. AdGuard Home establecerá automáticamente esta dirección IP como estática si presionas el botón \"Habilitar servidor DHCP\".",
"dhcp_lease_added": "Asignación estática \"{{key}}\" añadido correctamente",
"dhcp_lease_deleted": "Asignación estática \"{{key}}\" eliminado correctamente",
"dhcp_lease_updated": "Asignación estática \"{{key}}\" actualizado correctamente",
"dhcp_new_static_lease": "Nueva asignación estática",
"dhcp_edit_static_lease": "Editar asignación estática",
"dhcp_static_leases_not_found": "No se han encontrado asignaciones DHCP estáticas",
"dhcp_add_static_lease": "Añadir asignación estática",
"dhcp_reset_leases": "Restablecer todas las asignaciones",
@@ -117,7 +120,8 @@
"stats_malware_phishing": "Malware/phishing bloqueado",
"stats_adult": "Sitios web para adultos bloqueado",
"stats_query_domain": "Dominios más consultados",
"for_last_24_hours": "en las últimas 24 horas",
"for_last_hours": "de la última {{count}} hora",
"for_last_hours_plural": "de las últimas {{count}} horas",
"for_last_days": "durante los últimos {{count}} días",
"for_last_days_plural": "durante los últimos {{count}} días",
"stats_disabled": "Las estadísticas se han deshabilitado. Puedes habilitarlas desde la <0>página de configuración</0>.",
@@ -128,18 +132,20 @@
"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",
"top_upstreams": "DNS de subida más frecuentes",
"no_upstreams_data_found": "No se han encontrado datos de DNS de subida",
"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",
"number_of_dns_query_hours": "Número de consultas DNS procesadas durante la última {{count}} hora",
"number_of_dns_query_hours_plural": "Número de consultas DNS procesadas durante las últimas {{count}} horas",
"number_of_dns_query_blocked_24_hours": "Número de peticiones DNS bloqueadas por los filtros y listas de bloqueo de hosts",
"number_of_dns_query_blocked_24_hours_by_sec": "Número de peticiones DNS bloqueadas por el módulo de seguridad de navegación de AdGuard",
"number_of_dns_query_blocked_24_hours_adult": "Número de sitios web para adultos bloqueado",
"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_upstream_response_time": "Tiempo promedio de respuesta upstream",
"response_time": "Tiempo de respuesta",
"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>.",
@@ -164,7 +170,7 @@
"upstream_dns_configured_in_file": "Configurado en {{path}}",
"test_upstream_btn": "Probar DNS de subida",
"upstreams": "DNS de subida",
"upstream": "Upstream",
"upstream": "DNS de subida",
"apply_btn": "Aplicar",
"disabled_filtering_toast": "Filtrado deshabilitado",
"enabled_filtering_toast": "Filtrado habilitado",
@@ -283,6 +289,9 @@
"custom_ip": "IP personalizada",
"blocking_ipv4": "Bloqueo de IPv4",
"blocking_ipv6": "Bloqueo de IPv6",
"blocked_response_ttl": "Respuesta TTL bloqueada",
"blocked_response_ttl_desc": "Especifica durante cuántos segundos los clientes deben almacenar en cache una respuesta filtrada",
"form_enter_blocked_response_ttl": "Ingresa el TTL de respuesta bloqueada (segundos)",
"dnscrypt": "DNSCrypt",
"dns_over_https": "DNS mediante HTTPS",
"dns_over_tls": "DNS mediante TLS",
@@ -537,8 +546,8 @@
"statistics_enable": "Habilitar estadísticas",
"ignore_domains": "Dominios ignorados (separados por una nueva línea)",
"ignore_domains_title": "Dominios ignorados",
"ignore_domains_desc_stats": "Las consultas para estos dominios no aparecen en las estadísticas",
"ignore_domains_desc_query": "Las consultas para estos dominios no aparecen en el registro de consultas",
"ignore_domains_desc_stats": "Las consultas que coinciden con estas reglas no aparecen en las estadísticas",
"ignore_domains_desc_query": "Las consultas que coinciden con estas reglas no aparecen en el registro de consultas",
"interval_hours": "{{count}} hora",
"interval_hours_plural": "{{count}} horas",
"filters_configuration": "Configuración de filtros",
@@ -654,7 +663,7 @@
"parental_control": "Control parental",
"safe_browsing": "Navegación segura",
"served_from_cache": "{{value}} <i>(servido desde la caché)</i>",
"form_error_password_length": "La contraseña debe tener al menos {{value}} caracteres",
"form_error_password_length": "La contraseña debe tener entre {{min}} y {{max}} caracteres",
"anonymizer_notification": "<0>Nota:</0> La anonimización de IP está habilitada. Puedes deshabilitarla en <1>Configuración general</1>.",
"confirm_dns_cache_clear": "¿Estás seguro de que deseas borrar la caché DNS?",
"cache_cleared": "Caché DNS borrado correctamente",
@@ -670,21 +679,21 @@
"disable_for_hours": "Por {{count}} hora",
"disable_for_hours_plural": "Por {{count}} horas",
"disable_until_tomorrow": "Hasta mañana",
"disable_notify_for_seconds": "Desactivar la protección por {{count}} segundo",
"disable_notify_for_seconds_plural": "Desactivar la protección por {{count}} segundos",
"disable_notify_for_minutes": "Desactivar la protección por {{count}} minuto",
"disable_notify_for_minutes_plural": "Desactivar la protección por {{count}} minutos",
"disable_notify_for_hours": "Desactivar la protección por {{count}} hora",
"disable_notify_for_hours_plural": "Desactivar la protección por {{count}} horas",
"disable_notify_until_tomorrow": "Desactivar la protección hasta mañana",
"enable_protection_timer": "La protección se activará en {{time}}",
"disable_notify_for_seconds": "Deshabilitar protección por {{count}} segundo",
"disable_notify_for_seconds_plural": "Deshabilitar protección por {{count}} segundos",
"disable_notify_for_minutes": "Deshabilitar protección por {{count}} minuto",
"disable_notify_for_minutes_plural": "Deshabilitar protección por {{count}} minutos",
"disable_notify_for_hours": "Deshabilitar protección por {{count}} hora",
"disable_notify_for_hours_plural": "Deshabilitar protección por {{count}} horas",
"disable_notify_until_tomorrow": "Deshabilitar protección hasta mañana",
"enable_protection_timer": "La protección se habilitará a las {{time}}",
"custom_retention_input": "Ingresa la retención en horas",
"custom_rotation_input": "Ingresa la rotación en horas",
"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",
"schedule_services": "Pausar el servicio de bloqueo",
"schedule_services": "Pausar 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",
@@ -694,7 +703,7 @@
"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_modal_time_off": "Detener servicio de bloqueo:",
"schedule_new": "Nuevo horario",
"schedule_edit": "Editar horario",
"schedule_save": "Guardar horario",

View File

@@ -139,7 +139,6 @@
"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> راه اندازی کنید.",
@@ -271,6 +270,9 @@
"custom_ip": "آی پی دستی",
"blocking_ipv4": "مسدودسازی IPv4",
"blocking_ipv6": "مسدودسازی IPv6",
"blocked_response_ttl": "TTL پاسخ مسدود شده",
"blocked_response_ttl_desc": "مشخص می کند که کلاینت ها برای چند ثانیه یک پاسخ فیلتر شده را در حافظه پنهان نگه دارند",
"form_enter_blocked_response_ttl": "پاسخ مسدود شده TTL (ثانیه) را وارد کنید",
"dnscrypt": "DNSCrypt",
"dns_over_https": "DNS-over-HTTPS",
"dns_over_tls": "DNS-over-TLS",

View File

@@ -73,7 +73,9 @@
"dhcp_dynamic_ip_found": "Järjestelmäsi käyttää verkkosovittimelle <0>{{interfaceName}}</0> dynaamista IP-osoitetta. Jotta voit käyttää DHCP-palvelinta, on sovittimelle määritettävä kiinteä IP-osoite. Nykyinen IP-osoitteesi on <0>{{ipAddress}}</0>. Tämä osoite määritetään automaattisesti kiinteäksi, jos painat \"Ota DHCP-palvelin käyttöön\" -painiketta.",
"dhcp_lease_added": "Kiinteä laina \"{{key}}\" lisättiin",
"dhcp_lease_deleted": "Kiinteä laina \"{{key}}\" poistettiin",
"dhcp_lease_updated": "Kiinteä laina \"{{key}}\" päivitettiin",
"dhcp_new_static_lease": "Uusi kiinteä laina",
"dhcp_edit_static_lease": "Muokkaa kiinteää laina",
"dhcp_static_leases_not_found": "Kiinteitä DHCP-lainoja ei löytynyt",
"dhcp_add_static_lease": "Lisää kiinteä laina",
"dhcp_reset_leases": "Tyhjennä kaikki lainat",
@@ -117,7 +119,8 @@
"stats_malware_phishing": "Estetyt haittaohjelmat/tietojenkalastelut",
"stats_adult": "Estetyt aikuisille tarkoitetut sivustot",
"stats_query_domain": "Kysytyimmät verkkotunnukset",
"for_last_24_hours": "viimeisten 24 tunnin ajalta",
"for_last_hours": "viimeisen {{count}} tunnin ajalta",
"for_last_hours_plural": "viimeisen {{count}} tunnin ajalta",
"for_last_days": "viimeisten {{count}} päivän ajalta",
"for_last_days_plural": "viimeisten {{count}} päivän ajalta",
"stats_disabled": "Tilastointi ei ole käytössä. Voit ottaa sen käyttöön <0>asetuksista</0>.",
@@ -132,14 +135,15 @@
"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",
"number_of_dns_query_hours": "Viimeisen {{count}} tunnin aikana käsiteltyjen DNS-kyselyiden määrä",
"number_of_dns_query_hours_plural": "Viimeisen {{count}} tunnin aikana käsiteltyjen DNS-kyselyiden määrä",
"number_of_dns_query_blocked_24_hours": "Mainoseston suodattimien ja hosts-estolistojen estämien DNS-pyyntöjen määrä",
"number_of_dns_query_blocked_24_hours_by_sec": "AdGuardin Turvallinen selaus -moduulin estämien DNS-pyyntöjen määrä",
"number_of_dns_query_blocked_24_hours_adult": "Estettyjen aikuisille tarkoitettujen sivustojen määrä",
"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",
"response_time": "Vasteaika",
"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>.",
@@ -283,6 +287,9 @@
"custom_ip": "Mukautettu IP-osoite",
"blocking_ipv4": "IPv4-esto",
"blocking_ipv6": "IPv6-esto",
"blocked_response_ttl": "Estetyn vastauksen elinaika",
"blocked_response_ttl_desc": "Määrittää montako sekuntia päätteiden tulee puskuroida suodatettuja vastauksia.",
"form_enter_blocked_response_ttl": "Syötä estetyn vastauksen elinaika (sekuntia)",
"dnscrypt": "DNSCrypt",
"dns_over_https": "DNS-over-HTTPS",
"dns_over_tls": "DNS-over-TLS",
@@ -537,8 +544,8 @@
"statistics_enable": "Ota tilastointi käyttöön",
"ignore_domains": "Ohitettavat verkkotunnukset (erotettu rivinvaihdolla)",
"ignore_domains_title": "Ohitettavat verkkotunnukset",
"ignore_domains_desc_stats": "Näihin verkkotunnuksiin lähetettyjä pyyntöjä ei tallenneta tilastoihin.",
"ignore_domains_desc_query": "Näihin verkkotunnuksiin lähetettyjä pyyntöjä ei tallenneta pyyntöhistoriaan.",
"ignore_domains_desc_stats": "Sääntöihin sopivat kyselyt eivät kirjoitu tilastoihin",
"ignore_domains_desc_query": "Sääntöihin sopivat kyselyt eivät tallennu kyselylokiin",
"interval_hours": "{{count}} tunti",
"interval_hours_plural": "{{count}} tuntia",
"filters_configuration": "Suodatinten määritys",
@@ -611,7 +618,7 @@
"dnssec_enable_desc": "Määritä DNSSEC-lippu ulos lähteville DNS-pyynnöille ja tarkasta tulos (vaatii DNSSEC-yhteensopivan resolverin).",
"validated_with_dnssec": "DNSSEC-vahvistettu",
"all_queries": "Kaikki pyynnöt",
"show_blocked_responses": "Estetyt",
"show_blocked_responses": "Estetty",
"show_whitelisted_responses": "Sallitut",
"show_processed_responses": "Käsitelty",
"blocked_safebrowsing": "Turvallisen selauksen estämät",
@@ -654,7 +661,7 @@
"parental_control": "Lapsilukko",
"safe_browsing": "Turvallinen selaus",
"served_from_cache": "{{value}} <i>(jaettu välimuistista)</i>",
"form_error_password_length": "Salasanan on oltava ainakin {{value}} merkkiä",
"form_error_password_length": "Salasanan on oltava {{min}} - {{max}} merkkiä pitkä",
"anonymizer_notification": "<0>Huomioi:</0> IP-osoitteen anonymisointi on käytössä. Voit poistaa sen käytöstä <1>Yleisistä asetuksista</1>.",
"confirm_dns_cache_clear": "Haluatko varmasti tyhjentää DNS-välimuistin?",
"cache_cleared": "DNS-välimuistin tyhjennys onnistui",

View File

@@ -1,6 +1,7 @@
{
"client_settings": "Paramètres du client",
"example_upstream_reserved": "un amont <0>pour des domaines spécifiques</0> ;",
"example_multiple_upstreams_reserved": "plusieurs amonts <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": "Requêtes en parallèle",
@@ -73,7 +74,9 @@
"dhcp_dynamic_ip_found": "Votre système utilise une configuration d'adresses IP dynamiques pour l'interface <0>{{interfaceName}}</0>. Pour utiliser un serveur DHCP, une adresse IP statique est requise. Votre adresse IP actuelle est <0>{{ipAddress}}</0>. AdGuard Home va automatiquement définir cette adresse IP comme statique si vous appuyez sur le bouton « Activer le serveur DHCP ».",
"dhcp_lease_added": "« {{key}} » de bail statique ajoutée",
"dhcp_lease_deleted": "« {{key}} » de bail statique supprimée",
"dhcp_lease_updated": "Bail statique « {{key}} » mis à jour correctement",
"dhcp_new_static_lease": "Nouveau bail statique",
"dhcp_edit_static_lease": "Modifier le bail statique",
"dhcp_static_leases_not_found": "Aucun bail statique DHCP trouvé",
"dhcp_add_static_lease": "Ajoutez un bail statique",
"dhcp_reset_leases": "Réinitialiser tous les baux",
@@ -117,7 +120,8 @@
"stats_malware_phishing": "Tentative de malware/hameçonnage bloquée",
"stats_adult": "Sites à contenu adulte bloqués",
"stats_query_domain": "Domaines les plus recherchés",
"for_last_24_hours": "pendant les dernières 24 heures",
"for_last_hours": "pendant la dernière {{count}} heure",
"for_last_hours_plural": "pendant les dernières {{count}} heures",
"for_last_days": "pour les {{count}} derniers jours",
"for_last_days_plural": "pour les {{count}} derniers jours",
"stats_disabled": "Les statistiques ont été désactivées. Vous pouvez l'activer à partir de la <0>page des paramètres</0>.",
@@ -132,14 +136,16 @@
"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",
"number_of_dns_query_hours": "Le nombre de requêtes DNS traitées pendant la dernière {{count}} heure",
"number_of_dns_query_hours_plural": "Le nombre de requêtes DNS traitées pendant les dernières {{count}} heures",
"number_of_dns_query_blocked_24_hours": "Le nombre de requêtes DNS bloquées par les filtres adblock et les listes de blocage des hôtes",
"number_of_dns_query_blocked_24_hours_by_sec": "Le nombre de requêtes DNS bloquées par le module Sécurité de navigation d'AdGuard",
"number_of_dns_query_blocked_24_hours_adult": "Le nombre de sites à contenu adulte bloqués",
"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_upstream_response_time": "Temps de réponse moyen en amont",
"response_time": "Temps de réponse",
"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>.",
@@ -283,6 +289,9 @@
"custom_ip": "IP personnalisée",
"blocking_ipv4": "Blocage IPv4",
"blocking_ipv6": "Blocage IPv6",
"blocked_response_ttl": "Réponse bloquée TTL",
"blocked_response_ttl_desc": "Spécifie pendant combien de secondes les clients doivent mettre en cache une réponse filtrée",
"form_enter_blocked_response_ttl": "Saisir le TTL de la réponse bloquée (secondes)",
"dnscrypt": "DNSCrypt",
"dns_over_https": "DNS-over-HTTPS",
"dns_over_tls": "DNS-over-TLS",
@@ -319,7 +328,7 @@
"rule_label": "Règle(s)",
"list_label": "Liste",
"unknown_filter": "Filtre inconnu {{filterId}}",
"known_tracker": "Pisteur connu",
"known_tracker": "Traqueur connu",
"install_welcome_title": "Bienvenue sur AdGuard Home !",
"install_welcome_desc": "AdGuard Home est un seveur DNS pour bloquer les pubs et traceurs sur tout un réseau. Son but est de vous donner le contrôle sur l'ensemble de votre réseau et tous vos appareils sans programme côté client supplémentaire.",
"install_settings_title": "Interface web administrateur",
@@ -537,8 +546,8 @@
"statistics_enable": "Activer les statistiques",
"ignore_domains": "Domaines ignorés (séparés par une nouvelle ligne)",
"ignore_domains_title": "Domaines ignorés",
"ignore_domains_desc_stats": "Les requêtes pour ces domaines ne sont pas écrites dans les statistiques",
"ignore_domains_desc_query": "Les requêtes pour ces domaines ne sont pas écrites dans le journal des requêtes",
"ignore_domains_desc_stats": "Les requêtes correspondantes à ces règles ne sont pas écrites dans les statistiques",
"ignore_domains_desc_query": "Les requêtes correspondantes à ces règles ne sont pas écrites dans le journal des requêtes",
"interval_hours": "{{count}} heure",
"interval_hours_plural": "{{count}} heures",
"filters_configuration": "Configuration des filtres",
@@ -587,7 +596,7 @@
"filtered_custom_rules": "Filtré par des règles de filtrage personnalisées",
"choose_from_list": "Choisissez dans la liste",
"add_custom_list": "Ajouter une liste personnalisée",
"host_whitelisted": "Lhôte est sur liste blanche",
"host_whitelisted": "Lhôte est autorisé",
"check_ip": "Adresses IP : {{ip}}",
"check_cname": "CNAME : {{cname}}",
"check_reason": "Raison : {{reason}}",
@@ -612,12 +621,12 @@
"validated_with_dnssec": "Validé avec DNSSEC",
"all_queries": "Toutes les requêtes",
"show_blocked_responses": "Bloqué",
"show_whitelisted_responses": "Ajouté à la liste blanche",
"show_whitelisted_responses": "Autorisée",
"show_processed_responses": "Traité",
"blocked_safebrowsing": "Navigation sécurisée bloquée",
"blocked_safebrowsing": "Bloqué par la Navigation sécurisée",
"blocked_adult_websites": "Bloqué par le Contrôle Parental",
"blocked_threats": "Menaces bloquées",
"allowed": "Autorisé",
"allowed": "Autorisées",
"filtered": "Filtré",
"rewritten": "Réécrit",
"safe_search": "Recherche Sécurisée",
@@ -639,9 +648,9 @@
"filter_category_security": "Sécurité",
"filter_category_regional": "Régional",
"filter_category_other": "Autre",
"filter_category_general_desc": "Listes qui bloquent le pistage et la publicité sur la plupart des appareils",
"filter_category_general_desc": "Listes qui bloquent le suivi et la publicité sur la plupart des appareils",
"filter_category_security_desc": "Listes créées exprès pour bloquer les logiciels malveillants, des domaines hameçonneurs ou frauduleux",
"filter_category_regional_desc": "Listes axées sur les annonces régionales et les serveurs de pistage",
"filter_category_regional_desc": "Listes axées sur les annonces régionales et les serveurs de suivi",
"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",
@@ -654,7 +663,7 @@
"parental_control": "Contrôle parental",
"safe_browsing": "Navigation sécurisée",
"served_from_cache": "{{value}} <i>(depuis le cache)</i>",
"form_error_password_length": "Le mot de passe doit comporter au moins {{value}} caractères",
"form_error_password_length": "Le mot de passe doit comporter entre {{min}} et {{max}}  caractères",
"anonymizer_notification": "<0>Note :</0> L'anonymisation IP est activée. Vous pouvez la désactiver dans les <1>paramètres généraux</1>.",
"confirm_dns_cache_clear": "Voulez-vous vraiment vider le cache DNS ?",
"cache_cleared": "Le cache DNS a été vidé",

View File

@@ -1,6 +1,7 @@
{
"client_settings": "Postavke klijenta",
"example_upstream_reserved": "upstream <0>za određene domene</0>;",
"example_multiple_upstreams_reserved": "višestruke upstream poslužitelje <0>za određene domene</0>;",
"example_upstream_comment": "komentar.",
"upstream_parallel": "Koristi paralelne upite kako bi ubrzali rješavanje istovremenim ispitavanjem svih upstream poslužitelja.",
"parallel_requests": "Paralelni zahtjevi",
@@ -73,7 +74,9 @@
"dhcp_dynamic_ip_found": "Vaš sustav koristi postavke dinamičke IP adrese za sučelje <0>{{interfaceName}}</0>. Za korištenje DHCP poslužitelja mora se postaviti statička IP adresa. Vaša trenutna IP adresa je <0>{{ipAddress}}</0>. AdGuard Home automatski će postaviti ovu IP adresu kao statičnu ako pritisnete gumb \"Omogući DHCP\".",
"dhcp_lease_added": "Statični lease \"{{key}}\" je uspješno dodan",
"dhcp_lease_deleted": "Statični lease \"{{key}}\" je uspješno uklonjen",
"dhcp_lease_updated": "Statični lease \"{{key}}\" uspješno ažuriran",
"dhcp_new_static_lease": "Novi static lease",
"dhcp_edit_static_lease": "Uredi statični lease",
"dhcp_static_leases_not_found": "Nisu pronađeni statični DHCP leases",
"dhcp_add_static_lease": "Dodaj static lease",
"dhcp_reset_leases": "Ponovno postavljanje svih najmova",
@@ -117,7 +120,8 @@
"stats_malware_phishing": "Blokiran zločudni program/krađe identiteta",
"stats_adult": "Blokirane web stranice za odrasle",
"stats_query_domain": "Top tražene domene",
"for_last_24_hours": "u zadnja 24 sata",
"for_last_hours": "za posljednji {{count}} sat",
"for_last_hours_plural": "za posljednjih {{count}} sati",
"for_last_days": "zadnjih {{count}} dana",
"for_last_days_plural": "zadnjih {{count}} dana",
"stats_disabled": "Statistika je onemogućena. Možete ga uključiti sa <0>stranice s postavkama</0>.",
@@ -132,14 +136,16 @@
"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",
"number_of_dns_query_hours": "Broj DNS upita obrađenih za posljednji {{count}} sat",
"number_of_dns_query_hours_plural": "Broj DNS upita obrađenih za posljednjih {{count}} sati",
"number_of_dns_query_blocked_24_hours": "Broj DNS zahtjeva koji blokiraju filtri za blokiranje oglasa i popisi blokova hostova",
"number_of_dns_query_blocked_24_hours_by_sec": "Broj DNS zahtjeva koje je blokirao modul AdGuard zaštita pregledavanja",
"number_of_dns_query_blocked_24_hours_adult": "Broj blokiranih stranica s sadržajem za odrasle",
"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_upstream_response_time": "Prosječno vrijeme odziva upstream poslužitelja",
"response_time": "Vrijeme odziva",
"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>.",
@@ -283,6 +289,9 @@
"custom_ip": "Prilagođen IP",
"blocking_ipv4": "Blokiranje IPv4",
"blocking_ipv6": "Blokiranje IPv6",
"blocked_response_ttl": "TTL blokiranog odgovora",
"blocked_response_ttl_desc": "Određuje koliko sekundi bi klijenti trebali keširati filtrirani odgovor",
"form_enter_blocked_response_ttl": "Unesite TTL blokiranog odgovora (sekunde)",
"dnscrypt": "DNSCrypt",
"dns_over_https": "DNS-over-HTTPS",
"dns_over_tls": "DNS-over-TLS",
@@ -537,8 +546,8 @@
"statistics_enable": "Omogući statistiku",
"ignore_domains": "Zanemarene domene (odvojene novim retkom)",
"ignore_domains_title": "Zanemarene domene",
"ignore_domains_desc_stats": "Upiti za ove domene ne upisuju se u statistiku",
"ignore_domains_desc_query": "Upiti za te domene nisu zapisani u zapisnik upita",
"ignore_domains_desc_stats": "Upiti koji odgovaraju ovim pravilima ne upisuju se u statistiku",
"ignore_domains_desc_query": "Upiti koji odgovaraju ovim pravilima ne upisuju se u zapisnik upita",
"interval_hours": "{{count}} sata/i",
"interval_hours_plural": "{{count}} sata/i",
"filters_configuration": "Postavke filtara",
@@ -654,7 +663,7 @@
"parental_control": "Roditeljska zaštita",
"safe_browsing": "Sigurno surfanje",
"served_from_cache": "{{value}} <i>(dohvaćeno iz predmemorije)</i>",
"form_error_password_length": "Lozinka mora imati najmanje {{value}} znakova",
"form_error_password_length": "Lozinka mora sadržavati od {{min}} do {{max}} znakova",
"anonymizer_notification": "<0>Napomena:</0>IP anonimizacija je omogućena. Možete ju onemogućiti u <1>općim postavkama</1>.",
"confirm_dns_cache_clear": "Jeste li sigurni da želite očistiti DNS predmemoriju?",
"cache_cleared": "DNS predmemorija je uspješno izbrisana",

View File

@@ -1,6 +1,7 @@
{
"client_settings": "Kliens beállítások",
"example_upstream_reserved": "Megadhat egy DNS kiszolgálót <0>egy adott domainhez vagy domainekhez</0>",
"example_multiple_upstreams_reserved": "több upstream szerver <0>adott domainekhez</0>;",
"example_upstream_comment": "egy megjegyzés.",
"upstream_parallel": "Használjon párhuzamos lekéréseket a domainek feloldásának felgyorsításához az összes upstream kiszolgálóra való egyidejű lekérdezéssel.",
"parallel_requests": "Párhuzamos lekérések",
@@ -73,7 +74,9 @@
"dhcp_dynamic_ip_found": "A rendszer dinamikus IP-cím konfigurációt használ az <0>{{interfaceName}}</0> interfészhez. A DHCP szerver használatához statikus IP-címet kell beállítani. Jelenlegi IP-címe: <0>{{ipAddress}}</0>. Automatikusan beállítjuk ezt az IP címet statikusnak, ha rányom a DHCP engedélyezése gombra.",
"dhcp_lease_added": "Statikus bérlet \"{{key}}\" sikeresen hozzáadva",
"dhcp_lease_deleted": "Statikus bérlet \"{{key}}\" sikeresen törölve",
"dhcp_lease_updated": "Statikus bérlet \"{{key}}\" sikeresen frissítve",
"dhcp_new_static_lease": "Új statikus bérlet",
"dhcp_edit_static_lease": "Statikus bérlet szerkesztése",
"dhcp_static_leases_not_found": "Nem találhatóak statikus DHCP bérletek",
"dhcp_add_static_lease": "Statikus bérlet hozzáadása",
"dhcp_reset_leases": "Bérletek alaphelyzetbe",
@@ -117,7 +120,8 @@
"stats_malware_phishing": "Blokkolt kártevő/adathalászat",
"stats_adult": "Blokkolt felnőtt tartalom",
"stats_query_domain": "Leglátogatottabb domainek",
"for_last_24_hours": "az utóbbi 24 órában",
"for_last_hours": "az utolsó {{count}} órában",
"for_last_hours_plural": "az utolsó {{count}} órában",
"for_last_days": "az utóbbi {{count}} napban",
"for_last_days_plural": "az utóbbi {{count}} napban",
"stats_disabled": "Ezek a statisztikák ki lettek kapcsolva. Be tudja kapcsolni őket a <0>beállítások oldalon</0>.",
@@ -132,14 +136,16 @@
"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",
"number_of_dns_query_hours": "Feldolgozott DNS lekérdezések száma az utolsó {{count}} órában",
"number_of_dns_query_hours_plural": "Feldolgozott DNS lekérdezések száma az utolsó {{count}} órában",
"number_of_dns_query_blocked_24_hours": "A hirdetésblokkoló szűrők és a hosztfájlok által letiltott DNS kérések száma",
"number_of_dns_query_blocked_24_hours_by_sec": "Az AdGuard böngészési biztonság modulja által letiltott DNS kérések száma",
"number_of_dns_query_blocked_24_hours_adult": "Blokkolt felnőtt tartalmak száma",
"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_upstream_response_time": "Átlagos upstream válaszidő",
"response_time": "Válaszidő",
"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.",
@@ -283,6 +289,9 @@
"custom_ip": "Egyedi IP",
"blocking_ipv4": "IPv4 blokkolása",
"blocking_ipv6": "IPv6 blokkolása",
"blocked_response_ttl": "Tiltott válasz TTL-je",
"blocked_response_ttl_desc": "Meghatározza, hogy a klienseknek hány másodpercig kell gyorsítótárazniuk a szűrt választ",
"form_enter_blocked_response_ttl": "Írja be a blokkolt válasz TTL-jét (másodpercben)",
"dnscrypt": "DNSCrypt",
"dns_over_https": "DNS-over-HTTPS",
"dns_over_tls": "DNS-over-TLS",
@@ -537,8 +546,8 @@
"statistics_enable": "Statisztikák engedélyezése",
"ignore_domains": "Figyelmen kívül hagyott domainek (újsorral elválasztva)",
"ignore_domains_title": "Figyelmen kívül hagyott domainek",
"ignore_domains_desc_stats": "Az ezekre a tartományokra vonatkozó lekérdezések nem kerülnek a statisztikákba",
"ignore_domains_desc_query": "Az ezekhez a tartományokhoz tartozó lekérdezések nem kerülnek a lekérdezési naplóba",
"ignore_domains_desc_stats": "Az ezeknek a szabályoknak megfelelő lekérdezések nem kerülnek be a statisztikákba",
"ignore_domains_desc_query": "Az ezeknek a szabályoknak megfelelő lekérdezések nem kerülnek a lekérdezési naplóba",
"interval_hours": "{{count}} óra",
"interval_hours_plural": "{{count}} óra",
"filters_configuration": "Szűrők beállításai",
@@ -654,7 +663,7 @@
"parental_control": "Szülői felügyelet",
"safe_browsing": "Biztonságos böngészés",
"served_from_cache": "{{value}} <i>(gyorsítótárból kiszolgálva)</i>",
"form_error_password_length": "A jelszó legalább {{value}} karakter hosszú kell, hogy legyen",
"form_error_password_length": "A jelszó legyen {{min}} és {{max}} karakter között",
"anonymizer_notification": "<0>Megjegyzés:</0> Az IP anonimizálás engedélyezve van. Az <1>Általános beállításoknál letilthatja</1> .",
"confirm_dns_cache_clear": "Biztos benne, hogy törölni szeretné a DNS-gyorsítótárat?",
"cache_cleared": "A DNS gyorsítótár sikeresen törlődött",

View File

@@ -1,6 +1,7 @@
{
"client_settings": "Pengaturan klien",
"example_upstream_reserved": "upstream <0>untuk domain spesifik</0>;",
"example_multiple_upstreams_reserved": "beberapa server upstream <0>untuk domain spesifik</0>;",
"example_upstream_comment": "komentar.",
"upstream_parallel": "Gunakan kueri paralel untuk mempercepat resoluasi dengan menanyakan semua server upstream secara bersamaan",
"parallel_requests": "Permintaan paralel",
@@ -8,11 +9,14 @@
"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": "Alamat IP server DNS yang digunakan untuk menyelesaikan alamat IP resolver DoH/DoT yang Anda tentukan sebagai upstream. Komentar tidak diizinkan.",
"fallback_dns_title": "Server DNS cadangan",
"fallback_dns_desc": "Daftar server DNS cadangan yang digunakan ketika server DNS hulu tidak merespons. Sintaksnya sama dengan bidang hulu utama di atas.",
"fallback_dns_placeholder": "Masukkan satu server DNS cadangan per baris",
"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}}.",
"local_ptr_no_default_resolver": "AdGuard Home tidak dapat menentukan pemecah DNS terbalik yang sesuai untuk sistem ini.",
"local_ptr_placeholder": "Masukkan satu alamat server per baris",
"local_ptr_placeholder": "Masukkan satu alamat IP per baris",
"resolve_clients_title": "Aktifkan resolusi hostname klien",
"resolve_clients_desc": "Menyelesaikan alamat IP klien secara terbalik ke nama host mereka dengan mengirimkan kueri PTR ke resolver yang sesuai (server DNS pribadi untuk klien lokal, server upstream untuk klien dengan alamat IP publik).",
"use_private_ptr_resolvers_title": "Gunakan server pembalik DNS pribadi",
@@ -70,7 +74,9 @@
"dhcp_dynamic_ip_found": "Sistem Anda menggunakan konfigurasi alamat IP dinamis untuk antarmuka <0>{{interfaceName}}</0>. Untuk menggunakan server DHCP, alamat IP statis harus ditetapkan. Alamat IP Anda saat ini adalah <0>{{ipAddress}}</0>. AdGuard Home akan secara otomatis menetapkan alamat IP ini sebagai statis jika Anda menekan tombol Aktifkan DHCP.",
"dhcp_lease_added": "Static lease \"{{key}}\" berhasil ditambahkan",
"dhcp_lease_deleted": "Static lease \"{{key}}\" berhasil dihapus",
"dhcp_lease_updated": "Static lease \"{{key}}\" berhasil diperbarui",
"dhcp_new_static_lease": "Static lease baru",
"dhcp_edit_static_lease": "Mengedit static lease",
"dhcp_static_leases_not_found": "DHCP static lease tidak ditemukan",
"dhcp_add_static_lease": "Tambah static lease",
"dhcp_reset_leases": "Atur ulang semua kontrak",
@@ -114,7 +120,8 @@
"stats_malware_phishing": "Malware/phishing diblokir",
"stats_adult": "Situs dewasa diblokir",
"stats_query_domain": "Kueri domain teratas",
"for_last_24_hours": "untuk 24 jam terakhir",
"for_last_hours": "selama {{count}} jam terakhir",
"for_last_hours_plural": "selama {{count}} jam terakhir",
"for_last_days": "untuk {{count}} hari terakhir",
"for_last_days_plural": "selama {{count}} hari terakhir",
"stats_disabled": "Statistik telah dinonaktifkan. Anda dapat mengaktifkannya dari <0>halaman setelan</0>.",
@@ -129,13 +136,16 @@
"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",
"number_of_dns_query_hours": "Jumlah kueri DNS diproses selama {{{count}} jam terakhir",
"number_of_dns_query_hours_plural": "Jumlah kueri DNS diproses selama {{count}} jam terakhir",
"number_of_dns_query_blocked_24_hours": "Julah DNS diblokir oleh penyaring adblock dan daftar blokir hosts",
"number_of_dns_query_blocked_24_hours_by_sec": "Jumlah perminataan DNS diblokir oleh modul Kemanan Penjelajahan AdGuard",
"number_of_dns_query_blocked_24_hours_adult": "Jumlah website dewasa diblokir",
"enforced_save_search": "Paksa pencarian aman",
"number_of_dns_query_to_safe_search": "Jumlah perminataan DNS ke mesin pencari yang dipaksa Pencarian Aman",
"average_processing_time": "Rata-rata waktu pemrosesan",
"average_upstream_response_time": "Waktu respons server upstream rata-rata",
"response_time": "Waktu respons",
"average_processing_time_hint": "Rata-rata waktu dalam milidetik untuk pemrosesan sebuah permintaan DNS",
"block_domain_use_filters_and_hosts": "Blokir domain menggunakan filter dan file hosts",
"filters_block_toggle_hint": "Anda dapat menyiapkan aturan pemblokiran di pengaturan <a>Penyaringan</a>.",
@@ -170,6 +180,7 @@
"enabled_parental_toast": "Kontrol orang tua diaktifkan",
"disabled_safe_search_toast": "Pencarian aman dinonaktifkan",
"enabled_save_search_toast": "Pencarian aman diaktifkan",
"updated_save_search_toast": "Pengaturan Pencarian Aman telah diperbarui",
"enabled_table_header": "Diaktifkan",
"name_table_header": "Nama",
"list_url_table_header": "Daftar URL",
@@ -259,12 +270,12 @@
"query_log_cleared": "Kueri log telah berhasil dihapus",
"query_log_updated": "Log permintaan telah berhasil diperbarui",
"query_log_clear": "Hapus kueri log",
"query_log_retention": "Retensi kueri log",
"query_log_retention": "Rotasi kueri log",
"query_log_enable": "Aktifkan log",
"query_log_configuration": "Konfigurasi log",
"query_log_disabled": "Kueri log dinonaktifkan dan dapat dikonfigurasi di <0>pengaturan</0>",
"query_log_strict_search": "Gunakan tanda kutip ganda untuk pencarian ketat",
"query_log_retention_confirm": "Apakah Anda yakin ingin mengubah retensi kueri log? Jika Anda menurunkan nilai interval, beberapa data akan hilang",
"query_log_retention_confirm": "Apakah Anda yakin ingin mengubah rotasi kueri log? Jika Anda menurunkan nilai interval, beberapa data akan hilang",
"anonymize_client_ip": "Anonim IP klien",
"anonymize_client_ip_desc": "Jangan simpan alamat lengkap IP klien dalam log dan statistik",
"dns_config": "Konfigurasi server DNS",
@@ -278,6 +289,9 @@
"custom_ip": "Custom IP",
"blocking_ipv4": "Blokiran IPv4",
"blocking_ipv6": "Blokiran IPv6",
"blocked_response_ttl": "Respon TLL diblokir",
"blocked_response_ttl_desc": "Menentukan berapa detik klien harus menyimpan respons yang difilter dalam cache",
"form_enter_blocked_response_ttl": "Masukkan TTL respons yang diblokir (detik)",
"dnscrypt": "DNSCrypt",
"dns_over_https": "DNS-over-HTTPS",
"dns_over_tls": "DNS-over-TLS",
@@ -293,6 +307,8 @@
"rate_limit": "Batas nilai",
"edns_enable": "Aktifkan EDNS Klien Subnet",
"edns_cs_desc": "Tambahkan opsi EDNS Client Subnet (ECS) ke permintaan upstream dan catat nilai yang dikirim oleh klien di log kueri.",
"edns_use_custom_ip": "Gunakan IP khusus untuk EDNS",
"edns_use_custom_ip_desc": "Izinkan untuk menggunakan IP kustom untuk EDNS",
"rate_limit_desc": "Jumlah permintaan per detik yang diperbolehkan untuk satu klien. Atur ke 0 untuk tidak terbatas.",
"blocking_ipv4_desc": "Alamat IP akan dikembalikan untuk permintaan A yang diblokir",
"blocking_ipv6_desc": "Alamat IP akan dipulihkan untuk permintaan AAAA yang diblokir",
@@ -396,7 +412,7 @@
"encryption_issuer": "Penerbit",
"encryption_hostnames": "Nama host",
"encryption_reset": "Anda yakin ingin mengatur ulang pengaturan enkripsi?",
"encryption_warning": "Perhatian",
"encryption_warning": "Peringatan",
"topline_expiring_certificate": "Sertifikat SSL Anda hampir kedaluwarsa. Perbarui <0>Pengaturan enkripsi</0>.",
"topline_expired_certificate": "Sertifikat SSL Anda kedaluwarsa. Perbarui <0>Pengaturan enkripsi</0>.",
"form_error_port_range": "Masukkan nomor port di kisaran 80-65535",
@@ -444,7 +460,7 @@
"client_confirm_delete": "Apakah anda yakin ingin menghapus klien \"{{key}}\"?",
"list_confirm_delete": "Anda yakin ingin menghapus daftar ini?",
"auto_clients_title": "Klien (waktu berjalan)",
"auto_clients_desc": "Perangkat yang tidak ada dalam daftar klien Persisten yang mungkin masih menggunakan AdGuard Home",
"auto_clients_desc": "Informasi tentang alamat IP perangkat yang menggunakan atau mungkin menggunakan AdGuard Home. Informasi ini dikumpulkan dari beberapa sumber, termasuk file host, reverse DNS, dll.",
"access_title": "Pengaturan akses",
"access_desc": "Disini anda dapat mengatur aturan akses untuk server AdGuard Home DNS",
"access_allowed_title": "Klien yang diizinkan",
@@ -457,6 +473,7 @@
"updates_checked": "Versi baru AdGuard Home tersedia\n",
"updates_version_equal": "AdGuard Home sudah tebaru",
"check_updates_now": "Periksa pembaruan sekarang",
"version_request_error": "Pemeriksaan pembaruan gagal. Harap periksa koneksi internet anda.",
"dns_privacy": "DNS Privasi",
"setup_dns_privacy_1": "<0>DNS-over-TLS:</0> Memakai <1>{{address}}</1> string.",
"setup_dns_privacy_2": "<0>DNS-over-TLS:</0> Memakai <1>{{address}}</1> string.",
@@ -527,6 +544,10 @@
"statistics_retention_confirm": "Apakah Anda yakin ingin mengubah retensi statistik? Jika Anda menurunkan nilai interval, beberapa data akan hilang",
"statistics_cleared": "Statistik berhasil dihapus",
"statistics_enable": "Aktifkan statistik",
"ignore_domains": "Domain yang diabaikan (dipisahkan oleh baris baru)",
"ignore_domains_title": "Domain yang diabaikan",
"ignore_domains_desc_stats": "Kueri yang cocok dengan aturan ini tidak ditulis ke statistik",
"ignore_domains_desc_query": "Kueri yang cocok dengan aturan ini tidak ditulis ke log kueri",
"interval_hours": "{{count}} jam",
"interval_hours_plural": "{{count}} jam",
"filters_configuration": "Konfigurasi filter",
@@ -642,13 +663,36 @@
"parental_control": "Kontrol Orang Tua",
"safe_browsing": "Penjelajahan Aman",
"served_from_cache": "{{value}} <i>(disajikan dari cache)</i>",
"form_error_password_length": "Kata sandi harus minimal {{value}} karakter",
"form_error_password_length": "Kata sandi harus terdiri dari {{min}} hingga {{max}}",
"anonymizer_notification": "<0>Catatan:</0> Anonimisasi IP diaktifkan. Anda dapat menonaktifkannya di <1>Pengaturan umum</1> .",
"confirm_dns_cache_clear": "Apakah Anda yakin ingin menghapus cache DNS?",
"cache_cleared": "Cache DNS berhasil dibersihkan",
"clear_cache": "Hapus cache",
"make_static": "Jadikan statis",
"theme_auto_desc": "Otomatis (berdasarkan skema warna perangkat anda)",
"theme_dark_desc": "Tema gelap",
"theme_light_desc": "Tema terang",
"disable_for_seconds": "Untuk {{count}} detik",
"disable_for_seconds_plural": "Untuk {{count}} detik",
"disable_for_minutes": "Untuk {{count}} menit",
"disable_for_minutes_plural": "Untuk {{count}} menit",
"disable_for_hours": "Untuk {{count}} jam",
"disable_for_hours_plural": "Untuk {{count}} jam",
"disable_until_tomorrow": "Sampai besok",
"disable_notify_for_seconds": "Hentikan perlindungan selama {{count}} detik",
"disable_notify_for_seconds_plural": "Hentikan perlindungan selama {{count}} detik",
"disable_notify_for_minutes": "Hentikan perlindungan selama {{count}} menit",
"disable_notify_for_minutes_plural": "Hentikan perlindungan selama {{count}} menit",
"disable_notify_for_hours": "Hentikan perlindungan selama {{count}} jam",
"disable_notify_for_hours_plural": "Hentikan perlindungan selama {{count}} jam",
"disable_notify_until_tomorrow": "Hentikan perlindungan sampai besok",
"enable_protection_timer": "Perlindungan akan diaktifkan dalam {{time}}",
"custom_retention_input": "Masukkan retensi dalam hitungan jam",
"custom_rotation_input": "Masukkan rotasi dalam hitungan jam",
"protection_section_label": "Perlindungan",
"log_and_stats_section_label": "Log kueri dan statistik",
"ignore_query_log": "Abaikan klien ini di log kueri",
"ignore_statistics": "Abaikan klien ini di statistik",
"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",
@@ -663,6 +707,17 @@
"schedule_new": "Jadwal baru",
"schedule_edit": "Edit jadwal",
"schedule_save": "Simpan jadwal",
"schedule_add": "Tambahkan jadwal",
"schedule_remove": "Hapus jadwal",
"schedule_from": "Dari",
"schedule_to": "Hingga",
"sunday": "Minggu",
"monday": "Senin",
"tuesday": "Selasa",
"wednesday": "Rabu",
"thursday": "Kamis",
"friday": "Jumat",
"saturday": "Sabtu",
"sunday_short": "Ming",
"monday_short": "Sen",
"tuesday_short": "Sel",

View File

@@ -1,6 +1,7 @@
{
"client_settings": "Impostazioni client",
"example_upstream_reserved": "un upstream <0>per specifici domini</0>;",
"example_multiple_upstreams_reserved": "upstream multipli <0>per domini specifici</0>;",
"example_upstream_comment": "un commento.",
"upstream_parallel": "Utilizza richieste parallele per accelerare la risoluzione interrogando simultaneamente tutti i server upstream.",
"parallel_requests": "Richieste parallele",
@@ -73,7 +74,9 @@
"dhcp_dynamic_ip_found": "Il tuo sistema utilizza una configurazione di indirizzi IP dinamici per l'interfaccia <0>{{interfaceName}}</0>. Per poter utilizzare un server DHCP, è necessario impostare un indirizzo IP statico. Il tuo indirizzo IP attuale è <0>{{ipAddress}}</0>. AdGuard Home imposterà automaticamente questo indirizzo come statico quando cliccherai il pulsante \"Attiva server DHCP\".",
"dhcp_lease_added": "Lease statici \"{{key}}\" aggiunti correttamente",
"dhcp_lease_deleted": "Lease statico \"{{key}}\" eliminato correttamente",
"dhcp_lease_updated": "Locazione statica \"{{key}}\" aggiornata con successo",
"dhcp_new_static_lease": "Nuovo lease statico",
"dhcp_edit_static_lease": "Modifica locazione statica",
"dhcp_static_leases_not_found": "Non è stato trovato nessun leases statico DHCP",
"dhcp_add_static_lease": "Aggiungi lease statico",
"dhcp_reset_leases": "Reimposta tutti i temporanei",
@@ -117,7 +120,8 @@
"stats_malware_phishing": "Malware/phishing bloccati",
"stats_adult": "Siti per adulti bloccati",
"stats_query_domain": "Domini maggiormente richiesti",
"for_last_24_hours": "nelle ultime 24 ore",
"for_last_hours": "per l'ultima {{count}} ora",
"for_last_hours_plural": "per le ultime {{count}} ore",
"for_last_days": "per gli ultimi {{count}} giorni",
"for_last_days_plural": "per gli ultimi {{count}} giorni",
"stats_disabled": "Le statistiche sono state disattivate. Puoi attivarle dalla <0>pagina delle impostazioni</0>.",
@@ -132,14 +136,16 @@
"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",
"number_of_dns_query_hours": "Numero di richieste DNS processate nell'ultima {{count}} ora",
"number_of_dns_query_hours_plural": "Numero di richieste DNS processate nelle ultime {{count}} ore",
"number_of_dns_query_blocked_24_hours": "Numero di richieste DNS bloccate dai filtri per annunci e dagli elenchi di blocco host",
"number_of_dns_query_blocked_24_hours_by_sec": "Numero di richieste DNS bloccate dal modulo sicurezza di navigazione di AdGuard",
"number_of_dns_query_blocked_24_hours_adult": "Numero di siti web per adulti bloccati",
"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_upstream_response_time": "Tempo medio di risposta upstream",
"response_time": "Tempo di risposta",
"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>.",
@@ -283,6 +289,9 @@
"custom_ip": "IP personalizzato",
"blocking_ipv4": "Blocca IPv4",
"blocking_ipv6": "Blocca IPv6",
"blocked_response_ttl": "Risposta TTL bloccata",
"blocked_response_ttl_desc": "Specifica per quanti secondi i client devono tenere nella cache una risposta filtrata",
"form_enter_blocked_response_ttl": "Inserisci tempo di vita (TTL) della risposta bloccata (secondi)",
"dnscrypt": "DNSCrypt",
"dns_over_https": "DNS su HTTPS",
"dns_over_tls": "DNS su TLS",
@@ -537,8 +546,8 @@
"statistics_enable": "Attiva statistiche",
"ignore_domains": "Domini ignorati (separati da nuova riga)",
"ignore_domains_title": "Domini ignorati",
"ignore_domains_desc_stats": "Le richieste per questi domini non vengono scritte nelle statistiche",
"ignore_domains_desc_query": "Le richieste per questi domini non vengono scritte nel registro delle richieste",
"ignore_domains_desc_stats": "Le richieste che corrispondono a queste regole non vengono scritte nelle statistiche",
"ignore_domains_desc_query": "Le richieste che corrispondono a queste regole non vengono scritte nel registro delle richieste",
"interval_hours": "{{count}} ora",
"interval_hours_plural": "{{count}} ore",
"filters_configuration": "Configurazione filtri",
@@ -654,7 +663,7 @@
"parental_control": "Controllo Parentale",
"safe_browsing": "Navigazione Sicura",
"served_from_cache": "{{value}} <i>(fornito dalla cache)</i>",
"form_error_password_length": "La password deve contenere almeno {{value}} caratteri",
"form_error_password_length": "La password deve contenere da {{min}} a {{max}} caratteri",
"anonymizer_notification": "<0>Attenzione:</0> L'anonimizzazione dell'IP è abilitata. Puoi disabilitarla in <1>Impostazioni generali</1>.",
"confirm_dns_cache_clear": "Sei sicuro di voler cancellare la cache DNS?",
"cache_cleared": "Cache DNS è stata cancellata correttamente",

View File

@@ -1,6 +1,7 @@
{
"client_settings": "クライアント設定",
"example_upstream_reserved": "<0>特定のドメイン</0>に対してDNSアップストリームを指定できます。",
"example_multiple_upstreams_reserved": "<0>特定ドメイン</0>のための複数のアップストリームサーバー;",
"example_upstream_comment": "コメントを追加できます。",
"upstream_parallel": "並列リクエストを使用する(同時にすべてのアップストリームサーバーに処理要求することで解決スピードが向上)",
"parallel_requests": "並列リクエスト",
@@ -73,7 +74,9 @@
"dhcp_dynamic_ip_found": "お使いのシステムは、インターフェース<0>{{interfaceName}}</0>用に動的IPアドレス構成を使用しています。DHCPサーバを使用するには、静的IPアドレスで設定する必要があります。あなたの現在のIPアドレスは<0>{{ipAddress}}</0>です。「DHCPサーバを有効にする」ボタンを押すと、AdGuard Homeは自動的にこのIPアドレスを静的IPアドレスとして設定します。",
"dhcp_lease_added": "静的リース \"{{key}}\" の追加が完了しました。",
"dhcp_lease_deleted": "静的リース \"{{key}}\" の削除が完了しました。",
"dhcp_lease_updated": "静的リース \"{{key}}\" の更新に成功しました。",
"dhcp_new_static_lease": "新規静的割り当て",
"dhcp_edit_static_lease": "静的リースを編集",
"dhcp_static_leases_not_found": "DHCP静的割り当てはありません",
"dhcp_add_static_lease": "静的割り当てを追加する",
"dhcp_reset_leases": "すべてのリースをリセットする",
@@ -117,7 +120,8 @@
"stats_malware_phishing": "ブロックされたマルウェア/フィッシング",
"stats_adult": "ブロックされたアダルトウェブサイト",
"stats_query_domain": "最も問合せされたドメイン",
"for_last_24_hours": "過去24時間以内",
"for_last_hours": "過去{{count}}時間",
"for_last_hours_plural": "過去{{count}}時間",
"for_last_days": "過去{{count}}日間以内",
"for_last_days_plural": "過去{{count}}日間以内",
"stats_disabled": "統計は無効化されています。<0>設定ページ</0>でオンにすることができます。",
@@ -132,14 +136,16 @@
"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クエリの数",
"number_of_dns_query_hours": "過去{{count}}時間に処理されたDNSクエリの数",
"number_of_dns_query_hours_plural": "過去{{count}}時間に処理されたDNSクエリの数",
"number_of_dns_query_blocked_24_hours": "広告ブロックフィルタとhostsブロックリストによってブロックされたDNSリクエストの数",
"number_of_dns_query_blocked_24_hours_by_sec": "AdGuardブラウジングセキュリティモジュールによってブロックされたDNSリクエストの数",
"number_of_dns_query_blocked_24_hours_adult": "ブロックされたアダルトウェブサイトの数",
"enforced_save_search": "強制されたセーフサーチ",
"number_of_dns_query_to_safe_search": "セーフサーチが強制適用された検索エンジンへのDNSリクエストの数",
"average_processing_time": "平均処理時間",
"processing_time": "処理時間",
"average_upstream_response_time": "アップストリームの平均応答時間",
"response_time": "応答時間",
"average_processing_time_hint": "DNSリクエストの処理にかかる平均時間ミリ秒単位",
"block_domain_use_filters_and_hosts": "フィルタとhostsファイルを使用してドメインをブロックする",
"filters_block_toggle_hint": "<a>フィルタ</a>の設定でブロックするルールを設定することができます。",
@@ -283,6 +289,9 @@
"custom_ip": "カスタムIP",
"blocking_ipv4": "ブロック中のIPv4",
"blocking_ipv6": "ブロック中のIPv6",
"blocked_response_ttl": "Blocked Response TTLブロック済み応答のTTL",
"blocked_response_ttl_desc": "フィルタリングされた応答をクライアントがキャッシュしておく時間(秒)を指定します。",
"form_enter_blocked_response_ttl": "ブロック済み応答のTTL秒単位を入力してください",
"dnscrypt": "DNSCrypt",
"dns_over_https": "DNS-over-HTTPS",
"dns_over_tls": "DNS-over-TLS",
@@ -537,8 +546,8 @@
"statistics_enable": "統計を有効にする",
"ignore_domains": "無視するドメイン(それぞれ改行で区切ってください)",
"ignore_domains_title": "無視するドメイン",
"ignore_domains_desc_stats": "これらのドメインへのクエリは統計に書き込まれません。",
"ignore_domains_desc_query": "これらのドメインへのクエリはクエリログに書き込まれません。",
"ignore_domains_desc_stats": "これらのルールに一致するクエリは統計に書き込まれません。",
"ignore_domains_desc_query": "これらのルールに一致するクエリはクエリログに書き込まれません。",
"interval_hours": "{{count}}時間",
"interval_hours_plural": "{{count}}時間",
"filters_configuration": "フィルタ設定",
@@ -654,7 +663,7 @@
"parental_control": "ペアレンタルコントロール",
"safe_browsing": "セーフブラウジング",
"served_from_cache": "{{value}} <i>(キャッシュから応答)</i>",
"form_error_password_length": "パスワードは{{value}}文字以上にしてください",
"form_error_password_length": "パスワードの長さは{{min}}〜{{max}}文字にしてください",
"anonymizer_notification": "【<0>注意</0>】IPの匿名化が有効になっています。 <1>一般設定</1>で無効にできます。",
"confirm_dns_cache_clear": "DNS キャッシュをクリアしてもよろしいですか?",
"cache_cleared": "DNSキャッシュのクリア完了です。",

View File

@@ -1,6 +1,7 @@
{
"client_settings": "클라이언트 설정",
"example_upstream_reserved": "<0>특정 도메인에 대한</0> 업스트림;",
"example_multiple_upstreams_reserved": "<0>특정 도메인</0>에 대한 여러 업스트림",
"example_upstream_comment": "댓글.",
"upstream_parallel": "쿼리 처리 속도를 높이려면 모든 업스트림 서버에서 동시에 병렬 쿼리를 사용해주세요.",
"parallel_requests": "병렬 처리 요청",
@@ -73,7 +74,9 @@
"dhcp_dynamic_ip_found": "시스템은 <0>{{interfaceName}}</0> 인터페이스에 동적 IP 주소를 사용합니다. DHCP 서버를 사용하려면 고정 IP 주소를 설정해야 합니다. 현재 IP 주소는 <0>{{ipAddress}}</0>입니다. 'DHCP 서버 활성화' 버튼을 누르면 AdGuard Home이 이 IP 주소를 고정 IP 주소로 자동 설정합니다.",
"dhcp_lease_added": "'{{key}}' 고정 임대 정상적으로 추가되었습니다",
"dhcp_lease_deleted": "'{{key}}' 고정 임대 정상적으로 삭제되었습니다",
"dhcp_lease_updated": "'{{key}}' 고정 임대 정상적으로 업데이트되었습니다.",
"dhcp_new_static_lease": "새 고정 임대",
"dhcp_edit_static_lease": "고정 임대 수정",
"dhcp_static_leases_not_found": "DHCP 고정 임대를 찾을 수 없음",
"dhcp_add_static_lease": "고정 임대 추가",
"dhcp_reset_leases": "모든 임대 초기화",
@@ -117,7 +120,8 @@
"stats_malware_phishing": "차단된 멀웨어/피싱",
"stats_adult": "차단된 성인 웹사이트",
"stats_query_domain": "쿼리 도메인",
"for_last_24_hours": "지난 24시간 동안",
"for_last_hours": "마지막 {{count}} 시간",
"for_last_hours_plural": "마지막 {{count}} 시간의 기록",
"for_last_days": "마지막 {{count}} 일",
"for_last_days_plural": "마지막 {{count}} 일의 기록",
"stats_disabled": "통계 기능이 꺼졌습니다. <0>설정 페이지</0>에서 켤 수 있습니다.",
@@ -132,14 +136,16 @@
"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 쿼리의 수",
"number_of_dns_query_hours": "최근 {{count}}시간 동안 처리된 DNS 쿼리의 수",
"number_of_dns_query_hours_plural": "최근 {{count}}시간 동안 처리된 DNS 쿼리의 수",
"number_of_dns_query_blocked_24_hours": "광고 차단 필터 및 호스트 차단 목록에 의해 차단된 DNS 요청 수",
"number_of_dns_query_blocked_24_hours_by_sec": "AdGuard 브라우징 보안 모듈에 의해 차단된 DNS 요청 수",
"number_of_dns_query_blocked_24_hours_adult": "차단된 성인 웹 사이트의 수",
"enforced_save_search": "세이프서치 강제",
"number_of_dns_query_to_safe_search": "세이프서치가 적용된 검색 엔진에 대해 DNS 요청 수",
"average_processing_time": "평균처리 시간",
"processing_time": "처리 시간",
"average_upstream_response_time": "평균 업스트림 응답 시간",
"response_time": "응답 시간",
"average_processing_time_hint": "DNS 요청 처리시 평균 시간(밀리초)",
"block_domain_use_filters_and_hosts": "필터 및 호스트 파일을 사용하여 도메인 차단",
"filters_block_toggle_hint": "차단규칙<a>필터</a>을 설정할 수 있습니다.",
@@ -283,6 +289,9 @@
"custom_ip": "사용자 지정 IP",
"blocking_ipv4": "IPv4 차단",
"blocking_ipv6": "IPv6 차단",
"blocked_response_ttl": "차단된 TTL 응답",
"blocked_response_ttl_desc": "클라이언트가 필터링된 응답을 캐시해야 하는 시간(초)을 지정합니다.",
"form_enter_blocked_response_ttl": "차단된 응답 TTL(초)을 입력하세요.",
"dnscrypt": "DNSCrypt",
"dns_over_https": "DNS-over-HTTPS",
"dns_over_tls": "DNS-over-TLS",
@@ -403,7 +412,7 @@
"encryption_issuer": "발행자",
"encryption_hostnames": "호스트 이름",
"encryption_reset": "암호화 설정을 재설정하시겠습니까?",
"encryption_warning": "경고",
"encryption_warning": "주의",
"topline_expiring_certificate": "SSL 인증서가 곧 만료됩니다. 업데이트<0> 암호화 설정</0>.",
"topline_expired_certificate": "SSL 인증서가 만료되었습니다. 업데이트<0> 암호화 설정</0>.",
"form_error_port_range": "80-65535 범위의 포트 번호를 입력하세요",
@@ -537,8 +546,8 @@
"statistics_enable": "통계 활성화",
"ignore_domains": "무시된 도메인(줄 바꿈으로 구분)",
"ignore_domains_title": "무시된 도메인",
"ignore_domains_desc_stats": "이러한 도메인에 대한 쿼리는 통계에 기록되지 않습니다.",
"ignore_domains_desc_query": "이러한 도메인에 대한 쿼리는 쿼리 로그에 기록되지 않습니다.",
"ignore_domains_desc_stats": "이러한 규칙과 일치하는 쿼리는 통계에 기록되지 않습니다.",
"ignore_domains_desc_query": "이러한 규칙과 일치하는 쿼리는 쿼리 로그에 기록되지 않습니다.",
"interval_hours": "{{count}} 시간",
"interval_hours_plural": "{{count}} 시간",
"filters_configuration": "필터 구성",
@@ -654,7 +663,7 @@
"parental_control": "자녀 보호",
"safe_browsing": "세이프 브라우징",
"served_from_cache": "{{value}} <i>(캐시에서 제공)</i>",
"form_error_password_length": "비밀번호는 {{value}}자 이상이어야 합니다",
"form_error_password_length": "비밀번호는 {{min}}~{{max}}자 길이여야 합니다.",
"anonymizer_notification": "<0>참고:</0> IP 익명화가 활성화되었습니다. <1>일반 설정</1>에서 비활성화할 수 있습니다.",
"confirm_dns_cache_clear": "정말로 DNS 캐시를 지우시겠습니까?",
"cache_cleared": "DNS 캐시를 성공적으로 지웠습니다",

View File

@@ -1,6 +1,7 @@
{
"client_settings": "Cliëntinstellingen",
"example_upstream_reserved": "een upstream <0>voor specifieke domeinen</0>;",
"example_multiple_upstreams_reserved": "meerdere upstreams <0>voor specifieke domeinen</0>;",
"example_upstream_comment": "een commentaar.",
"upstream_parallel": "Parallelle verzoeken gebruiken om te versnellen door gelijktijdig verzoeken te sturen naar alle upstream servers.",
"parallel_requests": "Parallelle verzoeken",
@@ -73,7 +74,9 @@
"dhcp_dynamic_ip_found": "Je systeem gebruikt dynamische IP-adres configuratie voor interface <0>{{interfaceName}}</0>. Om de DHCP server te gebruiken moet er een statisch IP-adres worden ingesteld. Je huidige IP-adres is <0>{{ipAddress}}</0>. AdGuard Home zal automatisch dit IP-adres als statisch IP-adres instellen wanneer je op de knop \"DHCP inschakelen\" drukt.",
"dhcp_lease_added": "Statische uitgifte \"{{key}}\" met succes toegevoegd",
"dhcp_lease_deleted": "Statische uitgifte \"{{key}}\" met succes verwijderd",
"dhcp_lease_updated": "Statische lease \"{{key}}\" succesvol bijgewerkt",
"dhcp_new_static_lease": "Voeg static lease toe",
"dhcp_edit_static_lease": "Statische lease bewerken",
"dhcp_static_leases_not_found": "Geen DHCP static lease gevonden",
"dhcp_add_static_lease": "Voeg statische lease toe",
"dhcp_reset_leases": "Alle leases resetten",
@@ -117,7 +120,8 @@
"stats_malware_phishing": "Geblokkeerde malware/phishing",
"stats_adult": "Geblokkeerde 18+ websites",
"stats_query_domain": "Meest bezochte domeinen",
"for_last_24_hours": "van de laatste 24-uur",
"for_last_hours": "voor het afgelopen {{count}} uur",
"for_last_hours_plural": "voor de afgelopen {{count}} uren",
"for_last_days": "sinds de laatste {{count}} dagen",
"for_last_days_plural": "sinds de laatste {{count}} dagen",
"stats_disabled": "Statistieken zijn uitgeschakeld. Je kunt ze inschakelen op de <0>instellingen pagina</0>.",
@@ -132,14 +136,16 @@
"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",
"number_of_dns_query_hours": "Het aantal DNS-verzoeken dat het afgelopen {{count}} uur is verwerkt",
"number_of_dns_query_hours_plural": "Het aantal DNS-verzoeken dat de afgelopen {{count}} uren is verwerkt",
"number_of_dns_query_blocked_24_hours": "Aantal geblokkeerde DNS aanvragen door advertentie blokkering en hosts blokkeerlijsten",
"number_of_dns_query_blocked_24_hours_by_sec": "Aantal geblokkeerde DNS aanvragen door AdGuard browsing beveiligingsmodule",
"number_of_dns_query_blocked_24_hours_adult": "Aantal geblokkeerde 18+ websites",
"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_upstream_response_time": "Gemiddelde upstream responstijd",
"response_time": "Responsetijd",
"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.",
@@ -283,6 +289,9 @@
"custom_ip": "Aangepast IP",
"blocking_ipv4": "Blokkeren IP4",
"blocking_ipv6": "Blokkeren IP6",
"blocked_response_ttl": "Geblokkeerde reactie TTL",
"blocked_response_ttl_desc": "Hiermee geef je op hoeveel seconden de clients een gefilterd antwoord in de cache moeten opslaan",
"form_enter_blocked_response_ttl": "Voer geblokkeerd antwoord TTL in (seconden)",
"dnscrypt": "DNSCrypt",
"dns_over_https": "DNS-via-HTTPS",
"dns_over_tls": "DNS-via-TLS",
@@ -537,8 +546,8 @@
"statistics_enable": "Statistieken inschakelen",
"ignore_domains": "Genegeerde domeinen (gescheiden door nieuwe regel)",
"ignore_domains_title": "Genegeerde domeinen",
"ignore_domains_desc_stats": "Zoekopdrachten voor deze domeinen worden niet naar de statistieken geschreven",
"ignore_domains_desc_query": "Zoekopdrachten voor deze domeinen worden niet naar het zoeklogboek geschreven",
"ignore_domains_desc_stats": "Zoekopdrachten die aan deze regels voldoen, worden niet naar de statistieken geschreven",
"ignore_domains_desc_query": "Zoekopdrachten die aan deze regels voldoen, worden niet naar het zoeklogboek geschreven",
"interval_hours": "{{count}} uur",
"interval_hours_plural": "{{count}} uren",
"filters_configuration": "Filters instellingen",
@@ -654,7 +663,7 @@
"parental_control": "Ouderlijk toezicht",
"safe_browsing": "Veilig browsen",
"served_from_cache": "{{value}} <i>(geleverd vanuit cache)</i>",
"form_error_password_length": "Wachtwoord moet minimaal {{value}} tekens lang zijn",
"form_error_password_length": "Wachtwoord moet {{min}} tot {{max}} tekens lang zijn",
"anonymizer_notification": "<0>Opmerking:</0> IP-anonimisering is ingeschakeld. Je kunt het uitschakelen in <1>Algemene instellingen</1>.",
"confirm_dns_cache_clear": "Weet je zeker dat je de DNS-cache wilt wissen?",
"cache_cleared": "DNS-cache succesvol gewist",

View File

@@ -128,7 +128,6 @@
"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.",

View File

@@ -1,6 +1,7 @@
{
"client_settings": "Ustawienia klienta",
"example_upstream_reserved": "upstream <0>dla określonych domen</0>;",
"example_multiple_upstreams_reserved": "wiele serwerów nadrzędnych <0>dla konkretnej domeny</0>;",
"example_upstream_comment": "komentarz.",
"upstream_parallel": "Użyj zapytań równoległych, aby przyspieszyć rozwiązywanie przez jednoczesne wysyłanie zapytań do wszystkich serwerów nadrzędnych.",
"parallel_requests": "Równoległe żądania",
@@ -73,7 +74,9 @@
"dhcp_dynamic_ip_found": "Twój system używa dynamicznej konfiguracji adresu IP dla interfejsu <0>{{interfaceName}}</0>. Aby można było korzystać z serwera DHCP, należy ustawić statyczny adres IP. Twój obecny adres IP to <0>{{ipAddress}}</0>. AdGuard Home automatycznie ustawi ten adres IP jako statyczny, jeśli naciśniesz przycisk \"Włącz serwer DHCP\".",
"dhcp_lease_added": "Dzierżawa statyczna \"{{key}}\" pomyślnie dodana",
"dhcp_lease_deleted": "Dzierżawa statyczna \"{{key}}\" pomyślnie usunięta",
"dhcp_lease_updated": "Dzierżawa statyczna \"{{key}}\" pomyślnie zaktualizowana",
"dhcp_new_static_lease": "Nowa dzierżawa statyczna",
"dhcp_edit_static_lease": "Edytuj dzierżawę statyczną",
"dhcp_static_leases_not_found": "Nie znaleziono statycznych dzierżaw DHCP",
"dhcp_add_static_lease": "Dodaj dzierżawę statyczną",
"dhcp_reset_leases": "Zresetuj wszystkie dzierżawy",
@@ -117,7 +120,8 @@
"stats_malware_phishing": "Zablokowane złośliwe oprogramowanie/phishing",
"stats_adult": "Zablokowane witryny dla dorosłych",
"stats_query_domain": "Najczęściej wyszukiwane domeny",
"for_last_24_hours": "przez ostatnie 24 godziny",
"for_last_hours": "w ciągu ostatniej {{count}} godziny",
"for_last_hours_plural": "w ciągu ostatnich {{count}} godzin",
"for_last_days": "za ostatni dzień {{count}}",
"for_last_days_plural": "z ostatnich {{count}} dni",
"stats_disabled": "Statystyki zostały wyłączone. Można je włączyć na <0>stronie ustawień</0>.",
@@ -132,14 +136,16 @@
"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",
"number_of_dns_query_hours": "Liczba przetworzonych zapytań DNS w ciągu ostatniej {{count}} godziny",
"number_of_dns_query_hours_plural": "Liczba przetworzonych zapytań DNS w ciągu ostatnich {{count}} godzin",
"number_of_dns_query_blocked_24_hours": "Liczba żądań DNS zablokowanych przez filtry blokowania reklam i listy zablokowanych hostów",
"number_of_dns_query_blocked_24_hours_by_sec": "Liczba żądań DNS zablokowanych przez moduł Bezpiecznego przeglądania AdGuard",
"number_of_dns_query_blocked_24_hours_adult": "Liczba zablokowanych witryn dla dorosłych",
"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_upstream_response_time": "Średni czas odpowiedzi serwera nadrzędnego",
"response_time": "Czas odpowiedzi",
"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>.",
@@ -283,6 +289,9 @@
"custom_ip": "Niestandardowy adres IP",
"blocking_ipv4": "Blokowanie IPv4",
"blocking_ipv6": "Blokowanie IPv6",
"blocked_response_ttl": "TTL zablokowanej odpowiedzi",
"blocked_response_ttl_desc": "Określa, przez ile sekund klienci powinni buforować przefiltrowaną odpowiedź",
"form_enter_blocked_response_ttl": "Wprowadź TTL zablokowanej odpowiedzi (sekundy)",
"dnscrypt": "DNSCrypt",
"dns_over_https": "DNS-over-HTTPS",
"dns_over_tls": "DNS-over-TLS",
@@ -403,7 +412,7 @@
"encryption_issuer": "Zgłaszający",
"encryption_hostnames": "Nazwy hostów",
"encryption_reset": "Czy na pewno chcesz zresetować ustawienia szyfrowania?",
"encryption_warning": "Uwaga",
"encryption_warning": "Ostrzeżenie",
"topline_expiring_certificate": "Twój certyfikat SSL wkrótce wygaśnie. Zaktualizuj <0>Ustawienia szyfrowania</0>.",
"topline_expired_certificate": "Twój certyfikat SSL wygasł. Zaktualizuj <0>Ustawienia szyfrowania</0>.",
"form_error_port_range": "Wpisz numer portu z zakresu 80-65535",
@@ -537,8 +546,8 @@
"statistics_enable": "Włącz statystyki",
"ignore_domains": "Ignorowane domeny (każda w nowym wierszu)",
"ignore_domains_title": "Ignorowane domeny",
"ignore_domains_desc_stats": "Zapytania dla tych domen nie są zapisywane do statystyk",
"ignore_domains_desc_query": "Zapytania dla tych domen nie są zapisywane do dziennika",
"ignore_domains_desc_stats": "Zapytania pasujące do tych reguł nie są zapisywane w statystykach",
"ignore_domains_desc_query": "Zapytania pasujące do tych reguł nie są zapisywane w dzienniku zapytań",
"interval_hours": "{{count}} godzina",
"interval_hours_plural": "{{count}} godziny",
"filters_configuration": "Konfiguracja filtrów",
@@ -654,7 +663,7 @@
"parental_control": "Kontrola rodzicielska",
"safe_browsing": "Bezpieczne przeglądanie",
"served_from_cache": "{{value}} <i>(podawane z pamięci podręcznej)</i>",
"form_error_password_length": "Hasło musi mieć co najmniej {{value}} znaków",
"form_error_password_length": "Hasło musi zawierać od {{min}} do {{max}} znaków",
"anonymizer_notification": "<0>Uwaga:</0> Anonimizacja IP jest włączona. Możesz ją wyłączyć w <1>Ustawieniach ogólnych</1>.",
"confirm_dns_cache_clear": "Czy na pewno chcesz wyczyścić pamięć podręczną DNS?",
"cache_cleared": "Pamięć podręczna DNS została pomyślnie wyczyszczona",

View File

@@ -1,6 +1,7 @@
{
"client_settings": "Configurações do cliente",
"example_upstream_reserved": "um DNS primário <0>para o domínios especificos</0>;",
"example_multiple_upstreams_reserved": "múltiplos upstreams <0>para domínios específicos</0>;",
"example_upstream_comment": "um comentário.",
"upstream_parallel": "Usar consultas paralelas para acelerar a resolução consultando simultaneamente todos os servidores DNS primário",
"parallel_requests": "Solicitações paralelas",
@@ -73,7 +74,9 @@
"dhcp_dynamic_ip_found": "Seu sistema usa a configuração de endereço IP dinâmico para a interface <0>{{interfaceName}}</0>. Para usar o servidor DHCP, você deve definir um endereço de IP estático. Seu endereço IP atual é <0> {{ipAddress}} </ 0>. AdGuard Home irá definir automaticamente este endereço IP como estático se você pressionar o botão \"Ativar servidor DHCP\".",
"dhcp_lease_added": "Concessão estática \"{{key}}\" adicionada com sucesso",
"dhcp_lease_deleted": "Concessão estática \"{{key}}\" excluída com sucesso",
"dhcp_lease_updated": "Concessão estática \"{{key}}\" atualizada com sucesso",
"dhcp_new_static_lease": "Nova concessão estática",
"dhcp_edit_static_lease": "Editar concessão estática",
"dhcp_static_leases_not_found": "Nenhuma concessão DHCP estática foi encontrada",
"dhcp_add_static_lease": "Adicionar nova concessão estática",
"dhcp_reset_leases": "Redefinir todas as concessões",
@@ -117,7 +120,8 @@
"stats_malware_phishing": "Bloqueado malware/phishing",
"stats_adult": "Bloqueado sites adultos",
"stats_query_domain": "Principais domínios consultados",
"for_last_24_hours": "nas últimas 24 horas",
"for_last_hours": "na última {{count}} hora",
"for_last_hours_plural": "nas últimas {{count}} horas",
"for_last_days": "nos últimos {{count}} dias",
"for_last_days_plural": "nos últimos {{count}} dias",
"stats_disabled": "As estatísticas foram desativadas. Você pode ligá-las através da <0>página de configurações</0>.",
@@ -132,14 +136,16 @@
"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",
"number_of_dns_query_hours": "Número de consultas DNS processadas durante a última {{count}} hora",
"number_of_dns_query_hours_plural": "Número de consultas DNS processadas durante as últimas {{count}} horas",
"number_of_dns_query_blocked_24_hours": "Várias solicitações DNS bloqueadas por filtros de bloqueio de anúncios e listas de bloqueio de hosts",
"number_of_dns_query_blocked_24_hours_by_sec": "Várias solicitações de DNS bloqueadas pelo módulo de segurança da navegação do AdGuard",
"number_of_dns_query_blocked_24_hours_adult": "O número de sites adultos bloqueados",
"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_upstream_response_time": "Tempo médio de resposta upstream",
"response_time": "Tempo de resposta",
"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>.",
@@ -283,6 +289,9 @@
"custom_ip": "IP personalizado",
"blocking_ipv4": "Bloqueando IPv4",
"blocking_ipv6": "Bloqueando IPv6",
"blocked_response_ttl": "Resposta bloqueada TTL",
"blocked_response_ttl_desc": "Especifica por quantos segundos os clientes devem armazenar em cache uma resposta filtrada",
"form_enter_blocked_response_ttl": "Insira o TTL da resposta bloqueada (segundos)",
"dnscrypt": "DNSCrypt",
"dns_over_https": "DNS-sobre-HTTPS",
"dns_over_tls": "DNS-sobre-TLS",
@@ -537,8 +546,8 @@
"statistics_enable": "Ativar estatísticas",
"ignore_domains": "Domínios ignorados (separados por nova linha)",
"ignore_domains_title": "Domínios ignorados",
"ignore_domains_desc_stats": "As consultas para esses domínios não são gravadas nas estatísticas",
"ignore_domains_desc_query": "As consultas para esses domínios não são gravadas no registro de consulta",
"ignore_domains_desc_stats": "As consultas que correspondem a essas regras não são gravadas nas estatísticas",
"ignore_domains_desc_query": "As consultas que correspondem a essas regras não são gravadas no registro de consultas",
"interval_hours": "{{count}} hora",
"interval_hours_plural": "{{count}} horas",
"filters_configuration": "Configuração de filtros",
@@ -654,7 +663,7 @@
"parental_control": "Controle parental",
"safe_browsing": "Navegação segura",
"served_from_cache": "{{value}} <i>(servido do cache)</i>",
"form_error_password_length": "A senha deve ter pelo menos {{value}} caracteres",
"form_error_password_length": "A senha deve ter entre {{min}} e {{max}} caracteres",
"anonymizer_notification": "<0>Observação:</0> A anonimização de IP está ativada. Você pode desativá-lo em <1>Configurações gerais</1>.",
"confirm_dns_cache_clear": "Tem certeza de que deseja limpar o cache DNS?",
"cache_cleared": "Cache DNS limpo com sucesso",
@@ -684,7 +693,7 @@
"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",
"schedule_services": "Pausa o bloqueio de serviço",
"schedule_services": "Pausar 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",

View File

@@ -1,6 +1,7 @@
{
"client_settings": "Definições do cliente",
"example_upstream_reserved": "Podes especificar o DNS primário <0>para domínio(s) especifico(s)</0>",
"example_multiple_upstreams_reserved": "múltiplos upstreams <0>para domínios específicos</0>;",
"example_upstream_comment": "um comentário.",
"upstream_parallel": "Usar consultas paralelas para acelerar a resolução consultando simultaneamente todos os servidores DNS",
"parallel_requests": "Solicitações paralelas",
@@ -73,7 +74,9 @@
"dhcp_dynamic_ip_found": "O seu sistema usa a configuração de endereço IP dinâmico para a interface <0>{{interfaceName}}</0>. Para usar o servidor DHCP, deve definir um endereço de IP estático. O seu endereço IP atual é <0> {{ipAddress}} </ 0>. AdGuard Home irá definir automaticamente este endereço IP como estático se pressionar o botão \"Ativar servidor DHCP\".",
"dhcp_lease_added": "Concessão estática \"{{key}}\" adicionada com sucesso",
"dhcp_lease_deleted": "Concessão estática \"{{key}}\" excluída com sucesso",
"dhcp_lease_updated": "Concessão estática \"{{key}}\" atualizada com sucesso",
"dhcp_new_static_lease": "Nova concessão estática",
"dhcp_edit_static_lease": "Editar concessão estática",
"dhcp_static_leases_not_found": "Nenhuma concessão DHCP estática foi encontrada",
"dhcp_add_static_lease": "Adicionar nova concessão estática",
"dhcp_reset_leases": "Repor todas as concessões",
@@ -117,7 +120,8 @@
"stats_malware_phishing": "Malware/phishing bloqueados",
"stats_adult": "Sítios adultos bloqueados",
"stats_query_domain": "Principais domínios consultados",
"for_last_24_hours": "nas últimas 24 horas",
"for_last_hours": "na última {{count}} hora",
"for_last_hours_plural": "nas últimas {{count}} horas",
"for_last_days": "nos últimos {{count}} dias",
"for_last_days_plural": "nos últimos {{count}} dias",
"stats_disabled": "As estatísticas foram desativadas. Você pode ligá-las através da <0>página de definições</0>.",
@@ -132,14 +136,16 @@
"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",
"number_of_dns_query_hours": "Número de consultas DNS processadas durante a última {{count}} hora",
"number_of_dns_query_hours_plural": "Número de consultas DNS processadas durante as últimas {{count}} horas",
"number_of_dns_query_blocked_24_hours": "Várias solicitações DNS bloqueadas por filtros de bloqueio de anúncios e listas de bloqueio de hosts",
"number_of_dns_query_blocked_24_hours_by_sec": "Várias solicitações de DNS bloqueadas pelo módulo de segurança da navegação do AdGuard",
"number_of_dns_query_blocked_24_hours_adult": "O número de sítios adultos bloqueados",
"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_upstream_response_time": "Tempo médio de resposta upstream",
"response_time": "Tempo de resposta",
"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>.",
@@ -283,6 +289,9 @@
"custom_ip": "IP Personalizado",
"blocking_ipv4": "A bloquear IPv4",
"blocking_ipv6": "A bloquear IPv6",
"blocked_response_ttl": "Resposta bloqueada TTL",
"blocked_response_ttl_desc": "Especifica por quantos segundos os clientes devem armazenar em cache uma resposta filtrada",
"form_enter_blocked_response_ttl": "Insira o TTL da resposta bloqueada (segundos)",
"dnscrypt": "DNSCrypt",
"dns_over_https": "DNS-sobre-HTTPS",
"dns_over_tls": "DNS-sobre-TLS",
@@ -403,7 +412,7 @@
"encryption_issuer": "Emissor",
"encryption_hostnames": "Nomes dos servidores",
"encryption_reset": "Tem a certeza de que deseja repor a definição de criptografia?",
"encryption_warning": "Aviso",
"encryption_warning": "Cuidado",
"topline_expiring_certificate": "O seu certificado SSL está prestes a expirar. Atualize as suas <0>definições de criptografia</0>.",
"topline_expired_certificate": "O seu certificado SSL está expirado. Atualize as suas <0>definições de criptografia</0>.",
"form_error_port_range": "Digite um numero de porta entre 80 e 65535",
@@ -537,8 +546,8 @@
"statistics_enable": "Ativar estatísticas",
"ignore_domains": "Domínios ignorados (separados por nova linha)",
"ignore_domains_title": "Domínios ignorados",
"ignore_domains_desc_stats": "As consultas para estes domínios não aparecem nas estatísticas",
"ignore_domains_desc_query": "As consultas para estes domínios não aparecem no registo de consultas",
"ignore_domains_desc_stats": "As consultas que correspondem a essas regras não são gravadas nas estatísticas",
"ignore_domains_desc_query": "As consultas que correspondem a essas regras não são gravadas no registo de consultas",
"interval_hours": "{{count}} hora",
"interval_hours_plural": "{{count}} horas",
"filters_configuration": "Definição dos filtros",
@@ -654,7 +663,7 @@
"parental_control": "Controlo parental",
"safe_browsing": "Navegação segura",
"served_from_cache": "{{value}} <i>(servido do cache)</i>",
"form_error_password_length": "A palavra-passe deve ter pelo menos {{value}} caracteres",
"form_error_password_length": "A palavra-passe deve ter {{min}} a {{max}} caracteres",
"anonymizer_notification": "<0>Observação:</0> A anonimização de IP está ativada. Você pode desativá-la em <1>Definições gerais</1>.",
"confirm_dns_cache_clear": "Tem certeza de que quer limpar a cache DNS?",
"cache_cleared": "O cache DNS foi apagado com sucesso",

View File

@@ -1,6 +1,7 @@
{
"client_settings": "Setări client",
"example_upstream_reserved": "un flux în amonte <0>pentru domenii specifice</0>;",
"example_multiple_upstreams_reserved": "mai mulți servere în amonte <0>pentru domenii specifice</0>;",
"example_upstream_comment": "un comentariu.",
"upstream_parallel": "Folosiți interogări paralele pentru a accelera rezolvarea, interogând simultan toate serverele în amonte.",
"parallel_requests": "Solicitări paralele",
@@ -73,7 +74,9 @@
"dhcp_dynamic_ip_found": "Sistemul dvs. folosește configurația dinamică a adreselor IP pentru interfața <0>{{interfaceName}}</0>. Pentru a utiliza serverul DHCP, trebuie setată o adresă IP statică. Adresa IP curentă este <0>{{ipAddress}}</0>. AdGuard Home o va configura automat ca adresă IP statică, dacă apăsați butonul \"Activați serverul DHCP\".",
"dhcp_lease_added": "\"{{key}}\" statică închiriată adăugată cu succes",
"dhcp_lease_deleted": "\"{{key}}\" statică închiriată eliminată cu succes",
"dhcp_lease_updated": "\"{{key}}\" statică închiriată actualizată cu succes",
"dhcp_new_static_lease": "Închiriere statică nouă",
"dhcp_edit_static_lease": "Editați închiriere statică",
"dhcp_static_leases_not_found": "Nu s-au găsit închirieri statice DHCP",
"dhcp_add_static_lease": "Adăugați închiriere statică",
"dhcp_reset_leases": "Resetați toate închirierile",
@@ -117,7 +120,8 @@
"stats_malware_phishing": "Malware/phishing blocate",
"stats_adult": "Site-uri cu conținut adult blocate",
"stats_query_domain": "Domeniile cele mai căutate",
"for_last_24_hours": "în ultimele 24 ore",
"for_last_hours": "în ultima {{count}} oră",
"for_last_hours_plural": "în ultimele {{count}} ore",
"for_last_days": "în ultima {{count}} zi",
"for_last_days_plural": "pentru ultimele {{count}} zile",
"stats_disabled": "Statisticile au fost dezactivate. Puteți să le porniți din <0>pagina de setări</0>.",
@@ -132,14 +136,16 @@
"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",
"number_of_dns_query_hours": "Numărul de interogări DNS procesate în ultima {{count}} oră",
"number_of_dns_query_hours_plural": "Numărul de interogări DNS procesate în ultimele {{count}} ore",
"number_of_dns_query_blocked_24_hours": "Numărul de interogări DNS blocate de filtrele adblock și lista de blocări din hosts",
"number_of_dns_query_blocked_24_hours_by_sec": "Numărul de interogări DNS blocate de modulul de securitate de navigare AdGuard",
"number_of_dns_query_blocked_24_hours_adult": "Numărul de site-uri pentru adulți blocate",
"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_upstream_response_time": "Timpul mediu de răspuns al serverului în amonte",
"response_time": "Timp de răspuns",
"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>.",
@@ -283,6 +289,9 @@
"custom_ip": "IP personalizat",
"blocking_ipv4": "Blocarea IPv4",
"blocking_ipv6": "Blocarea IPv6",
"blocked_response_ttl": "Răspuns blocat TTL",
"blocked_response_ttl_desc": "Specifică pentru câte secunde trebuie să memoreze clienții un răspuns filtrat",
"form_enter_blocked_response_ttl": "Introduceți răspunsul blocat TTL (secunde)",
"dnscrypt": "DNSCrypt",
"dns_over_https": "DNS-over-HTTPS",
"dns_over_tls": "DNS-over-TLS",
@@ -403,7 +412,7 @@
"encryption_issuer": "Emitent",
"encryption_hostnames": "Nume de host",
"encryption_reset": "Sunteți sigur că doriți să resetați setările de criptare?",
"encryption_warning": "Avertisment",
"encryption_warning": "Atenție",
"topline_expiring_certificate": "Certificatul dvs. SSL este pe cale să expire. Actualizați <0>Setările de criptare</0>.",
"topline_expired_certificate": "Certificatul dvs. SSL a expirat. Actualizați <0>Setările de criptare</0>.",
"form_error_port_range": "Introduceți valoarea portului între 80-65535",
@@ -537,8 +546,8 @@
"statistics_enable": "Activați statisticile",
"ignore_domains": "Domenii ignorate (separate prin linie nouă)",
"ignore_domains_title": "Domenii ignorate",
"ignore_domains_desc_stats": "Interogările pentru aceste domenii nu sunt scrise în statistici",
"ignore_domains_desc_query": "Interogările pentru aceste domenii nu sunt scrise în jurnalul de interogări",
"ignore_domains_desc_stats": "Interogările care corespund acestor reguli nu sunt scrise în statistici",
"ignore_domains_desc_query": "Interogările care corespund acestor reguli nu sunt scrise în jurnalul de interogări",
"interval_hours": "{{count}} oră",
"interval_hours_plural": "{{count}} ore",
"filters_configuration": "Configurația filtrelor",
@@ -654,7 +663,7 @@
"parental_control": "Control Parental",
"safe_browsing": "Navigare în siguranță",
"served_from_cache": "{{value}} <i>(furnizat din cache)</i>",
"form_error_password_length": "Parola trebuie să aibă cel puțin {{value}} caractere",
"form_error_password_length": "Parola trebuie să aibă între {{min}} și {{max}} caractere",
"anonymizer_notification": "<0>Nota:</0> Anonimizarea IP este activată. Puteți să o dezactivați în <1>Setări generale</1>.",
"confirm_dns_cache_clear": "Sunteți sigur că doriți să ștergeți memoria cache DNS?",
"cache_cleared": "Cache-ul DNS a fost golit cu succes",

View File

@@ -1,6 +1,7 @@
{
"client_settings": "Настройки клиентов",
"example_upstream_reserved": "DNS-сервер <0>для конкретных доменов</0>;",
"example_multiple_upstreams_reserved": "несколько DNS-серверов <0>для конкретных доменов</0>;",
"example_upstream_comment": "комментарий.",
"upstream_parallel": "Использовать параллельные запросы ко всем серверам одновременно для ускорения обработки запроса.",
"parallel_requests": "Параллельные запросы",
@@ -17,7 +18,7 @@
"local_ptr_no_default_resolver": "AdGuard Home не смог определить подходящие приватные обратные DNS-резолверы для этой системы.",
"local_ptr_placeholder": "Введите по одному адресу на строчку",
"resolve_clients_title": "Включить запрашивание доменных имён для IP-адресов клиентов",
"resolve_clients_desc": "Определять доменные имена клиентов через PTR-запросы к соответствующим серверам (приватные DNS-серверы для локальных клиентов, upstream-сервер для клиентов с публичным IP-адресом).",
"resolve_clients_desc": "Определять доменные имена клиентов через PTR-запросы к соответствующим серверам (приватные DNS-серверы для локальных клиентов, upstream-серверы для клиентов с публичным IP-адресом).",
"use_private_ptr_resolvers_title": "Использовать приватные обратные DNS-резолверы",
"use_private_ptr_resolvers_desc": "Посылать обратные DNS-запросы для локально обслуживаемых адресов на указанные серверы. Если отключено, AdGuard Home будет отвечать NXDOMAIN на все подобные PTR-запросы, кроме запросов о клиентах, уже известных по DHCP, /etc/hosts и так далее.",
"check_dhcp_servers": "Проверить DHCP-серверы",
@@ -73,7 +74,9 @@
"dhcp_dynamic_ip_found": "Ваша система использует динамический IP-адрес для интерфейса <0>{{interfaceName}}</0>. Чтобы использовать DHCP-сервер, необходимо установить статический IP-адрес. Ваш текущий IP-адрес <0>{{ipAddress}}</0>. Мы автоматически установим его как статический, если вы нажмёте кнопку «Включить DHCP-сервер».",
"dhcp_lease_added": "Статическая аренда «{{key}}» успешно добавлена",
"dhcp_lease_deleted": "Статическая аренда «{{key}}» успешно удалена",
"dhcp_lease_updated": "Статическая аренда «{{key}}» успешно обновлена",
"dhcp_new_static_lease": "Новая статическая аренда",
"dhcp_edit_static_lease": "Редактирование статической аренды",
"dhcp_static_leases_not_found": "Не найдено статических аренд DHCP",
"dhcp_add_static_lease": "Добавить статическую аренду",
"dhcp_reset_leases": "Сбросить все аренды",
@@ -117,7 +120,8 @@
"stats_malware_phishing": "Заблокированные вредоносные и фишинговые сайты",
"stats_adult": "Заблокированные «взрослые» сайты",
"stats_query_domain": "Часто запрашиваемые домены",
"for_last_24_hours": "за 24 часа",
"for_last_hours": "за последний {{count}} час",
"for_last_hours_plural": "за последние {{count}} часов",
"for_last_days": "за последний {{count}} день",
"for_last_days_plural": "за последние {{count}} дней",
"stats_disabled": "Статистика отключена. Вы можете включить её на <0>странице настроек</0>.",
@@ -132,14 +136,16 @@
"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 часа",
"number_of_dns_query_hours": "Количество DNS-запросов, обработанных за последний {{count}} час",
"number_of_dns_query_hours_plural": "Количество DNS-запросов, обработанных за последние {{count}} часов",
"number_of_dns_query_blocked_24_hours": "Количество DNS-запросов, заблокированных фильтрами и блок-списками",
"number_of_dns_query_blocked_24_hours_by_sec": "Количество DNS-запросов, заблокированных модулем Антифишинга AdGuard",
"number_of_dns_query_blocked_24_hours_adult": "Количество заблокированных «сайтов для взрослых»",
"enforced_save_search": "Применён безопасный поиск",
"number_of_dns_query_to_safe_search": "Количество запросов DNS для поисковых систем, для которых был применён Безопасный поиск",
"average_processing_time": "Среднее время обработки запроса",
"processing_time": "Время обработки",
"average_upstream_response_time": "Среднее время ответа upstream-сервера",
"response_time": "Время ответа",
"average_processing_time_hint": "Среднее время для обработки запроса DNS в миллисекундах",
"block_domain_use_filters_and_hosts": "Блокировать домены с использованием фильтров и файлов hosts",
"filters_block_toggle_hint": "Вы можете настроить правила блокировки в <a>«Фильтрах»</a>.",
@@ -283,6 +289,9 @@
"custom_ip": "Свой IP",
"blocking_ipv4": "Блокировка IPv4",
"blocking_ipv6": "Блокировка IPv6",
"blocked_response_ttl": "TTL заблокированного ответа",
"blocked_response_ttl_desc": "Указывает, в течение скольких секунд клиенты должны кешировать отфильтрованный ответ",
"form_enter_blocked_response_ttl": "Введите TTL заблокированного ответа (в секундах)",
"dnscrypt": "DNSCrypt",
"dns_over_https": "DNS-over-HTTPS",
"dns_over_tls": "DNS-over-TLS",
@@ -537,8 +546,8 @@
"statistics_enable": "Включить статистику",
"ignore_domains": "Игнорируемые домены (построчно)",
"ignore_domains_title": "Игнорируемые домены",
"ignore_domains_desc_stats": "Запросы для этих доменов не записываются в статистику",
"ignore_domains_desc_query": "Запросы для этих доменов не записываются в журнал запросов",
"ignore_domains_desc_stats": "Запросы, соответствующие этим правилам, не записываются в статистику",
"ignore_domains_desc_query": "Запросы, соответствующие этим правилам, не записываются в журнал запросов",
"interval_hours": "{{count}} час",
"interval_hours_plural": "{{count}} часов",
"filters_configuration": "Настройка фильтров",
@@ -654,7 +663,7 @@
"parental_control": "Родительский контроль",
"safe_browsing": "Безопасный интернет",
"served_from_cache": "{{value}} <i>(получено из кеша)</i>",
"form_error_password_length": "Пароль должен быть длиной не меньше {{value}} символов",
"form_error_password_length": "Пароль должен содержать от {{min}} до {{max}} символов",
"anonymizer_notification": "<0>Внимание:</0> включена анонимизация IP-адресов. Вы можете отключить её в разделе <1>Основные настройки</1>.",
"confirm_dns_cache_clear": "Вы уверены, что хотите очистить кеш DNS?",
"cache_cleared": "Кеш DNS успешно очищен",

View File

@@ -122,7 +122,6 @@
"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> තුළ පිහිටුවිය හැකිය.",
@@ -647,6 +646,20 @@
"log_and_stats_section_label": "විමසුම් සටහන හා සංඛ්‍යාලේඛන",
"ignore_query_log": "විමසුම් සටහනට මෙම අනුග්‍රාහකය යොදන්න එපා",
"ignore_statistics": "සංඛ්‍යාලේඛනයට මෙම අනුග්‍රාහකය යොදන්න එපා",
"schedule_invalid_select": "ආරම්භක වේලාව අවසන් වේලාවට කලින් විය යුතුය",
"schedule_select_days": "දවස් තෝරන්න",
"schedule_timezone": "වේලා කලාපයක් තෝරන්න",
"schedule_current_timezone": "වත්මන් වේලා කලාපය: {{value}}",
"schedule_time_all_day": "දවස පුරාම",
"schedule_from": "සිට",
"schedule_to": "දක්වා",
"sunday": "ඉරිදා",
"monday": "සඳුදා",
"tuesday": "අඟහරුවාදා",
"wednesday": "බදාදා",
"thursday": "බ්‍රහස්පතින්දා",
"friday": "සිකුරාදා",
"saturday": "සෙනසුරාදා",
"sunday_short": "ඉරිදා",
"monday_short": "සඳුදා",
"tuesday_short": "අඟහ",

View File

@@ -1,6 +1,7 @@
{
"client_settings": "Nastavenie klienta",
"example_upstream_reserved": "upstream <0>pre konkrétne domény</0>;",
"example_multiple_upstreams_reserved": "viaceré upstreamy pre <0>konkrétne domény</0>;",
"example_upstream_comment": "komentár.",
"upstream_parallel": "Používať paralelné dopyty na zrýchlenie súčasným dopytovaním všetkých upstream serverov súčasne.",
"parallel_requests": "Paralelné dopyty",
@@ -73,7 +74,9 @@
"dhcp_dynamic_ip_found": "Váš systém používa pre rozhranie <0>{{interfaceName}}</0> dynamickú konfiguráciu IP adresy. Aby bolo možné používať DHCP server, musí byť nastavená statická IP adresa. Vaša aktuálna IP adresa je <0>{{ipAddress}}</0>. ak Ak stlačíte tlačidlo \"Povoliť DHCP server\", AdGuard Home automaticky nastaví túto IP adresu ako statickú.",
"dhcp_lease_added": "Statický \"{{key}}\" prenájmu bol úspešne pridaný",
"dhcp_lease_deleted": "Statický \"{{key}}\" prenájmu bol úspešne vymazaný",
"dhcp_lease_updated": "Statický prenájom \"{{key}}\" bol úspešne aktualizovaný",
"dhcp_new_static_lease": "Nový statický prenájom",
"dhcp_edit_static_lease": "Upraviť statický prenájom",
"dhcp_static_leases_not_found": "Nebol nájdený žiadny statický DHCP prenájom",
"dhcp_add_static_lease": "Pridať statický prenájom",
"dhcp_reset_leases": "Resetovať všetky prenájmy",
@@ -117,7 +120,8 @@
"stats_malware_phishing": "Blokovaný škodlivý kód/pokus o podvod",
"stats_adult": "Blokovaná stránka pre dospelých",
"stats_query_domain": "Najčastejšie dopytované domény",
"for_last_24_hours": "za posledných 24 hodín",
"for_last_hours": "za poslednú {{count}} hodinu",
"for_last_hours_plural": "za posledné {{count}} hodiny|za posledných {{count}} hodín",
"for_last_days": "za posledný {{count}} deň",
"for_last_days_plural": "za posledných {{count}} dní",
"stats_disabled": "Štatistiky boli vypnuté. Môžete ich zapnúť na <0>stránke nastavení</0>.",
@@ -132,14 +136,16 @@
"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",
"number_of_dns_query_hours": "Počet DNS dopytov spracovaných za poslednú {{count}} hodinu",
"number_of_dns_query_hours_plural": "Počet DNS dopytov spracovaných za posledné {{count}} hodiny)|Počet DNS dopytov spracovaných za posledných {{count}} hodín",
"number_of_dns_query_blocked_24_hours": "Počet DNS dopytov zablokovaných filtrami reklamy a zoznamami blokovaných hostov",
"number_of_dns_query_blocked_24_hours_by_sec": "Počet DNS dopytov zablokovaných AdGuard modulom Bezpečné prehliadanie",
"number_of_dns_query_blocked_24_hours_adult": "Počet zablokovaných stránok pre dospelých",
"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_upstream_response_time": "Priemerný čas odozvy upstreamu",
"response_time": "Čas odozvy",
"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>.",
@@ -283,6 +289,9 @@
"custom_ip": "Vlastná IP adresa",
"blocking_ipv4": "Blokovanie IPv4",
"blocking_ipv6": "Blokovanie IPv6",
"blocked_response_ttl": "Blokovaná odozva TTL",
"blocked_response_ttl_desc": "Určuje, na koľko sekúnd by mali klienti uložiť filtrovanú odozvu do vyrovnávacej pamäte",
"form_enter_blocked_response_ttl": "Zadajte TTL blokovanej odozve (sekundy)",
"dnscrypt": "DNSCrypt",
"dns_over_https": "DNS-over-HTTPS",
"dns_over_tls": "DNS-over-TLS",
@@ -537,8 +546,8 @@
"statistics_enable": "Zapnúť štatistiku",
"ignore_domains": "Ignorované domény (oddelené novým riadkom)",
"ignore_domains_title": "Ignorované domény",
"ignore_domains_desc_stats": "Dopyty pre tieto domény sa nezapisujú do štatistík",
"ignore_domains_desc_query": "Dopyty pre tieto domény sa nezapisujú do denníka dopytov",
"ignore_domains_desc_stats": "Dopyty zodpovedajúce týmto pravidlám sa nezapisujú do štatistík",
"ignore_domains_desc_query": "Dopyty zodpovedajúce týmto pravidlám sa nezapisujú do denníka dopytov",
"interval_hours": "{{count}} hodina",
"interval_hours_plural": "{{count}} hodín",
"filters_configuration": "Konfigurácia filtrov",
@@ -654,7 +663,7 @@
"parental_control": "Rodičovská kontrola",
"safe_browsing": "Bezpečné prehliadanie",
"served_from_cache": "{{value}} <i>(prevzatá z cache pamäte)</i>",
"form_error_password_length": "Heslo musí mať dĺžku aspoň {{value}} znakov",
"form_error_password_length": "Heslo musí mať od {{min}} do {{max}} znakov",
"anonymizer_notification": "<0>Poznámka:</0> Anonymizácia IP je zapnutá. Môžete ju vypnúť vo <1>Všeobecných nastaveniach</1>.",
"confirm_dns_cache_clear": "Naozaj chcete vymazať vyrovnávaciu pamäť DNS?",
"cache_cleared": "Vyrovnávacia pamäť DNS bola úspešne vymazaná",

View File

@@ -1,6 +1,7 @@
{
"client_settings": "Nastavitve odjemalca",
"example_upstream_reserved": "gorvodni <0>za določene domene</0>;",
"example_multiple_upstreams_reserved": "več gorvodnih <0>za določene domene</0>;",
"example_upstream_comment": "komentar.",
"upstream_parallel": "Uporabite vzporedne zahteve za pospešitev reševanja s hkratnim poizvedovanjem vseh gorvodnih strežnikov.",
"parallel_requests": "Vzporedne zahteve",
@@ -73,7 +74,9 @@
"dhcp_dynamic_ip_found": "Vaš sistem uporablja dinamično nastavitev naslova IP kartice <0>{{interfaceName}}</0>. Za uporabo strežnika DHCP morate nastaviti statični naslov IP. Vaš trenutni naslov IP je<0>{{ipAddress}}</0>. AdGuard Home bo samodejno nastavil ta naslov IP kot statičen, če pritisnete gumb 'Omogoči strežnik DHCP'.",
"dhcp_lease_added": "Statičen najem \"{{key}}\" je uspešno dodan",
"dhcp_lease_deleted": "Statičen najem \"{{key}}\" je uspešno izbrisan",
"dhcp_lease_updated": "Statični najem \"{{key}}\" je uspešno posodobljen",
"dhcp_new_static_lease": "Nov statični najem",
"dhcp_edit_static_lease": "Uredi statični najem",
"dhcp_static_leases_not_found": "Ni najdenih statičnih najemov DHCP",
"dhcp_add_static_lease": "Dodaj statičen najem",
"dhcp_reset_leases": "Ponastavi vse najeme",
@@ -117,7 +120,8 @@
"stats_malware_phishing": "Onemogočeno zlonamernih programov/lažnih predstavljanj",
"stats_adult": "Onemogočeno spletnih strani za odrasle",
"stats_query_domain": "Najbolj poizvedovane domene",
"for_last_24_hours": "v zadnjih 24 urah",
"for_last_hours": "za zadnjo {{count}} uro",
"for_last_hours_plural": "za zadnjih {{count}} ur",
"for_last_days": "zadnjega {{count}} dne",
"for_last_days_plural": "zadnjih {{count}} dni",
"stats_disabled": "Statistika je onemogočena. Vklopite ga lahko na <0>strani z nastavitvami</0>.",
@@ -132,14 +136,16 @@
"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",
"number_of_dns_query_hours": "Število poizvedb DNS, obdelanih v zadnji {{count}} uri",
"number_of_dns_query_hours_plural": "Število poizvedb DNS, obdelanih v zadnjih {{count}} urah",
"number_of_dns_query_blocked_24_hours": "Število zahtev DNS, ki so jih onemogočili filtri za zaviranje oglasov in seznami nedovoljenih, gostiteljev",
"number_of_dns_query_blocked_24_hours_by_sec": "Število zahtev DNS, ki jih je blokiral AdGuard zaščitni modul brskanja",
"number_of_dns_query_blocked_24_hours_adult": "Število onemogočenih spletnih strani za odrasle",
"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_upstream_response_time": "Povprečni gorvodni odzivni čas",
"response_time": "Odzivni čas",
"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>.",
@@ -283,6 +289,9 @@
"custom_ip": "IP po meri",
"blocking_ipv4": "Onemogočanje IPv4",
"blocking_ipv6": "Onemogočanje IPv6",
"blocked_response_ttl": "Zaviran odziv TTL",
"blocked_response_ttl_desc": "Določa, koliko sekund naj odjemalci predpomnijo filtrirane odgovore",
"form_enter_blocked_response_ttl": "Vnesite TTL zaviranega odgovora (sekunde)",
"dnscrypt": "DNSCrypt",
"dns_over_https": "DNS-prek-HTTPS",
"dns_over_tls": "DNS-prek-TLS",
@@ -537,8 +546,8 @@
"statistics_enable": "Omogoči statistiko",
"ignore_domains": "Prezrte domene (ločene z novo vrstico)",
"ignore_domains_title": "Prezrte domene",
"ignore_domains_desc_stats": "Poizvedbe za te domene niso zapisane v statistiko",
"ignore_domains_desc_query": "Poizvedbe za te domene niso zapisane v dnevnik poizvedb",
"ignore_domains_desc_stats": "Poizvedbe, ki ustrezajo tem pravilom, se ne zapišejo v statistiko",
"ignore_domains_desc_query": "Poizvedbe, ki ustrezajo tem pravilom, se ne zapišejo v dnevnik poizvedb",
"interval_hours": "{{count}} ur",
"interval_hours_plural": "{{count}} ur",
"filters_configuration": "Nastavitve filtrov",
@@ -654,7 +663,7 @@
"parental_control": "Starševski nadzor",
"safe_browsing": "Varno brskanje",
"served_from_cache": "{{value}} <i>(postreženo iz predpomnilnika)</i>",
"form_error_password_length": "Geslo mora vsebovati najmanj {{value}} znakov",
"form_error_password_length": "Geslo mora vsebovati od {{min}} do {{max}} znakov",
"anonymizer_notification": "<0>Opomba:</0> Anonimizacija IP je omogočena. Onemogočite ga lahko v <1>Splošnih nastavitvah</1>.",
"confirm_dns_cache_clear": "Ali ste prepričani, da želite počistiti predpomnilnik DNS?",
"cache_cleared": "Predpomnilnik DNS je bil uspešno počiščen",

View File

@@ -1,6 +1,7 @@
{
"client_settings": "Postavke klijenta",
"example_upstream_reserved": "upstream <0>za određene domene</0>;",
"example_multiple_upstreams_reserved": "nekoliko DNS servera <0>za određene domene</0>;",
"example_upstream_comment": "komentar.",
"upstream_parallel": "Koristite paralelne upite da biste ubrzali rešavanje tako što ćete istovremeno ispitati sve uzvodne servere.",
"parallel_requests": "Paralelni zahtevi",
@@ -73,7 +74,9 @@
"dhcp_dynamic_ip_found": "Vaš sistem koristi dinamičku IP adresu za okruženje <0>{{interfaceName}}</0>. Kako biste koristili DHCP server, morate podesiti statičku IP adresu. Vaša trenutna IP adresa je <0>{{ipAddress}}</0>. Automatski ćemo podesiti ovu IP adresu kao statičku ako pritisnete Uključi DHCP dugme.",
"dhcp_lease_added": "Statičko iznajmljivanje \"{{key}}\" uspešno dodato",
"dhcp_lease_deleted": "Statičko iznajmljivanje lease \"{{key}}\" uspešno izbrisano",
"dhcp_lease_updated": "Statičko iznajmljivanje \"{{key}}\" ažurirano",
"dhcp_new_static_lease": "Novo statičko iznajmljivanje",
"dhcp_edit_static_lease": "Uređivanje statičkog iznajmljivanja",
"dhcp_static_leases_not_found": "Nisu pronađena statička DHCP iznajmljivanja",
"dhcp_add_static_lease": "Dodaj statičko iznajmljivanje",
"dhcp_reset_leases": "Resetuj sva unajmljivanja",
@@ -117,7 +120,8 @@
"stats_malware_phishing": "Blokiraj štetan softver i fišing",
"stats_adult": "Blokiraj sajtove za odrasle",
"stats_query_domain": "Najčešće unošeni domeni",
"for_last_24_hours": "u poslednja 24 časa",
"for_last_hours": "u poslednjih {{count}} sat",
"for_last_hours_plural": "u poslednjih {{count}} sati",
"for_last_days": "u poslednjih {{count}} dana",
"for_last_days_plural": "u poslednjih {{count}} dana",
"stats_disabled": "Statistika je isključena. Možete ga uključiti sa stranice <0>sa postavkama</0>.",
@@ -132,14 +136,16 @@
"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",
"number_of_dns_query_hours": "Broj obrađenih DNS unosa u poslednji {{count}} sat",
"number_of_dns_query_hours_plural": "Broj obrađenih DNS unosa u poslednjih {{count}} sati",
"number_of_dns_query_blocked_24_hours": "Broj DNS zahteva blokiranih od filtera blokatora reklama i blok liste hostova",
"number_of_dns_query_blocked_24_hours_by_sec": "Broj DNS zahteva blokiranih od AdGuard-ovog podprograma za bezbedno pregledanje",
"number_of_dns_query_blocked_24_hours_adult": "Broj blokiranih sajtova za odrasle",
"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_upstream_response_time": "Prosečno vreme odziva upstream-servera",
"response_time": "Vreme odziva",
"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.",
@@ -283,6 +289,9 @@
"custom_ip": "Prilagođeni IP",
"blocking_ipv4": "Blokiranje IPv4",
"blocking_ipv6": "Blokiranje IPv6",
"blocked_response_ttl": "TTL blokiranog odgovora",
"blocked_response_ttl_desc": "Određuje koliko sekundi klijenti treba da keširaju filtrirani odgovor",
"form_enter_blocked_response_ttl": "Unesite TTL blokiranog odgovora (sekunde)",
"dnscrypt": "DNSCrypt",
"dns_over_https": "DNS-over-HTTPS",
"dns_over_tls": "DNS-over-TLS",
@@ -537,8 +546,8 @@
"statistics_enable": "Uključi statistiku",
"ignore_domains": "Zanemari domene (razdvojene novom linijom)",
"ignore_domains_title": "Zanemareni domeni",
"ignore_domains_desc_stats": "Upiti za ove domene nisu upisani u statistiku",
"ignore_domains_desc_query": "Upiti za ove domene nisu upisani u evidenciju upita",
"ignore_domains_desc_stats": "Upiti koji se podudaraju sa ovim pravilima nisu upisani u statistiku",
"ignore_domains_desc_query": "Upiti koji se podudaraju sa ovim pravilima nisu upisani u evidenciju upita",
"interval_hours": "{{count}} čas",
"interval_hours_plural": "{{count}} časova",
"filters_configuration": "Konfiguracija filtera",
@@ -654,7 +663,7 @@
"parental_control": "Roditeljska kontrola",
"safe_browsing": "Sigurno pregledanje",
"served_from_cache": "{{value}} <i>(posluženo iz predmemorije)</i>",
"form_error_password_length": "Lozinka mora imati najmanje {{value}} znakova",
"form_error_password_length": "Lozinka mora imati od {{min}} do {{max}} znakova",
"anonymizer_notification": "<0>Nota:</0> IP prepoznavanje je omogućeno. Možete ga onemogućiti u opštim <1>postavkama</1>.",
"confirm_dns_cache_clear": "Želite li zaista da obrišite DNS keš?",
"cache_cleared": "DNS keš je uspešno očišćen",

View File

@@ -1,7 +1,8 @@
{
"client_settings": "Klientinställningar",
"example_upstream_reserved": "uppström <0>för en specifik domän</0>;",
"example_upstream_comment": "du kan ange en kommentar.",
"example_multiple_upstreams_reserved": "flera uppströmsservrar <0>för specifika domäner</0>;",
"example_upstream_comment": "en kommentar.",
"upstream_parallel": "Använd parallella förfrågningar för att snabba upp dessa genom att fråga alla uppströmsservrar samtidigt.",
"parallel_requests": "Parallella förfrågningar",
"load_balancing": "Lastbalansering",
@@ -73,7 +74,9 @@
"dhcp_dynamic_ip_found": "Din enhet använder en dynamisk IP-adress för gränssnittet <0>{{interfaceName}}</0>. För att kunna använda DHCP-servern behövs en statisk IP-adress. Din nuvarande IP-adress är <0>{{ipAddress}}</0>. AdGuard Home kommer automatiskt att göra denna IP-adress statisk om du trycker på knappen \"Aktivera DHCP\".",
"dhcp_lease_added": "Statisk lease \"{{key}}\" har lagts till",
"dhcp_lease_deleted": "Statisk lease \"{{key}}\" har raderats",
"dhcp_lease_updated": "Statiskt lease \"{{key}}\" har uppdaterats",
"dhcp_new_static_lease": "Ny statisk lease",
"dhcp_edit_static_lease": "Redigera statiskt lease",
"dhcp_static_leases_not_found": "Inga statiska DHCP-leases hittade",
"dhcp_add_static_lease": "Lägg till statisk lease",
"dhcp_reset_leases": "Återställ alla leasingavtal",
@@ -117,7 +120,8 @@
"stats_malware_phishing": "Blockerad skadekod/phishing",
"stats_adult": "Blockerade vuxensajter",
"stats_query_domain": "Mest eftersökta domäner",
"for_last_24_hours": "under de senaste 24 timmarna",
"for_last_hours": "r den senaste {{count}} timme",
"for_last_hours_plural": "för de senaste {{count}} timmar",
"for_last_days": "för den senaste {{count}} dagen",
"for_last_days_plural": "för de senaste {{count}} dagarna",
"stats_disabled": "Statistiken har inaktiverats. Du kan aktivera det från <0>inställningssidan</0>.",
@@ -132,14 +136,16 @@
"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",
"number_of_dns_query_hours": "Ett antal DNS förfrågningar utfördes r den senaste {{count}} timme",
"number_of_dns_query_hours_plural": "Ett antal DNS förfrågningar utfördes för den senaste {{count}} timmar",
"number_of_dns_query_blocked_24_hours": "Antalet DNS-förfrågningar som blockerades av annonsfilter och värdens blockeringsklistor",
"number_of_dns_query_blocked_24_hours_by_sec": "Antalet DNS-förfrågningar som blockerades av AdGuards modul för surfsäkerhet",
"number_of_dns_query_blocked_24_hours_adult": "Antalet vuxensajter som blockerats",
"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_upstream_response_time": "Genomsnittlig svarstid uppströmsserver",
"response_time": "Svarstid",
"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>.",
@@ -174,6 +180,7 @@
"enabled_parental_toast": "Föräldrakontroll inkopplat",
"disabled_safe_search_toast": "Säker webbsökning bortkopplat",
"enabled_save_search_toast": "Säker webbsökning inkopplat",
"updated_save_search_toast": "Inställningarna för Säker sökning uppdaterade",
"enabled_table_header": "Inkopplat",
"name_table_header": "Namn",
"list_url_table_header": "Lista URL",
@@ -282,6 +289,9 @@
"custom_ip": "Eget IP",
"blocking_ipv4": "Blockera IPv4",
"blocking_ipv6": "Blockera IPv6",
"blocked_response_ttl": "TTL för blockerat svar",
"blocked_response_ttl_desc": "Anger hur många sekunder klienterna ska cache ett filtrerat svar",
"form_enter_blocked_response_ttl": "Ange TTL för blockerat svar (sekunder)",
"dnscrypt": "DNSCrypt",
"dns_over_https": "DNS-over-HTTPS",
"dns_over_tls": "DNS-over-TLS",
@@ -536,8 +546,8 @@
"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 r dessa domäner skrivs inte till statistiken",
"ignore_domains_desc_query": "Förfrågningar r dessa domäner skrivs inte till frågeloggningen",
"ignore_domains_desc_stats": "Förfrågningar som matchar dessa regler skrivs inte till statistiken",
"ignore_domains_desc_query": "Förfrågningar som matchar dessa regler skrivs inte till förfrågningsloggen",
"interval_hours": "{{count}} timme",
"interval_hours_plural": "{{count}} timmar",
"filters_configuration": "Filterinställningar",
@@ -653,7 +663,7 @@
"parental_control": "Föräldrakontroll",
"safe_browsing": "Säker surfning",
"served_from_cache": "{{value}} <i>(levereras från cache)</i>",
"form_error_password_length": "Lösenordet måste vara minst {{value}} tecken långt",
"form_error_password_length": "Lösenordet måste vara {{min}} till {{max}} tecken långt",
"anonymizer_notification": "<0>Observera:</0> IP-anonymisering är aktiverad. Du kan inaktivera den i <1>Allmänna inställningar</1>.",
"confirm_dns_cache_clear": "Är du säker på att du vill rensa DNS-cache?",
"cache_cleared": "DNS-cacheminnet har rensats",
@@ -669,8 +679,19 @@
"disable_for_hours": "I {{count}} timme",
"disable_for_hours_plural": "I {{count}} timmar",
"disable_until_tomorrow": "Tills imorgon",
"disable_notify_for_seconds": "Inaktivera skyddet i {{count}} sekund",
"disable_notify_for_seconds_plural": "Inaktivera skyddet i {{count}} sekunder",
"disable_notify_for_minutes": "Inaktivera skyddet i {{count}} minut",
"disable_notify_for_minutes_plural": "Inaktivera skyddet i {{count}} minuter",
"disable_notify_for_hours": "Inaktivera skyddet i {{count}} timme",
"disable_notify_for_hours_plural": "Inaktivera skyddet i {{count}} timmar",
"disable_notify_until_tomorrow": "Inaktivera skyddet tills imorgon",
"enable_protection_timer": "Skyddet kommer att aktiveras i {{time}}",
"custom_retention_input": "Ange retention i timmar",
"custom_rotation_input": "Ange rotation i timmar",
"protection_section_label": "Skydd",
"log_and_stats_section_label": "Förfrågningslogg och statistik",
"ignore_query_log": "Ignorera den här klienten i frågeloggen",
"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",

View File

@@ -1,6 +1,7 @@
{
"client_settings": "İstemci ayarları",
"example_upstream_reserved": "<0>belirli alan adları</0> için bir üst sunucusu;",
"example_multiple_upstreams_reserved": "<0>belirli alanlar için</0> birden fazla üst kaynaklar;",
"example_upstream_comment": "bir yorum.",
"upstream_parallel": "Tüm üst sunucuları eş zamanlı sorgulayarak çözümlemeyi hızlandırmak için paralel sorgular kullanın.",
"parallel_requests": "Paralel istekler",
@@ -73,7 +74,9 @@
"dhcp_dynamic_ip_found": "Sisteminiz, <0>{{interfaceName}}</0> arayüzü için dinamik IP adresi yapılandırması kullanıyor. DHCP sunucusunu kullanmak için sabit bir IP adresi ayarlanmalıdır. Geçerli olan IP adresiniz <0>{{ipAddress}}</0>. \"DHCP sunucusunu etkinleştir\" düğmesine basarsanız, AdGuard Home bu IP adresini otomatik bir şekilde sabit olarak ayarlayacaktır.",
"dhcp_lease_added": "Sabit kiralama \"{{key}}\" başarıyla eklendi",
"dhcp_lease_deleted": "Sabit kiralama \"{{key}}\" başarıyla silindi",
"dhcp_lease_updated": "Statik kiralama \"{{key}}\" başarıyla güncellendi",
"dhcp_new_static_lease": "Yeni sabit kiralama",
"dhcp_edit_static_lease": "Statik kiralamayı düzenle",
"dhcp_static_leases_not_found": "Sabit DHCP kiralaması bulunamadı",
"dhcp_add_static_lease": "Sabit kiralama ekle",
"dhcp_reset_leases": "Tüm kiralamaları sıfırla",
@@ -90,7 +93,7 @@
"client_details": "İstemci ayrıntıları",
"details": "Ayrıntılar",
"back": "Geri",
"dashboard": "Ana Sayfa",
"dashboard": "Pano",
"settings": "Ayarlar",
"filters": "Filtreler",
"filter": "Filtre",
@@ -117,7 +120,8 @@
"stats_malware_phishing": "Engellenen kötü amaçlı yazılım ve kimlik avı",
"stats_adult": "Engellenen yetişkin içerikli siteler",
"stats_query_domain": "Başlıca sorgulanan alan adları",
"for_last_24_hours": "son 24 saat içindekiler",
"for_last_hours": "son {{count}} saat için",
"for_last_hours_plural": "son {{count}} saat için",
"for_last_days": "son {{count}} gün boyunca",
"for_last_days_plural": "son {{count}} gün boyunca",
"stats_disabled": "İstatistikler devre dışı bırakıldı. Bunu, <0>ayarlar sayfasından</0> etkinleştirebilirsiniz.",
@@ -132,14 +136,16 @@
"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ı",
"number_of_dns_query_hours": "Son {{count}} saat için işlenen DNS sorgularının sayısı",
"number_of_dns_query_hours_plural": "Son {{count}} saatiçin işlenen DNS sorgularının sayısı",
"number_of_dns_query_blocked_24_hours": "Reklam engelleme filtreleri ve hosts engel listeleri tarafından engellenen DNS isteklerinin sayısı",
"number_of_dns_query_blocked_24_hours_by_sec": "AdGuard gezinti koruması modülü tarafından engellenen DNS isteklerinin sayısı",
"number_of_dns_query_blocked_24_hours_adult": "Engellenen yetişkin içerikli sitelerin sayısı",
"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_upstream_response_time": "Ortalama üst kaynak yanıt süresi",
"response_time": "Yanıt süresi",
"average_processing_time_hint": "Bir DNS isteğinin milisaniye cinsinden ortalama işlem süresi",
"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.",
@@ -176,7 +182,7 @@
"enabled_save_search_toast": "Güvenli Arama etkinleştirildi",
"updated_save_search_toast": "Güvenli Arama ayarları güncellendi",
"enabled_table_header": "Etkin",
"name_table_header": "Ad",
"name_table_header": "Adı",
"list_url_table_header": "Liste URL'si",
"rules_count_table_header": "Kural sayısı",
"last_time_updated_table_header": "Son güncelleme zamanı",
@@ -283,6 +289,9 @@
"custom_ip": "Özel IP",
"blocking_ipv4": "IPv4 engelleme",
"blocking_ipv6": "IPv6 engelleme",
"blocked_response_ttl": "Engellenen yanıt kullanım süresi",
"blocked_response_ttl_desc": "İstemcilerin filtrelenmiş bir yanıtı kaç saniye süreyle önbelleğe alması gerektiğini belirtir",
"form_enter_blocked_response_ttl": "Engellenen yanıt kullanım süresini girin (saniye)",
"dnscrypt": "DNSCrypt",
"dns_over_https": "DNS-over-HTTPS",
"dns_over_tls": "DNS-over-TLS",
@@ -370,7 +379,7 @@
"install_devices_ios_list_4": "DNS alanına AdGuard Home sunucunuzun adreslerini girin.",
"get_started": "Başlayın",
"next": "Sonraki",
"open_dashboard": "Ana Sayfayı Aç",
"open_dashboard": "Panoyu Aç",
"install_saved": "Başarıyla kaydedildi",
"encryption_title": "Şifreleme",
"encryption_desc": "DNS ve yönetici web arayüzü için şifreleme (HTTPS/TLS) desteği",
@@ -428,7 +437,7 @@
"settings_global": "Genel",
"settings_custom": "Özel",
"table_client": "İstemci",
"table_name": "Ad",
"table_name": "AdAdı",
"save_btn": "Kaydet",
"client_add": "İstemci Ekle",
"client_new": "Yeni İstemci",
@@ -442,7 +451,7 @@
"form_enter_id": "Tanımlayıcı girin",
"form_add_id": "Tanımlayıcı ekle",
"form_client_name": "İstemci ismi girin",
"name": "Ad",
"name": "Adı",
"client_global_settings": "Genel ayarları kullan",
"client_deleted": "\"{{key}}\" istemcisi başarıyla silindi",
"client_added": "\"{{key}}\" istemcisi başarıyla eklendi",
@@ -537,8 +546,8 @@
"statistics_enable": "İstatistikleri etkinleştir",
"ignore_domains": "Yok sayılan alan adları (yeni satırla ayrılmış)",
"ignore_domains_title": "Yok sayılan alan adları",
"ignore_domains_desc_stats": "Bu alan adları için yapılan sorgular istatistiklere yazılmaz",
"ignore_domains_desc_query": "Bu alan adları için yapılan sorgular sorgu günlüğüne yazılmaz",
"ignore_domains_desc_stats": "Bu kurallarla eşleşen sorgular istatistiklere yazılmaz",
"ignore_domains_desc_query": "Bu kurallarla eşleşen sorgular sorgu günlüğüne yazılmaz",
"interval_hours": "{{count}} saat",
"interval_hours_plural": "{{count}} saat",
"filters_configuration": "Filtre yapılandırması",
@@ -654,7 +663,7 @@
"parental_control": "Ebeveyn Denetimi",
"safe_browsing": "Güvenli Gezinti",
"served_from_cache": "{{value}} <i>(önbellekten kullanıldı)</i>",
"form_error_password_length": "Parola en az {{value}} karakter uzunluğunda olmalıdır",
"form_error_password_length": "Parola {{min}} ila {{max}} karakter uzunluğunda olmalıdır",
"anonymizer_notification": "<0>Not:</0> IP anonimleştirme etkinleştirildi. Bunu <1>Genel ayarlardan</1> devre dışı bırakabilirsiniz.",
"confirm_dns_cache_clear": "DNS önbelleğini temizlemek istediğinizden emin misiniz?",
"cache_cleared": "DNS önbelleği başarıyla temizlendi",

View File

@@ -73,7 +73,9 @@
"dhcp_dynamic_ip_found": "Ваша система використовує конфігурацію з динамічною IP-адресою для інтерфейсу <0>{{interfaceName}}</0>. Для використання DHCP-сервера необхідно встановити статичну IP-адресу. Ваша поточна IP-адреса <0>{{ipAddress}}</0>. Ми автоматично встановимо цю IP-адресу як статичну, якщо ви натиснете кнопку «Увімкнути DHCP-сервер».",
"dhcp_lease_added": "Статичну оренду «{{key}}» успішно додано",
"dhcp_lease_deleted": "Статичну оренду «{{key}}» успішно видалено",
"dhcp_lease_updated": "Статичну оренду \"{{key}}\" успішно оновлено",
"dhcp_new_static_lease": "Нова статична оренда",
"dhcp_edit_static_lease": "Редагувати статичну оренду",
"dhcp_static_leases_not_found": "Не знайдено статичних оренд DHCP",
"dhcp_add_static_lease": "Додати статичну оренду",
"dhcp_reset_leases": "Скинути всі аренди",
@@ -117,7 +119,8 @@
"stats_malware_phishing": "Заблоковано зловмисних/шахрайських програм",
"stats_adult": "Заблоковано вебсайтів для дорослих",
"stats_query_domain": "Найчастіші запити доменів",
"for_last_24_hours": "за останні 24 години",
"for_last_hours": "за останню {{count}} годину",
"for_last_hours_plural": "за останні {{count}} годин",
"for_last_days": "за останній {{count}} день",
"for_last_days_plural": "за останні {{count}} днів",
"stats_disabled": "Статистику вимкнено. Ви можете увімкнути її на <0>сторінці налаштувань</0>.",
@@ -132,14 +135,14 @@
"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 години",
"number_of_dns_query_hours": "Кількість DNS-запитів, оброблених за останню {{count}} годину",
"number_of_dns_query_hours_plural": "Кількість DNS-запитів, оброблених за останні {{count}} годин",
"number_of_dns_query_blocked_24_hours": "Кількість DNS-запитів, заблокованих фільтрами і списками блокування hosts",
"number_of_dns_query_blocked_24_hours_by_sec": "Кількість DNS-запитів, заблокованих модулем «Безпека перегляду» AdGuard",
"number_of_dns_query_blocked_24_hours_adult": "Кількість заблокованих вебсайтів для дорослих",
"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>.",
@@ -283,6 +286,9 @@
"custom_ip": "Власний IP",
"blocking_ipv4": "Блокування IPv4",
"blocking_ipv6": "Блокування IPv6",
"blocked_response_ttl": "TTL заблокованої відповіді",
"blocked_response_ttl_desc": "Вказує, скільки секунд клієнти повинні кешувати відфільтровану відповідь",
"form_enter_blocked_response_ttl": "Введіть TTL заблокованої відповіді (секунди)",
"dnscrypt": "DNSCrypt",
"dns_over_https": "DNS-over-HTTPS",
"dns_over_tls": "DNS-over-TLS",
@@ -537,8 +543,8 @@
"statistics_enable": "Увімкнути статистику",
"ignore_domains": "Ігноровані домени (по одному на рядок)",
"ignore_domains_title": "Ігноровані домени",
"ignore_domains_desc_stats": "Запити для цих доменів в статистику не пишуться",
"ignore_domains_desc_query": "Запити для цих доменів не записуються до журналу запитів",
"ignore_domains_desc_stats": "Запити, які відповідають цим правилам, в статистику не пишуться",
"ignore_domains_desc_query": "Запити, які відповідають цим правилам, не записуються до журналу запитів",
"interval_hours": "{{count}} година",
"interval_hours_plural": "{{count}} годин(и)",
"filters_configuration": "Конфігурація фільтрів",
@@ -654,7 +660,7 @@
"parental_control": "Батьківський контроль",
"safe_browsing": "Безпечний перегляд",
"served_from_cache": "{{value}} <i>(отримано з кешу)</i>",
"form_error_password_length": "Пароль мусить мати принаймні {{value}} символів",
"form_error_password_length": "Пароль має містити від {{min}} до {{max}} символів",
"anonymizer_notification": "<0>Примітка:</0> IP-анонімізацію ввімкнено. Ви можете вимкнути його в <1>Загальні налаштування</1> .",
"confirm_dns_cache_clear": "Ви впевнені, що бажаєте очистити кеш DNS?",
"cache_cleared": "Кеш DNS успішно очищено",
@@ -676,7 +682,7 @@
"disable_notify_for_minutes_plural": "Вимкнення захисту на {{count}} хвилин",
"disable_notify_for_hours": "Вимкнення захисту на {{count}} годину",
"disable_notify_for_hours_plural": "Вимкнення захисту на {{count}} годин",
"disable_notify_until_tomorrow": "Відключення захисту до завтра",
"disable_notify_until_tomorrow": "Вимкнути захист до завтра",
"enable_protection_timer": "Захист буде ввімкнено о {{time}}",
"custom_retention_input": "Введіть час в годинах",
"custom_rotation_input": "Введіть час в годинах",
@@ -694,7 +700,7 @@
"schedule_current_timezone": "Поточний часовий пояс: {{value}}",
"schedule_time_all_day": "Увесь день",
"schedule_modal_description": "Цей розклад замінить усі наявні розклади на той самий день тижня. Кожен день тижня може мати тільки один період бездіяльності.",
"schedule_modal_time_off": "Блокування сервісів відключена:",
"schedule_modal_time_off": "Вимкнення блокування сервісів:",
"schedule_new": "Новий розклад",
"schedule_edit": "Редагувати розклад",
"schedule_save": "Зберегти розклад",

View File

@@ -1,6 +1,7 @@
{
"client_settings": "Cài đặt thiết bị",
"example_upstream_reserved": "ngược dòng <0>cho các miền cụ thể</0>;",
"example_multiple_upstreams_reserved": "nhiều máy chủ thượng nguồn <0>cho các miền cụ thể</0>;",
"example_upstream_comment": "một lời bình luận.",
"upstream_parallel": "Sử dụng truy vấn song song để tăng tốc độ giải quyết bằng cách truy vấn đồng thời tất cả các máy chủ ngược tuyến",
"parallel_requests": "Yêu cầu song song",
@@ -73,7 +74,9 @@
"dhcp_dynamic_ip_found": "Hệ thống của bạn sử dụng cấu hình địa chỉ IP động cho giao diện <0>{{interfaceName}}</0>. Để sử dụng máy chủ DHCP, phải đặt địa chỉ IP tĩnh. Địa chỉ IP hiện tại của bạn là <0>{{ipAddress}}</0>. Chúng tôi sẽ tự động đặt địa chỉ IP này thành tĩnh nếu bạn nhấn nút Bật DHCP.",
"dhcp_lease_added": "Cho thuê tĩnh \"{{key}}\" đã được thêm thành công",
"dhcp_lease_deleted": "Cho thuê tĩnh \"{{key}}\" đã xóa thành công",
"dhcp_lease_updated": "Cho thuê tĩnh \"{{key}}\" được cập nhật thành công",
"dhcp_new_static_lease": "Cho thuê tĩnh mới",
"dhcp_edit_static_lease": "Chỉnh sửa hợp đồng thuê tĩnh",
"dhcp_static_leases_not_found": "Không tìm thấy DHCP cho thuê tĩnh",
"dhcp_add_static_lease": "Thêm thuê tĩnh",
"dhcp_reset_leases": "Đặt lại tất cả các hợp đồng thuê",
@@ -117,7 +120,8 @@
"stats_malware_phishing": "Mã độc/lừa đảo đã chặn",
"stats_adult": "Website người lớn đã chặn",
"stats_query_domain": "Tên miền truy vấn nhiều",
"for_last_24_hours": "trong 24 giờ qua",
"for_last_hours": "trong {{count}} giờ qua",
"for_last_hours_plural": "trong {{count}} giờ qua",
"for_last_days": "trong {{count}} ngày qua",
"for_last_days_plural": "trong {{count}} ngày qua",
"stats_disabled": "Số liệu thống kê đã bị vô hiệu hóa. Bạn có thể bật nó từ <0> trang cài đặt </0>.",
@@ -132,14 +136,16 @@
"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",
"number_of_dns_query_hours": "Một số truy vấn DNS được xử lý trong {{count}} giờ qua",
"number_of_dns_query_hours_plural": "Một số truy vấn DNS được xử lý trong {{count}} giờ qua",
"number_of_dns_query_blocked_24_hours": "Số yêu cầu DNS bị chặn bởi bộ lọc quảng cáo và danh sách chặn host",
"number_of_dns_query_blocked_24_hours_by_sec": "Số yêu cầu DNS bị chặn bởi chế độ bảo vệ duyệt web AdGuard",
"number_of_dns_query_blocked_24_hours_adult": "Số trang web người lớn đã chặn",
"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_upstream_response_time": "Thời gian phản hồi trung bình từ máy chủ thượng nguồn",
"response_time": "Thời gian đáp ứng",
"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>.",
@@ -283,6 +289,9 @@
"custom_ip": "IP tuỳ chỉnh",
"blocking_ipv4": "Chặn IPv4",
"blocking_ipv6": "Chặn IPv6",
"blocked_response_ttl": "Chặn phản hồi TTL",
"blocked_response_ttl_desc": "Chỉ định trong bao nhiêu giây máy khách sẽ lưu vào bộ đệm một phản hồi đã được lọc",
"form_enter_blocked_response_ttl": "Nhập phản hồi bị chặn TTL (giây)",
"dnscrypt": "DNSCrypt",
"dns_over_https": "DNS-over-HTTPS",
"dns_over_tls": "DNS-over-TLS",
@@ -537,8 +546,8 @@
"statistics_enable": "Bật thống kê",
"ignore_domains": "Các miền bị bỏ qua (cách nhau bởi dòng mới)",
"ignore_domains_title": "Các miền bị bỏ qua",
"ignore_domains_desc_stats": "Các truy vấn cho các miền này sẽ không được ghi vào thống kê",
"ignore_domains_desc_query": "Các truy vấn cho các miền này sẽ không được ghi vào nhật ký truy vấn",
"ignore_domains_desc_stats": "Các truy vấn phù hợp với các quy tắc này không được ghi vào số liệu thống kê",
"ignore_domains_desc_query": "Các truy vấn khớp với các quy tắc này không được ghi vào nhật ký truy vấn",
"interval_hours": "{{count}} giờ",
"interval_hours_plural": "{{count}} giờ",
"filters_configuration": "Cấu hình bộ lọc",
@@ -654,7 +663,7 @@
"parental_control": "Quản lý của phụ huynh",
"safe_browsing": "Duyệt web an toàn",
"served_from_cache": "{{value}} <i>(được phục vụ từ bộ nhớ cache)</i>",
"form_error_password_length": "Mật khẩu phải có ít nhất {{value}} ký tự",
"form_error_password_length": "Mật khẩu phải dài từ {{min}} đến {{max}} ký tự",
"anonymizer_notification": "<0> Lưu ý:</0> Tính năng ẩn danh IP được bật. Bạn có thể tắt nó trong <1> Cài đặt chung</1>.",
"confirm_dns_cache_clear": "Bạn có chắc chắn muốn xóa bộ đệm ẩn DNS không?",
"cache_cleared": "Đã xóa thành công bộ đệm DNS",

View File

@@ -1,15 +1,16 @@
{
"client_settings": "客户端设置",
"example_upstream_reserved": "指定为<0>特定域名</0>的上游服务器;",
"example_multiple_upstreams_reserved": "<0>特定域名</0>的多个上游服务器;",
"example_upstream_comment": "注释。",
"upstream_parallel": "使用并行请求以同时查询所有上游服务器来加快解析速度。",
"parallel_requests": "并行请求",
"load_balancing": "负载均衡",
"load_balancing_desc": "一次查询一台服务器。AdGuard Home 将使用加权随机算法来选择服务器,以便更常使用最快的服务器。",
"bootstrap_dns": "Bootstrap DNS 服务器",
"bootstrap_dns_desc": "DNS 服务器的 IP 地址,用于解析指定为上游的 DoH/DoT 解析器的 IP 地址。不允许评论。",
"bootstrap_dns_desc": "DNS 服务器的 IP 地址,用于解析指定为上游的 DoH/DoT 解析器的 IP 地址。不允许添加注释。",
"fallback_dns_title": "后备 DNS 服务器",
"fallback_dns_desc": "当上游 DNS 服务器没有响应时使用的后备 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 解析器。",
@@ -58,7 +59,7 @@
"dhcp_form_subnet_input": "子网掩码",
"dhcp_form_range_title": "IP 地址范围",
"dhcp_form_range_start": "起始 IP 地址",
"dhcp_form_range_end": "末尾 IP 地址",
"dhcp_form_range_end": "结束 IP 地址",
"dhcp_form_lease_title": "DHCP 租约时间(秒)",
"dhcp_form_lease_input": "租期",
"dhcp_interface_select": "选择 DHCP 接口",
@@ -67,13 +68,15 @@
"ip": "IP 地址",
"dhcp_table_hostname": "主机名",
"dhcp_table_expires": "到期",
"dhcp_warning": "如果想要启用内置的 DHCP 服务器,请确保在当前网络中没有其它起作用的 DHCP 服务器。否则,此操作可能会破坏已连接设备的网络连接!",
"dhcp_warning": "如果用户想要启用内置的 DHCP 服务器,请确保在当前网络中没有其它起作用的 DHCP 服务器。否则,此操作可能会中断已连接设备的网络连接!",
"dhcp_error": "AdGuard Home 无法确定在当前网络中是否存在其它 DHCP 服务器",
"dhcp_static_ip_error": "要使用 DHCP 服务器,则必须设置静态 IP 地址。AdGuard Home 无法确定此网络接口是否已被配置为使用静态 IP 地址。请手动为此网络接口设置静态 IP 地址。",
"dhcp_dynamic_ip_found": "您的系统对网络接口 <0>{{interfaceName}}</0> 使用了动态 IP 地址配置。要使用 DHCP 服务器,则必须对此网络接口使用静态 IP 地址配置。此网络接口当前的 IP 地址为 <0>{{ipAddress}}</0>。如您点击「启用 DHCP 服务器」按钮AdGuard Home 将自动修改此网络接口以使用静态 IP 地址。",
"dhcp_lease_added": "静态租约 \"{{key}}\" 已成功添加",
"dhcp_lease_deleted": "静态租约 \"{{key}}\" 已成功删除",
"dhcp_lease_updated": "静态租约 “{{key}}” 已成功更新",
"dhcp_new_static_lease": "新建静态租约",
"dhcp_edit_static_lease": "编辑静态租约",
"dhcp_static_leases_not_found": "未找到 DHCP 静态租约",
"dhcp_add_static_lease": "添加静态租约",
"dhcp_reset_leases": "重置所有租约",
@@ -112,12 +115,13 @@
"disable_protection": "禁用保护",
"disabled_protection": "保护已禁用",
"refresh_statics": "刷新统计数据",
"dns_query": "DNS查询",
"dns_query": "DNS 查询",
"blocked_by": "<0>已被过滤器拦截</0>",
"stats_malware_phishing": "被拦截的恶意/钓鱼网站",
"stats_adult": "被拦截的成人网站",
"stats_query_domain": "请求域名排行",
"for_last_24_hours": "在过去 24 小时",
"for_last_hours": "最近 {{count}} 小时",
"for_last_hours_plural": "最近 {{count}} 小时",
"for_last_days": "最近 {{count}} 天",
"for_last_days_plural": "最近 {{count}} 天",
"stats_disabled": "已禁用统计数据。您可以从<0>设置页面</0>打开它。",
@@ -132,14 +136,16 @@
"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 请求总数",
"number_of_dns_query_hours": "最近 {{count}} 小时内处理的 DNS 查询次数",
"number_of_dns_query_hours_plural": "最近 {{count}} 小时内处理的 DNS 查询次数",
"number_of_dns_query_blocked_24_hours": "被广告过滤器和 Hosts 黑名单阻止的 DNS 请求总数",
"number_of_dns_query_blocked_24_hours_by_sec": "被 AdGuard 安全浏览模块阻止的 DNS 请求总数",
"number_of_dns_query_blocked_24_hours_adult": "被阻止的成人网站总数",
"enforced_save_search": "强制安全搜索",
"number_of_dns_query_to_safe_search": "启用强制安全搜索后对搜索引擎的 DNS 请求总数",
"average_processing_time": "平均处理时间",
"processing_time": "处理时间",
"average_upstream_response_time": "上游服务器的平均响应时间",
"response_time": "响应时间",
"average_processing_time_hint": "处理 DNS 请求的平均时间(毫秒)",
"block_domain_use_filters_and_hosts": "使用过滤器和 Hosts 文件以拦截指定域名",
"filters_block_toggle_hint": "你可以在 <a>过滤器</a> 设置中添加过滤规则。",
@@ -154,7 +160,7 @@
"dns_settings": "DNS 设置",
"dns_blocklists": "DNS 黑名单",
"dns_allowlists": "DNS 白名单",
"dns_blocklists_desc": "AdGuard Home将阻止匹配DNS拦截清单的域名",
"dns_blocklists_desc": "AdGuard Home 将阻止 DNS 黑名单里的域名",
"dns_allowlists_desc": "来自 DNS 白名单的域名将被允许,即使它们位于任意黑名单中也是如此。",
"custom_filtering_rules": "自定义过滤规则",
"encryption_settings": "加密设置",
@@ -162,7 +168,7 @@
"upstream_dns": "上游 DNS 服务器",
"upstream_dns_help": "每行输入一个服务器地址。<a>了解更多</a>关于配置上游 DNS 服务器的内容",
"upstream_dns_configured_in_file": "配置路径{{path}}",
"test_upstream_btn": "测试上游 DNS",
"test_upstream_btn": "测试上游",
"upstreams": "上游服务器",
"upstream": "上游服务器",
"apply_btn": "应用",
@@ -207,9 +213,9 @@
"custom_filter_rules": "自定义过滤器规则",
"custom_filter_rules_hint": "请确保每行只输入一条规则。你可以输入符合 adblock 语法或 Hosts 语法的规则。",
"system_host_files": "系统主机文件",
"examples_title": "例",
"examples_title": "例",
"example_meaning_filter_block": "阻止 example.org 域名及其所有子域名;",
"example_meaning_filter_whitelist": "解除 example.org 及其所有子域名的封锁",
"example_meaning_filter_whitelist": "解除 example.org 及其所有子域名的拦截",
"example_meaning_host_block": "对 example.org不包括它的子域名以 127.0.0.1 作为响应;",
"example_comment": "! 这是一行注释。",
"example_comment_meaning": "只是一条注释;",
@@ -220,7 +226,7 @@
"example_upstream_udp": "常规 DNS通过 UDP、主机名",
"example_upstream_dot": "加密 <0>DNS-over-TLS</0>",
"example_upstream_doh": "加密 <0>DNS-over-HTTPS</0>",
"example_upstream_doh3": "带有强制 <0>HTTP/3</0> 的加密 DNS-over-HTTPS并且没有回退到 HTTP/2 或更低版本;",
"example_upstream_doh3": "带有强制 <0>HTTP/3</0> 的加密 DNS-over-HTTPS不会回退到 HTTP/2 或更低版本;",
"example_upstream_doq": "加密 <0>DNS-over-QUIC</0>",
"example_upstream_sdns": "<1>DNSCrypt</1> 的 <0>DNS Stamps</0> 或者 <2>DNS-over-HTTPS</2> 解析器;",
"example_upstream_tcp": "常规 DNS基于 TCP ",
@@ -260,7 +266,7 @@
"rule_added_to_custom_filtering_toast": "规则已添加到自定义过滤规则列表中 {{rule}}",
"query_log_response_status": "状态: {{value}}",
"query_log_filtered": "被 {{filter}} 过滤",
"query_log_confirm_clear": "确定想要清除全部查询日志吗?",
"query_log_confirm_clear": "确定想要清除全部查询日志吗?",
"query_log_cleared": "查询日志已成功清除",
"query_log_updated": "已成功更新查询日志",
"query_log_clear": "清除查询日志",
@@ -268,12 +274,12 @@
"query_log_enable": "启用日志",
"query_log_configuration": "日志配置",
"query_log_disabled": "查询日志已禁用,在<0>这些设置</0>中能配置它们",
"query_log_strict_search": "使用双引号进行严谨搜索",
"query_log_retention_confirm": "确定要更改查询记录保留时间吗?如果减少时间间隔数值,某些数据可能会丢失",
"anonymize_client_ip": "匿名化客户端IP",
"query_log_strict_search": "使用双引号进行精确搜索",
"query_log_retention_confirm": "确定要更改查询记录保留时间吗?如果减少时间间隔数值,可能会丢失某些数据",
"anonymize_client_ip": "匿名化客户端 IP",
"anonymize_client_ip_desc": "不要在日志和统计信息中保存客户端的完整 IP 地址",
"dns_config": "DNS 服务配置",
"dns_cache_config": "DNS缓存配置",
"dns_cache_config": "DNS 缓存配置",
"dns_cache_config_desc": "您可以在此处配置 DNS 缓存",
"blocking_mode": "拦截模式",
"default": "默认",
@@ -283,6 +289,9 @@
"custom_ip": "自定义 IP",
"blocking_ipv4": "拦截 IPv4",
"blocking_ipv6": "拦截 IPv6",
"blocked_response_ttl": "屏蔽的 TTL 应答",
"blocked_response_ttl_desc": "指定客户端应缓存已过滤响应的秒数",
"form_enter_blocked_response_ttl": "输入拦截的 TTL 应答(秒)",
"dnscrypt": "DNSCrypt",
"dns_over_https": "DNS-over-HTTPS",
"dns_over_tls": "DNS-over-TLS",
@@ -293,7 +302,7 @@
"download_mobileconfig_doh": "下载适用于 DNS-over-HTTPS 的 .mobileconfig",
"download_mobileconfig_dot": "下载适用于 DNS-over-TLS 的 .mobileconfig",
"download_mobileconfig": "下载配置文件",
"plain_dns": "无加密DNS",
"plain_dns": "无加密 DNS",
"form_enter_rate_limit": "输入限制速率",
"rate_limit": "速度限制",
"edns_enable": "启用 EDNS 客户端子网",
@@ -303,11 +312,11 @@
"rate_limit_desc": "每个客户端每秒钟查询次数的限制。设置为 0 意味着不限制。",
"blocking_ipv4_desc": "拦截 A 记录请求返回的 IP 地址",
"blocking_ipv6_desc": "拦截 AAAA 记录请求返回的 IP 地址",
"blocking_mode_default": "默认:被 Adblock 规则拦截时反应为零 IP 地址A记录0.0.0.0AAAA记录::);被/etc/hosts 规则拦截时反应为规则中指定 IP 地址",
"blocking_mode_default": "默认:被 Adblock 规则拦截时反应为零 IP 地址A记录0.0.0.0AAAA记录::);被 /etc/hosts 规则拦截时反应为规则中指定 IP 地址",
"blocking_mode_refused": "REFUSED以 REFUSED 码响应请求",
"blocking_mode_nxdomain": "NXDOMAIN以NXDOMAIN码响应",
"blocking_mode_nxdomain": "NXDOMAIN NXDOMAIN 码响应",
"blocking_mode_null_ip": "空 IP以零 IP 地址响应A 记录 0.0.0.0AAAA 记录 ::",
"blocking_mode_custom_ip": "自定IP以手动设置的IP地址响应",
"blocking_mode_custom_ip": "自定IP以手动设置的 IP 地址响应",
"theme_auto": "自动",
"theme_light": "浅色主题",
"theme_dark": "深色主题",
@@ -331,7 +340,7 @@
"install_settings_dns_desc": "您将需要使用以下地址来设置您的设备或路由器的 DNS 服务器:",
"install_settings_all_interfaces": "所有接口",
"install_auth_title": "身份认证",
"install_auth_desc": "需要对 AdGuard Home 的网页管理界面配置密码认证。即使 AdGuard Home 只能通过您的本地网络访问,避免 AdGuard Home 被不受限制地访问依旧十分重要。",
"install_auth_desc": "需要对 AdGuard Home 的网页管理界面配置密码认证。即使 AdGuard Home 只能通过本地网络访问,为它添加访问限制依旧十分重要。",
"install_auth_username": "用户名",
"install_auth_password": "密码",
"install_auth_confirm": "确认密码",
@@ -459,12 +468,12 @@
"access_disallowed_title": "不允许的客户端",
"access_disallowed_desc": "CIDR、IP 地址或<a>客户端 ID</a> 的列表。如果已配置,则 AdGuard Home 将丢弃来自这些客户端的请求。如果允许的客户端已配置,此字段将会被忽略。",
"access_blocked_title": "不允许的域名",
"access_blocked_desc": "不要将此功能与过滤器混淆。AdGuard Home 将排除匹配这些域的 DNS 查询并且这些查询将不会在查询日志中显示。在此可以明确指定域名、通配符wildcard和网址过滤的规则例如 \"example.org\"、\"*.example.org\" 或 \"||example.org^\"。",
"access_blocked_desc": "不要将此功能与过滤器混淆。AdGuard Home 将排除匹配这些域的 DNS 查询并且这些查询将不会在查询日志中显示。在此可以明确指定域名、通配符wildcard和网址过滤的规则例如 \"example.org\"、\"*.example.org\" 或 \"||example.org^\"。",
"access_settings_saved": "访问设置保存成功",
"updates_checked": "AdGuard Home 的新版本现在可用",
"updates_version_equal": "AdGuard Home已经是最新版本",
"check_updates_now": "立即检查更新",
"version_request_error": "检查更新失败。请检查您的因特网连接。",
"version_request_error": "检查更新失败。请检查互联网连接。",
"dns_privacy": "DNS 隐私",
"setup_dns_privacy_1": "<0>DNS-over-TLS:</0> 使用 <1>{{address}}</1> 字符串。",
"setup_dns_privacy_2": "<0>DNS-over-HTTPS:</0> 使用 <1>{{address}}</1> 字符串。",
@@ -492,7 +501,7 @@
"rewrite_confirm_delete": "您确定要删除 \"{{key}}\" 的 DNS 重写?",
"rewrite_desc": "可以轻松地为特定域名配置自定义 DNS 响应。",
"rewrite_applied": " 重定向规则已应用",
"rewrite_hosts_applied": "根据hosts文件规则已被重写",
"rewrite_hosts_applied": "根据 hosts 文件规则已被重写",
"dns_rewrites": "DNS 重写",
"form_domain": "输入域",
"form_answer": "输入 IP 地址或域名",
@@ -531,14 +540,14 @@
"statistics_retention": "统计保留",
"statistics_retention_desc": "如果您减少该间隔的数值, 某些数据可能会丢失",
"statistics_clear": " 清除统计数据",
"statistics_clear_confirm": "确定要清除统计数据?",
"statistics_clear_confirm": "确定要清除统计数据?",
"statistics_retention_confirm": "您确定要更改统计记录保留时间吗? 如果您减少间隔时间的值, 某些数据可能会丢失。",
"statistics_cleared": "统计数据已成功清除",
"statistics_enable": "启用统计数据",
"ignore_domains": "忽略的域(以换行符分隔)",
"ignore_domains_title": "被忽略的域",
"ignore_domains_desc_stats": "这些网域的查询不在统计信息",
"ignore_domains_desc_query": "这些网域的查询不在查询日志记录",
"ignore_domains": "忽略的域(以换行符分隔)",
"ignore_domains_title": "被忽略的域",
"ignore_domains_desc_stats": "匹配这些规则的查询不在统计信息",
"ignore_domains_desc_query": "匹配这些规则的查询不在查询日志",
"interval_hours": "{{count}} 小时",
"interval_hours_plural": "{{count}} 小时",
"filters_configuration": "过滤器配置",
@@ -559,24 +568,24 @@
"network": "网络",
"descr": "描述",
"whois": "WHOIS",
"filtering_rules_learn_more": "<0>了解更多</0>关于创建自己的hosts清单。",
"blocked_by_response": "因响应的CNAMEIP被屏蔽",
"blocked_by_cname_or_ip": "按CNAMEIP拦截",
"filtering_rules_learn_more": "<0>了解更多</0>关于创建自己的 hosts 清单。",
"blocked_by_response": "因响应的 CNAMEIP 被屏蔽",
"blocked_by_cname_or_ip": "按 CNAMEIP 拦截",
"try_again": "重试",
"domain_desc": "输入您要重写的域名或通配符。",
"example_rewrite_domain": "仅重写此域名的响应。",
"example_rewrite_wildcard": "重写所有<0>example.org</0> 子域的响应。",
"rewrite_ip_address": "IP地址在 AAAAA响应中使用这个IP",
"rewrite_domain_name": "域名 添加一个CNAME记录",
"rewrite_ip_address": "IP 地址:在 AAAAA 响应中使用这个 IP",
"rewrite_domain_name": "域名:添加一个 CNAME 记录",
"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 查询,并从 HTTPS 响应中删除 IPv6 提示。",
"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 服务器。",
"fastest_addr_desc": "查询所有 DNS 服务器并返回所有响应中速度最快的 IP 地址。因 AdGuard Home 必须等待全部 DNS 服务器响应,这会降低 DNS 查询的速度,但此举将会在总体上改善连接速度。",
"autofix_warning_text": "若您单击「修复」AdGuard Home 将会配置您的系统以使用 AdGuard Home 的 DNS 服务器。",
"autofix_warning_list": "其将会进行如下工作:<0>停用系统DNSStubListener</0><0>设置DNS服务器地址为127.0.0.1</0><0>将/etc/resolv.conf的符号链接目标替换为/run/systemd/resolv/resolv.conf</0><0>停止DNSStubListener重新加载系统解析服务</0>",
"autofix_warning_result": "因此默认情况下所有来自系统的DNS请求都将由AdGuardHome处理。",
"autofix_warning_result": "因此,默认情况下所有来自系统的 DNS 请求都将由 AdGuard Home 处理。",
"tags_title": "标签",
"tags_desc": "您可以选择与客户端对应的标记。标签可以包含在过滤规则中,并允许您更准确地应用它们。<0>了解更多</0>。",
"form_select_tags": "选择客户端标签",
@@ -594,22 +603,22 @@
"check_service": "服务名称:{{service}}",
"service_name": "服务名称",
"check_not_found": "未在您的筛选列表中找到",
"client_confirm_block": "确定要阻止客户端 \"{{ip}}\"?",
"client_confirm_block": "确定要阻止客户端 \"{{ip}}\"?",
"client_confirm_unblock": "您确定要解除对客户端 \"{{ip}}\" 的封锁吗?",
"client_blocked": "客户端 \"{{ip}}\" 被成功拦截",
"client_unblocked": "成功解锁客户端 \"{{ip}}\"",
"client_unblocked": "成功解除对 \"{{ip}}\" 客户端的封锁",
"static_ip": "静态IP地址",
"static_ip_desc": "AdGuard Home 是一个服务器所以它需要一个静态IP地址才能正常工作。否则在某些情况下你的路由器可能会给这个设备分配一个不同的IP地址。",
"set_static_ip": "设置一个静态IP",
"static_ip_desc": "AdGuard Home 是一个服务器,所以它需要一个静态 IP 地址才能正常工作。否则,在某些情况下,路由器可能会给这个设备分配一个不同的 IP 地址。",
"set_static_ip": "设置一个静态 IP",
"install_static_ok": "好消息!静态 IP 地址已经配置",
"install_static_error": "AdGuard Home 无法为这个网络接口自动配置它。请参阅如何手动完成此操作的说明。",
"install_static_configure": "AdGuard Home 检测到一个动态 IP 地址 <0>{{ip}}</0> 被使用。您想把它作为您的静态地址吗?",
"confirm_static_ip": "AdGuard Home 将把{{ip}} 配置为您的静态IP地址。您想要继续吗",
"confirm_static_ip": "AdGuard Home 将把 {{ip}} 配置为静态 IP 地址。您想要继续吗?",
"list_updated": "{{count}} 列表已更新",
"list_updated_plural": "{{count}} 条列表已更新",
"dnssec_enable": "启用DNSSEC",
"dnssec_enable": "启用 DNSSEC",
"dnssec_enable_desc": "在发出 DNS 查询中设置 DNSSEC 标志并检查结果(需要启用 DNSSEC 的解析器)。",
"validated_with_dnssec": "通过DNSSEC验证",
"validated_with_dnssec": "通过 DNSSEC 验证",
"all_queries": "所有查询记录",
"show_blocked_responses": "已拦截",
"show_whitelisted_responses": "已列入白名单",
@@ -624,9 +633,9 @@
"blocklist": "黑名单",
"milliseconds_abbreviation": "毫秒",
"cache_size": "缓存大小",
"cache_size_desc": "DNS 缓存大小(单位:字节)。要关闭缓存,请留空。",
"cache_ttl_min_override": "覆盖最小TTL值",
"cache_ttl_max_override": "覆盖最大TTL值",
"cache_size_desc": "DNS 缓存大小(单位:字节)。要关闭缓存,请留空。",
"cache_ttl_min_override": "覆盖最小 TTL 值",
"cache_ttl_max_override": "覆盖最大 TTL 值",
"enter_cache_size": "输入缓存大小(字节)",
"enter_cache_ttl_min_override": "输入最小 TTL 值(秒)",
"enter_cache_ttl_max_override": "输入最大 TTL 值(秒)",
@@ -654,7 +663,7 @@
"parental_control": "家长控制",
"safe_browsing": "安全浏览",
"served_from_cache": "{{value}}<i>(由缓存提供)</i>",
"form_error_password_length": "密码必须至少有 {{value}} 个字符",
"form_error_password_length": "密码长度必须为 {{min}} 到 {{max}} 个字符",
"anonymizer_notification": "<0>注意:</0> IP 匿名化已启用。您可以在<1>常规设置</1>中禁用它。",
"confirm_dns_cache_clear": "您确定要清除 DNS 缓存吗?",
"cache_cleared": "已成功清除 DNS 缓存",
@@ -685,9 +694,9 @@
"ignore_query_log": "在查询日志中忽略此客户端",
"ignore_statistics": "在统计数据中忽略此客户端",
"schedule_services": "暂停服务拦截",
"schedule_services_desc": "配置服务拦截过滤器的暂停计划",
"schedule_services_desc_client": "为此客户端配置服务拦截过滤器的暂停计划",
"schedule_desc": "安排拦截服务禁用的时间",
"schedule_services_desc": "配置服务拦截过滤器的暂停计划",
"schedule_services_desc_client": "为此客户端配置服务拦截过滤器的暂停计划",
"schedule_desc": "安排暂停拦截服务的时间",
"schedule_invalid_select": "开始时间必须在结束时间之前",
"schedule_select_days": "选择日",
"schedule_timezone": "选择时区",

View File

@@ -1,6 +1,7 @@
{
"client_settings": "用戶端設定",
"example_upstream_reserved": "<0>供特定的網域</0>之上游;",
"example_multiple_upstreams_reserved": "<0>特定網域</0>的多個上游伺服器;",
"example_upstream_comment": "註解。",
"upstream_parallel": "透過同時地查詢所有上游的伺服器,使用並行的查詢以加速解析。",
"parallel_requests": "並行的請求",
@@ -8,9 +9,9 @@
"load_balancing_desc": "每次查詢一個上游伺服器。AdGuard Home 使用它的加權隨機的演算法來選擇伺服器,以便最快的伺服器被更常使用。",
"bootstrap_dns": "自我啟動BootstrapDNS 伺服器",
"bootstrap_dns_desc": "DNS 伺服器的 IP 位址,用於解析您指定為上游伺服器的 DoH/DoT 解析器的 IP 位址。不允許註釋。",
"fallback_dns_title": "備援 DNS 伺服器",
"fallback_dns_desc": "當上游 DNS 伺服器未回應時使用的備援 DNS 伺服器清單。語法與上面主要上游欄位相同。",
"fallback_dns_placeholder": "每行輸入一個備援 DNS 伺服器",
"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}}。",
@@ -73,7 +74,9 @@
"dhcp_dynamic_ip_found": "您的系統使用動態 IP 位址配置供介面 <0>{{interfaceName}}</0>。為了使用動態主機設定協定DHCP伺服器靜態 IP 位址必須被設定。您現行的 IP 位址為 <0>{{ipAddress}}</0>。如果您按\"啟用 DHCP 伺服器\" 按鈕AdGuard Home 將自動地設定此 IP 位址作為靜態。",
"dhcp_lease_added": "靜態租約 \"{{key}}\" 被成功地加入",
"dhcp_lease_deleted": "靜態租約 \"{{key}}\" 被成功地刪除",
"dhcp_lease_updated": "「{{key}}」的靜態租約已成功更新",
"dhcp_new_static_lease": "新的靜態租約",
"dhcp_edit_static_lease": "編輯靜態租約",
"dhcp_static_leases_not_found": "無已發現之動態主機設定協定DHCP靜態租約",
"dhcp_add_static_lease": "新增靜態租約",
"dhcp_reset_leases": "重置所有的租約",
@@ -117,7 +120,8 @@
"stats_malware_phishing": "已封鎖的惡意軟體/網路釣魚",
"stats_adult": "已封鎖的成人網站",
"stats_query_domain": "熱門已查詢的網域",
"for_last_24_hours": "在最近的 24 小時內",
"for_last_hours": "在過去的 {{count}} 小時內",
"for_last_hours_plural": "在過去的 {{count}} 小時內",
"for_last_days": "在最近的 {{count}} 日內",
"for_last_days_plural": "在最近的 {{count}} 日內",
"stats_disabled": "該統計資料已被禁用。您可從<0>設定頁面</0>中打開它。",
@@ -128,18 +132,20 @@
"top_clients": "熱門用戶端",
"no_clients_found": "無已發現之用戶端",
"general_statistics": "一般的統計資料",
"top_upstreams": "經常請求的上游伺服器",
"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 查詢之數量",
"number_of_dns_query_hours": "過去 {{count}} 小時內處理的 DNS 查詢次數",
"number_of_dns_query_hours_plural": "過去 {{count}} 小時內處理的 DNS 查詢次數",
"number_of_dns_query_blocked_24_hours": "被廣告封鎖過濾器和主機封鎖清單阻擋的 DNS 請求之數量",
"number_of_dns_query_blocked_24_hours_by_sec": "被 AdGuard 瀏覽安全模組封鎖的 DNS 請求之數量",
"number_of_dns_query_blocked_24_hours_adult": "已封鎖的成人網站之數量",
"enforced_save_search": "已強制執行的安全搜尋",
"number_of_dns_query_to_safe_search": "安全搜尋已被強制執行之屬於搜尋引擎的 DNS 請求之數量",
"average_processing_time": "平均的處理時間",
"processing_time": "處理時間",
"average_upstream_response_time": "平均的上游回應時間",
"response_time": "回應時間",
"average_processing_time_hint": "在處理一項 DNS 請求時以毫秒ms計的平均時間",
"block_domain_use_filters_and_hosts": "透過過濾器和主機檔案封鎖網域",
"filters_block_toggle_hint": "您可在<a>過濾器</a>設定中設置封鎖規則。",
@@ -283,6 +289,9 @@
"custom_ip": "自訂的 IP",
"blocking_ipv4": "封鎖 IPv4",
"blocking_ipv6": "封鎖 IPv6",
"blocked_response_ttl": "已封鎖的回應之存活時間TTL",
"blocked_response_ttl_desc": "對用戶端應快取受過濾的回應,指定多少秒數",
"form_enter_blocked_response_ttl": "請輸入已封鎖回應的存活時間(秒)",
"dnscrypt": "DNSCrypt",
"dns_over_https": "DNS-over-HTTPS",
"dns_over_tls": "DNS-over-TLS",
@@ -537,8 +546,8 @@
"statistics_enable": "啟用統計資料",
"ignore_domains": "忽略的網域(以換行符分隔)",
"ignore_domains_title": "被忽略的網域",
"ignore_domains_desc_stats": "這些網域的查詢不在統計資料",
"ignore_domains_desc_query": "這些網域的查詢不在查詢記錄",
"ignore_domains_desc_stats": "符合這些規則的查詢不會被記錄在統計資料",
"ignore_domains_desc_query": "符合這些規則的查詢不會被寫入查詢記錄",
"interval_hours": "{{count}} 小時",
"interval_hours_plural": "{{count}} 小時",
"filters_configuration": "過濾器配置",
@@ -654,7 +663,7 @@
"parental_control": "家長控制",
"safe_browsing": "安全瀏覽",
"served_from_cache": "{{value}} <i>(由快取提供)</i>",
"form_error_password_length": "密碼必須為至少長 {{value}} 個字",
"form_error_password_length": "密碼長度必須為 {{min}} 到 {{max}} 個字",
"anonymizer_notification": "<0>注意:</0>IP 匿名化被啟用。您可在<1>一般設定</1>中禁用它。",
"confirm_dns_cache_clear": "您確定您想要清除 DNS 快取嗎?",
"cache_cleared": "DNS 快取被成功地清除",

View File

@@ -660,6 +660,24 @@ export const removeStaticLease = (config) => async (dispatch) => {
}
};
export const updateStaticLeaseRequest = createAction('UPDATE_STATIC_LEASE_REQUEST');
export const updateStaticLeaseFailure = createAction('UPDATE_STATIC_LEASE_FAILURE');
export const updateStaticLeaseSuccess = createAction('UPDATE_STATIC_LEASE_SUCCESS');
export const updateStaticLease = (config) => async (dispatch) => {
dispatch(updateStaticLeaseRequest());
try {
await apiClient.updateStaticLease(config);
dispatch(updateStaticLeaseSuccess(config));
dispatch(addSuccessToast(i18next.t('dhcp_lease_updated', { key: config.hostname || config.ip })));
dispatch(toggleLeaseModal());
dispatch(getDhcpStatus());
} catch (error) {
dispatch(addErrorToast({ error }));
dispatch(updateStaticLeaseFailure());
}
};
export const removeToast = createAction('REMOVE_TOAST');
export const toggleBlocking = (

View File

@@ -274,6 +274,8 @@ class Api {
DHCP_REMOVE_STATIC_LEASE = { path: 'dhcp/remove_static_lease', method: 'POST' };
DHCP_UPDATE_STATIC_LEASE = { path: 'dhcp/update_static_lease', method: 'POST' };
DHCP_RESET = { path: 'dhcp/reset', method: 'POST' };
DHCP_LEASES_RESET = { path: 'dhcp/reset_leases', method: 'POST' };
@@ -320,6 +322,14 @@ class Api {
return this.makeRequest(path, method, parameters);
}
updateStaticLease(config) {
const { path, method } = this.DHCP_UPDATE_STATIC_LEASE;
const parameters = {
data: config,
};
return this.makeRequest(path, method, parameters);
}
resetDhcp() {
const { path, method } = this.DHCP_RESET;
return this.makeRequest(path, method);

View File

@@ -118,6 +118,11 @@ body {
overflow-y: auto;
}
.modal-body--filters {
max-height: 600px;
overflow-y: auto;
}
.modal-body__item:not(:first-child) {
padding-top: 1.5rem;
}
@@ -134,15 +139,6 @@ body {
cursor: not-allowed;
}
.button-action {
visibility: hidden;
}
.logs__row:hover .button-action,
.button-action--active {
visibility: visible;
}
.ReactModal__Body--open {
overflow: hidden;
}

View File

@@ -8,7 +8,7 @@ import Cell from '../ui/Cell';
import DomainCell from './DomainCell';
import { getPercent } from '../../helpers/helpers';
import { STATUS_COLORS } from '../../helpers/constants';
import { DASHBOARD_TABLES_DEFAULT_PAGE_SIZE, STATUS_COLORS, TABLES_MIN_ROWS } from '../../helpers/constants';
const CountCell = (totalBlocked) => function cell(row) {
const { value } = row;
@@ -62,8 +62,8 @@ const BlockedDomains = ({
]}
showPagination={false}
noDataText={t('no_domains_found')}
minRows={6}
defaultPageSize={100}
minRows={TABLES_MIN_ROWS}
defaultPageSize={DASHBOARD_TABLES_DEFAULT_PAGE_SIZE}
className="-highlight card-table-overflow--limited stats__table"
/>
</Card>

View File

@@ -1,4 +1,4 @@
import React from 'react';
import React, { useState } from 'react';
import ReactTable from 'react-table';
import PropTypes from 'prop-types';
import { Trans, useTranslation } from 'react-i18next';
@@ -9,10 +9,16 @@ import Card from '../ui/Card';
import Cell from '../ui/Cell';
import { getPercent, sortIp } from '../../helpers/helpers';
import { BLOCK_ACTIONS, STATUS_COLORS } from '../../helpers/constants';
import {
BLOCK_ACTIONS,
DASHBOARD_TABLES_DEFAULT_PAGE_SIZE,
STATUS_COLORS,
TABLES_MIN_ROWS,
} from '../../helpers/constants';
import { toggleClientBlock } from '../../actions/access';
import { renderFormattedClientCell } from '../../helpers/renderFormattedClientCell';
import { getStats } from '../../actions/stats';
import IconTooltip from '../Logs/Cells/IconTooltip';
const getClientsPercentColor = (percent) => {
if (percent > 50) {
@@ -40,9 +46,7 @@ const renderBlockingButton = (ip, disallowed, disallowed_rule) => {
const processingSet = useSelector((state) => state.access.processingSet);
const allowedСlients = useSelector((state) => state.access.allowed_clients, shallowEqual);
const buttonClass = classNames('button-action button-action--main', {
'button-action--unblock': disallowed,
});
const [isOptionsOpened, setOptionsOpened] = useState(false);
const toggleClientStatus = async (ip, disallowed, disallowed_rule) => {
let confirmMessage;
@@ -62,23 +66,49 @@ const renderBlockingButton = (ip, disallowed, disallowed_rule) => {
}
};
const onClick = () => toggleClientStatus(ip, disallowed, disallowed_rule);
const onClick = () => {
toggleClientStatus(ip, disallowed, disallowed_rule);
setOptionsOpened(false);
};
const text = disallowed ? BLOCK_ACTIONS.UNBLOCK : BLOCK_ACTIONS.BLOCK;
const lastRuleInAllowlist = !disallowed && allowedСlients === disallowed_rule;
const disabled = processingSet || lastRuleInAllowlist;
return (
<div className="table__action pl-4">
<div className="table__action">
<button
type="button"
className={buttonClass}
onClick={onClick}
disabled={disabled}
title={lastRuleInAllowlist ? t('last_rule_in_allowlist', { disallowed_rule }) : ''}
className="btn btn-icon btn-sm px-0"
onClick={() => setOptionsOpened(true)}
>
<Trans>{text}</Trans>
<svg className="icon24 icon--lightgray button-action__icon">
<use xlinkHref="#bullets" />
</svg>
</button>
{isOptionsOpened && (
<IconTooltip
className="icon24"
tooltipClass="button-action--arrow-option-container"
xlinkHref="bullets"
triggerClass="btn btn-icon btn-sm px-0 button-action__hidden-trigger"
content={(
<button
className={classNames('button-action--arrow-option px-4 py-1', disallowed ? 'bg--green' : 'bg--danger')}
onClick={onClick}
disabled={disabled}
title={lastRuleInAllowlist ? t('last_rule_in_allowlist', { disallowed_rule }) : ''}
>
<Trans>{text}</Trans>
</button>
)}
placement="bottom-end"
trigger="click"
onVisibilityChange={setOptionsOpened}
defaultTooltipShown={true}
delayHide={0}
/>
)}
</div>
);
};
@@ -134,8 +164,8 @@ const Clients = ({
]}
showPagination={false}
noDataText={t('no_clients_found')}
minRows={6}
defaultPageSize={100}
minRows={TABLES_MIN_ROWS}
defaultPageSize={DASHBOARD_TABLES_DEFAULT_PAGE_SIZE}
className="-highlight card-table-overflow--limited clients__table"
getTrProps={(_state, rowInfo) => {
if (!rowInfo) {

View File

@@ -4,9 +4,9 @@ import { Trans, useTranslation } from 'react-i18next';
import round from 'lodash/round';
import { shallowEqual, useSelector } from 'react-redux';
import Card from '../ui/Card';
import { formatNumber } from '../../helpers/helpers';
import { formatNumber, msToDays, msToHours } from '../../helpers/helpers';
import LogsSearchLink from '../ui/LogsSearchLink';
import { RESPONSE_FILTER, DAY } from '../../helpers/constants';
import { RESPONSE_FILTER, TIME_UNITS } from '../../helpers/constants';
import Tooltip from '../ui/Tooltip';
const Row = ({
@@ -52,14 +52,19 @@ const Counters = ({ refreshButton, subtitle }) => {
numReplacedParental,
numReplacedSafesearch,
avgProcessingTime,
timeUnits,
} = useSelector((state) => state.stats, shallowEqual);
const { t } = useTranslation();
const days = interval / DAY;
const dnsQueryTooltip = timeUnits === TIME_UNITS.HOURS
? t('number_of_dns_query_hours', { count: msToHours(interval) })
: t('number_of_dns_query_days', { count: msToDays(interval) });
const rows = [
{
label: 'dns_query',
count: numDnsQueries,
tooltipTitle: days === 1 ? 'number_of_dns_query_24_hours' : t('number_of_dns_query_days', { count: days }),
tooltipTitle: dnsQueryTooltip,
response_status: RESPONSE_FILTER.ALL.QUERY,
},
{

View File

@@ -28,11 +28,14 @@
border-bottom: 6px solid #585965;
}
@media (max-width: 1279.98px) {
.table__action {
position: absolute;
right: 0;
}
.table__action {
position: relative;
margin-left: auto;
}
.table__action .btn-icon {
outline: 0;
box-shadow: none;
}
.page-title--dashboard {

View File

@@ -7,7 +7,7 @@ import Card from '../ui/Card';
import Cell from '../ui/Cell';
import DomainCell from './DomainCell';
import { STATUS_COLORS } from '../../helpers/constants';
import { DASHBOARD_TABLES_DEFAULT_PAGE_SIZE, STATUS_COLORS, TABLES_MIN_ROWS } from '../../helpers/constants';
import { getPercent } from '../../helpers/helpers';
const getQueriedPercentColor = (percent) => {
@@ -58,8 +58,8 @@ const QueriedDomains = ({
]}
showPagination={false}
noDataText={t('no_domains_found')}
minRows={6}
defaultPageSize={100}
minRows={TABLES_MIN_ROWS}
defaultPageSize={DASHBOARD_TABLES_DEFAULT_PAGE_SIZE}
className="-highlight card-table-overflow--limited stats__table"
/>
</Card>

View File

@@ -6,6 +6,7 @@ import { withTranslation, Trans } from 'react-i18next';
import Card from '../ui/Card';
import DomainCell from './DomainCell';
import { DASHBOARD_TABLES_DEFAULT_PAGE_SIZE, TABLES_MIN_ROWS } from '../../helpers/constants';
const TimeCell = ({ value }) => {
if (!value) {
@@ -37,7 +38,7 @@ const UpstreamAvgTime = ({
subtitle,
}) => (
<Card
title={t('average_processing_time')}
title={t('average_upstream_response_time')}
subtitle={subtitle}
bodyType="card-table"
refresh={refreshButton}
@@ -54,7 +55,7 @@ const UpstreamAvgTime = ({
Cell: DomainCell,
},
{
Header: <Trans>processing_time</Trans>,
Header: <Trans>response_time</Trans>,
accessor: 'count',
maxWidth: 190,
Cell: TimeCell,
@@ -62,8 +63,8 @@ const UpstreamAvgTime = ({
]}
showPagination={false}
noDataText={t('no_upstreams_data_found')}
minRows={6}
defaultPageSize={100}
minRows={TABLES_MIN_ROWS}
defaultPageSize={DASHBOARD_TABLES_DEFAULT_PAGE_SIZE}
className="-highlight card-table-overflow--limited stats__table"
/>
</Card>

View File

@@ -8,7 +8,7 @@ import Cell from '../ui/Cell';
import DomainCell from './DomainCell';
import { getPercent } from '../../helpers/helpers';
import { STATUS_COLORS } from '../../helpers/constants';
import { DASHBOARD_TABLES_DEFAULT_PAGE_SIZE, STATUS_COLORS, TABLES_MIN_ROWS } from '../../helpers/constants';
const CountCell = (totalBlocked) => (
function cell(row) {
@@ -64,8 +64,8 @@ const UpstreamResponses = ({
]}
showPagination={false}
noDataText={t('no_upstreams_data_found')}
minRows={6}
defaultPageSize={100}
minRows={TABLES_MIN_ROWS}
defaultPageSize={DASHBOARD_TABLES_DEFAULT_PAGE_SIZE}
className="-highlight card-table-overflow--limited stats__table"
/>
</Card>

View File

@@ -9,7 +9,12 @@ import Counters from './Counters';
import Clients from './Clients';
import QueriedDomains from './QueriedDomains';
import BlockedDomains from './BlockedDomains';
import { DISABLE_PROTECTION_TIMINGS, ONE_SECOND_IN_MS, SETTINGS_URLS } from '../../helpers/constants';
import {
DISABLE_PROTECTION_TIMINGS,
ONE_SECOND_IN_MS,
SETTINGS_URLS,
TIME_UNITS,
} from '../../helpers/constants';
import {
msToSeconds,
msToMinutes,
@@ -46,15 +51,12 @@ const Dashboard = ({
getAllStats();
}, []);
const getSubtitle = () => {
const ONE_DAY = 1;
const intervalInDays = msToDays(stats.interval);
if (intervalInDays < ONE_DAY) {
if (!stats.enabled) {
return t('stats_disabled_short');
}
return intervalInDays === ONE_DAY
? t('for_last_24_hours')
return stats.timeUnits === TIME_UNITS.HOURS
? t('for_last_hours', { count: msToHours(stats.interval) })
: t('for_last_days', { count: msToDays(stats.interval) });
};

View File

@@ -28,7 +28,7 @@ const renderIcons = (iconsData) => iconsData.map(({
}) => <a key={iconName} href={href} target="_blank" rel="noopener noreferrer"
className={classNames('d-flex align-items-center', className)}
>
<svg className="nav-icon nav-icon--gray">
<svg className="icon icon--15 mr-1 icon--gray">
<use xlinkHref={`#${iconName}`} />
</svg>
</a>);
@@ -110,7 +110,7 @@ const Form = (props) => {
const openAddFiltersModal = () => openModal(MODAL_TYPE.ADD_FILTERS);
return <form onSubmit={handleSubmit}>
<div className="modal-body modal-body--medium">
<div className="modal-body modal-body--filters">
{modalType === MODAL_TYPE.SELECT_MODAL_TYPE
&& <div className="d-flex justify-content-around">
<button onClick={openFilteringListModal}

View File

@@ -3,7 +3,8 @@ import PropTypes from 'prop-types';
import ReactTable from 'react-table';
import { withTranslation } from 'react-i18next';
import { sortIp } from '../../../helpers/helpers';
import { MODAL_TYPE } from '../../../helpers/constants';
import { MODAL_TYPE, TABLES_MIN_ROWS } from '../../../helpers/constants';
import { LocalStorageHelper, LOCAL_STORAGE_KEYS } from '../../../helpers/localStorageHelper';
class Table extends Component {
cellWrap = ({ value }) => (
@@ -85,8 +86,9 @@ class Table extends Component {
loading={processing || processingAdd || processingDelete}
className="-striped -highlight card-table-overflow"
showPagination
defaultPageSize={10}
minRows={5}
defaultPageSize={LocalStorageHelper.getItem(LOCAL_STORAGE_KEYS.REWRITES_PAGE_SIZE) || 10}
onPageSizeChange={(size) => LocalStorageHelper.setItem(LOCAL_STORAGE_KEYS.REWRITES_PAGE_SIZE, size)}
minRows={TABLES_MIN_ROWS}
ofText="/"
previousText={t('previous_btn')}
nextText={t('next_btn')}

View File

@@ -72,31 +72,20 @@ export const Modal = ({
const onFormSubmit = (e) => {
e.preventDefault();
if (currentDay) {
const newSchedule = schedule;
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,
};
});
Array.from(days).forEach((day) => {
newSchedule[day] = {
start: startTime,
end: endTime,
};
});
onSubmit(newSchedule);
if (timezone !== intialTimezone) {
newSchedule.time_zone = timezone;
}
onSubmit(newSchedule);
};
return (
@@ -133,7 +122,7 @@ export const Modal = ({
>
{getShortDayName(t, day)}
</button>
)) }
))}
</div>
<div className="schedule__time-wrap">

View File

@@ -6,6 +6,7 @@ import CellWrap from '../ui/CellWrap';
import { MODAL_TYPE } from '../../helpers/constants';
import { formatDetailedDateTime } from '../../helpers/helpers';
import { isValidAbsolutePath } from '../../helpers/form';
import { LOCAL_STORAGE_KEYS, LocalStorageHelper } from '../../helpers/localStorageHelper';
class Table extends Component {
getDateCell = (row) => CellWrap(row, formatDetailedDateTime);
@@ -126,12 +127,17 @@ class Table extends Component {
loading, filters, t, whitelist,
} = this.props;
const localStorageKey = whitelist
? LOCAL_STORAGE_KEYS.ALLOWLIST_PAGE_SIZE
: LOCAL_STORAGE_KEYS.BLOCKLIST_PAGE_SIZE;
return (
<ReactTable
data={filters}
columns={this.columns}
showPagination
defaultPageSize={10}
defaultPageSize={LocalStorageHelper.getItem(localStorageKey) || 10}
onPageSizeChange={(size) => LocalStorageHelper.setItem(localStorageKey, size)}
loading={loading}
minRows={6}
ofText="/"

View File

@@ -26,9 +26,7 @@ const ClientCell = ({
const { t } = useTranslation();
const dispatch = useDispatch();
const autoClients = useSelector((state) => state.dashboard.autoClients, shallowEqual);
const processingRules = useSelector((state) => state.filtering.processingRules);
const isDetailed = useSelector((state) => state.queryLogs.isDetailed);
const processingSet = useSelector((state) => state.access.processingSet);
const allowedСlients = useSelector((state) => state.access.allowed_clients, shallowEqual);
const [isOptionsOpened, setOptionsOpened] = useState(false);
@@ -84,11 +82,23 @@ const ClientCell = ({
const blockingForClientKey = isFiltered ? 'unblock_for_this_client_only' : 'block_for_this_client_only';
const clientNameBlockingFor = getBlockingClientName(clients, client);
const onClick = async () => {
await dispatch(toggleBlocking(buttonType, domain));
await dispatch(getStats());
setOptionsOpened(false);
};
const BUTTON_OPTIONS = [
{
name: buttonType,
onClick,
className: isFiltered ? 'bg--green' : 'bg--danger',
},
{
name: blockingForClientKey,
onClick: () => {
dispatch(toggleBlockingForClient(buttonType, domain, clientNameBlockingFor));
setOptionsOpened(false);
},
},
{
@@ -101,27 +111,25 @@ const ClientCell = ({
client_info?.disallowed_rule || '',
));
await dispatch(updateLogs());
setOptionsOpened(false);
}
},
disabled: processingSet || lastRuleInAllowlist,
disabled: lastRuleInAllowlist,
},
];
const onClick = async () => {
await dispatch(toggleBlocking(buttonType, domain));
await dispatch(getStats());
};
const getOptions = (options) => {
if (options.length === 0) {
return null;
}
return (
<>
{options.map(({ name, onClick, disabled }) => (
{options.map(({
name, onClick, disabled, className,
}) => (
<button
key={name}
className="button-action--arrow-option px-4 py-1"
className={classNames('button-action--arrow-option px-4 py-1', className)}
onClick={onClick}
disabled={disabled}
>
@@ -134,17 +142,6 @@ const ClientCell = ({
const content = getOptions(BUTTON_OPTIONS);
const buttonClass = classNames('button-action button-action--main', {
'button-action--unblock': isFiltered,
'button-action--with-options': content,
'button-action--active': isOptionsOpened,
});
const buttonArrowClass = classNames('button-action button-action--arrow', {
'button-action--unblock': isFiltered,
'button-action--active': isOptionsOpened,
});
const containerClass = classNames('button-action__container', {
'button-action__container--detailed': isDetailed,
});
@@ -153,25 +150,26 @@ const ClientCell = ({
<div className={containerClass}>
<button
type="button"
className={buttonClass}
onClick={onClick}
disabled={processingRules}
className="btn btn-icon btn-sm px-0"
onClick={() => setOptionsOpened(true)}
>
{t(buttonType)}
<svg className="icon24 icon--lightgray button-action__icon">
<use xlinkHref="#bullets" />
</svg>
</button>
{content && (
<button className={buttonArrowClass} disabled={processingRules}>
<IconTooltip
className="icon24"
tooltipClass="button-action--arrow-option-container"
xlinkHref="chevron-down"
triggerClass="button-action--icon"
content={content}
placement="bottom-end"
trigger="click"
onVisibilityChange={setOptionsOpened}
/>
</button>
{isOptionsOpened && (
<IconTooltip
className="icon24"
tooltipClass="button-action--arrow-option-container"
xlinkHref="bullets"
triggerClass="btn btn-icon btn-sm px-0 button-action__hidden-trigger"
content={content}
placement="bottom-end"
trigger="click"
onVisibilityChange={setOptionsOpened}
defaultTooltipShown={true}
delayHide={0}
/>
)}
</div>
);
@@ -198,7 +196,7 @@ const ClientCell = ({
</div>
{isDetailed && clientName && !whoisAvailable && (
<Link
className="detailed-info d-none d-sm-block logs__text logs__text--link"
className="detailed-info d-none d-sm-block logs__text logs__text--link logs__text--client"
to={`logs?search="${encodeURIComponent(clientName)}"`}
title={clientName}
>

View File

@@ -1,4 +1,5 @@
.tooltip-custom__container {
min-width: 150px;
padding: 1rem 1.5rem 1.25rem 1.5rem;
font-size: 16px !important;
box-shadow: 2px 4px 8px rgba(0, 0, 0, 0.2);

View File

@@ -21,6 +21,8 @@ const IconTooltip = ({
content,
trigger,
onVisibilityChange,
defaultTooltipShown,
delayHide,
renderContent = content ? React.Children.map(
processContent(content),
(item, idx) => <div key={idx} className={contentItemClass}>
@@ -44,6 +46,8 @@ const IconTooltip = ({
trigger={trigger}
onVisibilityChange={onVisibilityChange}
delayShow={trigger === 'click' ? 0 : SHOW_TOOLTIP_DELAY}
delayHide={delayHide}
defaultTooltipShown={defaultTooltipShown}
>
{xlinkHref && <svg className={className}>
<use xlinkHref={`#${xlinkHref}`} />
@@ -65,6 +69,8 @@ IconTooltip.propTypes = {
content: PropTypes.node,
renderContent: PropTypes.arrayOf(PropTypes.element),
onVisibilityChange: PropTypes.func,
defaultTooltipShown: PropTypes.bool,
delayHide: PropTypes.number,
};
export default IconTooltip;

View File

@@ -80,6 +80,10 @@
color: var(--gray-f3);
}
.logs__table .logs__text--client {
padding-right: 32px;
}
.icon--selected {
background-color: var(--gray-f3);
border: solid 1px var(--gray-d8);
@@ -261,9 +265,8 @@
.button-action__container {
display: flex;
position: absolute;
right: 0;
right: 2px;
bottom: 0.5rem;
height: 1.6rem;
}
@media screen and (max-width: 1024px) {
@@ -307,45 +310,10 @@
border-bottom-right-radius: 0;
}
.button-action--arrow {
border-top-left-radius: 0;
border-bottom-left-radius: 0;
border-left: 1px solid var(--white);
width: 1.5625rem;
padding: 0;
display: flex;
align-items: center;
justify-content: center;
}
.button-action:hover {
cursor: pointer;
}
.button-action--arrow .button-action--icon {
width: 100%;
height: 100%;
display: flex;
justify-content: center;
}
.button-action:active {
background: var(--btn-block-active);
}
.button-action--unblock:active {
background: var(--btn-unblock-active);
}
.button-action:disabled {
background: var(--btn-block-disabled);
cursor: default;
}
.button-action--unblock:disabled {
background: var(--btn-unblock-disabled);
}
.button-action--arrow-option {
background: transparent;
border: 0;
@@ -551,3 +519,20 @@
padding: 1rem 1.5rem;
background-color: var(--card-bgcolor);
}
.button-action__hidden-trigger {
position: absolute;
top: 0;
right: 0;
width: 1px;
height: 33px;
margin: -1px;
padding: 0;
overflow: hidden;
border: 0;
clip: rect(0 0 0 0);
}
[data-theme="dark"] .button-action__icon {
color: var(--gray-f3);
}

View File

@@ -9,6 +9,8 @@ import CellWrap from '../../ui/CellWrap';
import whoisCell from './whoisCell';
import LogsSearchLink from '../../ui/LogsSearchLink';
import { sortIp } from '../../../helpers/helpers';
import { LocalStorageHelper, LOCAL_STORAGE_KEYS } from '../../../helpers/localStorageHelper';
import { TABLES_MIN_ROWS } from '../../../helpers/constants';
const COLUMN_MIN_WIDTH = 200;
@@ -85,8 +87,11 @@ class AutoClients extends Component {
]}
className="-striped -highlight card-table-overflow"
showPagination
defaultPageSize={10}
minRows={5}
defaultPageSize={LocalStorageHelper.getItem(LOCAL_STORAGE_KEYS.AUTO_CLIENTS_PAGE_SIZE) || 10}
onPageSizeChange={(size) => (
LocalStorageHelper.setItem(LOCAL_STORAGE_KEYS.AUTO_CLIENTS_PAGE_SIZE, size)
)}
minRows={TABLES_MIN_ROWS}
ofText="/"
previousText={t('previous_btn')}
nextText={t('next_btn')}

View File

@@ -14,11 +14,12 @@ import {
sortIp,
getService,
} from '../../../../helpers/helpers';
import { MODAL_TYPE, LOCAL_TIMEZONE_VALUE } from '../../../../helpers/constants';
import { MODAL_TYPE, LOCAL_TIMEZONE_VALUE, TABLES_MIN_ROWS } from '../../../../helpers/constants';
import Card from '../../../ui/Card';
import CellWrap from '../../../ui/CellWrap';
import LogsSearchLink from '../../../ui/LogsSearchLink';
import Modal from '../Modal';
import { LocalStorageHelper, LOCAL_STORAGE_KEYS } from '../../../../helpers/localStorageHelper';
const ClientsTable = ({
clients,
@@ -342,8 +343,11 @@ const ClientsTable = ({
]}
className="-striped -highlight card-table-overflow"
showPagination
defaultPageSize={10}
minRows={5}
defaultPageSize={LocalStorageHelper.getItem(LOCAL_STORAGE_KEYS.CLIENTS_PAGE_SIZE) || 10}
onPageSizeChange={(size) => (
LocalStorageHelper.setItem(LOCAL_STORAGE_KEYS.CLIENTS_PAGE_SIZE, size)
)}
minRows={TABLES_MIN_ROWS}
ofText="/"
previousText={t('previous_btn')}
nextText={t('next_btn')}

View File

@@ -22,6 +22,7 @@ const Form = ({
submitting,
processingAdding,
cidr,
isEdit,
}) => {
const { t } = useTranslation();
const dispatch = useDispatch();
@@ -45,6 +46,7 @@ const Form = ({
placeholder={t('form_enter_mac')}
normalize={normalizeMac}
validate={[validateRequiredValue, validateMac]}
disabled={isEdit}
/>
</div>
<div className="form__group">
@@ -112,6 +114,7 @@ Form.propTypes = {
submitting: PropTypes.bool.isRequired,
processingAdding: PropTypes.bool.isRequired,
cidr: PropTypes.string.isRequired,
isEdit: PropTypes.bool,
};
export default reduxForm({ form: FORM_NAME.LEASE })(Form);

View File

@@ -5,9 +5,11 @@ import ReactModal from 'react-modal';
import { shallowEqual, useDispatch, useSelector } from 'react-redux';
import Form from './Form';
import { toggleLeaseModal } from '../../../../actions';
import { MODAL_TYPE } from '../../../../helpers/constants';
const Modal = ({
isModalOpen,
modalType,
handleSubmit,
processingAdding,
cidr,
@@ -32,7 +34,11 @@ const Modal = ({
<div className="modal-content">
<div className="modal-header">
<h4 className="modal-title">
<Trans>dhcp_new_static_lease</Trans>
{modalType === MODAL_TYPE.EDIT_LEASE ? (
<Trans>dhcp_edit_static_lease</Trans>
) : (
<Trans>dhcp_new_static_lease</Trans>
)}
</h4>
<button type="button" className="close" onClick={toggleModal}>
<span className="sr-only">Close</span>
@@ -53,6 +59,7 @@ const Modal = ({
cidr={cidr}
rangeStart={rangeStart}
rangeEnd={rangeEnd}
isEdit={modalType === MODAL_TYPE.EDIT_LEASE}
/>
</div>
</ReactModal>
@@ -61,6 +68,7 @@ const Modal = ({
Modal.propTypes = {
isModalOpen: PropTypes.bool.isRequired,
modalType: PropTypes.string.isRequired,
handleSubmit: PropTypes.func.isRequired,
processingAdding: PropTypes.bool.isRequired,
cidr: PropTypes.string.isRequired,

View File

@@ -3,10 +3,15 @@ import PropTypes from 'prop-types';
import ReactTable from 'react-table';
import { Trans, useTranslation } from 'react-i18next';
import { useDispatch } from 'react-redux';
import { LEASES_TABLE_DEFAULT_PAGE_SIZE } from '../../../../helpers/constants';
import { LEASES_TABLE_DEFAULT_PAGE_SIZE, MODAL_TYPE } from '../../../../helpers/constants';
import { sortIp } from '../../../../helpers/helpers';
import Modal from './Modal';
import { addStaticLease, removeStaticLease } from '../../../../actions';
import {
addStaticLease,
removeStaticLease,
toggleLeaseModal,
updateStaticLease,
} from '../../../../actions';
const cellWrap = ({ value }) => (
<div className="logs__row o-hidden">
@@ -18,8 +23,10 @@ const cellWrap = ({ value }) => (
const StaticLeases = ({
isModalOpen,
modalType,
processingAdding,
processingDeleting,
processingUpdating,
staticLeases,
cidr,
rangeStart,
@@ -31,7 +38,12 @@ const StaticLeases = ({
const handleSubmit = (data) => {
const { mac, ip, hostname } = data;
dispatch(addStaticLease({ mac, ip, hostname }));
if (modalType === MODAL_TYPE.EDIT_LEASE) {
dispatch(updateStaticLease({ mac, ip, hostname }));
} else {
dispatch(addStaticLease({ mac, ip, hostname }));
}
};
const handleDelete = (ip, mac, hostname = '') => {
@@ -80,19 +92,35 @@ const StaticLeases = ({
Cell: (row) => {
const { ip, mac, hostname } = row.original;
return <div className="logs__row logs__row--center">
<button
return (
<div className="logs__row logs__row--center">
<button
type="button"
className="btn btn-icon btn-icon--green btn-outline-secondary btn-sm"
title={t('delete_table_action')}
disabled={processingDeleting}
className="btn btn-icon btn-outline-primary btn-sm mr-2"
onClick={() => dispatch(toggleLeaseModal({
type: MODAL_TYPE.EDIT_LEASE,
config: { ip, mac, hostname },
}))}
disabled={processingUpdating}
title={t('edit_table_action')}
>
<svg className="icons icon12">
<use xlinkHref="#edit" />
</svg>
</button>
<button
type="button"
className="btn btn-icon btn-outline-secondary btn-sm"
onClick={() => handleDelete(ip, mac, hostname)}
>
<svg className="icons">
<use xlinkHref="#delete"/>
</svg>
</button>
</div>;
disabled={processingDeleting}
title={t('delete_table_action')}
>
<svg className="icons icon12">
<use xlinkHref="#delete" />
</svg>
</button>
</div>
);
},
},
]}
@@ -105,6 +133,7 @@ const StaticLeases = ({
/>
<Modal
isModalOpen={isModalOpen}
modalType={modalType}
handleSubmit={handleSubmit}
processingAdding={processingAdding}
cidr={cidr}
@@ -119,8 +148,10 @@ const StaticLeases = ({
StaticLeases.propTypes = {
staticLeases: PropTypes.array.isRequired,
isModalOpen: PropTypes.bool.isRequired,
modalType: PropTypes.string.isRequired,
processingAdding: PropTypes.bool.isRequired,
processingDeleting: PropTypes.bool.isRequired,
processingUpdating: PropTypes.bool.isRequired,
cidr: PropTypes.string.isRequired,
rangeStart: PropTypes.string,
rangeEnd: PropTypes.string,

View File

@@ -49,6 +49,7 @@ const Dhcp = () => {
isModalOpen,
processingAdding,
processingDeleting,
processingUpdating,
processingDhcp,
v4,
v6,
@@ -56,6 +57,7 @@ const Dhcp = () => {
enabled,
dhcp_available,
interfaces,
modalType,
} = useSelector((state) => state.dhcp, shallowEqual);
const interface_name = useSelector(
@@ -273,8 +275,11 @@ const Dhcp = () => {
<StaticLeases
staticLeases={staticLeases}
isModalOpen={isModalOpen}
toggleModal={toggleModal}
modalType={modalType}
processingAdding={processingAdding}
processingDeleting={processingDeleting}
processingUpdating={processingUpdating}
cidr={cidr}
rangeStart={dhcp?.values?.v4?.range_start}
rangeEnd={dhcp?.values?.v4?.range_end}

View File

@@ -68,10 +68,10 @@ const Form = ({
return <form onSubmit={handleSubmit}>
<div className="row">
<div className="col-12 col-sm-6">
<div className="col-12 col-md-7">
<div className="form__group form__group--settings">
<label htmlFor="ratelimit"
className="form__label form__label--with-desc">
className="form__label form__label--with-desc">
<Trans>rate_limit</Trans>
</label>
<div className="form__desc form__desc--top">
@@ -160,24 +160,46 @@ const Form = ({
name,
validateIp,
}) => <div className="col-12 col-sm-6" key={name}>
<div className="form__group form__group--settings">
<label className="form__label form__label--with-desc"
htmlFor={name}><Trans>{name}</Trans>
</label>
<div className="form__desc form__desc--top">
<Trans>{description}</Trans>
<div className="form__group form__group--settings">
<label className="form__label form__label--with-desc"
htmlFor={name}><Trans>{name}</Trans>
</label>
<div className="form__desc form__desc--top">
<Trans>{description}</Trans>
</div>
<Field
name={name}
component={renderInputField}
className="form-control"
placeholder={t('form_enter_ip')}
validate={[validateIp, validateRequiredValue]}
/>
</div>
<Field
name={name}
component={renderInputField}
className="form-control"
placeholder={t('form_enter_ip')}
validate={[validateIp, validateRequiredValue]}
/>
</div>
</div>)}
</div>)}
</>
)}
<div className="col-12 col-md-7">
<div className="form__group form__group--settings">
<label htmlFor="blocked_response_ttl"
className="form__label form__label--with-desc">
<Trans>blocked_response_ttl</Trans>
</label>
<div className="form__desc form__desc--top">
<Trans>blocked_response_ttl_desc</Trans>
</div>
<Field
name="blocked_response_ttl"
type="number"
component={renderInputField}
className="form-control"
placeholder={t('form_enter_blocked_response_ttl')}
normalize={toNumber}
validate={validateRequiredValue}
min={UINT32_RANGE.MIN}
max={UINT32_RANGE.MAX}
/>
</div>
</div>
</div>
<button
type="submit"

View File

@@ -13,6 +13,7 @@ const Config = () => {
ratelimit,
blocking_ipv4,
blocking_ipv6,
blocked_response_ttl,
edns_cs_enabled,
edns_cs_use_custom,
edns_cs_custom_ip,
@@ -38,6 +39,7 @@ const Config = () => {
blocking_mode,
blocking_ipv4,
blocking_ipv6,
blocked_response_ttl,
edns_cs_enabled,
disable_ipv6,
dnssec_enabled,

View File

@@ -137,6 +137,22 @@ const Examples = (props) => (
example_upstream_reserved
</Trans>
</li>
<li>
<code>[/example.local/]94.140.14.140 2a10:50c0::1:ff</code>: <Trans
components={[
<a
href="https://github.com/AdguardTeam/AdGuardHome/wiki/Configuration#upstreams-for-domains"
target="_blank"
rel="noopener noreferrer"
key="0"
>
Link
</a>,
]}
>
example_multiple_upstreams_reserved
</Trans>
</li>
<li>
<code>{COMMENT_LINE_DEFAULT_TOKEN} comment</code>: <Trans>
example_upstream_comment

View File

@@ -34,7 +34,7 @@ const validate = (values) => {
return errors;
};
const clearFields = (change, setTlsConfig, t) => {
const clearFields = (change, setTlsConfig, validateTlsConfig, t) => {
const fields = {
private_key: '',
certificate_chain: '',
@@ -53,6 +53,7 @@ const clearFields = (change, setTlsConfig, t) => {
Object.keys(fields)
.forEach((field) => change(field, fields[field]));
setTlsConfig(fields);
validateTlsConfig(fields);
}
};
@@ -102,6 +103,7 @@ let Form = (props) => {
subject,
warning_validation,
setTlsConfig,
validateTlsConfig,
certificateSource,
privateKeySource,
privateKeySaved,
@@ -419,7 +421,7 @@ let Form = (props) => {
type="button"
className="btn btn-secondary btn-standart"
disabled={submitting || processingConfig}
onClick={() => clearFields(change, setTlsConfig, t)}
onClick={() => clearFields(change, setTlsConfig, validateTlsConfig, t)}
>
<Trans>reset_settings</Trans>
</button>
@@ -455,6 +457,7 @@ Form.propTypes = {
subject: PropTypes.string,
t: PropTypes.func.isRequired,
setTlsConfig: PropTypes.func.isRequired,
validateTlsConfig: PropTypes.func.isRequired,
certificateSource: PropTypes.string,
privateKeySource: PropTypes.string,
privateKeySaved: PropTypes.bool,

View File

@@ -116,6 +116,7 @@ class Encryption extends Component {
onSubmit={this.handleFormSubmit}
onChange={this.handleFormChange}
setTlsConfig={this.props.setTlsConfig}
validateTlsConfig={this.props.validateTlsConfig}
{...this.props.encryption}
/>
</Card>

View File

@@ -2,6 +2,7 @@
align-items: center;
justify-content: space-between;
padding: 0.6rem 1.5rem;
flex-shrink: 0;
}
.card-subtitle {
@@ -19,8 +20,16 @@
max-height: 17.5rem;
}
.dashboard .card-table {
overflow: hidden;
}
.dashboard .card-table-overflow--limited {
max-height: 18rem;
max-height: 292px;
}
.dashboard .ReactTable .rt-tr-group {
min-height: 52px;
}
.card-actions {
@@ -125,7 +134,7 @@
@media (min-width: 992px) {
.dashboard .card:not(.card--full) {
height: 22rem;
height: 360px;
}
}
@@ -140,3 +149,7 @@
.card .logs__row--blue {
background-color: #ecf7ff;
}
[data-theme="dark"] .card .logs__row--blue {
background-color: var(--logs__row--blue-bgcolor);
}

View File

@@ -24,6 +24,13 @@
height: var(--size);
}
.icon--15 {
--size: 0.95rem;
width: var(--size);
height: var(--size);
}
.icon--gray {
color: var(--gray-a5);
}

View File

@@ -239,6 +239,12 @@ const Icons = () => (
<circle cx="12" cy="12" r="9" />
<path d="M16.1215 12.1213H11.8789V7.87866" />
</symbol>
<symbol id="bullets" width="24" height="24" viewBox="0 0 24 24">
<path fillRule="evenodd" clipRule="evenodd" d="M12 7C11.1716 7 10.5 6.32843 10.5 5.5C10.5 4.67157 11.1716 4 12 4C12.8284 4 13.5 4.67157 13.5 5.5C13.5 6.32843 12.8284 7 12 7Z" fill="currentColor" />
<path fillRule="evenodd" clipRule="evenodd" d="M12 13.5C11.1716 13.5 10.5 12.8284 10.5 12C10.5 11.1716 11.1716 10.5 12 10.5C12.8284 10.5 13.5 11.1716 13.5 12C13.5 12.8284 12.8284 13.5 12 13.5Z" fill="currentColor" />
<path fillRule="evenodd" clipRule="evenodd" d="M12 20C11.1716 20 10.5 19.3284 10.5 18.5C10.5 17.6716 11.1716 17 12 17C12.8284 17 13.5 17.6716 13.5 18.5C13.5 19.3284 12.8284 20 12 20Z" fill="currentColor" />
</symbol>
</svg>
);

View File

@@ -1,7 +1,6 @@
import React from 'react';
import { ResponsiveLine } from '@nivo/line';
import addDays from 'date-fns/add_days';
import addHours from 'date-fns/add_hours';
import subDays from 'date-fns/sub_days';
import subHours from 'date-fns/sub_hours';
import dateFormat from 'date-fns/format';
@@ -9,12 +8,14 @@ import round from 'lodash/round';
import { useSelector } from 'react-redux';
import PropTypes from 'prop-types';
import './Line.css';
import { msToDays } from '../../helpers/helpers';
import { msToDays, msToHours } from '../../helpers/helpers';
import { TIME_UNITS } from '../../helpers/constants';
const Line = ({
data, color = 'black',
}) => {
const interval = msToDays(useSelector((state) => state.stats.interval));
const interval = useSelector((state) => state.stats.interval);
const timeUnits = useSelector((state) => state.stats.timeUnits);
return <ResponsiveLine
enableArea
@@ -44,12 +45,12 @@ const Line = ({
enableGridY={false}
enablePoints={false}
xFormat={(x) => {
if (interval >= 0 && interval <= 7) {
const hoursAgo = subHours(Date.now(), 24 * interval);
return dateFormat(addHours(hoursAgo, x), 'D MMM HH:00');
if (timeUnits === TIME_UNITS.HOURS) {
const hoursAgo = msToHours(interval) - x - 1;
return dateFormat(subHours(Date.now(), hoursAgo), 'D MMM HH:00');
}
const daysAgo = subDays(Date.now(), interval - 1);
const daysAgo = subDays(Date.now(), msToDays(interval) - 1);
return dateFormat(addDays(daysAgo, x), 'D MMM YYYY');
}}
yFormat={(y) => round(y, 2)}

View File

@@ -9,10 +9,6 @@
overflow: visible;
}
.ReactTable .rt-tbody {
overflow: visible;
}
.ReactTable .rt-noData {
color: var(--rt-nodata-color);
background-color: var(--rt-nodata-bgcolor);

View File

@@ -21,6 +21,7 @@ const Tooltip = ({
delayShow = SHOW_TOOLTIP_DELAY,
delayHide = HIDE_TOOLTIP_DELAY,
onVisibilityChange,
defaultTooltipShown,
}) => {
const { t } = useTranslation();
const touchEventsAvailable = 'ontouchstart' in window;
@@ -75,6 +76,7 @@ const Tooltip = ({
delayShow={delayShowValue}
tooltip={renderTooltip}
onVisibilityChange={onVisibilityChange}
defaultTooltipShown={defaultTooltipShown}
>
{renderTrigger}
</TooltipTrigger>
@@ -97,6 +99,7 @@ Tooltip.propTypes = {
className: propTypes.string,
triggerClass: propTypes.string,
onVisibilityChange: propTypes.func,
defaultTooltipShown: propTypes.bool,
};
export default Tooltip;

View File

@@ -27,6 +27,7 @@ export const R_WIN_ABSOLUTE_PATH = /^([a-zA-Z]:)?(\\|\/)(?:[^\\/:*?"<>|\x00]+\\)
export const R_CLIENT_ID = /^[a-z0-9-]{1,63}$/;
export const MIN_PASSWORD_LENGTH = 8;
export const MAX_PASSWORD_LENGTH = 72;
export const HTML_PAGES = {
INSTALL: '/install.html',
@@ -175,6 +176,7 @@ export const MODAL_TYPE = {
CHOOSE_FILTERING_LIST: 'CHOOSE_FILTERING_LIST',
ADD_REWRITE: 'ADD_REWRITE',
EDIT_REWRITE: 'EDIT_REWRITE',
EDIT_LEASE: 'EDIT_LEASE',
};
export const CLIENT_ID = {
@@ -551,6 +553,13 @@ export const DISABLE_PROTECTION_TIMINGS = {
TOMORROW: 24 * 60 * 60 * 1000,
};
export const LOCAL_STORAGE_THEME_KEY = 'account_theme';
export const LOCAL_TIMEZONE_VALUE = 'Local';
export const TABLES_MIN_ROWS = 5;
export const DASHBOARD_TABLES_DEFAULT_PAGE_SIZE = 100;
export const TIME_UNITS = {
HOURS: 'hours',
DAYS: 'days',
};

View File

@@ -202,12 +202,30 @@ export default {
"homepage": "https://github.com/hagezi/dns-blocklists",
"source": "https://adguardteam.github.io/HostlistsRegistry/assets/filter_34.txt"
},
"hagezi_pro": {
"name": "HaGeZi's Pro Blocklist",
"categoryId": "general",
"homepage": "https://github.com/hagezi/dns-blocklists",
"source": "https://adguardteam.github.io/HostlistsRegistry/assets/filter_48.txt"
},
"hagezi_pro++": {
"name": "HaGeZi's Pro++ Blocklist",
"categoryId": "general",
"homepage": "https://github.com/hagezi/dns-blocklists",
"source": "https://adguardteam.github.io/HostlistsRegistry/assets/filter_51.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"
},
"hagezi_ultimate": {
"name": "HaGeZi's Ultimate Blocklist",
"categoryId": "general",
"homepage": "https://github.com/hagezi/dns-blocklists",
"source": "https://adguardteam.github.io/HostlistsRegistry/assets/filter_49.txt"
},
"no_google": {
"name": "No Google",
"categoryId": "other",
@@ -220,12 +238,6 @@ export default {
"homepage": "https://github.com/hoshsadiq/adblock-nocoin-list/",
"source": "https://adguardteam.github.io/HostlistsRegistry/assets/filter_8.txt"
},
"notracking_hosts_blocklists": {
"name": "The NoTracking blocklist",
"categoryId": "general",
"homepage": "https://github.com/notracking/hosts-blocklists",
"source": "https://adguardteam.github.io/HostlistsRegistry/assets/filter_32.txt"
},
"oisd_basic": {
"name": "OISD Blocklist Small",
"categoryId": "general",
@@ -286,6 +298,12 @@ export default {
"homepage": "https://github.com/mitchellkrogza/The-Big-List-of-Hacked-Malware-Web-Sites",
"source": "https://adguardteam.github.io/HostlistsRegistry/assets/filter_9.txt"
},
"ublock_badware_risks": {
"name": "uBlock₀ filters Badware risks",
"categoryId": "security",
"homepage": "https://github.com/uBlockOrigin/uAssets",
"source": "https://adguardteam.github.io/HostlistsRegistry/assets/filter_50.txt"
},
"urlhaus_filter_online": {
"name": "Malicious URL Blocklist (URLHaus)",
"categoryId": "security",

View File

@@ -26,8 +26,8 @@ import {
STANDARD_WEB_PORT,
SPECIAL_FILTER_ID,
THEMES,
LOCAL_STORAGE_THEME_KEY,
} from './constants';
import { LOCAL_STORAGE_KEYS, LocalStorageHelper } from './localStorageHelper';
/**
* @param time {string} The time to format
@@ -680,37 +680,13 @@ export const setHtmlLangAttr = (language) => {
window.document.documentElement.lang = language;
};
/**
* Set local storage field
*
* @param {string} key
* @param {string} value
*/
export const setStorageItem = (key, value) => {
if (window.localStorage) {
window.localStorage.setItem(key, value);
}
};
/**
* Get local storage field
*
* @param {string} key
*/
export const getStorageItem = (key) => (window.localStorage
? window.localStorage.getItem(key)
: null);
/**
* Set local storage theme field
*
* @param {string} theme
*/
export const setTheme = (theme) => {
setStorageItem(LOCAL_STORAGE_THEME_KEY, theme);
LocalStorageHelper.setItem(LOCAL_STORAGE_KEYS.THEME, theme);
};
/**
@@ -719,7 +695,7 @@ export const setTheme = (theme) => {
* @returns {string}
*/
export const getTheme = () => getStorageItem(LOCAL_STORAGE_THEME_KEY) || THEMES.light;
export const getTheme = () => LocalStorageHelper.getItem(LOCAL_STORAGE_KEYS.THEME) || THEMES.light;
/**
* Sets UI theme.

View File

@@ -0,0 +1,44 @@
export const LOCAL_STORAGE_KEYS = {
THEME: 'account_theme',
BLOCKLIST_PAGE_SIZE: 'blocklist_page_size',
ALLOWLIST_PAGE_SIZE: 'allowlist_page_size',
CLIENTS_PAGE_SIZE: 'clients_page_size',
REWRITES_PAGE_SIZE: 'rewrites_page_size',
AUTO_CLIENTS_PAGE_SIZE: 'auto_clients_page_size',
};
export const LocalStorageHelper = {
setItem(key, value) {
try {
localStorage.setItem(key, JSON.stringify(value));
} catch (error) {
console.error(`Error setting ${key} in local storage: ${error.message}`);
}
},
getItem(key) {
try {
const item = localStorage.getItem(key);
return item ? JSON.parse(item) : null;
} catch (error) {
console.error(`Error getting ${key} from local storage: ${error.message}`);
return null;
}
},
removeItem(key) {
try {
localStorage.removeItem(key);
} catch (error) {
console.error(`Error removing ${key} from local storage: ${error.message}`);
}
},
clear() {
try {
localStorage.clear();
} catch (error) {
console.error(`Error clearing local storage: ${error.message}`);
}
},
};

View File

@@ -43,7 +43,7 @@ export const renderFormattedClientCell = (value, info, isDetailed = false, isLog
const whoisAvailable = whois_info && Object.keys(whois_info).length > 0;
if (name) {
const nameValue = <div className="logs__text logs__text--link logs__text--nowrap" title={`${name} (${value})`}>
const nameValue = <div className="logs__text logs__text--link logs__text--nowrap logs__text--client" title={`${name} (${value})`}>
{name}&nbsp;<small>{`(${value})`}</small>
</div>;

View File

@@ -1,5 +1,5 @@
{
"timeUpdated": "2023-09-01T00:09:16.088Z",
"timeUpdated": "2023-11-10T12:55:56.663Z",
"categories": {
"0": "audio_video_player",
"1": "comments",
@@ -243,7 +243,7 @@
"name": "Australian Broadcasting Corporation",
"categoryId": 8,
"url": "https://www.abc.net.au/",
"companyId": "abc",
"companyId": "australian_government",
"source": "AdGuard"
},
"ablida": {
@@ -681,8 +681,9 @@
"adcolony": {
"name": "AdColony",
"categoryId": 4,
"url": "thttp://www.admarvel.com/",
"companyId": "adcolony"
"url": "https://www.adcolony.com/history-of-adcolony/",
"companyId": "digital_turbine",
"source": "AdGuard"
},
"adconion": {
"name": "Adconion",
@@ -1294,6 +1295,13 @@
"url": "http://www.demdex.com/",
"companyId": "adobe"
},
"adobe_developer": {
"name": "Adobe Developer",
"categoryId": 8,
"url": "https://developer.adobe.com/",
"companyId": "adobe",
"source": "AdGuard"
},
"adobe_dynamic_media": {
"name": "Adobe Dynamic Media",
"categoryId": 4,
@@ -1309,8 +1317,9 @@
"adobe_experience_cloud": {
"name": "Adobe Experience Cloud",
"categoryId": 6,
"url": "https://www.adobe.com/experience-cloud.html",
"companyId": "adobe"
"url": "https://business.adobe.com/",
"companyId": "adobe",
"source": "AdGuard"
},
"adobe_login": {
"name": "Adobe Login",
@@ -3593,6 +3602,13 @@
"url": null,
"companyId": null
},
"bom": {
"name": "Bureau of Meteorology",
"categoryId": 9,
"url": "http://bom.gov.au/",
"companyId": "australian_government",
"source": "AdGuard"
},
"bombora": {
"name": "Bombora",
"categoryId": 6,
@@ -4069,6 +4085,13 @@
"url": "https://www.canddi.com/",
"companyId": "canddi"
},
"canonical": {
"name": "Canonical",
"categoryId": 8,
"url": "https://canonical.com/",
"companyId": "canonical",
"source": "AdGuard"
},
"canvas": {
"name": "Canvas",
"categoryId": 2,
@@ -4339,6 +4362,13 @@
"url": "http://chartbeat.com/",
"companyId": "chartbeat"
},
"chartboost": {
"name": "Chartboost",
"categoryId": 4,
"url": "http://chartboost.com/",
"companyId": "take-two",
"source": "AdGuard"
},
"chaser": {
"name": "Chaser",
"categoryId": 2,
@@ -5936,6 +5966,20 @@
"url": "https://discordapp.com/",
"companyId": null
},
"disneyplus": {
"name": "Disney+",
"categoryId": 0,
"url": "https://www.disneyplus.com/",
"companyId": "disney",
"source": "AdGuard"
},
"disneystreaming": {
"name": "Disney Streaming",
"categoryId": 0,
"url": "https://press.disneyplus.com",
"companyId": "disney",
"source": "AdGuard"
},
"display_block": {
"name": "display block",
"categoryId": 4,
@@ -6153,6 +6197,13 @@
"url": "http://www.drawbrid.ge/",
"companyId": "drawbridge"
},
"dreame_tech": {
"name": "Dreame Technology",
"categoryId": 8,
"url": "https://www.dreame.tech/",
"companyId": "xiaomi",
"source": "AdGuard"
},
"dreamlab.pl": {
"name": "DreamLab.pl",
"categoryId": 4,
@@ -7295,7 +7346,7 @@
"name": "Flurry",
"categoryId": 101,
"url": "http://www.flurry.com/",
"companyId": "verizon",
"companyId": "apollo_global_management",
"source": "AdGuard"
},
"flxone": {
@@ -7583,6 +7634,13 @@
"url": "http://www.game-advertising-online.com/",
"companyId": "game_advertising_online"
},
"gameanalytics": {
"name": "GameAnalytics",
"categoryId": 101,
"url": "https://gameanalytics.com/",
"companyId": "mobvista",
"source": "AdGuard"
},
"gamedistribution.com": {
"name": "Gamedistribution.com",
"categoryId": 8,
@@ -9065,7 +9123,8 @@
"name": "Imgur",
"categoryId": 8,
"url": "https://imgur.com/",
"companyId": "imgur"
"companyId": "medialab",
"source": "AdGuard"
},
"imho_vi": {
"name": "imho vi",
@@ -10001,7 +10060,7 @@
"name": "Kik",
"categoryId": 7,
"url": "https://kik.com/",
"companyId": "kik",
"companyId": "medialab",
"source": "AdGuard"
},
"king.com": {
@@ -10184,6 +10243,13 @@
"url": "https://www.launchbit.com/",
"companyId": "launchbit"
},
"launchpad": {
"name": "Launchpad",
"categoryId": 8,
"url": "https://launchpad.net/",
"companyId": "canonical",
"source": "AdGuard"
},
"layer-ad.org": {
"name": "Layer-ADS.net",
"categoryId": 4,
@@ -10350,7 +10416,7 @@
"name": "Let's Encrypt",
"categoryId": 5,
"url": "https://letsencrypt.org/",
"companyId": "lets_encrypt",
"companyId": "isrg",
"source": "AdGuard"
},
"letv": {
@@ -12336,6 +12402,13 @@
"url": "http://www.nimblecommerce.com/",
"companyId": "nimblecommerce"
},
"nine_direct_digital": {
"name": "Nine Digital Direct",
"categoryId": 4,
"url": "https://ninedigitaldirect.com.au/",
"companyId": "nine_entertainment",
"source": "AdGuard"
},
"ninja_access_analysis": {
"name": "Ninja Access Analysis",
"categoryId": 6,
@@ -12835,7 +12908,7 @@
"name": "OPPO",
"categoryId": 101,
"url": "https://www.oppo.com/",
"companyId": "oppo",
"companyId": "bbk",
"source": "AdGuard"
},
"opta.net": {
@@ -12934,6 +13007,13 @@
"url": "http://www.ora.tv/",
"companyId": "ora.tv"
},
"oracle_infinity": {
"name": "Oracle Infinity Behavioral Intelligence",
"categoryId": 6,
"url": "https://www.oracle.com/au/cx/marketing/digital-intelligence/",
"companyId": "oracle",
"source": "AdGuard"
},
"oracle_live_help": {
"name": "Oracle Live Help",
"categoryId": 2,
@@ -14501,8 +14581,9 @@
"reddit": {
"name": "Reddit",
"categoryId": 7,
"url": "http://reddit.com",
"companyId": "reddit"
"url": "https://www.reddit.com",
"companyId": "advance",
"source": "AdGuard"
},
"redhelper": {
"name": "RedHelper",
@@ -16113,6 +16194,13 @@
"url": "https://www.snapchat.com/",
"companyId": "snap_technologies"
},
"snapcraft": {
"name": "Snapcraft",
"categoryId": 8,
"url": "https://snapcraft.io",
"companyId": "canonical",
"source": "AdGuard"
},
"snigelweb": {
"name": "SnigelWeb, Inc.",
"categoryId": 4,
@@ -17894,7 +17982,7 @@
"name": "Ubuntu",
"categoryId": 8,
"url": "https://ubuntu.com/",
"companyId": "ubuntu",
"companyId": "canonical",
"source": "AdGuard"
},
"ucfunnel": {
@@ -18754,6 +18842,13 @@
"url": "http://vpscash.nl/home",
"companyId": "vps_cash"
},
"vs": {
"name": "Visual Studio",
"categoryId": 8,
"url": "https://visualstudio.microsoft.com",
"companyId": "microsoft",
"source": "AdGuard"
},
"vscode": {
"name": "Visual Studio Code",
"categoryId": 8,
@@ -19081,6 +19176,13 @@
"companyId": "meta",
"source": "AdGuard"
},
"whisper": {
"name": "Whisper",
"categoryId": 7,
"url": "https://whisper.sh/",
"companyId": "medialab",
"source": "AdGuard"
},
"whos.amung.us": {
"name": "Whos.amung.us",
"categoryId": 6,
@@ -19393,6 +19495,13 @@
"companyId": "xhamster",
"source": "AdGuard"
},
"xiaomi": {
"name": "Xiaomi",
"categoryId": 8,
"url": "https://www.mi.com/",
"companyId": "xiaomi",
"source": "AdGuard"
},
"xing": {
"name": "Xing",
"categoryId": 6,
@@ -19460,8 +19569,9 @@
"yahoo": {
"name": "Yahoo!",
"categoryId": 6,
"url": "https://yahoo.com",
"companyId": "verizon"
"url": "https://yahoo.com/",
"companyId": "apollo_global_management",
"source": "AdGuard"
},
"yahoo_ad_exchange": {
"name": "Yahoo! Ad Exchange",
@@ -19475,6 +19585,13 @@
"url": "https://developer.yahoo.com/analytics/",
"companyId": "verizon"
},
"yahoo_advertising": {
"name": "Yahoo! Advertising",
"categoryId": 4,
"url": "https://www.advertising.yahooinc.com/",
"companyId": "apollo_global_management",
"source": "AdGuard"
},
"yahoo_analytics": {
"name": "Yahoo! Analytics",
"categoryId": 6,
@@ -19505,6 +19622,13 @@
"url": "http://searchmarketing.yahoo.com",
"companyId": "verizon"
},
"yahoo_search": {
"name": "Yahoo! Search",
"categoryId": 4,
"url": "https://search.yahooinc.com/",
"companyId": "apollo_global_management",
"source": "AdGuard"
},
"yahoo_small_business": {
"name": "Yahoo! Small Business",
"categoryId": 4,
@@ -19996,8 +20120,8 @@
"2leep.com": "2leep",
"33across.com": "33across",
"3dstats.com": "3dstats",
"3gppnetwork.org": "3gpp",
"3gpp.org": "3gpp",
"3gppnetwork.org": "3gpp",
"4cdn.org": "4chan",
"4finance.com": "4finance_com",
"4wnet.com": "4w_marketplace",
@@ -20018,7 +20142,6 @@
"aaxads.com": "aaxads.com",
"abtasty.com": "ab_tasty",
"d1447tq2m68ekg.cloudfront.net": "ab_tasty",
"abc.net.au": "abc",
"ab.co": "abc",
"abc-cdn.net.au": "abc",
"abc-host.net": "abc",
@@ -20026,6 +20149,7 @@
"abc-prod.net.au": "abc",
"abc-stage.net.au": "abc",
"abc-test.net.au": "abc",
"abc.net.au": "abc",
"abcaustralia.net.au": "abc",
"abcradio.net.au": "abc",
"ablida.de": "ablida",
@@ -20142,6 +20266,7 @@
"ad-cloud.jp": "adcloud",
"admarvel.s3.amazonaws.com": "adcolony",
"ads.admarvel.com": "adcolony",
"adcolony.com": "adcolony",
"adrdgt.com": "adconion",
"amgdgt.com": "adconion",
"adcrowd.com": "adcrowd",
@@ -20187,16 +20312,17 @@
"adgorithms.com": "adgorithms",
"adgoto.com": "adgoto",
"adguard.com": "adguard",
"adtidy.org": "adguard",
"agrd.io": "adguard",
"adguard.app": "adguard",
"adguard.info": "adguard",
"adguard.io": "adguard",
"adguard.org": "adguard",
"adtidy.org": "adguard",
"agrd.io": "adguard",
"adguard-dns.com": "adguard_dns",
"adguard-dns.io": "adguard_dns",
"adguardvpn.com": "adguard_vpn",
"adguard-vpn.com": "adguard_vpn",
"adguard-vpn.online": "adguard_vpn",
"adguardvpn.com": "adguard_vpn",
"adhands.ru": "adhands",
"adhese.be": "adhese",
"adhese.com": "adhese",
@@ -20212,9 +20338,9 @@
"cdn.adjs.net": "adjs",
"adjug.com": "adjug",
"adjust.com": "adjust",
"adjust.net.in": "adjust",
"adj.st": "adjust",
"adjust.io": "adjust",
"adjust.net.in": "adjust",
"adjust.world": "adjust",
"apptrace.com": "adjust",
"adk2.com": "adk2",
@@ -20295,6 +20421,7 @@
"demdex.net": "adobe_audience_manager",
"everestjs.net": "adobe_audience_manager",
"everesttech.net": "adobe_audience_manager",
"adobe.io": "adobe_developer",
"scene7.com": "adobe_dynamic_media",
"adobedtm.com": "adobe_dynamic_tag_management",
"2o7.net": "adobe_experience_cloud",
@@ -20564,18 +20691,21 @@
"amazon.fr": "amazon",
"amazon.it": "amazon",
"d3io1k5o0zdpqr.cloudfront.net": "amazon",
"amazoncrl.com": "amazon",
"aamazoncognito.com": "amazon",
"amazonbrowserapp.es": "amazon",
"amazonbrowserapp.co.uk": "amazon",
"amazon.sa": "amazon",
"amazon.nl": "amazon",
"amazon.in": "amazon",
"amazon.com.mx": "amazon",
"amazon.com.au": "amazon",
"amazon-corp.com": "amazon",
"a2z.com": "amazon",
"aamazoncognito.com": "amazon",
"amazon-corp.com": "amazon",
"amazon-dss.com": "amazon",
"amazon.com.au": "amazon",
"amazon.com.mx": "amazon",
"amazon.dev": "amazon",
"amazon.in": "amazon",
"amazon.nl": "amazon",
"amazon.sa": "amazon",
"amazonbrowserapp.co.uk": "amazon",
"amazonbrowserapp.es": "amazon",
"amazoncrl.com": "amazon",
"firetvcaptiveportal.com": "amazon",
"ntp-fireos.com": "amazon",
"amazon-adsystem.com": "amazon_adsystem",
"serving-sys.com": "amazon_adsystem",
"sizmek.com": "amazon_adsystem",
@@ -20591,12 +20721,16 @@
"amazontrust.com": "amazon_cdn",
"associates-amazon.com": "amazon_cdn",
"cloudfront.net": "amazon_cloudfront",
"ota-cloudfront.net": "amazon_cloudfront",
"axx-eu.amazon-adsystem.com": "amazon_mobile_ads",
"amazonpay.com": "amazon_payments",
"payments-amazon.com": "amazon_payments",
"amazonpay.in": "amazon_payments",
"aiv-cdn.net": "amazon_video",
"aiv-delivery.net": "amazon_video",
"amazonvideo.com": "amazon_video",
"pv-cdn.net": "amazon_video",
"primevideo.com": "amazon_video",
"amazonaws.com": "amazon_web_services",
"amazonwebservices.com": "amazon_web_services",
"awsstatic.com": "amazon_web_services",
@@ -20640,31 +20774,32 @@
"eum-appdynamics.com": "appdynamics",
"jscdn.appier.net": "appier",
"apple.com": "apple",
"me.com": "apple",
"apple.news": "apple",
"apple-dns.net": "apple",
"aaplimg.com": "apple",
"icloud.com": "apple",
"itunes.com": "apple",
"icloud-content.com": "apple",
"mzstatic.com": "apple",
"cdn-apple.com": "apple",
"apple-mapkit.com": "apple",
"icons.axm-usercontent-apple.com": "apple",
"apple-cloudkit.com": "apple",
"apzones.com": "apple",
"apple-dns.net": "apple",
"apple-livephotoskit.com": "apple",
"apple-mapkit.com": "apple",
"apple.news": "apple",
"apzones.com": "apple",
"cdn-apple.com": "apple",
"icloud-content.com": "apple",
"icloud.com": "apple",
"icons.axm-usercontent-apple.com": "apple",
"itunes.com": "apple",
"me.com": "apple",
"mzstatic.com": "apple",
"safebrowsing.apple": "apple",
"safebrowsing.g.applimg.com": "apple",
"iadsdk.apple.com": "apple_ads",
"applifier.com": "applifier",
"assets.applovin.com": "applovin",
"applvn.com": "applovin",
"applovin.com": "applovin",
"applvn.com": "applovin",
"appmetrx.com": "appmetrx",
"adnxs.com": "appnexus",
"adnxs.net": "appnexus",
"appsflyer.com": "appsflyer",
"appsflyersdk.com": "appsflyer",
"adne.tv": "apptv",
"readserver.net": "apptv",
"www.apture.com": "apture",
@@ -20742,6 +20877,8 @@
"ad.globe7.com": "axill",
"azadify.com": "azadify",
"azure.com": "azure",
"azure.net": "azure",
"azurefd.net": "azure",
"trafficmanager.net": "azure",
"blob.core.windows.net": "azure_blob_storage",
"azureedge.net": "azureedge.net",
@@ -20874,6 +21011,7 @@
"secure.apps.shappify.com": "bold",
"boldchat.com": "boldchat",
"boltdns.net": "boltdns.net",
"bom.gov.au": "bom",
"ml314.com": "bombora",
"bongacams.com": "bongacams.com",
"bonial.com": "bonial",
@@ -20969,6 +21107,7 @@
"camakaroda.com": "camakaroda.com",
"s.edkay.com": "campus_explorer",
"canddi.com": "canddi",
"canonical.com": "canonical",
"canvas.net": "canvas",
"canvasnetwork.com": "canvas",
"du11hjcvx0uqb.cloudfront.net": "canvas",
@@ -21030,6 +21169,7 @@
"chaordicsystems.com": "chaordic",
"chartbeat.com": "chartbeat",
"chartbeat.net": "chartbeat",
"chartboost.com": "chartboost",
"chaser.ru": "chaser",
"cloud.chatbeacon.io": "chat_beacon",
"chatango.com": "chatango",
@@ -21117,8 +21257,8 @@
"cloud-media.fr": "cloud-media.fr",
"cloudflare.com": "cloudflare",
"cloudflare.net": "cloudflare",
"cloudflare-dns.com": "cloudflare",
"cloudflare-dm-cmpimg.com": "cloudflare",
"cloudflare-dns.com": "cloudflare",
"cloudflare-ipfs.com": "cloudflare",
"cloudflare-quic.com": "cloudflare",
"cloudflare-terms-of-service-abuse.com": "cloudflare",
@@ -21131,8 +21271,10 @@
"cloudflareresolve.com": "cloudflare",
"cloudflaressl.com": "cloudflare",
"cloudflarestatus.com": "cloudflare",
"cloudflarestream.com": "cloudflare",
"pacloudflare.com": "cloudflare",
"sn-cloudflare.com": "cloudflare",
"videodelivery.net": "cloudflare",
"cloudimg.io": "cloudimage.io",
"cloudinary.com": "cloudinary",
"clovenetwork.com": "clove_network",
@@ -21401,6 +21543,10 @@
"directadvert.ru": "directadvert",
"directrev.com": "directrev",
"discordapp.com": "discord",
"disneyplus.com": "disneyplus",
"bamgrid.com": "disneystreaming",
"dssedge.com": "disneystreaming",
"dssott.com": "disneystreaming",
"d81mfvml8p5ml.cloudfront.net": "display_block",
"disqus.com": "disqus",
"disquscdn.com": "disqus",
@@ -21444,6 +21590,8 @@
"doubleverify.com": "doubleverify",
"wrating.com": "dratio",
"adsymptotic.com": "drawbridge",
"dreame.tech": "dreame_tech",
"dreametech.com": "dreame_tech",
"dreamlab.pl": "dreamlab.pl",
"drift.com": "drift",
"js.driftt.com": "drift",
@@ -21664,18 +21812,18 @@
"findologic.com": "findologic.com",
"app-measurement.com": "firebase",
"fcm.googleapis.com": "firebase",
"firebaseappcheck.googleapis.com": "firebase",
"firebaseapp.com": "firebase",
"firebase.com": "firebase",
"firebasedynamiclinks.googleapis.com": "firebase",
"firebase.google.com": "firebase",
"firebase.googleapis.com": "firebase",
"firebaseapp.com": "firebase",
"firebaseappcheck.googleapis.com": "firebase",
"firebasedynamiclinks-ipv4.googleapis.com": "firebase",
"firebasedynamiclinks-ipv6.googleapis.com": "firebase",
"firebase.googleapis.com": "firebase",
"firebase.google.com": "firebase",
"firebasedynamiclinks.googleapis.com": "firebase",
"firebaseinappmessaging.googleapis.com": "firebase",
"firebaseinstallations.googleapis.com": "firebase",
"firebaselogging.googleapis.com": "firebase",
"firebaselogging-pa.googleapis.com": "firebase",
"firebaselogging.googleapis.com": "firebase",
"firebaseperusertopics-pa.googleapis.com": "firebase",
"firebaseremoteconfig.googleapis.com": "firebase",
"firebaseio.com": "firebaseio.com",
@@ -21753,9 +21901,9 @@
"freegeoip.net": "freegeoip_net",
"freenet.de": "freenet_de",
"freent.de": "freenet_de",
"freeviewaustralia.tv": "freeview",
"freeview.com.au": "freeview",
"freeview.com": "freeview",
"freeview.com.au": "freeview",
"freeviewaustralia.tv": "freeview",
"fwmrm.net": "freewheel",
"heimdall.fresh8.co": "fresh8",
"d36mpcpuzc4ztk.cloudfront.net": "freshdesk",
@@ -21784,6 +21932,7 @@
"angsrvr.com": "fyber",
"fyber.com": "fyber",
"game-advertising-online.com": "game_advertising_online",
"gameanalytics.com": "gameanalytics",
"gamedistribution.com": "gamedistribution.com",
"gamerdna.com": "gamerdna",
"gannett-cdn.com": "gannett",
@@ -21830,7 +21979,9 @@
"githubassets.com": "github",
"githubusercontent.com": "github",
"ghcr.io": "github",
"github.blog": "github",
"github.dev": "github",
"octocaptcha.com": "github",
"githubapp.com": "github_apps",
"github.io": "github_pages",
"aff3.gittigidiyor.com": "gittigidiyor_affiliate_program",
@@ -21904,7 +22055,6 @@
"google.ae": "google",
"google.al": "google",
"google.am": "google",
"googleapis.cn": "google",
"google.as": "google",
"google.az": "google",
"google.ba": "google",
@@ -21927,11 +22077,20 @@
"google.co.bw": "google",
"google.co.ck": "google",
"google.co.cr": "google",
"googlecode.com": "google",
"google.co.il": "google",
"google.co.ke": "google",
"google.co.kr": "google",
"google.co.ls": "google",
"google.co.mz": "google",
"google.co.nz": "google",
"google.co.tz": "google",
"google.co.ug": "google",
"google.co.uz": "google",
"google.co.ve": "google",
"google.co.vi": "google",
"google.co.za": "google",
"google.co.zm": "google",
"google.co.zw": "google",
"google.com.af": "google",
"google.com.ag": "google",
"google.com.ai": "google",
@@ -21979,20 +22138,9 @@
"google.com.uy": "google",
"google.com.vc": "google",
"google.com.vn": "google",
"google.co.mz": "google",
"google.co.nz": "google",
"google.co.tz": "google",
"google.co.ug": "google",
"google.co.uz": "google",
"google.co.ve": "google",
"google.co.vi": "google",
"google.co.za": "google",
"google.co.zm": "google",
"google.co.zw": "google",
"google.cv": "google",
"google.dj": "google",
"google.dm": "google",
"googledownloads.cn": "google",
"google.ee": "google",
"google.fm": "google",
"google.ga": "google",
@@ -22034,7 +22182,6 @@
"google.net": "google",
"google.nr": "google",
"google.nu": "google",
"googleoptimize.com": "google",
"google.org": "google",
"google.pn": "google",
"google.ps": "google",
@@ -22058,8 +22205,12 @@
"google.us": "google",
"google.vg": "google",
"google.vu": "google",
"googleweblight.in": "google",
"google.ws": "google",
"googleapis.cn": "google",
"googlecode.com": "google",
"googledownloads.cn": "google",
"googleoptimize.com": "google",
"googleweblight.in": "google",
"googlezip.net": "google",
"gstatic.cn": "google",
"news.google.com": "google",
@@ -22086,10 +22237,10 @@
"alt7-mtalk.google.com": "google_chat",
"alt8-mtalk.google.com": "google_chat",
"chat.google.com": "google_chat",
"mobile-gtalk4.l.google.com": "google_chat",
"mobile-gtalk.l.google.com": "google_chat",
"mtalk4.google.com": "google_chat",
"mobile-gtalk4.l.google.com": "google_chat",
"mtalk.google.com": "google_chat",
"mtalk4.google.com": "google_chat",
"talk.google.com": "google_chat",
"talk.l.google.com": "google_chat",
"talkx.l.google.com": "google_chat",
@@ -22109,10 +22260,10 @@
"mail-ads.google.com": "google_email",
"fonts.googleapis.com": "google_fonts",
"cloudfunctions.net": "google_hosted",
"ghs46.googlehosted.com": "google_hosted",
"ghs4.googlehosted.com": "google_hosted",
"ghs6.googlehosted.com": "google_hosted",
"ghs.googlehosted.com": "google_hosted",
"ghs4.googlehosted.com": "google_hosted",
"ghs46.googlehosted.com": "google_hosted",
"ghs6.googlehosted.com": "google_hosted",
"googlehosted.l.googleusercontent.com": "google_hosted",
"run.app": "google_hosted",
"supl.google.com": "google_location",
@@ -22126,9 +22277,9 @@
"maps.google.ca": "google_maps",
"maps.google.ch": "google_maps",
"maps.google.co.jp": "google_maps",
"maps.google.co.uk": "google_maps",
"maps.google.com": "google_maps",
"maps.google.com.mx": "google_maps",
"maps.google.co.uk": "google_maps",
"maps.google.es": "google_maps",
"maps.google.se": "google_maps",
"maps.gstatic.com": "google_maps",
@@ -22136,6 +22287,8 @@
"adservice.google.ca": "google_marketing",
"adservice.google.co.in": "google_marketing",
"adservice.google.co.kr": "google_marketing",
"adservice.google.co.uk": "google_marketing",
"adservice.google.co.za": "google_marketing",
"adservice.google.com": "google_marketing",
"adservice.google.com.ar": "google_marketing",
"adservice.google.com.au": "google_marketing",
@@ -22149,8 +22302,6 @@
"adservice.google.com.tr": "google_marketing",
"adservice.google.com.tw": "google_marketing",
"adservice.google.com.vn": "google_marketing",
"adservice.google.co.uk": "google_marketing",
"adservice.google.co.za": "google_marketing",
"adservice.google.de": "google_marketing",
"adservice.google.dk": "google_marketing",
"adservice.google.es": "google_marketing",
@@ -22165,17 +22316,17 @@
"googlesyndication-cn.com": "google_marketing",
"duo.google.com": "google_meet",
"hangouts.clients6.google.com": "google_meet",
"hangouts.googleapis.com": "google_meet",
"hangouts.google.com": "google_meet",
"hangouts.googleapis.com": "google_meet",
"meet.google.com": "google_meet",
"meetings.googleapis.com": "google_meet",
"stun1.l.google.com": "google_meet",
"stun.l.google.com": "google_meet",
"stun1.l.google.com": "google_meet",
"ggpht.com": "google_photos",
"play-fe.googleapis.com": "google_play",
"play.googleapis.com": "google_play",
"play.google.com": "google_play",
"play-lh.googleusercontent.com": "google_play",
"play.google.com": "google_play",
"play.googleapis.com": "google_play",
"1e100cdn.net": "google_servers",
"gvt1.com": "google_servers",
"gvt2.com": "google_servers",
@@ -22477,9 +22628,9 @@
"iprom.net": "iprom",
"ipromote.com": "ipromote",
"clickmanage.com": "iprospect",
"qy.net": "iqiyi",
"iqiyi.com": "iqiyi",
"iq.com": "iqiyi",
"iqiyi.com": "iqiyi",
"qy.net": "iqiyi",
"addelive.com": "ironsource",
"afdads.com": "ironsource",
"delivery47.com": "ironsource",
@@ -22589,9 +22740,11 @@
"sa-as.com": "kickfire",
"sniff.visistat.com": "kickfire",
"stats.visistat.com": "kickfire",
"kik.com": "kik",
"apikik.com": "kik",
"kik-gateway-use1.meetme.com": "kik",
"kik-live.com": "kik",
"kik-stream.meetme.com": "kik",
"kik.com": "kik",
"king.com": "king.com",
"midasplayer.com": "king_com",
"kinja-img.com": "kinja.com",
@@ -22633,6 +22786,8 @@
"events.launchdarkly.com": "launch_darkly",
"launchdarkly.com": "launch_darkly",
"launchbit.com": "launchbit",
"launchpad.net": "launchpad",
"launchpadcontent.net": "launchpad",
"layer-ad.org": "layer-ad.org",
"ph-live.slatic.net": "lazada",
"slatic.net": "lazada",
@@ -22714,11 +22869,11 @@
"footprint.net": "level3_communications",
"alphonso.tv": "lgads",
"lgads.tv": "lgads",
"lg.com": "lgtv",
"lge.com": "lgtv",
"lgsmartad.com": "lgtv",
"lgtvcommon.com": "lgtv",
"lgtvsdp.com": "lgtv",
"lge.com": "lgtv",
"lg.com": "lgtv",
"licensebuttons.net": "licensebuttons.net",
"lfstmedia.com": "lifestreet_media",
"content-recommendation.net": "ligatus",
@@ -22913,8 +23068,8 @@
"s1.mediaad.org": "mediaad",
"mlnadvertising.com": "mediaglu",
"fhserve.com": "mediahub",
"medialab.la": "medialab",
"media-lab.ai": "medialab",
"medialab.la": "medialab",
"adnet.ru": "medialand",
"medialand.ru": "medialand",
"medialead.de": "medialead",
@@ -22985,7 +23140,13 @@
"s-microsoft.com": "microsoft",
"trouter.io": "microsoft",
"windows.net": "microsoft",
"bingapis.com": "microsoft",
"msauth.net": "microsoft",
"msftauth.net": "microsoft",
"msftstatic.com": "microsoft",
"msidentity.com": "microsoft",
"nelreports.net": "microsoft",
"windowscentral.com": "microsoft",
"analytics.live.com": "microsoft_analytics",
"a.clarity.ms": "microsoft_clarity",
"b.clarity.ms": "microsoft_clarity",
@@ -23070,9 +23231,11 @@
"mrpdata.com": "mrpdata",
"mrpdata.net": "mrpdata",
"mrskincash.com": "mrskincash",
"a-msedge.net": "msedge",
"e-msedge.net": "msedge",
"l-msedge.net": "msedge",
"s-msedge.net": "msedge",
"t-msedge.net": "msedge",
"msn.com": "msn",
"s-msn.com": "msn",
"musculahq.appspot.com": "muscula",
@@ -23171,6 +23334,7 @@
"d1ros97qkrwjf5.cloudfront.net": "new_relic",
"newrelic.com": "new_relic",
"nr-data.net": "new_relic",
"codestream.com": "new_relic",
"newscgp.com": "newscgp.com",
"nmcdn.us": "newsmax",
"newstogram.com": "newstogram",
@@ -23189,6 +23353,7 @@
"ads.ngageinc.com": "ngage_inc.",
"nice264.com": "nice264.com",
"nimblecommerce.com": "nimblecommerce",
"nineanalytics.io": "nine_direct_digital",
"cho-chin.com": "ninja_access_analysis",
"donburako.com": "ninja_access_analysis",
"hishaku.com": "ninja_access_analysis",
@@ -23292,12 +23457,12 @@
"opinary.com": "opinary",
"opinionbar.com": "opinionbar",
"emagazines.com": "oplytic",
"oppomobile.com": "oppo",
"heytapmobi.com": "oppo",
"heytapmobile.com": "oppo",
"heytapdl.com": "oppo",
"allawnos.com": "oppo",
"allawntech.com": "oppo",
"heytapdl.com": "oppo",
"heytapmobi.com": "oppo",
"heytapmobile.com": "oppo",
"oppomobile.com": "oppo",
"opta.net": "opta.net",
"optaim.com": "optaim",
"cookielaw.org": "optanaon",
@@ -23315,6 +23480,7 @@
"optincollect.com": "optinproject.com",
"volvelle.tech": "optomaton",
"ora.tv": "ora.tv",
"oracleinfinity.io": "oracle_infinity",
"instantservice.com": "oracle_live_help",
"ts.istrack.com": "oracle_live_help",
"rightnowtech.com": "oracle_rightnow",
@@ -23423,8 +23589,9 @@
"loveadvert.ru": "play_by_mamba",
"playbuzz.com": "playbuzz.com",
"pof.com": "plenty_of_fish",
"plex.tv": "plex",
"plex.bz": "plex",
"plex.direct": "plex",
"plex.tv": "plex",
"analytics.plex.tv": "plex_metrics",
"metrics.plex.tv": "plex_metrics",
"plista.com": "plista",
@@ -23603,6 +23770,7 @@
"rcsmediagroup.it": "rcs.it",
"d335luupugsy2.cloudfront.net": "rd_station",
"rea-group.com": "rea_group",
"reastatic.net": "rea_group",
"d12ulf131zb0yj.cloudfront.net": "reachforce",
"reachforce.com": "reachforce",
"reachjunction.com": "reachjunction",
@@ -23834,6 +24002,7 @@
"samsungsds.com": "samsungsds",
"internetat.tv": "samsungtv",
"samsungcloud.tv": "samsungtv",
"tizenservice.com": "samsungtv",
"ilsemedia.nl": "sanoma.fi",
"sanoma.fi": "sanoma.fi",
"d13im3ek7neeqp.cloudfront.net": "sap_crm",
@@ -23938,12 +24107,12 @@
"cdn.shopify.com": "shopify",
"myshopify.com": "shopify",
"shop.app": "shopify",
"shopifyapps.com": "shopify",
"shopifycdn.net": "shopify",
"shopify.co.za": "shopify",
"shopify.com.au": "shopify",
"shopify.com.mx": "shopify",
"shopify.co.za": "shopify",
"shopify.dev": "shopify",
"shopifyapps.com": "shopify",
"shopifycdn.net": "shopify",
"shopifynetwork.com": "shopify",
"shopifypreview.com": "shopify",
"shopifysvc.com": "shopify_stats",
@@ -23980,8 +24149,8 @@
"pages04.net": "silverpop",
"pages05.net": "silverpop",
"similardeals.net": "similardeals.net",
"similarweb.io": "similarweb",
"similarweb.com": "similarweb",
"similarweb.io": "similarweb",
"d8rk54i4mohrb.cloudfront.net": "simplereach",
"simplereach.com": "simplereach",
"simpli.fi": "simpli.fi",
@@ -24020,10 +24189,10 @@
"skypeassets.com": "skype",
"skysa.com": "skysa",
"skyscnr.com": "skyscnr.com",
"slack.com": "slack",
"slackb.com": "slack",
"slack-edge.com": "slack",
"slack-imgs.com": "slack",
"slack.com": "slack",
"slackb.com": "slack",
"slashdot.org": "slashdot_widget",
"sleeknotestaticcontent.sleeknote.com": "sleeknote",
"resultspage.com": "sli_systems",
@@ -24079,6 +24248,8 @@
"snapengage.com": "snap_engage",
"sc-static.net": "snapchat",
"snapchat.com": "snapchat",
"snapcraft.io": "snapcraft",
"snapcraftcontent.com": "snapcraft",
"h-bid.com": "snigelweb",
"eu2.snoobi.eu": "snoobi",
"snoobi.com": "snoobi_analytics",
@@ -24292,8 +24463,8 @@
"teaser.cc": "teaser.cc",
"emailretargeting.com": "tedemis",
"tracking.dsmmadvantage.com": "teletech",
"telstra.com.au": "telstra",
"telstra.com": "telstra",
"telstra.com.au": "telstra",
"tenderapp.com": "tender",
"tensitionschoo.club": "tensitionschoo.club",
"watch.teroti.com": "teroti",
@@ -24482,11 +24653,6 @@
"tyroodr.com": "tyroo",
"tzetze.it": "tzetze",
"ubersetzung-app.com": "ubersetzung-app.com",
"canonical.com": "ubuntu",
"launchpad.net": "ubuntu",
"launchpadcontent.net": "ubuntu",
"snapcraft.io": "ubuntu",
"snapcraftcontent.com": "ubuntu",
"ubuntu.com": "ubuntu",
"ubuntucompanyservices.co.za": "ubuntu",
"aralego.net": "ucfunnel",
@@ -24667,10 +24833,11 @@
"voxus-targeting-voxusmidia.netdna-ssl.com": "voxus",
"c-dsp.vpadn.com": "vpon",
"tools.vpscash.nl": "vpscash",
"vsassets.io": "vs",
"exp-tas.com": "vscode",
"vscode-unpkg.net": "vscode",
"v0cdn.net": "vscode",
"vscode-cdn.net": "vscode",
"vscode-unpkg.net": "vscode",
"vtracy.de": "vtracy.de",
"liftoff.io": "vungle",
"vungle.com": "vungle",
@@ -24743,8 +24910,10 @@
"wetter.com": "wetter_com",
"wettercomassets.com": "wetter_com",
"whatsbroadcast.com": "whatbroadcast",
"whatsapp.net": "whatsapp",
"whatsapp.com": "whatsapp",
"whatsapp.net": "whatsapp",
"whisper.onelink.me": "whisper",
"whisper.sh": "whisper",
"amung.us": "whos.amung.us",
"whoson.com": "whoson",
"api.wibbitz.com": "wibbitz",
@@ -24814,6 +24983,13 @@
"xhamsterlive.com": "xhamster",
"xhamsterpremium.com": "xhamster",
"xhcdn.com": "xhamster",
"huami.com": "xiaomi",
"mi-img.com": "xiaomi",
"mi.com": "xiaomi",
"miui.com": "xiaomi",
"xiaomi.com": "xiaomi",
"xiaomi.net": "xiaomi",
"xiaomiyoupin.com": "xiaomi",
"xing-share.com": "xing",
"xing.com": "xing",
"xmediaclicks.com": "xmediaclicks",
@@ -24831,10 +25007,15 @@
"yahoo.com": "yahoo",
"yahooapis.com": "yahoo",
"yimg.com": "yahoo",
"ads.yahoo.com": "yahoo_ad_exchange",
"oath.cloud": "yahoo",
"yahoo.net": "yahoo",
"yahooinc.com": "yahoo",
"yahoodns.net": "yahoo",
"yads.yahoo.com": "yahoo_ad_exchange",
"yieldmanager.com": "yahoo_ad_exchange",
"pr-bh.ybp.yahoo.com": "yahoo_ad_manager",
"ads.yahoo.com": "yahoo_advertising",
"adtech.yahooinc.com": "yahoo_advertising",
"analytics.yahoo.com": "yahoo_analytics",
"np.lexity.com": "yahoo_commerce_central",
"storage-yahoo.jp": "yahoo_japan_retargeting",
@@ -24844,6 +25025,7 @@
"yjtag.jp": "yahoo_japan_retargeting",
"ov.yahoo.co.jp": "yahoo_overture",
"overture.com": "yahoo_overture",
"search.yahooinc.com": "yahoo_search",
"luminate.com": "yahoo_small_business",
"pixazza.com": "yahoo_small_business",
"awaps.yandex.ru": "yandex",

View File

@@ -1,5 +1,4 @@
import i18next from 'i18next';
import stringLength from 'string-length';
import {
MAX_PORT,
@@ -14,6 +13,7 @@ import {
UNSAFE_PORTS,
R_CLIENT_ID,
R_DOMAIN,
MAX_PASSWORD_LENGTH,
MIN_PASSWORD_LENGTH,
} from './constants';
import { ip4ToInt, isValidAbsolutePath } from './form';
@@ -325,14 +325,33 @@ export const validateIpv4InCidr = (valueIp, allValues) => {
return undefined;
};
/**
* @param value {string}
* @returns {number}
*/
const utf8StringLength = (value) => {
const encoder = new TextEncoder();
const view = encoder.encode(value);
return view.length;
};
/**
* @param value {string}
* @returns {Function}
*/
export const validatePasswordLength = (value) => {
if (value && stringLength(value) < MIN_PASSWORD_LENGTH) {
return i18next.t('form_error_password_length', { value: MIN_PASSWORD_LENGTH });
if (value) {
const length = utf8StringLength(value);
if (length < MIN_PASSWORD_LENGTH || length > MAX_PASSWORD_LENGTH) {
// TODO: Make the i18n clearer with regards to bytes vs. characters.
return i18next.t('form_error_password_length', {
min: MIN_PASSWORD_LENGTH,
max: MAX_PASSWORD_LENGTH,
});
}
}
return undefined;
};

View File

@@ -128,7 +128,8 @@ const dhcp = handleActions(
const newState = {
...state,
isModalOpen: !state.isModalOpen,
leaseModalConfig: payload,
modalType: payload?.type || '',
leaseModalConfig: payload?.config,
};
return newState;
},
@@ -175,6 +176,16 @@ const dhcp = handleActions(
};
return newState;
},
[actions.updateStaticLeaseRequest]: (state) => ({ ...state, processingUpdating: true }),
[actions.updateStaticLeaseFailure]: (state) => ({ ...state, processingUpdating: false }),
[actions.updateStaticLeaseSuccess]: (state) => {
const newState = {
...state,
processingUpdating: false,
};
return newState;
},
},
{
processing: true,
@@ -184,6 +195,7 @@ const dhcp = handleActions(
processingConfig: false,
processingAdding: false,
processingDeleting: false,
processingUpdating: false,
enabled: false,
interface_name: '',
check: null,
@@ -202,6 +214,7 @@ const dhcp = handleActions(
staticLeases: [],
isModalOpen: false,
leaseModalConfig: undefined,
modalType: '',
dhcp_available: false,
},
);

View File

@@ -49,6 +49,7 @@ const dnsConfig = handleActions(
ratelimit: 20,
blocking_ipv4: DEFAULT_BLOCKING_IPV4,
blocking_ipv6: DEFAULT_BLOCKING_IPV6,
blocked_response_ttl: 10,
edns_cs_enabled: false,
disable_ipv6: false,
dnssec_enabled: false,

View File

@@ -1,6 +1,11 @@
import { handleActions } from 'redux-actions';
import { normalizeTopClients } from '../helpers/helpers';
import { DAY, HOUR, STATS_INTERVALS_DAYS } from '../helpers/constants';
import {
DAY,
HOUR,
STATS_INTERVALS_DAYS,
TIME_UNITS,
} from '../helpers/constants';
import * as actions from '../actions/stats';
@@ -18,6 +23,7 @@ const defaultStats = {
numReplacedSafebrowsing: 0,
numReplacedSafesearch: 0,
avgProcessingTime: 0,
timeUnits: TIME_UNITS.HOURS,
};
const stats = handleActions(
@@ -60,6 +66,7 @@ const stats = handleActions(
avg_processing_time: avgProcessingTime,
top_upstreams_responses: topUpstreamsResponses,
top_upstrems_avg_time: topUpstreamsAvgTime,
time_units: timeUnits,
} = payload;
const newState = {
@@ -81,6 +88,7 @@ const stats = handleActions(
avgProcessingTime,
topUpstreamsResponses,
topUpstreamsAvgTime,
timeUnits,
};
return newState;

42
go.mod
View File

@@ -3,9 +3,9 @@ module github.com/AdguardTeam/AdGuardHome
go 1.20
require (
github.com/AdguardTeam/dnsproxy v0.54.0
github.com/AdguardTeam/golibs v0.15.0
github.com/AdguardTeam/urlfilter v0.17.0
github.com/AdguardTeam/dnsproxy v0.57.3
github.com/AdguardTeam/golibs v0.17.2
github.com/AdguardTeam/urlfilter v0.17.3
github.com/NYTimes/gziphandler v1.1.1
github.com/ameshkov/dnscrypt/v2 v2.2.7
github.com/bluele/gcache v0.0.2
@@ -13,11 +13,11 @@ require (
github.com/dimfeld/httptreemux/v5 v5.5.0
github.com/fsnotify/fsnotify v1.6.0
github.com/go-ping/ping v1.1.0
github.com/google/go-cmp v0.5.9
github.com/google/go-cmp v0.6.0
github.com/google/gopacket v1.1.19
github.com/google/renameio/v2 v2.0.0
github.com/google/uuid v1.3.1
github.com/insomniacslk/dhcp v0.0.0-20230816195147-b3ca2534940d
github.com/insomniacslk/dhcp v0.0.0-20231016090811-6a2c8fbdcc1c
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
@@ -26,15 +26,15 @@ require (
// TODO(a.garipov): This package is deprecated; find a new one or use our
// own code for that. Perhaps, use gopacket.
github.com/mdlayher/raw v0.1.0
github.com/miekg/dns v1.1.55
github.com/quic-go/quic-go v0.38.0
github.com/miekg/dns v1.1.56
github.com/quic-go/quic-go v0.39.2
github.com/stretchr/testify v1.8.4
github.com/ti-mo/netfilter v0.5.0
github.com/ti-mo/netfilter v0.5.1
go.etcd.io/bbolt v1.3.7
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
golang.org/x/crypto v0.14.0
golang.org/x/exp v0.0.0-20231006140011-7918f672742d
golang.org/x/net v0.17.0
golang.org/x/sys v0.13.0
gopkg.in/natefinch/lumberjack.v2 v2.2.1
gopkg.in/yaml.v3 v3.0.1
howett.net/plist v1.0.0
@@ -47,19 +47,19 @@ require (
github.com/beefsack/go-rate v0.0.0-20220214233405-116f4ca011a0 // indirect
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-20230821062121-407c9e7a662f // indirect
github.com/mdlayher/socket v0.4.1 // indirect
github.com/onsi/ginkgo/v2 v2.12.0 // indirect
github.com/google/pprof v0.0.0-20230926050212-f7f687d19a98 // indirect
github.com/mdlayher/socket v0.5.0 // indirect
github.com/onsi/ginkgo/v2 v2.13.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-20 v0.3.3 // indirect
github.com/quic-go/qtls-go1-20 v0.3.4 // 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.12.0 // indirect
golang.org/x/tools v0.12.1-0.20230815132531-74c255bcf846 // indirect
go.uber.org/mock v0.3.0 // indirect
golang.org/x/mod v0.13.0 // indirect
golang.org/x/sync v0.4.0 // indirect
golang.org/x/text v0.13.0 // indirect
golang.org/x/tools v0.14.0 // indirect
)

93
go.sum
View File

@@ -1,9 +1,9 @@
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/AdguardTeam/dnsproxy v0.57.3 h1:0v7D+LQrOL2k2fvkG3Ft3Cn3ayUsvAdlOlJR+gLxSGA=
github.com/AdguardTeam/dnsproxy v0.57.3/go.mod h1:ZvkbM71HwpilgkCnTubDiR4Ba6x5Qvnhy2iasMWaTDM=
github.com/AdguardTeam/golibs v0.17.2 h1:vg6wHMjUKscnyPGRvxS5kAt7Uw4YxcJiITZliZ476W8=
github.com/AdguardTeam/golibs v0.17.2/go.mod h1:DKhCIXHcUYtBhU8ibTLKh1paUL96n5zhQBlx763sj+U=
github.com/AdguardTeam/urlfilter v0.17.3 h1:fg/ObbnO0Cv6aw0tW6N/ETDMhhNvmcUUOZ7HlmKC3rw=
github.com/AdguardTeam/urlfilter v0.17.3/go.mod h1:Jru7jFfeH2CoDf150uDs+rRYcZBzHHBz05r9REyDKyE=
github.com/NYTimes/gziphandler v1.1.1 h1:ZUDjpQae29j0ryrS0u/B8HZfJBtBQHjqw2rQ2cqUQ3I=
github.com/NYTimes/gziphandler v1.1.1/go.mod h1:n/CVRwUEOgIxrgPvAQhUUr9oeUtvrhMomdKFjzJNB0c=
github.com/aead/chacha20 v0.0.0-20180709150244-8b13a72661da h1:KjTM2ks9d14ZYCvmHS9iAKVt9AyzRSqNU1qabPih5BY=
@@ -33,26 +33,24 @@ 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=
github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572/go.mod h1:9Pwr4B2jHnOSGXyyzV8ROjYa2ojvAY6HCGYYfMoC3Ls=
github.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc=
github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs=
github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg=
github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE=
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/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=
github.com/google/go-cmp v0.6.0/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-20230821062121-407c9e7a662f h1:pDhu5sgp8yJlEF/g6osliIIpF9K4F5jvkULXa4daRDQ=
github.com/google/pprof v0.0.0-20230821062121-407c9e7a662f/go.mod h1:czg5+yv1E0ZGTi6S6vVK1mke0fV+FaUhNGcd6VRS9Ik=
github.com/google/pprof v0.0.0-20230926050212-f7f687d19a98 h1:pUa4ghanp6q4IJHwE9RwLgmVFfReJN+KbQ8ExNEUUoQ=
github.com/google/pprof v0.0.0-20230926050212-f7f687d19a98/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.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-20230816195147-b3ca2534940d h1:Ka64cclWedOkGzm9M2/XYuwJUdmWRUozmsxW0PyKA3A=
github.com/insomniacslk/dhcp v0.0.0-20230816195147-b3ca2534940d/go.mod h1:7474bZ1YNCvarT6WFKie4kEET6J0KYRDC4XJqqXzQW4=
github.com/insomniacslk/dhcp v0.0.0-20231016090811-6a2c8fbdcc1c h1:PgxFEySCI41sH0mB7/2XswdXbUykQsRUGod8Rn+NubM=
github.com/insomniacslk/dhcp v0.0.0-20231016090811-6a2c8fbdcc1c/go.mod h1:3A9PQ1cunSDF/1rbTq99Ts4pVnycWg+vlPkfeD2NLFI=
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=
@@ -73,13 +71,13 @@ github.com/mdlayher/packet v1.1.2/go.mod h1:GEu1+n9sG5VtiRE4SydOmX5GTwyyYlteZiFU
github.com/mdlayher/raw v0.1.0 h1:K4PFMVy+AFsp0Zdlrts7yNhxc/uXoPVHi9RzRvtZF2Y=
github.com/mdlayher/raw v0.1.0/go.mod h1:yXnxvs6c0XoF/aK52/H5PjsVHmWBCFfZUfoh/Y5s9Sg=
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.55 h1:GoQ4hpsj0nFLYe+bWiCToyrBEJXkQfOOIvFGFy0lEgo=
github.com/miekg/dns v1.1.55/go.mod h1:uInx36IzPl7FYnDcMeVWxj9byh7DutNykX4G9Sj60FY=
github.com/mdlayher/socket v0.5.0 h1:ilICZmJcQz70vrWVes1MFera4jGiWNocSkykwwoy3XI=
github.com/mdlayher/socket v0.5.0/go.mod h1:WkcBFfvyG8QENs5+hfQPl1X6Jpd2yeLIYgrGFmJiJxI=
github.com/miekg/dns v1.1.56 h1:5imZaSeoRNvpM9SzWNhEcP9QliKiz20/dA2QabIGVnE=
github.com/miekg/dns v1.1.56/go.mod h1:cRm6Oo2C8TY9ZS/TqsSrseAcncm74lfK5G+ikN2SWWY=
github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e h1:fD57ERR4JtEqsWbfPhv4DMiApHyliiK5xCTNVSPiaAs=
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/ginkgo/v2 v2.13.0 h1:0jY9lJquiL8fcf3M4LAXN5aMlS/b2BV86HFFPCPMgE4=
github.com/onsi/ginkgo/v2 v2.13.0/go.mod h1:TE309ZR8s5FsKKpuB1YAQYBzCaAfUgatB/xlT/ETL/o=
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=
@@ -94,10 +92,10 @@ github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZN
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-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/quic-go/qtls-go1-20 v0.3.4 h1:MfFAPULvst4yoMgY9QmtpYmfij/em7O8UUi+bNVm7Cg=
github.com/quic-go/qtls-go1-20 v0.3.4/go.mod h1:X9Nh97ZL80Z+bX/gUXMbipO6OxdiDi58b/fMC9mAL+k=
github.com/quic-go/quic-go v0.39.2 h1:hmwAf8zAHlvan0Y5PXxeeBFZEW17IW99sXLry8I2kjk=
github.com/quic-go/quic-go v0.39.2/go.mod h1:T09QsDQWjLiQ74ZmacDfqZmhY/NLnw5BC40MANNNZ1Q=
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=
@@ -107,40 +105,39 @@ github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/
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/ti-mo/netfilter v0.5.1 h1:cqamEd1c1zmpfpqvInLOro0Znq/RAfw2QL5wL2rAR/8=
github.com/ti-mo/netfilter v0.5.1/go.mod h1:h9UPQ3ZrTZGBitay+LETMxZvNgWGK/efTUcqES2YiLw=
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=
go.uber.org/mock v0.3.0 h1:3mUxI1No2/60yUYax92Pt8eNOEecx2D3lcXZh2NEZJo=
go.uber.org/mock v0.3.0/go.mod h1:a6FSlNadKUHUa9IP5Vyt1zh4fC7uAwxMutEAscFbkZc=
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.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/crypto v0.14.0 h1:wBqGXzWJW6m1XrIKlAH0Hs1JJ7+9KBwnIO8v66Q9cHc=
golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4=
golang.org/x/exp v0.0.0-20231006140011-7918f672742d h1:jtJma62tbqLibJ5sFQz8bKtEM8rJBtfilJ2qTU199MI=
golang.org/x/exp v0.0.0-20231006140011-7918f672742d/go.mod h1:ldy0pHrwJyGW56pPQzzkH36rKxoZW1tw7ZJpeKx+hdo=
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=
golang.org/x/mod v0.12.0 h1:rmsUpXtvNzj340zd98LZ4KntptpfRHwpFOHG188oHXc=
golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
golang.org/x/mod v0.13.0 h1:I/DsJXRlw/8l/0c24sM9yb0T4z9liZTduXvdAWYiysY=
golang.org/x/mod v0.13.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c=
golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
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-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.14.0 h1:BONx9s002vGdD9umnlX1Po8vOZmrgH34qlHcD1MfK14=
golang.org/x/net v0.14.0/go.mod h1:PpSgVXXLK0OxS0F31C1/tv6XNguvCrnXIDrFMspZIUI=
golang.org/x/net v0.17.0 h1:pVaXccu2ozPjCXewfr1S7xza/zcXTity9cCdXQYSjIM=
golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE=
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=
golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y=
golang.org/x/sync v0.4.0 h1:zxkM55ReGkDlKSM+Fu41A+zmbZuaPVbGMzvvdUPznYQ=
golang.org/x/sync v0.4.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y=
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
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=
@@ -148,30 +145,24 @@ golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7w
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-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-20210510120138-977fb7262007/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.11.0 h1:eG7RXZHdqOJ1i+0lgLgCpSXAp6M3LYlAo6osgSi0xOM=
golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.13.0 h1:Af8nKPmuFypiUBjVoU9V20FiaFXOcuZI21p0ycVYYGE=
golang.org/x/sys v0.13.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.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
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/text v0.13.0 h1:ablQoSUd0tRdKxZewP80B+BaqeKJuVhuRxj/dkrun3k=
golang.org/x/text v0.13.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.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/tools v0.14.0 h1:jvNa2pY0M4r62jkRQ6RwEZZyPcymeL9XZMLBbV7U2nc=
golang.org/x/tools v0.14.0/go.mod h1:uYBEerGOWcJyEORxN+Ek8+TT266gXkNlHdJBwexUsBg=
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=
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
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=

View File

@@ -0,0 +1,102 @@
package aghalg
import (
"github.com/AdguardTeam/golibs/errors"
)
// RingBuffer is the implementation of ring buffer data structure.
type RingBuffer[T any] struct {
buf []T
cur int
full bool
}
// NewRingBuffer initializes the new instance of ring buffer. size must be
// greater or equal to zero.
func NewRingBuffer[T any](size int) (rb *RingBuffer[T]) {
if size < 0 {
panic(errors.Error("ring buffer: size must be greater or equal to zero"))
}
return &RingBuffer[T]{
buf: make([]T, size),
}
}
// Append appends an element to the buffer.
func (rb *RingBuffer[T]) Append(e T) {
if len(rb.buf) == 0 {
return
}
rb.buf[rb.cur] = e
rb.cur = (rb.cur + 1) % cap(rb.buf)
if rb.cur == 0 {
rb.full = true
}
}
// Range calls cb for each element of the buffer. If cb returns false it stops.
func (rb *RingBuffer[T]) Range(cb func(T) (cont bool)) {
before, after := rb.splitCur()
for _, e := range before {
if !cb(e) {
return
}
}
for _, e := range after {
if !cb(e) {
return
}
}
}
// ReverseRange calls cb for each element of the buffer in reverse order. If
// cb returns false it stops.
func (rb *RingBuffer[T]) ReverseRange(cb func(T) (cont bool)) {
before, after := rb.splitCur()
for i := len(after) - 1; i >= 0; i-- {
if !cb(after[i]) {
return
}
}
for i := len(before) - 1; i >= 0; i-- {
if !cb(before[i]) {
return
}
}
}
// splitCur splits the buffer in two, before and after current position in
// chronological order. If buffer is not full, after is nil.
func (rb *RingBuffer[T]) splitCur() (before, after []T) {
if len(rb.buf) == 0 {
return nil, nil
}
cur := rb.cur
if !rb.full {
return rb.buf[:cur], nil
}
return rb.buf[cur:], rb.buf[:cur]
}
// Len returns a length of the buffer.
func (rb *RingBuffer[T]) Len() (l int) {
if !rb.full {
return rb.cur
}
return cap(rb.buf)
}
// Clear clears the buffer.
func (rb *RingBuffer[T]) Clear() {
rb.full = false
rb.cur = 0
}

View File

@@ -0,0 +1,173 @@
package aghalg_test
import (
"testing"
"github.com/AdguardTeam/AdGuardHome/internal/aghalg"
"github.com/stretchr/testify/assert"
"golang.org/x/exp/slices"
)
// elements is a helper function that returns n elements of the buffer.
func elements(b *aghalg.RingBuffer[int], n int, reverse bool) (es []int) {
fn := b.Range
if reverse {
fn = b.ReverseRange
}
i := 0
fn(func(e int) (cont bool) {
if i >= n {
return false
}
es = append(es, e)
i++
return true
})
return es
}
func TestNewRingBuffer(t *testing.T) {
t.Run("success_and_clear", func(t *testing.T) {
b := aghalg.NewRingBuffer[int](5)
for i := 0; i < 10; i++ {
b.Append(i)
}
assert.Equal(t, []int{5, 6, 7, 8, 9}, elements(b, b.Len(), false))
b.Clear()
assert.Zero(t, b.Len())
})
t.Run("negative_size", func(t *testing.T) {
assert.PanicsWithError(t, "ring buffer: size must be greater or equal to zero", func() {
aghalg.NewRingBuffer[int](-5)
})
})
t.Run("zero", func(t *testing.T) {
b := aghalg.NewRingBuffer[int](0)
for i := 0; i < 10; i++ {
b.Append(i)
assert.Equal(t, 0, b.Len())
assert.Empty(t, elements(b, b.Len(), false))
assert.Empty(t, elements(b, b.Len(), true))
}
})
t.Run("single", func(t *testing.T) {
b := aghalg.NewRingBuffer[int](1)
for i := 0; i < 10; i++ {
b.Append(i)
assert.Equal(t, 1, b.Len())
assert.Equal(t, []int{i}, elements(b, b.Len(), false))
assert.Equal(t, []int{i}, elements(b, b.Len(), true))
}
})
}
func TestRingBuffer_Range(t *testing.T) {
const size = 5
b := aghalg.NewRingBuffer[int](size)
testCases := []struct {
name string
want []int
count int
length int
}{{
name: "three",
count: 3,
length: 3,
want: []int{0, 1, 2},
}, {
name: "ten",
count: 10,
length: size,
want: []int{5, 6, 7, 8, 9},
}, {
name: "hundred",
count: 100,
length: size,
want: []int{95, 96, 97, 98, 99},
}}
for _, tc := range testCases {
t.Run(tc.name, func(t *testing.T) {
for i := 0; i < tc.count; i++ {
b.Append(i)
}
bufLen := b.Len()
assert.Equal(t, tc.length, bufLen)
want := tc.want
assert.Equal(t, want, elements(b, bufLen, false))
assert.Equal(t, want[:len(want)-1], elements(b, bufLen-1, false))
assert.Equal(t, want[:len(want)/2], elements(b, bufLen/2, false))
want = want[:cap(want)]
slices.Reverse(want)
assert.Equal(t, want, elements(b, bufLen, true))
assert.Equal(t, want[:len(want)-1], elements(b, bufLen-1, true))
assert.Equal(t, want[:len(want)/2], elements(b, bufLen/2, true))
})
}
}
func TestRingBuffer_Range_increment(t *testing.T) {
const size = 5
b := aghalg.NewRingBuffer[int](size)
testCases := []struct {
name string
want []int
}{{
name: "one",
want: []int{0},
}, {
name: "two",
want: []int{0, 1},
}, {
name: "three",
want: []int{0, 1, 2},
}, {
name: "four",
want: []int{0, 1, 2, 3},
}, {
name: "five",
want: []int{0, 1, 2, 3, 4},
}, {
name: "six",
want: []int{1, 2, 3, 4, 5},
}, {
name: "seven",
want: []int{2, 3, 4, 5, 6},
}, {
name: "eight",
want: []int{3, 4, 5, 6, 7},
}, {
name: "nine",
want: []int{4, 5, 6, 7, 8},
}, {
name: "ten",
want: []int{5, 6, 7, 8, 9},
}}
for i, tc := range testCases {
t.Run(tc.name, func(t *testing.T) {
b.Append(i)
assert.Equal(t, tc.want, elements(b, b.Len(), false))
slices.Reverse(tc.want)
assert.Equal(t, tc.want, elements(b, b.Len(), true))
})
}
}

View File

@@ -1,60 +0,0 @@
// Package aghio contains extensions for io package's types and methods
package aghio
import (
"fmt"
"io"
"github.com/AdguardTeam/golibs/errors"
"github.com/AdguardTeam/golibs/mathutil"
)
// LimitReachedError records the limit and the operation that caused it.
type LimitReachedError struct {
Limit int64
}
// Error implements the [error] interface for *LimitReachedError.
//
// TODO(a.garipov): Think about error string format.
func (lre *LimitReachedError) Error() string {
return fmt.Sprintf("attempted to read more than %d bytes", lre.Limit)
}
// limitedReader is a wrapper for [io.Reader] limiting the input and dealing
// with errors package.
type limitedReader struct {
r io.Reader
limit int64
n int64
}
// Read implements the [io.Reader] interface.
func (lr *limitedReader) Read(p []byte) (n int, err error) {
if lr.n == 0 {
return 0, &LimitReachedError{
Limit: lr.limit,
}
}
p = p[:mathutil.Min(lr.n, int64(len(p)))]
n, err = lr.r.Read(p)
lr.n -= int64(n)
return n, err
}
// LimitReader wraps Reader to make it's Reader stop with ErrLimitReached after
// n bytes read.
func LimitReader(r io.Reader, n int64) (limited io.Reader, err error) {
if n < 0 {
return nil, errors.Error("limit must be non-negative")
}
return &limitedReader{
r: r,
limit: n,
n: n,
}, nil
}

View File

@@ -1,96 +0,0 @@
package aghio_test
import (
"io"
"strings"
"testing"
"github.com/AdguardTeam/AdGuardHome/internal/aghio"
"github.com/AdguardTeam/golibs/testutil"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)
func TestLimitReader(t *testing.T) {
testCases := []struct {
wantErrMsg string
name string
n int64
}{{
wantErrMsg: "",
name: "positive",
n: 1,
}, {
wantErrMsg: "",
name: "zero",
n: 0,
}, {
wantErrMsg: "limit must be non-negative",
name: "negative",
n: -1,
}}
for _, tc := range testCases {
t.Run(tc.name, func(t *testing.T) {
_, err := aghio.LimitReader(nil, tc.n)
testutil.AssertErrorMsg(t, tc.wantErrMsg, err)
})
}
}
func TestLimitedReader_Read(t *testing.T) {
testCases := []struct {
err error
name string
rStr string
limit int64
want int
}{{
err: nil,
name: "perfectly_match",
rStr: "abc",
limit: 3,
want: 3,
}, {
err: io.EOF,
name: "eof",
rStr: "",
limit: 3,
want: 0,
}, {
err: &aghio.LimitReachedError{
Limit: 0,
},
name: "limit_reached",
rStr: "abc",
limit: 0,
want: 0,
}, {
err: nil,
name: "truncated",
rStr: "abc",
limit: 2,
want: 2,
}}
for _, tc := range testCases {
readCloser := io.NopCloser(strings.NewReader(tc.rStr))
lreader, err := aghio.LimitReader(readCloser, tc.limit)
require.NoError(t, err)
require.NotNil(t, lreader)
t.Run(tc.name, func(t *testing.T) {
buf := make([]byte, tc.limit+1)
n, rerr := lreader.Read(buf)
require.Equal(t, rerr, tc.err)
assert.Equal(t, tc.want, n)
})
}
}
func TestLimitedReader_LimitReachedError(t *testing.T) {
testutil.AssertErrorMsg(t, "attempted to read more than 0 bytes", &aghio.LimitReachedError{
Limit: 0,
})
}

View File

@@ -12,12 +12,12 @@ import (
// listenPacketReusable announces on the local network address additionally
// configuring the socket to have a reusable binding.
func listenPacketReusable(ifaceName, network, address string) (c net.PacketConn, err error) {
var port int
var port uint16
_, port, err = netutil.SplitHostPort(address)
if err != nil {
return nil, err
}
// TODO(e.burkov): Inspect nclient4.NewRawUDPConn and implement here.
return nclient4.NewRawUDPConn(ifaceName, port)
return nclient4.NewRawUDPConn(ifaceName, int(port))
}

View File

@@ -9,6 +9,7 @@ import (
"io"
"net"
"net/netip"
"net/url"
"syscall"
"github.com/AdguardTeam/AdGuardHome/internal/aghos"
@@ -263,7 +264,7 @@ func IsAddrInUse(err error) (ok bool) {
// CollectAllIfacesAddrs returns the slice of all network interfaces IP
// addresses without port number.
func CollectAllIfacesAddrs() (addrs []string, err error) {
func CollectAllIfacesAddrs() (addrs []netip.Addr, err error) {
var ifaceAddrs []net.Addr
ifaceAddrs, err = netInterfaceAddrs()
if err != nil {
@@ -271,19 +272,41 @@ func CollectAllIfacesAddrs() (addrs []string, err error) {
}
for _, addr := range ifaceAddrs {
cidr := addr.String()
var ip net.IP
ip, _, err = net.ParseCIDR(cidr)
var p netip.Prefix
p, err = netip.ParsePrefix(addr.String())
if err != nil {
return nil, fmt.Errorf("parsing cidr: %w", err)
// Don't wrap the error since it's informative enough as is.
return nil, err
}
addrs = append(addrs, ip.String())
addrs = append(addrs, p.Addr())
}
return addrs, nil
}
// ParseAddrPort parses an [netip.AddrPort] from s, which should be either a
// valid IP, optionally with port, or a valid URL with plain IP address. The
// defaultPort is used if s doesn't contain port number.
func ParseAddrPort(s string, defaultPort uint16) (ipp netip.AddrPort, err error) {
u, err := url.Parse(s)
if err == nil && u.Host != "" {
s = u.Host
}
ipp, err = netip.ParseAddrPort(s)
if err != nil {
ip, parseErr := netip.ParseAddr(s)
if parseErr != nil {
return ipp, errors.Join(err, parseErr)
}
return netip.AddrPortFrom(ip, defaultPort), nil
}
return ipp, nil
}
// BroadcastFromPref calculates the broadcast IP address for p.
func BroadcastFromPref(p netip.Prefix) (bc netip.Addr) {
bc = p.Addr().Unmap()

View File

@@ -230,7 +230,7 @@ func TestCollectAllIfacesAddrs(t *testing.T) {
name string
wantErrMsg string
addrs []net.Addr
wantAddrs []string
wantAddrs []netip.Addr
}{{
name: "success",
wantErrMsg: ``,
@@ -241,10 +241,13 @@ func TestCollectAllIfacesAddrs(t *testing.T) {
IP: net.IP{4, 3, 2, 1},
Mask: net.CIDRMask(16, netutil.IPv4BitLen),
}},
wantAddrs: []string{"1.2.3.4", "4.3.2.1"},
wantAddrs: []netip.Addr{
netip.MustParseAddr("1.2.3.4"),
netip.MustParseAddr("4.3.2.1"),
},
}, {
name: "not_cidr",
wantErrMsg: `parsing cidr: invalid CIDR address: 1.2.3.4`,
wantErrMsg: `netip.ParsePrefix("1.2.3.4"): no '/'`,
addrs: []net.Addr{&net.IPAddr{
IP: net.IP{1, 2, 3, 4},
}},
@@ -269,12 +272,11 @@ func TestCollectAllIfacesAddrs(t *testing.T) {
t.Run("internal_error", func(t *testing.T) {
const errAddrs errors.Error = "can't get addresses"
const wantErrMsg string = `getting interfaces addresses: ` + string(errAddrs)
substNetInterfaceAddrs(t, func() ([]net.Addr, error) { return nil, errAddrs })
_, err := CollectAllIfacesAddrs()
testutil.AssertErrorMsg(t, wantErrMsg, err)
assert.ErrorIs(t, err, errAddrs)
})
}

View File

@@ -2,10 +2,16 @@ package aghnet_test
import (
"io/fs"
"net"
"net/netip"
"net/url"
"os"
"testing"
"github.com/AdguardTeam/AdGuardHome/internal/aghnet"
"github.com/AdguardTeam/golibs/netutil"
"github.com/AdguardTeam/golibs/testutil"
"github.com/stretchr/testify/assert"
)
func TestMain(m *testing.M) {
@@ -14,3 +20,76 @@ func TestMain(m *testing.M) {
// testdata is the filesystem containing data for testing the package.
var testdata fs.FS = os.DirFS("./testdata")
func TestParseAddrPort(t *testing.T) {
const defaultPort = 1
v4addr := netip.MustParseAddr("1.2.3.4")
testCases := []struct {
name string
input string
wantErrMsg string
want netip.AddrPort
}{{
name: "success_ip",
input: v4addr.String(),
wantErrMsg: "",
want: netip.AddrPortFrom(v4addr, defaultPort),
}, {
name: "success_ip_port",
input: netutil.JoinHostPort(v4addr.String(), 5),
wantErrMsg: "",
want: netip.AddrPortFrom(v4addr, 5),
}, {
name: "success_url",
input: (&url.URL{
Scheme: "tcp",
Host: v4addr.String(),
}).String(),
wantErrMsg: "",
want: netip.AddrPortFrom(v4addr, defaultPort),
}, {
name: "success_url_port",
input: (&url.URL{
Scheme: "tcp",
Host: netutil.JoinHostPort(v4addr.String(), 5),
}).String(),
wantErrMsg: "",
want: netip.AddrPortFrom(v4addr, 5),
}, {
name: "error_invalid_ip",
input: "256.256.256.256",
wantErrMsg: `not an ip:port
ParseAddr("256.256.256.256"): IPv4 field has value >255`,
want: netip.AddrPort{},
}, {
name: "error_invalid_port",
input: net.JoinHostPort(v4addr.String(), "-5"),
wantErrMsg: `invalid port "-5" parsing "1.2.3.4:-5"
ParseAddr("1.2.3.4:-5"): unexpected character (at ":-5")`,
want: netip.AddrPort{},
}, {
name: "error_invalid_url",
input: "tcp:://1.2.3.4",
wantErrMsg: `invalid port "//1.2.3.4" parsing "tcp:://1.2.3.4"
ParseAddr("tcp:://1.2.3.4"): each colon-separated field must have at least ` +
`one digit (at "tcp:://1.2.3.4")`,
want: netip.AddrPort{},
}, {
name: "empty",
input: "",
want: netip.AddrPort{},
wantErrMsg: `not an ip:port
ParseAddr(""): unable to parse IP`,
}}
for _, tc := range testCases {
t.Run(tc.name, func(t *testing.T) {
ap, err := aghnet.ParseAddrPort(tc.input, defaultPort)
testutil.AssertErrorMsg(t, tc.wantErrMsg, err)
assert.Equal(t, tc.want, ap)
})
}
}

View File

@@ -1,36 +0,0 @@
package aghnet
// DefaultRefreshIvl is the default period of time between refreshing cached
// addresses.
// const DefaultRefreshIvl = 5 * time.Minute
// HostGenFunc is the signature for functions generating fake hostnames. The
// implementation must be safe for concurrent use.
type HostGenFunc func() (host string)
// SystemResolvers helps to work with local resolvers' addresses provided by OS.
type SystemResolvers interface {
// Get returns the slice of local resolvers' addresses. It must be safe for
// concurrent use.
Get() (rs []string)
// refresh refreshes the local resolvers' addresses cache. It must be safe
// for concurrent use.
refresh() (err error)
}
// NewSystemResolvers returns a SystemResolvers with the cache refresh rate
// defined by refreshIvl. It disables auto-refreshing if refreshIvl is 0. If
// nil is passed for hostGenFunc, the default generator will be used.
func NewSystemResolvers(
hostGenFunc HostGenFunc,
) (sr SystemResolvers, err error) {
sr = newSystemResolvers(hostGenFunc)
// Fill cache.
err = sr.refresh()
if err != nil {
return nil, err
}
return sr, nil
}

Some files were not shown because too many files have changed in this diff Show More