Compare commits

...

400 Commits

Author SHA1 Message Date
Andrey Meshkov
041ea65d14 Merge: - DNS: configuration settings were not applied until full restart
* commit 'd65cdd4544efdecb9bbe36e411c0bbcb6475ba94':
  - DNS: configuration settings were not applied until full restart
2019-12-19 15:03:13 +03:00
Simon Zolin
d65cdd4544 - DNS: configuration settings were not applied until full restart 2019-12-19 14:49:15 +03:00
Andrey Meshkov
cde15afd90 *: use npm ci for more reliable builds 2019-12-19 13:28:08 +03:00
Andrey Meshkov
00fabb0ecf Merge: + client: add X-DNS-Prefetch-Control meta tag
* commit '073643537612437430c7035cda679a758ca94d13':
  + client: add meta tag to index.html
  + client: add X-DNS-Prefetch-Control meta tag
2019-12-19 12:16:13 +03:00
Ildar Kamalov
0736435376 + client: add meta tag to index.html 2019-12-19 12:13:15 +03:00
Andrey Meshkov
f6976f3c7e Merge: - DNS: set RecursionAvailable flag in response message
* commit '4540a4e94ad204fc1cba9e15b95ce9b684ed2335':
  - DNS: set RecursionAvailable flag in response message
2019-12-19 12:09:32 +03:00
Simon Zolin
4540a4e94a - DNS: set RecursionAvailable flag in response message 2019-12-19 11:52:21 +03:00
Ildar Kamalov
bf410c81ae + client: add X-DNS-Prefetch-Control meta tag 2019-12-19 10:23:04 +03:00
Andrey Meshkov
b54bf94697 Merge: - client: hide dns is starting message by default
* commit '7fade498b910a2492b2e214f0b2a706b51548b34':
  - client: add setDnsRunningStatus action
  - client: save in store dnsStatus even if running false
  - client: hide dns is starting message by default
2019-12-17 22:35:34 +03:00
Artem Baskal
7fade498b9 - client: add setDnsRunningStatus action 2019-12-17 18:54:28 +03:00
Artem Baskal
39640d8190 - client: save in store dnsStatus even if running false 2019-12-17 17:46:59 +03:00
Artem Baskal
242e5e136f - client: hide dns is starting message by default 2019-12-17 16:15:44 +03:00
Simon Zolin
b105f20837 Merge: - DNS: fix slow response to /status and /access/list requests
Close #1264

* commit '8521635f63e9570a4e75033533dec8180e7f130a':
  - DNS: fix slow response to /status and /access/list requests
2019-12-17 15:11:48 +03:00
Simon Zolin
8521635f63 - DNS: fix slow response to /status and /access/list requests 2019-12-17 13:09:03 +03:00
Simon Zolin
04de9d0f7b Merge: - DNS: "custom_ip" blocking mode didn't work after app restart
Close #1262

Squashed commit of the following:

commit bacd683ef5b52e275323a3c07b370ca08702403e
Author: Simon Zolin <s.zolin@adguard.com>
Date:   Mon Dec 16 17:00:49 2019 +0300

    fix

commit 3d4f9626460de3e13a621f2b8e535e9e0939e2bb
Author: Simon Zolin <s.zolin@adguard.com>
Date:   Mon Dec 16 16:54:23 2019 +0300

    fix

commit bf924bf90e9b705883bec88f8d7af11c39c1f322
Author: Simon Zolin <s.zolin@adguard.com>
Date:   Mon Dec 16 16:45:41 2019 +0300

    add test

commit 43338ea3645a025d69dd838bc732344255960bed
Author: Simon Zolin <s.zolin@adguard.com>
Date:   Mon Dec 16 16:07:51 2019 +0300

    - DNS: "custom_ip" blocking mode didn't work after app restart

commit 220f32e713a95d2c67355c61e419dd09df9d42b2
Author: Simon Zolin <s.zolin@adguard.com>
Date:   Mon Dec 16 15:46:01 2019 +0300

    - first run: fix panic on stop in case initialization didn't complete

    e.g. when Stats module can't be initialized because of incompatible file system
2019-12-16 17:04:30 +03:00
Simon Zolin
6a2430b799 Merge: - clients: IPv6 address matching didn't work
Close #1261

Squashed commit of the following:

commit acc39ea6c0d88cb9d2b07837e89db2c170263891
Author: Simon Zolin <s.zolin@adguard.com>
Date:   Mon Dec 16 12:29:33 2019 +0300

    minor

commit 0d2ef3d53185d5ca17797e2ac20f0efc1498a53c
Author: Simon Zolin <s.zolin@adguard.com>
Date:   Mon Dec 16 12:13:17 2019 +0300

    add link to GH

commit 0da754b1751057968780b457a2f490f4148275a8
Author: Simon Zolin <s.zolin@adguard.com>
Date:   Mon Dec 16 11:53:42 2019 +0300

    - clients: IPv6 address matching didn't work
2019-12-16 12:36:52 +03:00
Simon Zolin
d9ee9b88d6 Merge: Revert "Merge: + DNS: TLS handshake: terminate handshake on bad SNI"
* commit 'b00a789ca34008dfe9e4cfdb0b2d4d63874957ff':
  Revert "Merge: + DNS: TLS handshake: terminate handshake on bad SNI"
2019-12-13 17:42:57 +03:00
Simon Zolin
864c91e524 Merge: - DNS: fix security checks via PC/SB services
Squashed commit of the following:

commit e73bc282d77a11c923a86166035f1b44427d7066
Author: Simon Zolin <s.zolin@adguard.com>
Date:   Fri Dec 13 17:17:36 2019 +0300

    fix

commit f8b5c174816c6fd57fb3930cc465318f468fc8ff
Author: Simon Zolin <s.zolin@adguard.com>
Date:   Fri Dec 13 17:03:13 2019 +0300

    fix

commit 9d5483a2fb89a172218547b5ee356e7122dca609
Author: Simon Zolin <s.zolin@adguard.com>
Date:   Fri Dec 13 16:54:30 2019 +0300

    - fix security checks via PC/SB services
2019-12-13 17:42:01 +03:00
Simon Zolin
b00a789ca3 Revert "Merge: + DNS: TLS handshake: terminate handshake on bad SNI"
This reverts commit c8c76ae12b.
2019-12-13 17:38:17 +03:00
Simon Zolin
42790bf083 Merge: * client: correction on message toast
* commit '4942d0c39f2b078ba25993151e7ee59fa0e969b8':
  * client: correction on message toast
2019-12-13 14:02:13 +03:00
Fresnel Vincent
4942d0c39f * client: correction on message toast
fix #1255
2019-12-13 13:50:42 +03:00
Andrey Meshkov
af7f51d9b9 Merge branch 'master' of ssh://bit.adguard.com:7999/dns/adguard-home 2019-12-13 13:31:13 +03:00
Andrey Meshkov
3d280c5d92 *: run travis in AG repo only 2019-12-13 13:31:10 +03:00
Simon Zolin
c8c76ae12b Merge: + DNS: TLS handshake: terminate handshake on bad SNI
Close #1014

Squashed commit of the following:

commit 759248efc0587ff2f288996c47739e602c557a76
Author: Simon Zolin <s.zolin@adguard.com>
Date:   Thu Dec 12 19:26:46 2019 +0300

    support empty ServerName

commit 68afecd5eca5ae66262b12dcb414b50efe88dc02
Author: Simon Zolin <s.zolin@adguard.com>
Date:   Wed Dec 11 14:40:22 2019 +0300

    + DNS: TLS handshake: terminate handshake on bad SNI
2019-12-13 13:06:37 +03:00
Simon Zolin
aa202277fb Merge: * update translations
Close #1250

Squashed commit of the following:

commit e722a3e3b4b1049c5df22b3f11b5826992d3cc6c
Author: Simon Zolin <s.zolin@adguard.com>
Date:   Thu Dec 12 18:27:51 2019 +0300

    update ru

commit 086e722a4dc1922ac7b8aff537050689900a8bd0
Author: Simon Zolin <s.zolin@adguard.com>
Date:   Thu Dec 12 18:15:15 2019 +0300

    fix cloudflare -> quad9, update es

commit 86c235936d2f86e536f45fc475f29b43eb695e3d
Author: Simon Zolin <s.zolin@adguard.com>
Date:   Thu Dec 12 18:01:20 2019 +0300

    * update es, ru, sr-cs

commit 2b6b510b998b7e7b2f4c3fa5d7af57dc5413a611
Author: Simon Zolin <s.zolin@adguard.com>
Date:   Thu Dec 12 17:43:05 2019 +0300

    * update 'no'

commit 1de6215aa90374ee147bbd0a685643232e98e4c8
Author: Simon Zolin <s.zolin@adguard.com>
Date:   Thu Dec 12 17:41:37 2019 +0300

    * use dnsproxy v0.23.2

commit c545a1bf7e4e706b45b4670b804a50bf8d75bae3
Author: Simon Zolin <s.zolin@adguard.com>
Date:   Thu Dec 12 17:36:37 2019 +0300

    update ru

commit c22eec9bcfad67284e21cfc4e6b06fb63a64d25d
Author: Simon Zolin <s.zolin@adguard.com>
Date:   Thu Dec 12 17:22:03 2019 +0300

    * update translations;  add sr-cs, fa, hr
2019-12-12 18:42:51 +03:00
Simon Zolin
9cc09274f1 Merge: - DNS: fix deadlock
Close #1251

* commit 'ef57f7e192fdd4fbbfe25dc1c1e61d52e9f0b6ee':
  - DNS: fix race in WriteDiskConfig()
  - DNS: fix deadlock in Server.ServeHTTP()
2019-12-12 15:08:19 +03:00
Simon Zolin
ef57f7e192 - DNS: fix race in WriteDiskConfig() 2019-12-12 15:04:29 +03:00
Simon Zolin
000e842f7b - DNS: fix deadlock in Server.ServeHTTP()
s.RLock() is called again in filterResponse() while another thread
 holds s.Lock()
2019-12-12 15:00:10 +03:00
Ildar Kamalov
e85fdd7f09 Merge: - client: fix request count in clients table
* commit '8c8deb3d3db72a2f091156d3ec10447f0e6c062c':
  - client: fix request count in clients table
2019-12-12 13:46:44 +03:00
Ildar Kamalov
8c8deb3d3d - client: fix request count in clients table 2019-12-12 11:33:02 +03:00
Simon Zolin
c9ccc53282 Merge: * set BlockingMode: "null_ip" by default; minor improvements
Squashed commit of the following:

commit 653544b98dc4d1b9a74e1509d0e6104b71bcdcb3
Author: Simon Zolin <s.zolin@adguard.com>
Date:   Wed Dec 11 17:34:41 2019 +0300

    * DNS reconfigure: protect against delayed socket fd close

commit 9e650f37dee7f771bf1d9d714c35f0a81788aa16
Author: Simon Zolin <s.zolin@adguard.com>
Date:   Wed Dec 11 15:28:33 2019 +0300

    - fix race on startup

commit 878fdb8fc4ebbc6fab683a65f5e4298e64c2073e
Author: Simon Zolin <s.zolin@adguard.com>
Date:   Wed Dec 11 15:11:21 2019 +0300

    * travis: don't run tests

commit 1c4ab60684ee22d55e6d2a3350c0f24d9844255c
Author: Simon Zolin <s.zolin@adguard.com>
Date:   Wed Dec 11 14:56:28 2019 +0300

    * travis: 'release.sh' and then run tests

commit e1f644b8d9a1f3b46990cdfb1b75fd81b3a49d33
Author: Simon Zolin <s.zolin@adguard.com>
Date:   Wed Dec 11 14:52:59 2019 +0300

    * set BlockingMode: "null_ip" by default
2019-12-11 17:54:34 +03:00
Andrey Meshkov
daf17f16f2 -(home): fix whois info on the dashboard 2019-12-11 14:31:38 +03:00
Simon Zolin
0a66913b4d Merge: * use upstream servers directly for the internal DNS resolver
Close #1212

* Server.Start(config *ServerConfig) -> Start()
+ Server.Prepare(config *ServerConfig)
+ Server.Resolve(host string)
+ Server.Exchange()
* rDNS: use internal DNS resolver
- clients: fix race in WriteDiskConfig()
- fix race: move 'clients' object from 'configuration' to 'HomeContext'
    Go race detector didn't like our 'clients' object in 'configuration'.
+ add AGH startup test
    . Create a configuration file
    . Start AGH instance
    . Check Web server
    . Check DNS server
    . Wait until the filters are downloaded
    . Stop and cleanup
* move module objects from config.* to Context.*
* don't call log.SetLevel() if not necessary
    This helps to avoid Go race detector's warning
* ci.sh: 'make' and then run tests

Squashed commit of the following:

commit 86500c7f749307f37af4cc8c2a1066f679d0cfad
Author: Simon Zolin <s.zolin@adguard.com>
Date:   Tue Dec 10 18:08:53 2019 +0300

    minor

commit 6e6abb9dca3cd250c458bec23aa30d2250a9eb40
Author: Simon Zolin <s.zolin@adguard.com>
Date:   Tue Dec 10 18:08:31 2019 +0300

    * ci.sh: 'make' and then run tests

commit 114192eefea6800e565ba9ab238202c006516c27
Author: Simon Zolin <s.zolin@adguard.com>
Date:   Tue Dec 10 17:50:04 2019 +0300

    fix

commit d426deea7f02cdfd4c7217a38c59e51251956a0f
Author: Simon Zolin <s.zolin@adguard.com>
Date:   Tue Dec 10 17:46:33 2019 +0300

    tests

commit 7b350edf03027895b4e43dee908d0155a9b0ac9b
Author: Simon Zolin <s.zolin@adguard.com>
Date:   Tue Dec 10 15:56:12 2019 +0300

    fix test

commit 2f5f116873bbbfdd4bb7f82a596f9e1f5c2bcfd8
Author: Simon Zolin <s.zolin@adguard.com>
Date:   Tue Dec 10 15:48:56 2019 +0300

    fix tests

commit 3fbdc77f9c34726e2295185279444983652d559e
Author: Simon Zolin <s.zolin@adguard.com>
Date:   Tue Dec 10 15:45:00 2019 +0300

    linter

commit 9da0b6965a2b6863bcd552fa83a4de2866600bb8
Author: Simon Zolin <s.zolin@adguard.com>
Date:   Tue Dec 10 15:33:23 2019 +0300

    * config.dnsctx.whois -> Context.whois

commit c71ebdbdf6efd88c877b2f243c69d3bc00a997d7
Author: Simon Zolin <s.zolin@adguard.com>
Date:   Tue Dec 10 15:31:08 2019 +0300

    * don't call log.SetLevel() if not necessary

    This helps to avoid Go race detector's warning

commit 0f250220133cefdcb0843a50000cb932802b8324
Author: Simon Zolin <s.zolin@adguard.com>
Date:   Tue Dec 10 15:28:19 2019 +0300

    * rdns: refactor

commit c460d8c9414940dac852e390b6c1b4d4fb38dff9
Author: Simon Zolin <s.zolin@adguard.com>
Date:   Tue Dec 10 14:08:08 2019 +0300

    Revert: * stats: serialize access to 'limit'

    Use 'conf *Config' and update it atomically, as in querylog module.
    (Note: Race detector still doesn't like it)

commit 488bcb884971276de0d5629384b29e22c59ee7e6
Author: Simon Zolin <s.zolin@adguard.com>
Date:   Tue Dec 10 13:50:23 2019 +0300

    * config.dnsFilter -> Context.dnsFilter

commit 86c0a6827a450414b50acec7ebfc5220d13b81e4
Author: Simon Zolin <s.zolin@adguard.com>
Date:   Tue Dec 10 13:45:05 2019 +0300

    * config.dnsServer -> Context.dnsServer

commit ee35ef095ccaabc89e3de0ef52c9b5ed56b36873
Author: Simon Zolin <s.zolin@adguard.com>
Date:   Tue Dec 10 13:42:10 2019 +0300

    * config.dhcpServer -> Context.dhcpServer

commit 1537001cd211099d5fad01696c0b806ae5d257b1
Author: Simon Zolin <s.zolin@adguard.com>
Date:   Tue Dec 10 13:39:45 2019 +0300

    * config.queryLog -> Context.queryLog

commit e5955fe4ff1ef6f41763461b37b502ea25a3d04c
Author: Simon Zolin <s.zolin@adguard.com>
Date:   Tue Dec 10 13:03:18 2019 +0300

    * config.httpsServer -> Context.httpsServer

commit 6153c10a9ac173e159d1f05e0db1512579b9203c
Author: Simon Zolin <s.zolin@adguard.com>
Date:   Mon Dec 9 20:12:24 2019 +0300

    * config.httpServer -> Context.httpServer

commit abd021fb94039015cd45c97614e8b78d4694f956
Author: Simon Zolin <s.zolin@adguard.com>
Date:   Mon Dec 9 20:08:05 2019 +0300

    * stats: serialize access to 'limit'

commit 38c2decfd87c712100edcabe62a6d4518719cb53
Author: Simon Zolin <s.zolin@adguard.com>
Date:   Mon Dec 9 19:57:04 2019 +0300

    * config.stats -> Context.stats

commit 6caf8965ad44db9dce9a7a5103aa8fa305ad9a06
Author: Simon Zolin <s.zolin@adguard.com>
Date:   Mon Dec 9 19:45:23 2019 +0300

    fix Restart()

... and 6 more commits
2019-12-11 12:38:58 +03:00
Artem Baskal
fe357d04f7 Merge: - client: add message when dns server is starting up
Close #1186

* commit '1e429df3bcb8ea2fd3a457c026cb8c8a7131e504':
  - client: add message when dns server is starting up
2019-12-10 18:30:51 +03:00
Artem Baskal
1e429df3bc - client: add message when dns server is starting up 2019-12-10 17:48:42 +03:00
Simon Zolin
2b14a043a9 Merge: + DNS: new settings (ratelimit, blocking mode, edns_client_subnet)
Close #1091 Close #1154 Close #1022

* commit '97e77cab643d6784067ce97c0f03ec3e4612c2c9':
  + client: handle EDNS Client Subnet setting
  + dns: add "edns_client_subnet" setting
  + client: handle DNS config
  * DNS: remove /enable_protection and /disable_protection
  + openapi: /dns_info, /dns_config
  * /control/set_upstreams_config: allow empty upstream list
  + dns: support blocking_mode=custom_ip
  + DNS: Get/Set DNS general settings
2019-12-10 16:10:31 +03:00
Ildar Kamalov
97e77cab64 + client: handle EDNS Client Subnet setting 2019-12-10 16:01:18 +03:00
Simon Zolin
19a94bf789 + dns: add "edns_client_subnet" setting 2019-12-10 16:01:17 +03:00
Artem Baskal
197d07f32b + client: handle DNS config 2019-12-10 16:01:17 +03:00
Simon Zolin
87bb773d3e * DNS: remove /enable_protection and /disable_protection 2019-12-10 16:01:17 +03:00
Simon Zolin
3b13c031a3 + openapi: /dns_info, /dns_config 2019-12-10 16:01:17 +03:00
Simon Zolin
1b3122dd35 * /control/set_upstreams_config: allow empty upstream list 2019-12-10 16:01:17 +03:00
Simon Zolin
4f4da3397c + dns: support blocking_mode=custom_ip 2019-12-10 16:01:16 +03:00
Simon Zolin
26ccee47b5 + DNS: Get/Set DNS general settings
GET /control/dns_info
POST /control/dns_config
2019-12-10 16:01:16 +03:00
Ildar Kamalov
92141e03c4 Merge: - client: fix request count in clients table
* commit '289c6f8c731f616c73eac2739b572c13eb245680':
  - client: fix request count in clients table
2019-12-10 15:55:38 +03:00
Ildar Kamalov
289c6f8c73 - client: fix request count in clients table 2019-12-10 15:22:40 +03:00
Simon Zolin
40763c903b Merge: * stats: handle "invalid argument" error from "bbolt"
Close #1188

Squashed commit of the following:

commit 70355154bb49ae7df57e79ed1405754682f5d57f
Merge: 331650e6 d1c47c0d
Author: Simon Zolin <s.zolin@adguard.com>
Date:   Mon Dec 9 14:09:59 2019 +0300

    Merge remote-tracking branch 'origin/master' into 1188-bolt-err

commit 331650e60d5869b7c706b539f04c1a856cd9f254
Author: Simon Zolin <s.zolin@adguard.com>
Date:   Mon Dec 9 13:57:14 2019 +0300

    minor

commit 07130a0f1f2e88cab30a88d899e8d817096ac35f
Author: Simon Zolin <s.zolin@adguard.com>
Date:   Wed Dec 4 13:50:29 2019 +0300

    * stats: handle "invalid argument" error from "bbolt"
2019-12-09 14:13:39 +03:00
Artem Baskal
d1c47c0dbb Merge: + client: add norwegian language
Closes #1174

* commit '4f0975bab5db189a192aeb07c7e8f6cebc101f34':
  + client: add norwegian language
2019-12-05 16:36:51 +03:00
Artem Baskal
4f0975bab5 + client: add norwegian language 2019-12-05 14:56:52 +03:00
Simon Zolin
9fd27b9add Merge: + Clients: use per-client DNS servers
Close #821

* commit '6684a120ac9909140e4ecbe674e09c8f24e87ac4':
  + client: handle upstream DNS servers for clients
  * openapi: add "upstreams" to Client struct
  + use per-client DNS servers
2019-12-05 13:22:50 +03:00
Ildar Kamalov
6684a120ac + client: handle upstream DNS servers for clients 2019-12-05 13:19:27 +03:00
Simon Zolin
72ec4d7d7e * openapi: add "upstreams" to Client struct 2019-12-05 13:16:41 +03:00
Simon Zolin
7313c3bc53 + use per-client DNS servers 2019-12-05 13:16:41 +03:00
Simon Zolin
b6b26c0681 Merge: - rDNS: support multiple Answer records
Close #1230

* commit '56a0c9684bfdb8bebbeea5eb94192a215d8d45a1':
  - rDNS: support multiple Answer records
2019-12-05 13:14:57 +03:00
Simon Zolin
56a0c9684b - rDNS: support multiple Answer records 2019-12-05 13:06:52 +03:00
Andrey Meshkov
47cc025504 Merge: fix #1211 * use dnsproxy v0.21.0 and urlfilter v0.7.0
* commit '8dbdf49c32d66288dece97b84a6b70b05e5ff43e':
  * use dnsproxy v0.22.0 and urlfilter v0.7.0
2019-12-04 20:44:40 +03:00
Simon Zolin
89cc1715d9 Merge: - DHCP: normalize leases on startup (prioritize static leases over dynamic)
Close #1005

* commit '906f26d7d276c181960048a2c059d5b141e71f0a':
  - DHCP: normalize leases on startup (prioritize static leases over dynamic)
2019-12-04 19:43:04 +03:00
Simon Zolin
8dbdf49c32 * use dnsproxy v0.22.0 and urlfilter v0.7.0 2019-12-03 20:55:45 +03:00
Simon Zolin
906f26d7d2 - DHCP: normalize leases on startup (prioritize static leases over dynamic) 2019-12-03 20:43:22 +03:00
Simon Zolin
07a9c3bd45 Merge: + dnsforward: match CNAME with filtering rules
Close #1185

* commit '8cb4d128f5392646eb60229717b09f8398897075':
  * openapi: get /querylog: add "original_answer", "service_name"
  * doc: filtering logic with a diagram
  + client: handle blocked by response in query log
  + dnsforward: match CNAME with filtering rules
2019-12-03 17:09:30 +03:00
Simon Zolin
8cb4d128f5 * openapi: get /querylog: add "original_answer", "service_name" 2019-12-03 17:01:26 +03:00
Simon Zolin
7c0b2d8ede * doc: filtering logic with a diagram 2019-12-03 17:01:26 +03:00
Ildar Kamalov
e8885dbf3e + client: handle blocked by response in query log 2019-12-03 17:01:26 +03:00
Simon Zolin
e7727e9f63 + dnsforward: match CNAME with filtering rules
+ GET /control/querylog: add "cname_match" field

* querylog: Add() now receives an object with parameters
2019-12-03 17:01:26 +03:00
Ildar Kamalov
4d7984cb8b Merge: Update blocked_services.go Snapchat Rules
Closes #1222

* commit '9c2e5c3f51fa7fdc5f5e6d89a73c1456a8df49d0':
  Update blocked_services.go Snapchat Rules
2019-12-03 13:35:09 +03:00
Simon Zolin
acd8da6f0a Merge: * DNS: use Quad9 as default server
Close #1116

* commit '82d0c3047b857651d351a7acd3f2e8bb262dfb4d':
  + client: change DNS settings text and examples to Quad9
  * DNS: use Quad9 as default server
2019-12-02 15:57:46 +03:00
Simon Zolin
48c70aefaa Merge: + QueryLog: new setting "dns.querylog_memsize"
Close #958

* commit '7e45c2fc2428679ac7454c5244b0130901449324':
  + new setting "dns.querylog_memsize"
2019-12-02 15:57:17 +03:00
Simon Zolin
7e45c2fc24 + new setting "dns.querylog_memsize"
* set 1000 entries by default (not 5000)
2019-12-02 15:46:03 +03:00
Ildar Kamalov
82d0c3047b + client: change DNS settings text and examples to Quad9 2019-12-02 15:40:54 +03:00
Simon Zolin
d6d0d53761 * DNS: use Quad9 as default server 2019-12-02 15:40:54 +03:00
Simon Zolin
31ffae7717 Merge: * dnsforward: major refactoring
* commit 'f579c23bc932e893ffa960abe769750fe657beff':
  * minor fixes
  * dnsforward: refactor code for default DNS servers logic
  * update tests
  * dnsforward: move access settings and web handlers
  + dnsforward: refactor
2019-12-02 15:38:04 +03:00
Simon Zolin
f579c23bc9 * minor fixes 2019-12-02 15:25:11 +03:00
Simon Zolin
9b8cccdfcf * dnsforward: refactor code for default DNS servers logic 2019-12-02 14:58:17 +03:00
Simon Zolin
8bf75b54a4 * update tests 2019-12-02 14:58:17 +03:00
Simon Zolin
19a1c03d3b * dnsforward: move access settings and web handlers 2019-12-02 14:58:17 +03:00
Simon Zolin
7bb32eae3d + dnsforward: refactor
+ dnsforward: own HTTP handlers
* dnsforward: no DNS reload on ProtectionEnabled setting change
* dnsforward: move QueryLog* settings out
* dnsforward: move dnsfilter settings out
* clients,i18n: no DNS reload on settings change
2019-12-02 14:58:17 +03:00
Simon Zolin
73d17ffa81 Merge: + DHCP: Reset DHCP configuration; Refactor
Close #1024

* commit 'a6926169815e03d00f9cfac0417da6f797d539ae':
  - clients: fix tests
  * clients: refactor
  + openapi: /dhcp/reset
  + client: handle DHCP reset
  + POST /control/dhcp/reset: Reset DHCP configuration
  * dhcp: move HTTP handlers to dhcpd/
  * dhcp,clients: DHCP server module is passed to Clients module during initialization.
2019-12-02 12:56:30 +03:00
Cybo1927
9c2e5c3f51 Update blocked_services.go Snapchat Rules
Snapchat still works on Android if that's not blocked
2019-11-29 16:55:27 +00:00
Simon Zolin
a692616981 - clients: fix tests 2019-11-29 17:35:26 +03:00
Simon Zolin
e9cb8666ce * clients: refactor 2019-11-29 17:11:07 +03:00
Simon Zolin
90ce70225f + openapi: /dhcp/reset 2019-11-29 17:11:07 +03:00
Ildar Kamalov
a4dedacf43 + client: handle DHCP reset 2019-11-29 17:11:07 +03:00
Simon Zolin
df92941ae0 + POST /control/dhcp/reset: Reset DHCP configuration 2019-11-29 17:11:07 +03:00
Simon Zolin
477a4bbf54 * dhcp: move HTTP handlers to dhcpd/ 2019-11-29 17:11:07 +03:00
Simon Zolin
149fcc0f2d * dhcp,clients: DHCP server module is passed to Clients module during initialization. 2019-11-29 17:11:07 +03:00
Simon Zolin
127a68a39f Merge: + Clients: multiple IP, CIDR, MAC
Close #809

* commit 'f8202a74bd55b97cdd95c33d8f8ed97412ba43b1':
  + client: handle clients find
  + client: add multiple fields client form
  * minor
  * openapi: update 'Client' object; add /clients/find
  * config: upgrade scheme to v6
  * clients: multiple IP, CIDR, MAC addresses
2019-11-29 17:05:00 +03:00
Ildar Kamalov
f8202a74bd + client: handle clients find 2019-11-29 16:59:20 +03:00
Ildar Kamalov
a6d6e9ec9e + client: add multiple fields client form 2019-11-29 16:53:21 +03:00
Simon Zolin
fd26af2677 * minor 2019-11-29 16:53:21 +03:00
Simon Zolin
1fc70cbc08 * openapi: update 'Client' object; add /clients/find 2019-11-29 16:53:21 +03:00
Simon Zolin
317a9cc49e * config: upgrade scheme to v6 2019-11-29 16:53:05 +03:00
Simon Zolin
71ce0c6da9 * clients: multiple IP, CIDR, MAC addresses
+ /clients/find
* clients: move code for config read/write
* clients: move HTTP handlers
2019-11-29 16:52:32 +03:00
Artem Baskal
db703283ba Merge pull request #431 in DNS/adguard-home from fix-1075 to master
* commit '49e800727b2e866fa1f9d429bd1c0c17ce8466b3':
  - client: allow add ip-v6 to exceptions
2019-11-27 18:50:00 +03:00
Artem Baskal
49e800727b - client: allow add ip-v6 to exceptions 2019-11-27 18:45:30 +03:00
Artem Baskal
d26fed1901 Merge: - client: fix table size and add pagination
Close #1197

* commit 'f446186db146b74cc6af3d29cf53ff69adc26e4f':
  - client: fix table pagination
  - client: fix table size and add pagination
2019-11-27 13:06:11 +03:00
Artem Baskal
f446186db1 - client: fix table pagination 2019-11-26 20:50:02 +03:00
Artem Baskal
4751528d69 - client: fix table size and add pagination 2019-11-26 19:24:22 +03:00
Simon Zolin
48c0b487e3 Merge: * auth: rename "session" cookie to "agh_session"
Close #1196

* commit 'b3614ba62fcde8ff3e3b6e708095f84a230aa2f2':
  * auth: rename "session" cookie to "agh_session"
2019-11-26 19:21:34 +03:00
Ildar Kamalov
7a665ff8f0 Merge: - client: fix placeholder for table pages
Closes #1166

* commit '38c7e732a6af190f92d824a6af53aea60aab5146':
  - client: fix placeholder for table pages
2019-11-26 15:30:00 +03:00
Ildar Kamalov
38c7e732a6 - client: fix placeholder for table pages 2019-11-26 15:16:52 +03:00
Ildar Kamalov
bdffd8534c Merge: Update blocked_services.goTikTok Rules
Closes #1192

* commit 'f19d8c24c3e3a8d2934affc5690cc72c044a0a3f':
  Update blocked_services.goTikTok Rules
2019-11-26 13:48:58 +03:00
Ildar Kamalov
757e41ce53 Merge: Update blocked_services.go Facebook, Messenger, and Instagram Rules
Closes #1190

* commit 'e0be4e8801307bebce9e19057a1a8e6fb1a658c7':
  Update blocked_services.go Facebook, Messenger, and Instagram Rules
2019-11-26 13:48:31 +03:00
Cybo1927
f19d8c24c3 Update blocked_services.goTikTok Rules 2019-11-26 12:01:09 +03:00
Cybo1927
e0be4e8801 Update blocked_services.go Facebook, Messenger, and Instagram Rules 2019-11-26 11:17:22 +03:00
Ildar Kamalov
713613e3b8 Merge: Update blocked_services.go Snapchat Rules
Closes #1189

* commit 'a78156a7cb259f3cb0a78b7466e09ee4b99f2356':
  Update blocked_services.go Snapchat Rules
2019-11-26 11:12:19 +03:00
Ildar Kamalov
af3096e23b Merge: blocked services: add new domain for youtube
Closes #1149

* commit '9675b3776ee50d8df4ce8a875f9b70b22bb8f8ee':
  blocked services: add new domain for youtube
2019-11-26 11:10:19 +03:00
Simon Zolin
b3614ba62f * auth: rename "session" cookie to "agh_session"
for compatibility with other HTTP services on the same host
2019-11-25 15:48:14 +03:00
Simon Zolin
a0fe1e84c0 Merge: * use Go v1.13
Close #1041

* commit 'dc2c68b1e4ff625deb44850a84282cdce56d1cd5':
  * use Go v1.13
2019-11-25 15:29:03 +03:00
Simon Zolin
2e5264652e Merge: - querylog: remove time counter (fix zero div exception)
Close #1194

* commit 'a31116635e605d199887e83a98d27f0fe01291c1':
  * querylog: delete code for time counter
  - querylog: remove time counter (fix zero div exception)
2019-11-25 15:25:55 +03:00
Simon Zolin
a31116635e * querylog: delete code for time counter 2019-11-25 15:20:56 +03:00
Simon Zolin
dc2c68b1e4 * use Go v1.13 2019-11-25 14:10:28 +03:00
Simon Zolin
305df63054 - querylog: remove time counter (fix zero div exception) 2019-11-25 13:40:27 +03:00
Cybo1927
a78156a7cb Update blocked_services.go Snapchat Rules 2019-11-22 14:54:14 +03:00
ArchiveBase
9675b3776e blocked services: add new domain for youtube 2019-11-22 14:50:38 +03:00
Andrey Meshkov
0a09c7eb4d *(global): travis-ci.org -> travis-ci.com 2019-11-21 19:11:02 +03:00
Simon Zolin
6fdffc1203 Merge: Add cloudflare to blocked services
Close #1155

* commit '36636867e18baf54c54a1a36f9d501a0f8bbeea4':
  + blocked_services: add cloudflare
  + client: add cloudflare icon
2019-11-21 11:48:07 +03:00
ArchiveBase
36636867e1 + blocked_services: add cloudflare 2019-11-21 11:40:03 +03:00
ArchiveBase
c93cdd106e + client: add cloudflare icon 2019-11-21 11:36:58 +03:00
Andrey Meshkov
ee41c18d53 Merge: #1092 * /control/querylog_config: support optional parameters
* commit '7c81efcbcba9f5c072ed03d37490cf5e7dd33f89':
  * go.mod: use bbolt from github
  * /control/querylog_config: support optional parameters
2019-11-20 20:28:28 +03:00
Simon Zolin
7c81efcbcb * go.mod: use bbolt from github 2019-11-20 20:14:28 +03:00
Simon Zolin
81e8bbe63c * /control/querylog_config: support optional parameters 2019-11-20 20:12:46 +03:00
Simon Zolin
0b7ac93076 Merge: * blocked_services: update hosts for whatsapp, facebook, youtube, tiktok
Close #1141

* commit '15f6334748ccae9075124a15d0a79987effde990':
  * blocked_services: update hosts for whatsapp, facebook, youtube, tiktok
2019-11-20 20:03:48 +03:00
Cybo1927
15f6334748 * blocked_services: update hosts for whatsapp, facebook, youtube, tiktok 2019-11-20 19:57:38 +03:00
Ildar Kamalov
044a457579 Merge pull request #412 in DNS/adguard-home from add-origin-to-blocked-services to master
* commit '79ea15dce11e96720259cf78db74752fb0cd39d0':
  + client: add origin icon
  + blocked_services: add origin
2019-11-20 18:59:14 +03:00
ArchiveBase
79ea15dce1 + client: add origin icon 2019-11-20 18:55:34 +03:00
ArchiveBase
ca6048f667 + blocked_services: add origin 2019-11-20 18:54:45 +03:00
Ildar Kamalov
fa45f8a256 Merge: Add amazon to blocked services
* commit 'b1c7497d0552b4abd796e82a166d55faa90a030f':
  + client: add ebay icon
  + blocked_services: add ebay
  + client: add amazon icon
  + blocked_services: add amazon
2019-11-20 18:54:13 +03:00
Ildar Kamalov
e7cf8f222d Merge: Add reddit to blocked services
* commit '7c10cefdf9a3d421de2d7e88cfd4e647baf31e8b':
  + client: add reddit icon
  + blocked_services: add reddit
2019-11-20 18:53:35 +03:00
Simon Zolin
2b0ababdc9 Merge: + safesearch: add Pixabay
Close #1159

* commit 'fab63f167ad44f95749f0a779f8805bb39c7d90a':
  + safesearch: add Pixabay
2019-11-20 15:16:28 +03:00
Simon Zolin
d4a3a01f30 Merge: + dnsfilter: use AG DNS server for SB/PC services
Close #525

* commit '7f69848084a68cdf1e227a555454991295fc5866':
  + dnsfilter: use AG DNS server for SB/PC services
2019-11-20 15:09:51 +03:00
Simon Zolin
1b7ef0e4f4 Merge: + Auth: add "web_session_ttl" setting; improve logging
Close #1006

* commit 'b03b36e47e1f230567fce0936ee1285b6861350a':
  * auth: improve logging
  + config: "web_session_ttl" setting
2019-11-20 14:58:20 +03:00
Simon Zolin
b03b36e47e * auth: improve logging
Write info log messages for login attempts (both successful and not)
2019-11-20 13:15:12 +03:00
Simon Zolin
c9a6e4e018 + config: "web_session_ttl" setting 2019-11-20 13:15:08 +03:00
ArchiveBase
b1c7497d05 + client: add ebay icon 2019-11-20 10:28:57 +03:00
ArchiveBase
c49f62cfe6 + blocked_services: add ebay 2019-11-20 10:28:57 +03:00
ArchiveBase
d468daac76 + client: add amazon icon 2019-11-20 10:28:57 +03:00
ArchiveBase
4a59d5a116 + blocked_services: add amazon 2019-11-20 10:28:56 +03:00
ArchiveBase
7c10cefdf9 + client: add reddit icon 2019-11-20 10:24:42 +03:00
ArchiveBase
dbf7a083cb + blocked_services: add reddit 2019-11-20 10:24:41 +03:00
Simon Zolin
0d4dce5c79 Merge: + querylog: preserve searching compatibility with the previous version
* commit 'a7742a366511e272a8c24dc5fcd1a62759c2bacb':
  - querylog: fix linter issue
  + querylog: preserve searching compatibility with the previous version
2019-11-19 17:21:12 +03:00
Simon Zolin
a7742a3665 - querylog: fix linter issue 2019-11-19 17:13:12 +03:00
Simon Zolin
12f4ebc6a5 + querylog: preserve searching compatibility with the previous version 2019-11-19 17:09:54 +03:00
Simon Zolin
6ae0a0eb0b Merge: * openapi: version: '0.99.3'
* commit 'c7e4ecd85cd9f3991bb5f3a001c9b3ae18637527':
  * openapi: version: '0.99.3'
2019-11-19 15:37:11 +03:00
Simon Zolin
c7e4ecd85c * openapi: version: '0.99.3' 2019-11-19 15:26:46 +03:00
Simon Zolin
2ac6e48535 Merge: Querylog: speed up, change format, robust search
Close #1099 Close #1094

* commit '62c8664fd75439b7597d935992c380f9c0675660':
  + client: load additional search results
  + client: separate filters from the table component
  + client: hide page size option and page info
  + client: use oldest param
  * openapi: update 'QueryLog'
  * querylog: add more tests
  * QueryLog.Add() now receives net.IP, not net.Addr
  * querylog: major refactor: change on-disk format and API
2019-11-19 15:21:42 +03:00
Ildar Kamalov
62c8664fd7 + client: load additional search results 2019-11-19 15:14:26 +03:00
Ildar Kamalov
e243e69a6e + client: separate filters from the table component 2019-11-19 15:12:34 +03:00
Ildar Kamalov
6b64d393bd + client: hide page size option and page info 2019-11-19 15:12:34 +03:00
Ildar Kamalov
941b6c5976 + client: use oldest param 2019-11-19 15:12:34 +03:00
Simon Zolin
33093de6aa * openapi: update 'QueryLog' 2019-11-19 15:12:34 +03:00
Simon Zolin
68cd7976b7 * querylog: add more tests 2019-11-19 15:09:53 +03:00
Simon Zolin
0cd6781a9a * QueryLog.Add() now receives net.IP, not net.Addr 2019-11-19 15:09:53 +03:00
Simon Zolin
2f5d6593f2 * querylog: major refactor: change on-disk format and API
speed up decoding
speed up search
compatible with previous format (when not searching)
2019-11-19 15:08:51 +03:00
Simon Zolin
a65f983aac Merge: * querylog: don't return entries without Question data
Close #1143

* commit '0d4e95b36d02e8aadfe6cbdd87d357efba6f02e8':
  * querylog: don't return entries without Question data
2019-11-12 18:31:07 +03:00
Simon Zolin
0d4e95b36d * querylog: don't return entries without Question data 2019-11-12 18:14:33 +03:00
Ildar Kamalov
359cab5290 Merge pull request #384 in DNS/adguard-home from 1123-disable-encryption-sources to master
* commit '4ae4cd07232b1e1861b435d2426ebe951061465b':
  Bind encryption source disabled state to form
2019-11-12 14:30:41 +03:00
Simon Zolin
ec5c5e8109 - Stats: fix crash
Close #1170

* commit 'f64868472aae50ed8203ef4d3ec9de7a7cf96fd9':
  - stats: fix read-write race
  * minor
2019-11-11 18:04:01 +03:00
Simon Zolin
f64868472a - stats: fix read-write race
* periodicFlush() operation doesn't result in an inconsistent state at any time
* stats readers use the last unit ID properly, excluding the possibility
 when unit ID could be changed, but this unit isn't yet created
2019-11-11 16:18:20 +03:00
Simon Zolin
2a6e9f3c11 * minor 2019-11-11 16:13:03 +03:00
Simon Zolin
fab63f167a + safesearch: add Pixabay 2019-11-08 13:07:25 +03:00
Simon Zolin
7f69848084 + dnsfilter: use AG DNS server for SB/PC services
* move SS/SB/PC services to security.go
* remove old useless code (HTTP client)
2019-11-08 10:38:12 +03:00
Simon Zolin
2f1e631c66 Merge: - dns rewrites: CNAME record didn't work
Close #1156

* commit '090f5498331844ad6d5a8dc975c1d0511b47565a':
  - dns rewrites: CNAME record didn't work
2019-11-07 16:33:07 +03:00
Simon Zolin
6b76a2c9f7 Merge: * blocked-services: youtube: add "youtubei.googleapis.com"
Close #1122

* commit '59720467da42c8520e5d25b2c3368728a61d6bf6':
  * blocked-services: youtube: add "youtubei.googleapis.com"
2019-11-07 15:30:23 +03:00
Simon Zolin
090f549833 - dns rewrites: CNAME record didn't work 2019-11-07 15:27:39 +03:00
Simon Zolin
59720467da * blocked-services: youtube: add "youtubei.googleapis.com" 2019-11-07 15:16:47 +03:00
Simon Zolin
4d32d42ba2 Merge: * whois,rdns: use 1 hour cache TTL
Close #1157

* commit 'abd251c5c167fd33c047af8af39e8b8e2d61fd85':
  * whois,rdns: use 1 hour cache TTL
2019-11-07 14:06:06 +03:00
Simon Zolin
abd251c5c1 * whois,rdns: use 1 hour cache TTL 2019-11-07 14:02:34 +03:00
Jaime Martínez Rincón
4ae4cd0723 Bind encryption source disabled state to form 2019-10-25 22:46:08 +02:00
Simon Zolin
e04ffde105 Merge: - auth: fix crash on showing Dashboard in UI if authentication is disabled
Close #1119

* commit 'ab24ab2f1aa5a93c35e68b46abbb3f03decbaeb0':
  - auth: fix crash on showing Dashboard in UI if authentication is disabled
2019-10-25 13:28:50 +03:00
Simon Zolin
ab24ab2f1a - auth: fix crash on showing Dashboard in UI if authentication is disabled 2019-10-25 11:01:29 +03:00
Simon Zolin
8323c0c4b6 Merge: * querylog: skip decoding errors
Close #753

* commit 'c74ae0d0e7ca03a592663025dc644397c1e31d57':
  * querylog: skip decoding errors
2019-10-24 16:00:07 +03:00
Simon Zolin
b28582d630 Merge: - querylog: writing to a file could stop randomly
Close #1115

* commit 'c04705364663e7141d39764fce8fd1dc1a4633ab':
  - querylog: writing to a file could stop randomly
2019-10-24 14:45:46 +03:00
Simon Zolin
c047053646 - querylog: writing to a file could stop randomly 2019-10-24 14:28:24 +03:00
Simon Zolin
41649418fc Merge: * dns: enable DNS message compression
Close #1109

* commit '3b443bc9c80c39483f28a042886f53feb4aeed96':
  * dns: enable DNS message compression
2019-10-23 20:06:18 +03:00
Simon Zolin
3b443bc9c8 * dns: enable DNS message compression 2019-10-23 20:02:42 +03:00
Simon Zolin
03c4793010 Merge: * don't show "sign out" button if authorization is disabled
Close #1093

* commit '49e535336be47cccee07f2e1b05f0d514aa91aa7':
  * changelog
  + client: get profile info
  * minor
  + GET /control/profile
2019-10-23 19:23:37 +03:00
Simon Zolin
9d29fdea4b Merge: * filters: don't fail on filter update when filter file doesn't exist
Close #1112

* commit '0737354f534385c3c2036e15d65554bcb7090fb4':
  * filters: don't fail on filter update when filter file doesn't exist
2019-10-23 19:19:50 +03:00
Simon Zolin
49e535336b * changelog 2019-10-23 19:19:04 +03:00
Ildar Kamalov
2a2647dc3f + client: get profile info 2019-10-23 18:43:39 +03:00
Simon Zolin
0ede2b13c9 * minor 2019-10-23 18:43:39 +03:00
Simon Zolin
c185f6826a + GET /control/profile
* openapi: get /profile

* auth: store user names along with sessions
2019-10-23 18:43:35 +03:00
Simon Zolin
e8bb0fdcb7 Merge: - /control/version.json: don't show error message if auto-update is disabled
Close #1083

* commit '5bcd1545a8044aff7f35179e7a324ec9b4ad1c2e':
  - /control/version.json: don't show error message if auto-update is disabled
2019-10-23 14:21:02 +03:00
Simon Zolin
0737354f53 * filters: don't fail on filter update when filter file doesn't exist 2019-10-23 14:19:43 +03:00
Simon Zolin
c74ae0d0e7 * querylog: skip decoding errors
We read line from file and pass it to a JSON decoder.
JSON decoder is now a local object.
2019-10-22 19:16:04 +03:00
Simon Zolin
15e6311c63 Merge: * dnsfilter: windows: store rules in memory
Close #1088

* commit '6ba1d857ac7961ed5a97a85a328398296c520273':
  * dnsfilter: windows: store rules in memory
  * minor
2019-10-22 16:25:02 +03:00
Simon Zolin
6ba1d857ac * dnsfilter: windows: store rules in memory
* dnsfilter: ignore cosmetic rules
2019-10-22 16:15:51 +03:00
Simon Zolin
67f31ccf43 * minor 2019-10-22 16:15:51 +03:00
Simon Zolin
a52c4b4362 Merge: * rdns,whois: get client info for all question types (not just A/AAAA)
Close #1103

* commit '235b198ef97d7a46ab6d76a4074ec589fc0148eb':
  * rdns,whois: recheck IP addresses after some time
  * rdns,whois: get client info for all question types (not just A/AAAA)
2019-10-22 14:37:22 +03:00
Simon Zolin
235b198ef9 * rdns,whois: recheck IP addresses after some time 2019-10-22 13:11:22 +03:00
Simon Zolin
ddfd53bf06 * rdns,whois: get client info for all question types (not just A/AAAA) 2019-10-22 13:10:40 +03:00
Simon Zolin
ffffd74a6e Merge: * TLS: don't print certificate data
Close #1107

* commit '76c9e61199a70ec1455a630ab896698b4435751c':
  * TLS: don't print certificate data
2019-10-22 12:26:36 +03:00
Ildar Kamalov
b870db249e Merge: - client: set i18n language only from available languages
Closes #1082

* commit '3269766ea7e2340a658cc13343f9d3cc6565b7dc':
  - client: use lowercase lang codes
  - client: set i18n language only from available languages
2019-10-22 12:24:41 +03:00
Simon Zolin
76c9e61199 * TLS: don't print certificate data 2019-10-22 12:09:32 +03:00
Simon Zolin
0579e9bf99 Merge: - windows: dns: fix reconfigure procedure
* commit 'b7b32e2f01649500ca8224ffd05b24cc793982a1':
  - windows: dns: fix reconfigure procedure
2019-10-22 12:05:39 +03:00
Simon Zolin
c70389eb30 Merge: * /control/stats: set Content-Type: application/json
Close #1086

* commit '8985faa95d5414393165097fde032c02ff560b32':
  * minor
  * /control/stats: set Content-Type: application/json
2019-10-22 11:50:00 +03:00
Simon Zolin
5bcd1545a8 - /control/version.json: don't show error message if auto-update is disabled 2019-10-21 18:21:05 +03:00
Simon Zolin
8985faa95d * minor 2019-10-21 17:50:46 +03:00
Simon Zolin
2dc31bee20 * /control/stats: set Content-Type: application/json 2019-10-21 17:50:44 +03:00
Ildar Kamalov
3269766ea7 - client: use lowercase lang codes 2019-10-21 16:03:17 +03:00
Simon Zolin
b7b32e2f01 - windows: dns: fix reconfigure procedure 2019-10-21 15:58:14 +03:00
Ildar Kamalov
bd1ee48a4f - client: set i18n language only from available languages 2019-10-21 13:09:52 +03:00
Ildar Kamalov
67a3d44b8c Merge: - client: set the default language first in the list
Closes #1080

* commit '31f2cefdf951353ebc299c8f38ddb400d8976fda':
  * client: update translations
  - client: set the default language first in the list
2019-10-18 15:18:48 +03:00
Ildar Kamalov
31f2cefdf9 * client: update translations 2019-10-18 15:09:58 +03:00
Ildar Kamalov
b2a7e7194a - client: set the default language first in the list 2019-10-18 14:15:24 +03:00
Simon Zolin
f72e681620 Merge: + API Change Log
* commit 'd2abe8e0ee653b0e9a5b0c37a908e5aa11658269':
  + API Change Log
2019-10-18 13:48:03 +03:00
Simon Zolin
d2abe8e0ee + API Change Log 2019-10-18 13:43:12 +03:00
Simon Zolin
e72ae3ac6f Merge: - filters: auto-update didn't work
Close #1077

* commit 'e2ff8628ada0b9c2aac5dd6c1d9a6bb70de25854':
  - filters: auto-update didn't work
2019-10-17 15:13:00 +03:00
Simon Zolin
e2ff8628ad - filters: auto-update didn't work 2019-10-17 14:33:38 +03:00
Simon Zolin
4f99378109 Merge: * golibs v0.2.4, dnsproxy v0.19.6
* commit '60cc34dc962ff8ee8963536a5996828ae7bbc8e3':
  * golibs v0.2.4, dnsproxy v0.19.6
2019-10-16 19:31:03 +03:00
Simon Zolin
60cc34dc96 * golibs v0.2.4, dnsproxy v0.19.6 2019-10-16 19:20:53 +03:00
Simon Zolin
c6b4e269ed Merge: * use debug log level for unimportant messages
* commit '5cc8513322a3e604ae31d2c15ca7902608dfbfb8':
  * use debug log level for unimportant messages
2019-10-16 12:48:08 +03:00
Simon Zolin
5cc8513322 * use debug log level for unimportant messages 2019-10-16 12:03:51 +03:00
Simon Zolin
fcaa945a88 Merge: * golibs v0.2.3
* commit '887c8a905f311bf74bdcc53753937c39fa7efa77':
  * golibs v0.2.3
2019-10-15 20:27:00 +03:00
Simon Zolin
887c8a905f * golibs v0.2.3
fix travis build
2019-10-15 19:54:08 +03:00
Ildar Kamalov
fbec6d2d1e Merge: + client: add link to the new article about hosts blocklists syntax
Closes #1066

* commit '9ea7bb0ae62c5da09414f926ed3cf1b4522fe85a':
  + client: add link to the new article about hosts blocklists syntax
2019-10-15 18:23:05 +03:00
Ildar Kamalov
9ea7bb0ae6 + client: add link to the new article about hosts blocklists syntax 2019-10-15 17:55:51 +03:00
Simon Zolin
dbe57969f1 Merge: * API: Revert meaningless incompatible changes
Close #1067

* commit '1583262df180006e70112c74373de3f39bfcb11b':
  - client: rename helper
  + client: use search params for querylog request
  * openapi: minor
  * API changes
2019-10-15 16:05:48 +03:00
Ildar Kamalov
1583262df1 - client: rename helper 2019-10-15 12:31:01 +03:00
Ildar Kamalov
7b29c56791 + client: use search params for querylog request 2019-10-15 12:28:49 +03:00
Andrey Meshkov
453645b002 *(dnsfilter): update urlfilter to v0.6.1 2019-10-14 21:24:08 +03:00
Simon Zolin
92b6adbdc1 * openapi: minor 2019-10-14 15:56:14 +03:00
Simon Zolin
e2c26ec554 * API changes
* filtering_info -> filtering/status
* filtering_config -> filtering/config
2019-10-14 15:55:58 +03:00
Simon Zolin
bfc6c98109 Merge: + auth: add more tests
#1060

* commit '91bb9ccae69afadc06206d413d57c1c3b136e7a7':
  + auth: add more tests
2019-10-11 17:03:50 +03:00
Simon Zolin
b9a06cbb04 Merge: - whois: couldn't set info on existing auto-clients
Close #1059

* commit 'c299753b6733fd7841ed2acfc8f383df99964da4':
  - whois: couldn't set info on existing auto-clients
2019-10-11 17:03:01 +03:00
Simon Zolin
91bb9ccae6 + auth: add more tests
* use directory "./agh-test"
2019-10-11 16:59:14 +03:00
Simon Zolin
c299753b67 - whois: couldn't set info on existing auto-clients 2019-10-11 16:58:10 +03:00
Ildar Kamalov
b9462e72a4 Merge: - client: fix font size of whois info
Closes #1059

* commit '271ff4fe8358eed5de3bbeb76ab9ec7a6a369b89':
  - client: fix popover in the dashboard tables
  - client: fix font size of whois info
2019-10-11 14:28:35 +03:00
Ildar Kamalov
271ff4fe83 - client: fix popover in the dashboard tables 2019-10-11 12:54:44 +03:00
Ildar Kamalov
d23fdaf18f - client: fix font size of whois info 2019-10-10 18:57:39 +03:00
Simon Zolin
6612ccf107 Merge: * "refresh filters" HTTP handler: return the old synchronous behaviour
Close #1058

* commit 'c9d7bc30698555677a1922d7dfb8e3882249cbba':
  * "refresh filters" HTTP handler: return the old synchronous behaviour
2019-10-10 17:19:35 +03:00
Simon Zolin
c9d7bc3069 * "refresh filters" HTTP handler: return the old synchronous behaviour
This was broken by "* dnsfilter: major refactoring"
2019-10-10 17:12:32 +03:00
Andrey Meshkov
3fbbda5102 *(global): upd trackers db 2019-10-10 16:01:20 +03:00
Simon Zolin
32e87b6efb Merge: * whois/rdns: process up to 100 top clients on startup
Close #1055 Close #1035

* commit '701233a4b786495be2f7f8e5e33ebf041481df01':
  - client: fix default page size for dashboard tables
  - whois/rdns: start processing top clients on startup after DNS server is started
  * whois/rdns: process up to 100 top clients on startup
2019-10-10 15:25:44 +03:00
Ildar Kamalov
701233a4b7 - client: fix default page size for dashboard tables 2019-10-10 14:00:02 +03:00
Simon Zolin
6a08a9faa6 - whois/rdns: start processing top clients on startup after DNS server is started 2019-10-10 14:00:02 +03:00
Simon Zolin
8676cabc42 * whois/rdns: process up to 100 top clients on startup 2019-10-10 13:55:44 +03:00
Simon Zolin
51f9d7e4df Merge: * dnsfilter: major refactoring
Close #928

* commit '31ec7f9652c6fb5947eca9e96f1507aad3e5ed13':
  * doc: new arch picture
  * dnsfilter: major refactoring
2019-10-10 12:33:18 +03:00
Simon Zolin
31ec7f9652 * doc: new arch picture 2019-10-09 20:05:21 +03:00
Simon Zolin
a59e346d4a * dnsfilter: major refactoring
* dnsfilter is controlled by package home, not dnsforward
* move HTTP handlers to dnsfilter/
* apply filtering settings without DNS server restart
* use only 1 goroutine for filters update
* apply new filters quickly (after they are ready to be used)
2019-10-09 20:05:21 +03:00
Simon Zolin
b43c076c4d Merge: * querylog: refactor: move HTTP handlers to querylog/
* commit '90db91b0fd347d168ef9589405ba812c0cfc0c2d':
  * querylog: refactor: move HTTP handlers to querylog/
2019-10-09 19:43:00 +03:00
Simon Zolin
90db91b0fd * querylog: refactor: move HTTP handlers to querylog/ 2019-10-09 19:38:58 +03:00
Simon Zolin
3862fa7659 Merge: - stats: fix crash
Close #1051

* commit '9ff39a362f83b94b685982efd62329bdd264eb21':
  - stats: fix crash
2019-10-09 19:37:03 +03:00
Simon Zolin
9ff39a362f - stats: fix crash 2019-10-09 19:27:19 +03:00
Simon Zolin
f4451dca7b Merge: * whois: improvements
Close #1035, Close #1036, Close #1047

* commit 'bd29b22f17d5b326d9fd603aa4f74593a0f1fca7':
  * CI: disable check if Git repo contains uncommited changes
  - whois: use the first "descr" field, not the last
  * filter: speed up parsing
  * whois: use whois.arin.net
  + whois, rdns: begin getting info for the most active clients on startup
  + stats: GetTopData()
  * stats: refactor
2019-10-09 19:26:42 +03:00
Simon Zolin
bd29b22f17 * CI: disable check if Git repo contains uncommited changes 2019-10-09 18:03:22 +03:00
Simon Zolin
e9186e6202 - whois: use the first "descr" field, not the last 2019-10-09 18:03:22 +03:00
Simon Zolin
3b9b37dde7 * filter: speed up parsing 2019-10-09 18:03:22 +03:00
Simon Zolin
37fe3c148f * whois: use whois.arin.net
+ robust redirect mechanism
* decrease timeout 30sec -> 5sec
* faster response parsing
* don't use likexian/whois-go package
2019-10-09 18:03:22 +03:00
Simon Zolin
d75620fdc0 + whois, rdns: begin getting info for the most active clients on startup 2019-10-09 18:03:22 +03:00
Simon Zolin
418baa608f + stats: GetTopData() 2019-10-09 18:03:22 +03:00
Simon Zolin
4165688f25 * stats: refactor 2019-10-09 18:02:09 +03:00
Simon Zolin
e7463b380d Merge: * systemd service file: fix boot priority: start AGH after network is online
Close #1048

* commit '127cca0c83d9afc95c6957c5745d36e770e0d19b':
  * systemd service file: fix boot priority: start AGH after network is online
2019-10-09 15:36:00 +03:00
Simon Zolin
127cca0c83 * systemd service file: fix boot priority: start AGH after network is online 2019-10-08 12:29:11 +03:00
Simon Zolin
652816ceb1 Merge: * querylog, stats: don't print unnecessary log messages
Close #1039

* commit 'c9b4a0742ffa13d831240b53b67559999b183cf7':
  * querylog, stats: don't print unnecessary log messages
2019-10-07 13:45:02 +03:00
Simon Zolin
c9b4a0742f * querylog, stats: don't print unnecessary log messages 2019-10-07 12:03:56 +03:00
Ildar Kamalov
8b7d23e7d0 Merge: Block epic games
* commit '55538f72eae3b62a7f7f8876c9b0e25d429110e1':
  block epic games
2019-10-04 18:17:06 +03:00
Devin Buhl
55538f72ea block epic games 2019-10-04 17:57:51 +03:00
Ildar Kamalov
586a28dc5e Merge: Add new languages and update translations
Closes #1043

* commit 'eb6dc76920c4da5a38de433ae437d6ac9dc272c2':
  + i18n: add new languages
  + client: add new languages and update translations
2019-10-04 10:05:18 +03:00
Ildar Kamalov
eb6dc76920 + i18n: add new languages 2019-10-03 20:52:14 +03:00
Ildar Kamalov
2d402f8cf7 + client: add new languages and update translations 2019-10-03 20:52:14 +03:00
Andrey Meshkov
423d311fcb Merge: *(global): CI scripts
Fix: #1042

* commit '8a05e61feb2a8b7c73c6f4c8f11c5a076c43170b':
  *: fix auth tests - don't leave repo dirty
  *: tests mustn't leave repo dirty
  *: change initDNSServer method, add getDataDir
  *: fix linter warnings
  *(global): fix travis config
  *(global): fix CI scripts
  *(global): CI scripts
2019-10-02 17:26:47 +03:00
Andrey Meshkov
8a05e61feb *: fix auth tests - don't leave repo dirty 2019-10-02 17:02:16 +03:00
Andrey Meshkov
ed0c5ee525 *: tests mustn't leave repo dirty 2019-10-02 16:59:34 +03:00
Andrey Meshkov
33ae359cc1 *: change initDNSServer method, add getDataDir 2019-10-02 16:53:23 +03:00
Andrey Meshkov
9b23acf6da *: fix linter warnings 2019-10-02 16:40:26 +03:00
Andrey Meshkov
e4fba69f9d *(global): fix travis config 2019-10-02 16:39:32 +03:00
Andrey Meshkov
846f503337 *(global): fix CI scripts 2019-10-02 16:23:17 +03:00
Andrey Meshkov
b835baf013 *(global): CI scripts 2019-10-02 15:41:14 +03:00
Andrey Meshkov
c020c1d0af *(dnsfilter): upd dependencies 2019-10-02 15:37:41 +03:00
Ildar Kamalov
cd9e4f176a Merge: Footer: Open adguard.com in new tab
* commit '60e21c77c32c43434c6496ff2d9bb99d7028837f':
  Footer: use rel="noopener noreferrer"
  Footer: Open adguard.com in new tab
2019-10-01 15:21:39 +03:00
Ildar Kamalov
9229b25a1b Merge: + client: submit retention form after confirm
Closes #1021

* commit 'ef1d4f5e9fdacff5e4ee01a84dce0ed8403c67b4':
  + client: submit retention form after confirm
2019-09-30 11:32:29 +03:00
Devin Buhl
60e21c77c3 Footer: use rel="noopener noreferrer" 2019-09-27 11:44:11 -04:00
Devin Buhl
1961955d15 Footer: Open adguard.com in new tab 2019-09-27 10:38:41 -04:00
Ildar Kamalov
75a8f9f850 Merge: - client: check if data loaded before the request with older_than
* commit '85d6994719a724e8dd0828bb90c459a422767d12':
  - client: check if data loaded before the request with older_than
2019-09-27 14:57:26 +03:00
Ildar Kamalov
85d6994719 - client: check if data loaded before the request with older_than 2019-09-27 14:32:52 +03:00
Ildar Kamalov
ef1d4f5e9f + client: submit retention form after confirm 2019-09-27 13:29:37 +03:00
Simon Zolin
6a65c79a03 Merge: - crash after filter update if its data is too small
* commit '319cc848bd9f62f926e20de10092271536eb5786':
  - crash after filter update if its data is too small
2019-09-27 13:25:41 +03:00
Simon Zolin
319cc848bd - crash after filter update if its data is too small 2019-09-27 13:22:08 +03:00
Simon Zolin
309feeae9a Merge: * dnsproxy v0.19.4
* commit 'ccd9cee9df1bc47a24f94d0ee1bb5177a626da0d':
  * dnsproxy v0.19.4
2019-09-26 18:53:06 +03:00
Simon Zolin
ccd9cee9df * dnsproxy v0.19.4 2019-09-26 18:48:44 +03:00
Simon Zolin
02d0c0a8f3 Merge: + QueryLog: server-side paging and filtering
Close #776

* commit 'f04c028e380182558d772ac6d65efe4f7bdb48d8':
  + client: handle filter change
  + client: server side pagination for the query logs
  * querylog: POST /control/querylog
  * openapi
2019-09-26 18:38:27 +03:00
Ildar Kamalov
f04c028e38 + client: handle filter change 2019-09-26 18:31:13 +03:00
Ildar Kamalov
9ac6049405 + client: server side pagination for the query logs 2019-09-26 18:30:38 +03:00
Simon Zolin
81828c87c1 * querylog: POST /control/querylog 2019-09-26 18:27:31 +03:00
Simon Zolin
215a488a64 * openapi 2019-09-26 18:24:23 +03:00
Simon Zolin
250f829b29 Merge: * stats: refactor: move HTTP handlers to stats/
* commit 'bbb5413331d43bbc182834ea8b3c2318280c7748':
  * stats: refactor: move HTTP handlers to stats/
2019-09-26 16:56:34 +03:00
Simon Zolin
bbb5413331 * stats: refactor: move HTTP handlers to stats/
DNS module passes additional parameters to Stats module.
This allows Stats to handle HTTP requests by itself - completely removing
 all stats-related code from outside.
2019-09-26 16:52:28 +03:00
Simon Zolin
407917241a Merge: * WHOIS: improvements
Close #861

* commit '563f8031dce889b076c91a4b3b6489241cd2b322':
  - client: fix naming
  - client: fix typo in translations
  + client: add icons to the whois info
  * clients: remove an auto-client if a client with the same IP was added manually
  + whois: use "descr" or "netname" in case there's no "orgname"
2019-09-26 16:46:07 +03:00
Ildar Kamalov
563f8031dc - client: fix naming 2019-09-26 12:17:58 +03:00
Ildar Kamalov
63efce0309 - client: fix typo in translations 2019-09-25 16:11:42 +03:00
Ildar Kamalov
ba62d42949 + client: add icons to the whois info 2019-09-25 16:11:42 +03:00
Simon Zolin
fcf37da312 * clients: remove an auto-client if a client with the same IP was added manually 2019-09-25 16:11:42 +03:00
Simon Zolin
95eeccde8f + whois: use "descr" or "netname" in case there's no "orgname" 2019-09-25 16:11:42 +03:00
Andrey Meshkov
875905ce8a Merge: Add WHOIS info for clients
* commit 'a52715e0863af0a9e1b26dbf96fc7cced02ae4f6':
  + client: add whois info to dashboard and logs
  + client: add whois info to clients and auto clients table
  * rDNS: refactor
  + whois: add WHOIS information for a client
2019-09-23 20:07:05 +03:00
Simon Zolin
77892bb7e9 Merge: * dnsforward: create dnsfilter asynchronously
Close #928

* commit '75b864f25ec5f762d6cbfc07d3dce7d77ca0629c':
  * dnsforward: create dnsfilter asynchronously
2019-09-23 20:03:38 +03:00
Simon Zolin
ce007e665d Merge: - dhcp: don't replace a static lease with a dynamic one
Close #1015 #1016

* commit 'fd3e153a043941c6f72d7f1c9cfaecdd537a490e':
  - dhcp: don't replace a static lease with a dynamic one
2019-09-23 20:02:44 +03:00
Simon Zolin
75b864f25e * dnsforward: create dnsfilter asynchronously 2019-09-23 20:00:11 +03:00
Simon Zolin
fd3e153a04 - dhcp: don't replace a static lease with a dynamic one 2019-09-23 18:47:13 +03:00
Ildar Kamalov
a52715e086 + client: add whois info to dashboard and logs 2019-09-23 18:17:56 +03:00
Ildar Kamalov
9e4f80f3c1 + client: add whois info to clients and auto clients table 2019-09-23 18:14:00 +03:00
Simon Zolin
192b58b9d9 * rDNS: refactor 2019-09-23 18:14:00 +03:00
Simon Zolin
fd592b4dc8 + whois: add WHOIS information for a client
+ return WHOIS info in GET /clients response
2019-09-23 18:12:54 +03:00
Simon Zolin
f6404ef181 Merge: + Log-In page
Close #865

* commit '95d9a537eab8c2651078841eda64beb5cbe62cd3':
  - client: fix translation
  + client: login page
  * client: fix translation string
  * minor
  *(home): fix golint issues
  - fix crash after stats module is closed
  + config: upgrade from v4 to v5
  + openapi: /login, /logout
  + Login page and web sessions
2019-09-19 18:16:37 +03:00
Ildar Kamalov
95d9a537ea - client: fix translation 2019-09-19 18:08:28 +03:00
Ildar Kamalov
66bd06cf69 + client: login page 2019-09-19 12:52:15 +03:00
Ildar Kamalov
1e4edf0669 * client: fix translation string 2019-09-19 12:47:55 +03:00
Simon Zolin
07fa9bb47c * minor 2019-09-19 12:47:55 +03:00
Andrey Meshkov
4e76013334 *(home): fix golint issues 2019-09-19 12:47:55 +03:00
Simon Zolin
d7f256ba7f - fix crash after stats module is closed
Close DNS forward module BEFORE stats.
2019-09-19 12:47:55 +03:00
Simon Zolin
a71521a658 + config: upgrade from v4 to v5 2019-09-19 12:47:55 +03:00
Simon Zolin
d2a5a550f7 + openapi: /login, /logout 2019-09-19 12:47:55 +03:00
Simon Zolin
6304a7b91b + Login page and web sessions
+ /control/login
+ /control/logout
2019-09-19 12:47:55 +03:00
Ildar Kamalov
74381b0cad Merge: - client: fix upstream DNS servers form
* commit '59a635f3f23bfcca583960f8ebb910d35f13e34d':
  + client: add isVersionGreater helper
  - client: fix upstream DNS servers form
2019-09-17 18:27:49 +03:00
Ildar Kamalov
59a635f3f2 + client: add isVersionGreater helper 2019-09-17 17:37:26 +03:00
Simon Zolin
97edc26c1b Merge: * stats: pass configuration object via stats.New()
* commit 'b8a98c1a77ef92e1cdc962150fe4bf5e38e98f93':
  * stats: pass configuration object via stats.New()
2019-09-17 12:29:21 +03:00
Simon Zolin
ff0b4fa3b5 Merge: - rewrites: AAAA rewrites didn't work
Close #989

* commit 'f4c29715b553b00561c7c7d68005350a5be1bf5a':
  - rewrites: AAAA rewrites didn't work
2019-09-17 12:29:04 +03:00
Ildar Kamalov
0a26ee4224 - client: fix upstream DNS servers form
Closes #1000
2019-09-17 12:25:29 +03:00
Simon Zolin
f4c29715b5 - rewrites: AAAA rewrites didn't work 2019-09-16 16:28:00 +03:00
Simon Zolin
b8a98c1a77 * stats: pass configuration object via stats.New() 2019-09-16 16:17:39 +03:00
Ildar Kamalov
48a4df1a9f Merge: - client: fix url change handler on filters modal
* commit '92561cf04f631cb65fcddf80838252d9b34b8e4a':
  - client: fix url change handler on filters modal
2019-09-16 15:18:23 +03:00
Simon Zolin
3862662201 Merge: + clients: runtime list: add clients from DHCP that have non-empty Hostname property
Close #979

* commit '0c2611ff978e55ee1d6f4dd54b9edd54a3fe5909':
  * minor
  + clients: runtime list: add clients from DHCP that have non-empty Hostname property
2019-09-16 13:54:56 +03:00
Simon Zolin
0c2611ff97 * minor 2019-09-16 13:06:32 +03:00
Simon Zolin
93babd3e1c + clients: runtime list: add clients from DHCP that have non-empty Hostname property 2019-09-16 13:06:32 +03:00
Ildar Kamalov
92561cf04f - client: fix url change handler on filters modal 2019-09-13 15:02:12 +03:00
Simon Zolin
9a28526fa3 Merge: - stats: fix crash on load
Close #999

* commit '8b7d08ebfc1b389c301300f6bad7368e85617921':
  - stats: fix crash on load
2019-09-13 13:10:46 +03:00
Simon Zolin
8b7d08ebfc - stats: fix crash on load 2019-09-13 12:58:57 +03:00
Simon Zolin
30ca77303b Merge: Add Filters Update Interval setting; refactor
Close #641

* commit 'd0fc1dc54dfbc017f28c6c0afa4623c6259af557':
  + client: handle filters configuration
  * openapi: update /filtering
  filtering: refactor;  change API;  add "filters_update_interval" setting
2019-09-12 19:06:39 +03:00
Simon Zolin
df5b41458f Merge: + dnsforward: disable Mozilla DoH - block use-application-dns.net
#988

* commit '47e29f96dfb9f254babcf4763912dc5e9a07ee2a':
  + dnsforward: disable Mozilla DoH - block use-application-dns.net
2019-09-12 19:05:29 +03:00
Simon Zolin
7b46f82fad Merge: Query log: add "interval" setting; add "clear log" button
#776 Close #446

* commit '8c89973365e660d47fa5fce88113414011961acb':
  - client: fix api client export
  - client: fix id and method name
  + client: handle logs configuration
  + openapi: /querylog_info, /querylog_config, /querylog_clear
  + doc: Relations between subsystems
  * querylog: move code to a separate package
2019-09-12 18:58:18 +03:00
Simon Zolin
47e29f96df + dnsforward: disable Mozilla DoH - block use-application-dns.net 2019-09-12 18:56:11 +03:00
Ildar Kamalov
d0fc1dc54d + client: handle filters configuration 2019-09-12 18:38:13 +03:00
Simon Zolin
57bb04685f * openapi: update /filtering 2019-09-12 18:38:13 +03:00
Simon Zolin
adb422fedf filtering: refactor; change API; add "filters_update_interval" setting
+ config: "filters_update_interval"
* add /control/filtering_info
* remove /control/filtering/enable
* remove /control/filtering/disable

* add /control/filtering_config
* remove /control/filtering/status

* add /control/filtering/set_url
* remove /control/filtering/enable_url
* remove /control/filtering/disable_url
2019-09-12 18:38:13 +03:00
Ildar Kamalov
8c89973365 - client: fix api client export 2019-09-12 18:35:13 +03:00
Ildar Kamalov
0e6c795c5b - client: fix id and method name 2019-09-12 18:35:13 +03:00
Ildar Kamalov
a753ae86cc + client: handle logs configuration 2019-09-12 18:35:13 +03:00
Simon Zolin
27f895cf46 + openapi: /querylog_info, /querylog_config, /querylog_clear 2019-09-12 18:35:13 +03:00
Simon Zolin
05bb705e43 + doc: Relations between subsystems 2019-09-12 18:35:13 +03:00
Simon Zolin
8104c902ee * querylog: move code to a separate package
+ config: "querylog_interval" setting
/control/querylog_config, /control/querylog_info
+ POST /control/querylog_clear
2019-09-12 18:35:13 +03:00
Simon Zolin
8f9ca4cba7 Merge: Fix stats module
* commit 'f9091472d790e5e340d0890906f51ef82720e7da':
  - openapi: fix
  - stats: fix incorrect loading of counters from file
  * stats: use uint32 or uint64 integer values, not int
  - /stats_config: write config
  - stats: use --workdir
2019-09-12 18:01:59 +03:00
Simon Zolin
f9091472d7 - openapi: fix 2019-09-12 17:53:27 +03:00
Simon Zolin
ce614ab8bf - stats: fix incorrect loading of counters from file 2019-09-12 17:53:27 +03:00
Simon Zolin
04e2566e9e * stats: use uint32 or uint64 integer values, not int 2019-09-12 17:53:27 +03:00
Simon Zolin
8a2aa57e24 - /stats_config: write config 2019-09-12 14:48:24 +03:00
Simon Zolin
97684368b9 - stats: use --workdir 2019-09-12 14:48:13 +03:00
Simon Zolin
d0dcaeaa04 Merge: i386/linux: don't build binary with sse
Close #996

* commit '4b2a2615cbb14c7297707104789a5983f7f1bada':
  i386/linux: don't build binary with sse
2019-09-11 16:46:22 +03:00
Simon Zolin
2356ae5bdd Merge: * filter update: ensure filter data is text
Close #527

* commit 'b078b82a89940bd96c7e9157c2f5c758224a72ae':
  * filter update: ensure filter data is text (but not html)
2019-09-11 16:45:56 +03:00
Andrey Korolyov
4b2a2615cb i386/linux: don't build binary with sse
The vast majority of today's x86 routers are amd64-based, and the rest are probably either
very old computers or specialized hardware such as PCEngines' ALIX series. For Go language,
adding GO386=387 disables SSE optimizations made by a compiler, effectively allowing binary
to run on old CPUs such as SC1100 or Geode LX.
2019-09-11 16:25:40 +03:00
Simon Zolin
b078b82a89 * filter update: ensure filter data is text (but not html)
stop checking Content-Type HTTP header
2019-09-10 15:22:17 +03:00
Ildar Kamalov
ad96d061a0 Merge: + client: update github issues link
* commit 'dba3c9aef1160e1fa1e4dbf99dbce5dbd0854b6d':
  + client: update github issues link
2019-09-09 14:43:28 +03:00
Ildar Kamalov
dba3c9aef1 + client: update github issues link
Closes #990
2019-09-09 11:59:53 +03:00
Simon Zolin
e346eddf94 Merge: new Statistics module
Close #827

* commit '17a26155cdf0150ea9d8cf915311f16fafa6354a':
  - client: convert average processing time to milliseconds
  + client: handle clear statistics
  + client: update time interval notice
  + client: add notice to the time interval input
  + client: functional components for dashboard
  * client: fix missed translations
  * client: change the result message after adding a filter
  + client: handle the new statistics format
  + client: handle time interval for statistics
  + openapi: add /stats_config, /stats_info methods
  * openapi: update /stats method
  + statistics: store in separate file
  * stats: remove old code
  + config: "statistics_interval" setting
  + /control/stats_config, /control/stats_info
2019-09-04 12:39:42 +03:00
Ildar Kamalov
17a26155cd - client: convert average processing time to milliseconds 2019-09-04 10:14:01 +03:00
Ildar Kamalov
63049e0521 + client: handle clear statistics 2019-09-04 10:14:01 +03:00
Ildar Kamalov
883910c19e + client: update time interval notice 2019-09-04 10:14:01 +03:00
Ildar Kamalov
cac8149d47 + client: add notice to the time interval input 2019-09-04 10:14:00 +03:00
Ildar Kamalov
6bce41bb0a + client: functional components for dashboard 2019-09-04 10:13:51 +03:00
Ildar Kamalov
75df5e8292 * client: fix missed translations
Closes #952
2019-09-04 10:13:21 +03:00
Ildar Kamalov
9087df5dcd * client: change the result message after adding a filter
Closes #948
2019-09-04 10:13:21 +03:00
Ildar Kamalov
6b2496d050 + client: handle the new statistics format 2019-09-04 10:13:21 +03:00
Ildar Kamalov
011bc3e36b + client: handle time interval for statistics 2019-09-04 10:13:18 +03:00
Simon Zolin
7ff27dbb42 + openapi: add /stats_config, /stats_info methods 2019-09-04 10:12:02 +03:00
Simon Zolin
55ceca6314 * openapi: update /stats method 2019-09-04 10:12:02 +03:00
Simon Zolin
4a58266ba3 + statistics: store in separate file
+ GET /control/stats handler
2019-09-04 10:12:02 +03:00
Simon Zolin
60eb55bdce * stats: remove old code 2019-09-04 10:12:01 +03:00
Simon Zolin
fe23b33d7e + config: "statistics_interval" setting 2019-09-04 10:12:01 +03:00
Simon Zolin
cc2654c371 + /control/stats_config, /control/stats_info 2019-09-04 10:12:01 +03:00
Ildar Kamalov
47e5fcb14c Merge: + client: add response information to the filtered query log items
Closes #912

* commit '428706399ae5bcd01daf4b4146c81a481fd680ef':
  + client: add response information to the filtered query log items
2019-09-04 10:10:39 +03:00
Ildar Kamalov
428706399a + client: add response information to the filtered query log items 2019-09-03 17:15:13 +03:00
Simon Zolin
3b98461a2a Merge: + config: add cache size and time settings
Close #947

* commit '4e8473f8a5b04d2b3883ab74323734ef5e976c0e':
  * use dnsproxy v0.19.1
  * dnsfilter: use golibs/cache
2019-09-03 17:14:14 +03:00
Simon Zolin
4e8473f8a5 * use dnsproxy v0.19.1 2019-09-02 19:13:20 +03:00
Simon Zolin
c616259e8b * dnsfilter: use golibs/cache
+ config: add cache size settings
+ config: add cache_time setting
2019-09-02 19:12:53 +03:00
Konstantin 🦄 Zamyakin
7d3fe71597 fix .twosky.json 2019-09-02 17:05:16 +03:00
Simon Zolin
a9524448b1 Merge: Set SSL certificate & privatekey from file
Close #634

* commit 'c05917bce0a4c823a4a3f58973e09f7dd8dae877':
  - client: remove unused strings
  * README: update link to the crowdin
  + client: handle fields for certificate path and private key path
  * openapi: update "TlsConfig"
  + config: add certificate_path, private_key_path
2019-08-30 19:36:51 +03:00
Ildar Kamalov
c05917bce0 - client: remove unused strings 2019-08-30 19:18:23 +03:00
Ildar Kamalov
7aa5c37e3b * README: update link to the crowdin 2019-08-30 19:18:23 +03:00
Ildar Kamalov
6d63450f03 + client: handle fields for certificate path and private key path 2019-08-30 19:18:23 +03:00
Simon Zolin
4445c4b669 * openapi: update "TlsConfig" 2019-08-30 19:18:23 +03:00
Simon Zolin
24bb708b21 + config: add certificate_path, private_key_path
* POST /control/tls/configure: support certificate_path and private_key_path
2019-08-30 19:18:14 +03:00
Ildar Kamalov
c847df9976 Merge: Add TikTok to Blocked services
Closes #950

* commit 'bdd86adac5a3fdc7013200e1448a7acb6a04993e':
  + blocked_services: add tiktok main domain
  + client: add tiktok icon
  + blocked_services: add tiktok
2019-08-29 13:34:58 +03:00
Ildar Kamalov
bdd86adac5 + blocked_services: add tiktok main domain 2019-08-29 11:45:39 +03:00
Ildar Kamalov
44a3a8857f + client: add tiktok icon 2019-08-29 11:40:17 +03:00
Ildar Kamalov
eb524e27a6 + blocked_services: add tiktok 2019-08-29 11:39:04 +03:00
Simon Zolin
be3f855df2 Merge: * /control/version.json: retry up to 3 times after DNS resolve of static.adguard.com has failed
Close #934

* commit 'd4c012220edc52e7d47808f1d83ce9ca664f73d3':
  * control: add link to the issue on github
  * /control/version.json: retry up to 3 times after DNS resolve of static.adguard.com has failed
2019-08-28 15:21:53 +03:00
Simon Zolin
d4c012220e * control: add link to the issue on github 2019-08-27 11:53:09 +03:00
Simon Zolin
815489c0ff * /control/version.json: retry up to 3 times after DNS resolve of static.adguard.com has failed 2019-08-26 16:02:56 +03:00
Simon Zolin
c7b5b00d14 Merge: * dhcp: validate range_start/range_end values
Close #848

* commit '625b22a8d7bece655216b926f1b4ce35e14ccb07':
  * dhcp: validate range_start/range_end values
2019-08-23 17:18:30 +03:00
Simon Zolin
dd632d3f69 Merge: * dhcp: when adding a static lease, it can replace a dynamic lease
Close #833

* commit '7acbeb89569cd0260a0e21eae3a2439b419c2e24':
  * dhcp: when adding a static lease, it can replace a dynamic lease
2019-08-23 17:18:10 +03:00
Simon Zolin
7acbeb8956 * dhcp: when adding a static lease, it can replace a dynamic lease 2019-08-23 16:14:00 +03:00
Simon Zolin
625b22a8d7 * dhcp: validate range_start/range_end values 2019-08-23 14:44:23 +03:00
Simon Zolin
307b934cf1 Merge: * control: refactor: all handlers are registered via httpRegister()
* commit '452a668a5ba66efa265621104fe3be17ae156ed5':
  * control: refactor: all handlers are registered via httpRegister()
2019-08-23 14:09:22 +03:00
Ildar Kamalov
fb2c625bd1 Merge: - client: fix IPv6 redirect url for install
* commit 'c8052c23d190ebcc8437a1c61b08e685e5657e70':
  fix condition
  - client: fix IPv6 redirect url for install
2019-08-23 13:54:44 +03:00
Ildar Kamalov
c8052c23d1 fix condition 2019-08-22 18:50:58 +03:00
Ildar Kamalov
0bd722c426 - client: fix IPv6 redirect url for install
Closes #953
2019-08-22 18:42:55 +03:00
Andrey Meshkov
53767a5bed *(documentation): bump openapi spec version to 0.98.1 2019-08-22 15:42:43 +03:00
Andrey Meshkov
64d40bdc47 Merge: - config: global "blocked_services" settings were reset on startup
* commit 'b1ca7c90d3ef0e72d3535b7cf195adfe83d34e5a':
  - config: global "blocked_services" settings were reset on startup
2019-08-22 15:38:24 +03:00
Simon Zolin
b1ca7c90d3 - config: global "blocked_services" settings were reset on startup 2019-08-22 15:30:48 +03:00
Simon Zolin
bde59364c6 Merge: - dnsforward: don't use dnsfilter object after it's closed (additional check)
* commit 'a370cd0bf035213ea7d09e1e577a4612934a8c5a':
  - dnsforward: don't use dnsfilter object after it's closed (additional check)
2019-08-22 12:05:55 +03:00
Simon Zolin
a370cd0bf0 - dnsforward: don't use dnsfilter object after it's closed (additional check) 2019-08-22 12:01:59 +03:00
Simon Zolin
452a668a5b * control: refactor: all handlers are registered via httpRegister()
* move some code to home/control_filtering.go
2019-08-21 14:52:57 +03:00
218 changed files with 41440 additions and 16131 deletions

3
.gitignore vendored
View File

@@ -12,7 +12,8 @@
/querylog.json
/querylog.json.1
/a_main-packr.go
coverage.txt
# Test output
dnsfilter/tests/top-1m.csv
dnsfilter/tests/dnsfilter.TestLotsOfRules*.pprof
dnsfilter/tests/dnsfilter.TestLotsOfRules*.pprof

View File

@@ -38,6 +38,9 @@ linters:
- gochecknoinits
- prealloc
- maligned
- godox
- funlen
- whitespace
- goconst # disabled until it's possible to configure
fast: true

View File

@@ -1,9 +1,9 @@
if: repo = AdguardTeam/AdGuardHome
language: go
sudo: false
go:
- 1.12.x
- 1.x
- 1.13.x
os:
- linux
- osx
@@ -11,6 +11,7 @@ os:
before_install:
- nvm install node
- npm install -g npm
- curl -sfL https://raw.githubusercontent.com/golangci/golangci-lint/master/install.sh| sh -s -- -b $(go env GOPATH)/bin v1.19.1
install:
- npm --prefix client install
@@ -22,13 +23,7 @@ cache:
- $HOME/Library/Caches/go-build
script:
- node -v
- npm -v
# Run tests
- go test -race -v -bench=. -coverprofile=coverage.txt -covermode=atomic ./...
# Make
- make build/static/index.html
- make
- /bin/bash ci.sh
after_success:
- bash <(curl -s https://codecov.io/bash)
@@ -39,17 +34,16 @@ notifications:
matrix:
include:
# Release build configuration
- if: repo = AdguardTeam/AdGuardHome
- name: release
go:
- 1.12.x
- 1.13.x
os:
- linux
script:
- node -v
- npm -v
# Run tests just in case
- go test -race -v -bench=. ./...
# Prepare releases
- ./release.sh
- ls -l dist
@@ -67,9 +61,9 @@ matrix:
skip_cleanup: true
- name: docker
if: type != pull_request AND (branch = master OR tag IS present)
if: type != pull_request AND (branch = master OR tag IS present) AND repo = AdguardTeam/AdGuardHome
go:
- 1.12.x
- 1.13.x
os:
- linux
services:

View File

@@ -2,19 +2,35 @@
{
"project_id": "home",
"base_locale": "en",
"localizable_files": "client/src/__locales/en.json",
"localizable_files": ["client/src/__locales/en.json"],
"languages": {
"da": "Dansk",
"de": "Deutsch",
"nl": "Dutch",
"no": "Norsk",
"en": "English",
"es": "Español",
"fr": "Français",
"id": "Indonesian",
"it": "Italiano",
"pl": "Polski",
"pt-br": "Portuguese (BR)",
"pt-pt": "Portuguese (PT)",
"sk": "Slovenčina",
"sl": "Slovenščina",
"sv": "Svenska",
"vi": "Tiếng Việt",
"tr": "Türkçe",
"cs": "Český",
"bg": "Български",
"ru": "Русский",
"ja": "日本語",
"zh-tw": "正體中文",
"zh-cn": "简体中文"
"zh-cn": "简体中文",
"sr-cs": "Srpski",
"hr": "Hrvatski",
"fa": "فارسی",
"ko": "한국어"
}
}
]
]

View File

@@ -12,18 +12,26 @@ Contents:
* Updating
* Get version command
* Update command
* TLS
* API: Get TLS configuration
* API: Set TLS configuration
* Device Names and Per-client Settings
* Per-client settings
* Get list of clients
* Add client
* Update client
* Delete client
* API: Find clients by IP
* Enable DHCP server
* "Show DHCP status" command
* "Check DHCP" command
* "Enable DHCP" command
* Static IP check/set
* Add a static lease
* API: Reset DHCP configuration
* DNS general settings
* API: Get DNS general settings
* API: Set DNS general settings
* DNS access settings
* List access settings
* Set access settings
@@ -34,6 +42,30 @@ Contents:
* Services Filter
* API: Get blocked services list
* API: Set blocked services list
* Statistics
* API: Get statistics data
* API: Clear statistics data
* API: Set statistics parameters
* API: Get statistics parameters
* Query logs
* API: Get query log
* API: Set querylog parameters
* API: Get querylog parameters
* Filtering
* Filters update mechanism
* API: Get filtering parameters
* API: Set filtering parameters
* API: Set URL parameters
* Log-in page
* API: Log in
* API: Log out
* API: Get current user info
## Relations between subsystems
![](doc/agh-arch.png)
## First startup
@@ -515,6 +547,80 @@ Response:
200 OK
### API: Reset DHCP configuration
Clear all DHCP leases and configuration settings.
DHCP server will be stopped if it's currently running.
Request:
POST /control/dhcp/reset
Response:
200 OK
## TLS
### API: Get TLS configuration
Request:
GET /control/tls/status
Response:
200 OK
{
"enabled":true,
"server_name":"...",
"port_https":443,
"port_dns_over_tls":853,
"certificate_chain":"...",
"private_key":"...",
"certificate_path":"...",
"private_key_path":"..."
"subject":"CN=...",
"issuer":"CN=...",
"not_before":"2019-03-19T08:23:45Z",
"not_after":"2029-03-16T08:23:45Z",
"dns_names":null,
"key_type":"RSA",
"valid_cert":true,
"valid_key":true,
"valid_chain":false,
"valid_pair":true,
"warning_validation":"Your certificate does not verify: x509: certificate signed by unknown authority"
}
### API: Set TLS configuration
Request:
POST /control/tls/configure
{
"enabled":true,
"server_name":"hostname",
"force_https":false,
"port_https":443,
"port_dns_over_tls":853,
"certificate_chain":"...",
"private_key":"...",
"certificate_path":"...", // if set, certificate_chain must be empty
"private_key_path":"..." // if set, private_key must be empty
}
Response:
200 OK
## Device Names and Per-client Settings
When a client requests information from DNS server, he's identified by IP address.
@@ -531,8 +637,6 @@ Notes:
* `name`, `ip` and `mac` values are unique.
* `ip` & `mac` values can't be set both at the same time.
* If `mac` is set and DHCP server is enabled, IP is taken from DHCP lease table.
* If `use_global_settings` is true, then DNS responses for this client are processed and filtered using global settings.
@@ -556,8 +660,7 @@ Response:
clients: [
{
name: "client1"
ip: "..."
mac: "..."
ids: ["...", ...] // IP, CIDR or MAC
use_global_settings: true
filtering_enabled: false
parental_enabled: false
@@ -565,6 +668,11 @@ Response:
safesearch_enabled: false
use_global_blocked_services: true
blocked_services: [ "name1", ... ]
whois_info: {
key: "value"
...
}
upstreams: ["upstream1", ...]
}
]
auto_clients: [
@@ -572,10 +680,16 @@ Response:
name: "host"
ip: "..."
source: "etc/hosts" || "rDNS"
whois_info: {
key: "value"
...
}
}
]
}
Supported keys for `whois_info`: orgname, country, city.
### Add client
@@ -585,8 +699,7 @@ Request:
{
name: "client1"
ip: "..."
mac: "..."
ids: ["...", ...] // IP, CIDR or MAC
use_global_settings: true
filtering_enabled: false
parental_enabled: false
@@ -594,6 +707,7 @@ Request:
safesearch_enabled: false
use_global_blocked_services: true
blocked_services: [ "name1", ... ]
upstreams: ["upstream1", ...]
}
Response:
@@ -615,8 +729,7 @@ Request:
name: "client1"
data: {
name: "client1"
ip: "..."
mac: "..."
ids: ["...", ...] // IP, CIDR or MAC
use_global_settings: true
filtering_enabled: false
parental_enabled: false
@@ -624,6 +737,7 @@ Request:
safesearch_enabled: false
use_global_blocked_services: true
blocked_services: [ "name1", ... ]
upstreams: ["upstream1", ...]
}
}
@@ -655,6 +769,85 @@ Error response (Client not found):
400
### API: Find clients by IP
This method returns the list of clients (manual and auto-clients) matching the IP list.
For auto-clients only `name`, `ids` and `whois_info` fields are set. Other fields are empty.
Request:
GET /control/clients/find?ip0=...&ip1=...&ip2=...
Response:
200 OK
[
{
"1.2.3.4": {
name: "client1"
ids: ["...", ...] // IP, CIDR or MAC
use_global_settings: true
filtering_enabled: false
parental_enabled: false
safebrowsing_enabled: false
safesearch_enabled: false
use_global_blocked_services: true
blocked_services: [ "name1", ... ]
whois_info: {
key: "value"
...
}
}
}
...
]
## DNS general settings
### API: Get DNS general settings
Request:
GET /control/dns_info
Response:
200 OK
{
"protection_enabled": true | false,
"ratelimit": 1234,
"blocking_mode": "nxdomain" | "null_ip" | "custom_ip",
"blocking_ipv4": "1.2.3.4",
"blocking_ipv6": "1:2:3::4",
"edns_cs_enabled": true | false,
}
### API: Set DNS general settings
Request:
POST /control/dns_config
{
"protection_enabled": true | false,
"ratelimit": 1234,
"blocking_mode": "nxdomain" | "null_ip" | "custom_ip",
"blocking_ipv4": "1.2.3.4",
"blocking_ipv6": "1:2:3::4",
"edns_cs_enabled": true | false,
}
Response:
200 OK
`blocking_ipv4` and `blocking_ipv6` values are active when `blocking_mode` is set to `custom_ip`.
## DNS access settings
There are low-level settings that can block undesired DNS requests. "Blocking" means not responding to request.
@@ -800,3 +993,429 @@ Request:
Response:
200 OK
## Statistics
Load (main thread):
. Load data from the last bucket from DB for the current hour
Runtime (DNS worker threads):
. Update current unit
Runtime (goroutine):
. Periodically check that current unit should be flushed to file (when the current hour changes)
. If so, flush it, allocate a new empty unit
Runtime (HTTP worker threads):
. To respond to "Get statistics" API request we:
. load all units from file
. load current unit
. process data from all loaded units:
. sum up data for "total counters" output values
. add value into "per time unit counters" output arrays
. aggregate data for "top_" output arrays; sort in descending order
Unload (main thread):
. Flush current unit to file
### API: Get statistics data
Request:
GET /control/stats
Response:
200 OK
{
time_units: hours | days
// total counters:
num_dns_queries: 123
num_blocked_filtering: 123
num_replaced_safebrowsing: 123
num_replaced_safesearch: 123
num_replaced_parental: 123
avg_processing_time: 123.123
// per time unit counters
dns_queries: [123, ...]
blocked_filtering: [123, ...]
replaced_parental: [123, ...]
replaced_safebrowsing: [123, ...]
top_queried_domains: [
{host: 123},
...
]
top_blocked_domains: [
{host: 123},
...
]
top_clients: [
{IP: 123},
...
]
}
### API: Clear statistics data
Request:
POST /control/stats_reset
Response:
200 OK
### API: Set statistics parameters
Request:
POST /control/stats_config
{
"interval": 1 | 7 | 30 | 90
}
Response:
200 OK
### API: Get statistics parameters
Request:
GET /control/stats_info
Response:
200 OK
{
"interval": 1 | 7 | 30 | 90
}
## Query logs
When a new DNS request is received and processed, we store information about this event in "query log". It is a file on disk in JSON format:
{
"IP":"127.0.0.1", // client IP
"T":"...", // response time
"QH":"...", // target host name without the last dot
"QT":"...", // question type
"QC":"...", // question class
"Answer":"...",
"OrigAnswer":"...",
"Result":{
"IsFiltered":true,
"Reason":3,
"Rule":"...",
"FilterID":1,
},
"Elapsed":12345,
"Upstream":"...",
}
### Adding new data
First, new data is stored in a memory region. When this array is filled to a particular amount of entries (e.g. 5000), we flush this data to a file and clear the array.
### Getting data
When UI asks for data from query log (see "API: Get query log"), server reads the newest entries from memory array and the file. The maximum number of items returned per one request is limited by configuration.
### Removing old data
We store data for a limited amount of time - the log file is automatically rotated.
### API: Get query log
Request:
GET /control/querylog
?older_than=2006-01-02T15:04:05.999999999Z07:00
&filter_domain=...
&filter_client=...
&filter_question_type=A | AAAA
&filter_response_status= | filtered
`older_than` setting is used for paging. UI uses an empty value for `older_than` on the first request and gets the latest log entries. To get the older entries, UI sets `older_than` to the `oldest` value from the server's response.
If "filter" settings are set, server returns only entries that match the specified request.
For `filter.domain` and `filter.client` the server matches substrings by default: `adguard.com` matches `www.adguard.com`. Strict matching can be enabled by enclosing the value in double quotes: `"adguard.com"` matches `adguard.com` but doesn't match `www.adguard.com`.
Response:
{
"oldest":"2006-01-02T15:04:05.999999999Z07:00"
"data":[
{
"answer":[
{
"ttl":10,
"type":"AAAA",
"value":"::"
}
...
],
"original_answer":[ // Answer from upstream server (optional)
{
"type":"AAAA",
"value":"::"
}
...
],
"client":"127.0.0.1",
"elapsedMs":"0.098403",
"filterId":1,
"question":{
"class":"IN",
"host":"doubleclick.net",
"type":"AAAA"
},
"reason":"FilteredBlackList",
"rule":"||doubleclick.net^",
"service_name": "...", // set if reason=FilteredBlockedService
"status":"NOERROR",
"time":"2006-01-02T15:04:05.999999999Z07:00"
}
...
]
}
The most recent entries are at the top of list.
### API: Set querylog parameters
Request:
POST /control/querylog_config
{
"enabled": true | false
"interval": 1 | 7 | 30 | 90
}
Response:
200 OK
### API: Get querylog parameters
Request:
GET /control/querylog_info
Response:
200 OK
{
"enabled": true | false
"interval": 1 | 7 | 30 | 90
}
## Filtering
![](doc/agh-filtering.png)
This is how DNS requests and responses are filtered by AGH:
* 'dnsproxy' module receives DNS request from client and passes control to AGH
* AGH applies filtering logic to the host name in DNS Question:
* process Rewrite rules
* match host name against filtering lists
* match host name against blocked services rules
* process SafeSearch rules
* request SafeBrowsing & ParentalControl services and process their response
* If the handlers above create a successful result that can be immediately sent to a client, it's passed back to 'dnsproxy' module
* Otherwise, AGH passes the DNS request to an upstream server via 'dnsproxy' module
* After 'dnsproxy' module has received a response from an upstream server, it passes control back to AGH
* If the filtering logic for DNS request returned a 'whitelist' flag, AGH passes the response to a client
* Otherwise, AGH applies filtering logic to each DNS record in response:
* For CNAME records, the target name is matched against filtering lists (ignoring 'whitelist' rules)
* For A and AAAA records, the IP address is matched against filtering lists (ignoring 'whitelist' rules)
### Filters update mechanism
Filters can be updated either manually by request from UI or automatically.
Auto-update interval can be configured in UI. If it is 0, auto-update is disabled.
When the last modification date of filter files is older than auto-update interval, auto-update procedure is started.
If an enabled filter file doesn't exist, it's downloaded on application startup. This includes the case when installation wizard is completed and there are no filter files yet.
When auto-update time comes, server starts the update procedure by downloading filter files. After new filter files are in place, it restarts DNS filtering module with new rules.
Only filters that are enabled by configuration can be updated.
As a result of the update procedure, all enabled filter files are written to disk, refreshed (their last modification date is equal to the current time) and loaded.
### API: Get filtering parameters
Request:
GET /control/filtering/status
Response:
200 OK
{
"enabled": true | false
"interval": 0 | 1 | 12 | 1*24 || 3*24 || 7*24
"filters":[
{
"id":1
"enabled":true,
"url":"https://...",
"name":"...",
"rules_count":1234,
"last_updated":"2019-09-04T18:29:30+00:00",
}
...
],
"user_rules":["...", ...]
}
### API: Set filtering parameters
Request:
POST /control/filtering/config
{
"enabled": true | false
"interval": 0 | 1 | 12 | 1*24 || 3*24 || 7*24
}
Response:
200 OK
### API: Set URL parameters
Request:
POST /control/filtering/set_url
{
"url": "..."
"enabled": true | false
}
Response:
200 OK
## Log-in page
After user completes the steps of installation wizard, he must log in into dashboard using his name and password. After user successfully logs in, he gets the Cookie which allows the server to authenticate him next time without password. After the Cookie is expired, user needs to perform log-in operation again. All requests without a proper Cookie get redirected to Log-In page with prompt for name and password.
YAML configuration:
users:
- name: "..."
password: "..." // bcrypt hash
...
Session DB file:
session="..." user=name expire=123456
...
Session data is SHA(random()+name+password).
Expiration time is UNIX time when cookie gets expired.
Any request to server must come with Cookie header:
GET /...
Cookie: session=...
If not authenticated, server sends a redirect response:
302 Found
Location: /login.html
### Reset password
There is no mechanism to reset the password. Instead, the administrator must use `htpasswd` utility to generate a new hash:
htpasswd -B -n -b username password
It will print `username:<HASH>` to the terminal. `<HASH>` value may be used in AGH YAML configuration file as a value to `password` setting:
users:
- name: "..."
password: <HASH>
### API: Log in
Perform a log-in operation for administrator. Server generates a session for this name+password pair, stores it in file. UI needs to perform all requests with this value inside Cookie HTTP header.
Request:
POST /control/login
{
name: "..."
password: "..."
}
Response:
200 OK
Set-Cookie: session=...; Expires=Wed, 09 Jun 2021 10:18:14 GMT; Path=/; HttpOnly
### API: Log out
Perform a log-out operation for administrator. Server removes the session from its DB and sets an expired cookie value.
Request:
GET /control/logout
Response:
302 Found
Location: /login.html
Set-Cookie: session=...; Expires=Thu, 01 Jan 1970 00:00:00 GMT
### API: Get current user info
Request:
GET /control/profile
Response:
200 OK
{
"name":"..."
}
If no client is configured then authentication is disabled and server sends an empty response.

View File

@@ -14,7 +14,7 @@ all: build
build: $(TARGET)
client/node_modules: client/package.json client/package-lock.json
npm --prefix client install
npm --prefix client ci
touch client/node_modules
$(STATIC): $(JSFILES) client/node_modules

View File

@@ -14,8 +14,8 @@
<a href="https://twitter.com/AdGuard">Twitter</a> |
<a href="https://t.me/adguard_en">Telegram</a>
<br /><br />
<a href="https://travis-ci.org/AdguardTeam/AdGuardHome">
<img src="https://travis-ci.org/AdguardTeam/AdGuardHome.svg" alt="Build status" />
<a href="https://travis-ci.com/AdguardTeam/AdGuardHome">
<img src="https://travis-ci.com/AdguardTeam/AdGuardHome.svg" alt="Build status" />
</a>
<a href="https://codecov.io/github/AdguardTeam/AdGuardHome?branch=master">
<img src="https://img.shields.io/codecov/c/github/AdguardTeam/AdGuardHome/master.svg" alt="Code Coverage" />
@@ -127,7 +127,7 @@ It depends.
You will need:
* [go](https://golang.org/dl/) v1.12 or later.
* [go](https://golang.org/dl/) v1.13 or later.
* [node.js](https://nodejs.org/en/download/) v10 or later.
You can either install it via the provided links or use [brew.sh](https://brew.sh/) if you're on Mac:
@@ -191,7 +191,7 @@ If you run into any problem or have a suggestion, head to [this page](https://gi
If you want to help with AdGuard Home translations, please learn more about translating AdGuard products here: https://kb.adguard.com/en/general/adguard-translations
Here is a link to AdGuard Home project: https://crowdin.com/project/adguard-applications
Here is a link to AdGuard Home project: https://crowdin.com/project/adguard-applications/en#/adguard-home
<a id="acknowledgments"></a>
## Acknowledgments

36
ci.sh Executable file
View File

@@ -0,0 +1,36 @@
#!/bin/bash
set -e
set -x
echo "Starting AdGuard Home CI script"
# Print the current directory contents
ls -la
# Check versions and current directory
node -v
npm -v
go version
golangci-lint --version
# Run linter
golangci-lint run
# Make
make clean
make build/static/index.html
make
# Run tests
go test -race -v -bench=. -coverprofile=coverage.txt -covermode=atomic ./...
# if [[ -z "$(git status --porcelain)" ]]; then
# # Working directory clean
# echo "Git status is clean"
# else
# echo "Git status is not clean and contains uncommited changes"
# echo "Please make sure there are no changes"
# exit 1
# fi
echo "AdGuard Home CI script finished successfully"

75
client/package-lock.json generated vendored
View File

@@ -5027,11 +5027,6 @@
}
}
},
"file-saver": {
"version": "1.3.8",
"resolved": "https://registry.npmjs.org/file-saver/-/file-saver-1.3.8.tgz",
"integrity": "sha512-spKHSBQIxxS81N/O21WmuXA2F6wppUCsutpzenOeZzOCCJ5gEfcbqJP983IrpLXzYmXnMUa6J03SubcNPdKrlg=="
},
"fill-range": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz",
@@ -5219,8 +5214,7 @@
"ansi-regex": {
"version": "2.1.1",
"bundled": true,
"dev": true,
"optional": true
"dev": true
},
"aproba": {
"version": "1.2.0",
@@ -5241,14 +5235,12 @@
"balanced-match": {
"version": "1.0.0",
"bundled": true,
"dev": true,
"optional": true
"dev": true
},
"brace-expansion": {
"version": "1.1.11",
"bundled": true,
"dev": true,
"optional": true,
"requires": {
"balanced-match": "^1.0.0",
"concat-map": "0.0.1"
@@ -5263,20 +5255,17 @@
"code-point-at": {
"version": "1.1.0",
"bundled": true,
"dev": true,
"optional": true
"dev": true
},
"concat-map": {
"version": "0.0.1",
"bundled": true,
"dev": true,
"optional": true
"dev": true
},
"console-control-strings": {
"version": "1.1.0",
"bundled": true,
"dev": true,
"optional": true
"dev": true
},
"core-util-is": {
"version": "1.0.2",
@@ -5393,8 +5382,7 @@
"inherits": {
"version": "2.0.3",
"bundled": true,
"dev": true,
"optional": true
"dev": true
},
"ini": {
"version": "1.3.5",
@@ -5406,7 +5394,6 @@
"version": "1.0.0",
"bundled": true,
"dev": true,
"optional": true,
"requires": {
"number-is-nan": "^1.0.0"
}
@@ -5421,7 +5408,6 @@
"version": "3.0.4",
"bundled": true,
"dev": true,
"optional": true,
"requires": {
"brace-expansion": "^1.1.7"
}
@@ -5429,14 +5415,12 @@
"minimist": {
"version": "0.0.8",
"bundled": true,
"dev": true,
"optional": true
"dev": true
},
"minipass": {
"version": "2.3.5",
"bundled": true,
"dev": true,
"optional": true,
"requires": {
"safe-buffer": "^5.1.2",
"yallist": "^3.0.0"
@@ -5455,7 +5439,6 @@
"version": "0.5.1",
"bundled": true,
"dev": true,
"optional": true,
"requires": {
"minimist": "0.0.8"
}
@@ -5536,8 +5519,7 @@
"number-is-nan": {
"version": "1.0.1",
"bundled": true,
"dev": true,
"optional": true
"dev": true
},
"object-assign": {
"version": "4.1.1",
@@ -5549,7 +5531,6 @@
"version": "1.4.0",
"bundled": true,
"dev": true,
"optional": true,
"requires": {
"wrappy": "1"
}
@@ -5635,8 +5616,7 @@
"safe-buffer": {
"version": "5.1.2",
"bundled": true,
"dev": true,
"optional": true
"dev": true
},
"safer-buffer": {
"version": "2.1.2",
@@ -5672,7 +5652,6 @@
"version": "1.0.2",
"bundled": true,
"dev": true,
"optional": true,
"requires": {
"code-point-at": "^1.0.0",
"is-fullwidth-code-point": "^1.0.0",
@@ -5692,7 +5671,6 @@
"version": "3.0.1",
"bundled": true,
"dev": true,
"optional": true,
"requires": {
"ansi-regex": "^2.0.0"
}
@@ -5736,14 +5714,12 @@
"wrappy": {
"version": "1.0.2",
"bundled": true,
"dev": true,
"optional": true
"dev": true
},
"yallist": {
"version": "3.0.3",
"bundled": true,
"dev": true,
"optional": true
"dev": true
}
}
},
@@ -9873,12 +9849,20 @@
"dev": true
},
"prop-types": {
"version": "15.6.2",
"resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.6.2.tgz",
"integrity": "sha512-3pboPvLiWD7dkI3qf3KbUe6hKFKa52w+AE0VCqECtf+QHAKgOL37tTaNCnuX1nAAQ4ZhyP+kYVKf8rLmJ/feDQ==",
"version": "15.7.2",
"resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.7.2.tgz",
"integrity": "sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ==",
"requires": {
"loose-envify": "^1.3.1",
"object-assign": "^4.1.1"
"loose-envify": "^1.4.0",
"object-assign": "^4.1.1",
"react-is": "^16.8.1"
},
"dependencies": {
"react-is": {
"version": "16.9.0",
"resolved": "https://registry.npmjs.org/react-is/-/react-is-16.9.0.tgz",
"integrity": "sha512-tJBzzzIgnnRfEm046qRcURvwQnZVXmuCbscxUO5RWrGTXpon2d4c8mI0D8WE6ydVIm29JiLB6+RslkIvym9Rjw=="
}
}
},
"proxy-addr": {
@@ -10217,9 +10201,9 @@
}
},
"react-table": {
"version": "6.8.6",
"resolved": "https://registry.npmjs.org/react-table/-/react-table-6.8.6.tgz",
"integrity": "sha1-oK2LSDkxkFLVvvwBJgP7Fh5S7eM=",
"version": "6.10.3",
"resolved": "https://registry.npmjs.org/react-table/-/react-table-6.10.3.tgz",
"integrity": "sha512-sVlq2/rxVaQJywGD95+qGiMr/SMHFIFnXdx619BLOWE/Os5FOGtV6pQJNAjZixbQZiOu7dmBO1kME28uxh6wmA==",
"requires": {
"classnames": "^2.2.5"
}
@@ -12722,6 +12706,11 @@
"requires-port": "^1.0.0"
}
},
"url-polyfill": {
"version": "1.1.7",
"resolved": "https://registry.npmjs.org/url-polyfill/-/url-polyfill-1.1.7.tgz",
"integrity": "sha512-ZrAxYWCREjmMtL8gSbSiKKLZZticgihCvVBtrFbUVpyoETt8GQJeG2okMWA8XryDAaHMjJfhnc+rnhXRbI4DXA=="
},
"use": {
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz",

10
client/package.json vendored
View File

@@ -6,19 +6,18 @@
"build-dev": "NODE_ENV=development ./node_modules/.bin/webpack --config webpack.dev.js",
"watch": "NODE_ENV=development ./node_modules/.bin/webpack --config webpack.dev.js --watch",
"build-prod": "NODE_ENV=production ./node_modules/.bin/webpack --config webpack.prod.js",
"lint": "eslint frontend/"
"lint": "eslint client/"
},
"dependencies": {
"@nivo/line": "^0.49.1",
"axios": "^0.19.0",
"classnames": "^2.2.6",
"date-fns": "^1.29.0",
"file-saver": "^1.3.8",
"i18next": "^12.0.0",
"i18next-browser-languagedetector": "^2.2.3",
"lodash": "^4.17.15",
"nanoid": "^1.2.3",
"prop-types": "^15.6.1",
"prop-types": "^15.7.2",
"react": "^16.4.0",
"react-click-outside": "^3.0.1",
"react-dom": "^16.4.0",
@@ -28,13 +27,14 @@
"react-redux-loading-bar": "^4.0.7",
"react-router-dom": "^4.2.2",
"react-router-hash-link": "^1.2.2",
"react-table": "^6.8.6",
"react-table": "^6.10.3",
"react-transition-group": "^2.4.0",
"redux": "^4.0.0",
"redux-actions": "^2.4.0",
"redux-form": "^7.4.2",
"redux-thunk": "^2.3.0",
"svg-url-loader": "^2.3.2"
"svg-url-loader": "^2.3.2",
"url-polyfill": "^1.1.7"
},
"devDependencies": {
"autoprefixer": "^8.6.3",

View File

@@ -5,6 +5,7 @@
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<meta name="theme-color" content="#000000">
<meta name="google" content="notranslate">
<meta http-equiv="x-dns-prefetch-control" content="off">
<link rel="icon" type="image/png" href="favicon.png" sizes="48x48">
<title>AdGuard Home</title>
</head>

17
client/public/login.html Normal file
View File

@@ -0,0 +1,17 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<meta name="theme-color" content="#000000">
<meta name="google" content="notranslate">
<link rel="icon" type="image/png" href="favicon.png" sizes="48x48">
<title>Login</title>
</head>
<body>
<noscript>
You need to enable JavaScript to run this app.
</noscript>
<div id="root"></div>
</body>
</html>

View File

@@ -1,5 +1,4 @@
{
"url_added_successfully": "Успешно добавен URL",
"check_dhcp_servers": "Проверка за активен DHCP сървър",
"save_config": "Запиши настройките",
"enabled_dhcp": "DHCP е разрешен",
@@ -12,9 +11,7 @@
"dhcp_found": "Вашата мрежа вече има активен DHCP сървър. Не е безопасно ползването на втори!",
"dhcp_leases": "DHCP раздадени адреси",
"dhcp_leases_not_found": "Няма намерени активни DHCP адреси",
"dhcp_config_saved": "Запиши конфигурацията на DHCP сървъра",
"form_error_required": "Задължително поле",
"form_error_ip_format": "Невалиден IPv4 адрес",
"form_error_positive": "Проверете дали е положително число",
"dhcp_form_gateway_input": "IP шлюз",
"dhcp_form_subnet_input": "Мрежова маска",
@@ -48,7 +45,6 @@
"disabled_protection": "Защитата е забранена",
"refresh_statics": "Обнови статистиката",
"dns_query": "DNS запитвания",
"blocked_by": "Блокирани от",
"stats_malware_phishing": "вируси/атаки",
"stats_adult": "сайтове за възрастни",
"stats_query_domain": "Най-отваряни страници",
@@ -59,7 +55,6 @@
"top_clients": "Най-активни IP адреси",
"no_clients_found": "Нямa намерени адреси",
"general_statistics": "Обща статисика",
"number_of_dns_query_24_hours": "Сума на DNS заявки за последните 24 часа",
"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": "Сума на блокирани сайтове за възрастни",
@@ -74,12 +69,9 @@
"use_adguard_parental": "Включи AdGuard Родителски Надзор",
"use_adguard_parental_hint": "Модул XXX в AdGuard Home ще провери дали страницата има материали за възвъстни. Използва се същия API за анонимност като при модула за Сигурност.",
"enforce_safe_search": "Включи Безопасно Търсене",
"enforce_save_search_hint": "AdGuard Home прилага Безопасно Търсене в следните търсачки и сайтове: Google, Youtube, Bing, и Yandex.",
"no_servers_specified": "Няма избрани услуги",
"no_settings": "Няма настройки",
"general_settings": "Общи настройки",
"upstream_dns": "Главен DNS сървър",
"upstream_dns_hint": "Ако оставите празно, AdGuard Home ще използва <a href='https://1.1.1.1/' target='_blank'>Cloudflare DNS</a> за главен. Използвай tls:// представка за DNS използващи TLS връзка.",
"test_upstream_btn": "Тествай главния DNS",
"apply_btn": "Приложи",
"disabled_filtering_toast": "Забрани филтрирането",
@@ -136,11 +128,7 @@
"show_all_filter_type": "Покажи всички",
"show_filtered_type": "Покажи филтрирани",
"no_logs_found": "Няма история",
"disabled_log_btn": "Забрани историята",
"download_log_file_btn": "Смъкни историята",
"refresh_btn": "Обнови",
"enabled_log_btn": "Разреши историята",
"last_dns_queries": "Последните 5000 DNS заявки",
"previous_btn": "Предходен",
"next_btn": "Следващ",
"loading_table_status": "Зареждане...",
@@ -150,8 +138,6 @@
"updated_custom_filtering_toast": "Обновени местни правила за филтриране",
"rule_removed_from_custom_filtering_toast": "Премахнато от местни правила за филтриране",
"rule_added_to_custom_filtering_toast": "Добавено до местни правила за филтриране",
"query_log_disabled_toast": "Историята е забранена",
"query_log_enabled_toast": "Историята е разрешена",
"source_label": "Източник",
"found_in_known_domain_db": "Намерен в списъците с домейни.",
"category_label": "Категория",
@@ -169,7 +155,6 @@
"install_settings_dns_desc": "За да работи, ще трябва да настроите вашият рутер или устройства да ползват DNS сървър с адрес:",
"install_settings_all_interfaces": "Всички интерфейси",
"install_auth_title": "Удостоверяване",
"install_auth_desc": "Много е важно да зададете име и парола за достъп до вашия панел за администрация на AdGuard Home. Препоръчваме ви да зададете име и парола независимо че го ползвате само в къщи.",
"install_auth_username": "Потребител",
"install_auth_password": "Парола",
"install_auth_confirm": "Потвърдете паролата",

View File

@@ -0,0 +1,413 @@
{
"client_settings": "Nastavení klienta",
"example_upstream_reserved": "můžete zadat DNS upstream <0>pro konkrétní doménu(y)</0>",
"upstream_parallel": "Použijte paralelní dotazy na urychlení řešení simultánním dotazováním na všechny navazující servery",
"bootstrap_dns": "Bootstrap DNS servery",
"bootstrap_dns_desc": "Servery Bootstrap DNS se používají k řešení IP adres DoH/DoT, které zadáváte jako upstreamy.",
"check_dhcp_servers": "Zkontrolovat DHCP servery",
"save_config": "Uložit konfiguraci",
"enabled_dhcp": "DHCP server zapnutý",
"disabled_dhcp": "DHCP server vypnutý",
"dhcp_title": "DHCP server (experimentální!)",
"dhcp_description": "Pokud váš router neposkytuje možnost nastavit DHCP, můžete použít vlastní vestavěný DHCP server AdGuardu.",
"dhcp_enable": "Zapnout DHCP server",
"dhcp_disable": "Vypnout DHCP server",
"dhcp_not_found": "Je bezpečné zapnout vestavěný server DHCP - v síti jsme nenalezli žádné aktivní servery DHCP. Doporučujeme však, abyste to znovu zkontrolovali ručně, protože v současné době náš automatický test neposkytuje 100% záruku.",
"dhcp_found": "V síti byly nalezeny aktivní DHCP servery. Není bezpečné zapnout vestavěný DHCP server.",
"dhcp_leases": "Pronájem DHCP",
"dhcp_static_leases": "Statické pronájmy DHCP",
"dhcp_leases_not_found": "Nebyly nalezeny žádné pronájmy DHCP",
"dhcp_config_saved": "Konfigurace DHCP serveru byla uložena",
"form_error_required": "Povinné pole",
"form_error_ip4_format": "Neplatný formát IPv4",
"form_error_ip6_format": "Neplatný formát IPv6",
"form_error_ip_format": "Neplatný formát IP",
"form_error_mac_format": "Neplatný formát MAC",
"form_error_positive": "Musí být větší než 0",
"dhcp_form_gateway_input": "IP brána",
"dhcp_form_subnet_input": "Maska podsítě",
"dhcp_form_range_title": "Rozsah IP adres",
"dhcp_form_range_start": "Začátek rozsahu",
"dhcp_form_range_end": "Konec rozsahu",
"dhcp_form_lease_title": "Doba pronájmu DHCP (v sekundách)",
"dhcp_form_lease_input": "Doba trvání pronájmu",
"dhcp_interface_select": "Vybrat rozhraní DHCP",
"dhcp_hardware_address": "Hardwarová adresa",
"dhcp_ip_addresses": "IP adresa",
"dhcp_table_hostname": "Název hostitele",
"dhcp_table_expires": "Vyprší",
"dhcp_warning": "Pokud chcete server DHCP povolit, ujistěte se, že ve Vaší síti není žádný aktivní server DHCP. V opačném případě může dojít k přerušení internetu pro připojená zařízení!",
"dhcp_error": "Nebylo možné určit, zda je v síti jiný server DHCP.",
"dhcp_static_ip_error": "Pro použití serveru DHCP musí být nastavena statická IP adresa. Nepodařilo se zjistit, zda je toto síťové rozhraní nakonfigurováno pomocí statické adresy IP. Nastavte prosím statickou IP adresu ručně.",
"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>. Automaticky nastavíme tuto IP adresu jako statickou, pokud stisknete tlačítko Zapnout DHCP.",
"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_new_static_lease": "Nový 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": "Opravdu chcete resetovat konfiguraci DHCP?",
"delete_confirm": "Opravdu chcete odstranit \"{{key}}\"?",
"form_enter_hostname": "Zadejte název hostitele",
"error_details": "Podrobnosti chyby",
"back": "Zpět",
"dashboard": "Hlavní panel",
"settings": "Nastavení",
"filters": "Filtry",
"query_log": "Protokol dotazů",
"faq": "FAQ",
"version": "Verze",
"address": "adresa",
"on": "ZAPNUTO",
"off": "VYPNUTO",
"copyright": "Autorská práva",
"homepage": "Domovská stránka",
"report_an_issue": "Nahlásit problém",
"privacy_policy": "Zásady ochrany osobních údajů",
"enable_protection": "Zapnout ochranu",
"enabled_protection": "Ochrana zapnuta",
"disable_protection": "Vypnout ochranu",
"disabled_protection": "Ochrana vypnuta",
"refresh_statics": "Obnovit statistiky",
"dns_query": "Dotazy DNS",
"blocked_by": "<0>Blokováno filtry</0>",
"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_days": "za posledních {{value}} dní",
"for_last_days_plural": "za posledních {{count}} dní",
"no_domains_found": "Nenalezeny žádné domény",
"requests_count": "Počet požadavků",
"top_blocked_domains": "Nejčastěji blokované domény",
"top_clients": "Nejčastější klienti",
"no_clients_found": "Nenalezeny žádní klienti",
"general_statistics": "Obecné statistiky",
"number_of_dns_query_days": "Počet DNS dotazů zpracovaných za posledních {{value}} dní",
"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_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čnost 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í",
"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 href='#filters'>Filtry</a>.",
"use_adguard_browsing_sec": "Použít službu AdGuard Bezpečnost prohlížení",
"use_adguard_browsing_sec_hint": "AdGuard Home zkontroluje, zda je doména na seznamu zakázaných služby Bezpečnost prohlížení. Použije API vyhledávání přátelské k ochraně soukromí na provedení kontroly: na server je poslána pouze krátká předpona názvu domény SHA256 hash.",
"use_adguard_parental": "Použít službu AdGuard Rodičovská kontrola",
"use_adguard_parental_hint": "AdGuard Home zkontroluje, zda doména obsahuje materiály pro dospělé. Používá stejné API přátelské k ochraně osobních údajů jako služba Bezpečnost prohlížení.",
"enforce_safe_search": "Vynutit bezpečné vyhledávání",
"enforce_save_search_hint": "AdGuard Home může vynutit bezpečné vyhledávání v následujících vyhledávačích: Google, YouTube, Bing, DuckDuckGo, Yandex, Pixabay.",
"no_servers_specified": "Nebyly specifikovány žádné servery",
"general_settings": "Obecná nastavení",
"dns_settings": "Nastavení DNS",
"encryption_settings": "Nastavení šifrování",
"dhcp_settings": "Nastavení DHCP",
"upstream_dns": "Upstream DNS servery",
"upstream_dns_hint": "Pokud toto pole ponecháte prázdné, AdGuard Home použije <a href='https://www.quad9.net/' target='_blank'>Quad9</a> jako upstream.",
"test_upstream_btn": "Test upstreamů",
"upstreams": "Upstreamy",
"apply_btn": "Použít",
"disabled_filtering_toast": "Vypnuté filtrování",
"enabled_filtering_toast": "Zapnuté filtrování",
"disabled_safe_browsing_toast": "Vypnuté bezpečné prohlížení",
"enabled_safe_browsing_toast": "Zapnuté bezpečné prohlížení",
"disabled_parental_toast": "Vypnutá Rodičovská kontrola",
"enabled_parental_toast": "Zapnutá Rodičovská kontrola",
"disabled_safe_search_toast": "Zapnuté bezpečné vyhledávání",
"enabled_save_search_toast": "Vypnuté bezpečné vyhledávání",
"enabled_table_header": "Zapnuto",
"name_table_header": "Název",
"filter_url_table_header": "URL filtru",
"rules_count_table_header": "Počet pravidel",
"last_time_updated_table_header": "Čas poslední aktualizace",
"actions_table_header": "Akce",
"edit_table_action": "Upravit",
"delete_table_action": "Vymazat",
"filters_and_hosts": "Filtry a seznamy blokovaných hostitelů",
"filters_and_hosts_hint": "AdGuard Home zná základní pravidla blokování reklam a syntaxe hostsitelských souborů.",
"no_filters_added": "Nebyly přidány žádné filtry",
"add_filter_btn": "Přidat filtr",
"cancel_btn": "Zrušit",
"enter_name_hint": "Zadejte název",
"enter_url_hint": "Zadejte URL",
"check_updates_btn": "Zkontrolovat aktualizace",
"new_filter_btn": "Odběr nového filtru",
"enter_valid_filter_url": "Zadejte platnou URL pro odběr filtru nebo hostitelského souboru.",
"custom_filter_rules": "Vlastní pravidla filtrování",
"custom_filter_rules_hint": "Na každý řádek vložte jedno pravidlo. Můžete použít buď pravidla blokování reklam nebo syntaxe hostitelských souborů.",
"examples_title": "Příklady",
"example_meaning_filter_block": "zablokovat přístup k doméně example.org a všem jejím subdoménám",
"example_meaning_filter_whitelist": "odblokovat přístup k doméně example.org a všem jejím subdoménám",
"example_meaning_host_block": "AdGuard Home nyní vrátí adresu 127.0.0.1 pro doménu example.org (ale ne pro její subdomény).",
"example_comment": "! Sem se přidává komentář",
"example_comment_meaning": "jen komentář",
"example_comment_hash": "# Také komentář",
"example_regex_meaning": "blokuje přístup doménám, které vyhovují regulárnímu výrazu",
"example_upstream_regular": "obyčejný DNS (přes UDP)",
"example_upstream_dot": "šifrovaný <0>DNS přes TLS</0>",
"example_upstream_doh": "šifrovaný <0>DNS přes HTTPS</0>",
"example_upstream_sdns": "můžete použít <0>DNS razítka</0> pro <1>DNSCrypt</1> nebo <2>DNS přes HTTPS</2> řešitele",
"example_upstream_tcp": "obyčejný DNS (přes TCP)",
"all_filters_up_to_date_toast": "Všechny filtry jsou již aktuální",
"updated_upstream_dns_toast": "Aktualizované upstream DNS servery",
"dns_test_ok_toast": "Specifikované DNS servery pracují správně",
"dns_test_not_ok_toast": "Server \"{{key}}\": nemohl být použit, zkontrolujte, zda jste ho správně napsali",
"unblock_btn": "Odblokovat",
"block_btn": "Blokovat",
"time_table_header": "Čas",
"domain_name_table_header": "Název domény",
"type_table_header": "Typ",
"response_table_header": "Odezva",
"client_table_header": "Klient",
"empty_response_status": "Prázdná",
"show_all_filter_type": "Zobrazit vše",
"show_filtered_type": "Zobrazit filtrované",
"no_logs_found": "Nenalezeny žádné protokoly",
"refresh_btn": "Obnovit",
"previous_btn": "Předchozí",
"next_btn": "Další",
"loading_table_status": "Načítání...",
"page_table_footer_text": "Stránka",
"of_table_footer_text": "z",
"rows_table_footer_text": "řádky",
"updated_custom_filtering_toast": "Aktualizovaná vlastní pravidla filtrování",
"rule_removed_from_custom_filtering_toast": "Pravidlo odstraněno z vlastních pravidel filtrování",
"rule_added_to_custom_filtering_toast": "Pravidlo přidáno do vlastních pravidel filtrování",
"query_log_response_status": "Status: {{value}}",
"query_log_filtered": "Filtrováno pomocí {{filter}}",
"query_log_confirm_clear": "Opravdu chcete vymazat celý protokol dotazů?",
"query_log_cleared": "Protokol dotazů byl úspěšně vymazán",
"query_log_clear": "Vymazat protokoly dotazů",
"query_log_retention": "Uchování protokolů dotazů",
"query_log_enable": "Povolit protokol",
"query_log_configuration": "Konfigurace protokolů",
"query_log_disabled": "Protokol dotazu je zakázán a lze jej nakonfigurovat v <0>nastavení</0>",
"query_log_strict_search": "Pro striktní vyhledávání použijte dvojité uvozovky",
"query_log_retention_confirm": "Opravdu chcete změnit uchovávání protokolu dotazů? Pokud snížíte hodnotu intervalu, některá data budou ztracena",
"source_label": "Zdroj",
"found_in_known_domain_db": "Nalezeno v databázi známých domén",
"category_label": "Kategorie",
"rule_label": "Pravidlo",
"filter_label": "Filtr",
"unknown_filter": "Neznámý filtr {{filterId}}",
"install_welcome_title": "Vítejte v AdGuard Home!",
"install_welcome_desc": "AdGuard Home je síťový DNS server pro blokování reklam a slídičů. Jeho cílem je, abyste ovládali celou Vaši síť a všechny Vaše zařízení, přičemž se nevyžaduje použití jakéhokoliv programu na straně klienta.",
"install_settings_title": "Administrátorské webové rozhraní",
"install_settings_listen": "Síťové rozhraní",
"install_settings_port": "Port",
"install_settings_interface_link": "Vaše administrátorské webové rozhraní AdGuard Home bude k dispozici na těchto adresách:",
"form_error_port": "Zadejte platnou hodnotu portu",
"install_settings_dns": "DNS server",
"install_settings_dns_desc": "Budete muset nakonfigurovat Vaše zařízení nebo router, aby používali DNS server na následujících adresách:",
"install_settings_all_interfaces": "Všechna rozhraní",
"install_auth_title": "Ověřování",
"install_auth_desc": "Doporučujeme Vám nakonfigurovat v administrátorském webovém rozhraní AdGuard Home ověření Vaší identity heslem. I když je přístupné pouze ve Vaší lokální síti, je stále důležité chránit jej před neomezeným přístupem.",
"install_auth_username": "Uživatelské jméno",
"install_auth_password": "Heslo",
"install_auth_confirm": "Potvrďte heslo",
"install_auth_username_enter": "Zadejte uživatelské jméno",
"install_auth_password_enter": "Zadejte heslo",
"install_step": "Krok",
"install_devices_title": "Nakonfigurujte vaše zařízení",
"install_devices_desc": "Chcete-li začít používat aplikaci AdGuard Home, musíte nakonfigurovat zařízení tak, aby ji mohla používat.",
"install_submit_title": "Gratulujeme!",
"install_submit_desc": "Nastavení je dokončeno a jste připraveni začít používat AdGuard Home.",
"install_devices_router": "Router",
"install_devices_router_desc": "Toto nastavení automaticky pokryje všechna zařízení připojená k Vašemu domácímu routeru a nebudete je muset konfigurovat ručně.",
"install_devices_address": "DNS server AdGuard Home používá následujíce adresy",
"install_devices_router_list_1": "Otevřete předvolby pro router. Obvykle k němu můžete přistupovat z prohlížeče prostřednictvím adresy URL (např. http://192.168.0.1/ nebo http://192.168.1.1/). Můžete být vyzváni k zadání hesla. Pokud si ho nepamatujete, můžete heslo resetovat stisknutím tlačítka na samotném routeru. Některé routery vyžadují specifickou aplikaci, která by v takovém případě měla být již nainstalována v počítači/telefonu.",
"install_devices_router_list_2": "Vyhledejte nastavení DHCP/DNS. Hledejte zkratku DNS vedle pole, které umožňuje vložit dvě nebo tři sady čísel, každé rozděleno do čtyř skupin s jedním až třemi číslicemi.",
"install_devices_router_list_3": "Zadejte adresy Vašeho serveru AdGuard Home.",
"install_devices_windows_list_1": "Otevřete ovládací panel prostřednictvím nabídky Start nebo vyhledání v systému Windows.",
"install_devices_windows_list_2": "Přejděte na kategorii Síť a Internet a poté na Centrum sítí a sdílení.",
"install_devices_windows_list_3": "Na levé straně obrazovky najděte možnost Změnit nastavení adaptéru a klepněte na něj.",
"install_devices_windows_list_4": "Vyberte své aktivní spojení, klikněte na něj pravým tlačítkem myši a zvolte Vlastnosti.",
"install_devices_windows_list_5": "V seznamu najděte Internet Protocol Version 4 (TCP/IP), vyberte jej a znovu klikněte na Vlastnosti.",
"install_devices_windows_list_6": "Zvolte Použít následující adresy serveru DNS a zadejte adresy AdGuard Home..",
"install_devices_macos_list_1": "Klikněte na ikonu Apple a přejděte na položku Systémové předvolby.",
"install_devices_macos_list_2": "Klikněte na Síť.",
"install_devices_macos_list_3": "Vyberte první připojení v seznamu a klepněte na tlačítko Pokročilé.",
"install_devices_macos_list_4": "Vyberte kartu DNS a zadejte adresy serveru AdGuard Home.",
"install_devices_android_list_1": "Na domovské obrazovce nabídky Android klepněte na Nastavení.",
"install_devices_android_list_2": "V nabídce klepněte na Wi-Fi. Zobrazí se obrazovka se seznamem všech dostupných sítí (není možné nastavit vlastní DNS pro mobilní připojení).",
"install_devices_android_list_3": "Dlouze stiskněte síť, ke které jste připojeni, a klepněte na položku Změnit síť.",
"install_devices_android_list_4": "V některých zařízeních bude pravděpodobně nutné zaškrtnout políčko Rozšířené a zobrazit další nastavení. Chcete-li upravit nastavení DNS systému Android, budete muset přepnout nastavení IP adresy z DHCP na Statickou.",
"install_devices_android_list_5": "Změňte nastavené hodnoty DNS 1 a DNS 2 na adresy serveru AdGuard Home.",
"install_devices_ios_list_1": "Na domovské obrazovce klepněte na Nastavení.",
"install_devices_ios_list_2": "V levé nabídce vyberte Wi-Fi (není možné nastavit vlastní DNS pro mobilní připojení).",
"install_devices_ios_list_3": "Klepněte na název aktuální aktivní sítě.",
"install_devices_ios_list_4": "Do políčka DNS zadejte adresy serveru AdGuard Home.",
"get_started": "Začínáme",
"next": "Další",
"open_dashboard": "Otevřít hlavní panel",
"install_saved": "Úspěšně uloženo",
"encryption_title": "Šifrování",
"encryption_desc": "Podpora šifrování (HTTPS/TLS) pro webové rozhraní DNS i administrátora",
"encryption_config_saved": "Konfigurace šifrování byla uložena",
"encryption_server": "Název serveru",
"encryption_server_enter": "Zadejte název domény",
"encryption_server_desc": "Abyste mohli používat protokol HTTPS, musíte zadat název serveru, který odpovídá vašemu certifikátu SSL.",
"encryption_redirect": "Automaticky přesměrovat na HTTPS",
"encryption_redirect_desc": "Pokud je zaškrtnuto, AdGuard Home vás automaticky přesměruje z adres HTTP na HTTPS.",
"encryption_https": "HTTPS port",
"encryption_https_desc": "Pokud je nakonfigurován port HTTPS, AdGuard Home administrátorské rozhraní bude přístupné přes HTTPS a bude také poskytovat DNS přes HTTPS na '/dns-query'.",
"encryption_dot": "DNS přes TLS port",
"encryption_dot_desc": "Pokud je tento port nakonfigurován, AdGuard Home bude na tomto portu spouštět DNS přes TLS server.",
"encryption_certificates": "Certifikáty",
"encryption_certificates_desc": "Chcete-li používat šifrování, musíte pro svou doménu poskytnout platný řetězec certifikátů SSL. Certifikát můžete získat bezplatně na adrese <0>{{link}}</ 0>, nebo jej můžete zakoupit od jednoho z důvěryhodných certifikačních úřadů.",
"encryption_certificates_input": "Zde můžete nakopírovat/vložit certifikáty PEM.",
"encryption_status": "Stav",
"encryption_expire": "Vyprší",
"encryption_key": "Osobní kód",
"encryption_key_input": "Zde můžete nakopírovat/vložit soukromý klíč k certifikátu PEM.",
"encryption_enable": "Povolit šifrování (HTTPS, DNS přes HTTPS a DNS přes TLS)",
"encryption_enable_desc": "Pokud je šifrování zapnuto, administrátorské rozhraní AdGuard Home bude pracovat přes HTTPS a DNS server bude naslouchat požadavky přes DNS přes HTTPS a DNS přes TLS.",
"encryption_chain_valid": "Certifikační řetězec je platný",
"encryption_chain_invalid": "Certifikační řetězec je neplatný",
"encryption_key_valid": "Toto je platný {{type}} osobní klíč",
"encryption_key_invalid": "Toto je neplatný {{type}} osobní klíč",
"encryption_subject": "Subjekt",
"encryption_issuer": "Vydavatel",
"encryption_hostnames": "Názvy hostitelů",
"encryption_reset": "Opravdu chcete obnovit nastavení šifrování?",
"topline_expiring_certificate": "Váš SSL certifikát brzy vyprší. Aktualizujte <0>Nastavení šifrování</0>.",
"topline_expired_certificate": "Váš SSL certifikát vypršel. Aktualizujte <0>Nastavení šifrování</0>.",
"form_error_port_range": "Zadejte hodnotu portu v rozmezí 80-65535",
"form_error_port_unsafe": "Toto není bezpečný port",
"form_error_equal": "Neměla by se shodovat",
"form_error_password": "Heslo se neshoduje",
"reset_settings": "Resetovat nastavení",
"update_announcement": "AdGuard Home {{version}} je nyní k dispozici! <0>Klikněte zde<0> pro více informací.",
"setup_guide": "Průvodce nastavením",
"dns_addresses": "Adresy DNS",
"dns_start": "Spustí se server DNS",
"dns_status_error": "Chyba při získávání stavu DNS serveru",
"down": "Dolů",
"fix": "Opravit",
"dns_providers": "Zde je <0>seznam známých poskytovatelů DNS</0>, z nichž si můžete vybrat.",
"update_now": "Aktualizovat nyní",
"update_failed": "Automatická aktualizace selhala. Prosím <a href='https://github.com/AdguardTeam/AdGuardHome/wiki/Getting-Started#update'>následujte tyto kroky</a> a aktualizujte ručně.",
"processing_update": "Čekejte prosím, AdGuard Home se aktualizuje",
"clients_title": "Klienti",
"clients_desc": "Konfigurace zařízení připojených k AdGuard Home",
"settings_global": "Globální",
"settings_custom": "Vlastní",
"table_client": "Klient",
"table_name": "Název",
"save_btn": "Uložit",
"client_add": "Přidat klienta",
"client_new": "Nový klient",
"client_edit": "Upravit klienta",
"client_identifier": "Identifikátor",
"ip_address": "IP adresa",
"client_identifier_desc": "Klienti můžou být identifikováni podle IP adresy CIDR nebo MAC adresy. Upozorňujeme, že použití MAC jako identifikátoru je možné pouze v případě, že je AdGuard Home také <0>DHCP server</0>",
"form_enter_ip": "Zadejte IP",
"form_enter_mac": "Zadejte MAC",
"form_enter_id": "Zadejte identifikátor",
"form_add_id": "Přidat identifikátor",
"form_client_name": "Zadejte název klienta",
"client_global_settings": "Použít globální nastavení",
"client_deleted": "Klient \"{{key}}\" byl úspěšně odstraněn",
"client_added": "Klient \"{{key}}\" byl úspěšně přidán",
"client_updated": "Klient \"{{key}}\" byl úspěšně aktualizován",
"clients_not_found": "Nenalezeni žádní klienti",
"client_confirm_delete": "Opravdu chcete odstranit klienta \"{{key}}\"?",
"filter_confirm_delete": "Opravdu chcete smazat filtr?",
"auto_clients_title": "Klienti (doba spuštění)",
"auto_clients_desc": "Data o klientech, kteří používají AdGuard Home, ale nejsou uloženi v konfiguraci",
"access_title": "Nastavení přístupu",
"access_desc": "Zde můžete konfigurovat pravidla přístupu pro server DNS AdGuard Home.",
"access_allowed_title": "Povolení klienti",
"access_allowed_desc": "Seznam adres CIDR nebo IP. Pokud je nakonfigurován, AdGuard Home bude přijímat požadavky pouze z těchto IP adres.",
"access_disallowed_title": "Nepovolení klienti",
"access_disallowed_desc": "Seznam adres CIDR nebo IP. Pokud je nakonfigurován, AdGuard Home bude odmítat požadavky pouze z těchto IP adres.",
"access_blocked_title": "Blokované domény",
"access_blocked_desc": "Nezaměňujte to s filtry. AdGuard Home odstraní dotazy DNS s těmito doménami v otázce dotazu.",
"access_settings_saved": "Nastavení přístupu bylo úspěšně uloženo",
"updates_checked": "Aktualizace úspěšně zkontrolovány",
"updates_version_equal": "AdGuard Home je aktuální",
"check_updates_now": "Zkontrolovat aktualizace nyní",
"dns_privacy": "Soukromí DNS",
"setup_dns_privacy_1": "<0>DNS-přes-TLS:</0> Použít <1>{{address}}</1> řetězec.",
"setup_dns_privacy_2": "<0>DNS-přes-HTTPS:</0> Použít <1>{{address}}</1> řetězec.",
"setup_dns_privacy_3": "<0>Upozorňujeme, že šifrované protokoly DNS jsou podporovány pouze v systému Android 9. Proto je třeba nainstalovat další software pro jiné operační systémy.</0><0>Zde je seznam softwaru, který můžete použít.</0>",
"setup_dns_privacy_android_1": "Android 9 podporuje DNS-přes-TLS nativně. Pokud ho chcete konfigurovat, přejděte na Nastavení → Síť & internet → Pokročilé → Soukromé DNS a tam zadejte název vaší domény.",
"setup_dns_privacy_android_2": "<0>AdGuard pro Android</0> podporuje <1>DNS-přes-HTTPS</1> a <1>DNS-přes-TLS</1>.",
"setup_dns_privacy_android_3": "<0>Intra</0> přidává podporu <1>DNS-přes-HTTPS</1> pro Android.",
"setup_dns_privacy_ios_1": "<0>DNSCloak</0> podporuje funkci <1>DNS-přes-HTTPS</1>, ale abyste ji mohli nakonfigurovat pro používání vlastního serveru, musíte vygenerovat značku <2>DNS Stamp</2>.",
"setup_dns_privacy_ios_2": "<0>AdGuard pro iOS</0> podporuje nastavení <1>DNS-přes-HTTPS</1> a <1>DNS-přes-TLS</1>.",
"setup_dns_privacy_other_title": "Další implementace",
"setup_dns_privacy_other_1": "Samotný AdGuard Home může být bezpečným klientem DNS na jakékoli platformě.",
"setup_dns_privacy_other_2": "<0>dnsproxy</0> podporuje všechny známé bezpečné DNS protokoly.",
"setup_dns_privacy_other_3": "<0>dnscrypt-proxy</0> podporuje <1>DNS-přes-HTTPS</1>.",
"setup_dns_privacy_other_4": "<0>Mozilla Firefox</0> podporuje <1>DNS-přes-HTTPS</1>.",
"setup_dns_privacy_other_5": "Další implementace naleznete <0>zde</0> a <1>zde</1>.",
"setup_dns_notice": "Pro použití <1>DNS-přes-HTTPS</1> nebo <1>DNS-přes-TLS</1> potřebujete v nastaveních AdGuard Home <0>nakonfigurovat šifrování</0>.",
"rewrite_added": "Přesměrování DNS pro „{{key}}“ úspěšně přidáno",
"rewrite_deleted": "Přesměrování DNS pro „{{key}}“ úspěšně smazáno",
"rewrite_add": "Přidat přesměrování DNS",
"rewrite_not_found": "Přesměrování DNS nenalezeny",
"rewrite_confirm_delete": "Jste si jisti, že chcete smazat přesměrování DNS pro „{{key}}“?",
"rewrite_desc": "Umožňuje snadno nakonfigurovat vlastní DNS odezvy pro konkrétní název domény.",
"rewrite_applied": "Aplikované pravidlo přesměrování",
"dns_rewrites": "Přesměrování DNS",
"form_domain": "Zadejte doménu",
"form_answer": "Zadejte IP adresu nebo název domény",
"form_error_domain_format": "Neplatný formát domény",
"form_error_answer_format": "Neplatný formát odpovědi",
"configure": "Konfigurovat",
"main_settings": "Hlavní nastavení",
"block_services": "Blokovat specifické služby",
"blocked_services": "Blokované služby",
"blocked_services_desc": "Umožňuje rychle blokovat oblíbené weby a služby.",
"blocked_services_saved": "Blokované služby byly úspěšně uloženy",
"blocked_services_global": "Použít globální blokované služby",
"blocked_service": "Blokovaná služba",
"block_all": "Blokovat vše",
"unblock_all": "Odblokovat vše",
"encryption_certificate_path": "Cesta k certifikátu",
"encryption_private_key_path": "Cesta k soukromému klíčí",
"encryption_certificates_source_path": "Nastavte cestu k souboru certifikátů",
"encryption_certificates_source_content": "Vložte obsahy certifikátů",
"encryption_key_source_path": "Nastavte soubor soukromého klíče",
"encryption_key_source_content": "Vložte obsahy soukromého klíče",
"stats_params": "Konfigurace statistik",
"config_successfully_saved": "Konfigurace byla úspěšně uložena",
"interval_24_hour": "24 hodin",
"interval_days": "Dny: {{count}}",
"interval_days_plural": "Dny: {{count}}",
"domain": "Doména",
"answer": "Odpověď",
"filter_added_successfully": "Filtr byl úspěšně přidán",
"statistics_configuration": "Konfigurace statistik",
"statistics_retention": "Uchovávání statistik",
"statistics_retention_desc": "Pokud hodnotu intervalu snížíte, některá data budou ztracena",
"statistics_clear": " Vyčistit statistiky",
"statistics_clear_confirm": "Opravdu chcete vyčistit statistiky?",
"statistics_retention_confirm": "Opravdu chcete změnit uchovávání statistik? Pokud snížíte hodnotu intervalu, některá data budou ztracena",
"statistics_cleared": "Statistiky úspěšně vyčištěny",
"interval_hours": "Hodiny: {{count}}",
"interval_hours_plural": "Hodiny: {{count}}",
"filters_configuration": "Konfigurace filtrů",
"filters_enable": "Povolit filtry",
"filters_interval": "Interval aktualizace filtrů",
"disabled": "Vypnuto",
"username_label": "Uživatelské jméno",
"username_placeholder": "Zadejte uživatelské jméno",
"password_label": "Heslo",
"password_placeholder": "Zadejte heslo",
"sign_in": "Přihlásit se",
"sign_out": "Odhlásit se",
"forgot_password": "Zapomněli jste heslo?",
"forgot_password_desc": "Prosím, následujte <0>tyto kroky</0> k vytvoření nového hesla pro váš uživatelský účet.",
"location": "Umístění",
"orgname": "Název organizace",
"netname": "Název sítě",
"descr": "Popis",
"whois": "Whois",
"filtering_rules_learn_more": "<0>Další informace</0> o vytváření vlastních seznamů zakázaných hostitelů.",
"blocked_by_response": "Zakázáno s odpovědí CNAME nebo IP"
}

View File

@@ -0,0 +1,413 @@
{
"client_settings": "Klient-indstillinger",
"example_upstream_reserved": "du kan angive DNS upstream <0>for et bestemt domæne</0>",
"upstream_parallel": "Brug parallelle forespørgsler til at fremskynde behandlingen ved samtidig at spørge alle upstream servere",
"bootstrap_dns": "Bootstrap DNS-servere",
"bootstrap_dns_desc": "Bootstrap DNS-servere bliver brugt til at behandle IP-adresser af de DoH/DoT resolvere, som du angiver som upstream.",
"check_dhcp_servers": "Tjek for DHCP-servere",
"save_config": "Gem konfiguration",
"enabled_dhcp": "DHCP-server aktiveret",
"disabled_dhcp": "DHCP-server deaktiveret",
"dhcp_title": "DHCP-server (eksperimentel!)",
"dhcp_description": "Hvis din router ikke tilbyder DHCP-indstillinger, kan du bruge AdGuards egen indbyggede DHCP-server.",
"dhcp_enable": "Aktiver DHCP-server",
"dhcp_disable": "Deaktiver DHCP-server",
"dhcp_not_found": "Det er sikkert at aktivere den indbyggede DHCP-server - vi fandt ikke nogen aktive DHCP-servere på netværket. Alligevel opfordrer vi dig til at tjekke det manuelt, da vores automatiske test i øjeblikket ikke virker 100%.",
"dhcp_found": "En aktiv DHCP-server er fundet på netværket. Det er ikke sikkert at aktivere den indbyggede DHCP-server.",
"dhcp_leases": "DHCP-leases",
"dhcp_static_leases": "DHCP static leases",
"dhcp_leases_not_found": "Ingen DHCP-leases fundet",
"dhcp_config_saved": "DHCP-konfiguration gemt",
"form_error_required": "Obligatorisk felt",
"form_error_ip4_format": "Ugyldigt IPv4-format",
"form_error_ip6_format": "Ugyldigt IPv6-format",
"form_error_ip_format": "Ugyldigt IP-format",
"form_error_mac_format": "Ugyldigt MAC-format",
"form_error_positive": "Skal være større end 0",
"dhcp_form_gateway_input": "Gateway IP",
"dhcp_form_subnet_input": "Subnet mask",
"dhcp_form_range_title": "Interval af IP-adresser",
"dhcp_form_range_start": "Start interval",
"dhcp_form_range_end": "Slut interval",
"dhcp_form_lease_title": "DHCP-lease tid (i sekunder)",
"dhcp_form_lease_input": "Lease varighed",
"dhcp_interface_select": "Vælg DHCP-interface",
"dhcp_hardware_address": "Hardware-adresse",
"dhcp_ip_addresses": "IP-adresser",
"dhcp_table_hostname": "Værtsnavn",
"dhcp_table_expires": "Udløber",
"dhcp_warning": "Hvis du vil aktivere DHCP-serveren alligevel, skal du sørge for, at der ikke er nogen anden aktiv DHCP-server på dit netværk. Ellers kan det ødelægge internettet for tilsluttede enheder!",
"dhcp_error": "Vi kunne ikke afgøre, om der er en anden DHCP-server på netværket.",
"dhcp_static_ip_error": "For at kunne bruge DHCP-serveren skal en statisk IP-adresse indstilles. Vi fejlede i at afgøre, om denne netværksgrænseflade er konfigureret ved hjælp af en statisk IP-adresse. Indstil venligst manuelt en statisk IP-adresse.",
"dhcp_dynamic_ip_found": "Dit system bruger en dynamisk IP-adresse konfiguration til grænsefladen <0>{{interfaceName}}</0>. For at kunne bruge DHCP-serveren skal en statisk IP-adresse indstilles. Din nuværende IP-adresse er <0>{{ipAddress}}</0>. Vi vil automatisk indstille denne IP-adresse som en statisk, hvis du trykker på Aktiver DHCP knappen.",
"dhcp_lease_added": "Static lease \"{{key}}\" succesfuldt tilføjet",
"dhcp_lease_deleted": "Static lease \"{{key}}\" succesfuldt slettet",
"dhcp_new_static_lease": "Ny static lease",
"dhcp_static_leases_not_found": "Ingen DHCP static leases fundet",
"dhcp_add_static_lease": "Tilføj static lease",
"dhcp_reset": "Er du sikker på, at du vil nulstille DHCP-konfigurationen?",
"delete_confirm": "Er du sikker på, at du vil slette \"{{key}}\"?",
"form_enter_hostname": "Indtast værtsnavn",
"error_details": "Fejloplysninger",
"back": "Tilbage",
"dashboard": "Kontrolpanel",
"settings": "Indstillinger",
"filters": "Filtre",
"query_log": "Forespørgselslog",
"faq": "FAQ",
"version": "Version",
"address": "adresse",
"on": "TÆNDT",
"off": "SLUKKET",
"copyright": "Copyright",
"homepage": "Hjemmeside",
"report_an_issue": "Rapporter et problem",
"privacy_policy": "Privatlivspolitik",
"enable_protection": "Aktiver beskyttelse",
"enabled_protection": "Beskyttelse aktiveret",
"disable_protection": "Deaktiver beskyttelse",
"disabled_protection": "Beskyttelse deaktiveret",
"refresh_statics": "Opdater statistikerne",
"dns_query": "DNS-Forespørgsler",
"blocked_by": "<0>Blokeret af Filtre</0>",
"stats_malware_phishing": "Blokeret malware/phishing",
"stats_adult": "Blokerede voksne websteder",
"stats_query_domain": "Mest eftertragtede domæner",
"for_last_24_hours": "i løbet af de sidste 24 timer",
"for_last_days": "for den sidste {{count}} dag",
"for_last_days_plural": "for de sidste {{count}} dage",
"no_domains_found": "Ingen domæner fundet",
"requests_count": "Antal anmodninger",
"top_blocked_domains": "De mest blokerede domæner",
"top_clients": "De bedste klienter",
"no_clients_found": "Ingen klienter fundet",
"general_statistics": "Generelle statistikker",
"number_of_dns_query_days": "Antallet af DNS-forespørgsler behandlet i løbet af den sidste {{count}} dag",
"number_of_dns_query_days_plural": "Antallet af DNS-forespørgsler behandlet i løbet af de sidste {{count}} dage",
"number_of_dns_query_24_hours": "Antallet af DNS-forespørgsler behandlet i løbet af de sidste 24 timer",
"number_of_dns_query_blocked_24_hours": "Antallet af DNS-forespørgsler blokeret af adblock filtre og værternes blokeringslister",
"number_of_dns_query_blocked_24_hours_by_sec": "Antallet af DNS-forespørgsler blokeret af AdGuards browsing sikkerhedsmodul",
"number_of_dns_query_blocked_24_hours_adult": "Antallet af voksensider blokeret",
"enforced_save_search": "Håndhæv 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",
"average_processing_time_hint": "Gennemsnitlig behandlingstid i millisekunder af DNS-forespørgsel",
"block_domain_use_filters_and_hosts": "Bloker domæner ved hjælp af filtre og værtsfiler",
"filters_block_toggle_hint": "Du kan oprette blokeringsregler i <a href='#filters'>Filterindstillingerne</a>.",
"use_adguard_browsing_sec": "Brug AdGuards browsing sikkerhedstjeneste",
"use_adguard_browsing_sec_hint": "AdGuard Home vil kontrollere om domænet er sortlistet af browsing sikkerhedstjenesten. Den vil bruge privatlivsvenlig lookup API til at udføre kontrollen: kun et kort præfiks af domænenavnet SHA256 hash bliver sendt til serveren.",
"use_adguard_parental": "Brug AdGuards forældrekontrol",
"use_adguard_parental_hint": "AdGuard Home vil kontrollere, om domænet indeholder voksenindhold. Den bruger den samme privatlivsvenlige API som browsing sikkerhedstjenesten.",
"enforce_safe_search": "Håndhæv sikker søgning",
"enforce_save_search_hint": "AdGuard Home kan håndhæve sikker søgning i følgende søgemaskiner: Google, Youtube, Bing, DuckDuckGo, Yandex og Pixabay.",
"no_servers_specified": "Ingen servere specificeret",
"general_settings": "Generelle indstillinger",
"dns_settings": "DNS-indstillinger",
"encryption_settings": "Krypteringsindstillinger",
"dhcp_settings": "DHCP-indstillinger",
"upstream_dns": "Upstream DNS-servere",
"upstream_dns_hint": "Hvis du lader dette felt være tomt, vil AdGuard Home bruge <a href='https://www.quad9.net/' target='_blank'>Quad9</a> som en upstream.",
"test_upstream_btn": "Test upstreams",
"upstreams": "Upstreams",
"apply_btn": "Anvend",
"disabled_filtering_toast": "Filtrering deaktiveret",
"enabled_filtering_toast": "Filtrering aktiveret",
"disabled_safe_browsing_toast": "Sikker browsing deaktiveret",
"enabled_safe_browsing_toast": "Sikker browsing aktiveret",
"disabled_parental_toast": "Forældrekontrol deaktiveret",
"enabled_parental_toast": "Forældrekontrol aktiveret",
"disabled_safe_search_toast": "Sikker søgning deaktiveret",
"enabled_save_search_toast": "Sikker søgning aktiveret",
"enabled_table_header": "Aktiveret",
"name_table_header": "Navn",
"filter_url_table_header": "Filter URL",
"rules_count_table_header": "Antal regler",
"last_time_updated_table_header": "Sidst opdateret",
"actions_table_header": "Handlinger",
"edit_table_action": "Rediger",
"delete_table_action": "Slet",
"filters_and_hosts": "Filtre og værters blokeringslister",
"filters_and_hosts_hint": "AdGuard Home forstår de grundlæggende annonceblokeringsregler og værtsfilsyntaks.",
"no_filters_added": "Ingen filtre tilføjet",
"add_filter_btn": "Tilføj filter",
"cancel_btn": "Annuller",
"enter_name_hint": "Indtast navn",
"enter_url_hint": "Indtast URL",
"check_updates_btn": "Søg efter opdateringer",
"new_filter_btn": "Nyt filterabonnement",
"enter_valid_filter_url": "Indtast en gyldig URL til et filterabonnementet eller en værtsfil.",
"custom_filter_rules": "Brugerdefinerede filtreringsregler",
"custom_filter_rules_hint": "Indtast en regel per linje. Du kan enten bruge annonceblokeringsregler eller værtsfilsyntaks.",
"examples_title": "Eksempler",
"example_meaning_filter_block": "bloker adgang til domænet example.org og alle dens subdomæner",
"example_meaning_filter_whitelist": "fjern blokering af adgangen til domænet example.ord og alle dens subdomæner",
"example_meaning_host_block": "AdGuard Home vil nu returnere adressen 127.0.0.1 til example.org domænet (men ikke dens underdomæner)",
"example_comment": "! Her er en kommentar",
"example_comment_meaning": "bare en kommentar",
"example_comment_hash": "# Også en kommentar",
"example_regex_meaning": "bloker adgangen til de domæner, der matcher det angivne regulære udtryk",
"example_upstream_regular": "almindelig DNS (over UDP)",
"example_upstream_dot": "krypteret <0>DNS-over-TLS</0>",
"example_upstream_doh": "krypteret <0>DNS-over-HTTPS</0>",
"example_upstream_sdns": "du kan bruge <0>DNS Stamps<0> til <1>DNSCrypt>/1> eller <2>DNS-over-HTTPS</2> resolvers",
"example_upstream_tcp": "almindelig DNS (over TCP)",
"all_filters_up_to_date_toast": "Alle filtre er allerede opdateret",
"updated_upstream_dns_toast": "Opdaterede upstream DNS-servere",
"dns_test_ok_toast": "De angivne DNS-servere fungerer korrekt",
"dns_test_not_ok_toast": "Server \"{{key}}\": kunne ikke bruges, kontroller venligst at du har skrevet det korrekt",
"unblock_btn": "Fjern blokering",
"block_btn": "Bloker",
"time_table_header": "Tid",
"domain_name_table_header": "Domænenavn",
"type_table_header": "Type",
"response_table_header": "Svar",
"client_table_header": "Klient",
"empty_response_status": "Tom",
"show_all_filter_type": "Vis alle",
"show_filtered_type": "Vis filtrerede",
"no_logs_found": "Ingen logfiler fundet",
"refresh_btn": "Opdater",
"previous_btn": "Forrige",
"next_btn": "Næste",
"loading_table_status": "Indlæser...",
"page_table_footer_text": "Side",
"of_table_footer_text": "af",
"rows_table_footer_text": "rækker",
"updated_custom_filtering_toast": "De brugerdefinerede filtreringsregler er blevet opdateret",
"rule_removed_from_custom_filtering_toast": "Regel fjernet fra de brugerdefinerede filtreringsregler",
"rule_added_to_custom_filtering_toast": "Regel tilføjet til de brugerdefinerede filtreringsregler",
"query_log_response_status": "Status: {{value}}",
"query_log_filtered": "Filtreret af {{filter}}",
"query_log_confirm_clear": "Er du sikker på, at du vil rydde hele forespørgselsloggen?",
"query_log_cleared": "Forespørgselsloggen er blevet ryddet",
"query_log_clear": "Ryd forespørgselslogfiler",
"query_log_retention": "Opbevaring af forespørgselslogfiler",
"query_log_enable": "Aktivér log",
"query_log_configuration": "Konfiguration af logfiler",
"query_log_disabled": "Forespørgselsloggen er deaktiveret og kan konfigureres i <0>indstillinger</0>",
"query_log_strict_search": "Brug dobbelt anførselstegn til streng søgning",
"query_log_retention_confirm": "Er du sikker på, at du vil ændre opbevaring af forespørgselsloggen? Hvis du mindsker intervalværdien, vil nogle data gå tabt",
"source_label": "Kilde",
"found_in_known_domain_db": "Fundet i databasen med kendte domæner.",
"category_label": "Kategori",
"rule_label": "Regel",
"filter_label": "Filter",
"unknown_filter": "Ukendt filter {{filterId}}",
"install_welcome_title": "Velkommen til AdGuard Home!",
"install_welcome_desc": "AdGuard Home er en netværksbaseret annonce-og-tracker blokerende DNS-server. Formålet er at lade dig kontrollere hele dit netværk og alle dine enheder, og det kræver ikke at man bruger klientsoftware.",
"install_settings_title": "Administrator Webgrænseflade",
"install_settings_listen": "Overvågningsgrænseflade",
"install_settings_port": "Port",
"install_settings_interface_link": "Din AdGuard Home administrator webgrænseflade vil være tilgængelig på følgende adresser:",
"form_error_port": "Indtast gyldig portværdi",
"install_settings_dns": "DNS-server",
"install_settings_dns_desc": "Du skal konfigurere dine enheder eller router til at bruge DNS-serveren på følgende adresser:",
"install_settings_all_interfaces": "Alle grænseflader",
"install_auth_title": "Autentificering",
"install_auth_desc": "Det anbefales stærkt at konfigurere adgangskodeautentificering til din AdGuard Home administrator webgrænseflade. Selvom det kun er tilgængeligt på dit lokale netværk, er det stadig vigtigt at få det beskyttet mod ubegrænset adgang.",
"install_auth_username": "Brugernavn",
"install_auth_password": "Adgangskode",
"install_auth_confirm": "Bekræft adgangskode",
"install_auth_username_enter": "Indtast brugernavn",
"install_auth_password_enter": "Indtast adgangskode",
"install_step": "Trin",
"install_devices_title": "Konfigurer dine enheder",
"install_devices_desc": "For at kunne bruge AdGuard Home, skal du konfigurere dine enheder til at bruge den.",
"install_submit_title": "Tillykke!",
"install_submit_desc": "Installationsproceduren er færdig, og du er klar til at starte med at bruge AdGuard Home.",
"install_devices_router": "Router",
"install_devices_router_desc": "Denne opsætning dækker automatisk alle enheder, der er tilsluttet din hjemmerouter, og du behøver ikke konfigurere hver af dem manuelt.",
"install_devices_address": "AdGuard Home DNS-server lytter på følgende adresser",
"install_devices_router_list_1": "Åbn præferencerne for din router. Normalt kan du få adgang til den fra din browser via en URL (som http://192.168.0.1/ eller http://192.168.1.1/). Du bliver muligvis bedt om at indtaste adgangskoden. Hvis du ikke kan huske den, kan du ofte nulstille adgangskoden ved at trykke på en knap på selve routeren. Nogle routere kræver et bestemt program, som i det tilfælde allerede skulle være installeret på din computer/telefon.",
"install_devices_router_list_2": "Find DHCP/DNS-indstillingerne. Kig efter DNS-bogstaverne ved siden af et felt, der tillader to eller tre sæt tal, hver opdelt i fire grupper med et til tre cifre.",
"install_devices_router_list_3": "Indtast dine AdGuard Home serveradresser der.",
"install_devices_windows_list_1": "Åbn Kontrolpanel gennem menuen Start eller Windows søgning.",
"install_devices_windows_list_2": "Gå til Netværk og internet kategorien og derefter til Netværks- og delingscenter.",
"install_devices_windows_list_3": "På venstre side af skærmen finder du Skift adapterindstillinger og klik på den.",
"install_devices_windows_list_4": "Vælg din aktive forbindelse, højreklik på den og vælg Egenskaber.",
"install_devices_windows_list_5": "Find Internet Protocol Version 4 (TCP/IP) på listen, vælg den og klik derefter på Egenskaber igen.",
"install_devices_windows_list_6": "Vælg Brug følgende DNS-serveradresser og indtast dine AdGuard Home serveradresser.",
"install_devices_macos_list_1": "Klik på Apple-ikonet og gå til Systemindstillinger.",
"install_devices_macos_list_2": "Klik på Netværk.",
"install_devices_macos_list_3": "Vælg den første forbindelse på din liste, og klik på Avanceret.",
"install_devices_macos_list_4": "Vælg fanen DNS og indtast dine AdGuard Home serveradresser.",
"install_devices_android_list_1": "Tryk på Indstillinger på Android-startskærmen.",
"install_devices_android_list_2": "Tryk på Wi-Fi i menuen. Alle tilgængelige netværk vil blive vist på skærmen (det er umuligt at angive brugerdefineret DNS til mobilforbindelse).",
"install_devices_android_list_3": "Tryk lang tid på det netværk, du har forbindelse til, og tryk på Rediger Netværk.",
"install_devices_android_list_4": "På nogle enheder skal du muligvis afkrydse afkrydsningsfeltet Avanceret for at se yderligere indstillinger. For at justere dine Android DNS-indstillinger skal du skifte IP-indstillingerne fra DHCP til Statisk.",
"install_devices_android_list_5": "Skift sæt DNS 1 og DNS 2 værdierne til dine AdGuard Home serveradresser.",
"install_devices_ios_list_1": "Tryk på Indstillinger på startskærmen.",
"install_devices_ios_list_2": "Vælg Wi-Fi i menuen til venstre (det er umuligt at konfigurere DNS til mobilnetværker).",
"install_devices_ios_list_3": "Tryk på navnet på det nuværende aktive netværk.",
"install_devices_ios_list_4": "Indtast dine AdGuard Home serveradresser i DNS-feltet.",
"get_started": "Kom I Gang",
"next": "Næste",
"open_dashboard": "Åbn Dashboard",
"install_saved": "Succesfuldt gemt",
"encryption_title": "Kryptering",
"encryption_desc": "Kryptering (HTTPS/TLS) understøtter både DNS og admin webgrænseflade",
"encryption_config_saved": "Krypteringskonfiguration gemt",
"encryption_server": "Servernavn",
"encryption_server_enter": "Indtast dit domænenavn",
"encryption_server_desc": "For at kunne bruge HTTPS skal du indtaste servernavnet, der matcher dit SSL-certifikat.",
"encryption_redirect": "Omdiriger automatisk til HTTPS",
"encryption_redirect_desc": "Hvis afkrydset, vil AdGuard Home automatisk omdirigere dig fra HTTP til HTTPS-adresser.",
"encryption_https": "HTTPS-port",
"encryption_https_desc": "Hvis HTTPS-porten er konfigureret, vil AdGuard Home admin grænsefladen være tilgængelig via HTTPS, og den vil give DNS-over-HTTPS på '/dns-query' placeringen.",
"encryption_dot": "DNS-over-TLS port",
"encryption_dot_desc": "Hvis denne port er konfigureret, vil AdGuard Home køre en DNS-over-TLS server over denne port.",
"encryption_certificates": "Certifikater",
"encryption_certificates_desc": "For at kunne bruge kryptering skal du angive en gyldig SSL-certifikatkæde til dit domæne. Du kan få et gratis certifikat på <0>{{link}}</ 0> eller du kan købe det fra en af de pålidelige Certifikatmyndigheder.",
"encryption_certificates_input": "Kopier/indsæt dine PEM-kodede certifikater her.",
"encryption_status": "Status",
"encryption_expire": "Udløber",
"encryption_key": "Privat nøgle",
"encryption_key_input": "Kopier/indsæt dine PEM-kodede private nøgle til dit certifikat her.",
"encryption_enable": "Aktiver Kryptering (HTTPS, DNS-over-HTTPS og DNS-over-TLS)",
"encryption_enable_desc": "Hvis kryptering er aktiveret, vil AdGuard Home admin grænseflade fungere over HTTPS og DNS-serveren vil lytte efter forespørgsler via DNS-over-HTTPS og DNS-over-TLS.",
"encryption_chain_valid": "Certifikatkæden er gyldig",
"encryption_chain_invalid": "Certifikatkæden er ugyldig",
"encryption_key_valid": "Dette er en gyldig {{type}} privat nøgle",
"encryption_key_invalid": "Dette er en ugyldig {{type}} privat nøgle",
"encryption_subject": "Emne",
"encryption_issuer": "Udsteder",
"encryption_hostnames": "Værtsnavne",
"encryption_reset": "Er du sikker på, at du vil nulstille krypteringsindstillingerne?",
"topline_expiring_certificate": "Dit SSL-certifikat er ved at udløbe. Opdater <0>Krypteringsindstillinger</ 0>.",
"topline_expired_certificate": "Dit SSL-certifikat er udløbet. Opdater <0>Krypteringsindstillinger</ 0>.",
"form_error_port_range": "Indtast portværdi i intervallet 80-65535",
"form_error_port_unsafe": "Dette er en usikker port",
"form_error_equal": "Burde ikke være lige",
"form_error_password": "Adgangskoden matcher ikke",
"reset_settings": "Nulstil indstillinger",
"update_announcement": "AdGuard Home {{version}} er nu tilgængelig! <0>Kik her</0> for mere info.",
"setup_guide": "Installationsvejledning",
"dns_addresses": "DNS-adresser",
"dns_start": "DNS-server starter",
"dns_status_error": "Fejl ved at få DNS-serverstatus",
"down": "Ned",
"fix": "Reparer",
"dns_providers": "Her er en <0>liste over kendte DNS-udbydere</ 0> at vælge imellem.",
"update_now": "Opdater nu",
"update_failed": "Automatisk opdatering mislykkedes. Følg venligst <a href='https://github.com/AdguardTeam/AdGuardHome/wiki/Getting-Started#update'>trinene</a> for at opdatere manuelt.",
"processing_update": "Vent venligst, AdGuard Home bliver opdateret",
"clients_title": "Klienter",
"clients_desc": "Konfigurer enheder, der er forbundet til AdGuard Home",
"settings_global": "Global",
"settings_custom": "Brugerdefineret",
"table_client": "Klient",
"table_name": "Navn",
"save_btn": "Gem",
"client_add": "Tilføj Klient",
"client_new": "Ny Klient",
"client_edit": "Rediger Klient",
"client_identifier": "Identifikator",
"ip_address": "IP-adresse",
"client_identifier_desc": "Klienter kan identificeres ud fra IP-adressen, CIDR eller MAC-adressen. Bemærk venligst, at det kun er muligt at bruge MAC som identifikator, hvis AdGuard Home også er en <0>DHCP-server</0>",
"form_enter_ip": "Indtast IP",
"form_enter_mac": "Indtast MAC",
"form_enter_id": "Indtast identifikator",
"form_add_id": "Tilføj identifikator",
"form_client_name": "Indtast klientnavn",
"client_global_settings": "Brug globale indstillinger",
"client_deleted": "Klient \"{{key}}\" succesfuldt slettet",
"client_added": "Klient \"{{key}}\" succesfuldt tilføjet",
"client_updated": "Klient \"{{key}}\" succesfuldt opdateret",
"clients_not_found": "Ingen klienter fundet",
"client_confirm_delete": "Er du sikker på, at du vil slette klient \"{{key}}\"?",
"filter_confirm_delete": "Er du sikker på, at du vil slette filtret?",
"auto_clients_title": "Klienter (runtime)",
"auto_clients_desc": "Data om de klienter, der bruger AdGuard Home, men ikke gemt i konfigurationen",
"access_title": "Adgangsindstillinger",
"access_desc": "Her kan du konfigurere adgangsregler for AdGuard Home DNS-serveren.",
"access_allowed_title": "Tilladte klienter",
"access_allowed_desc": "En liste over CIDR- eller IP-adresser. Hvis den er konfigureret, vil AdGuard Home kun acceptere anmodninger fra disse IP-adresser.",
"access_disallowed_title": "Ikke tilladte klienter",
"access_disallowed_desc": "En liste over CIDR- eller IP-adresser. Hvis den er konfigureret, vil AdGuard Home droppe anmodninger fra disse IP-adresser.",
"access_blocked_title": "Blokerede domæner",
"access_blocked_desc": "Forveksl det ikke med filtre. AdGuard Home vil droppe DNS-forespørgsler for disse domæner i forespørgselsspørgsmål.",
"access_settings_saved": "Adgangsindstillinger succesfuldt gemt",
"updates_checked": "Søgt succesfuldt efter opdateringer",
"updates_version_equal": "AdGuard Home er opdateret",
"check_updates_now": "Søg efter opdateringer nu",
"dns_privacy": "DNS Privatliv",
"setup_dns_privacy_1": "<0>DNS-over-TLS:</0> Brug <1>{{address}}</1> streng.",
"setup_dns_privacy_2": "<0>DNS-over-HTTPS:</0> Brug <1>{{address}}</1> streng.",
"setup_dns_privacy_3": "<0>Bemærk venligst, at krypterede DNS-protokoller kun understøttes på Android 9. Så du skal installere ekstra software til andre styresystemer.</0><0>Her er en liste af software, du kan bruge.</0>",
"setup_dns_privacy_android_1": "Android 9 understøtter den indbyggede DNS-over-TLS. For at konfigurere den, gå til Indstillinger → Netværk & internet → Avanceret → Privat DNS og indtast dit domænenavn.",
"setup_dns_privacy_android_2": "<0>AdGuard til Android</0> understøtter <1>DNS-over-HTTPS</1> og <1>DNS-over-TLS</1>.",
"setup_dns_privacy_android_3": "<0>Intra</0> tilføjer <1>DNS-over-HTTPS</1> understøttelse til Android.",
"setup_dns_privacy_ios_1": "<0>DNSCloak</0> understøtter <1>DNS-over-HTTPS</1>, men for at konfigurere den, så den bruger din egen server, skal du generere et <2>DNS Stamp</2> til den.",
"setup_dns_privacy_ios_2": "<0>AdGuard til iOS</0> understøtter <1>DNS-over-HTTPS</1> og <1>DNS-over-TLS</1> installation.",
"setup_dns_privacy_other_title": "Andre implementeringer",
"setup_dns_privacy_other_1": "AdGuard Home kan være en sikker DNS-klient på enhver platform.",
"setup_dns_privacy_other_2": "<0>dnsproxy</0> understøtter alle kendte sikre DNS-protokoller.",
"setup_dns_privacy_other_3": "<0>dnscrypt-proxy</0> understøtter <1>DNS-over-HTTPS</1>.",
"setup_dns_privacy_other_4": "<0>Mozilla Firefox</0> understøtter <1>DNS-over-HTTPS</1>.",
"setup_dns_privacy_other_5": "Du kan finde flere implementeringer <0>her</0> og <1>her</1>.",
"setup_dns_notice": "For at kunne bruge <1>DNS-over-HTTPS</1> eller <1>DNS-over-TLS</1>, skal du <0>konfigurere Krypteringen</0> i indstillingerne i AdGuard Home.",
"rewrite_added": "DNS-omskrivning for \"{{key}}\" blev tilføjet",
"rewrite_deleted": "DNS-omskrivning for \"{{key}}\" blev slettet",
"rewrite_add": "Tilføj DNS-omskrivning",
"rewrite_not_found": "Ingen DNS-omskrivninger fundet",
"rewrite_confirm_delete": "Er du sikker på, at du vil slette DNS-omskrivning for \"{{key}}\"?",
"rewrite_desc": "Gør det nemt at konfigurere det tilpassede DNS-svar for et specifikt domænenavn.",
"rewrite_applied": "Anvendt Omskrivningsregel",
"dns_rewrites": "DNS-omskrivninger",
"form_domain": "Indtast domæne",
"form_answer": "Indtast IP-adresser eller domænenavne",
"form_error_domain_format": "Ugyldigt domæneformat",
"form_error_answer_format": "Ugyldigt svarformat",
"configure": "Konfigurer",
"main_settings": "Hovedindstillinger",
"block_services": "Bloker specifikke tjenester",
"blocked_services": "Blokerede tjenester",
"blocked_services_desc": "Gør det muligt hurtigt at blokere populære websteder og tjenester.",
"blocked_services_saved": "Blokerede tjenester er gemt",
"blocked_services_global": "Brug globale blokerede tjenester",
"blocked_service": "Blokeret tjeneste",
"block_all": "Bloker alle",
"unblock_all": "Fjern blokering af alle",
"encryption_certificate_path": "Certifikatsti",
"encryption_private_key_path": "Placering af den private nøgle",
"encryption_certificates_source_path": "Indstil en sti for certifikatfilen",
"encryption_certificates_source_content": "Indsæt certifikatets indhold",
"encryption_key_source_path": "Indstil en fil for den private nøgle",
"encryption_key_source_content": "Indsæt indholdet af den private nøgle",
"stats_params": "Konfiguration af statistik",
"config_successfully_saved": "Konfiguration er gemt",
"interval_24_hour": "24 timer",
"interval_days": "{{count}} dag",
"interval_days_plural": "{{count}} dage",
"domain": "Domæne",
"answer": "Svar",
"filter_added_successfully": "Filtret er blevet tilføjet",
"statistics_configuration": "Konfiguration af statistik",
"statistics_retention": "Tilbageholdelse af statistikker",
"statistics_retention_desc": "Hvis du mindsker intervalværdien, vil nogle data gå tabt",
"statistics_clear": " Ryd statistikker",
"statistics_clear_confirm": "Er du sikker på, at du vil slette statistikkerne?",
"statistics_retention_confirm": "Er du sikker på, at du vil ændre opbevaring af statistikker? Hvis du mindsker intervalværdien, vil nogle data gå tabt",
"statistics_cleared": "Statistikkerne blev slettet",
"interval_hours": "{{count}} time",
"interval_hours_plural": "{{count}} timer",
"filters_configuration": "Konfiguration af filtre",
"filters_enable": "Aktivér filtre",
"filters_interval": "Filtrenes opdateringsinterval",
"disabled": "Deaktiveret",
"username_label": "Brugernavn",
"username_placeholder": "Indtast brugernavn",
"password_label": "Adgangskode",
"password_placeholder": "Indtast adgangskode",
"sign_in": "Log ind",
"sign_out": "Log ud",
"forgot_password": "Glemt adgangskode?",
"forgot_password_desc": "Følg <0>disse trin</0> for at oprette en ny adgangskode til din brugerkonto.",
"location": "Placering",
"orgname": "Organisationens navn",
"netname": "Netværksnavn",
"descr": "Beskrivelse",
"whois": "Whois",
"filtering_rules_learn_more": "<0>Lær mere</0> om at oprette dine egne værtsblokeringslister.",
"blocked_by_response": "Blokeret af CNAME eller IP som svar"
}

View File

@@ -0,0 +1,399 @@
{
"client_settings": "Client-Einstellungen",
"example_upstream_reserved": "Sie können DNS-Upstream <0>für bestimmte Domain(s)</0> angeben",
"upstream_parallel": "Parallele Abfragen verwenden, um die Lösung zu beschleunigen, indem Sie alle Upstream-Server gleichzeitig abfragen",
"bootstrap_dns": "Bootstrap DNS-Server starten",
"bootstrap_dns_desc": "Bootstrap-DNS-Server werden verwendet, um IP-Adressen der DoH/DoT-Resolver aufzulösen, die Sie als Upstreams angeben.",
"check_dhcp_servers": "Auf DHCP-Server prüfen",
"save_config": "Konfiguration speichern",
"enabled_dhcp": "DHCP-Server aktiviert",
"disabled_dhcp": "DHCP-Server deaktiviert",
"dhcp_title": "DHCP-Server (experimental!)",
"dhcp_description": "Wenn Ihr Router keine DHCP-Einstellungen bietet, können Sie den integrierten DHCP-Server von AdGuard verwenden.",
"dhcp_enable": "DHCP-Server aktivieren",
"dhcp_disable": "DHCP-Server deaktivieren",
"dhcp_not_found": "Keine aktiven DHCP-Server im Netzwerk gefunden. Es ist sicher, den integrierten DHCP-Server zu aktivieren.",
"dhcp_found": "Einige aktive DHCP-Server im Netzwerk gefunden. Es ist nicht sicher, den integrierten DHCP-Server zu aktivieren.",
"dhcp_leases": "DHCP-Leasingverträge",
"dhcp_static_leases": "DHCP statische Leases",
"dhcp_leases_not_found": "Keine DHCP-Leasingverträge gefunden\n",
"form_error_required": "Pflichtfeld",
"form_error_mac_format": "Ungültiges MAC-Format",
"form_error_positive": "Muss größer als 0 sein.",
"dhcp_form_gateway_input": "Gateway-IP",
"dhcp_form_subnet_input": "Subnetz-Maske",
"dhcp_form_range_title": "Bereich von IP-Adressen",
"dhcp_form_range_start": "Bereichsanfang",
"dhcp_form_range_end": "Bereichsende",
"dhcp_form_lease_title": "DHCP-Leasingdauer (in Sekunden)",
"dhcp_form_lease_input": "Leasingdauer",
"dhcp_interface_select": "DHCP-Benutzeroberfläche auswählen",
"dhcp_hardware_address": "Hardware-Adresse",
"dhcp_ip_addresses": "IP-Adressen",
"dhcp_table_hostname": "Hostname",
"dhcp_table_expires": "Läuft ab",
"dhcp_warning": "Wenn Sie den DHCP-Server trotzdem aktivieren möchten, stellen Sie sicher, dass sich in Ihrem Netzwerk kein anderer aktiver DHCP-Server befindet. Andernfalls kann es bei angeschlossenen Geräten zu einem Ausfall des Internets kommen!",
"dhcp_error": "Es konnte nicht ermittelt werden, ob es einen anderen DHCP-Server im Netzwerk gibt.",
"dhcp_static_ip_error": "Um den DHCP-Server nutzen zu können, muss eine statische IP-Adresse festgelegt werden. Es konnte nicht ermittelt werden, ob diese Netzwerkschnittstelle mit statischer IP-Adresse konfiguriert ist. Bitte legen Sie eine statische IP-Adresse manuell fest.",
"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 aktivieren” klicken.",
"dhcp_lease_added": "Statischer Lease „{{key}}” erfolgreich hinzugefügt",
"dhcp_lease_deleted": "Statischer Lease „{{key}}” erfolgreich entfernt",
"dhcp_new_static_lease": "Neuer statischer Lease",
"dhcp_static_leases_not_found": "Keine statischen DHCP-Leases gefunden",
"dhcp_add_static_lease": "Statischen Lease hinzufügen",
"delete_confirm": "Möchten Sie „{{key}}” wirklich löschen?",
"form_enter_hostname": "Gerätenamen eingeben",
"error_details": "Fehlerdetails",
"back": "Zurück",
"dashboard": "Übersicht",
"settings": "Einstellungen",
"filters": "Filter",
"query_log": "Anfragenprotokoll",
"faq": "FAQ",
"version": "Version",
"address": "Adresse",
"on": "AN",
"off": "AUS",
"copyright": "Urheberrecht",
"homepage": "Startseite",
"report_an_issue": "Fehlerbericht senden",
"privacy_policy": "Datenschutzerklärung",
"enable_protection": "Schutz aktivieren",
"enabled_protection": "Schutz aktiviert",
"disable_protection": "Schutz deaktivieren",
"disabled_protection": "Schutz deaktiviert",
"refresh_statics": "Statistiken aktualisieren",
"dns_query": "DNS-Anfragen",
"blocked_by": "<0>Blockiert durch die Filter</0>",
"stats_malware_phishing": "Blockierte Malware/Phishing",
"stats_adult": "Blockierte Webseiten für Erwachsene",
"stats_query_domain": "Am häufigsten angefragte Domains",
"for_last_24_hours": "für die letzten 24 Stunden",
"for_last_days": "am letzten {{value}} Tag",
"for_last_days_plural": "in den letzten {{count}} Tage",
"no_domains_found": "Keine Domains gefunden",
"requests_count": "Anzahl der Anfragen",
"top_blocked_domains": "Am häufigsten blockierte Domains",
"top_clients": "Top Clients",
"no_clients_found": "Keine Clients gefunden",
"general_statistics": "Allgemeine Statistiken",
"number_of_dns_query_days": "Anzahl der in den letzten {{value}}} 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_blocked_24_hours": "Anzahl der durch Werbefilter und Host-Blocklisten geblockten DNS-Anfragen",
"number_of_dns_query_blocked_24_hours_by_sec": "Anzahl der durch das AdGuard-Modul für Internet-Sicherheit blockierten DNS-Anfragen",
"number_of_dns_query_blocked_24_hours_adult": "Anzahl der blockierten Webseiten für Erwachsene",
"enforced_save_search": "SafeSearch erzwungen",
"number_of_dns_query_to_safe_search": "Anzahl der DNS-Anfragen bei denen SafeSearch für Suchanfragen erzwungen wurde",
"average_processing_time": "Durchschnittliche Bearbeitungsdauer",
"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 blockieren",
"filters_block_toggle_hint": "Sie können Blockierregeln in den <a href='#filters'>Filter</a>einstellungen erstellen",
"use_adguard_browsing_sec": "AdGuard Webservice für Internet-Sicherheit verwenden",
"use_adguard_browsing_sec_hint": "AdGuard Home überprüft, ob die Domain durch den Webservice für Internet-Sicherheit geblacklistet ist. Um Ihre Privatsphäre zu wahren, wird eine API verwendet, bei der nur ein kurzer Präfix des Domainnamens als SHA256 gehasht an den Server gesendet wird.",
"use_adguard_parental": "AdGuard Webservice für Kindersicherung verwenden",
"use_adguard_parental_hint": "AdGuard Home wird überprüfen, ob die Domain Inhalte hat, die nur für Erwachsene geeignet sind. Zum Schutz Ihrer Privatsphäre wird die gleiche API wie für den Webservice für Internet-Sicherheit verwendet.",
"enforce_safe_search": "SafeSearch erzwingen",
"no_servers_specified": "Keine Server festgelegt",
"general_settings": "Allgemeine Einstellungen",
"dns_settings": "DNS-Einstellungen",
"encryption_settings": "Verschlüsselungseinstellungen",
"dhcp_settings": "DHCP-Einstellungen",
"upstream_dns": "Upstream-DNS-Server",
"test_upstream_btn": "Upstreams testen",
"apply_btn": "Anwenden",
"disabled_filtering_toast": "Filtern deaktiviert",
"enabled_filtering_toast": "Filtern aktiviert",
"disabled_safe_browsing_toast": "Internetsicherheit deaktiviert",
"enabled_safe_browsing_toast": "Internetsicherheit aktiviert",
"disabled_parental_toast": "Kindersicherung deaktiviert",
"enabled_parental_toast": "Kindersicherung aktiviert",
"disabled_safe_search_toast": "SafeSearch deaktiviert",
"enabled_save_search_toast": "SafeSearch aktiviert",
"enabled_table_header": "Aktiviert",
"name_table_header": "Name",
"filter_url_table_header": "Filter-URL",
"rules_count_table_header": "Anzahl Regeln",
"last_time_updated_table_header": "Letztes Update",
"actions_table_header": "Aktionen",
"edit_table_action": "Bearbeiten",
"delete_table_action": "Löschen",
"filters_and_hosts": "Filter und Host-Blocklisten",
"filters_and_hosts_hint": "AdGuard Home versteht grundlegende Werbefilterregeln und Host-Datei-Syntax.",
"no_filters_added": "Keine Filter hinzugefügt",
"add_filter_btn": "Filter hinzufügen",
"cancel_btn": "Abbrechen",
"enter_name_hint": "Name eingeben",
"enter_url_hint": "URL eingeben",
"check_updates_btn": "Nach Updates suchen",
"new_filter_btn": "Neues Filterabonnement",
"enter_valid_filter_url": "Geben Sie eine gültige URL zu einem Filterabonnement oder einer Host-Datei ein.",
"custom_filter_rules": "Benutzerdefinierte Filterregeln",
"custom_filter_rules_hint": "Geben Sie pro Zeile eine Regel ein. Sie können entweder Werbefilterregeln oder Host-Datei-Syntax verwenden.",
"examples_title": "Beispiele",
"example_meaning_filter_block": "blockiert den Zugang zur Domain example.org und all ihren Subdomains",
"example_meaning_filter_whitelist": "entblockt den Zugang zur Domain example.org und all ihren Subdomains",
"example_meaning_host_block": "AdGuard Home wird jetzt die Adresse 127.0.0.1 für die Domain example.org zurückgeben (aber nicht für die Subdomains).",
"example_comment": "! Hier steht ein Kommentar",
"example_comment_meaning": "Nur ein Kommentar",
"example_comment_hash": "# Auch ein Kommentar",
"example_regex_meaning": "Zugriff auf die Domains blockieren, die dem <0>spezifizierten regulären Ausdruck</0> entsprechen",
"example_upstream_regular": "regulärer DNS (über UDP)",
"example_upstream_dot": "verschlüsseltes <a href='https://en.wikipedia.org/wiki/DNS_over_TLS' target='_blank'>DNS-over-TLS</a>",
"example_upstream_doh": "verschlüsseltes <a href='https://en.wikipedia.org/wiki/DNS_over_HTTPS' target='_blank'>DNS-over-HTTPS</a>",
"example_upstream_sdns": "Sie können <a href='https://dnscrypt.info/stamps/' target='_blank'>DNS-Stempel</a> für <a href='https://dnscrypt.info/' target='_blank'>DNSCrypt</a> oder <a href='https://en.wikipedia.org/wiki/DNS_over_HTTPS' target='_blank'>DNS-over-HTTPS</a> Resolver benutzen.",
"example_upstream_tcp": "regulärer DNS (über TCP)",
"all_filters_up_to_date_toast": "Alle Filter sind bereits aktuell",
"updated_upstream_dns_toast": "Upstream-DNS-Server wurden aktualisiert",
"dns_test_ok_toast": "Angegebene DNS-Server arbeiten ordnungsgemäß",
"dns_test_not_ok_toast": "Server \"{{key}}\": konnte nicht verwendet werden, bitte überprüfen Sie die korrekte Schreibweise",
"unblock_btn": "Entblocken",
"block_btn": "Blockieren",
"time_table_header": "Zeit",
"domain_name_table_header": "Domainname",
"type_table_header": "Typ",
"response_table_header": "Antwort",
"client_table_header": "Client",
"empty_response_status": "Leer",
"show_all_filter_type": "Alle anzeigen",
"show_filtered_type": "Gefilterte anzeigen",
"no_logs_found": "Keine Protokolle gefunden",
"refresh_btn": "Aktualisieren",
"previous_btn": "Vorherige",
"next_btn": "Nächste",
"loading_table_status": "Laden...",
"page_table_footer_text": "Seite",
"of_table_footer_text": "von",
"rows_table_footer_text": "Reihen",
"updated_custom_filtering_toast": "Die benutzerdefinierten Filterregeln wurden aktualisiert",
"rule_removed_from_custom_filtering_toast": "Regel wurde aus den benutzerdefinierten Filterregeln entfernt",
"rule_added_to_custom_filtering_toast": "Regel wurde zu den benutzerdefinierten Filterregeln hinzugefügt",
"query_log_response_status": "Status: {{value}}",
"query_log_filtered": "Gefiltert nach {{filter}}",
"query_log_confirm_clear": "Möchten Sie wirklich das Abfrageprotokoll vollständig löschen?",
"query_log_cleared": "Das Abfrageprotokoll wurde erfolgreich gelöscht",
"query_log_clear": "Abfrageprotokolle leeren",
"query_log_retention": "Abfrageprotokolle aufbewahren",
"query_log_enable": "Protokoll aktivieren",
"query_log_configuration": "Konfiguration der Protokolle",
"query_log_disabled": "Das Abfrageprotokoll ist deaktiviert und kann in den <0>Einstellungen</0> konfiguriert werden.",
"query_log_strict_search": "Doppelte Anführungszeichen für die strikte Suche verwenden",
"query_log_retention_confirm": "Möchten Sie die Aufbewahrung des Abfrageprotokolls wirklich ändern? Wenn Sie den Zeitabstand verringern, gehen einige Daten verloren.",
"source_label": "Quelle",
"found_in_known_domain_db": "In der Datenbank der bekannten Domains gefunden.",
"category_label": "Kategorie",
"rule_label": "Regel",
"filter_label": "Filter",
"unknown_filter": "Unbekannter Filter {{filterId}}",
"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_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:",
"form_error_port": "Gültige Portnummer eingeben",
"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": "Es wird dringend empfohlen, die Passwortauthentifizierung für Ihre AdGuard Home Administrator-Weboberfläche zu konfigurieren. Auch wenn es nur in Ihrem lokalen Netzwerk zugänglich ist, ist es dennoch wichtig, es vor unbefugtem Zugriff zu schützen.",
"install_auth_username": "Benutzername",
"install_auth_password": "Passwort",
"install_auth_confirm": "Passwort bestätigen",
"install_auth_username_enter": "Benutzernamen eingeben",
"install_auth_password_enter": "Passwort eingeben",
"install_step": "Schritt",
"install_devices_title": "Konfigurieren Sie Ihre Geräte",
"install_devices_desc": "Um AdGuard Home nutzen zu können, müssen Sie Ihre Geräte so konfigurieren, dass sie es auch wirklich nutzen.",
"install_submit_title": "Herzlichen Glückwunsch!",
"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_router_list_1": "Öffnen Sie die Einstellungen für Ihren Router. In der Regel können Sie von Ihrem Browser aus über eine URL (wie http://192.168.0.1/ oder http://192.168.1.1/) darauf zugreifen. Möglicherweise werden Sie aufgefordert, das Passwort einzugeben. Wenn Sie sich nicht mehr daran erinnern, können Sie das Passwort oft durch Drücken einer Taste auf dem Router selbst zurücksetzen. Einige Router benötigen eine bestimmte Anwendung, die in diesem Fall bereits auf Ihrem Computer/Telefon installiert sein sollte.",
"install_devices_router_list_2": "DHCP/DNS-Einstellungen suchen. Suchen Sie nach den DNS-Buchstaben neben einem Feld, das zwei oder drei Zahlensätze erlaubt, die jeweils in vier Gruppen von ein bis drei Ziffern unterteilt sind.",
"install_devices_router_list_3": "Geben Sie dort Ihre AdGuard Home Server-Adressen ein.",
"install_devices_windows_list_1": "Öffnen Sie die Systemsteuerung über das Startmenü oder die Windows-Suche.",
"install_devices_windows_list_2": "Öffnen Sie die Kategorie „Netzwerk und Internet” und dann „Netzwerk- und Freigabecenter”.",
"install_devices_windows_list_3": "Suchen Sie auf der linken Seite des Bildschirms nach „Adaptereinstellungen ändern” und klicken Sie darauf.",
"install_devices_windows_list_4": "Wählen Sie Ihre aktive Verbindung aus, klicken Sie mit der rechten Maustaste darauf und wählen Sie „Eigenschaften”.",
"install_devices_windows_list_5": "Suchen Sie in der Liste nach „Internet Protokoll Version 4 (TCP/IP)”, markieren Sie diese und klicken Sie dann erneut auf „Eigenschaften”.",
"install_devices_windows_list_6": "Wählen Sie „Folgende DNS-Serveradressen verwenden” und geben Sie Ihre AdGuard Home-Serveradressen ein.",
"install_devices_macos_list_1": "Klicken Sie auf das Apple-Symbol (oben links in der Menüzeile) und wählen den Eintrag „Systemeinstellungen”.",
"install_devices_macos_list_2": "Klicken Sie dort auf „Netzwerk”",
"install_devices_macos_list_3": "Wählen Sie die erste Verbindung in Ihrer Liste aus und klicken Sie auf „Weitere Optionen”.",
"install_devices_macos_list_4": "Wählen Sie den Tab „DNS” und geben Sie dort Ihre AdGuard Home-Serveradressen ein.",
"install_devices_android_list_1": "Tippen Sie auf dem Startbildschirm des Android-Menüs auf „Einstellungen”.",
"install_devices_android_list_2": "Tippen Sie im Menü auf „WLAN”. Der Bildschirm mit allen verfügbaren Netzwerken wird angezeigt (es ist nicht möglich, einen benutzerdefinierten DNS für die mobile Verbindung einzustellen).",
"install_devices_android_list_3": "Drücken Sie lange auf das Netzwerk, mit dem Sie verbunden sind, und tippen Sie auf „Netzwerk ändern”.",
"install_devices_android_list_4": "Bei einigen Geräten müssen Sie möglicherweise das Kontrollkästchen für „Erweitert” aktivieren, um weitere Einstellungen anzuzeigen. Um Ihre Android-DNS-Einstellungen anzupassen, müssen Sie die IP-Einstellungen von „DHCP” auf „Statisch” umstellen.",
"install_devices_android_list_5": "Ändern Sie die Werte für „DNS 1” und „DNS 2” auf Ihre AdGuard Home-Serveradressen.",
"install_devices_ios_list_1": "Tippen Sie auf dem Startbildschirm auf „Einstellungen”.",
"install_devices_ios_list_2": "Wählen Sie „WLAN” im linken Menü (es ist nicht möglich, DNS für mobile Netzwerke zu konfigurieren).",
"install_devices_ios_list_3": "Tippen Sie auf den Namen des aktuell aktiven Netzwerks.",
"install_devices_ios_list_4": "Geben Sie im DNS-Feld Ihre AdGuard Home-Serveradressen ein.",
"get_started": "Anfangen",
"next": "Weiter",
"open_dashboard": "Übersicht öffnen",
"install_saved": "Erfolgreich gespeichert",
"encryption_title": "Verschlüsselung",
"encryption_desc": "Verschlüsselungsunterstützung (HTTPS/TLS) für DNS- und Admin-Weboberfläche",
"encryption_config_saved": "Verschlüsselungseinstellungen wurden gespeichert",
"encryption_server": "Servername",
"encryption_server_enter": "Domain-Namen eingeben",
"encryption_server_desc": "Um HTTPS verwenden zu können, müssen Sie den Servernamen eingeben, der zu Ihrem SSL-Zertifikat passt.",
"encryption_redirect": "Automatisch auf HTTPS umleiten",
"encryption_redirect_desc": "Wenn aktiviert, leitet AdGuard Home Sie automatisch von HTTP- auf HTTPS-Adressen um.",
"encryption_https": "HTTPS-Port",
"encryption_https_desc": "Wenn der HTTPS-Port konfiguriert ist, ist die AdGuard Home-Administrationsschnittstelle über HTTPS zugänglich und bietet auch DNS-over-HTTTPS am Server „/dns-query”.",
"encryption_dot": "DNS-over-TLS",
"encryption_dot_desc": "Wenn dieser Port konfiguriert ist, führt AdGuard Home auf diesem Port einen DNS-over-TLS-Server aus.",
"encryption_certificates": "Zertifikate",
"encryption_certificates_desc": "Um die Verschlüsselung verwenden zu können, müssen Sie eine gültige SSL-Zertifikatskette für Ihre Domain angeben. Sie können ein kostenloses Zertifikat für <0>{{link}}</0> erhalten oder es bei einer der vertrauenswürdigen Zertifizierungsstellen kaufen.",
"encryption_certificates_input": "Kopieren Sie Ihre PEM-codierten Zertifikate und fügen Sie sie hier ein.",
"encryption_status": "Status",
"encryption_expire": "Gültig bis",
"encryption_key": "Privater Schlüssel",
"encryption_key_input": "Kopieren Sie Ihren PEM-codierten privaten Schlüssel für Ihr Zertifikat und fügen Sie ihn hier ein.",
"encryption_enable": "Verschlüsselung aktivieren (HTTPS, DNS-over-HTTPS und DNS-over-TLS)",
"encryption_enable_desc": "Wenn die Verschlüsselung aktiviert ist, funktioniert die AdGuard Home Admin-Oberfläche über HTTPS, und der DNS-Server wartet auf Anfragen über DNS-over-HTTPS und DNS-over-TLS.",
"encryption_chain_valid": "Zertifikatskette ist gültig",
"encryption_chain_invalid": "Zertifikatskette ist ungültig",
"encryption_key_valid": "Das ist ein gültiger {{type}} privater Schlüssel",
"encryption_key_invalid": "Das ist ein ungültiger {{type}} privater Schlüssel",
"encryption_subject": "Ausgestellt für",
"encryption_issuer": "Ausgestellt von",
"encryption_hostnames": "Hostnamen",
"encryption_reset": "Möchten Sie die Verschlüsselungseinstellungen wirklich zurücksetzen?",
"topline_expiring_certificate": "Ihr SSL-Zertifikat läuft demnächst ab. Aktualisieren Sie Ihre <0>Verschlüsselungseinstellungen</0>.",
"topline_expired_certificate": "Ihr SSL-Zertifikat ist abgelaufen. Aktualisieren Sie Ihre <0>Verschlüsselungseinstellungen</0>.",
"form_error_port_range": "Port zwischen 80 und 65535 eingeben",
"form_error_port_unsafe": "Dies ist ein unsicherer Port",
"form_error_equal": "Sollten nicht übereinstimmen",
"form_error_password": "Passwörter stimmen nicht überein",
"reset_settings": "Einstellungen zurücksetzen",
"update_announcement": "AdGuard Home {{version}} ist jetzt verfügbar! <0>Klicken Sie hier</0> für weitere Informationen.",
"setup_guide": "Einrichtungsassistent",
"dns_addresses": "DNS-Adressen",
"down": "Nicht erreichbar",
"fix": "Beheben",
"dns_providers": "Hier finden Sie eine <0>Liste der bekannten DNS-Anbieter</0> zur Auswahl.",
"update_now": "Jetzt aktualisieren",
"update_failed": "Das automatische Aktualisieren ist fehlgeschlagen. Bitte <a href='https://github.com/AdguardTeam/AdGuardHome/wiki/Getting-Started#update'>folgen Sie den Schritten</a>, um manuell zu aktualisieren.",
"processing_update": "Bitte warten Sie, AdGuard Home wird aktualisiert …",
"clients_title": "Clients",
"clients_desc": "Geräte einrichten, die mit AdGuard Home verbunden sind",
"settings_global": "Allgemein",
"settings_custom": "Benutzerdefiniert",
"table_client": "Client",
"table_name": "Name",
"save_btn": "Speichern",
"client_add": "Client hinzufügen",
"client_new": "Neuer Client",
"client_edit": "Client bearbeiten",
"client_identifier": "Bezeichner",
"ip_address": "IP-Adresse",
"form_enter_ip": "IP-Adresse eingeben",
"form_enter_mac": "MAC-Adresse eingeben",
"form_client_name": "Clientnamen eingeben",
"client_global_settings": "Allgemeine Einstellungen nutzen",
"client_deleted": "Client „{{key}}” erfolgreich entfernt",
"client_added": "Client „{{key}}” erfolgreich hinzugefügt",
"client_updated": "Client „{{key}}” erfolgreich aktualisiert",
"clients_not_found": "Keine Clients gefunden",
"client_confirm_delete": "Möchten Sie den Client „{{key}}” wirklich löschen?",
"filter_confirm_delete": "Möchten Sie den Filter wirklich löschen?",
"auto_clients_title": "Clients (Laufzeit)",
"auto_clients_desc": "Daten zu den Clients, die AdGuard Home verwenden, aber nicht in der Konfiguration gespeichert sind",
"access_title": "Zugriffsrechte",
"access_desc": "Hier können Sie die Zugriffsregeln für den AdGuard Home DNS-Server konfigurieren.",
"access_allowed_title": "Zugelassene Clients",
"access_allowed_desc": "Eine Liste von CIDR- oder IP-Adressen. Wenn konfiguriert, akzeptiert AdGuard Home nur Anfragen von diesen IP-Adressen.",
"access_disallowed_title": "Nicht zugelassene Clients",
"access_disallowed_desc": "Eine Liste von CIDR- oder IP-Adressen. Wenn konfiguriert, löscht AdGuard Home Anfragen von diesen IP-Adressen.",
"access_blocked_title": "Gesperrte Domains",
"access_blocked_desc": "Verwechseln Sie dies nicht mit Filtern. AdGuard Home löscht DNS-Abfragen mit diesen Domänen während der Abfrage.",
"access_settings_saved": "Zugriffseinstellungen erfolgreich gespeichert",
"updates_checked": "Erfolgreich auf Aktualisierungen geprüft",
"updates_version_equal": "AdGuard Home ist aktuell",
"check_updates_now": "Jetzt nach Aktualisierungen suchen",
"dns_privacy": "DNS-Datenschutz",
"setup_dns_privacy_1": "<0>DNS-over-TLS:</0> Zeichenkette <1>{{address}}</1> verwenden.",
"setup_dns_privacy_2": "<0>DNS-over-HTTPS:</0> Zeichenkette <1>{{address}}</1> verwenden.",
"setup_dns_privacy_3": "<0>Bitte beachten Sie, dass verschlüsselte DNS-Protokolle nur von Android 9 unterstützt werden. Sie müssen also zusätzliche Software für andere Betriebssysteme installieren.</0><0>Hier eine Liste der Apps, die Sie verwenden könnten.</0>",
"setup_dns_privacy_android_1": "Android 9 unterstützt DNS-over-TLS nativ. Um es zu konfigurieren, gehen Sie zu „Einstellungen” → „Netzwerk & Internet” → „Erweitert” → „Privater DNS” und geben Sie dort Ihren Domainnamen ein.",
"setup_dns_privacy_android_2": "<0>AdGuard für Android</0> unterstützt <1>DNS-over-HTTTPS</1> und <1>DNS-over-TLS</1>.",
"setup_dns_privacy_android_3": "„<0>Intra</0>” fügt <1>DNS-over-HTTPS</1>-Unterstützung zu Android hinzu.",
"setup_dns_privacy_ios_1": "„<0>DNSCloak</0>” unterstützt <1>DNS-over-HTTPS</1>, aber um es so zu konfigurieren, dass es Ihren eigenen Server verwendet, müssen Sie einen <2>DNS-Stempel</2> dafür generieren.",
"setup_dns_privacy_ios_2": "<0>AdGuard für iOS</0> unterstützt die Einrichtung von <1>DNS-over-HTTTPS</1> und <1>DNS-over-TLS</1>.",
"setup_dns_privacy_other_title": "Weitere Umsetzungen",
"setup_dns_privacy_other_1": "AdGuard Home selbst kann ein sicherer DNS-Client auf jeder Plattform sein.",
"setup_dns_privacy_other_2": "<0>dnsproxy</0> unterstützt alle bekannten sicheren DNS-Protokolle.",
"setup_dns_privacy_other_3": "<0>dnscrypt-proxy</0> unterstützt <1>DNS-over-HTTPS</1>.",
"setup_dns_privacy_other_4": "<0>Mozilla Firefox</0> unterstützt <1>DNS-over-HTTPS</1>.",
"setup_dns_privacy_other_5": "Weitere Umsetzungen finden Sie <0>hier</0> und <1>hier</1>.",
"setup_dns_notice": "Um <1>DNS-over-HTTTPS</1> oder <1>DNS-over-TLS</1> verwenden zu können, müssen Sie in den AdGuard Home Einstellungen die <0>Verschlüsselung konfigurieren</0>.",
"rewrite_added": "DNS-Umschreibung für „{{key}}” erfolgreich hinzugefügt",
"rewrite_deleted": "DNS-Umschreibung für „{{key}}” erfolgreich entfernt",
"rewrite_add": "DNS-Umschreibung hinzufügen",
"rewrite_not_found": "Keine DNS-Umschreibungen gefunden",
"rewrite_confirm_delete": "Möchten Sie die DNS-Umschreibung für „{{key}}” wirklich entfernen?",
"rewrite_desc": "Ermöglicht die einfache Konfiguration der benutzerdefinierten DNS-Antwort für einen bestimmten Domainnamen.",
"rewrite_applied": "Geltende Umschreibungsregel",
"dns_rewrites": "DNS-Umscheibungen",
"form_domain": "Domain eingeben",
"form_answer": "IP-Adresse oder Domainname eingeben",
"form_error_domain_format": "Ungültiges Domainformat",
"form_error_answer_format": "Ungültiges Antwortformat",
"configure": "Konfigurieren",
"main_settings": "Grundeinstellungen",
"block_services": "Bestimmte Dienste sperren",
"blocked_services": "Gesperrte Dienste",
"blocked_services_desc": "Ermöglicht das schnelle Sperren beliebter Websites und Dienste.",
"blocked_services_saved": "Gesperrte Dienste erfolgreich gespeichert",
"blocked_services_global": "Global gesperrte Dienste verwenden",
"blocked_service": "Gesperrte Dienste",
"block_all": "Alle sperren",
"unblock_all": "Alle entsperren",
"encryption_certificate_path": "Zertifikatspfad",
"encryption_private_key_path": "Pfad des privaten Schlüssels",
"encryption_certificates_source_path": "Pfad für die Zertifikatsdatei festlegen",
"encryption_certificates_source_content": "Inhalt des Zertifikats einfügen",
"encryption_key_source_path": "Private Schlüsseldatei festlegen",
"encryption_key_source_content": "Inhalt des privaten Schlüssels einfügen",
"stats_params": "Statistikkonfiguration",
"config_successfully_saved": "Konfiguration erfolgreich gespeichert",
"interval_24_hour": "24 Stunden",
"interval_days": "{{count}} Tag",
"interval_days_plural": "{{count}} Tage",
"domain": "Domain",
"answer": "Antwort",
"filter_added_successfully": "Der Filter wurde erfolgreich hinzugefügt",
"statistics_configuration": "Statistikkonfiguration",
"statistics_retention": "Statistiken speichern",
"statistics_retention_desc": "Wenn Sie Intervallwert verringern, werden einige Daten verloren gehen",
"statistics_clear": " Statistiken leeren",
"statistics_clear_confirm": "Möchten Sie die Statistiken wirklich löschen?",
"statistics_retention_confirm": "Möchten Sie wirklich die Aufbewahrung der Statistiken ändern? Wenn Sie den Zeitabstand verringern, gehen einige Daten verloren.",
"statistics_cleared": "Statistiken wurden erfolgreich gelöscht",
"interval_hours": "{{count}} Stunde",
"interval_hours_plural": "{{count}} Stunden",
"filters_configuration": "Filterkonfiguration",
"filters_enable": "Filter aktivieren",
"filters_interval": "Aktualisierungsintervall der Filter",
"disabled": "Deaktiviert",
"username_label": "Benutzername",
"username_placeholder": "Benutzernamen eingeben",
"password_label": "Passwort",
"password_placeholder": "Passwort eingeben",
"sign_in": "Anmelden",
"sign_out": "Abmelden",
"forgot_password": "Passwort vergessen?",
"forgot_password_desc": "Bitte folgen Sie <0>dieser Anleitung</0>, um ein neues Passwort für Ihr Benutzerkonto zu erstellen.",
"location": "Ort",
"orgname": "Name der Organisation",
"netname": "Netzwerkname",
"descr": "Beschreibung",
"whois": "Whois",
"filtering_rules_learn_more": "<0>Erfahren Sie mehr</0> über die Erstellung eigener Hosts-Blocklisten."
}

View File

@@ -4,7 +4,6 @@
"upstream_parallel": "Use parallel queries to speed up resolving by simultaneously querying all upstream servers",
"bootstrap_dns": "Bootstrap DNS servers",
"bootstrap_dns_desc": "Bootstrap DNS servers are used to resolve IP addresses of the DoH/DoT resolvers you specify as upstreams.",
"url_added_successfully": "URL added successfully",
"check_dhcp_servers": "Check for DHCP servers",
"save_config": "Save config",
"enabled_dhcp": "DHCP server enabled",
@@ -18,11 +17,14 @@
"dhcp_leases": "DHCP leases",
"dhcp_static_leases": "DHCP static leases",
"dhcp_leases_not_found": "No DHCP leases found",
"dhcp_config_saved": "Saved DHCP server config",
"dhcp_config_saved": "DHCP config successfully saved",
"form_error_required": "Required field",
"form_error_ip_format": "Invalid IPv4 format",
"form_error_ip4_format": "Invalid IPv4 format",
"form_error_ip6_format": "Invalid IPv6 format",
"form_error_ip_format": "Invalid IP format",
"form_error_mac_format": "Invalid MAC format",
"form_error_positive": "Must be greater than 0",
"form_error_negative": "Must be equal to 0 or greater",
"dhcp_form_gateway_input": "Gateway IP",
"dhcp_form_subnet_input": "Subnet mask",
"dhcp_form_range_title": "Range of IP addresses",
@@ -44,6 +46,7 @@
"dhcp_new_static_lease": "New static lease",
"dhcp_static_leases_not_found": "No DHCP static leases found",
"dhcp_add_static_lease": "Add static lease",
"dhcp_reset": "Are you sure you want to reset DHCP config?",
"delete_confirm": "Are you sure you want to delete \"{{key}}\"?",
"form_enter_hostname": "Enter hostname",
"error_details": "Error details",
@@ -67,18 +70,22 @@
"disabled_protection": "Disabled protection",
"refresh_statics": "Refresh statistics",
"dns_query": "DNS Queries",
"blocked_by": "Blocked by Filters",
"blocked_by": "<0>Blocked by Filters</0>",
"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_days": "for the last {{count}} day",
"for_last_days_plural": "for the last {{count}} days",
"no_domains_found": "No domains found",
"requests_count": "Requests count",
"top_blocked_domains": "Top blocked domains",
"top_clients": "Top clients",
"no_clients_found": "No clients found",
"general_statistics": "General statistics",
"number_of_dns_query_24_hours": "A number of DNS quieries processed for the last 24 hours",
"number_of_dns_query_days": "A number of DNS queries processed for the last {{count}} day",
"number_of_dns_query_days_plural": "A number of DNS queries processed for the last {{count}} days",
"number_of_dns_query_24_hours": "A number of DNS queries processed for the last 24 hours",
"number_of_dns_query_blocked_24_hours": "A number of DNS requests blocked by adblock filters and hosts blocklists",
"number_of_dns_query_blocked_24_hours_by_sec": "A number of DNS requests blocked by the AdGuard browsing security module",
"number_of_dns_query_blocked_24_hours_adult": "A number of adult websites blocked",
@@ -93,16 +100,16 @@
"use_adguard_parental": "Use AdGuard parental control web service",
"use_adguard_parental_hint": "AdGuard Home will check if domain contains adult materials. It uses the same privacy-friendly API as the browsing security web service.",
"enforce_safe_search": "Enforce safe search",
"enforce_save_search_hint": "AdGuard Home can enforce safe search in the following search engines: Google, Youtube, Bing, DuckDuckGo and Yandex.",
"enforce_save_search_hint": "AdGuard Home can enforce safe search in the following search engines: Google, Youtube, Bing, DuckDuckGo, Yandex, Pixabay.",
"no_servers_specified": "No servers specified",
"no_settings": "No settings",
"general_settings": "General settings",
"dns_settings": "DNS settings",
"encryption_settings": "Encryption settings",
"dhcp_settings": "DHCP settings",
"upstream_dns": "Upstream DNS servers",
"upstream_dns_hint": "If you keep this field empty, AdGuard Home will use <a href='https://1.1.1.1/' target='_blank'>Cloudflare DNS</a> as an upstream.",
"upstream_dns_hint": "If you keep this field empty, AdGuard Home will use <a href='https://www.quad9.net/' target='_blank'>Quad9</a> as an upstream.",
"test_upstream_btn": "Test upstreams",
"upstreams": "Upstreams",
"apply_btn": "Apply",
"disabled_filtering_toast": "Disabled filtering",
"enabled_filtering_toast": "Enabled filtering",
@@ -139,7 +146,7 @@
"example_comment": "! Here goes a comment",
"example_comment_meaning": "just a comment",
"example_comment_hash": "# Also a comment",
"example_regex_meaning": "block access to the domains matching the <0>specified regular expression</0>",
"example_regex_meaning": "block access to the domains matching the specified regular expression",
"example_upstream_regular": "regular DNS (over UDP)",
"example_upstream_dot": "encrypted <0>DNS-over-TLS</0>",
"example_upstream_doh": "encrypted <0>DNS-over-HTTPS</0>",
@@ -160,11 +167,7 @@
"show_all_filter_type": "Show all",
"show_filtered_type": "Show filtered",
"no_logs_found": "No logs found",
"disabled_log_btn": "Disable log",
"download_log_file_btn": "Download log file",
"refresh_btn": "Refresh",
"enabled_log_btn": "Enable log",
"last_dns_queries": "Last 5000 DNS queries",
"previous_btn": "Previous",
"next_btn": "Next",
"loading_table_status": "Loading...",
@@ -174,8 +177,33 @@
"updated_custom_filtering_toast": "Updated the custom filtering rules",
"rule_removed_from_custom_filtering_toast": "Rule removed from the custom filtering rules",
"rule_added_to_custom_filtering_toast": "Rule added to the custom filtering rules",
"query_log_disabled_toast": "Query log disabled",
"query_log_enabled_toast": "Query log enabled",
"query_log_response_status": "Status: {{value}}",
"query_log_filtered": "Filtered by {{filter}}",
"query_log_confirm_clear": "Are you sure you want to clear the entire query log?",
"query_log_cleared": "The query log has been successfully cleared",
"query_log_clear": "Clear query logs",
"query_log_retention": "Query logs retention",
"query_log_enable": "Enable log",
"query_log_configuration": "Logs configuration",
"query_log_disabled": "The query log is disabled and can be configured in the <0>settings</0>",
"query_log_strict_search": "Use double quotes for strict search",
"query_log_retention_confirm": "Are you sure you want to change query log retention? If you decrease the interval value, some data will be lost",
"dns_config": "DNS server configuration",
"blocking_mode": "Blocking mode",
"nxdomain": "NXDOMAIN",
"null_ip": "Null IP",
"custom_ip": "Custom IP",
"blocking_ipv4": "Blocking IPv4",
"blocking_ipv6": "Blocking IPv6",
"form_enter_rate_limit": "Enter rate limit",
"rate_limit": "Rate limit",
"edns_enable": "Enable EDNS Client Subnet",
"edns_cs_desc": "If enabled, AdGuard Home will be sending clients' subnets to the DNS servers.",
"rate_limit_desc": "The number of requests per second that a single client is allowed to make (0: unlimited)",
"blocking_ipv4_desc": "IP address to be returned for a blocked A request",
"blocking_ipv6_desc": "IP address to be returned for a blocked AAAA request",
"blocking_mode_desc": "<0>NXDOMAIN Respond with NXDOMAIN code;</0> <0>Null IP Respond with zero IP address (0.0.0.0 for A; :: for AAAA);</0> <0>Custom IP - Respond with a manually set IP address.</0>",
"upstream_dns_client_desc": "If you keep this field empty, AdGuard Home will use the servers configured in the <0>DNS settings</0>.",
"source_label": "Source",
"found_in_known_domain_db": "Found in the known domains database.",
"category_label": "Category",
@@ -193,7 +221,7 @@
"install_settings_dns_desc": "You will need to configure your devices or router to use the DNS server on the following addresses:",
"install_settings_all_interfaces": "All interfaces",
"install_auth_title": "Authentication",
"install_auth_desc": "It is highly recommended to configure password authentication to your AdGuard Home admin web interface. Even if it is accessible only in your local network, it is still important to have it protected from unrestricted access.",
"install_auth_desc": "It is highly recommended to configure password authentication to your AdGuard Home admin web interface. Even if it is accessible only in your local network, it is still important to protect it from unrestricted access.",
"install_auth_username": "Username",
"install_auth_password": "Password",
"install_auth_confirm": "Confirm password",
@@ -272,6 +300,8 @@
"update_announcement": "AdGuard Home {{version}} is now available! <0>Click here</0> for more info.",
"setup_guide": "Setup guide",
"dns_addresses": "DNS addresses",
"dns_start": "DNS server is starting up",
"dns_status_error": "Error of getting DNS server status",
"down": "Down",
"fix": "Fix",
"dns_providers": "Here is a <0>list of known DNS providers</0> to choose from.",
@@ -290,15 +320,16 @@
"client_edit": "Edit Client",
"client_identifier": "Identifier",
"ip_address": "IP address",
"client_identifier_desc": "Clients can be identified by the IP address or MAC address. Please note, that using MAC as identifier is possible only if AdGuard Home is also a <0>DHCP server</0>",
"client_identifier_desc": "Clients can be identified by the IP address, CIDR, MAC address. Please note, that using MAC as identifier is possible only if AdGuard Home is also a <0>DHCP server</0>",
"form_enter_ip": "Enter IP",
"form_enter_mac": "Enter MAC",
"form_enter_id": "Enter identifier",
"form_add_id": "Add identifier",
"form_client_name": "Enter client name",
"client_global_settings": "Use global settings",
"client_deleted": "Client \"{{key}}\" successfully deleted",
"client_added": "Client \"{{key}}\" successfully added",
"client_updated": "Client \"{{key}}\" successfully updated",
"table_statistics": "Requests count (last 24 hours)",
"clients_not_found": "No clients found",
"client_confirm_delete": "Are you sure you want to delete client \"{{key}}\"?",
"filter_confirm_delete": "Are you sure you want to delete filter?",
@@ -353,5 +384,48 @@
"blocked_services_global": "Use global blocked services",
"blocked_service": "Blocked service",
"block_all": "Block all",
"unblock_all": "Unblock all"
"unblock_all": "Unblock all",
"encryption_certificate_path": "Certificate path",
"encryption_private_key_path": "Private key path",
"encryption_certificates_source_path": "Set a certificates file path",
"encryption_certificates_source_content": "Paste the certificates contents",
"encryption_key_source_path": "Set a private key file",
"encryption_key_source_content": "Paste the private key contents",
"stats_params": "Statistics configuration",
"config_successfully_saved": "Configuration successfully saved",
"interval_24_hour": "24 hours",
"interval_days": "{{count}} day",
"interval_days_plural": "{{count}} days",
"domain": "Domain",
"answer": "Answer",
"filter_added_successfully": "The filter has been successfully added",
"statistics_configuration": "Statistics configuration",
"statistics_retention": "Statistics retention",
"statistics_retention_desc": "If you decrease the interval value, some data will be lost",
"statistics_clear": " Clear statistics",
"statistics_clear_confirm": "Are you sure you want to clear statistics?",
"statistics_retention_confirm": "Are you sure you want to change statistics retention? If you decrease the interval value, some data will be lost",
"statistics_cleared": "Statistics successfully cleared",
"interval_hours": "{{count}} hour",
"interval_hours_plural": "{{count}} hours",
"filters_configuration": "Filters configuration",
"filters_enable": "Enable filters",
"filters_interval": "Filters update interval",
"disabled": "Disabled",
"username_label": "Username",
"username_placeholder": "Enter username",
"password_label": "Password",
"password_placeholder": "Enter password",
"sign_in": "Sign in",
"sign_out": "Sign out",
"forgot_password": "Forgot password?",
"forgot_password_desc": "Please follow <0>these steps</0> to create a new password for your user account.",
"location": "Location",
"orgname": "Organization name",
"netname": "Network name",
"descr": "Description",
"whois": "Whois",
"filtering_rules_learn_more": "<0>Learn more</0> about creating your own hosts blocklists.",
"blocked_by_response": "Blocked by CNAME or IP in response",
"try_again": "Try again"
}

View File

@@ -4,7 +4,6 @@
"upstream_parallel": "Usar consultas paralelas para acelerar la resolución al consultar simultáneamente a todos los servidores de subida",
"bootstrap_dns": "Servidores DNS de arranque",
"bootstrap_dns_desc": "Los servidores DNS de arranque se utilizan para resolver las direcciones IP de los resolutores DoH/DoT que usted especifique como DNS de subida.",
"url_added_successfully": "URL añadida correctamente",
"check_dhcp_servers": "Comprobar si hay servidores DHCP",
"save_config": "Guardar configuración",
"enabled_dhcp": "Servidor DHCP habilitado",
@@ -18,9 +17,11 @@
"dhcp_leases": "Asignaciones DHCP",
"dhcp_static_leases": "Asignaciones DHCP estáticas",
"dhcp_leases_not_found": "No se han encontrado asignaciones DHCP",
"dhcp_config_saved": "Configuración del servidor DHCP guardada",
"dhcp_config_saved": "Configuración DHCP guardado correctamente",
"form_error_required": "Campo obligatorio",
"form_error_ip_format": "Formato IPv4 no válido",
"form_error_ip4_format": "Formato IPv4 no válido",
"form_error_ip6_format": "Formato IPv6 no válido",
"form_error_ip_format": "Formato IP no válido",
"form_error_mac_format": "Formato MAC no válido",
"form_error_positive": "Debe ser mayor que 0",
"dhcp_form_gateway_input": "IP de puerta de enlace",
@@ -44,6 +45,7 @@
"dhcp_new_static_lease": "Nueva 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": "¿Está seguro de que desea restablecer la configuración DHCP?",
"delete_confirm": "¿Está seguro de que desea eliminar \"{{key}}\"?",
"form_enter_hostname": "Ingrese el nombre del host",
"error_details": "Detalles del error",
@@ -67,17 +69,21 @@
"disabled_protection": "Protección deshabilitada",
"refresh_statics": "Restablecer estadísticas",
"dns_query": "Consultas DNS",
"blocked_by": "Bloqueado por filtros",
"blocked_by": "<0>Bloqueado por filtros</0>",
"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_days": "durante los últimos {{count}} días",
"for_last_days_plural": "durante los últimos {{count}} días",
"no_domains_found": "No se han encontrado dominios",
"requests_count": "Número de peticiones",
"top_blocked_domains": "Dominios más bloqueados",
"top_clients": "Clientes más frecuentes",
"no_clients_found": "No se han encontrado clientes",
"general_statistics": "Estadísticas generales",
"number_of_dns_query_days": "Número de consultas DNS procesadas durante los últimos {{count}} días",
"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_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",
@@ -93,16 +99,16 @@
"use_adguard_parental": "Usar el control parental de AdGuard",
"use_adguard_parental_hint": "AdGuard Home comprobará si el dominio contiene materiales para adultos. Utiliza la misma API amigable con la privacidad del servicio web de seguridad de navegación.",
"enforce_safe_search": "Forzar búsqueda segura",
"enforce_save_search_hint": "AdGuard Home puede forzar la búsqueda segura en los siguientes motores de búsqueda: Google, YouTube, Bing, DuckDuckGo y Yandex.",
"enforce_save_search_hint": "AdGuard Home puede forzar la búsqueda segura en los siguientes motores de búsqueda: Google, YouTube, Bing, DuckDuckGo, Yandex y Pixabay.",
"no_servers_specified": "No hay servidores especificados",
"no_settings": "Sin configuración",
"general_settings": "Configuración general",
"dns_settings": "Configuración del DNS",
"encryption_settings": "Configuración de cifrado",
"dhcp_settings": "Configuración DHCP",
"upstream_dns": "Servidores DNS de subida",
"upstream_dns_hint": "Si mantiene este campo vacío, AdGuard Home utilizará <a href='https://1.1.1.1/' target='_blank'>Cloudflare DNS</a> como DNS de subida. Utilice el prefijo tls:// para los servidores DNS mediante TLS.",
"upstream_dns_hint": "Si mantiene este campo vacío, AdGuard Home utilizará <a href='https://www.quad9.net/' target='_blank'>Quad9</a> como DNS de subida.",
"test_upstream_btn": "Probar DNS de subida",
"upstreams": "DNS de subida",
"apply_btn": "Aplicar",
"disabled_filtering_toast": "Filtrado deshabilitado",
"enabled_filtering_toast": "Filtrado habilitado",
@@ -139,7 +145,7 @@
"example_comment": "! Aquí va un comentario",
"example_comment_meaning": "solo un comentario",
"example_comment_hash": "# También un comentario",
"example_regex_meaning": "bloquear el acceso a los dominios que coincidan con la <0>expresión regular especificada</0>",
"example_regex_meaning": "bloquea el acceso a los dominios que coincidan con la expresión regular especificada",
"example_upstream_regular": "DNS regular (mediante UDP)",
"example_upstream_dot": "cifrado <0>DNS mediante TLS</0>",
"example_upstream_doh": "cifrado <0>DNS mediante HTTPS</0>",
@@ -160,11 +166,7 @@
"show_all_filter_type": "Mostrar todo",
"show_filtered_type": "Mostrar filtrados",
"no_logs_found": "No se han encontrado registros",
"disabled_log_btn": "Deshabilitar registro",
"download_log_file_btn": "Descargar archivo de registro",
"refresh_btn": "Actualizar",
"enabled_log_btn": "Habilitar registro",
"last_dns_queries": "Últimas 5000 consultas DNS",
"previous_btn": "Atrás",
"next_btn": "Siguiente",
"loading_table_status": "Cargando...",
@@ -174,8 +176,23 @@
"updated_custom_filtering_toast": "Reglas de filtrado personalizado actualizadas",
"rule_removed_from_custom_filtering_toast": "Regla eliminada de las reglas de filtrado personalizado",
"rule_added_to_custom_filtering_toast": "Regla añadida a las reglas de filtrado personalizado",
"query_log_disabled_toast": "Registro de consultas deshabilitado",
"query_log_enabled_toast": "Registro de consultas habilitado",
"query_log_response_status": "Estado: {{value}}",
"query_log_filtered": "Filtrado por {{filter}}",
"query_log_confirm_clear": "¿Está seguro de que desea borrar todo el registro de consultas?",
"query_log_cleared": "El registro de consultas se ha borrado correctamente",
"query_log_clear": "Borrar registros de consultas",
"query_log_retention": "Retención de registros de consultas",
"query_log_enable": "Habilitar registro",
"query_log_configuration": "Configuración de registros",
"query_log_disabled": "El registro de consultas está deshabilitado y se puede configurar en la <0>configuración</0>",
"query_log_strict_search": "Usar comillas dobles para una búsqueda estricta",
"query_log_retention_confirm": "¿Está seguro de que desea cambiar la retención del registro de consultas? Si disminuye el valor del intervalo, se perderán algunos datos",
"blocking_mode": "Modo de bloqueo",
"nxdomain": "NXDOMAIN",
"custom_ip": "IP personalizada",
"edns_cs_desc": "Si está habilitado, AdGuard Home enviará las subredes de los clientes a los servidores DNS.",
"rate_limit_desc": "Número de peticiones por segundo que un solo cliente puede hacer (0: ilimitado)",
"upstream_dns_client_desc": "Si mantiene este campo vacío, AdGuard Home utilizará los servidores configurados en la <0>configuración del DNS</0>.",
"source_label": "Fuente",
"found_in_known_domain_db": "Encontrado en la base de datos de dominios conocidos.",
"category_label": "Categoría",
@@ -246,8 +263,8 @@
"encryption_dot": "Puerto DNS mediante TLS",
"encryption_dot_desc": "Si este puerto está configurado, AdGuard Home ejecutará un servidor DNS mediante TLS en este puerto.",
"encryption_certificates": "Certificados",
"encryption_certificates_desc": "Para utilizar el cifrado, debe proporcionar una cadena de certificados SSL válida para su dominio. Puede obtener un certificado gratuito en <0>{{link}}</0> o puede comprarlo en una de las autoridades de certificación de confianza.",
"encryption_certificates_input": "Copie/pegue aquí sus certificados codificados PEM.",
"encryption_certificates_desc": "Para utilizar el cifrado, debe proporcionar una cadena de certificado SSL válida para su dominio. Puede obtener un certificado gratuito en <0>{{link}}</0> o puede comprarlo en una de las autoridades de certificación de confianza.",
"encryption_certificates_input": "Copie/pegue aquí su certificado codificado PEM.",
"encryption_status": "Estado",
"encryption_expire": "Expira",
"encryption_key": "Clave privada",
@@ -272,6 +289,8 @@
"update_announcement": "¡AdGuard Home {{version}} ya está disponible! <0>Haga clic aquí</0> para más información.",
"setup_guide": "Guía de configuración",
"dns_addresses": "Direcciones DNS",
"dns_start": "El servidor DNS está iniciando",
"dns_status_error": "Error al obtener el estado del servidor DNS",
"down": "Abajo",
"fix": "Corregir",
"dns_providers": "Aquí hay una <0>lista de proveedores DNS</0> conocidos para elegir.",
@@ -290,15 +309,16 @@
"client_edit": "Editar cliente",
"client_identifier": "Identificador",
"ip_address": "Dirección IP",
"client_identifier_desc": "Los clientes pueden ser identificados por la dirección IP o MAC. Tenga en cuenta que el uso de MAC como identificador solo es posible si AdGuard Home también es un <0>servidor DHCP</0>.",
"client_identifier_desc": "Los clientes pueden ser identificados por la dirección IP, MAC y CIDR. Tenga en cuenta que el uso de MAC como identificador solo es posible si AdGuard Home también es un <0>servidor DHCP</0>",
"form_enter_ip": "Ingresar IP",
"form_enter_mac": "Ingresar MAC",
"form_enter_id": "Ingrese el identificador",
"form_add_id": "Añadir identificador",
"form_client_name": "Ingrese el nombre del cliente",
"client_global_settings": "Usar configuración global",
"client_deleted": "Cliente \"{{key}}\" eliminado correctamente",
"client_added": "Cliente \"{{key}}\" añadido correctamente",
"client_updated": "Cliente \"{{key}}\" actualizado correctamente",
"table_statistics": "Número de peticiones (últimas 24 horas)",
"clients_not_found": "No se han encontrado clientes",
"client_confirm_delete": "¿Está seguro de que desea eliminar el cliente \"{{key}}\"?",
"filter_confirm_delete": "¿Está seguro de que desea eliminar el filtro?",
@@ -353,5 +373,47 @@
"blocked_services_global": "Usar servicios bloqueados globalmente",
"blocked_service": "Servicio bloqueado",
"block_all": "Bloquear todo",
"unblock_all": "Desbloquear todo"
"unblock_all": "Desbloquear todo",
"encryption_certificate_path": "Ruta de acceso al certificado",
"encryption_private_key_path": "Ruta de acceso a la clave privada",
"encryption_certificates_source_path": "Establecer una ruta para el archivo de certificado",
"encryption_certificates_source_content": "Pegar el contenido del certificado",
"encryption_key_source_path": "Establecer un archivo de clave privada",
"encryption_key_source_content": "Pegar el contenido de la clave privada",
"stats_params": "Configuración de estadísticas",
"config_successfully_saved": "Configuración guardada correctamente",
"interval_24_hour": "24 horas",
"interval_days": "{{count}} día",
"interval_days_plural": "{{count}} días",
"domain": "Dominio",
"answer": "Respuesta",
"filter_added_successfully": "El filtro ha sido añadido correctamente",
"statistics_configuration": "Configuración de estadísticas",
"statistics_retention": "Retención de estadísticas",
"statistics_retention_desc": "Si disminuye el valor del intervalo, algunos datos estarán perdidos",
"statistics_clear": "Borrar estadísticas",
"statistics_clear_confirm": "¿Está seguro de que desea borrar las estadísticas?",
"statistics_retention_confirm": "¿Está seguro de que desea cambiar la retención de estadísticas? Si disminuye el valor del intervalo, se perderán algunos datos",
"statistics_cleared": "Estadísticas borradas correctamente",
"interval_hours": "{{count}} hora",
"interval_hours_plural": "{{count}} horas",
"filters_configuration": "Configuración de filtros",
"filters_enable": "Habilitar filtros",
"filters_interval": "Intervalo de actualización",
"disabled": "Deshabilitado",
"username_label": "Usuario",
"username_placeholder": "Ingrese su nombre de usuario",
"password_label": "Contraseña",
"password_placeholder": "Ingrese la contraseña",
"sign_in": "Iniciar sesión",
"sign_out": "Cerrar sesión",
"forgot_password": "¿Olvidaste tu contraseña?",
"forgot_password_desc": "Por favor siga <0>estos pasos</0> para crear una nueva contraseña para su cuenta de usuario.",
"location": "Ubicación",
"orgname": "Nombre de la organización",
"netname": "Nombre de la red",
"descr": "Descripción",
"whois": "Whois",
"filtering_rules_learn_more": "<0>Más información</0> sobre cómo crear tus propias listas para bloqueo de hosts.",
"blocked_by_response": "Bloqueado por CNAME o IP en respuesta"
}

View File

@@ -0,0 +1,366 @@
{
"client_settings": "تنظیمات کلاینت",
"example_upstream_reserved": "میتوانید جریان ارسالی DNS <0> را برای یک دامنه مشخص تعیین کنید </0>",
"upstream_parallel": "استفاده از جستار موازی برای سرعت دادن به تفکیک با جستار همزمان همه جریان های ارسالی",
"bootstrap_dns": "خودراه انداز سرورهای DNS",
"bootstrap_dns_desc": "خودراه انداز سرورهای DNS برای تفکیک آدرس آی پی تفکیک کننده های DoH/DoT که شما بعنوان جریان ارسالی تعیین کردید استفاده میشود.",
"check_dhcp_servers": "بررسی برای سرورهای DHCP",
"save_config": "ذخیره پیکربندی",
"enabled_dhcp": "سرور DHCP فعال شده است",
"disabled_dhcp": "سرور DHCP غیرفعال شده است",
"dhcp_title": "سرور DHCP",
"dhcp_description": "اگر روتر شما تنظیمات DHCP ارائه نمی کند،میتوانید از سرور DHCP تو-کار خود AdGuard استفاده کنید.",
"dhcp_enable": "فعالسازی سرور DHCP",
"dhcp_disable": "غیرفعالسازی سرور DHCP",
"dhcp_not_found": "سرورهای فعال DHCP در شبکه یافت نشد.فعالسازی سرور DHCP تو-کار اَمن است.",
"dhcp_found": "تعدادی سرور DHCP فعال در شبکه یافت شد.فعالسازی سرور DHCP توکار اَمن نیست.",
"dhcp_leases": "اجاره DHCP",
"dhcp_static_leases": "اجاره DHCP ایستا",
"dhcp_leases_not_found": "اجاره DHCP یافت نشد",
"form_error_required": "فیلد مورد نیاز",
"form_error_mac_format": "فرمت مَک نامعتبر است",
"form_error_positive": "باید بزرگتر از 0 باشد",
"dhcp_form_gateway_input": "آی پی دروازه",
"dhcp_form_subnet_input": "ماسک زیر شبکه",
"dhcp_form_range_title": "دامنه آدرس های آی پی",
"dhcp_form_range_start": "آغاز دامنه",
"dhcp_form_range_end": "انتهای دامنه",
"dhcp_form_lease_title": "زمان اجاره DHCP (در ثانیه)",
"dhcp_form_lease_input": "مدت اجاره",
"dhcp_interface_select": "رابط DHCP را انتخاب کنید",
"dhcp_hardware_address": "آدرس سخت افزار",
"dhcp_ip_addresses": "آدرس آی پی",
"dhcp_table_hostname": "نام میزبان",
"dhcp_table_expires": "انقضاء",
"dhcp_warning": "اگر میخواهید DHCP سرور توکار را فعال کنید،مطمئن شوید DHCP سرور دیگری فعال نباشد.در غیر اینصورت،آن دسترسی به اینترنت را برای دستگاه های وصل شده قطع می کند!",
"dhcp_error": "ما نمیتوانیم تشخیص دهیم آیا یک سرور DHCP دیگر در شبکه موجود است یا نه.",
"dhcp_static_ip_error": "به منظور استفاده از سرور DHCP یک آدرس آی پی ثابت باید تنظیم شود.ما موفق به تشخیص اینکه آیا رابط این شبکه برای استفاده از آی پی ثابت تنظیم شده است یا نه موفق نشدیم.لطفا آدرس آی پی ثابت را دستی تنظیم کنید.",
"dhcp_dynamic_ip_found": "سیستم شما آدرس آی پی متغییر برای این رابط استفاده می کند <0>{{interfaceName}}</0>. به منظور استفاده از سرور DHCP آدرس ثابت باید تعیین شود. آدرس آی پی فعلی شما هست <0>{{ipAddress}}</0>. اگر شما دکمه DHCP را فشار دهید ما این آدرس آی پی را بعنوان ثابت تنظیم می کنیم.",
"dhcp_lease_added": "اجاره ایستا \"{{key}}\" با موفقیت اضافه شد",
"dhcp_lease_deleted": "اجاره ایستا \"{{key}}\" با موفقیت حذف شد",
"dhcp_new_static_lease": "اجاره ایستا جدید",
"dhcp_static_leases_not_found": "هیچ اجاره DHCP ایستا یافت نشد",
"dhcp_add_static_lease": "افزودن اجاره ایستا",
"delete_confirm": "آیا میخواهید \"{{key}}\" را حذف کنید؟",
"form_enter_hostname": "نام میزبان را وارد کنید",
"error_details": "جزئیات خطا",
"back": "قبلی",
"dashboard": "داشبورد",
"settings": "تنظيمات",
"filters": "فيلترها",
"query_log": "جستار وقایع",
"faq": "پرسش و پاسخ",
"version": "نسخه",
"address": "آدرس",
"on": "روشن",
"off": "خاموش",
"copyright": "حق مالکیت",
"homepage": "صفحه خانگي",
"report_an_issue": "گزارش یک مشکل",
"privacy_policy": "سیاست حریم خصوصی",
"enable_protection": "فعالسازي حفاظت",
"enabled_protection": "حفاظت فعال شده",
"disable_protection": "غيرفعالسازي حفاظت",
"disabled_protection": "حفاظت غير فعال شده",
"refresh_statics": "تازه سازی آمار",
"dns_query": "جستار DNS",
"blocked_by": "مسدود شده با",
"stats_malware_phishing": "بدافزار/فیشینگ مسدود شده است",
"stats_adult": "وبسایت غیراخلاقی مسدود شده است",
"stats_query_domain": "دامنه جستار بالا",
"for_last_24_hours": "برای 24 ساعت گذشته",
"for_last_days": "برای {{value}} روز آخر",
"for_last_days_plural": "برای {{count}} روز گذشته",
"no_domains_found": "دامنه یافت نشد",
"requests_count": "تعداد درخواست ها",
"top_blocked_domains": "دامنه های بیشتر مسدود شده",
"top_clients": "بالاترین کلاینت ها",
"no_clients_found": "کلاینتی یافت نشد",
"general_statistics": "آمار عمومی",
"number_of_dns_query_days": "تعداد جستار DNS پردازش شده در {{value}} روز آخر",
"number_of_dns_query_days_plural": "تعداد جستار DNS پردازش شده در {{count}} روز گذشته",
"number_of_dns_query_24_hours": "تعداد جستار DNS پردازش شده در 24 ساعت گذشته",
"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": "میانگین زمان پردازش",
"average_processing_time_hint": "زمان میانگین بر هزارم ثانیه در پردازش درخواست DNS",
"block_domain_use_filters_and_hosts": "مسدودسازی دامنه ها توسط فیلترها و فایل های میزبان",
"filters_block_toggle_hint": "میتوانید دستورات مسدودسازی را در تنظیمات <a href='#filters'>فیلترها</a> راه اندازی کنید.",
"use_adguard_browsing_sec": "استفاده از سرویس وب امنیت وب گردی AdGuard",
"use_adguard_browsing_sec_hint": "AdGuard Home بررسی می کند اگر دامنه در سرویس وب امنیت وب گردی در لیست سیاه است.آن از اِی پی آی دارای حریم خصوصی برای بررسی استفاده می کند:فقط پیشوند کوتاه نام دامنه هش SHA256 به سرور ارسال خواهد شد.",
"use_adguard_parental": "از سرویس وب نظارت والدین AdGuard استفاده کن",
"use_adguard_parental_hint": "AdGuard Home بررسی می کند اگر دامنه حاوی موارد غیر اخلاقی است.آن از همان اِی پی آی دارای حریم خصوصی سرویس وب امنیت وب گردی استفاده می کند.",
"enforce_safe_search": "اجبار جستجوی اَمن",
"no_servers_specified": "سروری تعیین نشده است",
"general_settings": "تنظیمات عمومی",
"dns_settings": "تنظیمات DNS",
"encryption_settings": "تنظیمات رمزگُذاری",
"dhcp_settings": "تنظیمات DHCP",
"upstream_dns": "سرورهای DNS جریان ارسالی",
"test_upstream_btn": "تست جریان ارسالی",
"apply_btn": "اِعمال",
"disabled_filtering_toast": "فیلترینگ غیرفعال شده است",
"enabled_filtering_toast": "فیلترینگ فعال شده است",
"disabled_safe_browsing_toast": "وب گردی اَمن غیر فعال شده است",
"enabled_safe_browsing_toast": "وب گردی اَمن فعال شده است",
"disabled_parental_toast": "نظارت والدین غیرفعال شده است",
"enabled_parental_toast": "نظارت والدین فعال شده است",
"disabled_safe_search_toast": "جستجوی اَمن غیرفعال شده",
"enabled_save_search_toast": "جستجوی اَمن فعال شده",
"enabled_table_header": "فعال شده",
"name_table_header": "نام",
"filter_url_table_header": "فیلتر آدرس",
"rules_count_table_header": "تعداد دستور",
"last_time_updated_table_header": "زمان آخرین بروزرسانی",
"actions_table_header": "اقدامات",
"edit_table_action": "ويرايش",
"delete_table_action": "حذف",
"filters_and_hosts": "فیلترها و میزبان های لیست سیاه",
"filters_and_hosts_hint": "AdGuard Home دستورات پایه مسدودساز تبلیغ و نحو فایل های میزبان را درک می کند.",
"no_filters_added": "فیلتری اضافه نشده است",
"add_filter_btn": "افزودن فیلتر",
"cancel_btn": "لغو",
"enter_name_hint": "نام را وارد کنید",
"enter_url_hint": "آدرس را وارد کنید...",
"check_updates_btn": "بررسی بروز رسانی",
"new_filter_btn": "اشتراک فیلتر جدید",
"enter_valid_filter_url": "آدرس معتبر برای اشتراک در فیلتر یا فایل میزبان وارد کنید.",
"custom_filter_rules": "دستورات فیلترینگ دستی",
"custom_filter_rules_hint": "یک دستور در خط وارد کنید.میتوانید از دستورات مسدودساز تبلیغ یا نحو فایل های میزبان استفاده کنید.",
"examples_title": "مثال ها",
"example_meaning_filter_block": "مسدودسازی دسترسی به دامنه example.org و همه زیر دامنه ها آن",
"example_meaning_filter_whitelist": "بازکردن دسترسی به دامنه example.org و همه زیر دامنه ها آن",
"example_meaning_host_block": "AdGuard Home بر می گردد به آدرس 127.0.0.1 برای دامنه example.org (اما نه زیر دامنه های آن)",
"example_comment": "! در اینجا نظر قرار می گیرد",
"example_comment_meaning": "فقط یک توضیح",
"example_comment_hash": "# همچنین یک نظر",
"example_upstream_regular": "DNS عادی (بر UDP)",
"example_upstream_dot": "کُدگذاری شده <a href='https://en.wikipedia.org/wiki/DNS_over_TLS' target='_blank'>DNS-over-TLS</a>",
"example_upstream_doh": "کُدگذاری شده <a href='https://en.wikipedia.org/wiki/DNS_over_HTTPS' target='_blank'>DNS-over-HTTPS</a>",
"example_upstream_sdns": "شما میتوانید از <a href='https://dnscrypt.info/stamps/' target='_blank'>DNS Stamps</a> برای <a href='https://dnscrypt.info/' target='_blank'>DNSCrypt</a> یا <a href='https://en.wikipedia.org/wiki/DNS_over_HTTPS' target='_blank'>DNS-over-HTTPS</a> resolvers استفاده کنید",
"example_upstream_tcp": "DNS عادی (بر TCP)",
"all_filters_up_to_date_toast": "همه فیلترها از قبل بروز رسانی شده است",
"updated_upstream_dns_toast": "سرورهای DNS جریان ارسالی بروز رسانی شده است",
"dns_test_ok_toast": "سرورهای DNS تعیین شده بدرستی کار می کنند",
"dns_test_not_ok_toast": "سرور \"{{key}}\": نمیتواند مورد استفاده قرار گیرد،لطفا بررسی کنید آن را بدرستی نوشته اید",
"unblock_btn": "باز کن",
"block_btn": "مسدود کن",
"time_table_header": "زمان",
"domain_name_table_header": "نام دامنه",
"type_table_header": "نوع",
"response_table_header": "پاسخ",
"client_table_header": "کلاینت",
"empty_response_status": "خالی",
"show_all_filter_type": "نمایش همه",
"show_filtered_type": "نمایش فیلتر شده",
"no_logs_found": "وقایع یافت نشد",
"refresh_btn": "تازه سازی",
"previous_btn": "قبلی",
"next_btn": "بعدی",
"loading_table_status": "بارگیری...",
"page_table_footer_text": "صفحه",
"of_table_footer_text": "از",
"rows_table_footer_text": "سطر",
"updated_custom_filtering_toast": "دستورات فیلترینگ دستی بروز رسانی شده است",
"rule_removed_from_custom_filtering_toast": "دستور از دستورات فیلترینگ دستی حذف شد",
"rule_added_to_custom_filtering_toast": "دستور به دستورات فیلترینگ دستی اضافه شد",
"query_log_response_status": "وضعیت: {{value}}",
"query_log_filtered": "فیلتر شده با {{filter}}",
"source_label": "منبع",
"found_in_known_domain_db": "در پایگاه داده دامنه های شناخته شده پیدا شد",
"category_label": "دسته بندی",
"rule_label": "دستور",
"filter_label": "فیلتر",
"unknown_filter": "فیلتر ناشناخته {{filterId}}",
"install_welcome_title": "به AdGuard Home خوش آمدید!",
"install_welcome_desc": "AdGuard Home یک شبکه گسترده و ردیاب و مسدوساز تبلیغ با سرور DNS است.هدف آن این است که به شما اجازه کنترل کل شبکه و همه دستگاه های شما را بدهد و آن نیازی به برنامه سمت-کاربر ندارد.",
"install_settings_title": "رابط وب آدمین",
"install_settings_listen": "رابط گوش دادن",
"install_settings_port": "پورت",
"install_settings_interface_link": "رابط صفحه وب آدمین AdGuard Home شما در این آدرس قابل دسترسی خواهد بود:",
"form_error_port": "مقدار پورت معتبر وارد کنید",
"install_settings_dns": "سرور DNS",
"install_settings_dns_desc": "نیاز است شما دستگاه یا روتر خود را برای استفاده از سرور DNS روی آدرس های زیر پیکربندی کنید:",
"install_settings_all_interfaces": "همه رابط ها",
"install_auth_title": "احراز هویت",
"install_auth_username": "نام کاربر",
"install_auth_password": "رمزعبور",
"install_auth_confirm": "تأیید رمزعبور",
"install_auth_username_enter": "نام کاربر را وارد کنید",
"install_auth_password_enter": "رمزعبور را وارد کنید",
"install_step": "گام",
"install_devices_title": "پیکربندی دستگاه شما",
"install_devices_desc": "به منظور اینکه AdGuard Home شروع به کار کند،باید دستگاه خود را برای استفاده از آن پیکربندی کنید.",
"install_submit_title": "تبریک می گوییم!",
"install_submit_desc": "روش راه اندازی به پایان رسیده و شما آماده استفاده از AdGuard Home هستید.",
"install_devices_router": "روتر",
"install_devices_router_desc": "این راه انداز خودکار همه دستگاه های متصل شده به روتر خانه را پوشش میدهد و نیازی نیست شما هر یک از آنها را دستی پیکربندی کنید.",
"install_devices_address": "DNS سرور AdGuard Home به آدرس های زیر گوش میدهد",
"install_devices_router_list_1": "اولویت ها را برای روتر خود باز کنید.معمولا میتوانید آن را ز طریق مرورگر از طریق آدرسی مانند ( http://192.168.0.1/ یا http://192.168.1.1/) دسترسی داشته باشید.ممکن است رمزعبور پرسیده شود،اگر آن را بخاطر ندارید،غالبا میتوان رمزعبور را با فشردن دکمه پشت روتر ریست کرد.برخی روترها برنامه خاصی نیاز دارد که باید در رایانه/گوشی نصب شده باشد.",
"install_devices_router_list_2": "تنظیمات DHCP/DNS را بیابید.دنبال حروف DNS بگردید در فیلدی که اجازه دو یا سه گروه عدد را میدهد و هر کدام در چهار گروه سه عددی شکسته شده است",
"install_devices_router_list_3": "آدرس سرور AdGuard Home خود را آنجا وارد کنید",
"install_devices_windows_list_1": "کنترل پنل را از طریق استارت منو یا جستجوی ویندوز باز کنید.",
"install_devices_windows_list_2": "بروید به شبکه و دسته اینترنت و سپس به شبکه و مرکز اشتراک گذاری",
"install_devices_windows_list_3": "در سمت چپ صفحه تنظیمات آداپتور را تغییر داده و روی آن کلیک کنید",
"install_devices_windows_list_4": "ارتباط فعال خود را انتخاب کرده،روی آن راست کلیک کرده و مشخصات را انتخاب کنید.",
"install_devices_windows_list_5": "پروتکل اینترنت نسخه 4 (TCP/IP) را در لیست بیابید،آن را انتخاب و سپس روی مشخصات دوباره کلیک کنید.",
"install_devices_windows_list_6": "گزینه استفاده از آدرس DNS سرور زیر را انتخاب کرده و آدرس سرور AdGuard Home خود را وارد کنید.",
"install_devices_macos_list_1": "روی آیکون اَپل کلیک کرده و بروید به اولویت های سیستم",
"install_devices_macos_list_2": "روی شبکه کلیک کنید",
"install_devices_macos_list_3": "اولین ارتباط را از لیست خود انتخاب و روی پیشرفته کلیک کنید.",
"install_devices_macos_list_4": "تب DNS را انتخاب و آدرس های سرور AdGuard Home خود را وارد کنید.",
"install_devices_android_list_1": "از منوی صفحه خانه آندروئید،تنظیمات را فشار دهید",
"install_devices_android_list_2": "وای فای را در منو فشار دهید،صفحه لیست کردن همه شبکه های موجود نشان داده میشود (تنظیم DNS دستی برای ارتباط موبایلی غیرممکن است)",
"install_devices_android_list_3": "به شبکه ای که متصل شده اید فشار طولانی دهید و ویرایش شبکه را انتخاب کنید.",
"install_devices_android_list_4": "در برخی دستگاه ها،شما ممکن است کادر پیشرفته را برای تنظیمات بعدی بررسی کنید.برای تنظیم DNS آندروئید خود،نیاز است شما از تنظیمات IP را از DHCP به Staticتغییر دهید.",
"install_devices_android_list_5": "گروه مقادیر DNS 1 و DNS 2 را به آدرس سرور AdGuard Home خود تغییر دهید.",
"install_devices_ios_list_1": "از صفحه خانه،تنظیمات را فشار دهید.",
"install_devices_ios_list_2": "وای فای را از منوی چپ انتخاب کنید (پیکربندی DNS دستی برای ارتباط موبایلی غیرممکن است).",
"install_devices_ios_list_3": "روی نام شبکه فعال فعلی کلیک کنید.",
"install_devices_ios_list_4": "در فیلد DNS آدرس سرور AdGuard Home را وارد کنید",
"get_started": "شروع به کار",
"next": "بعدی",
"open_dashboard": "بازکردن داشبورد",
"install_saved": "با موفقیت ذخیره نشد",
"encryption_title": "رمزگُذاری",
"encryption_desc": "پشتیبانی رمزگُذاری (HTTPS/TLS) برای DNS و رابط آدمین وب",
"encryption_config_saved": "پیکربندی رمزگذاری ذخیره شد",
"encryption_server": "نام سرور",
"encryption_server_enter": "نام دامنه خود را وارد کنید",
"encryption_server_desc": "به منظور استفاده از HTTPS،شما باید نام سرور مطابق با گواهینامه اِس اِس اِل را وارد کنید.",
"encryption_redirect": "تغییر مسیر خودکار به HTTPS",
"encryption_redirect_desc": "اگر انتخاب شده باشد،AdGuard Home خودکار شما را از آدرس HTTP به HTTPS منتقل می کند",
"encryption_https": "پورت HTTPS",
"encryption_https_desc": "اگر پورت HTTPS پیکربندی شده باشد،رابط آدمین AdGuard Home از طریق HTTPS قابل دسترسی خواهد بود و آن همچنین DNS-over-HTTPS را در مکان '/dns-query' ارائه می دهد.",
"encryption_dot": "پورت DNS-over-TLS",
"encryption_dot_desc": "اگر این پورت پیکربندی شده باشد،AdGuard Home یک DNS-over-TLS سرور روی این پورت اجرا می کند",
"encryption_certificates": "گواهینامه ها",
"encryption_certificates_desc": "به منظور استفاده از رمزگُذاری، شما باید زنجیره گواهینامه اِس اِس اِل معتبر برای دامنه خود ارائه دهید. میتوانید گواهینامه رایگان از <0>{{link}}</0> بگیرید یا میتوانید آن را از مراجع گواهینامه معتبر بخرید.",
"encryption_certificates_input": "کپی/چسباندن گواهینامه پی ای اِم کد گذاری شده در اینجا.",
"encryption_status": "وضعیت",
"encryption_expire": "تاریخ انقضاء",
"encryption_key": "کلید خصوصی",
"encryption_key_input": "کپی/چسباندن کلید گواهینامه پی ای اِم کد گذاری شده در اینجا.",
"encryption_enable": "فعالسازی رمزگُذاری (HTTPS, DNS-over-HTTPS, و DNS-over-TLS)",
"encryption_enable_desc": "اگر رمزگُذاري فعال شده باشد،رابط آدمین AdGuard Home روی HTTPS کار خواهد کرد،و سرور DNS به درخواست های روی DNS-over-HTTPS و DNS-over-TLS گوش خواهد داد.",
"encryption_chain_valid": "زنجیره گواهینامه معتبر است",
"encryption_chain_invalid": "زنجیره گواهینامه نامعتبر است",
"encryption_key_valid": "این یک کلید خصوصی {{type}} معتبر است",
"encryption_key_invalid": "این یک کلید خصوصی {{type}} نامعتبر است",
"encryption_subject": "موضوع",
"encryption_issuer": "صادر کننده",
"encryption_hostnames": "نام میزبان",
"encryption_reset": "آیا میخواهید تنظیمات رمزگُذاری به پیش فرض بازگردد؟",
"topline_expiring_certificate": "گواهینامه اِس اِس اِل شما در صدد انقضاء است. <0>تنظیمات رمزگُذاری</0> را بروز رسانی کنید.",
"topline_expired_certificate": "گواهینامه اِس اِس اِل شما منقضی شده است. <0>تنظیمات رمزگُذاری</0> را بروز رسانی کنید.",
"form_error_port_range": "مقدار پورت را در محدوده 80-65535 وارد کنید",
"form_error_port_unsafe": "این پورت غیر ایمن است",
"form_error_equal": "نباید برابر باشد",
"form_error_password": "رمزعبور تطبیق ندارد",
"reset_settings": "ریست تنظیمات",
"update_announcement": "AdGuard Home {{version}} در دسترس است! <0>اینجا کلیک</0> کنید برای اطلاعات بیشتر.",
"setup_guide": "راهنمای راه اندازی",
"dns_addresses": "آدرس های DNS",
"down": "کار نمی کند",
"fix": "تعمیر",
"dns_providers": "در اینجا یک <0>لیست از سرویس های ارائه دهنده DNS</0> برای انتخاب هست.",
"update_now": "حالا بروز رسانی",
"update_failed": "بروز رسانی خودکار موفق نشد. لطفا <a href='https://github.com/AdguardTeam/AdGuardHome/wiki/Getting-Started#update'>مراحل را دنبال کرده</a> تا بطور دستی بروز رسانی کنید.",
"processing_update": "منتظر بمانید،AdGuard Home در حال بروز رسانی است",
"clients_title": "کلاینت ها",
"clients_desc": "پیکربندی دستگاه های متصل شده به AdGuard Home",
"settings_global": "سراسری",
"settings_custom": "دستي",
"table_client": "کلاینت",
"table_name": "نام",
"save_btn": "ذخیره",
"client_add": "افزودن کلاینت",
"client_new": "کلاینت جدید",
"client_edit": "ویرایش کلاینت",
"client_identifier": "احراز با",
"ip_address": "آدرس آی پی",
"form_enter_ip": "آی پی را وارد کنید",
"form_enter_mac": "مَک را وارد کنید",
"form_client_name": "نام کلاینت را وارد کنید",
"client_global_settings": "استفاده از تنظیمات سراسری",
"client_deleted": "کلاینت \"{{key}}\" را با موفقیت حذف کرد",
"client_added": "کلاینت \"{{key}}\" را با موفقیت اضافه کرد",
"client_updated": "کلاینت \"{{key}}\" با موفقیت بروز رسانی شد",
"clients_not_found": "کلاینتی یافت نشد",
"client_confirm_delete": "آیا واقعا میخواهید \"{{key}}\" کلاینت را حذف کنید؟",
"filter_confirm_delete": "آیا واقعا میخواهید فیلتر را حذف کنید؟",
"auto_clients_title": "کلاینت ها (زمان اِجرا)",
"auto_clients_desc": "داده در کلاینت ها که از AdGuard Home استفاده می کند،اما در پیکربندی ذخیره نمی شود",
"access_title": "تنظیمات دسترسی",
"access_desc": "در اینجا میتوانید دستورات دسترسی را برای DNS سرور AdGuard Home وارد کنید.",
"access_allowed_title": "کلاینت های مجاز",
"access_allowed_desc": "یک لیست از CIDR یا آدرس های IP.اگر پیکربندی شود،AdGuard Home درخواست ها را فقط از این آدرس ها می پذیرد.",
"access_disallowed_title": "کلاینت های غیرمجاز",
"access_disallowed_desc": "یک لیست از CIDR یا آدرس های IP.اگر پیکربندی شود،AdGuard Home درخواست ها را از این آدرس های IP نمی پذیرد.",
"access_blocked_title": "دامنه های مسدود شده",
"access_blocked_desc": "این را با فیلتر ها به اشتباه نگیرید.AdGuard Home جستار DNS را با این دامنه ها در جستار سوال ها نمی پذیرد.",
"access_settings_saved": "تنظیمات دسترسی با موفقیت ذخیره شد",
"updates_checked": "بروز رسانی با موفقیت بررسی شد",
"updates_version_equal": "AdGuard Home بروز است",
"check_updates_now": "حالا بررسی برای بروز رسانی",
"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> .",
"setup_dns_privacy_3": "<0>لطفا توجه کنید که پروتکل های رمزگذاری شده DNS فقط در آندروئید 9 پشتیبانی می شود. پس برای سیستم عامل های دیگر نیاز است که برنامه دیگری نصب کنید.</0><0>در اینجا میتوانید لیست نرم افزارهای قابل استفاده را ببینید.</0>",
"setup_dns_privacy_android_1": "آندروئید 9 بطور پیش فرض از DNS-over-TLS پشتیبانی می کند. برای پیکربندی آن، بروید به تنظیمات → شبکه & اینترنت → پیشرفته → DNS خصوصی و نام دامنه را آنجا وارد کنید.",
"setup_dns_privacy_android_2": "<0>AdGuard for Android</0> پشتیبانی از <1>DNS-over-HTTPS</1> و <1>DNS-over-TLS</1>.",
"setup_dns_privacy_android_3": "<0>Intra</0> قابلیت <1>DNS-over-HTTPS</1> را به آندروئید اضافه می کند.",
"setup_dns_privacy_ios_1": "<0>DNSCloak</0> پشتیبانی از <1>DNS-over-HTTPS</1>, اما بمنظور پیکربندی آن برای استفاده بعنوان سرور خود،شما نیاز دارید که <2>DNS Stamp</2> برای آن تولید کنید.",
"setup_dns_privacy_ios_2": "<0>AdGuard for iOS</0> پشتیبانی از <1>DNS-over-HTTPS</1> و راه اندازی <1>DNS-over-TLS</1> .",
"setup_dns_privacy_other_title": "سایر راه کارها",
"setup_dns_privacy_other_1": "AdGuard Home خودش میتواند کلاینت DNS اَمن را در هر سیستم عاملی پیاده کند.",
"setup_dns_privacy_other_2": "<0>dnsproxy</0> از همه پروتکل های DNS شناخته شده پشتیبانی می کند.",
"setup_dns_privacy_other_3": "<0>dnscrypt-proxy</0> supportsپشتیبانی از <1>DNS-over-HTTPS</1>.",
"setup_dns_privacy_other_4": "<0>Mozilla Firefox</0> پشتیبانی از <1>DNS-over-HTTPS</1>.",
"setup_dns_privacy_other_5": "شما میتوانید راه کارهای بیشتر را در <0>اینجا</0> و <1>اینجا</1> پیدا کنید.",
"setup_dns_notice": "به منظور استفاده از <1>DNS-over-HTTPS</1> یا <1>DNS-over-TLS</1>، شما نیاز به <0>پیکربندی رمزگذاری</0> در تنظیمات AdGuard Home دارید.",
"rewrite_added": "بازنویسی DNS برای \"{{key}}\" با موفقیت اضافه شد",
"rewrite_deleted": "بازنویسی DNS برای \"{{key}}\" با موفقیت حذف شد",
"rewrite_add": "افزودن بازنویسی DNS",
"rewrite_not_found": "بازنویسی DNS یافت نشد",
"rewrite_confirm_delete": "آیا واقعا میخواهید بازنویسی DNS برای \"{{key}}\" را حذف کنید؟",
"rewrite_desc": "به آسانی اجازه پیکربندی پاسخ DNS دستی برای یک نام دامنه خاص را می دهد.",
"rewrite_applied": "دستور بازنویسی اِعمال شد",
"dns_rewrites": "بازنویسی های DNS",
"form_domain": "نام دامنه را وارد کنید",
"form_answer": "نام دامنه یا آدرس آی پی را وارد کنید",
"form_error_domain_format": "فرمت دامنه اشتباه است",
"form_error_answer_format": "فرمت پاسخ اشتباه است",
"configure": "پیکربندی",
"main_settings": "تنظیمات اصلی",
"block_services": "مسدودسازی سرویس های خاص",
"blocked_services": "سرویس های مسدود شده",
"blocked_services_desc": "مسدودسازی سریع سایت های عمومی و سرویس ها را اجازه می دهد.",
"blocked_services_saved": "سرویس های مسدود شده با موفقیت ذخیره شد",
"blocked_services_global": "از سرویس های مسدود شده سراسری استفاده کن",
"blocked_service": "سرویس مسدود شده",
"block_all": "مسدودسازی همه",
"unblock_all": "گشودن همه",
"encryption_certificate_path": "مسیر گواهینامه",
"encryption_private_key_path": "مسیر کلید خصوصی",
"encryption_certificates_source_path": "تنظیم مسیر فایل گواهینامه",
"encryption_certificates_source_content": "چسباندن محتوای گواهینامه",
"encryption_key_source_path": "تنظیم فایل کلید خصوصی",
"encryption_key_source_content": "چسباندن محتوای کلید خصوصی",
"stats_params": "پیکربندی آمار",
"config_successfully_saved": "پیکربندی با موفقیت ذخیره شد",
"interval_24_hour": "24 ساعت",
"interval_days": "{{value}} روز",
"interval_days_plural": "{{count}} روز",
"domain": "دامنه",
"answer": "پاسخ",
"filter_added_successfully": "فیلتر با موفقیت اضافه شد",
"statistics_retention": "مدت حفظ آمارها",
"statistics_retention_desc": "اگر مقدار فاصله را کاهش دهید،برخی داده ها از بین خواهد رفت",
"statistics_clear": " پاکسازی آمار",
"statistics_clear_confirm": "آیا واقعا میخواهید آمار را پاک کنید؟",
"statistics_cleared": "آمارها با موفقیت حذف شد"
}

View File

@@ -4,7 +4,6 @@
"upstream_parallel": "Utilisez des requêtes parallèles pour accélérer la résolution en requêtant simultanément tous les serveurs upstream",
"bootstrap_dns": "Serveurs DNS d'amorçage",
"bootstrap_dns_desc": "Les serveurs DNS d'amorçage sont utilisés pour résoudre les adresses IP des résolveurs DoH/DoT que vous spécifiez comme upstream.",
"url_added_successfully": "Url ajoutée",
"check_dhcp_servers": "Rechercher les serveurs DHCP",
"save_config": "Sauvegarder la configuration",
"enabled_dhcp": "Serveur DHCP activé",
@@ -17,9 +16,7 @@
"dhcp_found": "Il y a plusieurs serveurs DHCP actifs sur le réseau. Ce n'est pas prudent d'activer le serveur DHCP intégré en ce moment.",
"dhcp_leases": "Locations des serveurs DHCP",
"dhcp_leases_not_found": "Aucune location des serveurs DHCP trouvée",
"dhcp_config_saved": "La configuration du serveur DHCP est sauvegardée",
"form_error_required": "Champ requis",
"form_error_ip_format": "Format IPv4 invalide",
"form_error_positive": "Doit être supérieur à 0",
"dhcp_form_gateway_input": "IP de la passerelle",
"dhcp_form_subnet_input": "Masque de sous-réseau",
@@ -50,7 +47,6 @@
"disabled_protection": "Protection désactivée",
"refresh_statics": "Renouveler les statistiques",
"dns_query": "Requêtes DNS",
"blocked_by": "Bloqué par Filtres",
"stats_malware_phishing": "Tentative de malware/hammeçonnage bloquée",
"stats_adult": "Sites à contenu adulte bloqués",
"stats_query_domain": "Domaines les plus recherchés",
@@ -61,7 +57,6 @@
"top_clients": "Meilleurs clients",
"no_clients_found": "Pas de clients trouvés",
"general_statistics": "Statistiques générales",
"number_of_dns_query_24_hours": "Un nombre de requêtes DNS quieries traitées pendant les 24 heures dernières",
"number_of_dns_query_blocked_24_hours": "Un nombre de requêtes DNS bloquées par les filtres adblock et les listes de blocage des hosts",
"number_of_dns_query_blocked_24_hours_by_sec": "Un nombre de requêtes DNS bloquées par le module Sécurité de navigation d'AdGuard",
"number_of_dns_query_blocked_24_hours_adult": "Un nombre de sites à contenu adulte bloqués",
@@ -76,12 +71,9 @@
"use_adguard_parental": "Utiliser le contrôle parental d'AdGuard",
"use_adguard_parental_hint": "AdGuard Home va vérifier s'il y a du contenu pour adultes sur le domaine. Ce sera fait par aide du même API discret que celui utilisé par le service de Sécurité de navigation.",
"enforce_safe_search": "Renforcer la recherche sécurisée",
"enforce_save_search_hint": "AdGuard Home peut renforcer la Recherche sécurisée dans les moteurs de recherche suivants : Google, Youtube, Bing et Yandex.",
"no_servers_specified": "Pas de serveurs spécifiés",
"no_settings": "Pas de paramètres",
"general_settings": "Paramètres généraux",
"upstream_dns": "Serveurs DNS upstream",
"upstream_dns_hint": "Si vous laissez ce champ vide, AdGuard Home va utiliser <a href='https://1.1.1.1/' target='_blank'>Cloudflare DNS</a> somme upstream. Utilisez le préfixe tls:// pour DNS via les serveurs TLS .",
"test_upstream_btn": "Tester les upstreams",
"apply_btn": "Appliquer",
"disabled_filtering_toast": "Filtrage désactivé",
@@ -117,7 +109,6 @@
"example_comment": "! Voici comment ajouter une déscription",
"example_comment_meaning": "commentaire",
"example_comment_hash": "# Et comme ça aussi on peut laisser des commentaires",
"example_regex_meaning": "block access to the domains matching the specified regular expression",
"example_upstream_regular": "DNS classique (au-dessus de UDP)",
"example_upstream_dot": "<a href='https://en.wikipedia.org/wiki/DNS_over_TLS' target='_blank'>DNS-au-dessus-de-TLS</a> chiffré",
"example_upstream_doh": "<a href='https://en.wikipedia.org/wiki/DNS_over_HTTPS' target='_blank'>DNS-au-dessus-de-HTTPS</a> chiffré",
@@ -125,7 +116,7 @@
"example_upstream_tcp": "DNS classique (au-dessus de TCP)",
"all_filters_up_to_date_toast": "Tous les filtres sont mis à jour",
"updated_upstream_dns_toast": "Les serveurs DNS upstream sont mis à jour",
"dns_test_ok_toast": "Les serveurs DNS spécifiés fonctionnent de manière incorrecte",
"dns_test_ok_toast": "Les serveurs DNS spécifiés fonctionnent de manière correcte",
"dns_test_not_ok_toast": "Impossible d'utiliser le serveur \"{{key}}\": veuillez vérifier si le nom saisi est bien correct",
"unblock_btn": "Débloquer",
"block_btn": "Bloquer",
@@ -136,11 +127,7 @@
"show_all_filter_type": "Montrer tout",
"show_filtered_type": "Montrer les sites filtrés",
"no_logs_found": "Aucun journal trouvé",
"disabled_log_btn": "Désactiver le journal",
"download_log_file_btn": "Télécharger le fichier de journal",
"refresh_btn": "Actualiser",
"enabled_log_btn": "Activer le journal",
"last_dns_queries": "5000 dernières requêtes DNS",
"previous_btn": "Précédent",
"next_btn": "Suivant",
"loading_table_status": "Chargement en cours ...",
@@ -149,8 +136,6 @@
"updated_custom_filtering_toast": "Règles de filtrage d'utilisateur mises à jour",
"rule_removed_from_custom_filtering_toast": "Règle retirée des règles d'utilisateur",
"rule_added_to_custom_filtering_toast": "Règle ajoutée aux règles d'utilisateur",
"query_log_disabled_toast": "Journal de requêtes désactivé",
"query_log_enabled_toast": "Journal de requêtes activé",
"found_in_known_domain_db": "Trouvé dans la base de données des domaines connus",
"category_label": "Catégorie",
"rule_label": "Règle",
@@ -169,5 +154,6 @@
"install_devices_windows_list_2": "Allez dans la catégorie Réseau et Internet et ensuite dans le Centre Réseau et Partage.",
"install_devices_windows_list_3": "Sur la partie gauche de l'écran, recherchez Modifier les paramètres de la carte et cliquez dessus.",
"install_devices_windows_list_4": "Sélectionnez votre connexion active, clic droit dessus et sélectionnez Propriétés.",
"install_devices_windows_list_5": "Recherchez la version du protocole Internet 4 (TCP/IP) dans la liste, sélectionnez-la puis cliquez à nouveau sur Propriétés."
}
"install_devices_windows_list_5": "Recherchez la version du protocole Internet 4 (TCP/IP) dans la liste, sélectionnez-la puis cliquez à nouveau sur Propriétés.",
"updates_version_equal": "AdGuard Home est à jour"
}

View File

@@ -0,0 +1,413 @@
{
"client_settings": "Postavke klijenta",
"example_upstream_reserved": "možete odrediti DNS upstream-ove <0>za određene domene</0>",
"upstream_parallel": "Koristi paralelne upite kako bi ubrzali rješavanje istovremenim ispitavanjem svih udaljenih poslužitelja",
"bootstrap_dns": "Bootstrap DNS poslužitelji",
"bootstrap_dns_desc": "Bootstrap DNS poslužitelji koriste se za rezolvanje IP adresa DoH/DoT rezolvera koje navedete kao upstreams.",
"check_dhcp_servers": "Provjera DHCP poslužitelja",
"save_config": "Spremi konfiguraciju",
"enabled_dhcp": "DHCP poslužitelj je omogućen",
"disabled_dhcp": "DHCP poslužitelj je onemogućen",
"dhcp_title": "DHCP poslužitelj (eksperimentalno!)",
"dhcp_description": "Ukoliko vaš router ne pruža DHCP postavke, možete koristiti AdGuardov ugrađeni DHCP poslužitelj.",
"dhcp_enable": "Omogući DHCP poslužitelj",
"dhcp_disable": "Onemogući DHCP poslužitelj",
"dhcp_not_found": "Sigurno je omogućiti ugrađeni DHCP poslužitelj - nismo pronašli aktivne DHCP poslužitelje na mreži. Međutim, preporučujemo vam da ponovo provjerite ručno, jer naš automatski test trenutno ne daje 100% jamstvo.",
"dhcp_found": "Aktivni DHCP poslužitelj je pronađen na mreži. Nije sigurno omogućiti ugrađeni DHCP poslužitelj.",
"dhcp_leases": "DHCP leases",
"dhcp_static_leases": "DHCP static leases",
"dhcp_leases_not_found": "Nisu pronađeni DHCP leases",
"dhcp_config_saved": "Postavke DHCP poslužitelja su uspješno spremljene",
"form_error_required": "Obavezno polje",
"form_error_ip4_format": "Nevažeći IPv4 format",
"form_error_ip6_format": "Nevažeći IPv6 format",
"form_error_ip_format": "Nevažeći format IP adrese",
"form_error_mac_format": "Nevažeći MAC format",
"form_error_positive": "Mora biti veće od 0",
"dhcp_form_gateway_input": "Gateway IP",
"dhcp_form_subnet_input": "Subnet maskiranje",
"dhcp_form_range_title": "Raspon IP adresa",
"dhcp_form_range_start": "Početak raspona",
"dhcp_form_range_end": "Kraj raspona",
"dhcp_form_lease_title": "DHCP lease vrijeme (u sekundama)",
"dhcp_form_lease_input": "Lease trajanje",
"dhcp_interface_select": "Odaberite DHCP sučelje",
"dhcp_hardware_address": "Adresa hardvera",
"dhcp_ip_addresses": "IP adrese",
"dhcp_table_hostname": "Naziv računala",
"dhcp_table_expires": "Istječe",
"dhcp_warning": "Ako svejedno želite omogućiti DHCP poslužitelj, provjerite da nema drugog aktivnog DHCP poslužitelja na vašoj mreži. Inače može pokvariti Internet za ostale povezane uređaje!",
"dhcp_error": "Nismo mogli utvrditi postoji li drugi DHCP poslužitelj na mreži.",
"dhcp_static_ip_error": "Za korištenje DHCP poslužitelja mora se postaviti statička IP adresa. Nismo uspjeli utvrditi je li to mrežno sučelje postavljeno pomoću statičke IP adrese. Ručno postavite statičku IP adresu.",
"dhcp_dynamic_ip_found": "Vaš sustav koristi postavke dinamičkueIP 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>. Ovu ćemo IP adresu automatski postaviti kao statičku ako pritisnete Omogući DHCP dugme.",
"dhcp_lease_added": "Statični lease \"{{key}}\" je uspješno dodan",
"dhcp_lease_deleted": "Statični lease \"{{key}}\" je uspješno uklonjen",
"dhcp_new_static_lease": "Novi static lease",
"dhcp_static_leases_not_found": "Nisu pronađeni statični DHCP leases",
"dhcp_add_static_lease": "Dodaj static lease",
"dhcp_reset": "Jeste li sigurni da želite poništiti DHCP postavke?",
"delete_confirm": "Jeste li sigurni da želite ukloniti \"{{key}}\"?",
"form_enter_hostname": "Unesite naziv računala",
"error_details": "Detalji o pogrešci",
"back": "Natrag",
"dashboard": "Upravljačka ploča",
"settings": "Postavke",
"filters": "Filtri",
"query_log": "Zapisnik upita",
"faq": "ČPP",
"version": "Verzija",
"address": "adresa",
"on": "UKLJUČENO",
"off": "ISKLJUČENO",
"copyright": "Autorsko pravo",
"homepage": "Početna stranica",
"report_an_issue": "Prijavite problem",
"privacy_policy": "Politika privatnosti",
"enable_protection": "Omogući zaštitu",
"enabled_protection": "Omogućena zaštita",
"disable_protection": "Onemogućena zaštita",
"disabled_protection": "Onemogućena zaštita",
"refresh_statics": "Osvježi statistiku",
"dns_query": "DNS Upiti",
"blocked_by": "<0>Blokirano filtrima</0>",
"stats_malware_phishing": "Blokiran zločudni softver/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_days": "zadnjih {{count}} dana",
"for_last_days_plural": "zadnjih {{count}} dana",
"no_domains_found": "Nije pronađena domena",
"requests_count": "Broj zahtjeva",
"top_blocked_domains": "Top blokirane domene",
"top_clients": "Top klijenti",
"no_clients_found": "Nema pronađenih klijenata",
"general_statistics": "Opća statistika",
"number_of_dns_query_days": "Broj DNS upita obrađenih u posljednja {{count}} dana",
"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_blocked_24_hours": "Broj DNS zahtjeva koji su blokirani od strane filtara za blokiranje oglasa i lista neželjenih poslužitelja",
"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",
"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 href='#filters'>filtara</a>.",
"use_adguard_browsing_sec": "Koristi AdGuard uslugu zaštite pregledavanja",
"use_adguard_browsing_sec_hint": "AdGuard Home će provjeriti nalazi li se domena na popisu neželjenih domena od usluge zaštite pregledavanja. Za provjeru će se koristiti API za provjeru koji poštuje vašu privatnost. Samo mali dio SHA256 hash-a odnaziva domene se šalje poslužitelju.",
"use_adguard_parental": "Koristi web uslugu AdGuard roditeljske zaštite",
"use_adguard_parental_hint": "AdGuard Home provjeriti će sadrži li domena sadržaj za odrasle. Koristi isti API za zaštitu privatnosti kao i naša usluga zaštite pregledavanja.",
"enforce_safe_search": "Omogući sigurno pretraživanje",
"enforce_save_search_hint": "AdGuard Home može nametnuti sigurno pretraživanje na sljedećim tražilicama: Google, Youtube, Bing, DuckDuckGo i Yandex.",
"no_servers_specified": "Nije odabran nijedan poslužitelj",
"general_settings": "Opće postavke",
"dns_settings": "DNS postavke",
"encryption_settings": "Postavke šifriranja",
"dhcp_settings": "DHCP postavke",
"upstream_dns": "Upstream DNS poslužitelji",
"upstream_dns_hint": "Ako se ovo polje ostavi prazno, AdGuard Home će koristiti <a href='https://www.quad9.net/' target='_blank'>Quad9</a> kao upstream.",
"test_upstream_btn": "Testiraj upstream-ove",
"upstreams": "Upstreams",
"apply_btn": "Primijeni",
"disabled_filtering_toast": "Onemogućeno filtriranje",
"enabled_filtering_toast": "Omogućeno filtriranje",
"disabled_safe_browsing_toast": "Onemogućeno sigurno pretraživanje",
"enabled_safe_browsing_toast": "Omogućeno sigurno pretraživanje",
"disabled_parental_toast": "Onemogućen roditeljski nadzor",
"enabled_parental_toast": "Omogućen roditeljski nadzor",
"disabled_safe_search_toast": "Onemogućeno sigurno pretraživanje",
"enabled_save_search_toast": "Omogućeno sigurno pretraživanje",
"enabled_table_header": "Omogućeno",
"name_table_header": "Naziv",
"filter_url_table_header": "URL filtra",
"rules_count_table_header": "Broj pravila",
"last_time_updated_table_header": "Zadnje ažurirano",
"actions_table_header": "Radnje",
"edit_table_action": "Uredi",
"delete_table_action": "Ukloni",
"filters_and_hosts": "Filtri i lista neželjenih poslužitelja",
"filters_and_hosts_hint": "AdGuard Home razumije osnovna pravila blokiranja oglasa i sintaksu hosts datoteka.",
"no_filters_added": "Nema dodanih filtara",
"add_filter_btn": "Dodaj filtar",
"cancel_btn": "Poništi",
"enter_name_hint": "Unesite naziv",
"enter_url_hint": "Unesite URL",
"check_updates_btn": "Provjeri ažuriranja",
"new_filter_btn": "Pretplata na novi filtar",
"enter_valid_filter_url": "Unesite valjani URL za pretplatu filtra ili za hosts datoteku.",
"custom_filter_rules": "Prilagođena pravila filtriranja",
"custom_filter_rules_hint": "Unesite jedno pravilo po liniji. Možete koristiti sintaksu za pravila blokiranja oglasa ili za hosts datoteke.",
"examples_title": "Primjeri",
"example_meaning_filter_block": "blokira pristup domeni example.org kao i svim njenim poddomenama",
"example_meaning_filter_whitelist": "odblokira pristup domeni example.org kao i svim njenim poddomenama",
"example_meaning_host_block": "AdGuard Home će sada vratiti 127.0.0.1 adresu na example.org domenu (ali ne i poddomene).",
"example_comment": "! Ovdje ide komentar",
"example_comment_meaning": "samo komentar",
"example_comment_hash": "# Također komentar",
"example_regex_meaning": "blokira pristup domenama koje se podudaraju s regularnim izrazom",
"example_upstream_regular": "zadani DNS (putem UDP)",
"example_upstream_dot": "šifrirano <0>DNS-over-TLS</0>",
"example_upstream_doh": "šifrirano <0>DNS-over-HTTPS</0>",
"example_upstream_sdns": "možete koristiti <0>DNS Stamps</0> za <1>DNSCrypt</1> ili <2>DNS-over-HTTPS</2> rezolvere",
"example_upstream_tcp": "zadani DNS (putem TCP)",
"all_filters_up_to_date_toast": "Svi filtri su ažurirani",
"updated_upstream_dns_toast": "Ažurirani su upstream DNS poslužitelji",
"dns_test_ok_toast": "Odabrani DNS poslužitelji su trenutno aktivni",
"dns_test_not_ok_toast": "\"{{key}}\" poslužitelja: ne može se upotrijebiti, provjerite jeste li to ispravno napisali",
"unblock_btn": "Odblokiraj",
"block_btn": "Blokiraj",
"time_table_header": "Vrijeme",
"domain_name_table_header": "Naziv domene",
"type_table_header": "Vrsta",
"response_table_header": "Odgovor",
"client_table_header": "Klijent",
"empty_response_status": "Prazno",
"show_all_filter_type": "Prikaži sve",
"show_filtered_type": "Prikaži filtrirano",
"no_logs_found": "Nema zapisa",
"refresh_btn": "Osvježi",
"previous_btn": "Prethodno",
"next_btn": "Sljedeće",
"loading_table_status": "Učitavanje...",
"page_table_footer_text": "Stranica",
"of_table_footer_text": "od",
"rows_table_footer_text": "redova",
"updated_custom_filtering_toast": "Ažurirana su prilagođena pravila filtriranja",
"rule_removed_from_custom_filtering_toast": "Pravilo je uklonjeno iz prilagođenih pravila filtriranja",
"rule_added_to_custom_filtering_toast": "Pravilo je dodano u prilagođena pravila filtriranja",
"query_log_response_status": "Status: {{value}}",
"query_log_filtered": "Filtrirao {{filter}}",
"query_log_confirm_clear": "Jeste li sigurni da želite ukloniti zapise upita?",
"query_log_cleared": "Zapisnik upita je uspješno uklonjen",
"query_log_clear": "Očisti zapisnik upita",
"query_log_retention": "Spremanje zapisnika upita",
"query_log_enable": "Omogući zapise",
"query_log_configuration": "Postavke zapisa",
"query_log_disabled": "Zapisnik upita je onemogućen i može se postaviti u <0>postavkama</0>",
"query_log_strict_search": "Koristite dvostruke navodnike za strogo pretraživanje",
"query_log_retention_confirm": "Jeste li sigurni da želite promijeniti zadržavanje zapisnika upita? Ako smanjite vrijednost intervala, neki će podaci biti izgubljeni",
"source_label": "Izvor",
"found_in_known_domain_db": "Pronađeno u bazi poznatih domena.",
"category_label": "Kategorija",
"rule_label": "Pravilo",
"filter_label": "Filtar",
"unknown_filter": "Nepoznati filtar {{filterId}}",
"install_welcome_title": "Dobrodošli u AdGuard Home!",
"install_welcome_desc": "AdGuard Home je DNS poslužitelj za blokiranje oglasa i pratitelja na cijeloj mreži. Njegova je svrha omogućiti vam upravljanje cijelom mrežom i svim svojim uređajima, a da to ne zahtijeva korištenje programa na strani klijenta.",
"install_settings_title": "Administratorsko web sučelje",
"install_settings_listen": "Osluškuj sučelje",
"install_settings_port": "Port",
"install_settings_interface_link": "Web administratorsko sučelje AdGuard Home-a će biti dostupno na sljedećim adresama:",
"form_error_port": "Unesite važeću vrijednost za port",
"install_settings_dns": "DNS poslužitelj",
"install_settings_dns_desc": "Potrebno je postaviti uređaj ili router da koristi DNS poslužitelj na sljedećim adresama:",
"install_settings_all_interfaces": "Sva sučelja",
"install_auth_title": "Autentikacija",
"install_auth_desc": "Izrazito se preporučuje postavljanje autentikacije za web administratorsko sučelje AdGuard Home. Iako je dostupna samo u vašoj lokalnoj mreži, važno je zaštititi je od ne dozvoljenog pristupa.",
"install_auth_username": "Korisničko ime",
"install_auth_password": "Lozinka",
"install_auth_confirm": "Potvrdi lozinku",
"install_auth_username_enter": "Unesite korisničko ime",
"install_auth_password_enter": "Unesite lozinku",
"install_step": "Korak",
"install_devices_title": "Postavite vaše uređaje",
"install_devices_desc": "Da biste započeli koristiti AdGuard Home, morate postaviti uređaje da ga koriste.",
"install_submit_title": "Čestitamo!",
"install_submit_desc": "Postavljanje je dovršeno i spremni ste koristiti AdGuard Home.",
"install_devices_router": "Usmjerivač (Router)",
"install_devices_router_desc": "Ovo postavljanje će automatski pokriti sve uređaje povezane na vaš kućni router i nećete trebati ručno postavljati svaki od njih.",
"install_devices_address": "AdGuard Home DNS poslužitelj osluškuje sljedeće adrese",
"install_devices_router_list_1": "Otvorite postavke za router. Obično mu možete pristupiti iz preglednika putem URL-a (kao što je http://192.168.0.1/ ili http://192.168.1.1/). Od vas će se možda tražiti da unesete lozinku. Ako je se ne sjećate, lozinku možete često poništiti pritiskom na dumge na samom routeru. Neki routeri trebaju određenu aplikaciju, koja bi u tom slučaju trebala biti već instalirana na vašem računalu/telefonu.",
"install_devices_router_list_2": "Pronađite DHCP/DNS postavke. Potražite DNS slova pored polja koje dopušta dva ili tri skupa brojeva, svaki razdvojen u četiri skupine od jedne do tri znamenke.",
"install_devices_router_list_3": "Unesite adresu AdGuard Home poslužitelja ovdje.",
"install_devices_windows_list_1": "Otvorite Upravljačku ploču putem Start izbornika ili Windows pretrage.",
"install_devices_windows_list_2": "Idite na kategoriju Mreža i Internet i odaberite Centar za mreže i zajedničko korištenje.",
"install_devices_windows_list_3": "Na lijevoj strani zaslona pronađite Promjeni postavke adaptera i pritisnite na to.",
"install_devices_windows_list_4": "Odaberite aktivnu vezu, pritisnite desni klik na nju i odaberite Svojstva.",
"install_devices_windows_list_5": "Pronađite Internet Protocol Version 4 (TCP/IP) na listi, odaberite ga i zatim pritisnite opet Postavke.",
"install_devices_windows_list_6": "Odaberite Koristi sljedeće DNS adrese poslužitelja i unesite vaše adrese od AdGuard Home poslužitelja.",
"install_devices_macos_list_1": "Pritisnite na Apple ikonu i idite u Postavke sustava.",
"install_devices_macos_list_2": "Pritisnite na Mreža.",
"install_devices_macos_list_3": "Odaberite prvu vezu s vašeg popisa i pritisnite Napredno.",
"install_devices_macos_list_4": "Odaberite DNS karticu i unesite adrese svog AdGuard Home poslužitelja.",
"install_devices_android_list_1": "Na početnom zaslonu Androida, odaberite Postavke.",
"install_devices_android_list_2": "Pritisnite Wi-Fi u izborniku. Prikazat će se zaslon s popisom svih dostupnih mreža (nemoguće je postaviti prilagođeni DNS za mobilnu vezu).",
"install_devices_android_list_3": "Dugo pritisnite na mrežu na koju ste povezani i odaberite Uredi mrežu.",
"install_devices_android_list_4": "Na nekim će uređajima možda trebati označiti Napredno za prikaz dodatnih postavki. Da biste prilagodili postavke Android DNS-a, morati će te prebaciti IP postavke s DHCP-a na Statičke.",
"install_devices_android_list_5": "Promijenite DNS 1 i DNS 2 vrijednosti u one adrese AdGuard Home poslužitelja.",
"install_devices_ios_list_1": "Na početnom zaslonu odaberite Postavke.",
"install_devices_ios_list_2": "Odaberite Wi-Fi u lijevom izborniku (ne moguće je postaviti DNS za mobilne mreže).",
"install_devices_ios_list_3": "Pritisnite na naziv vaše trenutne mreže.",
"install_devices_ios_list_4": "U DNS polje unesite adrese svog AdGuard Home poslužitelja.",
"get_started": "Započni",
"next": "Sljedeće",
"open_dashboard": "Otvori upravljačku ploču",
"install_saved": "Uspješno spremljeno",
"encryption_title": "Šifriranje",
"encryption_desc": "Podrška šifriranja (HTTPS/TLS) za DNS i administratorsko web sučelje",
"encryption_config_saved": "Spremljene postavke šifriranja",
"encryption_server": "Naziv poslužitelja",
"encryption_server_enter": "Unesite naziv domene",
"encryption_server_desc": "Kako biste koristili HTTPS, morate unijeti naziv poslužitelja koji odgovara vašem SSL certifikatu.",
"encryption_redirect": "Automatski preusmjeri na HTTPS",
"encryption_redirect_desc": "Ako je omogućeno, AdGuard Home će vas automatski preusmjeravati s HTTP na HTTPS adrese.",
"encryption_https": "HTTPS port",
"encryption_https_desc": "Ako je HTTPS port postavljen, AdGuard Home administracijsko sučelje biti će dostupno putem HTTPS-a, a također će pružiti DNS-over-HTTPS na '/dns-query' lokaciji.",
"encryption_dot": "DNS-over-TLS port",
"encryption_dot_desc": "Ako je ovaj port postavljen, AdGuard Home će pokrenuti DNS-over-TLS poslužitelj na ovom portu.",
"encryption_certificates": "Certifikati",
"encryption_certificates_desc": "Da biste koristili šifriranje, za svoju domenu morate osigurati važeći lanac SSL certifikata. Besplatan certifikat možete dobiti na <0>{{link}}</0> ili ga možete kupiti od jednog od pouzdanih izdavatelja certifikata.",
"encryption_certificates_input": "Zalijepite svoje PEM-kodirane certifikate ovdje.",
"encryption_status": "Status",
"encryption_expire": "Istječe",
"encryption_key": "Privatni ključ",
"encryption_key_input": "Zalijepite svoj PEM-kodiran privatni ključ certifikata ovdje.",
"encryption_enable": "Omogući šifriranje (HTTPS, DNS-over-HTTPS i DNS-over-TLS)",
"encryption_enable_desc": "Ako je šifriranje omogućeno, administratorsko sučelje AdGuard Home će raditi preko HTTPS-a, a DNS poslužitelj će osluškivati zahtjeve preko DNS-over-HTTPS i DNS-over-TLS.",
"encryption_chain_valid": "Lanac certifikata je valjan",
"encryption_chain_invalid": "Lanac certifikata nije valjan",
"encryption_key_valid": "Ovo je valjani {{type}} privatni ključ",
"encryption_key_invalid": "Ovo je nevažeći {{type}} privatni ključ",
"encryption_subject": "Predmet",
"encryption_issuer": "Izdavač",
"encryption_hostnames": "Nazivi računala",
"encryption_reset": "Jeste li sigurni da želite poništiti postavke šifriranja?",
"topline_expiring_certificate": "Vaš SSL certifikat uskoro ističe. Ažurirajte <0>Postavke šifriranja</0>.",
"topline_expired_certificate": "Vaš SSL certifikat je istekao. Ažurirajte <0>Postavke šifriranja</0>.",
"form_error_port_range": "Unesite vrijednost porta od 80 do 65536",
"form_error_port_unsafe": "Ovo je nesigurna port",
"form_error_equal": "Ne bi trebalo biti jednako",
"form_error_password": "Lozinka se ne podudara",
"reset_settings": "Poništi postavke",
"update_announcement": "AdGuard Home {{version}} je dostupan! <0>Pritisnite ovdje</0> za više informacija.",
"setup_guide": "Vodič za postavljanje",
"dns_addresses": "DNS adrese",
"dns_start": "Pokreće se DNS poslužitelj",
"dns_status_error": "Pogreška pri dohvatu statusa DNS poslužitelja",
"down": "Ne radi",
"fix": "Popravi",
"dns_providers": "Ovo je <0>popis poznatih DNS poslužitelja</0> za izbor.",
"update_now": "Ažuriraj sada",
"update_failed": "Ne uspješno automatsko ažuriranje. Molimo, <a href='https://github.com/AdguardTeam/AdGuardHome/wiki/Getting-Started#update'>pratite ove korake</a> za ručno ažuriranje.",
"processing_update": "Molimo pričekajte, AdGuard Home se ažurira",
"clients_title": "Klijenti",
"clients_desc": "Postavite uređaje povezane na AdGuard Home",
"settings_global": "Globalno",
"settings_custom": "Prilagođeno",
"table_client": "Klijent",
"table_name": "Naziv",
"save_btn": "Spremi",
"client_add": "Dodaj klijenta",
"client_new": "Novi klijent",
"client_edit": "Uredi klijenta",
"client_identifier": "Identifikator",
"ip_address": "IP adresa",
"client_identifier_desc": "Klijenti se mogu prepoznati po IP adresi, CIDR-u ili MAC adresi. Imajte na umu da je upotreba MAC-a kao identifikatora, moguća samo ako je AdGuard Home također <0>DHCP poslužitelj</0>",
"form_enter_ip": "Unesite IP adresu",
"form_enter_mac": "Unesite MAC adresu",
"form_enter_id": "Unesi identifikator",
"form_add_id": "Dodaj identifikator",
"form_client_name": "Unesite naziv klijenta",
"client_global_settings": "Koristi globalne postavke",
"client_deleted": "Klijent \"{{key}}\" je uspješno uklonjen",
"client_added": "Klijent \"{{key}}\" je uspješno dodan",
"client_updated": "Klijent \"{{key}}\" je uspješno ažuriran",
"clients_not_found": "Nema pronađenih klijenata",
"client_confirm_delete": "Jeste li sigurni da želite ukloniti \"{{key}}\" klijenta?",
"filter_confirm_delete": "Jeste li sigurni da želite ukloniti ovaj filtar?",
"auto_clients_title": "Klijenti (runtime)",
"auto_clients_desc": "Podaci na klijentu koji koriste AdGuard Home, ali se ne spremaju u postavke",
"access_title": "Postavke pristupa",
"access_desc": "Postavite pravila pristupa za AdGuard Home DNS poslužitelj.",
"access_allowed_title": "Dopušteni klijenti",
"access_allowed_desc": "Popis CIDR-a ili IP adresa. Ukoliko je postavljeno, AdGuard Home će prihvatiti samo zahtjeve s ovih IP adresa.",
"access_disallowed_title": "Nedopušteni klijenti",
"access_disallowed_desc": "Popis CIDR-a ili IP adresa. Ukoliko je postavljeno, AdGuard Home će zaustaviti zahtjeve s ovih IP adresa.",
"access_blocked_title": "Blokirane domene",
"access_blocked_desc": "Ne miješajte ovo s filtrima. AdGuard Home će zaustaviti DNS upite s tim ovim domenama u podnesenim upitima.",
"access_settings_saved": "Postavke pristupa su uspješno spremljene",
"updates_checked": "Uspješna provjera ažuriranja",
"updates_version_equal": "AdGuard Home je ažuriran",
"check_updates_now": "Provjeri ažuriranja sada",
"dns_privacy": "DNS privatnost",
"setup_dns_privacy_1": "<0>DNS-over-TLS:</0> Koristite <1>{{address}}</1>.",
"setup_dns_privacy_2": "<0>DNS-over-HTTPS:</0> Koristite <1>{{address}}</1>.",
"setup_dns_privacy_3": "<0>Imajte na umu da su šifrirani DNS protokoli podržani samo na Androidu 9. Stoga morate instalirati dodatni softver za ostale operativne sustave.</0><0>Evo popisa softvera koji možete koristiti.</0>",
"setup_dns_privacy_android_1": "Android 9 nativno podržava DNS-over-TLS. Da biste ga postavili, idite na Postavke → Mreža i internet → Napredno → Privatni DNS i tamo unesite svoje naziv domene.",
"setup_dns_privacy_android_2": "<0>AdGuard za Android</0> podržava <1>DNS-over-HTTPS</1> i <1>DNS-over-TLS</1>.",
"setup_dns_privacy_android_3": "<0>Intra</0> dodaje <1>DNS-over-HTTPS</1> podršku za Android.",
"setup_dns_privacy_ios_1": "<0>DNSCloak</0> podržava <1>DNS-over-HTTPS</1>, ali da biste ga postavili za upotrebu vašeg vlastitog poslužitelja, trebati će te generirati <2>DNS Stamp</2> za njega.",
"setup_dns_privacy_ios_2": "<0>AdGuard za iOS</0> podržava <1>DNS-over-HTTPS</1> i <1>DNS-over-TLS</1>.",
"setup_dns_privacy_other_title": "Ostale implementacije",
"setup_dns_privacy_other_1": "AdGuard Home može poslužiti kao sigurni DNS klijent na svim platformama.",
"setup_dns_privacy_other_2": "<0>dnsproxy</0> podržava sve poznate sigurne DNS protokole.",
"setup_dns_privacy_other_3": "<0>dnscrypt-proxy</0> podržava <1>DNS-over-HTTPS</1>.",
"setup_dns_privacy_other_4": "<0>Mozilla Firefox</0> podržava <1>DNS-over-HTTPS</1>.",
"setup_dns_privacy_other_5": "Možete pronaći više implementacija <0>ovdje</0> i <1>ovdje</1>.",
"setup_dns_notice": "Da biste koristili <1>DNS-over-HTTPS</1> ili <1>DNS-over-TLS</1>, morate <0>postaviti šifriranje</0> u AdGuard Home postavkama.",
"rewrite_added": "DNS prijepis za \"{{key}}\" je uspješno dodan",
"rewrite_deleted": "DNS prijepis za \"{{key}}\" je uspješno uklonjen",
"rewrite_add": "Dodaj DNS prijepis",
"rewrite_not_found": "Nema DNS prijepisa",
"rewrite_confirm_delete": "Jeste li sigurni da želite ukloniti DNS prijepis za \"{{key}}\" klijenta?",
"rewrite_desc": "Omogućuje jednostavno postavljanje prilagođenog DNS odgovora za određenu domenu.",
"rewrite_applied": "Primijenjena pravila prijepisa",
"dns_rewrites": "DNS prijepisi",
"form_domain": "Unesite domenu",
"form_answer": "Unesite IP adresu ili naziv domene",
"form_error_domain_format": "Nevažeći format domene",
"form_error_answer_format": "Nevažeći format odgovora",
"configure": "Konfiguriraj",
"main_settings": "Opće postavke",
"block_services": "Blokiraj specifične usluge",
"blocked_services": "Blokirane usluge",
"blocked_services_desc": "Omogućuje brzo blokiranje popularnih stranica i usluga.",
"blocked_services_saved": "Blokirane usluge su uspješno spremljene",
"blocked_services_global": "Koristi globalno blokirane usluge",
"blocked_service": "Blokirane usluge",
"block_all": "Blokiraj sve",
"unblock_all": "Odblokiraj sve",
"encryption_certificate_path": "Putanja certifikata",
"encryption_private_key_path": "Putanja privatnog ključa",
"encryption_certificates_source_path": "Dodajte datoteku certifikata",
"encryption_certificates_source_content": "Zalijepi sadržaj certifikata",
"encryption_key_source_path": "Dodajte datoteku privatnog ključa",
"encryption_key_source_content": "Zalijepi sadržaj privatnog ključa",
"stats_params": "Postavke statistike",
"config_successfully_saved": "Postavke su uspješno spremljene",
"interval_24_hour": "24 sata",
"interval_days": "{{count}} dan",
"interval_days_plural": "{{count}} dana",
"domain": "Domena",
"answer": "Odgovor",
"filter_added_successfully": "Filtar je uspješno dodan",
"statistics_configuration": "Postavke statistike",
"statistics_retention": "Spremanje statistike",
"statistics_retention_desc": "Ako smanjite vrijednost intervala, neki će podaci biti izgubljeni",
"statistics_clear": " Poništi statistiku",
"statistics_clear_confirm": "Jeste li sigurni da želite poništiti statistiku?",
"statistics_retention_confirm": "Jeste li sigurni da želite promijeniti zadržavanje statistike? Ako smanjite vrijednost intervala, neki će podaci biti izgubljeni",
"statistics_cleared": "Statistika je uspješno uklonjenja",
"interval_hours": "{{count}} sata/i",
"interval_hours_plural": "{{count}} sata/i",
"filters_configuration": "Postavke filtara",
"filters_enable": "Omogući filtre",
"filters_interval": "Interval ažuriranja filtara",
"disabled": "Onemogućeno",
"username_label": "Korisničko ime",
"username_placeholder": "Unesite korisničko ime",
"password_label": "Lozinka",
"password_placeholder": "Unesite lozinku",
"sign_in": "Prijava",
"sign_out": "Odjava",
"forgot_password": "Zaboravljena lozinka?",
"forgot_password_desc": "Slijedite <0>ove korake</0> da biste stvorili novu lozinku za svoj korisnički račun.",
"location": "Lokacija",
"orgname": "Naziv organizacije",
"netname": "Naziv mreže",
"descr": "Opis",
"whois": "Whois",
"filtering_rules_learn_more": "<0>Saznajte više</0> o stvaranju vlastitog hosts popisa neželjenih.",
"blocked_by_response": "Blokirano od strane CNAME-a ili IP-a u odgovoru"
}

View File

@@ -0,0 +1,366 @@
{
"client_settings": "Pengaturan klien",
"example_upstream_reserved": "Anda dapat menentukan DNS upstream <0>untuk domain spesifik</0>",
"upstream_parallel": "Gunakan kueri paralel untuk mempercepat resoluasi dengan menanyakan semua server upstream secara bersamaan",
"bootstrap_dns": "Server DNS bootstrap",
"bootstrap_dns_desc": "Server Bootstrap DNS dapat digunakan untuk meresolve alamat IP pada DoH/DoT resolvers yang Anda tentukan sebagai upstreams.",
"check_dhcp_servers": "Cek untuk server DHCP",
"save_config": "Simpan pengaturan",
"enabled_dhcp": "Server DHCP diaktifkan",
"disabled_dhcp": "Server DHCP dinonaktifkan",
"dhcp_title": "Server DHCP",
"dhcp_description": "Jika router Anda tidak mendukung pengaturan DHCP, Anda dapat menggunakan server DHCP bawaan AdGuard.",
"dhcp_enable": "Aktifkan server DHCP",
"dhcp_disable": "Nonaktifkan server DHCP",
"dhcp_not_found": "Tidak ditemukan server DHCP aktif dalam jaringan. Aman untuk mengaktifkan server DHCP bawaan.",
"dhcp_found": "Ditemukan beberapa server DHCP aktif di dalam jaringan. Tidak aman untuk menyalakan server DHCP bawaan.",
"dhcp_leases": "DHCP leases",
"dhcp_static_leases": "DHCP static leases",
"dhcp_leases_not_found": "DHCP lease tidak ditemukan",
"form_error_required": "Kolom yang harus diisi",
"form_error_mac_format": "Format MAC tidak valid",
"form_error_positive": "Harus lebih dari 0",
"dhcp_form_gateway_input": "IP gateway",
"dhcp_form_subnet_input": "Subnet mask",
"dhcp_form_range_title": "Rentang alamat IP",
"dhcp_form_range_start": "Rentang awal",
"dhcp_form_range_end": "Rentang akhir",
"dhcp_form_lease_title": "Waktu DHCP lease (dalam detik)",
"dhcp_form_lease_input": "Durasi lease",
"dhcp_interface_select": "Pilih antarmuka DHCP",
"dhcp_hardware_address": "Alamat perangkat keras",
"dhcp_ip_addresses": "Alamat IP",
"dhcp_table_hostname": "Nama host",
"dhcp_table_expires": "Kadaluwarsa",
"dhcp_warning": "Jika anda ingin mengaktifkan server DHCP bawaan, pastikan tidak ada server DHCP lain yang aktif. Jika tidak, akan memutus koneksi internet pada perangkat yang telah terhubung!",
"dhcp_error": "Kami tidak dapat menentukan apakah tersedia server DHCP lainnya pada jaringan.",
"dhcp_static_ip_error": "Jika ingin menggunakan server DHCP, alamat IP statis harus diatur. Kami gagal menentukan jika antarmuka jaringan ini dikonfigurasi menggunakan alamat IP statis. Silakan atur alamat IP statis secara manual.",
"dhcp_dynamic_ip_found": "Sistem Anda menggunakan konfigurasi alamat IP dinamis untuk antarmuka <0>{{interfaceName}}</0>. Untuk menggunakan server DHCP, alamat IP statis harus ditetapkan. Alamat IP Anda saat ini adalah <0>{{ipAddress}}</0>. Kami 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_new_static_lease": "Static lease baru",
"dhcp_static_leases_not_found": "DHCP static lease tidak ditemukan",
"dhcp_add_static_lease": "Tambah static lease",
"delete_confirm": "Apakah anda yakin ingin menghapus \"{{key}}\"?",
"form_enter_hostname": "Masukkan hostname",
"error_details": "Detail kesalahan",
"back": "Kembali",
"dashboard": "Beranda",
"settings": "Pengaturan",
"filters": "Penyaring",
"query_log": "Catatan Kueri",
"faq": "Tanya Jawab",
"version": "versi",
"address": "alamat",
"on": "HIDUP",
"off": "MATI",
"copyright": "Hak cipta",
"homepage": "Beranda",
"report_an_issue": "Lapor masalah",
"privacy_policy": "Kebijakan Privasi",
"enable_protection": "Aktifkan perlindungan",
"enabled_protection": "Perlidungan aktif",
"disable_protection": "Matikan perlindungan",
"disabled_protection": "Perlindungan dimatikan",
"refresh_statics": "Segarkan statistik",
"dns_query": "Kueri DNS",
"blocked_by": "Diblokir oleh",
"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_days": "untuk {{value}} hari terakhir",
"for_last_days_plural": "selama {{count}} hari terakhir",
"no_domains_found": "Domain tidak ditemukan",
"requests_count": "Jumlah permintaan",
"top_blocked_domains": "Domain diblokir teratas",
"top_clients": "Klien teratas",
"no_clients_found": "Tidak ditemukan klien",
"general_statistics": "Statistik umum",
"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_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_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 href='#filters'>Penyaringan</a>.",
"use_adguard_browsing_sec": "Gunakan layanan web Keamanan Penjelajahan AdGuard",
"use_adguard_browsing_sec_hint": "AdGuard Home akan mengecek jika domain diblacklist oleh layanan web keamanan penjelajahan. Akan menggunakan lookup API yang ramah privasi untuk melakukan cek: hanya awalan singkat hash SHA256 dari nama domain yang dikirim ke server.",
"use_adguard_parental": "Gunakan layanan web kontrol orang tua AdGuard",
"use_adguard_parental_hint": "AdGuard Home akan mengecek jika domain mengandung materi dewasa. Akan menggunakan API yang ramah privasi yang sama sebagai layanan web keamanan penjelajahan.",
"enforce_safe_search": "Paksa penelusuran aman",
"no_servers_specified": "Sever tidak disebutkan",
"general_settings": "Pengaturan umum",
"dns_settings": "Pengaturan DNS",
"encryption_settings": "Pengaturan enkripsi",
"dhcp_settings": "Pengaturan DHCP",
"upstream_dns": "Server DNS hulu",
"test_upstream_btn": "Uji hulu",
"apply_btn": "Terapkan",
"disabled_filtering_toast": "Penyaringan nonaktif",
"enabled_filtering_toast": "Penyaringan aktif",
"disabled_safe_browsing_toast": "Penelusuran aman dinonaktifkan",
"enabled_safe_browsing_toast": "Penelusuran aman diaktifkan",
"disabled_parental_toast": "Kontrol orang tua dinonaktifkan",
"enabled_parental_toast": "Kontrol orang tua diaktifkan",
"disabled_safe_search_toast": "Pencarian aman dinonaktifkan",
"enabled_save_search_toast": "Pencarian aman diaktifkan",
"enabled_table_header": "Diaktifkan",
"name_table_header": "Nama",
"filter_url_table_header": "URL penyaringan",
"rules_count_table_header": "Jumlah Aturan",
"last_time_updated_table_header": "Terakhir diperbaharui",
"actions_table_header": "Aksi",
"edit_table_action": "Ubah",
"delete_table_action": "Hapus",
"filters_and_hosts": "Daftar blokir penyaringan dan hosts",
"filters_and_hosts_hint": "AdGuard Home memahami aturan dasar adblock dan sintak file hosts.",
"no_filters_added": "Tidak ada penyaringan ditambahkan",
"add_filter_btn": "Tambah penyaringan",
"cancel_btn": "Batal",
"enter_name_hint": "Masukkan nama",
"enter_url_hint": "Masukkan URL",
"check_updates_btn": "Cek pembaruan",
"new_filter_btn": "Langganan penyaring baru",
"enter_valid_filter_url": "Tambah URL valid ke langganan penyaring atau file hosts.",
"custom_filter_rules": "Aturan penyaringan khusus",
"custom_filter_rules_hint": "Masukkan satu aturan dalam sebuah baris. Anda dapat menggunakan baik aturan adblock maupun sintaks file hosts.",
"examples_title": "Contoh",
"example_meaning_filter_block": "Blokir akses ke example.org dan seluruh subdomainnya",
"example_meaning_filter_whitelist": "Buka blokir akses ke domain example.orf dan seluruh subdomainnya",
"example_meaning_host_block": "AdGuard Home sekarang akan mengembalikan alamat 127.0.0.1 untuk domain example.org (namun tidak subdomainnya)",
"example_comment": "! Komentar di sini",
"example_comment_meaning": "hanya sebuah komentar",
"example_comment_hash": "Juga sebuah komentar",
"example_upstream_regular": "DNS reguler (melalui UDP)",
"example_upstream_dot": "terenkripsi <a href='https://en.wikipedia.org/wiki/DNS_over_TLS' target='_blank'>DNS-over-TLS</a>",
"example_upstream_doh": "terenkripsi <a href='https://en.wikipedia.org/wiki/DNS_over_HTTPS' target='_blank'>DNS-over-HTTPS</a>",
"example_upstream_sdns": "anda bisa menggunakan <a href='https://dnscrypt.info/stamps/' target='_blank'>Stempel DNS</a> untuk <a href='https://dnscrypt.info/' target='_blank'>DNSCrypt</a> atau pengarah <a href='https://en.wikipedia.org/wiki/DNS_over_HTTPS' target='_blank'>DNS-over-HTTPS</a>",
"example_upstream_tcp": "DNS reguler (melalui TCP)",
"all_filters_up_to_date_toast": "Semua penyaringan telah terbaharui",
"updated_upstream_dns_toast": "Server DNS hulu terbarui",
"dns_test_ok_toast": "Server DNS yang ditentukan bekerja dengan benar",
"dns_test_not_ok_toast": "Server \"{{key}}\": tidak dapat digunakan, mohon cek bahwa Anda telah menulisnya dengan benar",
"unblock_btn": "Buka Blokir",
"block_btn": "Blokir",
"time_table_header": "Waktu",
"domain_name_table_header": "Nama domain",
"type_table_header": "Tipe",
"response_table_header": "Respon",
"client_table_header": "Klien",
"empty_response_status": "Kosong",
"show_all_filter_type": "Tampilkan semua",
"show_filtered_type": "Tampilkan disaring",
"no_logs_found": "Tidak ditemukan catatan",
"refresh_btn": "Segarkan",
"previous_btn": "Sebelumnya",
"next_btn": "Selanjutnya",
"loading_table_status": "Memuat...",
"page_table_footer_text": "Halaman",
"of_table_footer_text": "dari",
"rows_table_footer_text": "baris",
"updated_custom_filtering_toast": "Perbarui aturan penyaringan khusus",
"rule_removed_from_custom_filtering_toast": "Aturan dihapus dari aturan penyaringan khusus",
"rule_added_to_custom_filtering_toast": "Aturan ditambah ke aturan penyaringan khusus",
"query_log_response_status": "Status: {{value}}",
"query_log_filtered": "Difilter oleh {{filter}}",
"source_label": "Sumber",
"found_in_known_domain_db": "Ditemukan di database domain dikenal",
"category_label": "Kategori",
"rule_label": "Aturan",
"filter_label": "Penyaringan",
"unknown_filter": "Penyaringan {{filterId}} tidak dikenal",
"install_welcome_title": "Selamat datang di AdGuard Home!",
"install_welcome_desc": "AdGuard Home adalah sebuah server DNS pemblokiran iklan dan pelacak di jaringan. Tujuannya adalah memungkinkan anda mengkontrol seluruh jaringan dan semua perangkat anda, dan ini tidak membutuhkan aplikasi tambahan di klien",
"install_settings_title": "Antarmuka Halaman Admin",
"install_settings_listen": "Antarmuka pengoperasian",
"install_settings_port": "Port",
"install_settings_interface_link": "Laman administrasi AdGuard Home akan tersedia di alamat berikut ini",
"form_error_port": "Masukkan nilai port yang valid",
"install_settings_dns": "Server DNS",
"install_settings_dns_desc": "Anda perlu mengkonfigurasi perangkat atau router anda untuk menggunakan server DNS berikut ini",
"install_settings_all_interfaces": "Semua antarmuka",
"install_auth_title": "Otentikasi",
"install_auth_username": "Nama Pengguna",
"install_auth_password": "Kata Sandi",
"install_auth_confirm": "Konfirmasi kata sandi",
"install_auth_username_enter": "Masukkan nama pengguna",
"install_auth_password_enter": "Masukkan kata sandi",
"install_step": "langkah",
"install_devices_title": "Konfigurasikan perangkat anda",
"install_devices_desc": "Agar AdGuard Home dapat berfungsi dengan baik, anda perlu mengkonfigurasi perangkat ada untuk menggunakannya",
"install_submit_title": "Selamat!",
"install_submit_desc": "Prosedur pengaturan telah selesai, dan anda siap untuk mulai menggunakan AdGuard Home.",
"install_devices_router": "Router",
"install_devices_router_desc": "Pengaturan ini akan secara otomatis mencakup semua perangkat yang terhubung ke router rumah anda dan anda tak perlu mengkonfigurasikan secara manual.",
"install_devices_address": "Server DNS AdGuard Home akan menggunakan alamat berikut",
"install_devices_router_list_1": "Buka preferensi untuk router Anda. Biasanya, Anda dapat mengaksesnya dari browser Anda melalui URL (seperti http://192.168.0.1/ atau http://192.168.1.1/). Anda mungkin diminta memasukkan kata sandi. Jika Anda tidak mengingatnya, Anda dapat mengatur ulang kata sandi dengan menekan tombol atur ulang (reset) pada router. Beberapa router ada yang memerlukan aplikasi tertentu, dalam hal ini harus sudah diinstal pada komputer / telepon Anda.",
"install_devices_router_list_2": "Temukan pengaturan DHCP / DNS. Cari huruf DNS di sebelah bidang yang memungkinkan dua atau tiga set angka, masing-masing dipecah menjadi empat grup dengan satu hingga tiga digit.",
"install_devices_router_list_3": "Masukkan alamat server AdGuard Home disana",
"install_devices_windows_list_1": "Buka Panel Kontrol melalui menu Start atau pencarian Windows.",
"install_devices_windows_list_2": "Masuk ke kategori Jaringan dan Internet (Network and Internet) dan kemudian ke Pusat Jaringan dan Berbagi (Network and Sharing Center).",
"install_devices_windows_list_3": "Di sisi kiri layar temukan Ubah pengaturan adaptor dan klik.",
"install_devices_windows_list_4": "Pilih koneksi aktif Anda, klik kanan padanya dan pilih Properties.",
"install_devices_windows_list_5": "Temukan Internet Protocol Version 4 (TCP / IP) dalam daftar, pilih dan kemudian klik Properties lagi.",
"install_devices_windows_list_6": "Pilih Gunakan alamat server DNS dan masukkan alamat server AdGuard Anda.",
"install_devices_macos_list_1": "Klik pada ikon Apple dan pergi ke System Preferences.",
"install_devices_macos_list_2": "Klik pada Jaringan (Network)",
"install_devices_macos_list_3": "Pilih koneksi pertama dalam daftar dan klik Advanced.",
"install_devices_macos_list_4": "Pilih tab DNS dan masukkan alamat server AdGuard Anda.",
"install_devices_android_list_1": "Dari layar beranda Menu Android, ketuk Pengaturan.",
"install_devices_android_list_2": "Ketuk Wi-Fi pada menu. Layar akan mencantumkan semua jaringan yang tersedia dan akan ditampilkan (tidak mungkin untuk mengatur DNS khusus untuk koneksi seluler).",
"install_devices_android_list_3": "Tekan lama jaringan yang terhubung, dan ketuk Ubah Jaringan.",
"install_devices_android_list_4": "Pada beberapa perangkat, Anda mungkin perlu mencentang kotak Advanced untuk melihat pengaturan lebih lanjut. Untuk menyesuaikan pengaturan DNS Android Anda, Anda perlu mengalihkan pengaturan IP dari DHCP ke Statis.",
"install_devices_android_list_5": "Ubah nilai DNS 1 & DNS 2 ke alamat server AdGuard Home",
"install_devices_ios_list_1": "Dari layar beranda, ketuk Pengaturan.",
"install_devices_ios_list_2": "Pilih Wi-Fi di menu sebelah kiri (tidak mungkin untuk mengkonfigurasi DNS untuk jaringan seluler).",
"install_devices_ios_list_3": "Ketuk nama jaringan yang saat ini aktif.",
"install_devices_ios_list_4": "Di bidang DNS, masukkan alamat server AdGuard Home anda.",
"get_started": "Mari mulai",
"next": "Selanjutnya",
"open_dashboard": "Buka Beranda",
"install_saved": "Berhasil disimpan",
"encryption_title": "Enkripsi",
"encryption_desc": "Enkripsi (HTTPS / TLS) untuk DNS dan antarmuka admin",
"encryption_config_saved": "Pengaturan enkripsi telah tersimpan",
"encryption_server": "Nama server",
"encryption_server_enter": "Masukkan nama domain anda",
"encryption_server_desc": "Untuk menggunakan HTTPS, Anda harus memasukkan nama server yang cocok dengan sertifikat SSL Anda.",
"encryption_redirect": "Alihkan ke HTTPS secara otomatis",
"encryption_redirect_desc": "Jika dicentang, AdGuard Home akan secara otomatis mengarahkan anda dari HTTP ke alamat HTTPS.",
"encryption_https": "Port HTTPS",
"encryption_https_desc": "Jika port HTTPS dikonfigurasi, antarmuka admin Home AdGuard akan dapat diakses melalui HTTPS, dan itu juga akan memberikan DNS-over-HTTPS di lokasi '/ dns-query'.",
"encryption_dot": "Port DNS-over-TLS",
"encryption_dot_desc": "Jika port ini terkonfigurasi, AdGuard Home akan menjalankan server DNS-over-TLS dalam port ini",
"encryption_certificates": "Sertifikat",
"encryption_certificates_desc": "Untuk menggunakan enkripsi, Anda perlu memberikan rantai sertifikat SSL yang valid untuk domain Anda. Anda bisa mendapatkan sertifikat gratis di <0>{{link}}</0> atau Anda dapat membelinya dari salah satu Otoritas Sertifikat tepercaya.",
"encryption_certificates_input": "Salin / rekatkan sertifikat PEM yang disandikan di sini.",
"encryption_status": "Status",
"encryption_expire": "Kedaluwarsa",
"encryption_key": "Kunci privat",
"encryption_key_input": "Salin / rekatkan kunci pribadi PEM berkode untuk sertifikat Anda di sini.",
"encryption_enable": "Nyalakan Enkripsi (HTTPS, DNS-over-HTTPS, dan DNS-over-TLS)",
"encryption_enable_desc": "Jika enkripsi diaktifkan, antarmuka admin AdGuard Home akan berfungsi dengan HTTPS, dan server DNS akan mendengarkan permintaan melalui DNS-over-HTTPS dan DNS-over-TLS.",
"encryption_chain_valid": "Rantai sertifikat valid",
"encryption_chain_invalid": "Rantai sertifikat tidak valid",
"encryption_key_valid": "Ini adalah kunci pribadi {{type}} yang valid",
"encryption_key_invalid": "Ini adalah kunci pribadi {{type}} yang tidak valid",
"encryption_subject": "Subjek",
"encryption_issuer": "Penerbit",
"encryption_hostnames": "Nama host",
"encryption_reset": "Anda yakin ingin mengatur ulang pengaturan enkripsi?",
"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 nilai port di kisaran 80-65535",
"form_error_port_unsafe": "Ini adalah port yang tidak aman",
"form_error_equal": "Seharusnya tidak sama",
"form_error_password": "Kata sandi tidak cocok",
"reset_settings": "Setel ulang pengaturan",
"update_announcement": "AdGuard Home {{version}} sekarang tersedia! <0>Klik di sini</0> untuk info lebih lanjut.",
"setup_guide": "Panduan Penyiapan",
"dns_addresses": "Alamat DNS",
"down": "Padam",
"fix": "Perbaiki",
"dns_providers": "Berikut adalah <0>daftar penyedia DNS yang dikenal</0> untuk dipilih.",
"update_now": "Perbarui sekarang",
"update_failed": "Pembaruan otomatis telah gagal. Harap <a href='https://github.com/AdguardTeam/AdGuardHome/wiki/Getting-Started#update'>ikuti petunjuk</a> untuk perbarui secara manual.",
"processing_update": "Silahkan tunggu, AdGuard Home sedang diperbarui",
"clients_title": "Klien",
"clients_desc": "Atur perangkat yang terhubung ke AdGuard Home",
"settings_global": "Global",
"settings_custom": "Kustom",
"table_client": "Klien",
"table_name": "Nama",
"save_btn": "Simpan",
"client_add": "Tambah Klien",
"client_new": "Klien Baru",
"client_edit": "Ubah Klien",
"client_identifier": "Identifikasi",
"ip_address": "Alamat IP",
"form_enter_ip": "Masukkan IP",
"form_enter_mac": "Masukkan MAC",
"form_client_name": "Masukkan nama klien",
"client_global_settings": "Gunakan pengaturan global",
"client_deleted": "Klien \"{{key}}\" berhasil dihapus",
"client_added": "Klien \"{{key}}\" berhasil ditambahkan",
"client_updated": "Klien \"{{key}}\" berhasil diperbarui",
"clients_not_found": "Tidak ada klien ditemukan",
"client_confirm_delete": "Apakah anda yakin ingin menghapus klien \"{{key}}\"?",
"filter_confirm_delete": "Apakah anda yakin ingin menghapus penyaring ini?",
"auto_clients_title": "Klien (waktu berjalan)",
"auto_clients_desc": "Data pada klien yang menggunakan AdGuard Home, tetapi tidak disimpan dalam konfigurasi",
"access_title": "Pengaturan akses",
"access_desc": "Disini anda dapat mengatur aturan akses untuk server AdGuard Home DNS.",
"access_allowed_title": "Klien yang diizinkan",
"access_allowed_desc": "Daftar CIDR atau alamat IP. Jika dikonfigurasi, AdGuard Home hanya akan menerima permintaan dari alamat IP ini.",
"access_disallowed_title": "Klien yang tidak diizinkan",
"access_disallowed_desc": "Daftar CIDR atau alamat IP. Jika dikonfigurasi, AdGuard Home akan membatalkan permintaan dari alamat IP ini.",
"access_blocked_title": "Domain yang diblokir",
"access_blocked_desc": "Jangan bingung antara ini dengan filter. AdGuard Home akan membatalkan kueri DNS dengan domain ini dalam pertanyaan kueri.",
"access_settings_saved": "Pengaturan akses berhasil disimpan",
"updates_checked": "Pembaruan berhasil dicek",
"updates_version_equal": "AdGuard Home sudah tebaru",
"check_updates_now": "Periksa pembaruan sekarang",
"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.",
"setup_dns_privacy_3": "<0>Harap dicatat bahwa protokol DNS terenkripsi hanya didukung pada Android 9. Jadi Anda perlu memasang perangkat lunak tambahan untuk sistem operasi lain.</0><0>Berikut daftar perangkat lunak yang dapat Anda gunakan.</0>",
"setup_dns_privacy_android_1": "Android 9 mendukung DNS-over-TLS secara asli. Untuk mengkonfigurasinya, buka Pengaturan → Jaringan & internet → Tingkat Lanjut → DNS Pribadi dan masukkan nama domain Anda di sana.",
"setup_dns_privacy_android_2": "<0>AdGuard untuk Android</0> mendukung <1>DNS-over-HTTPS</1> dan <1>DNS-over-TLS</1>.",
"setup_dns_privacy_android_3": "<0>Intra</0> menambahkan dukungan <1>DNS-over-HTTPS</1> untuk Android.",
"setup_dns_privacy_ios_1": "<0>DNSCloak</0> mendukung <1>DNS-over-HTTPS</1>, tetapi untuk mengkonfigurasinya untuk menggunakan server Anda sendiri, Anda harus membuat <2>DNS Stamp</2> untuk itu.",
"setup_dns_privacy_ios_2": "<0>AdGuard untuk iOS</0> mendukung <1>DNS-over-HTTPS</1> dan pengaturan <1>DNS-over-TLS</1>.",
"setup_dns_privacy_other_title": "Implementasi lain",
"setup_dns_privacy_other_1": "AdGuard Home sendiri dapat menjadi klien DNS aman di platform apa pun.",
"setup_dns_privacy_other_2": "<0>dnsproxy</0> mendukung semua protokol DNS aman yang diketahui.",
"setup_dns_privacy_other_3": "<0>dnscrypt-proxy</0> mendukung <1>DNS-over-HTTPS</1>.",
"setup_dns_privacy_other_4": "<0>Mozilla Firefox</0> mendukung <1>DNS-over-HTTPS</1>.",
"setup_dns_privacy_other_5": "Anda akan menemukan lebih banyak implementasi <0>di sini</0> dan <1>di sini</1>.",
"setup_dns_notice": "Jikalau ingin menggunakan <1>DNS-over-HTTPS</1> atau <1>DNS-over-TLS</1>, Anda perlu <0>mengatur Enkripsi</0> pada pengaturan AdGuard Home.",
"rewrite_added": "DNS rewrite untuk \"{{key}}\" berhasil ditambahkan",
"rewrite_deleted": "DNS rewrite untuk \"{{key}}\" berhasil dihapus",
"rewrite_add": "Tambah DNS rewrite",
"rewrite_not_found": "Tidak ada DNS rewrite ditemukan",
"rewrite_confirm_delete": "Apakah anda yakin ingin menghapus DNS rewrite untuk \"{{key}}\"?",
"rewrite_desc": "Memungkinkan untuk dengan mudah mengkonfigurasi respons DNS kustom untuk nama domain tertentu.",
"rewrite_applied": "Aturan Rewrite yang diterapkan",
"dns_rewrites": "DNS rewrite",
"form_domain": "Masukkan nama domain",
"form_answer": "Masaukan alamat IP atau nama domain",
"form_error_domain_format": "Nama domain tidak valid",
"form_error_answer_format": "Format jawaban tidak valid",
"configure": "Konfigurasi",
"main_settings": "Pengaturan utama",
"block_services": "Blokir layanan tertentu",
"blocked_services": "Layanan terblokir",
"blocked_services_desc": "Memungkinkan untuk dengan cepat memblokir situs dan layanan populer.",
"blocked_services_saved": "Layanan terblokir berhasil disimpan",
"blocked_services_global": "Gunakan layanan global yang diblokir",
"blocked_service": "Layanan terblokir",
"block_all": "Blokir semua",
"unblock_all": "Buka semua blokir",
"encryption_certificate_path": "Path sertifikat",
"encryption_private_key_path": "Path kunci pribadi",
"encryption_certificates_source_path": "Tetapkan path berkas sertifikat",
"encryption_certificates_source_content": "Tempel konten sertifikat",
"encryption_key_source_path": "Tetapkan berkas kunci pribadi",
"encryption_key_source_content": "Tempel konten kunci pribadi",
"stats_params": "Konfigurasi statistik",
"config_successfully_saved": "Konfigurasi berhasil disimpan",
"interval_24_hour": "24 jam",
"interval_days": "{{value}} hari",
"interval_days_plural": "{{count}} hari",
"domain": "Domain",
"answer": "Jawab",
"filter_added_successfully": "Filter telah berhasil ditambahkan",
"statistics_retention": "Statistik disimpan",
"statistics_retention_desc": "Jika Anda menurunkan nilai interval, beberapa data akan hilang",
"statistics_clear": " Hapus statistik",
"statistics_clear_confirm": "Apakah Anda yakin ingin menghapus statistik?",
"statistics_cleared": "Statistik berhasil dihapus"
}

View File

@@ -0,0 +1,399 @@
{
"client_settings": "Impostazioni client",
"example_upstream_reserved": "puoi specificare un server DNS<0>per uno specifico dominio(i)</0>",
"upstream_parallel": "Usa le query parallele per accelerare la risoluzione interrogando simultaneamente tutti i server",
"bootstrap_dns": "Server DNS di avvio",
"bootstrap_dns_desc": "Server DNS usati per risolvere gli indirizzi IP dei risolutori DoH/DoT specificati come upstreams.",
"check_dhcp_servers": "Controlla la presenza di server DHCP",
"save_config": "Salva configurazione",
"enabled_dhcp": "Server DHCP abilitato",
"disabled_dhcp": "Server DHCP disabilitato",
"dhcp_title": "Server DHCP",
"dhcp_description": "Se il tuo router non supporta la configurazione delle impostazioni del DHCP puoi usare il server DHCP incluso in AdGuard.",
"dhcp_enable": "Abilita server DHCP",
"dhcp_disable": "Disabilita server DHCP",
"dhcp_not_found": "Nessun server DHCP attivo trovato nella rete. Puoi attivare il server DHCP built-in senza problemi.",
"dhcp_found": "Trovati server DHCP attivi nella rete. Non è consigliato attivare il server DHCP built-in",
"dhcp_leases": "Leases DHCP",
"dhcp_static_leases": "Leases DHCP statici",
"dhcp_leases_not_found": "Nessun lease DHCP trovato",
"form_error_required": "Campo richiesto",
"form_error_mac_format": "Formato MAC non valido",
"form_error_positive": "Deve essere maggiore di 0",
"dhcp_form_gateway_input": "IP Gateway",
"dhcp_form_subnet_input": "Subnet mask",
"dhcp_form_range_title": "Range indirizzi IP",
"dhcp_form_range_start": "Inizio range",
"dhcp_form_range_end": "Fine range",
"dhcp_form_lease_title": "Tempo di lease DHCP (in secondi)",
"dhcp_form_lease_input": "Durata lease",
"dhcp_interface_select": "Seleziona l'interfaccia DHCP",
"dhcp_hardware_address": "Indirizzo hardware",
"dhcp_ip_addresses": "Indirizzi IP",
"dhcp_table_hostname": "Nome host",
"dhcp_table_expires": "Scaduto",
"dhcp_warning": "Se si desidera abilitare il server DHCP integrato, assicurarsi che non vi siano altri server DHCP attivi. Altrimenti, possono sussistere problemi di rete per i dispositivi collegati!",
"dhcp_error": "Impossibile determinare se è presente un altro server DHCP nella rete.",
"dhcp_static_ip_error": "Pe rutilizzare un server DHCP, bisogna impostare un indirizzo IP statico. Non siamo riusciti a determinare se questa interfaccia di rete sia configurata per utilizzare un indirizzo IP statico. Per favore impostare un indirizzo IP statico manualmente.",
"dhcp_dynamic_ip_found": "Il tuo sistema utilizza indirizzi IP dinamici per questa interfaccia <0>{{interfaceName}}</0>. Per utilizzare un server DHCP bisogna impostare un indirizzo IP statico. Il tuo indirizzo attuale è <0>{{ipAddress}}</0>. Imposteremo automaticamente questo indirizzo come statico premendo il pulsante Abilita DHCP",
"dhcp_lease_added": "Lease statici \"{{key}}\" aggiunti correttamente",
"dhcp_lease_deleted": "Lease statico \"{{key}}\" eliminato correttamente",
"dhcp_new_static_lease": "Nuovo lease statico",
"dhcp_static_leases_not_found": "Non è stato trovato nessun leases statico DHCP",
"dhcp_add_static_lease": "Aggiungi lease statico",
"delete_confirm": "Sei sicuro di voler cancellare \"{{key}}\"?",
"form_enter_hostname": "Inserisci hostname",
"error_details": "Dettagli errore",
"back": "Indietro",
"dashboard": "Cruscotto",
"settings": "Impostazioni",
"filters": "Filtri",
"query_log": "Query Log",
"faq": "FAQ",
"version": "versione",
"address": "indirizzo IP",
"on": "ATTIVO",
"off": "DISATTIVATO",
"copyright": "Copyright",
"homepage": "Pagina iniziale",
"report_an_issue": "Segnala un problema",
"privacy_policy": "Politica sulla privacy",
"enable_protection": "Abilita protezione",
"enabled_protection": "Protezione abilitata",
"disable_protection": "Disabilita protezione",
"disabled_protection": "Protezione disabilitata",
"refresh_statics": "Aggiorna statistiche",
"dns_query": "Query DNS",
"blocked_by": "Bloccato dai Filtri",
"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_days": "per gli ultimi {{value}} giorni",
"for_last_days_plural": "per gli ultimi {{count}} giorni",
"no_domains_found": "Nessun dominio trovato",
"requests_count": "Numero richieste",
"top_blocked_domains": "Domini maggiormente bloccati",
"top_clients": "Client più utilizzati",
"no_clients_found": "Nessun client trovato",
"general_statistics": "Statistiche generali",
"number_of_dns_query_days": "Numero delle query DNS elaborate negli ultimi {{count}} giorni",
"number_of_dns_query_days_plural": "Numero delle query DNS elaborate negli ultimi {{count}} giorni",
"number_of_dns_query_24_hours": "Numero di query DNS elaborate nelle ultime 24 ore",
"number_of_dns_query_blocked_24_hours": "Numero di richieste DNS bloccate dai filtri adblock e dalle liste di host bloccati",
"number_of_dns_query_blocked_24_hours_by_sec": "Numero di richieste DNS bloccate dal modulo AdGuard browsing security",
"number_of_dns_query_blocked_24_hours_adult": "Numero di siti 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",
"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 href='#filters'>Filtri</a>.",
"use_adguard_browsing_sec": "Usa il servizio AdGuard Browsing Security",
"use_adguard_browsing_sec_hint": "AdGuard Home controllerà se il dominio è stato bloccato dal servizio web browsing security. Per eseguire il controllo userà delle API privacy-friendly: verrà inviato al server solo un breve prefisso dell'hash SHA256 del nome del dominio.",
"use_adguard_parental": "Usa il servizio parental control di AdGuard",
"use_adguard_parental_hint": "AdGuard Home controllerà se il dominio contiene materiale per adulti. Usa le stesse API privacy-friendly del servizio web browsing security.",
"enforce_safe_search": "Forza ricerca sicura",
"no_servers_specified": "Nessun server specificato",
"general_settings": "Impostazioni generali",
"dns_settings": "Impostazioni DNS",
"encryption_settings": "Impostazioni di criptazione",
"dhcp_settings": "Impostazioni DHCP",
"upstream_dns": "Server DNS upstream",
"test_upstream_btn": "Testa gli upstream",
"apply_btn": "Applica",
"disabled_filtering_toast": "Disabilita filtri",
"enabled_filtering_toast": "Abilita filtri",
"disabled_safe_browsing_toast": "Disabilita navigazione sicura",
"enabled_safe_browsing_toast": "Abilita navigazione sicura",
"disabled_parental_toast": "Disabilita il filtro famiglia",
"enabled_parental_toast": "Abilita il filtro famiglia",
"disabled_safe_search_toast": "Disabilita Ricerca Sicura",
"enabled_save_search_toast": "Abilita Ricerca Sicura",
"enabled_table_header": "Attivo",
"name_table_header": "Nome",
"filter_url_table_header": "URL filtro",
"rules_count_table_header": "Numero regole",
"last_time_updated_table_header": "Ultimo aggiornamento",
"actions_table_header": "Azioni",
"edit_table_action": "Modifica",
"delete_table_action": "Elimina",
"filters_and_hosts": "Filtri e blocco hosts",
"filters_and_hosts_hint": "AdGuard Home è in grado di comprendere la sintassi delle regole di adblock o quelle dei file hosts",
"no_filters_added": "Nessun filtro aggiunto",
"add_filter_btn": "Aggiungi filtro",
"cancel_btn": "Annulla",
"enter_name_hint": "Inserisci nome",
"enter_url_hint": "Inserisci URL",
"check_updates_btn": "Controlla aggiornamenti",
"new_filter_btn": "Aggiunta nuovo filtro",
"enter_valid_filter_url": "Inserisci un URL valido di un filtro o un file hosts",
"custom_filter_rules": "Regole filtri personalizzate",
"custom_filter_rules_hint": "Inserisci una regola per riga. Puoi usare la sintassi delle regole di adblock o quelle dei file hosts.",
"examples_title": "Esempi",
"example_meaning_filter_block": "blocca accesso al dominio example.org e a tutti i suoi sottodomini",
"example_meaning_filter_whitelist": "permette l'accesso al dominio example.org e a tutti i suoi sottodimini",
"example_meaning_host_block": "AdGuard Home restituirà 127.0.0.1 come indirizzo per il dominio example.org (ma non per i suoi sottodomini)",
"example_comment": "! Qui va un commento",
"example_comment_meaning": "un commento",
"example_comment_hash": "# Un altro commento",
"example_regex_meaning": "blocca l'accesso ai domini che corrispondono alla specifica espressione regolare",
"example_upstream_regular": "DNS regolari (via UDP)",
"example_upstream_dot": "<a href='https://en.wikipedia.org/wiki/DNS_over_TLS' target='_blank'>DNS-over-TLS</a> criptato",
"example_upstream_doh": "<a href='https://en.wikipedia.org/wiki/DNS_over_HTTPS' target='_blank'>DNS-over-HTTPS</a> criptato",
"example_upstream_sdns": "puoi usare <a href='https://dnscrypt.info/stamps/' target='_blank'>DNS Stamps</a> per <a href='https://dnscrypt.info/' target='_blank'>DNSCrypt</a> oppure dei resolver con <a href='https://en.wikipedia.org/wiki/DNS_over_HTTPS' target='_blank'>DNS-over-HTTPS</a>",
"example_upstream_tcp": "DNS regolari (via TCP)",
"all_filters_up_to_date_toast": "Tutti i filtri sono già aggiornati",
"updated_upstream_dns_toast": "Server DNS upstream aggiornati",
"dns_test_ok_toast": "I server DNS specificati funzionano correttamente",
"dns_test_not_ok_toast": "Server \"{{key}}\": non può essere usato, assicurati di averlo digitato correttamente",
"unblock_btn": "Sblocca",
"block_btn": "Blocca",
"time_table_header": "Ora",
"domain_name_table_header": "Nome dominio",
"type_table_header": "Tipo",
"response_table_header": "Risposta",
"client_table_header": "Client",
"empty_response_status": "Vuoto",
"show_all_filter_type": "Mostra tutti",
"show_filtered_type": "Mostra filtrati",
"no_logs_found": "Nessun log trovato",
"refresh_btn": "Aggiorna",
"previous_btn": "Precedente",
"next_btn": "Successivo",
"loading_table_status": "Caricamento...",
"page_table_footer_text": "Pagina",
"of_table_footer_text": "di",
"rows_table_footer_text": "righe",
"updated_custom_filtering_toast": "Le regole dei filtri personalizzate sono state aggiornate",
"rule_removed_from_custom_filtering_toast": "Regola rimossa dalle regole dei filtri personalizzate",
"rule_added_to_custom_filtering_toast": "Regola aggiunta alle regole dei filtri personalizzate",
"query_log_response_status": "Status: {{value}}",
"query_log_filtered": "Filtrato da {{filter}}",
"query_log_confirm_clear": "Sei sicuro di voler eliminare la query log?",
"query_log_cleared": "La query log è stata cancellata correttamente",
"query_log_clear": "Cancella query logs",
"query_log_retention": "Ritenzione query logs",
"query_log_enable": "Abilita log",
"query_log_configuration": "Configurazione logs",
"query_log_disabled": "La query log è stata disabilitata e può essere configurata nel <0>impostazioni</0>",
"query_log_strict_search": "Utilizzare le virgolette doppie per la ricerca rigorosa",
"query_log_retention_confirm": "Sei sicuro di voler modificare il registro di query? Se si diminuisce il valore di intervallo, alcuni dati saranno persi",
"source_label": "Fonte",
"found_in_known_domain_db": "Trovato nel database dei domini conosciuti.",
"category_label": "Categoria",
"rule_label": "Regola",
"filter_label": "Filtro",
"unknown_filter": "Filtro sconosciuto {{filterId}}",
"install_welcome_title": "Benvenuto nella Home di AdGuard!",
"install_welcome_desc": "AdGuard Home è un server DNS che blocca annunci e tracker in tutta la rete. Il suo scopo è quello di consentire di controllare l'intera rete e tutti i dispositivi, e non richiede l'utilizzo di un programma sul lato client.",
"install_settings_title": "Interfaccia Web dell'Admin",
"install_settings_listen": "Interfaccia d'ascolto",
"install_settings_port": "Porta",
"install_settings_interface_link": "La tua interfaccia web di amministrazione di AdGuard Home sarà disponibile ai seguenti indirizzi:",
"form_error_port": "Immettere un valore di porta valido",
"install_settings_dns": "Server DNS",
"install_settings_dns_desc": "Sarà necessario configurare i dispositivi o il router per utilizzare il server DNS nei seguenti indirizzi:",
"install_settings_all_interfaces": "Tutte le interfacce",
"install_auth_title": "Autenticazione",
"install_auth_desc": "Si consiglia vivamente di configurare l'autenticazione della password per l'interfaccia web di amministrazione di AdGuard Home. Anche se è accessibile solo nella rete locale, è comunque importante proteggerlo da accessi illimitati.",
"install_auth_username": "Nome utente",
"install_auth_password": "Password",
"install_auth_confirm": "Conferma password",
"install_auth_username_enter": "Inserisci nome utente",
"install_auth_password_enter": "Inserisci password",
"install_step": "Passo",
"install_devices_title": "Configura i tuoi dispositivi",
"install_devices_desc": "Affinché AdGuard Home inizi a funzionare, è necessario configurare i dispositivi per utilizzarlo.",
"install_submit_title": "Congratulazioni!",
"install_submit_desc": "La procedura di configurazione è terminata e sei pronto per iniziare a utilizzare AdGuard Home.",
"install_devices_router": "Router",
"install_devices_router_desc": "Questa configurazione coprirà automaticamente tutti i dispositivi collegati al router di casa e non sarà necessario configurarli manualmente.",
"install_devices_address": "Il server DNS di AdGuard Home sta ascoltando sui seguenti indirizzi",
"install_devices_router_list_1": "Apri le preferenze per il tuo router. Di solito, puoi accedervi dal tuo browser tramite un URL (come http://192.168.0.1/ o http://192.168.1.1/). Potrebbe essere richiesto di inserire la password. Se non lo ricordi, puoi spesso reimpostare la password premendo un pulsante sul router stesso. Alcuni router richiedono un'applicazione specifica, che in quel caso dovrebbe essere già installata sul tuo computer / telefono.",
"install_devices_router_list_2": "Trova le impostazioni DHCP / DNS. Cerca le lettere DNS accanto a un campo che consente due o tre serie di numeri, ciascuno suddiviso in quattro gruppi di 1-3 cifre.",
"install_devices_router_list_3": "Inserisci qui gli indirizzi del tuo server AdGuard Home.",
"install_devices_windows_list_1": "Aprire il Pannello di controllo tramite il menu Start o la ricerca di Windows.",
"install_devices_windows_list_2": "Vai a Rete e categoria Internet e poi a Centro connessioni di rete e condivisione.",
"install_devices_windows_list_3": "Sul lato sinistro dello schermo, trova le impostazioni della scheda Cambia e fai clic su di esso.",
"install_devices_windows_list_4": "Seleziona la tua connessione attiva, fai clic destro su di essa e scegli Proprietà.",
"install_devices_windows_list_5": "Trova Protocollo Internet versione 4 (TCP / IP) nell'elenco, selezionalo e quindi fai nuovamente clic su Proprietà.",
"install_devices_windows_list_6": "Scegli Usa i seguenti indirizzi del server DNS e inserisci gli indirizzi del tuo server AdGuard Home.",
"install_devices_macos_list_1": "Fai clic sull'icona Apple e vai su Preferenze di Sistema.",
"install_devices_macos_list_2": "Clicca sulla rete.",
"install_devices_macos_list_3": "Seleziona la prima connessione nel tuo elenco e fai clic su Avanzate.",
"install_devices_macos_list_4": "Seleziona la scheda DNS e inserisci gli indirizzi del tuo server AdGuard Home",
"install_devices_android_list_1": "Dalla schermata Home Menu di Android, tocca Impostazioni.",
"install_devices_android_list_2": "Tocca Wi-Fi nel menu. Verrà visualizzata la schermata che elenca tutte le reti disponibili (impossibile impostare il DNS personalizzato per la connessione mobile).",
"install_devices_android_list_3": "Premi a lungo la rete a cui sei connesso e tocca Modifica rete.",
"install_devices_android_list_4": "Su alcuni dispositivi, potrebbe essere necessario selezionare la casella Avanzate per visualizzare ulteriori impostazioni. Per regolare le impostazioni del tuo DNS Android, dovrai cambiare le impostazioni IP da DHCP a Statico.",
"install_devices_android_list_5": "Cambia i valori DNS 1 e DNS 2 negli indirizzi del tuo server AdGuard Home.",
"install_devices_ios_list_1": "Dalla schermata principale, tocca Impostazioni.",
"install_devices_ios_list_2": "Scegli Wi-Fi nel menu a sinistra (impossibile configurare DNS per reti mobili).",
"install_devices_ios_list_3": "Toccare il nome della rete attualmente attiva.",
"install_devices_ios_list_4": "Nel campo DNS inserisci gli indirizzi del tuo server AdGuard Home.",
"get_started": "Inizia",
"next": "Prossimo",
"open_dashboard": "Apri pannello di controllo",
"install_saved": "Salvataggio riuscito con successo",
"encryption_title": "crittografia",
"encryption_desc": "Supporto di crittografia (HTTPS / TLS) per interfaccia web sia di DNS che di amministrazione",
"encryption_config_saved": "Configurazione della crittografia salvata",
"encryption_server": "Nome server",
"encryption_server_enter": "Inserisci il tuo nome di dominio",
"encryption_server_desc": "Per utilizzare HTTPS, è necessario inserire il nome del server che corrisponde al certificato SSL.",
"encryption_redirect": "Reindirizza automaticamente a HTTPS",
"encryption_redirect_desc": "Se selezionato, AdGuard Home ti reindirizzerà automaticamente da indirizzi HTTP a HTTPS.",
"encryption_https": "Porta HTTPS",
"encryption_https_desc": "Se la porta HTTPS è configurata, l'interfaccia di amministrazione di AdGuard Home sarà accessibile tramite HTTPS e fornirà anche DNS-over-HTTPS nella posizione \"/ dns-query\".",
"encryption_dot": "DNS-su porta-TLS",
"encryption_dot_desc": "Se questa porta è configurata, AdGuard Home eseguirà un server DNS-over-TLS su questa porta.",
"encryption_certificates": "Certificati",
"encryption_certificates_desc": "Per utilizzare la crittografia, è necessario fornire una catena di certificati SSL valida per il proprio dominio. Puoi ottenere un certificato gratuito su <0> {{link}} </ 0> o puoi acquistarlo da una delle Autorità di certificazione attendibili.",
"encryption_certificates_input": "Copia / incolla qui i certificati codificati PEM.",
"encryption_status": "Stato",
"encryption_expire": "Scaduto",
"encryption_key": "Chiave privata",
"encryption_key_input": "Copia / incolla qui la tua chiave privata codificata PEM del tuo certificato.",
"encryption_enable": "Abilita crittografia (HTTPS, DNS-su-HTTPS e DNS-su-TLS)",
"encryption_enable_desc": "Se la crittografia è abilitata, l'interfaccia di amministrazione di AdGuard Home funzionerà su HTTPS e il server DNS ascolterà le richieste su DNS-over-HTTPS e DNS-over-TLS.",
"encryption_chain_valid": "La catena di certificati è valida",
"encryption_chain_invalid": "La catena di certificati non è valida",
"encryption_key_valid": "Questa è una chiave privata {{type}} valida",
"encryption_key_invalid": "Questa è una chiave privata {{type}} non valida",
"encryption_subject": "Soggetto",
"encryption_issuer": "Emittente",
"encryption_hostnames": "Nomi host",
"encryption_reset": "Sei sicuro di voler ripristinare le impostazioni di crittografia?",
"topline_expiring_certificate": "Il tuo certificato SSL sta per scadere. Aggiorna le<0> Impostazioni di crittografia </ 0>.",
"topline_expired_certificate": "Il tuo certificato SSL è scaduto. Aggiorna le <0> Impostazioni di crittografia </ 0>.",
"form_error_port_range": "Immettere il valore della porta nell'intervallo 80-65535",
"form_error_port_unsafe": "Questa è una porta non sicura",
"form_error_equal": "Non dovrebbe essere uguale",
"form_error_password": "Password non corrispondente",
"reset_settings": "Reimposta impostazioni",
"update_announcement": "AdGuard Home {{version}} è ora disponibile! <0>Clicca qui</0> per più informazioni.",
"setup_guide": "Configurazione guidata",
"dns_addresses": "Indirizzo DNS",
"down": "Spenta",
"fix": "Risolvi",
"dns_providers": "Qui c'è una <0>list di provider DNS</0> da cui scegliere",
"update_now": "Aggiorna ora",
"update_failed": "L' auto aggiornamento è fallito. Perfavore <a href='https://github.com/AdguardTeam/AdGuardHome/wiki/Getting-Started#update'>segui questi passi</a>per aggiornare manualmente.",
"processing_update": "Perfavore aspetta, AdGuard Home si sta aggiornando",
"clients_title": "Client",
"clients_desc": "Configura i dispositivi connessi ad AdGuard Home",
"settings_global": "Globale",
"settings_custom": "Personalizzato",
"table_client": "Client",
"table_name": "Nome",
"save_btn": "Salva",
"client_add": "Aggiungi Client",
"client_new": "Nuovo Client",
"client_edit": "Modifica Client",
"client_identifier": "Identificatore",
"ip_address": "Indirizzo IP",
"form_enter_ip": "Inserisci IP",
"form_enter_mac": "Inserisci MAC",
"form_client_name": "Inserisci nome client",
"client_global_settings": "Usa le impostazioni globali",
"client_deleted": "Client \"{{key}}\" eliminato correttamente",
"client_added": "Client \"{{key}}\" aggiunto correttamente",
"client_updated": "Client \"{{key}}\" aggiornato correttamente",
"clients_not_found": "Nessun client trovato",
"client_confirm_delete": "Sei sicuro di voler eliminare il client \"{{key}}\"?",
"filter_confirm_delete": "Sei sicuro di voler cancellare questo filtro?",
"auto_clients_title": "Clienti (tempo di esecuzione)",
"auto_clients_desc": "Dati dei clienti che utilizzano AdGuard Home, ma che non sono salvati nella configurazione",
"access_title": "Impostazioni di accesso",
"access_desc": "Qui puoi configurare le regole d'accesso per il server DNS di AdGuard Home.",
"access_allowed_title": "Client permessi",
"access_allowed_desc": "Una lista in CIDR o indirizzi IP. Se configurata AdGuard Home accetterà richieste solo da questi indirizzi ip.",
"access_disallowed_title": "Client non permessi",
"access_disallowed_desc": "Una lista in CIDR o indirizzi IP. Se configurata AdGuard Home non accetterà richieste da questi indirizzi ip.",
"access_blocked_title": "Domini bloccati",
"access_blocked_desc": "Non confondere questi elementi con i filtri. AdGuard Home eliminerà le query DNS con questi domini nell'elaborazione della query.",
"access_settings_saved": "Impostazioni di accesso salvate correttamente",
"updates_checked": "Aggiornamenti controllati con successo",
"updates_version_equal": "AdGuard Home è aggiornato",
"check_updates_now": "Controlla aggiornamenti adesso",
"dns_privacy": "Privacy DNS",
"setup_dns_privacy_1": "<0>DNS-over-TLS:</0> Utilizza la stringa <1>{{address}}</1>.",
"setup_dns_privacy_2": "<0>DNS-over-HTTPS:</0> Utilizza la stringa <1>{{address}}</1>.",
"setup_dns_privacy_3": "<0>Nota che i protocolli DNS crittografati sono supportati solo su Android 9. Quindi è necessario installare software aggiuntivo per altri sistemi operativi.</0><0>Ecco un elenco di software che è possibile utilizzare.</0>",
"setup_dns_privacy_android_1": "Android 9 supporta DNS-over-TLS in modo nativo. Per configurarlo, vai su Impostazioni → Rete e Internet → Avanzate → DNS privato e inserisci qui il tuo nome di dominio.",
"setup_dns_privacy_android_2": "<0>AdGuard per Android</0> supporta <1>DNS-over-HTTPS</1> e <1>DNS-over-TLS</1>.",
"setup_dns_privacy_android_3": "<0>Intra</0> aggiunge <1>DNS-over-HTTPS</1> il supporto ad Android.",
"setup_dns_privacy_ios_1": "<0>DNSCloak</0> supporta <1>DNS-over-HTTPS</1>, ma per configurarlo per l'utilizzo del proprio server, è necessario generare un <2> DNS Stamp</2> apposito.",
"setup_dns_privacy_ios_2": "<0>AdGuard per iOS</0>supporta l'impostazione <1>DNS-over-HTTPS</1> e <1>DNS-over-TLS</1>.",
"setup_dns_privacy_other_title": "Altre implementazion",
"setup_dns_privacy_other_1": "AdGuard Home può essere un client DNS sicuro su qualsiasi piattaforma.",
"setup_dns_privacy_other_2": "<0>dnsproxy</0> supporta tutti i protocolli DNS sicuri noti.",
"setup_dns_privacy_other_3": "<0>dnscrypt-proxy</0> supporta <1>DNS-over-HTTPS</1>.",
"setup_dns_privacy_other_4": "<0>Mozilla Firefox</0> supporta <1>DNS-over-HTTPS</1>.",
"setup_dns_privacy_other_5": "Troverai più implementazioni <0>qui</0> e <1>qui</1>.",
"setup_dns_notice": "Per utilizzare <1>DNS-over-HTTPS</1> o <1>DNS-over-TLS</1>, è necessario <0>configurare la crittografia</0> nelle impostazioni di AdGuard Home.",
"rewrite_added": "Riscrittura DNS per \"{{key}}\" aggiunta correttamente",
"rewrite_deleted": "La riscrittura DNS per \"{{key}}\" è stata eliminata correttamente",
"rewrite_add": "Aggiungi la riscrittura DNS",
"rewrite_not_found": "Nessuna riscrittura DNS trovata",
"rewrite_confirm_delete": "Sei sicuro di voler cancellare la riscrittura DNS per \"{{key}}\"?",
"rewrite_desc": "Consente di configurare facilmente la risposta DNS personalizzata per un nome di dominio specifico.",
"rewrite_applied": "Regola di riscrittura applicata",
"dns_rewrites": "Riscrittura DNS",
"form_domain": "Inserisci il dominio",
"form_answer": "Inserisci l'indirizzo IP o il nome del dominio",
"form_error_domain_format": "Formato del dominio non valido",
"form_error_answer_format": "Formato di risposta non valido",
"configure": "Configura",
"main_settings": "Impostazioni principali",
"block_services": "Blocca servizi specifici",
"blocked_services": "Servizi bloccati",
"blocked_services_desc": "Consente di bloccare rapidamente siti e servizi popolari.",
"blocked_services_saved": "Servizi bloccati salvati correttamente",
"blocked_services_global": "Utilizza le servizi globali bloccati",
"blocked_service": "Servizio bloccato",
"block_all": "Blocca tutto",
"unblock_all": "Sblocca tutto",
"encryption_certificate_path": "Percorso di certificato",
"encryption_private_key_path": "Percorso della chiave privata",
"encryption_certificates_source_path": "Definisci un percorso alle file dei certificati",
"encryption_certificates_source_content": "Incolla i contenuti di certificato",
"encryption_key_source_path": "Imposta un file chiave privata",
"encryption_key_source_content": "Incolla i contenuti della chiave privata",
"stats_params": "Configurazione delle statistiche",
"config_successfully_saved": "Configurazione salvata correttamente",
"interval_24_hour": "24 ore",
"interval_days": "{{count}} giorni",
"interval_days_plural": "{{count}} giorni",
"domain": "Dominio",
"answer": "Risposta",
"filter_added_successfully": "Il filtro è stato aggiunto correttamente",
"statistics_configuration": "Configurazione delle statistiche",
"statistics_retention": "Conservazione statistiche",
"statistics_retention_desc": "Se si diminuisce il valore di intervallo, alcuni dati saranno persi",
"statistics_clear": " Azzera statistiche",
"statistics_clear_confirm": "Sei sicuro di voler azzerare le statistiche?",
"statistics_retention_confirm": "Sei sicuro di modificare la conservazione statistiche? Se si diminuisce il valore di intervallo, alcuni dati saranno persi",
"statistics_cleared": "Statistiche azzerate correttamente",
"interval_hours": "{{count}} ora",
"interval_hours_plural": "{{count}} ore",
"filters_configuration": "Configurazione filtri",
"filters_enable": "Abilita i filtri",
"filters_interval": "Intervallo aggiornamento filtri",
"disabled": "Disabilitato",
"username_label": "Nome utente",
"username_placeholder": "Inserisci nome utente",
"password_label": "Password",
"password_placeholder": "Inserisci password",
"sign_in": "Accedi",
"sign_out": "Esci",
"forgot_password": "Hai perso la password?",
"forgot_password_desc": "Per favore segui <0>questi punti</0> per creare una nuova password per il tuo account.",
"location": "Locazione",
"orgname": "Nome dell'organizzazione",
"netname": "Nome Network",
"descr": "Descrizione",
"whois": "Chi è",
"filtering_rules_learn_more": "<0>Impara di più</0> come creare i tuoi elenchi di blocco per i hosts."
}

View File

@@ -4,7 +4,6 @@
"upstream_parallel": "すべての上流サーバに同時に照会することで解決をスピードアップするため、並列クエリを使用する",
"bootstrap_dns": "ブートストラップDNSサーバ",
"bootstrap_dns_desc": "ブートストラップDNSサーバは、上流として指定したDoHDoTリゾルバのIPアドレスを解決するために使用されます。",
"url_added_successfully": "URLの追加に成功しました",
"check_dhcp_servers": "DHCPサーバをチェックする",
"save_config": "設定を保存する",
"enabled_dhcp": "DHCPサーバを有効にしました",
@@ -18,9 +17,7 @@
"dhcp_leases": "DHCP割り当て",
"dhcp_static_leases": "DHCP静的割り当て",
"dhcp_leases_not_found": "DHCP割当はありません",
"dhcp_config_saved": "DHCPサーバの設定を保存しました",
"form_error_required": "必須項目",
"form_error_ip_format": "IPv4フォーマットではありません",
"form_error_mac_format": "MACフォーマットではありません",
"form_error_positive": "0より大きい必要があります",
"dhcp_form_gateway_input": "ゲートウェイIP",
@@ -67,7 +64,6 @@
"disabled_protection": "保護を無効にしました",
"refresh_statics": "統計データを最新にする",
"dns_query": "DNSクエリ",
"blocked_by": "フィルタにブロックされたDNSクエリ",
"stats_malware_phishing": "ブロックされたマルウェア/フィッシング",
"stats_adult": "ブロックされたアダルトウェブサイト",
"stats_query_domain": "最も問合せされたドメイン",
@@ -78,7 +74,6 @@
"top_clients": "トップクライアント",
"no_clients_found": "クライアント情報はありません",
"general_statistics": "全般的な統計",
"number_of_dns_query_24_hours": "過去24時間に処理された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": "ブロックされたアダルトウェブサイトの数",
@@ -93,15 +88,12 @@
"use_adguard_parental": "AdGuardペアレンタルコントロール・ウェブサービスを使用する",
"use_adguard_parental_hint": "AdGuard Homeは、ドメインにアダルトコンテンツが含まれているかどうかを確認します。 ブラウジングセキュリティ・ウェブサービスと同じプライバシーに優しいAPIを使用します。",
"enforce_safe_search": "セーフサーチを強制する",
"enforce_save_search_hint": "AdGuard Homeは、Google、Youtube、Bing、Yandexの検索エンジンでセーフサーチを強制できます。",
"no_servers_specified": "サーバが指定されていません",
"no_settings": "設定なし",
"general_settings": "一般設定",
"dns_settings": "DNS設定",
"encryption_settings": "暗号化設定",
"dhcp_settings": "DHCP設定",
"upstream_dns": "上流DNSサーバ",
"upstream_dns_hint": "このフィールドを未入力のままにすると、AdGuard Homeは上流として<a href='https://1.1.1.1/' target='_blank'>Cloudflare DNS</a>を使用します。DNS over TLSサーバには、「tls://」プレフィックスを使用してください。",
"test_upstream_btn": "上流サーバをテストする",
"apply_btn": "適用する",
"disabled_filtering_toast": "フィルタリングを無効にしました",
@@ -139,7 +131,6 @@
"example_comment": "! ここにはコメントが入ります",
"example_comment_meaning": "ただのコメントです",
"example_comment_hash": "# ここもコメントです",
"example_regex_meaning": "<0>指定の正規表現</0>に一致するドメインへのアクセスをブロックします",
"example_upstream_regular": "通常のDNSUDPでの問い合わせ",
"example_upstream_dot": "暗号化されている <a href='https://en.wikipedia.org/wiki/DNS_over_TLS' target='_blank'>DNS-over-TLS</a>",
"example_upstream_doh": "暗号化されている <a href='https://en.wikipedia.org/wiki/DNS_over_HTTPS' target='_blank'>DNS-over-HTTPS</a>",
@@ -160,11 +151,7 @@
"show_all_filter_type": "すべて表示",
"show_filtered_type": "フィルタされたログを表示",
"no_logs_found": "ログはありません",
"disabled_log_btn": "ログを無効にする",
"download_log_file_btn": "ログファイルをダウンロードする",
"refresh_btn": "最新にする",
"enabled_log_btn": "ログを有効にする",
"last_dns_queries": "最新5000件分のDNSクエリ",
"previous_btn": "前へ",
"next_btn": "次へ",
"loading_table_status": "読み込み中…",
@@ -174,8 +161,6 @@
"updated_custom_filtering_toast": "カスタム・フィルタリングルールを更新しました",
"rule_removed_from_custom_filtering_toast": "ルールをカスタム・フィルタリングルールから除去しました",
"rule_added_to_custom_filtering_toast": "ルールをカスタム・フィルタリングルールに追加しました",
"query_log_disabled_toast": "クエリ・ログを無効にしました",
"query_log_enabled_toast": "クエリ・ログを有効にしました",
"source_label": "ソース",
"found_in_known_domain_db": "既知のドメインデータベースに見つかりました。",
"category_label": "カテゴリ",
@@ -193,7 +178,6 @@
"install_settings_dns_desc": "次のアドレスでDNSサーバを使用するようにあなたのデバイスまたはルータを設定する必要があります:",
"install_settings_all_interfaces": "すべてのインターフェイス",
"install_auth_title": "認証",
"install_auth_desc": "AdGuard Homeの管理ウェブインターフェースにパスワード認証を設定することを強くお勧めします。ローカルネットワークでのみアクセス可能であっても、制限のないアクセスから保護することは重要です。",
"install_auth_username": "ユーザ名",
"install_auth_password": "パスワード",
"install_auth_confirm": "パスワード(確認用)",
@@ -290,7 +274,6 @@
"client_edit": "クライアントの編集",
"client_identifier": "識別子",
"ip_address": "IPアドレス",
"client_identifier_desc": "クライアントはIPアドレスまたはMACアドレスで識別できます。AdGuard Homeが<0>DHCPサーバ</0>でもある場合にのみ、識別子としてMACを使用することが可能であることにご注意ください。",
"form_enter_ip": "IPアドレスを入力してください",
"form_enter_mac": "MACアドレスを入力してください",
"form_client_name": "クライアント名を入力してください",
@@ -298,7 +281,6 @@
"client_deleted": "クライアント \"{{key}}\" の削除に成功しました",
"client_added": "クライアント \"{{key}}\" の追加に成功しました",
"client_updated": "クライアント \"{{key}}\" の更新に成功しました",
"table_statistics": "リクエスト数過去24時間",
"clients_not_found": "クライアント情報はありません",
"client_confirm_delete": "クライアント \"{{key}}\" を削除してもよろしいですか?",
"filter_confirm_delete": "フィルターを削除してもよろしいですか?",

View File

@@ -0,0 +1,399 @@
{
"client_settings": "클라이언트 설정",
"example_upstream_reserved": "<0>특정 도메인에 대한</0> DNS 업스트림을 지정할 수 있습니다.",
"upstream_parallel": "쿼리 처리 속도를 높이려면 모든업스트림 서버에서 병렬 쿼리를 사용해주세요.",
"bootstrap_dns": "부트스트랩 DNS 서버",
"bootstrap_dns_desc": "부트스트랩 DNS 서버는 업스트림으로 지정한 DoH/DoT 서버의 IP 주소를 확인하는 데 사용합니다.",
"check_dhcp_servers": "DHCP 서버 체크",
"save_config": "구성 저장",
"enabled_dhcp": "DHCP 서버 활성화됨",
"disabled_dhcp": "DHCP 서버 비활성화됨",
"dhcp_title": "DHCP 서버 (시험!)",
"dhcp_description": "라우터가 DHCP 설정을 제공하지 않으면 AdGuard의 자체 기본 제공 DHCP 서버를 사용할 수 있습니다.",
"dhcp_enable": "DHCP 서버 활성화",
"dhcp_disable": "DHCP 서버 비활성화",
"dhcp_not_found": "네트워크에 활성 DHCP 서버가 없습니다. 기본 제공 DHCP 서버를 안전하게 사용할 수 있습니다. 하지만 자동 테스트에서 100% 보증이 되지 않으므로 네트워크에 활성 DHCP 서버가 있는지없는지 수동으로 다시 확인해 보세요.",
"dhcp_found": "네트워크에 활성 DHCP 서버가 있습니다. 기본 제공 DHCP 서버를 활성화하는 것은 안전하지 않습니다.",
"dhcp_leases": "DHCP 임대",
"dhcp_static_leases": "DHCP 고정 임대",
"dhcp_leases_not_found": "DHCP 임대를 찾을 수 없음",
"form_error_required": "필수 필드",
"form_error_mac_format": "잘못된 MAC 형식",
"form_error_positive": "0보다 커야 합니다",
"dhcp_form_gateway_input": "게이트웨이 IP",
"dhcp_form_subnet_input": "서브넷 마스크",
"dhcp_form_range_title": "IP 주소 범위",
"dhcp_form_range_start": "범위 시작",
"dhcp_form_range_end": "범위 끝",
"dhcp_form_lease_title": "DHCP 임대 시간 (초 단위로 표시됩니다)",
"dhcp_form_lease_input": "임대 기간",
"dhcp_interface_select": "DHCP 인터페이스 선택",
"dhcp_hardware_address": "하드웨어 주소",
"dhcp_ip_addresses": "IP 주소",
"dhcp_table_hostname": "호스트 이름",
"dhcp_table_expires": "만료",
"dhcp_warning": "DHCP 서버를 사용하려면 네트워크에 다른 활성 DHCP 서버가 없는지 확인해주세요. 다른 활성 DHCP 서버가 있다면, 연결된 장치의 인터넷을 끊을 수 있습니다.",
"dhcp_error": "네트워크에 다른 DHCP 서버가 있는지 확인할 수 없습니다.",
"dhcp_static_ip_error": "DHCP 서버를 사용하려면 고정 IP 주소를 설정해야 합니다. 이 네트워크 인터페이스가 고정 IP 주소를 사용하고 있는지 확인할 수 없습니다. 고정 IP 주소를 수동으로 설정해주세요.",
"dhcp_dynamic_ip_found": "시스템은 <0>{{interfaceName}}</0> 인터페이스에 동적 IP 주소 구성을 사용합니다. DHCP 서버를 사용하기 위해서 고정 IP 주소를 설정해야합니다. <0>{{ipAddress}}</0> 현재 IP 주소입니다. DHCP 활성화 버튼을 누르면 이 IP 주소가 자동으로 고정 IP 주소로 설정됩니다.",
"dhcp_lease_added": "\"{{key}}\" 고정 임대 정상적으로 추가되었습니다",
"dhcp_lease_deleted": "\"{{key}}\" 고정 임대 정상적으로 삭제되었습니다",
"dhcp_new_static_lease": "새 고정 임대",
"dhcp_static_leases_not_found": "DHCP 고정 임대를 찾을 수 없음",
"dhcp_add_static_lease": "고정 임대 추가",
"delete_confirm": "\"{{key}}\"을 삭제하시겠습니까?",
"form_enter_hostname": "호스트 이름을 입력해주세요",
"error_details": "오류 상세 정보",
"back": "뒤로",
"dashboard": "대시보드",
"settings": "설정",
"filters": "필터",
"query_log": "쿼리 로그",
"faq": "자주 묻는 질문",
"version": "버전",
"address": "주소",
"on": "ON",
"off": "OFF",
"copyright": "Copyright",
"homepage": "홈페이지",
"report_an_issue": "문제를 보고합니다",
"privacy_policy": "개인 정보 처리 방침",
"enable_protection": "보호 활성화",
"enabled_protection": "보호 활성화됨",
"disable_protection": "보호 비활성화",
"disabled_protection": "보호 비활성화됨",
"refresh_statics": "통계 새로 고침",
"dns_query": "DNS 쿼리",
"blocked_by": "필터에 의해 차단됨",
"stats_malware_phishing": "차단된 멀웨어/피싱",
"stats_adult": "차단된 성인 웹사이트",
"stats_query_domain": "쿼리 도메인",
"for_last_24_hours": "지난 24시간 동안",
"for_last_days": "마지막 {{value}} 일",
"for_last_days_plural": "마지막 {{count}} 일의 기록",
"no_domains_found": "도메인이 없습니다",
"requests_count": "요청 수",
"top_blocked_domains": "차단된 도메인",
"top_clients": "클라이언트",
"no_clients_found": "클라이언트가 없습니다",
"general_statistics": "일반 통계",
"number_of_dns_query_days": "최근 {{value}} 일 동안 처리된 DNS 쿼리의 수",
"number_of_dns_query_days_plural": "최근 {{count}} 일 동안 처리된 DNS 쿼리 수",
"number_of_dns_query_24_hours": "최근 24시간 동안 처리된 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": "Safe Search가 적용된 검색 엔진에 대해 DNS 요청",
"average_processing_time": "평균처리 시간",
"average_processing_time_hint": "DNS 요청 처리시 평균 시간(밀리초)",
"block_domain_use_filters_and_hosts": "필터 및 호스트 파일을 사용하여 도메인 차단",
"filters_block_toggle_hint": "차단규칙<a href='#filters'>필터</a>을 설정할 수 있습니다.",
"use_adguard_browsing_sec": "AdGuard 브라우징 보안 웹 서비스 사용",
"use_adguard_browsing_sec_hint": "AdGuard Home은 개인정보를 보호하는 API를 사용하여 브라우징 보안 웹 서비스를 통해 도메인이 블랙리스트에 올라 있는지 확인합니다. 참고: 도메인 이름의 SHA256 해시의 짧은 접두사만 서버로 전송됩니다.",
"use_adguard_parental": "AdGuard 자녀 보호 웹 서비스 사용",
"use_adguard_parental_hint": "AdGuard Home은 도메인에 성인 자료가 포함되어 있는지 확인합니다. 브라우징 보안 웹 서비스와 동일한 개인정보 보호 API를 사용함.",
"enforce_safe_search": "세이프서치 강제",
"no_servers_specified": "지정된 서버 없음",
"general_settings": "일반 설정",
"dns_settings": "DNS 설정",
"encryption_settings": "암호화 설정",
"dhcp_settings": "DHCP 설정",
"upstream_dns": "업스트림 DNS 서버",
"test_upstream_btn": "업스트림 테스트",
"apply_btn": "적용",
"disabled_filtering_toast": "필터링 비활성화됨",
"enabled_filtering_toast": "필터링 활성화됨",
"disabled_safe_browsing_toast": "세이프 브라우징 비활성화됨",
"enabled_safe_browsing_toast": "세이프 브라우징 활성화됨",
"disabled_parental_toast": "자녀 보호 비활성화됨",
"enabled_parental_toast": "자녀 보호 활성화됨",
"disabled_safe_search_toast": "세이프서치 비활성화됨",
"enabled_save_search_toast": "세이프서치 활성화됨",
"enabled_table_header": "활성화됨",
"name_table_header": "이름",
"filter_url_table_header": "필터 주소",
"rules_count_table_header": "규칙 개수",
"last_time_updated_table_header": "마지막 업데이트",
"actions_table_header": "가능한 동작",
"edit_table_action": "편집",
"delete_table_action": "삭제",
"filters_and_hosts": "필터와 호스트 차단목록",
"filters_and_hosts_hint": "AdGuard Home은 기본적인 광고 차단 규칙과 호스트 파일 문법을 읽을 수 있습니다",
"no_filters_added": "추가된 필터 없음",
"add_filter_btn": "필터 추가",
"cancel_btn": "취소",
"enter_name_hint": "이름을 입력하세요",
"enter_url_hint": "주소를 입력하세요",
"check_updates_btn": "업데이트 확인",
"new_filter_btn": "새로운 필터 구독",
"enter_valid_filter_url": "호스트 파일 또는 필터 구독에 올바른 URL 을 입력하세요.",
"custom_filter_rules": "커스텀 필터링 규칙",
"custom_filter_rules_hint": "한 라인에 한 규칙만 입력하세요. 광고 차단 규칙과 호스트 파일 문법 중 하나를 사용할 수 있습니다",
"examples_title": "예시",
"example_meaning_filter_block": "example.org 을 포함한 모든 서브 도메인 접근을 차단합니다",
"example_meaning_filter_whitelist": "example.org 을 포함한 모든 서브 도메인 접근을 차단 해제합니다.",
"example_meaning_host_block": "AdGuard Home은 example.org 접속 시 127.0.0.1으로 이동합니다. (서브 도메인은 포함되지 않습니다)",
"example_comment": "! 여기는 주석이 올 수 있습니다",
"example_comment_meaning": "말 그대로의 의미입니다",
"example_comment_hash": "# 이것 또한 주석입니다",
"example_regex_meaning": "<0>특정 정규 표현식</0>에 맞는 도메인 접근을 차단합니다",
"example_upstream_regular": "사용자 지정 DNS (UDP을 통한 접속)",
"example_upstream_dot": "암호화 된 <0>DNS-over-TLS</0>",
"example_upstream_doh": "암호화 된 <0>DNS-over-HTTPS</0>",
"example_upstream_sdns": "<1>DNSCrypt</1>나 <2>DNS-over-HTTPS</2> 리졸버를 위해 <0>DNS 스탬프</0>를 사용할 수 있습니다",
"example_upstream_tcp": "사용자 지정 DNS (TCP를 통한 접속)",
"all_filters_up_to_date_toast": "모든 필터는 이미 최신입니다",
"updated_upstream_dns_toast": "업스트림 DNS 서버를 업데이트하였습니다",
"dns_test_ok_toast": "특정 DNS 서버들은 정상적으로 동작 중입니다",
"dns_test_not_ok_toast": "서버 \"{{key}}\": 사용할 수 없습니다, 제대로 작성했는지 확인하세요.",
"unblock_btn": "차단 해제",
"block_btn": "차단",
"time_table_header": "시간",
"domain_name_table_header": "도메인명",
"type_table_header": "유형",
"response_table_header": "응답",
"client_table_header": "클라이언트",
"empty_response_status": "비어있음",
"show_all_filter_type": "모두 표시",
"show_filtered_type": "필터된 것 표시",
"no_logs_found": "로그 기록 찾을 수 없음",
"refresh_btn": "새로고침",
"previous_btn": "이전",
"next_btn": "다음",
"loading_table_status": "로딩중...",
"page_table_footer_text": "페이지",
"of_table_footer_text": "/",
"rows_table_footer_text": "행",
"updated_custom_filtering_toast": "사용자 정의 필터링 규칙 업데이트",
"rule_removed_from_custom_filtering_toast": "사용자 정의 필터링 규칙에서 규칙 제거",
"rule_added_to_custom_filtering_toast": "사용자 정의 필터링 규칙에 추가된 규칙",
"query_log_response_status": "상태: {{value}}",
"query_log_filtered": "필터: {{filter}}",
"query_log_confirm_clear": "정말로 모든 쿼리 로그를 비우시겠습니까?",
"query_log_cleared": "쿼리 로그를 성공적으로 초기화했습니다",
"query_log_clear": "쿼리 로그 비우기",
"query_log_retention": "쿼리 로그 저장 기간",
"query_log_enable": "로그 활성화",
"query_log_configuration": "로그 구성",
"query_log_disabled": "쿼리 로그가 비활성화되어 있으며 <0>설정</0>에서 설정할 수 있습니다",
"query_log_strict_search": "검색을 제한하려면 쌍따옴표를 사용해주세요",
"query_log_retention_confirm": "정말로 쿼리 로그 저장 기간을 변경하시겠습니까? 저장 주기를 낮출 경우, 일부 데이터가 손실됩니다",
"source_label": "소스",
"found_in_known_domain_db": "알려진 도메인 데이터베이스에서 발견됨.",
"category_label": "카테고리",
"rule_label": "규칙",
"filter_label": "필터",
"unknown_filter": "알려지지 않은 필터 {{filterId}}",
"install_welcome_title": "AdGuard Home에 오신 것을 환영합니다!",
"install_welcome_desc": "AdGuard Home은 광범위한 네트워크 광고와 추적 DNS 서버를 차단 합니다. 그것의 목적은 당신이 당신의 전체 네트워크와 당신의 모든 기기를 제어하는 것이며, 그것은 클라이언트의 프로그램을 사용할 필요가 없습니다.",
"install_settings_title": "관리자 웹 인터페이스",
"install_settings_listen": "네트워크 인터페이스",
"install_settings_port": "포트",
"install_settings_interface_link": "AdGuard Home 관리자 웹 인터페이스는 다음 주소로 제공됨:",
"form_error_port": "올바른 포트 값 입력",
"install_settings_dns": "DNS 서버",
"install_settings_dns_desc": "다음 주소의 DNS 서버를 사용하도록 장치 또는 라우터를 구성해야 합니다.",
"install_settings_all_interfaces": "모든 인터페이스",
"install_auth_title": "인증",
"install_auth_desc": "AdGuard Home 관리자 웹 인터페이스에 암호를 사용하는것이 권장됩니다. 로컬 네트워크에서만 액세스할 수 있더라도 혹시 모를 외부 액세스로부터 보호하는 것도 중요합니다.",
"install_auth_username": "사용자 이름",
"install_auth_password": "비밀번호",
"install_auth_confirm": "비밀번호 확인",
"install_auth_username_enter": "사용자 이름 입력",
"install_auth_password_enter": "비밀번호 입력",
"install_step": "단계",
"install_devices_title": "디바이스를 설정하기",
"install_devices_desc": "AdGuard Home을 사용하려면, 당신의 기기를 설정해야합니다.",
"install_submit_title": "축하합니다!",
"install_submit_desc": "구축 프로세스가 완료되었으며 이제 AdGuard Home을 사용할 준비가 되었습니다.",
"install_devices_router": "라우터",
"install_devices_router_desc": "이 설정은 이제 자동으로 당신의 집의 라우터에 연결된 모든 기기에 적용될 것이기에 수동으로 각각의 기기를 설정해줄 필요가 없습니다.",
"install_devices_address": "AdGuard Home DNS 서버는 다음의 주소를 받고 있습니다.",
"install_devices_router_list_1": "라우터의 환경 설정을 여세요. 환경 설정은 다음의 주소(http://192.168.0.1/ 혹은 http://192.168.1.1/)를 통해 브라우저로 접근 가능합니다. 비밀번호를 입력해야할 수 있습니다. 비밀번호를 잊었다면 대개 라우터 기기에 있는 버튼을 눌러 비밀번호를 초기화할 수 있습니다. 어떤 라우터들은 당신의 컴퓨터/핸드폰에 설치할 수 있는 특정 어플리케이션을 필요로합니다.",
"install_devices_router_list_2": "각각 1~3자리 숫자의 네 그룹으로 분할된 두 세트의 숫자를 허용하는 필드 옆에 있는 DNS 문자를 찾으세요.",
"install_devices_router_list_3": "AdGuard Home 서버 주소를 입력하세요",
"install_devices_windows_list_1": "시작 메뉴 또는 윈도우 검색을 통해 제어판을 여세요",
"install_devices_windows_list_2": "네트워크 및 인터넷 카테고리로 이동한 다음 네트워크 및 공유 센터로 이동하세요.",
"install_devices_windows_list_3": "화면 왼쪽에서 어댑터 설정 변경을 찾아 클릭하세요.",
"install_devices_windows_list_4": "활성 연결을 선택한 후 우클릭으로 속성을 선택하세요.",
"install_devices_windows_list_5": "목록에서 인터넷 프로토콜 버전 4 (TCP/IP) 를 찾아 선택하고 속성을 다시 클릭하세요.",
"install_devices_windows_list_6": "다음 DNS 서버 주소 사용을 선택하고 AdGuard Home 서버 주소 입력하세요.",
"install_devices_macos_list_1": "Apple 아이콘을 클릭하고 시스템 기본 설정으로 이동하세요.",
"install_devices_macos_list_2": "네트워크를 클릭하세요.",
"install_devices_macos_list_3": "목록에서 첫 번째 연결을 선택하고 고급을 클릭해주세요.",
"install_devices_macos_list_4": "DNS 탭을 선택하고 AdGuard Home 서버 주소를 입력하세요.",
"install_devices_android_list_1": "안드로이드 메뉴 홈 화면에서 설정을 누르세요.",
"install_devices_android_list_2": "메뉴에서 Wi-Fi를 클릭하세요. 사용 가능한 모든 네트워크가 나열된 화면이 표시됩니다 (모바일 연결을 위해 사용자 지정 DNS를 설정할 수 없습니다).",
"install_devices_android_list_3": "연결된 네트워크를 길게 누르고 네트워크 수정을 누르세요.",
"install_devices_android_list_4": "일부 장치에서는 추가설정을 하려면 고급란을 설정해야합니다. 안드로이드 DNS 설정을 조절하려면 IP설정을 DHCP에서 고정(Static) 으로 전환하세요.",
"install_devices_android_list_5": "설정된 DNS 1 및 DNS 2 값을 AdGuard Home 서버 주소로 변경하세요.",
"install_devices_ios_list_1": "홈 화면에서 설정을 누르세요.\n",
"install_devices_ios_list_2": "왼쪽 메뉴에서 Wi-Fi 선택하세요 ( 모바일 네트워크에 대한 DNS를 구성할 수 없습니다).\n",
"install_devices_ios_list_3": "현재 활성 네트워크의 이름을 누르세요.",
"install_devices_ios_list_4": "DNS 필드에 AdGuard Home 서버 주소를 입력하세요.",
"get_started": "시작하기",
"next": "다음",
"open_dashboard": "대시보드 열기",
"install_saved": "성공적으로 저장되었습니다",
"encryption_title": "암호화",
"encryption_desc": "DNS 및 관리자 웹 인터페이스에 대한 암호화 (HTTPS/TLS) 지원입니다.",
"encryption_config_saved": "암호화 구성이 저장되었습니다.",
"encryption_server": "서버 이름",
"encryption_server_enter": "도메인 이름을 입력하세요.",
"encryption_server_desc": "HTTPS를 사용하려면 SSL 인증서와 일치하는 서버 이름을 입력해야 합니다.",
"encryption_redirect": "HTTPS로 자동 리디렉션",
"encryption_redirect_desc": "상자를 체크하면 AdGuard Home 자동으로 사용자를 HTTP에서 HTTPS 주소로 리디렉션합니다.",
"encryption_https": "HTTP 포트",
"encryption_https_desc": "HTTPS 포트가 구성되면 HTTPS를 통해 AdGuard Home 관리자 인터페이스에 액세스할 수 있으며, '/dns-query' 위치에 DNS-over-HTTPS도 제공합니다.",
"encryption_dot": "DNS-over-TLS 포트",
"encryption_dot_desc": "이 포트가 구성된 경우 AdGuard Home 이 포트에서 DNS-over-TLS 서버를 실행합니다.",
"encryption_certificates": "인증서",
"encryption_certificates_desc": "암호화를 사용하려면 도메인에 대해 올바른 SSL 인증서 체인을 제공해야 합니다. <0>{{link}}</0>에서 무료 증명서를 받을 수도 있고, 신뢰할 수있는 인증 기관에서 구입할 수 있습니다.",
"encryption_certificates_input": "PEM으로 인코딩된 인증서 여기에 복사/붙여넣기하세요.",
"encryption_status": "상태",
"encryption_expire": "만료",
"encryption_key": "개인 키",
"encryption_key_input": "PEM으로 인코딩된 개인 키를 여기에 복사/붙여넣기하세요.",
"encryption_enable": "암호화 활성화 (HTTPS, DNS-over-HTTPS 및 DNS-over-TLS)",
"encryption_enable_desc": "암호화가 활성화 된 경우 AdGuard Home 관리자 인터페이스는 HTTPS를 통해 작동하고 DNS 서버는 DNS-over-HTTPS 및 DNS-over-TLS를 통해 요청을 수신합니다.",
"encryption_chain_valid": "인증서 체인이 유효합니다",
"encryption_chain_invalid": "인증서 체인이 유효하지 않습니다",
"encryption_key_valid": "유효한 {{type}} 개인 키 입니다.",
"encryption_key_invalid": "유효하지 않는 {{type}} 개인 키 입니다.",
"encryption_subject": "대상",
"encryption_issuer": "발행자",
"encryption_hostnames": "호스트 이름",
"encryption_reset": "암호화 설정을 재설정하시겠습니까?",
"topline_expiring_certificate": "SSL 인증서가 곧 만료됩니다. 업데이트<0> 암호화 설정</0>.",
"topline_expired_certificate": "SSL 인증서가 만료되었습니다. 업데이트<0> 암호화 설정</0>.",
"form_error_port_range": "80-65535 범위에서 포트 값을 입력해주세요.",
"form_error_port_unsafe": "안전하지 않은 포트입니다",
"form_error_equal": "동일하지 않아야 함",
"form_error_password": "비밀번호 불일치",
"reset_settings": "설정 초기화",
"update_announcement": "AdGuard Home {{version}} 사용 가능합니다! <0>이곳</0>을 클릭하여 더 많은 정보를 확인하세요.",
"setup_guide": "설치 안내",
"dns_addresses": "DNS 주소",
"down": "다운로드",
"fix": "수정",
"dns_providers": "여기에 선택가능한 DNS 목록 </0>이 있습니다.",
"update_now": "지금 업데이트",
"update_failed": "자동 업데이트 실패 되었습니다. <a href='https://github.com/AdguardTeam/AdGuardHome/wiki/Getting-Started#update'> 단계를 따라 수동으로 업데이트하세요</a>",
"processing_update": "잠시만 기다려주세요, AdGuard Home가 업데이트 중입니다.",
"clients_title": "클라이언트",
"clients_desc": "AdGuard Home에 연결할 기기들을 설정",
"settings_global": "글로벌",
"settings_custom": "사용자",
"table_client": "클라이언트",
"table_name": "이름",
"save_btn": "저장",
"client_add": "클라이언트 추가",
"client_new": "새 클라이언트",
"client_edit": "클라이언트 수정",
"client_identifier": "식별자",
"ip_address": "IP 주소",
"form_enter_ip": "IP 입력",
"form_enter_mac": "MAC 입력",
"form_client_name": "클라이언트 이름 입력",
"client_global_settings": "글로벌 설정 사용",
"client_deleted": "클라이언트 \"{{key}}\"가 정상적으로 삭제되었습니다",
"client_added": "클라이언트 \"{{key}}\"가 정상적으로 추가되었습니다",
"client_updated": "클라이언트 \"{{key}}\"가 정상적으로 업데이트되었습니다",
"clients_not_found": "클라이언트 없음",
"client_confirm_delete": "정말 클라이언트 \"{{key}}\" 삭제하시겠습니까?",
"filter_confirm_delete": "정말 이 필터를 삭제하시겠습니까?",
"auto_clients_title": "클라이언트 (런타임)",
"auto_clients_desc": "AdGuard Home을 사용하지만 구성에 저장되지 않은 클라이언트의 데이터입니다.",
"access_title": "접근 설정",
"access_desc": "여기에서 AdGuard Home DNS 서버에 대한 액세스 규칙을 구성할 수 있습니다.",
"access_allowed_title": "허용된 클라이언트",
"access_allowed_desc": "CIDR 또는 IP 주소 목록입니다. 구성된 경우 AdGuard Home은 이러한 IP 주소의 요청만 수락할 수 있습니다.",
"access_disallowed_title": "차단된 클라이언트",
"access_disallowed_desc": "CIDR 또는 IP 주소 목록입니다. 구성된 경우 AdGuard Home은 이러한 IP 주소의 요청을 삭제합니다.",
"access_blocked_title": "차단된 도메인",
"access_blocked_desc": "필터와 혼동하지 마세요. AdGuard Home은 쿼리의 질문에서 이러한 도메인의 DNS 쿼리를 삭제합니다.",
"access_settings_saved": "액세스 설정이 성공적으로 저장되었습니다.",
"updates_checked": "업데이트가 성공적으로 확인되었습니다",
"updates_version_equal": "AdGuard Home 최신 상태입니다.",
"check_updates_now": "지금 업데이트 확인",
"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> 사용하세요.",
"setup_dns_privacy_3": "<0>암호화된 DNS 프로토콜은 Android 9에서만 지원됩니다. 다른 운영 체제를 위한 추가 소프트웨어를 설치해야 합니다.</0><0>사용할 수 있는 소프트웨어 목록입니다. </0>",
"setup_dns_privacy_android_1": "Android 9는 기본적으로 DNS-over-TLS를 지원합니다. 구성하려면 설정 → 네트워크 및 인터넷 → 고급 → 개인 DNS로 이동하여 도메인 이름을 입력하세요.",
"setup_dns_privacy_android_2": "<0>Android용 AdGuard</0>DNS-over-HTTPS <1>및</1> DNS-over-TLS <1>지원합니다</1>",
"setup_dns_privacy_android_3": "<0>인트라</0> 안드로이드에 <1>DNS-over-HTTPS </1>지원 추가합니다.",
"setup_dns_privacy_ios_1": "<0>DNSCloak은</0> <1>DNS-over-HTTPS를</1> 지원하지만, 자신의 서버를 사용하도록 구성하려면 <2>DNS 스탬프를</2> 생성해야 합니다.",
"setup_dns_privacy_ios_2": "<0>iOS용 AdGuard는</0> <1>DNS-over-HTTPS </1>및 <1>DNS-over-TLS</1> 설정을 지원합니다.",
"setup_dns_privacy_other_title": "기타 구현",
"setup_dns_privacy_other_1": "AdGuard Home 모든 플랫폼에서 안전한 DNS 클라이언트가 될 수 있습니다.",
"setup_dns_privacy_other_2": "<0>dnsproxy는</0> 알려진 모든 안전한 DNS 프로토콜을 지원합니다.",
"setup_dns_privacy_other_3": "<0>dnscrypt-proxy</0> <1>DNS-over-HTTPS</1> 지원합니다.",
"setup_dns_privacy_other_4": "<0>Mozilla Firefox</0><1>DNS-over-HTTPS</1>지원합니다.",
"setup_dns_privacy_other_5": "<0>이곳이나</0> <1>이곳을</1> 클릭하여 더 많은 구현에 대한 정보를 확인하세요.",
"setup_dns_notice": "<1>DNS-over-HTTPS</1> 또는 <1>DNS-over-TLS를</1> 사용하려면 AdGuard Home 설정에서 <0>암호화를 구성해야 합니다.</0>",
"rewrite_added": "\"{{key}}\"에 대한 DNS 수정 정보를 성공적으로 추가 됩니다.",
"rewrite_deleted": "\"{{key}}\"에 대한 DNS 수정 정보를 성공적으로 삭제 됩니다.",
"rewrite_add": "DNS 변환 정보를 추가합니다",
"rewrite_not_found": "DNS 변경 정보를 찾을 수 없습니다",
"rewrite_confirm_delete": "\"{{key}}\"에 대한 DNS 변경 정보를 삭제하시겠습니까?",
"rewrite_desc": "특정 도메인 이름에 대한 사용자 지정 DNS 응답을 쉽게 구성할 수 있습니다.",
"rewrite_applied": "적용된 변경 규칙",
"dns_rewrites": "DNS 변경",
"form_domain": "도메인을 입력하세요",
"form_answer": "IP 주소 또는 도메인 이름을 입력하세요",
"form_error_domain_format": "도메인 형식이 잘못되었습니다",
"form_error_answer_format": "답변 형식이 잘못되었습니다. ",
"configure": "설정하기",
"main_settings": "기본 설정",
"block_services": "특정 서비스 차단",
"blocked_services": "차단된 서비스",
"blocked_services_desc": "인기 있는 사이트와 서비스를 빠르게 차단할 수 있습니다.",
"blocked_services_saved": "차단된 서비스가 성공적으로 저장되었습니다.",
"blocked_services_global": "글로벌 차단 서비스 사용",
"blocked_service": "차단된 서비스",
"block_all": "차단",
"unblock_all": "차단 해제",
"encryption_certificate_path": "인증서 경로",
"encryption_private_key_path": "비밀키 경로",
"encryption_certificates_source_path": "인증서 파일 경로 설정",
"encryption_certificates_source_content": "인증서 내용 붙여넣기",
"encryption_key_source_path": "비밀키 파일 경로 설정",
"encryption_key_source_content": "비밀키 내용 붙여넣기",
"stats_params": "통계 구성",
"config_successfully_saved": "설정이 성공적으로 저장되었습니다.",
"interval_24_hour": "24시간",
"interval_days": "{{value}} 일",
"interval_days_plural": "{{count}} 일",
"domain": "도메인",
"answer": "응답",
"filter_added_successfully": "필터가 성공적으로 추가되었습니다.",
"statistics_configuration": "통계 구성",
"statistics_retention": "통계 저장 기간",
"statistics_retention_desc": "값을 줄이면 설정한 값보다 오래된 데이터가 소멸됩니다.",
"statistics_clear": " 통계 초기화",
"statistics_clear_confirm": "통계를 정말로 초기화하시겠습니까?",
"statistics_retention_confirm": "정말로 통계 저장 기간을 변경하시겠습니까? 저장 주기를 낮출 경우, 일부 데이터가 손실됩니다",
"statistics_cleared": "통계를 성공적으로 초기화했습니다.",
"interval_hours": "{{count}} 시간",
"interval_hours_plural": "{{count}} 시간",
"filters_configuration": "필터 구성",
"filters_enable": "필터 활성화",
"filters_interval": "필터 업데이트 주기",
"disabled": "비활성화 됨",
"username_label": "사용자 이름",
"username_placeholder": "사용자 이름 입력",
"password_label": "비밀번호",
"password_placeholder": "비밀번호 입력",
"sign_in": "로그인",
"sign_out": "로그아웃",
"forgot_password": "비밀번호를 잊어버렸나요?",
"forgot_password_desc": "다음과 같은 <0>단계</0>를 따라 귀하의 사용자 계정을 위한 새로운 비밀번호를 생성하세요.",
"location": "위치",
"orgname": "단체 이름",
"netname": "네트워크 이름",
"descr": "설명",
"whois": "후이즈",
"filtering_rules_learn_more": "차단 리스트를 직접 호스트하는 법을 <0>알아보세요</0>."
}

View File

@@ -0,0 +1,347 @@
{
"client_settings": "cliënt Instellingen",
"example_upstream_reserved": "specificeer een DNS upstream <0>voor een specifiek domein(en)</0>",
"upstream_parallel": "Gebruik parallelle query's om het oplossen te versnellen door gelijktijdig alle upstream-servers te queryen",
"bootstrap_dns": "Bootstrap DNS servers",
"bootstrap_dns_desc": "Bootstrap DNS-servers worden gebruikt om IP-adressen op te lossen van de DoH / DoT-resolvers die u opgeeft als upstreams.",
"check_dhcp_servers": "Zoek achter DHCP servers",
"save_config": "Configuratie opslaan",
"enabled_dhcp": "DHCP server inschakelen",
"disabled_dhcp": "DHCP server uitschakelen",
"dhcp_title": "DHCP server (experimenteel!)",
"dhcp_description": "Indien je router geen DHCP instellingen heeft,kan je AdGuard's eigen ingebouwde DHCP server gebruiken.",
"dhcp_enable": "DHCP server inschakelen",
"dhcp_disable": "DHCP server uitschakelen",
"dhcp_not_found": "Geen actieve DHCP servers gevonden op het netwerk. Het is VEILIG om de ingebouwde DHCP server in te schakelen",
"dhcp_found": "Actieve DHCP server(s) gevonden op het netwerk. het is NIET veilig om de ingebouwde DHCP server in te schakelen.",
"dhcp_leases": "DHCP lease overzicht",
"dhcp_leases_not_found": "Geen DHCP lease gevonden",
"form_error_required": "Vereist veld",
"form_error_ip4_format": "Ongeldig IPv4 formaat",
"form_error_ip6_format": "Ongeldig IPv6 formaat",
"form_error_mac_format": "Ongeldig MAC formaat.",
"form_error_positive": "Moet groter zijn dan 0",
"dhcp_form_gateway_input": "Gateway IP",
"dhcp_form_subnet_input": "Subnet mask",
"dhcp_form_range_title": "Bereik van IP adressen",
"dhcp_form_range_start": "Eerste adres",
"dhcp_form_range_end": "Laatste adres",
"dhcp_form_lease_title": "DHCP lease tijd (in seconden)",
"dhcp_form_lease_input": "Lease tijd totaal",
"dhcp_interface_select": "Selecteer DHCP interface",
"dhcp_hardware_address": "Hardware adres",
"dhcp_ip_addresses": "IP adressen",
"dhcp_table_hostname": "Host naam",
"dhcp_table_expires": "Verloopt op",
"dhcp_warning": "Indien je de ingebouwde DHCP server wilt inschakelen, let dan op dat er geen andere actieve DHCP server aanwezig is. Dit kan de internet verbinding instabiel maken!.",
"dhcp_new_static_lease": "Voeg static lease toe",
"dhcp_static_leases_not_found": "Geen DHCP static lease gevonden",
"dhcp_add_static_lease": "Voeg statische lease toe",
"dhcp_reset": "Weet je zeker dat je de DHCP configuratie wil resetten?",
"delete_confirm": "Ben je zeker dat je \"{{key}}\" wilt verwijderen?",
"form_enter_hostname": "Vul hostnaam in",
"error_details": "Fout details",
"back": "Terug",
"dashboard": "Dashboard",
"settings": "Instellingen",
"filters": "Filters",
"query_log": "Query log",
"faq": "Veel gestelde vragen",
"version": "Versie",
"address": "IP-adres",
"on": "Aan",
"off": "Uit",
"copyright": "Copyright",
"homepage": "Startpagina",
"report_an_issue": "Rapporteer een probleem",
"privacy_policy": "Privacybeleid",
"enable_protection": "Schakel bescherming in",
"enabled_protection": "Bescherming ingeschakeld",
"disable_protection": "Schakel bescherming uit",
"disabled_protection": "Bescherming uitgeschakeld",
"refresh_statics": "Ververs statistieken",
"dns_query": "DNS-queries",
"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_days_plural": "sinds de laatste {{count}} dagen",
"no_domains_found": "Geen domeinen gevonden",
"requests_count": "Verzoek teller",
"top_blocked_domains": "Top geblokkeerde domeinen",
"top_clients": "Top gebruikers",
"no_clients_found": "Geen gebruikers gevonden",
"general_statistics": "Generieke statistieken",
"number_of_dns_query_days_plural": "Aantal verwerkte DNS aanvragen van de laatste {{count}} dagen",
"number_of_dns_query_24_hours": "Aantal verwerkte aanvragen van de laatste 24 uur",
"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 security module",
"number_of_dns_query_blocked_24_hours_adult": "Opgevraagde 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",
"average_processing_time_hint": "Gemiddelde verwerkingstijd in milliseconden van een DNS aanvraag",
"block_domain_use_filters_and_hosts": "Blokkeerd domeinen dmv filters en host bestanden",
"filters_block_toggle_hint": "Je kunt blokkeer regels toevoegen in de <a href='#filters'>Filters</a>instellingen",
"use_adguard_browsing_sec": "Gebruik AdGuardBrowsing Security web service",
"use_adguard_browsing_sec_hint": "AdGuard Home controleert of het domein in de blokkeerlijst voorkomt dmv Browsing Security web service. Dit gebeurt dmv een privacy vriendelijk API verzoek:een korte prefix van de domein naam met SHA256 hash wordt verzonden naar de server.",
"use_adguard_parental": "Gebruik AdGuard Ouderlijk toezicht web service",
"use_adguard_parental_hint": "AdGuard Home controleert of het domein 18+ content bevat. Dit gebeurt dmv dezelfde privacy vriendelijke API als de Browsing Security web service.",
"enforce_safe_search": "Forceer Veilig Zoeken",
"no_servers_specified": "Geen servers gespecificeerd",
"general_settings": "Generieke instellingen",
"dns_settings": "DNS Instellingen",
"encryption_settings": "Encryptie Instellingen",
"dhcp_settings": "DHCP Instellingen",
"upstream_dns": "Upstream DNS servers",
"test_upstream_btn": "Test upstream",
"upstreams": "Upstreams",
"apply_btn": "Toepassen",
"disabled_filtering_toast": "Filters uitgeschakeld",
"enabled_filtering_toast": "Filters ingeschakeld",
"disabled_safe_browsing_toast": "Veilig browsen uitgeschakeld",
"enabled_safe_browsing_toast": "Veilig browsen ingeschakeld",
"disabled_parental_toast": "Ouderlijk toezicht uitgeschakeld",
"enabled_parental_toast": "Ouderlijk toezicht ingeschakeld",
"disabled_safe_search_toast": "Veilig zoeken uitgeschakeld",
"enabled_save_search_toast": "Veilig zoeken ingeschakeld",
"enabled_table_header": "Ingeschakeld",
"name_table_header": "Naam",
"filter_url_table_header": "Filter URL",
"rules_count_table_header": "Aantal regels",
"last_time_updated_table_header": "Laatste update",
"actions_table_header": "Actie",
"edit_table_action": "Bewerk",
"delete_table_action": "Verwijderen",
"filters_and_hosts": "Filters en hosts blokkeerlijsten",
"filters_and_hosts_hint": "AdGuard Home kan overweg met basic adblock regels en hosts bestanden syntaxis.",
"no_filters_added": "Geen filters toegevoegd",
"add_filter_btn": "Filter toevoegen",
"cancel_btn": "Annuleren",
"enter_name_hint": "Voeg naam toe",
"enter_url_hint": "Voeg URL toe",
"check_updates_btn": "Controleer op updates",
"new_filter_btn": "Nieuw filter abonnement",
"enter_valid_filter_url": "Voer een geldige URL in voor een filterabonnement of een hosts-bestand.",
"custom_filter_rules": "Aangepaste filterregels",
"custom_filter_rules_hint": "Voer één regel op een regel in. U kunt adblock-regels gebruiken of de syntaxis van hosts-bestanden gebruiken.",
"examples_title": "Voorbeelden",
"example_meaning_filter_block": "blokkeer toegang tot het example.org domein en alle subdomeinen",
"example_meaning_filter_whitelist": "deblokkering van toegang tot het example.org-domein en alle bijbehorende subdomeinen",
"example_meaning_host_block": "AdGuard Home zal nu het adres 127.0.0.1 voor het domein example.org retourneren (maar niet de subdomeinen).",
"example_comment": "! Hier komt een opmerking",
"example_comment_meaning": "zomaar een opmerking",
"example_comment_hash": "# Nog een opmerking",
"example_upstream_regular": "standaard DNS (over UDP)",
"example_upstream_dot": "versleutelde<a href='https://en.wikipedia.org/wiki/DNS_over_TLS' target='_blank'>DNS-over-TLS</a>",
"example_upstream_doh": "versleutelde<a href='https://en.wikipedia.org/wiki/DNS_over_HTTPS' target='_blank'>DNS-over-HTTPS</a>",
"example_upstream_sdns": "je kunt <a href='https://dnscrypt.info/stamps/' target='_blank'>DNS Stamps</a> voor <a href='https://dnscrypt.info/' target='_blank'>DNSCrypt</a> of <a href='https://en.wikipedia.org/wiki/DNS_over_HTTPS' target='_blank'>DNS-over-HTTPS</a> resolvers",
"example_upstream_tcp": "standaard DNS (over TCP)",
"all_filters_up_to_date_toast": "Alle filters zijn al up-to-date",
"updated_upstream_dns_toast": "De upstream DNS-servers zijn bijgewerkt",
"dns_test_ok_toast": "Opgegeven DNS-servers werken correct",
"dns_test_not_ok_toast": "Server \"{{key}}\": kon niet worden gebruikt, controleer of u het correct hebt geschreven",
"unblock_btn": "Deblokkeer",
"block_btn": "Blokkeer",
"time_table_header": "Tijd",
"domain_name_table_header": "Domein naam",
"type_table_header": "Type",
"response_table_header": "Antwoord",
"client_table_header": "Gebruiker",
"empty_response_status": "Leeg",
"show_all_filter_type": "Toon alles",
"show_filtered_type": "Toon gefilterde",
"no_logs_found": "Geen log bestanden gevonden",
"refresh_btn": "Verversen",
"previous_btn": "Vorige",
"next_btn": "Volgende",
"loading_table_status": "Laden...",
"page_table_footer_text": "Pagina",
"of_table_footer_text": "van",
"rows_table_footer_text": "rijen",
"updated_custom_filtering_toast": "Aangepaste filter regels zijn bijgewerkt",
"rule_removed_from_custom_filtering_toast": "Regel verwijderd uit de aangepaste filterregels",
"rule_added_to_custom_filtering_toast": "Regel toegevoegd aan de aangepaste filterregels",
"query_log_response_status": "Status: {{value}}",
"query_log_filtered": "Gefilterd door {{filter}}",
"source_label": "Bron",
"found_in_known_domain_db": "Gevonden in de bekende domeingegevensbank.",
"category_label": "Categorie",
"rule_label": "Regel",
"filter_label": "Filter",
"unknown_filter": "Onbekend filter {{filterId}}",
"install_welcome_title": "Welkom bij AdGuard Home!",
"install_welcome_desc": "AdGuard Home is een netwerk DNS server die advertenties en trackers blokkeert. Het doel is om jou controle te geven over je gehele netwerk en al je apparaten, en er hoeft geen client-side programma te worden gebruikt.",
"install_settings_title": "Admin webinterface",
"install_settings_listen": "Luister interface",
"install_settings_port": "Poort",
"install_settings_interface_link": "De webinterface van AdGuard Home admin is beschikbaar op de volgende adressen:",
"form_error_port": "Voer geldige poortwaarde in",
"install_settings_dns": "DNS server",
"install_settings_dns_desc": "U moet uw apparaten of router configureren om de DNS-server te gebruiken op de volgende adressen:",
"install_settings_all_interfaces": "Alle interfaces",
"install_auth_title": "Authenticatie",
"install_auth_username": "Gebruikersnaam",
"install_auth_password": "Wachtwoord",
"install_auth_confirm": "Bevestig wachtwoord",
"install_auth_username_enter": "Voer gebruikersnaam in",
"install_auth_password_enter": "Voer wachtwoord in",
"install_step": "Stap",
"install_devices_title": "Configureer uw apparaten",
"install_devices_desc": "Om AdGuard Home te laten werken, moet u uw apparaten configureren om deze te gebruiken.",
"install_submit_title": "Gefeliciteerd!",
"install_submit_desc": "De instellingsprocedure is voltooid en u bent klaar om AdGuard Home te gebruiken.",
"install_devices_router": "Router",
"install_devices_router_desc": "Deze setup zal automatisch alle apparaten die op uw thuisrouter zijn aangesloten dekken en u hoeft ze niet allemaal handmatig te configureren.",
"install_devices_address": "AdGuard Home DNS-server luistert naar de volgende adressen",
"install_devices_router_list_1": "Open de instellingen pagina voor uw router. Meestal kunt u deze vanuit uw browser openen via een URL (zoals http://192.168.0.1/ of http://192.168.1.1/). Mogelijk wordt u gevraagd om het wachtwoord in te voeren. Als u het niet meer weet, kunt u het wachtwoord vaak opnieuw instellen door op een knop op de router zelf te drukken. Voor sommige routers is een specifieke toepassing vereist, die in dat geval al op uw computer / telefoon moet zijn geïnstalleerd.",
"install_devices_router_list_2": "Zoek de DHCP/DNS-instellingen. Zoek naar de DNS-letters naast een veld dat twee of drie reeksen nummers toestaat, elk verdeeld in vier groepen van één tot drie cijfers.",
"install_devices_router_list_3": "Voer je AdGuard Home server adressen daar in.",
"install_devices_windows_list_1": "Open het Configuratiescherm via het menu Start of Windows zoeken.",
"install_devices_windows_list_2": "Ga naar de categorie Netwerk en Internet en vervolgens naar Netwerkcentrum.",
"install_devices_windows_list_3": "Zoek aan de linkerkant van het scherm Adapter-instellingen wijzigen en klik erop.",
"install_devices_windows_list_4": "Selecteer uw actieve verbinding, klik er met de rechtermuisknop op en kies Eigenschappen.",
"install_devices_windows_list_5": "Zoek Internet Protocol versie 4 (TCP / IP) in de lijst, selecteer het en klik vervolgens opnieuw op Eigenschappen.",
"install_devices_windows_list_6": "Kies Gebruik de volgende DNS-serveradressen en voer uw AdGuard Home-serveradressen in.",
"install_devices_macos_list_1": "Klik op het Apple-pictogram en ga naar Systeemvoorkeuren.",
"install_devices_macos_list_2": "Klik op Netwerk.",
"install_devices_macos_list_3": "Selecteer de eerste verbinding in uw lijst en klik op Geavanceerd.",
"install_devices_macos_list_4": "Selecteer het tabblad DNS en voer uw AdGuard Home-serveradressen in.",
"install_devices_android_list_1": "Tik op het startscherm van het Android-menu op Instellingen.",
"install_devices_android_list_2": "Tik op wifi in het menu. Het scherm met alle beschikbare netwerken wordt getoond (het is niet mogelijk om een aangepaste DNS in te stellen voor een mobiele verbinding).",
"install_devices_android_list_3": "Druk lang op het netwerk waarmee je bent verbonden en tik op Netwerk instellingen aanpassen.",
"install_devices_android_list_4": "Op sommige apparaten moet u het vakje aanvinken voor Geavanceerd om verdere instellingen te bekijken. Om uw Android DNS-instellingen aan te passen, moet u de IP-instellingen wijzigen van DHCP in Statisch.",
"install_devices_android_list_5": "Wijzig de DNS 1-waarden en DNS 2-waarden in uw AdGuard Home-serveradressen.",
"install_devices_ios_list_1": "Tik op het startscherm op Instellingen.",
"install_devices_ios_list_2": "Kies Wi-Fi in het linkermenu (DNS kan niet worden geconfigureerd voor mobiele netwerken).",
"install_devices_ios_list_3": "Tik op de naam van het momenteel actieve netwerk.",
"install_devices_ios_list_4": "Voer in het DNS-veld uw AdGuard Home-serveradressen in.",
"get_started": "Beginnen",
"next": "Volgende",
"open_dashboard": "Open Dashboard",
"install_saved": "Succesvol opgeslagen",
"encryption_title": "Encryptie",
"encryption_desc": "Encryptie (HTTPS/TLS) ondersteuning voor DNS en admin web interface",
"encryption_config_saved": "Encryptie configuratie opgeslagen",
"encryption_server": "Server naam",
"encryption_server_enter": "Voer domein naam in",
"encryption_server_desc": "Om HTTPS te gebruiken, voer de naam in van de server overeenkomstig met het SSL certificaat.",
"encryption_redirect": "Herleid automatisch naar HTTPS",
"encryption_redirect_desc": "Indien ingeschakeld, zal AdGuard Home je automatisch herleiden van HTTP naar HTTPS.",
"encryption_https": "HTTPS poort",
"encryption_https_desc": "Als de HTTPS-poort is geconfigureerd, is de AdGuard Home beheerders interface toegankelijk via HTTPS en biedt deze ook DNS-over-HTTPS op de locatie '/ dns-query'.",
"encryption_dot": "DNS-over-TLS poort",
"encryption_dot_desc": "Indien deze poort is geconfigureerd, zal AdGuard Home gebruik maken van een DNS-over-TLS server via deze poort.",
"encryption_certificates": "Certificaten",
"encryption_certificates_desc": "Om encryptie te gebruiken, moet u een geldige SSL certificaat voor uw domein opgeven. U kunt een gratis certificaat krijgen op <0> {{link}} </0> of u kunt het kopen bij een van de vertrouwde certificaatautoriteiten.",
"encryption_certificates_input": "Kopieër en plak je PEM-gecodeerde certificaten hier.",
"encryption_status": "Status",
"encryption_expire": "Verloopt",
"encryption_key": "Prive sleutel",
"encryption_key_input": "Kopieër en plak je PEM-gecodeerde prive sleutel voor je certificaat hier.",
"encryption_enable": "Activeer encryptie (HTTPS, DNS-over-HTTPS, en DNS-over-TLS)",
"encryption_enable_desc": "Als encryptie is geactiveerd, is de AdGuard Home beheerders interface toegankelijk via HTTPS en de DNS-server zal luisteren naar aanvragen via DNS-over-HTTPS en DNS-over-TLS.",
"encryption_chain_valid": "certificaatketen is geldig",
"encryption_chain_invalid": "certificaatketen is ongeldig",
"encryption_key_valid": "Dit is een geldig {{type}} privé sleutel",
"encryption_key_invalid": "Dit is een ongeldig {{type}} privé sleutel",
"encryption_subject": "Onderwerp",
"encryption_issuer": "Uitgever",
"encryption_hostnames": "Hostnamen",
"encryption_reset": "Ben je zeker dat je de encryptie instellingen wil resetten?",
"topline_expiring_certificate": "Jouw SSL certificaat vervalt binnenkort. Update <0>Encryptie instellingen</0>.",
"topline_expired_certificate": "Jouw SSL certificaat is vervallen. Update <0>Encryptie instellingen</0>.",
"form_error_port_range": "Vul poort in tussen 80 en 65535",
"form_error_port_unsafe": "Dit is een onveilige poort",
"form_error_equal": "Zou niet gelijk mogen zijn",
"form_error_password": "Wachtwoord komt niet overeen",
"reset_settings": "Reset Instellingen",
"update_announcement": "AdGuard Home{{version}} is nu beschikbaar! <0>klik hier</0> voor meer info.",
"setup_guide": "Installatie gids",
"dns_addresses": "DNS adressen",
"dns_start": "DNS server aan het opstarten",
"dns_status_error": "Fout bij het oproepen van de DNS server status",
"down": "Uitgeschakeld",
"fix": "Los op",
"dns_providers": "hier is een <0>lijst of gekende DNS providers</0> waarvan je kan kiezen.",
"update_now": "Update nu",
"update_failed": "Auto-update is mislukt. Volg <a href='https://github.com/AdguardTeam/AdGuardHome/wiki/Getting-Started#update'>de volgende stappen</a> om manueel te updaten.",
"processing_update": "Even geduld, AdGuard Home wordt bijgewerkt",
"clients_title": "Gebruikers",
"clients_desc": "Configureer apparaten die gebruik maken van AdGuard Home",
"settings_global": "Globaal",
"settings_custom": "Aangepast",
"table_client": "Gebruiker",
"table_name": "Naam",
"save_btn": "Bewaar",
"client_add": "Voeg gebruiker toe",
"client_new": "Nieuwe gebruiker",
"client_edit": "Wijzig gebruiker",
"client_identifier": "Identificeer via",
"ip_address": "IP adres",
"form_enter_ip": "Vul IP in",
"form_enter_mac": "Vul MAC in",
"form_enter_id": "ID invoeren",
"form_add_id": "ID toevoegen",
"form_client_name": "Vul gebruikersnaam in",
"client_global_settings": "Gebruik globale instelling",
"client_deleted": "Gebruiker \"{{key}}\" met succes verwijderd",
"client_added": "Gebruiker \"{{key}}\" met succes toegevoegd",
"client_updated": "Gebruiker \"{{key}}\" met succes ge-updated",
"clients_not_found": "Geen gebruikers gevonden",
"client_confirm_delete": "Ben je zeker dat je deze gebruiker \"{{key}}\" wilt verwijderen?",
"filter_confirm_delete": "Ben je zeker dat je deze filter wilt verwijderen?",
"auto_clients_title": "Gebruikers (runtime)",
"auto_clients_desc": "Data over gebruikers die AdGuard Home gebruiken, maar niet geconfigureerd zijn",
"access_title": "Toegangs instellingen",
"access_desc": "Hier kan je toegangsregels voor de AdGuard Home DNS server instellen.",
"access_allowed_title": "Toegestane gebruikers",
"access_allowed_desc": "Een lijst van CIDR of IP adressen. Indien ingesteld, zal AdGuard Home alleen van deze IP adressen aanvragen accepteren.",
"access_disallowed_title": "Verworpen gebruikers",
"access_disallowed_desc": "Een lijst van CIDR of IP adressen. Indien ingesteld, zal AdGuard Home aanvragen van deze IP adressen verwerpen.",
"access_blocked_title": "Geblokkeerde domeinen",
"access_blocked_desc": "Verwar dit niet met filters. AdGuard Home zal deze DNS-zoekopdrachten laten vallen.",
"access_settings_saved": "Toegangsinstellingen met succes opgeslagen",
"updates_checked": "Met succes op updates gecontroleerd",
"updates_version_equal": "AdGuard Home is up-to-date",
"check_updates_now": "Controleer op updates",
"dns_privacy": "DNS Privacy",
"setup_dns_privacy_1": "<0>DNS-over-TLS:</0> Gebruik <1>{{address}}</1> string.",
"setup_dns_privacy_2": "<0>DNS-over-HTTPS:</0> Gebruik <1>{{address}}</1> string.",
"setup_dns_privacy_3": "<0>Hou er rekening mee dat het beveiligde DNS protocol alleen beschikbaar is voor Android 9. U moet dus extra software installeren voor andere besturingssystemen.</0><0>Hier is een lijst van te gebruiken software.</0>",
"setup_dns_privacy_other_title": "Overig gebruik",
"setup_dns_privacy_other_1": "AdGuard Home kan op elk platform een veilige DNS-client zijn.",
"form_domain": "Vul domein in",
"form_answer": "Vul IP adres of domeinnaam in",
"form_error_domain_format": "Ongeldige domeinnaam",
"form_error_answer_format": "Ongeldig antwoord",
"configure": "Bewerk",
"main_settings": "Algemene instellingen",
"block_services": "Specifieke services blokkeren",
"blocked_services": "Geblokkeerde services",
"blocked_services_desc": "Hiermee kunt u populaire sites en services snel blokkeren.",
"blocked_services_saved": "Geblokkeerde services succesvol opgeslagen",
"blocked_services_global": "Gebruik algemeen geblokkeerde services",
"blocked_service": "Geblokkeerde service",
"block_all": "Blokkeer alles",
"unblock_all": "Deblokkeer alles",
"encryption_certificate_path": "Certificaat pad",
"encryption_private_key_path": "Privé sleutel pad",
"encryption_certificates_source_path": "Certificaten bestandspad instellen",
"encryption_certificates_source_content": "Inhoud certificaten plakken",
"encryption_key_source_path": "Privé sleutelbestand instellen",
"encryption_key_source_content": "Inhoud privé sleutel plakken",
"stats_params": "Statistieken configuratie",
"config_successfully_saved": "Configuratie succesvol opgeslagen",
"interval_24_hour": "24 uur",
"interval_days_plural": "{{count}} dagen",
"domain": "Domein",
"answer": "Antwoord",
"filter_added_successfully": "Het filter is succesvol toegevoegd",
"statistics_retention": "Statistieken retentie",
"statistics_retention_desc": "Als je de interval waarde vermindert, zullen sommige gegevens verloren gaan",
"statistics_clear": " Statistieken wissen",
"statistics_clear_confirm": "Alle statistieken werkelijk wissen?",
"statistics_cleared": "Statistieken succesvol gewist",
"blocked_by_response": "Geblokkeerd door CNAME of IP als antwoord"
}

View File

@@ -0,0 +1,403 @@
{
"client_settings": "Klientinnstillinger",
"example_upstream_reserved": "du kan bestemme en oppstrøms-DNS <0>for et spesifikt domene(r)</0>",
"upstream_parallel": "Bruk parallele forespørsler for å få oppfarten på behandlinger, ved å forespørre til alle oppstrømstjenerne samtidig",
"bootstrap_dns": "Bootstrap-DNS-tjenere",
"bootstrap_dns_desc": "Bootstrap-DNS-tjenere brukes til å oppklare IP-adressene til DoH/DoT-oppklarerene som du har valgt som oppstrømstjenere.",
"check_dhcp_servers": "Se etter DHCP-tjenere",
"save_config": "Lagre oppsettet",
"enabled_dhcp": "DHCP-tjeneren ble skrudd på",
"disabled_dhcp": "DHCP-tjeneren ble skrudd av",
"dhcp_title": "DHCP-tjener (eksperimentell!)",
"dhcp_description": "Dersom ruteren din ikke har DHCP-innstillinger, kan du bruke AdGuard Home sin egen innebygde DHCP-tjener.",
"dhcp_enable": "Skru på DHCP-tjeneren",
"dhcp_disable": "Skru av DHCP-tjeneren",
"dhcp_not_found": "Det er trygt å skru på den innebygde DHCP-tjeneren - vi kunne ikke finne noen aktive DHCP-tjenere i nettverket. Men vi oppfordrer deg til å dobbeltsjekke manuelt, siden vår automatiske test ikke gir 100% sikre svar ennå.",
"dhcp_found": "En aktiv DHCP-tjener ble oppdaget i nettverket. Det er ikke trygt å bruke den innebygde DHCP-tjeneren.",
"dhcp_leases": "DHCP-leieavtaler",
"dhcp_static_leases": "Statiske DHCP-leieavtaler",
"dhcp_leases_not_found": "Ingen DHCP-leieavtaler ble funnet",
"form_error_required": "Påkrevd felt",
"form_error_ip4_format": "Ugyldig IPv4-format",
"form_error_ip6_format": "Ugyldig IPv6-format",
"form_error_ip_format": "Ugyldig IPv4-format",
"form_error_mac_format": "Ugyldig MAC-format",
"form_error_positive": "Må være høyere enn 0",
"dhcp_form_gateway_input": "Gateway-IP",
"dhcp_form_subnet_input": "Nettverksmaske",
"dhcp_form_range_title": "Spennvidden til IP-adressene",
"dhcp_form_range_start": "Rekkeviddestart",
"dhcp_form_range_end": "Rekkeviddeslutt",
"dhcp_form_lease_title": "DHCP-leieavtalevarighet (i sekunder)",
"dhcp_form_lease_input": "Leieavtalenes varighet",
"dhcp_interface_select": "Velg DHCP-grensesnitt",
"dhcp_hardware_address": "Maskinvareadresse",
"dhcp_ip_addresses": "IP-adresser",
"dhcp_table_hostname": "Vertsnavn",
"dhcp_table_expires": "Utløper",
"dhcp_warning": "Hvis du vil aktivere DHCP-tjeneren likevel, så sørg for at det ikke er noen andre aktive DHCP-tjenere i nettverket ditt. Ellers kan det knekke internettilgangen til tilkoblede enheter!",
"dhcp_error": "Vi klarte ikke å fastslå om det er en annen DHCP-tjener i nettverket ditt eller ikke.",
"dhcp_static_ip_error": "For å kunne bruke DHCP-tjeneren, må det være satt en statisk IP-adresse. Vi klarte ikke å finne ut om dette nettverksgrensesnittet har blitt satt opp med en statisk IP-adresse. Vennligst sett opp en statisk IP-adresse manuelt.",
"dhcp_dynamic_ip_found": "Systemet ditt bruker et oppsett med dynamisk IP-adresse for grensesnittet <0>{{interfaceName}}</0>. For å kunne bruke DHCP-tjeneren, må en statisk IP-adresse ha blitt satt opp. Din nåværende IP-adresse er <0>{{ipAddress}}</0>. Vi vil automatisk gjøre denne IP-adressen statisk hvis du trykker på «Skru på DHCP»-knappen.",
"dhcp_lease_added": "Den statiske leieavtalen «{{key}}» ble vellykket lagt til",
"dhcp_lease_deleted": "Den statiske leieavtalen «{{key}}» ble vellykket lagt slettet",
"dhcp_new_static_lease": "Ny statisk leieavtale",
"dhcp_static_leases_not_found": "Ingen statiske DHCP-leieavtaler ble funnet",
"dhcp_add_static_lease": "Legg til statisk leieavtale",
"delete_confirm": "Er du sikker på at du vil slette «{{key}}»?",
"form_enter_hostname": "Skriv inn vertsnavnet",
"error_details": "Feildetaljer",
"back": "Tilbake",
"dashboard": "Kontrollsenter",
"settings": "Innstillinger",
"filters": "Filtre",
"query_log": "Forespørselslogg",
"faq": "OSS",
"version": "Versjon",
"address": "adresse",
"on": "PÅ",
"off": "AV",
"copyright": "Opphavsrett",
"homepage": "Hjemmeside",
"report_an_issue": "Send inn feilrapport",
"privacy_policy": "Personvernretningslinjer",
"enable_protection": "Skru på beskyttelse",
"enabled_protection": "Beskyttelse ble skrudd på",
"disable_protection": "Skru av beskyttelse",
"disabled_protection": "Beskyttelsen ble skrudd av",
"refresh_statics": "Oppfrisk statistikkene",
"dns_query": "DNS-forespørsler",
"blocked_by": "<0>Blokkert av filtre</0>",
"stats_malware_phishing": "Blokkert skadevare/phishing",
"stats_adult": "Blokkerte voksennettsteder",
"stats_query_domain": "Mest forespurte domener",
"for_last_24_hours": "de siste 24 timene",
"for_last_days": "det siste døgnet",
"for_last_days_plural": "de siste {{count}} dagene",
"no_domains_found": "Ingen domener ble funnet",
"requests_count": "Antall forespørsler",
"top_blocked_domains": "Mest blokkerte domener",
"top_clients": "Vanligste klienter",
"no_clients_found": "Ingen klienter ble funnet",
"general_statistics": "Generelle statistikker",
"number_of_dns_query_days": "Antall DNS-forespørsler som ble behandlet det siste døgnet",
"number_of_dns_query_days_plural": "Antall DNS-forespørsler som ble behandlet de siste {{count}} dagene",
"number_of_dns_query_24_hours": "Antall DNS-forespørsler som ble behandlet de siste 24 timene",
"number_of_dns_query_blocked_24_hours": "Antall DNS-forespørsler som ble blokkert av adblock-filtre, hosts-lister, og domene-lister",
"number_of_dns_query_blocked_24_hours_by_sec": "Antall DNS-forespørsler som ble blokkert av AdGuard sin nettlesersikkerhetsmodul",
"number_of_dns_query_blocked_24_hours_adult": "Antall voksennettsteder som ble blokkert",
"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",
"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 href='#filters'>Filtre</a>-innstillingene.",
"use_adguard_browsing_sec": "Benytt AdGuard sin nettlesersikkerhetstjeneste",
"use_adguard_browsing_sec_hint": "AdGuard Home vil sjekke om domenet har blitt svartelistet av nettlesersikkerhetstjenesten. Den vil bruke en privatlivsvennlig søke-API til å utføre sjekken: kun en kort prefiks av domenenavnet med SHA256-salting blir sendt til tjeneren.",
"use_adguard_parental": "Benytt AdGuard sin foreldrekontroll-nettjeneste",
"use_adguard_parental_hint": "AdGuard Home vil sjekke om domenet inneholder erotisk materiale. Den benytter den samme privatlivsvennlige API-en som nettlesersikkerhetstjenesten.",
"enforce_safe_search": "Påtving barnevennlige søk",
"enforce_save_search_hint": "AdGuard Home kan fremtvinge \"Safe Search\" i de følgende søkemotorene: Google, YouTube, Bing, DuckDuckGo, og Yandex.",
"no_servers_specified": "Ingen tjenere er spesifisert",
"general_settings": "Generelle innstillinger",
"dns_settings": "DNS-innstillinger",
"encryption_settings": "Krypteringsinnstillinger",
"dhcp_settings": "DHCP-innstillinger",
"upstream_dns": "Oppstrøms-DNS-tjenere",
"test_upstream_btn": "Test oppstrømstilkoblinger",
"apply_btn": "Benytt",
"disabled_filtering_toast": "Skrudde av filtrering",
"enabled_filtering_toast": "Skrudde på filtrering",
"disabled_safe_browsing_toast": "Skrudde av barnevennlig nettlesing",
"enabled_safe_browsing_toast": "Skrudde på barnevennlig nettlesing",
"disabled_parental_toast": "Skrudde av foreldrekontroll",
"enabled_parental_toast": "Skrudde på foreldrekontroll",
"disabled_safe_search_toast": "Skrudde av barnevennlige søk",
"enabled_save_search_toast": "Skrudde på barnevennlige søk",
"enabled_table_header": "Skrudd på",
"name_table_header": "Navn",
"filter_url_table_header": "Filterets URL",
"rules_count_table_header": "Antall oppføringer",
"last_time_updated_table_header": "Senest oppdatert",
"actions_table_header": "Handlinger",
"edit_table_action": "Rediger",
"delete_table_action": "Slett",
"filters_and_hosts": "Filtre og «hosts»-lister",
"filters_and_hosts_hint": "AdGuard Home forstår grunnleggende adblock-oppføringer, «hosts»-filsyntaks, og domenelister.",
"no_filters_added": "Ingen filtre er lagt til",
"add_filter_btn": "Legg til et filter",
"cancel_btn": "Avbryt",
"enter_name_hint": "Skriv inn navn",
"enter_url_hint": "Skriv inn nettadresse",
"check_updates_btn": "Se etter oppdateringer",
"new_filter_btn": "Nytt filterabonnement",
"enter_valid_filter_url": "Skriv inn en gyldig URL til et filterlisteabonnement.",
"custom_filter_rules": "Selvvalgte filtreringsregler",
"custom_filter_rules_hint": "Skriv inn én oppføring per linje. Du kan bruke adblock-oppføringer, «hosts»-filsyntaks, eller rå domener.",
"examples_title": "Eksempler",
"example_meaning_filter_block": "blokker tilgang til 'example.org'-domenet og alle dens underdomener",
"example_meaning_filter_whitelist": "opphev blokkeringen av 'example.org'-domenet og alle dens underdomener",
"example_meaning_host_block": "AdGuard Home vil nå videresende 'example.org'-domenet (men ikke dens underdomener) til 127.0.0.1.",
"example_comment": "! Her er det en kommentar",
"example_comment_meaning": "bare en kommentar",
"example_comment_hash": "# Også en kommentar",
"example_regex_meaning": "blokker tilgang til domener som samsvarer med den valgte ordinære oppføringen",
"example_upstream_regular": "vanlig DNS (over UDP)",
"example_upstream_dot": "kryptert <0>DNS-over-TLS</0>",
"example_upstream_doh": "kryptert <0>DNS-over-HTTPS</0>",
"example_upstream_sdns": "du kan bruke <0>DNS-stempler</0> med <1>DNSCrypt</1> eller <2>DNS-over-HTTPS</2>-behandlere",
"example_upstream_tcp": "vanlig DNS (over TCP)",
"all_filters_up_to_date_toast": "Alle filterlistene er allerede fullt oppdatert",
"updated_upstream_dns_toast": "Oppdaterte oppstrøms-DNS-tjenerne",
"dns_test_ok_toast": "De spesifiserte DNS-tjenerne fungerer riktig",
"dns_test_not_ok_toast": "Tjeneren «{{key}}» kunne ikke brukes, vennligst dobbeltsjekk at du har skrevet den riktig",
"unblock_btn": "Tillat",
"block_btn": "Blokker",
"time_table_header": "Tidspunkt",
"domain_name_table_header": "Domenenavn",
"type_table_header": "Type",
"response_table_header": "Respons",
"client_table_header": "Klient",
"empty_response_status": "Tomt innhold",
"show_all_filter_type": "Vis alle",
"show_filtered_type": "Vis kun filtrerte",
"no_logs_found": "Ingen loggføringer ble funnet",
"refresh_btn": "Oppfrisk",
"previous_btn": "Forrige",
"next_btn": "Neste",
"loading_table_status": "Laster inn …",
"page_table_footer_text": "Side",
"of_table_footer_text": "av",
"rows_table_footer_text": "rekker",
"updated_custom_filtering_toast": "Oppdaterte de selvvalgte filtreringsreglene",
"rule_removed_from_custom_filtering_toast": "Oppføringen ble fjernet fra de selvvalgte filtreringsreglene",
"rule_added_to_custom_filtering_toast": "Oppføringen ble lagt til i de selvvalgte filtreringsreglene",
"query_log_response_status": "Status: {{value}}",
"query_log_filtered": "Filtrert av {{filter}}",
"query_log_confirm_clear": "Er du sikker på at du vil slette hele forespørselsloggen?",
"query_log_cleared": "Forespørselsloggen ble vellykket slettet",
"query_log_clear": "Tøm forespørselsloggene",
"query_log_retention": "Beholding av forespørselsloggføringene",
"query_log_enable": "Skru på loggføring",
"query_log_configuration": "Loggføringskonfigurasjon",
"query_log_disabled": "Forespørselsloggen er skrudd av og kan bli satt opp i <0>innstillingene</0>",
"query_log_strict_search": "Bruk anførselstegn for strenge søk",
"query_log_retention_confirm": "Er du sikker på at du vil endre hvor lenge forespørselsloggføringene skal beholdes? Hvis du reduserer den interne verdien, vil noe av dataene gå tapt",
"source_label": "Kilde",
"found_in_known_domain_db": "Funnet i databasen over kjente domener.",
"category_label": "Kategori",
"rule_label": "Oppføring",
"filter_label": "Filter",
"unknown_filter": "Ukjent filter {{filterId}}",
"install_welcome_title": "Velkommen til AdGuard Home!",
"install_welcome_desc": "AdGuard Home er en nettverksdekkende reklame-og-sporings-blokkerende DNS-tjener. Formålet dens er å la deg styre hele nettverket ditt og alle dine enheter, og den krever ikke at klientene bruker spesifikke programmer.",
"install_settings_title": "Admin-nettgrensesnitt",
"install_settings_listen": "Lytt til grensesnitt",
"install_settings_port": "Port",
"install_settings_interface_link": "Ditt AdGuard Home-admin-nettgrensesnitt vil være tilgjengelig på de følgende adressene:",
"form_error_port": "Skriv inn en gyldig portverdi",
"install_settings_dns": "DNS-tjener",
"install_settings_dns_desc": "Du vil måtte sette opp enhetene eller ruteren din(e) til å bruke DNS-tjeneren på disse adressene:",
"install_settings_all_interfaces": "Alle grensesnitt",
"install_auth_title": "Autentisering",
"install_auth_desc": "Det er høyst anbefalt å sette opp passordautentisering på ditt AdGuard Home-adminnettgrensesnitt. Selv om du velger å bare gjøre den tilgjengelig på ditt lokale nettverk, er det fortsatt viktig å beskytte den fra ubegrenset tilgang.",
"install_auth_username": "Brukernavn",
"install_auth_password": "Passord",
"install_auth_confirm": "Bekreft passord",
"install_auth_username_enter": "Skriv inn brukernavn",
"install_auth_password_enter": "Skriv inn passord",
"install_step": "Trinn",
"install_devices_title": "Sett opp enhetene dine",
"install_devices_desc": "For å begynne å bruke AdGuard Home, må du sette opp enhetene dine til å bruke den.",
"install_submit_title": "Gratulerer!",
"install_submit_desc": "Oppsettsprosedyren er ferdig, og du er klar til å begynne å bruke AdGuard Home.",
"install_devices_router": "Ruter",
"install_devices_router_desc": "Dette oppsettet vil automatisk dekke alle enhetene som er koblet til hjemmeruteren din, og du vil ikke måtte sette opp hver av dem manuelt.",
"install_devices_address": "AdGuard Home-DNS-tjeneren lytter til de følgende adressene",
"install_devices_router_list_1": "Åpne innstillingene til ruteren din. Vanligvis kan du få tilgang til den på nettleseren din gjennom en URL (f.eks. http://192.168.0.1/ eller http://192.168.1.1/). Du kan bli spurt om å skrive inn passordet ditt. Hvis du ikke husker det, kan du som oftest tilbakestille passordet ditt ved å trykke på knapp på selve ruteren. Noen rutere krever et spesifikt program, som i så fall er ment å allerede ha blitt installert på din PC/mobil.",
"install_devices_router_list_2": "Finn DHCP-/DNS-innstillingene. Se etter DNS-bokstavene ved siden av et felt som tillater to eller tre sett med sifre, som hver er delt opp i fire grupper på 1-3 sifre.",
"install_devices_router_list_3": "Skriv inn din AdGuard Home-tjeners adresser her.",
"install_devices_windows_list_1": "Åpne «Kontrollpanel» gjennom Start-menyen eller et Windows-søk.",
"install_devices_windows_list_2": "Gå til «Nettverk og internett»-kategorien, og så til «Nettverks- og delingssenter».",
"install_devices_windows_list_3": "På den venstre siden av skjermen, finn «Endre innstillinger for nettverkskort» og klikk på den.",
"install_devices_windows_list_4": "Velg din aktive tilkobling, høyreklikk på den, og velg «Egenskaper».",
"install_devices_windows_list_5": "Finn «Internet Protocol versjon 4 (TCP/IP)» i listen, velg den, og så klikk på «Egenskaper» igjen.",
"install_devices_windows_list_6": "Velg «Bruk følgende DNS-serveradresser» og så skriv inn din AdGuard Home-tjeners adresser.",
"install_devices_macos_list_1": "Klikk på Apple-ikonet og gå til Systeminnstillinger.",
"install_devices_macos_list_2": "Klikk på «Nettverk».",
"install_devices_macos_list_3": "Velg den første tilkoblingen i listen din, og klikk på «Avansert».",
"install_devices_macos_list_4": "Velg DNS-fanen og skriv inn din AdGuard Home-tjeners adresser der.",
"install_devices_android_list_1": "Fra Android-startskjermen, trykk på «Innstillinger».",
"install_devices_android_list_2": "Velg «Wi-Fi» i menyen. Skjermen som lister opp alle de tilgjengelige nettverkene vil bli vist (det er umulig å velge selvvalgte DNS-adresser for mobiltilkoblinger uten en DNS-endringsapp).",
"install_devices_android_list_3": "Langtrykk på nettverket du er koblet til, og så trykk «Endre nettverket».",
"install_devices_android_list_4": "På noen enheter, vil du måtte huke av boksen for Avansert for se flere innstillinger. For å justere dine Android-DNS-innstillinger, vil du måtte endre IP-innstillingene fra DHCP til Statisk.",
"install_devices_android_list_5": "Endre de forvalgte 'DNS 1' og 'DNS 2'-verdiene til din AdGuard Home-tjeners adresser.",
"install_devices_ios_list_1": "Fra startskjermen, trykk på «Innstillinger».",
"install_devices_ios_list_2": "Velg Wi-Fi i den venstre menyen (det er umulig å sette opp DNS for mobildata-nettverk).",
"install_devices_ios_list_3": "Trykk på navnet til det nettverket som er aktivt for øyeblikket.",
"install_devices_ios_list_4": "I DNS-feltet, skriv inn din AdGuard Home-tjeners adresser.",
"get_started": "Kom i gang",
"next": "Neste",
"open_dashboard": "Åpne kontrollsenteret",
"install_saved": "Lagringen var vellykket",
"encryption_title": "Kryptering",
"encryption_desc": "Krypteringsstøtte (HTTPS/TLS) for både DNS og admin-nettgrensesnittet",
"encryption_config_saved": "Krypteringsoppsettet ble lagret",
"encryption_server": "Tjenerens navn",
"encryption_server_enter": "Skriv inn domenenavnet ditt",
"encryption_server_desc": "For å kunne bruke HTTPS, må du skrive inn tjenernavnet som samsvarer med ditt SSL-sertifikat.",
"encryption_redirect": "Automatisk omdiriger til HTTPS",
"encryption_redirect_desc": "Dersom dette er valgt, vil AdGuard Home automatisk omdirigere deg fra HTTP til HTTPS-adresser.",
"encryption_https": "HTTPS-port",
"encryption_https_desc": "Dersom HTTPS-porten er satt opp, vil AdGuard Home sitt admin-grensesnitt være tilgjengelig gjennom HTTPS, og vil også sørge for DNS-over-HTTPS på «/dns-query»-plasseringen.",
"encryption_dot": "'DNS-over-TLS'-port",
"encryption_dot_desc": "Dersom denne porten er satt opp, vil AdGuard Home kjøre en 'DNS-over-TLS'-tjener på denne porten.",
"encryption_certificates": "Sertifikater",
"encryption_certificates_desc": "For å bruke kryptering, må du skrive inn et gyldig SSL-sertifikatkjede for domenet ditt. Du kan få et gratis sertifikat hos <0>{{link}}</0>, eller kjøpe et fra en av de troverdige sertifikatsautoritetene.",
"encryption_certificates_input": "Kopier / lim inn dine PEM-kodede sertifikater her.",
"encryption_status": "Status",
"encryption_expire": "Utløper",
"encryption_key": "Privat nøkkel",
"encryption_key_input": "Kopier / lim inn ditt sertifikats PEM-kodede private nøkkel her.",
"encryption_enable": "Skru på kryptering (HTTPS, DNS-over-HTTPS, og DNS-over-TLS)",
"encryption_enable_desc": "Dersom kryptering er skrudd på, vil AdGuard Home sitt admingrensesnitt virke over HTTPS, og DNS-tjeneren vil lytte etter forespørseler over DNS-over-HTTPS og DNS-over-TLS.",
"encryption_chain_valid": "Sertifikatskjeden er gyldig",
"encryption_chain_invalid": "Sertifikatskjeden er ugyldig",
"encryption_key_valid": "Dette er en gyldig {{type}}-type privat nøkkel",
"encryption_key_invalid": "Dette er en ugyldig {{type}}-type privat nøkkel",
"encryption_subject": "Tema",
"encryption_issuer": "Utsteder",
"encryption_hostnames": "Vertsnavn",
"encryption_reset": "Er du sikker på at du vil tilbakestille krypteringsinnstillingene?",
"topline_expiring_certificate": "Ditt SSL-sertifikat er i ferd med å utløpe. Oppdater <0>Krypteringsinnstillinger</0>.",
"topline_expired_certificate": "SSL-sertifikatet har utløpt. Oppdater <0>Krypteringsinnstillinger</0>.",
"form_error_port_range": "Skriv inn et portnummer i området 80-65535",
"form_error_port_unsafe": "Denne porten er ikke trygg",
"form_error_equal": "Burde ikke være de samme",
"form_error_password": "Passordet samsvarer ikke",
"reset_settings": "Tilbakestill innstillinger",
"update_announcement": "AdGuard Home {{version}} er nå tilgjengelig! <0>Klikk her</0> for mere informasjon.",
"setup_guide": "Oppsettsveiledning",
"dns_addresses": "DNS-adresser",
"down": "Nedstrøm",
"fix": "Fiks",
"dns_providers": "Her er en <0>liste over kjente DNS-leverandører</0> som du kan velge blant.",
"update_now": "Oppdater nå",
"update_failed": "Auto-oppdatering mislyktes. Vennligst <a href='https://github.com/AdguardTeam/AdGuardHome/wiki/Getting-Started#update'>følg trinnene</a> for manuelle oppdateringer.",
"processing_update": "Vennligst vent, AdGuard Home blir oppdatert",
"clients_title": "Klienter",
"clients_desc": "Konfigurer enheter som er koblet til AdGuard Home",
"settings_global": "Overbestyrt",
"settings_custom": "Tilpasset",
"table_client": "Klient",
"table_name": "Navn",
"save_btn": "Lagre",
"client_add": "Legg til klient",
"client_new": "Ny klient",
"client_edit": "Rediger klienten",
"client_identifier": "Identifikator",
"ip_address": "IP-adresse",
"form_enter_ip": "Skriv inn IP",
"form_enter_mac": "Skriv inn MAC",
"form_client_name": "Skriv inn klientnavnet",
"client_global_settings": "Bruk de overbestyrte innstillingene",
"client_deleted": "Klienten «{{key}}» ble vellykket slettet",
"client_added": "Klienten «{{key}}» ble vellykket lagt til",
"client_updated": "Klienten «{{key}}» ble vellykket oppdatert",
"clients_not_found": "Ingen klienter ble funnet",
"client_confirm_delete": "Er du sikker på at du vil slette klienten «{{key}}»?",
"filter_confirm_delete": "Er du sikker på at du vil slette filteret?",
"auto_clients_title": "Klienter (kjørende)",
"auto_clients_desc": "Loggføring over klientene som bruker AdGuard Home, men som ikke har blitt lagret i oppsettet",
"access_title": "Tilgangsinnstillinger",
"access_desc": "Her kan du sette opp tilgangsregler for AdGuard Home-DNS-tjeneren.",
"access_allowed_title": "Tillatte klienter",
"access_allowed_desc": "En liste over CIDR- eller IP-adresser. Dersom dette er satt opp, vil AdGuard Home kun akseptere forespørsler fra disse IP-adressene.",
"access_disallowed_title": "Klienter som skal avvises",
"access_disallowed_desc": "En liste over CIDR- eller IP-adresser. Dersom dette er satt opp, vil AdGuard Home avslå forespørsler fra disse IP-adressene.",
"access_blocked_title": "Blokkerte domener",
"access_blocked_desc": "Ikke forveksle dette med filtre. AdGuard Home vil nekte å behandle DNS-forespørsler som har disse domenene i forespørselene.",
"access_settings_saved": "Tilgangsinnstillingene ble vellykket lagret",
"updates_checked": "Oppdateringene ble vellykket sett etter",
"updates_version_equal": "AdGuard Home er fullt oppdatert",
"check_updates_now": "Se etter oppdateringer nå",
"dns_privacy": "DNS-privatliv",
"setup_dns_privacy_1": "<0>DNS-over-TLS:</0> Benytt <1>{{address}}</1>-strengen.",
"setup_dns_privacy_2": "<0>DNS-over-HTTPS:</0> Benytt <1>{{address}}</1>-strengen.",
"setup_dns_privacy_3": "<0>Vennligst bemerk at krypterte DNS-protokoller bare er støttet på Android 9. Så du må installere ytterligere programvare for andre operativsystemer.</0><0>Her er en liste over programvare som du kan bruke.</0>",
"setup_dns_privacy_android_1": "Android 9 har innebygd støtte for DNS-over-TLS. For å sette det opp, gå til Innstillinger → Nettverk og internett → Avansert → Privat DNS, og skriv inn domenenavnet ditt der.",
"setup_dns_privacy_android_2": "<0>AdGuard for Android</0> støtter <1>DNS-over-HTTPS</1> og <1>DNS-over-TLS</1>.",
"setup_dns_privacy_android_3": "<0>Intra</0> legger til <1>DNS-over-HTTPS</1>-støtte i Android.",
"setup_dns_privacy_ios_1": "<0>DNSCloak</0> støtter <1>DNS-over-HTTPS</1>, men for å sette det opp til å bruke din egen tjener, vil du måtte generere et <2>DNS-stempel</2> for det.",
"setup_dns_privacy_ios_2": "<0>AdGuard for iOS</0> støtter <1>DNS-over-HTTPS</1>- og <1>DNS-over-TLS</1>-oppsett.",
"setup_dns_privacy_other_title": "Andre implementeringer",
"setup_dns_privacy_other_1": "AdGuard Home i seg selv kan brukes som en sikker DNS-klient for enhver plattform.",
"setup_dns_privacy_other_2": "<0>dnsproxy</0> støtter alle kjente sikre DNS-protokoller.",
"setup_dns_privacy_other_3": "<0>dnscrypt-proxy</0> støtter <1>DNS-over-HTTPS</1>.",
"setup_dns_privacy_other_4": "<0>Mozilla Firefox</0> støtter <1>DNS-over-HTTPS</1>.",
"setup_dns_privacy_other_5": "Du finner flere implementeringer <0>her</0> og <1>her</1>.",
"setup_dns_notice": "For å benytte <1>DNS-over-HTTPS</1> eller <1>DNS-over-TLS</1>, må du <0>sette opp Kryptering</0> i AdGuard Home-innstillingene.",
"rewrite_added": "DNS-omdirigeringen for «{{key}}» ble vellykket lagt til",
"rewrite_deleted": "DNS-omdirigeringen for «{{key}}» ble vellykket slettet",
"rewrite_add": "Legg til DNS-omdirigering",
"rewrite_not_found": "Ingen DNS-omdirigeringer ble funnet",
"rewrite_confirm_delete": "Er du sikker på at du vil slette DNS-omdirigeringen for «{{key}}»?",
"rewrite_desc": "Lar deg enkelt konfigurere selvvalgte DNS-tilbakemeldinger for et spesifikt domenenavn.",
"rewrite_applied": "Benyttet omdirigeringsregelen",
"dns_rewrites": "DNS-omdirigeringer",
"form_domain": "Skriv inn domene",
"form_answer": "Skriv inn IP-adresse eller domenenavn",
"form_error_domain_format": "Ugyldig domeneformat",
"form_error_answer_format": "Ugyldig svarformat",
"configure": "Sett opp",
"main_settings": "Hovedinnstillinger",
"block_services": "Blokker spesifikke tjenester",
"blocked_services": "Blokkerte tjenester",
"blocked_services_desc": "Gjør det mulig å blokkere populære nettsteder og tjenester med letthet.",
"blocked_services_saved": "Tjenesteblokkeringene ble vellykket lagret",
"blocked_services_global": "Bruk de overbestyrt blokkerte tjenestene",
"blocked_service": "Blokkert tjeneste",
"block_all": "Blokker alt",
"unblock_all": "Tillat alt",
"encryption_certificate_path": "Filbanen til sertifikatet",
"encryption_private_key_path": "Filbanen til den private nøkkelen",
"encryption_certificates_source_path": "Bestem en filbane for sertifikater",
"encryption_certificates_source_content": "Lim inn innholdet til sertifikatet",
"encryption_key_source_path": "Bestem en privat nøkkelfil",
"encryption_key_source_content": "Lim inn innholdet til den private nøkkelen",
"stats_params": "Statistikk-oppsett",
"config_successfully_saved": "Oppsettet ble vellykket lagret",
"interval_24_hour": "24 timer",
"interval_days": "{{count}} dag",
"interval_days_plural": "{{count}} dager",
"domain": "Domene",
"answer": "Svar",
"filter_added_successfully": "Filteret har blitt vellykket lagt til",
"statistics_configuration": "Statistikk-oppsett",
"statistics_retention": "Statistikkbeholding",
"statistics_retention_desc": "Hvis du reduserer intervallverdien, vil noen av dataene gå tapt",
"statistics_clear": " Tøm statistikkene",
"statistics_clear_confirm": "Er du sikker på at du vil slette statistikkene?",
"statistics_retention_confirm": "Er du sikker på at du vil endre hvor lenge statistikkene skal beholdes? Hvis du reduserer den interne verdien, vil noe av dataene gå tapt",
"statistics_cleared": "Statistikkene ble vellykket tømt",
"interval_hours": "{{count}} time",
"interval_hours_plural": "{{count}} timer",
"filters_configuration": "Oppsett av filtre",
"filters_enable": "Skru på filtre",
"filters_interval": "Filteroppdateringsvanlighet",
"disabled": "Skrudd av",
"username_label": "Brukernavn",
"username_placeholder": "Skriv inn brukernacvn",
"password_label": "Passord",
"password_placeholder": "Skriv inn passord",
"sign_in": "Logg på",
"sign_out": "Logg av",
"forgot_password": "Har du glemt passordet?",
"forgot_password_desc": "Vennligst følg <0>disse trinnene</0> for å lage et nytt passord til brukerkontoen din.",
"location": "Posisjon",
"orgname": "Firmanavn",
"netname": "Nettverksnavn",
"descr": "Beskrivelse",
"whois": "Whois",
"filtering_rules_learn_more": "<0>Lær mer</0> om å lage dine egne filterlister for AdGuard Home."
}

View File

@@ -0,0 +1,366 @@
{
"client_settings": "Ustawienia klienta",
"example_upstream_reserved": "możesz określić kierunek przesyłu danych DNS <0>dla konkretnej witryny (lub witryn)</0>",
"upstream_parallel": "Używaj równoległych zapytań, aby przyspieszyć rozwiązywanie problemów, jednocześnie wysyłając zapytania do wszystkich serwerów nadrzędnych",
"bootstrap_dns": "Serwery danych Bootstrap DNS",
"bootstrap_dns_desc": "Servery DNS Bootstrap'a są używane do analizowania aresu IP resolverów, które oznaczysz jako nadrzędne.",
"check_dhcp_servers": "Sprawdź serwery DHCP",
"save_config": "Zapisz konfigurację",
"enabled_dhcp": "Serwer DHCP włączony",
"disabled_dhcp": "Serwer DHCP wyłączony",
"dhcp_title": "Serwer DHCP ",
"dhcp_description": "Jeśli router nie zapewnia ustawień DHCP, możesz użyć wbudowanego serwera DHCP AdGuard.",
"dhcp_enable": "Włącz serwer DHCP",
"dhcp_disable": "Wyłącz serwer DHCP",
"dhcp_not_found": "W sieci nie znaleziono aktywnych serwerów DHCP. Bezpiecznie jest włączyć wbudowany serwer DHCP.",
"dhcp_found": "Znaleziono aktywne serwery DHCP odszukane w sieci. Włączenie wbudowanego serwera DHCP nie jest bezpieczne.",
"dhcp_leases": "Dzierżawa DHCP",
"dhcp_static_leases": "Dzierżawy statyczne DHCP",
"dhcp_leases_not_found": "Nie znaleziono dzierżaw DHCP",
"form_error_required": "Pole wymagane",
"form_error_mac_format": "Nieprawidłowy format MAC",
"form_error_positive": "Musi być większa niż 0",
"dhcp_form_gateway_input": "Adres IP bramy",
"dhcp_form_subnet_input": "Maska podsieci",
"dhcp_form_range_title": "Zakres adresów IP",
"dhcp_form_range_start": "Początek zakresu",
"dhcp_form_range_end": "Koniec zakresu",
"dhcp_form_lease_title": "Czas dzierżawy DHCP (w sekundach)",
"dhcp_form_lease_input": "Czas trwania dzierżawy",
"dhcp_interface_select": "Wybierz interfejs DHCP",
"dhcp_hardware_address": "Adres sprzętowy",
"dhcp_ip_addresses": "Adresy IP",
"dhcp_table_hostname": "Nazwa hosta",
"dhcp_table_expires": "Wygasa",
"dhcp_warning": "Aby włączyć wbudowany serwer DHCP, upewnij się, że nie ma innego aktywnego serwera DHCP. W przeciwnym razie może przerwać połączenie internetowe dla podłączonych urządzeń!",
"dhcp_error": "Nie udało się ustalić, czy w sieci jest inny serwer DHCP.",
"dhcp_static_ip_error": "Aby korzystać z serwera DHCP, należy ustawić statyczny adres IP. Nie udało się ustalić, czy ten interfejs sieciowy jest skonfigurowany przy użyciu statycznego adresu IP. Ustaw statyczny adres IP ręcznie.",
"dhcp_dynamic_ip_found": "Twój system używa dynamicznej konfiguracji adresu IP dla interfejsu <0>{{interfaceName}}</0>. Aby korzystać z serwera DHCP, należy ustawić statyczny adres IP. Twój aktualny adres IP to <0>{{ipAddress}}</0>. Automatycznie ustawimy ten adres IP jako statyczny, jeśli naciśniesz przycisk Włącz DHCP.",
"dhcp_lease_added": "Dzierżawa statyczna \"{{key}}\" pomyślnie dodana",
"dhcp_lease_deleted": "Dzierżawa statyczna \"{{key}}\" pomyślnie usunięta",
"dhcp_new_static_lease": "Nowa dzierżawa statyczna",
"dhcp_static_leases_not_found": "Nie znaleziono statycznych dzierżaw DHCP",
"dhcp_add_static_lease": "Dodaj dzierżawę statyczną",
"delete_confirm": "Czy na pewno chcesz usunąć \"{{key}}\"?",
"form_enter_hostname": "Wpisz nazwę hosta",
"error_details": "Szczegóły błędu",
"back": "Wróć",
"dashboard": "Panel kontrolny",
"settings": "Ustawienia",
"filters": "Filtry",
"query_log": "Dziennik zapytań",
"faq": "FAQ",
"version": "wersja",
"address": "adres",
"on": "WŁĄCZ",
"off": "WYŁĄCZ",
"copyright": "Prawo autorskie",
"homepage": "Strona główna",
"report_an_issue": "Zgłoś problem",
"privacy_policy": "Polityka prywatności",
"enable_protection": "Włącz ochronę",
"enabled_protection": "Ochrona włączona ",
"disable_protection": "Wyłącz ochronę",
"disabled_protection": "Ochrona wyłączona ",
"refresh_statics": "Odśwież statystyki",
"dns_query": "Zapytania DNS",
"blocked_by": "<0>Zablokowane przez filtry</0>",
"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_days": "z ostatnich {{value}} dni",
"for_last_days_plural": "z ostatnich {{count}} dni",
"no_domains_found": "Nie znaleziono domen",
"requests_count": "Licznik żądań",
"top_blocked_domains": "Najpopularniejsze zablokowane domeny",
"top_clients": "Główni klienci",
"no_clients_found": "Nie znaleziono klienta",
"general_statistics": "Ogólne statystyki",
"number_of_dns_query_days": "Liczba przetworzonych zapytań DNS w ciągu ostatnich {{value}} 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_blocked_24_hours": "Liczba żądań DNS zablokowanych przez filtry blokowania reklam i listy bloków hosta",
"number_of_dns_query_blocked_24_hours_by_sec": "Liczba żądań DNS zablokowanych przez moduł AdGuard Bezpieczne Przeglądanie",
"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 do wyszukiwarek, dla których zastosowano wymuszenie bezpiecznego wyszukiwania",
"average_processing_time": "Średni czas przetwarzania",
"average_processing_time_hint": "Średni czas w milisekundach przetwarzania żądania DNS",
"block_domain_use_filters_and_hosts": "Blokuj domeny za pomocą filtrów i plików host",
"filters_block_toggle_hint": "Możesz skonfigurować reguły blokowania w ustawieniach <a href='#filters'>Filtry</a> ",
"use_adguard_browsing_sec": "Użyj usługi sieciowej Bezpieczne Przeglądanie AdGuard",
"use_adguard_browsing_sec_hint": "AdGuard Home sprawdzi, czy domena jest na czarnej liście przez serwis internetowy Bezpieczne Przeglądanie. Będzie korzystać z interfejsu API przyjaznego dla prywatności w celu przeprowadzenia kontroli: na serwer wysyłany jest tylko krótki prefiks nazwy domeny SHA256.",
"use_adguard_parental": "Użyj usługi Kontrola Rodzicielska AdGuard",
"use_adguard_parental_hint": "AdGuard Home sprawdzi, czy domena zawiera materiały dla dorosłych. Używa tego samego interfejsu API przyjaznego prywatności, co usługa sieciowa Bezpieczne Przeglądanie. ",
"enforce_safe_search": "Wymuszaj bezpieczne wyszukiwanie",
"no_servers_specified": "Nie określono serwerów",
"general_settings": "Ustawienia główne",
"dns_settings": "Ustawienia DNS",
"encryption_settings": "Ustawienia szyfrowania",
"dhcp_settings": "Ustawienia DHCP",
"upstream_dns": "Serwery DNS z wyższego poziomu",
"test_upstream_btn": "Test upstreamów",
"apply_btn": "Zastosuj",
"disabled_filtering_toast": "Wyłączone filtrowanie",
"enabled_filtering_toast": "Włączone filtrowanie",
"disabled_safe_browsing_toast": "Wyłączone bezpieczne przeglądanie",
"enabled_safe_browsing_toast": "Włączone bezpieczne przeglądanie",
"disabled_parental_toast": "Wyłączona Kontrola Rodzicielska",
"enabled_parental_toast": "Włączona Kontrola Rodzicielska",
"disabled_safe_search_toast": "Wyłączone bezpieczne wyszukiwanie",
"enabled_save_search_toast": "Włączone bezpieczne wyszukiwanie",
"enabled_table_header": "Włączone",
"name_table_header": "Nazwa",
"filter_url_table_header": "Filtruj adres URL",
"rules_count_table_header": "Licznik reguł",
"last_time_updated_table_header": "Ostatni raz zaktualizowany",
"actions_table_header": "Akcje",
"edit_table_action": "Edytuj",
"delete_table_action": "Usuń",
"filters_and_hosts": "Filtry i czarne listy hostów",
"filters_and_hosts_hint": "AdGuard Home rozumie podstawowe reguły adblocka i składnię plików hostów.",
"no_filters_added": "Nie dodano filtrów",
"add_filter_btn": "Dodaj filtr",
"cancel_btn": "Anuluj",
"enter_name_hint": "Wprowadź nazwę",
"enter_url_hint": "Wprowadź adres URL ",
"check_updates_btn": "Sprawdź aktualizacje",
"new_filter_btn": "Nowa subskrypcja filtra",
"enter_valid_filter_url": "Wprowadź poprawny adres URL subskrypcji filtru lub pliku hosta.",
"custom_filter_rules": "Niestandardowe reguły filtrowania",
"custom_filter_rules_hint": "Wprowadź jedną regułę w jednej linii. Możesz użyć reguł adblock lub składni plików hostów.",
"examples_title": "Przykłady",
"example_meaning_filter_block": "zablokuj dostęp do domeny example.org i wszystkich jej poddomen",
"example_meaning_filter_whitelist": "odblokuj dostęp do domeny example.org i wszystkich jej subdomen",
"example_meaning_host_block": "AdGuard Home zwróci teraz adres 127.0.0.1 dla domeny example.org (ale nie jego poddomen).",
"example_comment": "! Tutaj idzie komentarz",
"example_comment_meaning": "komentarz",
"example_comment_hash": "# Również komentarz",
"example_upstream_regular": "normalny DNS (przez UDP)",
"example_upstream_dot": "zaszyfrowany <a href='https://en.wikipedia.org/wiki/DNS_over_TLS' target='_blank'>DNS-przez-TLS</a>",
"example_upstream_doh": "zaszyfrowany <a href='https://en.wikipedia.org/wiki/DNS_over_HTTPS' target='_blank'>DNS-przez-HTTPS</a>",
"example_upstream_sdns": "możesz użyć <a href='https://dnscrypt.info/stamps/' target='_blank'>DNS Stamps</a> dla <a href='https://dnscrypt.info/' target='_blank'>DNSCrypt</a> lub <a href='https://en.wikipedia.org/wiki/DNS_over_HTTPS' target='_blank'>DNS-over-HTTPS</a> resolvers",
"example_upstream_tcp": "zwykły DNS (przez TCP)",
"all_filters_up_to_date_toast": "Wszystkie filtry są już aktualne",
"updated_upstream_dns_toast": "Zaktualizowano wyższe serwery DNS",
"dns_test_ok_toast": "Określone serwery DNS działają poprawnie",
"dns_test_not_ok_toast": "Serwer \"{{key}}\": nie można go użyć, sprawdź, czy napisałeś go poprawnie",
"unblock_btn": "Odblokuj",
"block_btn": "Zablokuj",
"time_table_header": "Czas",
"domain_name_table_header": "Nazwa domeny",
"type_table_header": "Typ",
"response_table_header": "Odpowiedź ",
"client_table_header": "Klient",
"empty_response_status": "Pusty",
"show_all_filter_type": "Pokaż wszystko",
"show_filtered_type": "Pokaż filtrowane",
"no_logs_found": "Nie znaleziono logów",
"refresh_btn": "Odśwież",
"previous_btn": "Poprzedni",
"next_btn": "Następny",
"loading_table_status": "Wczytuję...",
"page_table_footer_text": "Strona",
"of_table_footer_text": "z",
"rows_table_footer_text": "rzędy",
"updated_custom_filtering_toast": "Zaktualizowano niestandardowe reguły filtrowania",
"rule_removed_from_custom_filtering_toast": "Reguła usunięta z niestandardowych reguł filtrowania",
"rule_added_to_custom_filtering_toast": "Reguła dodana do niestandardowych reguł filtrowania",
"query_log_response_status": "Status: {{value}}",
"query_log_filtered": "Filtrowane przez {{filter}}",
"source_label": "Źródło",
"found_in_known_domain_db": "Znaleziono w bazie danych znanych domen.",
"category_label": "Kategoria",
"rule_label": "Reguła",
"filter_label": "Filtr",
"unknown_filter": "Nieznany filtr {{filterId}}",
"install_welcome_title": "Witamy w AdGuard Home!",
"install_welcome_desc": "AdGuard Home to w pełni funkcjonalny serwer DNS do blokowania reklam i śledzenia. Jego celem jest kontrolowanie całej sieci i wszystkich urządzeń, bez konieczności korzystania z jakiegokolwiek programu po stronie klienta.",
"install_settings_title": "Interfejs internetowy administratora",
"install_settings_listen": "Interfejs sieciowy",
"install_settings_port": "Port",
"install_settings_interface_link": "Twój interfejs www AdGuard Home Admin będzie dostępny pod następującymi adresami:",
"form_error_port": "Wprowadź poprawną wartość portu",
"install_settings_dns": "Serwer DNS",
"install_settings_dns_desc": "Konieczne będzie skonfigurowanie urządzenia lub routera do korzystania z serwera DNS pod następującymi adresami:",
"install_settings_all_interfaces": "Wszystkie interfejsy",
"install_auth_title": "Uwierzytelnianie",
"install_auth_username": "Nazwa użytkownika",
"install_auth_password": "Hasło",
"install_auth_confirm": "Potwierdź hasło",
"install_auth_username_enter": "Wpisz nazwę użytkownika",
"install_auth_password_enter": "Wpisz hasło",
"install_step": "Krok",
"install_devices_title": "Skonfiguruj swoje urządzenia",
"install_devices_desc": "Aby usługa AdGuard Home mogła zacząć działać, musisz skonfigurować urządzenia, aby z niej korzystać.",
"install_submit_title": "Gratulacje!",
"install_submit_desc": "Procedura konfiguracji została zakończona i możesz rozpocząć korzystanie z AdGuard Home.",
"install_devices_router": "Router",
"install_devices_router_desc": "To ustawienie automatycznie obejmuje wszystkie urządzenia podłączone do routera domowego i nie trzeba ich konfigurować ręcznie.",
"install_devices_address": "Serwer DNS AdGuard Home używa następujących adresów",
"install_devices_router_list_1": "Otwórz preferencje routera. Zazwyczaj można się do niego dostać z przeglądarki za pośrednictwem adresu URL (na przykład http://192.168.0.1/ lub http://192.168.1.1/). Może być konieczne wprowadzenie hasła. Jeśli nie pamiętasz, często możesz odzyskać hasło, naciskając przycisk na samym routerze. Niektóre routery wymagają określonej aplikacji, która powinna być już zainstalowana na komputerze lub telefonie.",
"install_devices_router_list_2": "Znajdź ustawienia DHCP/DNS. Poszukaj skrótu DNS obok pola, które pozwala wstawić dwa lub trzy zestawy liczb, z których każdy jest podzielony na cztery grupy z jedną do trzech cyfr.",
"install_devices_router_list_3": "Wprowadź adresy swojego serwera AdGuard Home.",
"install_devices_windows_list_1": "Otwórz panel Ustawienia w menu Start lub w Windows.",
"install_devices_windows_list_2": "Przejdź do kategorii Sieć i Internet, a następnie do Centrum sieci i udostępniania.",
"install_devices_windows_list_3": "Po lewej stronie ekranu znajdź Zmień ustawienia adaptera i kliknij na niego.",
"install_devices_windows_list_4": "Wybierz aktywne połączenie, kliknij je prawym przyciskiem myszy i wybierz Właściwości.",
"install_devices_windows_list_5": "Znajdź na liście protokół internetowy w wersji 4 (TCP/IP), zaznacz go, a następnie ponownie kliknij Właściwości.",
"install_devices_windows_list_6": "Wybierz Użyj następujących adresów serwerów DNS i wprowadź adresy serwerów AdGuard Home.",
"install_devices_macos_list_1": "Kliknij ikonę Apple i przejdź do Preferencje systemowe.",
"install_devices_macos_list_2": "Kliknij Sieć.",
"install_devices_macos_list_3": "Wybierz pierwsze połączenie z listy i kliknij Zaawansowane.",
"install_devices_macos_list_4": "Wybierz kartę DNS i wprowadź adresy serwerów AdGuard Home.",
"install_devices_android_list_1": "Na ekranie głównym Menu systemu Android stuknij Ustawienia.",
"install_devices_android_list_2": "Dotknij Wi-Fi w menu. Zostanie wyświetlony ekran z listą wszystkich dostępnych sieci (nie można ustawić niestandardowego DNS dla połączenia komórkowego).",
"install_devices_android_list_3": "Długo naciśnij sieć, do której jesteś podłączony, i dotknij Modyfikuj sieć.",
"install_devices_android_list_4": "W przypadku niektórych urządzeń może być konieczne zaznaczenie pola Zaawansowane, aby wyświetlić dalsze ustawienia. Aby dostosować ustawienia DNS Android, musisz zmienić ustawienia IP z DHCP na Statyczny.",
"install_devices_android_list_5": "Zmień wartości DNS 1 i DNS 2 na adresy serwerów AdGuard Home.",
"install_devices_ios_list_1": "Na ekranie głównym stuknij Ustawienia.",
"install_devices_ios_list_2": "Wybierz Wi-Fi w lewym menu (nie można skonfigurować DNS dla sieci komórkowych).",
"install_devices_ios_list_3": "Stuknij w nazwę aktualnie aktywnej sieci.",
"install_devices_ios_list_4": "W polu DNS wpisz adresy serwerów AdGuard Home.",
"get_started": "Zaczynamy",
"next": "Dalej",
"open_dashboard": "Otwórz panel sterowania",
"install_saved": "Pomyślnie zapisany",
"encryption_title": "Szyfrowanie",
"encryption_desc": "Obsługa szyfrowania (HTTPS/TLS) dla interfejsu sieciowego DNS i administratora",
"encryption_config_saved": "Zapisano konfigurację szyfrowania",
"encryption_server": "Nazwa serwera",
"encryption_server_enter": "Wpisz swoją nazwę domeny",
"encryption_server_desc": "Aby korzystać z protokołu HTTPS, musisz wprowadzić nazwę serwera zgodną z certyfikatem SSL.",
"encryption_redirect": "Przekieruj automatycznie do HTTPS",
"encryption_redirect_desc": "Jeśli zaznaczone, AdGuard Home automatycznie przekieruje Cię z adresów HTTP na HTTPS.",
"encryption_https": "Port HTTPS",
"encryption_https_desc": "Jeśli port HTTPS jest skonfigurowany, interfejs administratora AdGuard Home będzie dostępny za pośrednictwem protokołu HTTPS i zapewni DNS przez HTTPS w lokalizacji zapytania '/dns-query'.",
"encryption_dot": "DNS-przez-TLS port",
"encryption_dot_desc": "Jeśli ten port jest skonfigurowany, AdGuard Home uruchomi serwer DNS-przez-TLS na tym porcie.",
"encryption_certificates": "Certyfikaty",
"encryption_certificates_desc": "Aby korzystać z szyfrowania, musisz podać prawidłowy łańcuch certyfikatów SSL dla swojej domeny. Możesz uzyskać bezpłatny certyfikat na <0>{{link}}</0> lub możesz go kupić od jednego z zaufanych urzędów certyfikacji.",
"encryption_certificates_input": "Kopiuj/wklej tutaj swoje zakodowane certyfikaty PEM.",
"encryption_status": "Stan",
"encryption_expire": "Wygasa",
"encryption_key": "Klucz prywatny",
"encryption_key_input": "Tutaj kopiuj/wklej klucze prywatne zakodowane w PEM do swojego certyfikatu.",
"encryption_enable": "Włącz szyfrowanie (HTTPS, DNS-przez-HTTPS i DNS-przez-TLS)",
"encryption_enable_desc": "Jeśli szyfrowanie jest włączone, interfejs AdGuard Home admin będzie działał przez HTTPS, a serwer DNS będzie nasłuchiwał żądań przez DNS-przez-HTTPS i DNS-przez-TLS.",
"encryption_chain_valid": "Łańcuch certyfikatów jest prawidłowy",
"encryption_chain_invalid": "Łańcuch certyfikatów jest nieprawidłowy",
"encryption_key_valid": "Poprawny {{type}} klucz prywatny.",
"encryption_key_invalid": "Nieprawidłowy {{type}} klucz prywatny",
"encryption_subject": "Temat",
"encryption_issuer": "Zgłaszający",
"encryption_hostnames": "Nazwy hostów",
"encryption_reset": "Czy na pewno chcesz zresetować ustawienia szyfrowania?",
"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": "Wprowadź wartość portu w zakresie 80-65535",
"form_error_port_unsafe": "To jest niebezpieczny port",
"form_error_equal": "Nie powinien być równy",
"form_error_password": "Hasło nie pasuje",
"reset_settings": "Resetowanie ustawień",
"update_announcement": "AdGuard Home {{version}} jest już dostępny! <0>Kliknij tutaj</0> aby uzyskać więcej informacji.",
"setup_guide": "Przewodnik instalacji",
"dns_addresses": "Adresy DNS",
"down": "Utrata połączenia",
"fix": "Napraw",
"dns_providers": "Oto lista <0>znanych dostawców DNS</0> do wyboru.",
"update_now": "Aktualizuj teraz",
"update_failed": "Automatyczna aktualizacja nie powiodła się. Proszę <a href='https://github.com/AdguardTeam/AdGuardHome/wiki/Getting-Started#update'>wykonaj kroki</a> aby zaktualizować ręcznie.",
"processing_update": "Poczekaj, trwa aktualizacja AdGuard Home",
"clients_title": "Klienci",
"clients_desc": "Skonfiguruj urządzenia podłączone do AdGuard Home",
"settings_global": "Globalny",
"settings_custom": "Własne",
"table_client": "Klient",
"table_name": "Nazwa",
"save_btn": "Zapisz",
"client_add": "Dodaj klienta",
"client_new": "Nowy klient",
"client_edit": "Edytuj klienta",
"client_identifier": "Identyfikator",
"ip_address": "Adres IP",
"form_enter_ip": "Wpisz adres IP",
"form_enter_mac": "Wpisz adres MAC",
"form_client_name": "Wpisz nazwę klienta",
"client_global_settings": "Użyj ustawień globalnych",
"client_deleted": "Klient \"{{key}}\" został pomyślnie usunięty",
"client_added": "Klient \"{{key}}\" został pomyślnie dodany",
"client_updated": "Klient \"{{key}}\" został pomyślnie zaktualizowany",
"clients_not_found": "Nie znaleziono klientów",
"client_confirm_delete": "Czy na pewno chcesz usunąć klienta \"{{key}}\"?",
"filter_confirm_delete": "Czy na pewno chcesz usunąć filtr?",
"auto_clients_title": "Klienci (czas uruchamiania)",
"auto_clients_desc": "Dane klientów, które używają AdGuard Home, ale nie są przechowywane w konfiguracji",
"access_title": "Ustawienia dostępu",
"access_desc": "Tutaj możesz skonfigurować reguły dostępu dla serwera DNS AdGuard Home.",
"access_allowed_title": "Dozwoleni klienci",
"access_allowed_desc": "Lista adresów CIDR lub IP. Jeśli jest skonfigurowany, AdGuard Home akceptuje tylko żądania z tych adresów IP.",
"access_disallowed_title": "Niedozwoleni klienci",
"access_disallowed_desc": "Lista adresów CIDR lub IP. Po skonfigurowaniu AdGuard Home usunie żądania z tych adresów IP.",
"access_blocked_title": "Zablokowane domeny",
"access_blocked_desc": "Nie myl go z filtrami. Strona główna AdGuard zignoruje zapytanie DNS dotyczące tych domen w ramach przetwarzania zapytań.",
"access_settings_saved": "Ustawienia dostępu zostały pomyślnie zapisane",
"updates_checked": "Aktualizacje pomyślnie sprawdzone",
"updates_version_equal": "AdGuard Home jest aktualny",
"check_updates_now": "Sprawdź aktualizacje teraz",
"dns_privacy": "Prywatność DNS",
"setup_dns_privacy_1": "<0>DNS-przez-TLS:</0> Użyj ciągu <1>{{address}}</1>.",
"setup_dns_privacy_2": "<0>DNS-przez-HTTPS:</0> Użyj ciągu <1>{{address}}</1>.",
"setup_dns_privacy_3": "<0>Należy pamiętać, że szyfrowane protokoły DNS są obsługiwane tylko w systemie Android 9. Musisz zainstalować dodatkowe oprogramowanie dla innych systemów operacyjnych.</0><0>Oto lista oprogramowania, którego możesz użyć.</0>",
"setup_dns_privacy_android_1": "Android 9 obsługuje natywnie DNS-przez-TLS. Aby go skonfigurować, przejdź do Ustawienia → Sieć i Internet → Zaawansowane → Prywatny DNS i wprowadź tam swoją nazwę domeny.",
"setup_dns_privacy_android_2": "<0>AdGuard dla Android</0> obsługuje <1>DNS-przez-HTTPS</1> i <1>DNS-przez-TLS</1>.",
"setup_dns_privacy_android_3": "<0>Intra</0> dodaje obsługę <1>DNS-przez-HTTPS</1> do Androida.",
"setup_dns_privacy_ios_1": "<0>DNSCloak</0> obsługuje <1>DNS-przez-HTTPS</1>, ale musisz wygenerować znacznik, aby skonfigurować go do używania własnego serwera <2>DNS Stamp</2>.",
"setup_dns_privacy_ios_2": "<0>AdGuard dla iOS</0> obsługuje konfigurację <1>DNS-przez-HTTPS</1> i <1>DNS-przez-TLS</1>.",
"setup_dns_privacy_other_title": "Inne implementacje",
"setup_dns_privacy_other_1": "Sam AdGuard Home może być bezpiecznym klientem DNS na dowolnej platformie.",
"setup_dns_privacy_other_2": "<0>dnsproxy</0> obsługuje wszystkie znane bezpieczne protokoły DNS.\n\n",
"setup_dns_privacy_other_3": "<0>dnscrypt-proxy</0> obsługuje <1>DNS-przez-HTTPS</1>.",
"setup_dns_privacy_other_4": "<0>Mozilla Firefox</0> obsługuje <1>DNS-przez-HTTPS</1>.",
"setup_dns_privacy_other_5": "Znajdziesz więcej implementacji <0>tutaj</0> i <1>tutaj</1>.",
"setup_dns_notice": "Aby użyć <1>DNS-przez-HTTPS</1> lub <1>DNS-przez-TLS</1>, musisz <0>skonfigurować szyfrowanie</0> w ustawieniach AdGuard Home.",
"rewrite_added": "Pomyślnie dodano przepisanie DNS dla „{{key}}”",
"rewrite_deleted": "Przepisanie DNS dla „{{key}}” zostało pomyślnie usunięte",
"rewrite_add": "Dodaj przepisywanie DNS",
"rewrite_not_found": "Nie znaleziono przepisywania DNS",
"rewrite_confirm_delete": "Czy na pewno chcesz usunąć przepisywanie DNS dla „{{key}}”?",
"rewrite_desc": "Pozwala łatwo skonfigurować niestandardową odpowiedź DNS dla określonej nazwy domeny.",
"rewrite_applied": "Przepisano regułę",
"dns_rewrites": "Przepisywanie DNS",
"form_domain": "Wprowadź domenę",
"form_answer": "Wpisz adres IP lub nazwę domeny",
"form_error_domain_format": "Niepoprawny format domeny",
"form_error_answer_format": "Nieprawidłowy format odpowiedzi",
"configure": "Skonfiguruj",
"main_settings": "Ustawienia główne",
"block_services": "Blokuj określone usługi",
"blocked_services": "Zablokowane usługi",
"blocked_services_desc": "Pozwala szybko blokować popularne witryny i usługi.",
"blocked_services_saved": "Zablokowane usługi zostały pomyślnie zapisane",
"blocked_services_global": "Użyj globalnych zablokowanych usług",
"blocked_service": "Zablokowana usługa",
"block_all": "Zablokuj wszystko",
"unblock_all": "Odblokuj wszystko",
"encryption_certificate_path": "Ścieżka certyfikatu",
"encryption_private_key_path": "Ścieżka klucza prywatnego",
"encryption_certificates_source_path": "Ustaw ścieżkę do pliku certyfikatów",
"encryption_certificates_source_content": "Wklej zawartość certyfikatów",
"encryption_key_source_path": "Ustaw plik klucza prywatnego",
"encryption_key_source_content": "Wklej zawartość klucza prywatnego",
"stats_params": "Konfiguracja statystyk",
"config_successfully_saved": "Konfiguracja została pomyślnie zapisana",
"interval_24_hour": "24 godziny",
"interval_days": "{{value}} dni",
"interval_days_plural": "{{count}} dni",
"domain": "Domena",
"answer": "Odpowiedź",
"filter_added_successfully": "Pomyślnie dodano filtr",
"statistics_retention": "Przechowywanie statystyk",
"statistics_retention_desc": "Jeśli zmniejszysz wartość interwału, niektóre dane zostaną utracone",
"statistics_clear": " Wyczyść statystyki",
"statistics_clear_confirm": "Czy na pewno chcesz wyczyścić statystyki?",
"statistics_cleared": "Statystyki zostały pomyślnie wyczyszczone"
}

View File

@@ -4,7 +4,6 @@
"upstream_parallel": "Usar consultas paralelas para acelerar a resolução consultando simultaneamente todos os servidores upstream",
"bootstrap_dns": "Servidores DNS de inicialização",
"bootstrap_dns_desc": "Servidores DNS de inicialização são usados para resolver endereços IP dos resolvedores DoH/DoT que você especifica como upstreams.",
"url_added_successfully": "URL adicionada com sucesso",
"check_dhcp_servers": "Verificar por servidores DHCP",
"save_config": "Salvar configuração",
"enabled_dhcp": "Servidor DHCP ativado",
@@ -18,9 +17,11 @@
"dhcp_leases": "Concessões DHCP",
"dhcp_static_leases": "Concessões de DHCP estático",
"dhcp_leases_not_found": "Nenhuma concessão DHCP encontrada",
"dhcp_config_saved": "Salvar configurações do servidor DHCP",
"dhcp_config_saved": "Configurações DHCP salvas com sucesso",
"form_error_required": "Campo obrigatório",
"form_error_ip_format": "formato de endereço IPv4 inválido",
"form_error_ip4_format": "Formato de endereço IPv4 inválido",
"form_error_ip6_format": "Formato de endereço IPv6 inválido",
"form_error_ip_format": "Formato de endereço IPv inválido",
"form_error_mac_format": "Formato do endereço MAC inválido",
"form_error_positive": "Deve ser maior que 0",
"dhcp_form_gateway_input": "IP do gateway",
@@ -44,6 +45,7 @@
"dhcp_new_static_lease": "Nova 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": "Você tem certeza de que deseja redefinir a configuração DHCP?",
"delete_confirm": "Você tem certeza de que deseja excluir \"{{key}}\"?",
"form_enter_hostname": "Digite o hostname",
"error_details": "Detalhes do erro",
@@ -67,17 +69,21 @@
"disabled_protection": "Proteção desativada",
"refresh_statics": "Atualizar estatísticas",
"dns_query": "Consultas de DNS",
"blocked_by": "Bloqueador por filtros",
"blocked_by": "<0>Bloqueador por filtros</0>",
"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_days": "nos últimos {{count}} dias",
"for_last_days_plural": "nos últimos {{count}} dias",
"no_domains_found": "Nenhum domínio encontrado",
"requests_count": "Contagem de solicitações",
"top_blocked_domains": "Principais domínios bloqueados",
"top_clients": "Principais clientes",
"no_clients_found": "Nenhuma cliente encontrado",
"general_statistics": "Estatísticas gerais",
"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_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",
@@ -93,16 +99,16 @@
"use_adguard_parental": "Usar o serviço de controle parental do AdGuard",
"use_adguard_parental_hint": "O AdGuard Home irá verificar se o domínio contém conteúdo adulto. Ele usa a mesma API amigável de privacidade que o serviço de segurança da navegação.",
"enforce_safe_search": "Forçar pesquisa segura",
"enforce_save_search_hint": "O AdGuard Home pode forçar a pesquisa segura nos seguintes motores de busca: Google, Youtube, Bing e Yandex.",
"enforce_save_search_hint": "O AdGuard Home pode forçar a pesquisa segura nos seguintes motores de busca: Google, YouTube, Bing, DuckDuckGo, Yandex, Pixabay.",
"no_servers_specified": "Nenhum servidor especificado",
"no_settings": "Não configurado",
"general_settings": "Configurações gerais",
"dns_settings": "Configurações de DNS",
"encryption_settings": "Configurações de criptografia",
"dhcp_settings": "Configurações de DHCP",
"upstream_dns": "Servidores DNS upstream",
"upstream_dns_hint": "Se você deixar este campo vazio, o AdGuard Home irá usar o<a href='https://1.1.1.1/' target='_blank'>DNS da Cloudflare</a> como upstream.",
"upstream_dns_hint": "Se você deixar este campo em branco, o AdGuard Home irá usar o <a href='https://www.quad9.net/' target='_blank'>Quad9</a> como upstream.",
"test_upstream_btn": "Testar upstreams",
"upstreams": "Upstreams",
"apply_btn": "Aplicar",
"disabled_filtering_toast": "Filtragem desativada",
"enabled_filtering_toast": "Filtragem ativada",
@@ -139,7 +145,7 @@
"example_comment": "! Aqui vai um comentário",
"example_comment_meaning": "apenas um comentário",
"example_comment_hash": "# Também um comentário",
"example_regex_meaning": "bloqueia o acesso aos domínios que correspondem à <0>expressão regular especificada</0>",
"example_regex_meaning": "bloqueia o acesso aos domínios que correspondem à expressão regular especificada",
"example_upstream_regular": "DNS regular (através do UDP)",
"example_upstream_dot": "<0>DNS-sobre-TLS</0> criptografado",
"example_upstream_doh": "<0>DNS-sobre-HTTPS</0> criptografado",
@@ -160,11 +166,7 @@
"show_all_filter_type": "Mostrar todos",
"show_filtered_type": "Mostrar filtrados",
"no_logs_found": "Nenhum registro encontrado",
"disabled_log_btn": "Desativar registros",
"download_log_file_btn": "Baixar arquivo de registros",
"refresh_btn": "Atualizar",
"enabled_log_btn": "Ativar registros",
"last_dns_queries": "Últimas 5000 consultas DNS",
"previous_btn": "Anterior",
"next_btn": "Próximo",
"loading_table_status": "Carregando",
@@ -174,8 +176,17 @@
"updated_custom_filtering_toast": "Regras de filtragem personalizadas atualizadas",
"rule_removed_from_custom_filtering_toast": "Regra removida das regras de filtragem personalizadas",
"rule_added_to_custom_filtering_toast": "Regra adicionada às regras de filtragem personalizadas",
"query_log_disabled_toast": "Registros de consultas desativado",
"query_log_enabled_toast": "Registros de consultas ativado",
"query_log_response_status": "Status: {{value}}",
"query_log_filtered": "Filtrado por {{filter}}",
"query_log_confirm_clear": "Você tem certeza que deseja limpar o registro de consulta?",
"query_log_cleared": "O registro de consulta foi limpo com sucesso",
"query_log_clear": "Limpar registros de consulta",
"query_log_retention": "Arquivamento de registros de consultas",
"query_log_enable": "Ativar registro",
"query_log_configuration": "Configuração de registros",
"query_log_disabled": "O registro de consulta está desativado e pode ser configurado em <0>configurações</0>",
"query_log_strict_search": "Use aspas duplas para uma pesquisa mais criteriosa",
"query_log_retention_confirm": "Você tem certeza de que deseja alterar o arquivamento do registro de consulta? Se diminuir o valor de intervalo, alguns dados serão perdidos",
"source_label": "Fonte",
"found_in_known_domain_db": "Encontrado no banco de dados de domínios conhecidos.",
"category_label": "Categoria",
@@ -193,7 +204,7 @@
"install_settings_dns_desc": "Você precisa configurar seu dispositivo ou roteador para usar o servidor DNS nos seguintes endereços:",
"install_settings_all_interfaces": "Todas interfaces",
"install_auth_title": "Autenticação",
"install_auth_desc": "É altamente recomendável configurar uma senha de autenticação na interface web de administrador do AdGuard Home. Mesmo que seja acessível apenas em sua rede local, ainda é importante protegê-lo contra o acesso irrestrito.",
"install_auth_desc": "É altamente recomendável configurar a autenticação por senha na interface web de administração do AdGuard Home. Mesmo que ela seja acessível somente em sua rede local, ainda assim é importante protegê-la contra acesso irrestrito.",
"install_auth_username": "Nome de usuário",
"install_auth_password": "Senha",
"install_auth_confirm": "Confirmar senha",
@@ -272,6 +283,8 @@
"update_announcement": "AdGuard Home {{version}} está disponível!<0>Clique aqui</0> para mais informações.",
"setup_guide": "Guia de configuração",
"dns_addresses": "Endereços DNS",
"dns_start": "O servidor DNS está iniciando",
"dns_status_error": "Ocorreu um erro ao obter o status do servidor DNS",
"down": "Caiu",
"fix": "Corrigido",
"dns_providers": "Aqui está uma <0>lista de provedores de DNS conhecidos</0> para escolher.",
@@ -290,15 +303,16 @@
"client_edit": "Editar cliente",
"client_identifier": "Identificador",
"ip_address": "Endereço de IP",
"client_identifier_desc": "Os clientes podem ser identificados pelo endereço de IP ou pelo endereço MAC. Observe que o uso do endereço MAC como identificador só é possível se o AdGuard Home também for um <0>servidor DHCP</0>",
"client_identifier_desc": "Clientes podem ser identificados pelo endereço de IP ou pelo endereço MAC. Observe que o uso do endereço MAC como identificador só é possível se o AdGuard Home também for um <0>servidor DHCP</0>",
"form_enter_ip": "Digite o endereço de IP",
"form_enter_mac": "Digite o endereço MAC",
"form_enter_id": "Inserir identificador",
"form_add_id": "Adicionar identificador",
"form_client_name": "Digite o nome do cliente",
"client_global_settings": "Usar configurações global",
"client_deleted": "Cliente \"{{key}}\" excluído com sucesso",
"client_added": "Cliente \"{{key}}\" adicionado com sucesso",
"client_updated": "Cliente \"{{key}}\" atualizado com sucesso",
"table_statistics": "Contagem de solicitações (últimas 24 horas)",
"clients_not_found": "Nenhum cliente foi encontrado",
"client_confirm_delete": "Você tem certeza de que deseja excluir o cliente \"{{key}}\"?",
"filter_confirm_delete": "Você tem certeza de que deseja excluir o filtro?",
@@ -353,5 +367,47 @@
"blocked_services_global": "Usar serviços bloqueados globais",
"blocked_service": "Serviço bloqueado",
"block_all": "Bloquear tudo",
"unblock_all": "Desbloquear todos"
"unblock_all": "Desbloquear todos",
"encryption_certificate_path": "Caminho do certificado",
"encryption_private_key_path": "Caminho da chave privada",
"encryption_certificates_source_path": "Definir o caminho do arquivo de certificados",
"encryption_certificates_source_content": "Colar o conteúdo dos certificados",
"encryption_key_source_path": "Definir um arquivo de chave privada",
"encryption_key_source_content": "Colar o conteúdo da chave privada",
"stats_params": "Configuração de estatísticas",
"config_successfully_saved": "Configuração salva com sucesso",
"interval_24_hour": "24 horas",
"interval_days": "{{count}} dias",
"interval_days_plural": "{{count}} dias",
"domain": "Domínio",
"answer": "Resposta",
"filter_added_successfully": "O filtro foi adicionado com sucesso",
"statistics_configuration": "Configurações de estatísticas",
"statistics_retention": "Permanência das estatísticas",
"statistics_retention_desc": "Se você diminuir o valor do intervalo, alguns dados serão perdidos",
"statistics_clear": " Limpar estatísticas",
"statistics_clear_confirm": "Você tem certeza de que deseja limpar as estatísticas?",
"statistics_retention_confirm": "Você tem certeza que quer alterar o arquivamento das estatísticas? Se diminuir o valor do intervalo, alguns dados serão perdidos",
"statistics_cleared": "As estatísticas foram limpas com sucesso",
"interval_hours": "{{count}} hora",
"interval_hours_plural": "{{count}} horas",
"filters_configuration": "Configuração de filtros",
"filters_enable": "Ativar filtros",
"filters_interval": "Intervalo de atualização de filtros",
"disabled": "Desativado",
"username_label": "Nome de usuário",
"username_placeholder": "Digite o nome de usuário",
"password_label": "Senha",
"password_placeholder": "Digite a senha",
"sign_in": "Entrar",
"sign_out": "Encerrar sessão",
"forgot_password": "Esqueceu sua senha?",
"forgot_password_desc": "Por favor, siga <0>estes passos</0> para criar uma nova senha para a sua conta.",
"location": "Localização",
"orgname": "Nome da organização",
"netname": "Nome da rede",
"descr": "Descrição",
"whois": "Whois",
"filtering_rules_learn_more": "<0>Saiba mais</0> sobre como criar as suas próprias listas negras de servidores.",
"blocked_by_response": "Bloqueado por CNAME ou IP na resposta"
}

View File

@@ -0,0 +1,413 @@
{
"client_settings": "Definições do cliente",
"example_upstream_reserved": "pode especificar um DNS upstream <0>para domínio(s) especifico(s)</0>",
"upstream_parallel": "Usar consultas paralelas para acelerar a resolução consultando simultaneamente todos os servidores upstream",
"bootstrap_dns": "Servidores DNS de inicialização",
"bootstrap_dns_desc": "Servidores DNS de inicialização são usados para resolver endereços IP dos resolvedores DoH/DoT que especifica como upstreams.",
"check_dhcp_servers": "Verificar por servidores DHCP",
"save_config": "Guardar configuração",
"enabled_dhcp": "Servidor DHCP activado",
"disabled_dhcp": "Servidor DHCP desactivado",
"dhcp_title": "Servidor DHCP (experimental)",
"dhcp_description": "Se o seu router não fornecer configurações de DHCP, poderá usar o servidor DHCP integrado do AdGuard.",
"dhcp_enable": "Activar servidor DHCP",
"dhcp_disable": "Desactivar servidor DHCP",
"dhcp_not_found": "É seguro activar o servidor DHCP integrado - não encontrámos nenhum servidor DHCP activo na rede. No entanto, recomendamos que faça manualmente uma nova verificação, pois o nosso teste automático não oferece 100% de garantia.",
"dhcp_found": "Um servidor DHCP activo foi encontrado na rede. Não é seguro activar o servidor DHCP incorporado.",
"dhcp_leases": "Concessões DHCP",
"dhcp_static_leases": "Concessões de DHCP estático",
"dhcp_leases_not_found": "Nenhuma concessão DHCP encontrada",
"dhcp_config_saved": "Configurações DHCP guardadas com sucesso",
"form_error_required": "Campo obrigatório",
"form_error_ip4_format": "Formato de endereço IPv4 inválido",
"form_error_ip6_format": "Formato de endereço IPv6 inválido",
"form_error_ip_format": "Formato de endereço IPv4 inválido",
"form_error_mac_format": "Formato do endereço MAC inválido",
"form_error_positive": "Deve ser maior que 0",
"dhcp_form_gateway_input": "IP do gateway",
"dhcp_form_subnet_input": "Máscara de sub-rede",
"dhcp_form_range_title": "Faixa de endereços IP",
"dhcp_form_range_start": "Início da faixa",
"dhcp_form_range_end": "Final da faixa",
"dhcp_form_lease_title": "Tempo de concessão do DHCP (em segundos)",
"dhcp_form_lease_input": "Duração da concessão",
"dhcp_interface_select": "Seleccione a interface DHCP",
"dhcp_hardware_address": "Endereço de hardware",
"dhcp_ip_addresses": "Endereços de IP",
"dhcp_table_hostname": "Nome do servidor",
"dhcp_table_expires": "Expira",
"dhcp_warning": "Se quiser activar o servidor DHCP, verifique se não há outro servidor DHCP activo na sua rede. Caso contrário, a internet pode parar de funcionar noutros dispositivos ligados!",
"dhcp_error": "Não foi possível determinar se existe outro servidor DHCP na rede.",
"dhcp_static_ip_error": "Para usar o servidor DHCP, deve definir um endereço IP estático. Não conseguimos determinar se essa interface de rede está configurada usando o endereço de IP estático. Por favor, defina um endereço IP estático manualmente.",
"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 actual é <0> {{ipAddress}} </ 0>. Vamos definir automaticamente este endereço IP como estático se pressionar o botão Activar 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_new_static_lease": "Nova 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": "Tem a certeza de que deseja redefinir a configuração DHCP?",
"delete_confirm": "Tem a certeza de que deseja excluir \"{{key}}\"?",
"form_enter_hostname": "Insira o hostname",
"error_details": "Detalhes do erro",
"back": "Retroceder",
"dashboard": "Painel",
"settings": "Definições",
"filters": "Filtros",
"query_log": "Registo de consultas",
"faq": "Perguntas frequentes",
"version": "Versão",
"address": "endereço",
"on": "LIGADO",
"off": "DESLIGADO",
"copyright": "Copyright",
"homepage": "Página inicial",
"report_an_issue": "Comunicar um problema",
"privacy_policy": "Política de Privacidade",
"enable_protection": "Activar protecção",
"enabled_protection": "Activar protecção",
"disable_protection": "Desactivar protecção",
"disabled_protection": "Desactivar protecção",
"refresh_statics": "Repor estatísticas",
"dns_query": "Consultas de DNS",
"blocked_by": "<0>Bloqueado por Filtros</0>",
"stats_malware_phishing": "Malware/phishing bloqueados",
"stats_adult": "Sites adultos bloqueados",
"stats_query_domain": "Principais domínios consultados",
"for_last_24_hours": "nas últimas 24 horas",
"for_last_days": "nos últimos {{count}} dias",
"for_last_days_plural": "nos últimos {{count}} dias",
"no_domains_found": "Não foram encontrados domínios",
"requests_count": "Contagem de solicitações",
"top_blocked_domains": "Principais domínios bloqueados",
"top_clients": "Principais clientes",
"no_clients_found": "Nenhum cliente foi encontrado",
"general_statistics": "Estatísticas gerais",
"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_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": "Vários sites adultos bloqueados",
"enforced_save_search": "Forçar pesquisa segura",
"number_of_dns_query_to_safe_search": "Várias solicitações de DNS para motores de busca para os quais a pesquisa segura foi aplicada",
"average_processing_time": "Tempo médio de processamento",
"average_processing_time_hint": "Tempo médio em milissegundos no processamento de uma solicitação DNS",
"block_domain_use_filters_and_hosts": "Bloquear domínios usando arquivos de filtros e hosts",
"filters_block_toggle_hint": "Pode configurar as regras de bloqueio nas configurações de <a href='#filters'>Filtros</a>.",
"use_adguard_browsing_sec": "Usar o serviço de segurança da navegação do AdGuard",
"use_adguard_browsing_sec_hint": "O AdGuard Home irá verificar se o domínio está na lista negra do serviço de segurança da navegação. Usará a API de pesquisa de privacidade para executar a verificação: apenas um prefixo curto do hash do nome de domínio SHA256 é enviado para o servidor.",
"use_adguard_parental": "Usar o serviço de controlo parental do AdGuard",
"use_adguard_parental_hint": "O AdGuard Home irá verificar se o domínio contém conteúdo adulto. Usa a mesma API amigável de privacidade que o serviço de segurança da navegação.",
"enforce_safe_search": "Forçar pesquisa segura",
"enforce_save_search_hint": "O AdGuard Home pode forçar a pesquisa segura nos seguintes motores de busca: Google, Youtube, Bing, DuckDuckGo, Yandex, Pixabay.",
"no_servers_specified": "Nenhum servidor especificado",
"general_settings": "Definições gerais",
"dns_settings": "Definições de DNS",
"encryption_settings": "Configurações de criptografia",
"dhcp_settings": "Configurações de DHCP",
"upstream_dns": "Servidores DNS upstream",
"upstream_dns_hint": "Se deixar este campo vazio, o AdGuard Home irá usar <a href='https://www.quad9.net/' target='_blank'>Quad9</a> como upstream.",
"test_upstream_btn": "Testar upstreams",
"upstreams": "Upstreams",
"apply_btn": "Aplicar",
"disabled_filtering_toast": "Filtragem desactivada",
"enabled_filtering_toast": "Filtragem activada",
"disabled_safe_browsing_toast": "Navegação segura desactivada",
"enabled_safe_browsing_toast": "Navegação segura activada",
"disabled_parental_toast": "Controlo parental desactivado",
"enabled_parental_toast": "Controlo parental activado",
"disabled_safe_search_toast": "Pesquisa segura desactivada",
"enabled_save_search_toast": "Pesquisa segura activada",
"enabled_table_header": "Activados",
"name_table_header": "Nome",
"filter_url_table_header": "URL do filtro",
"rules_count_table_header": "Total de Regras",
"last_time_updated_table_header": "Última actualização",
"actions_table_header": "Acções",
"edit_table_action": "Editar",
"delete_table_action": "Apagar",
"filters_and_hosts": "Filtros e listas de bloqueio de hosts",
"filters_and_hosts_hint": "O AdGuard Home entende regras básicas de bloqueio de anúncios e a sintaxe de arquivos de hosts.",
"no_filters_added": "Nenhum filtro adicionado",
"add_filter_btn": "Adicionar filtro",
"cancel_btn": "Cancelar",
"enter_name_hint": "Insira o nome",
"enter_url_hint": "Insira URL",
"check_updates_btn": "Verificar actualizações",
"new_filter_btn": "Nova inscrição de filtro",
"enter_valid_filter_url": "Insira a URL válida para efectuar a inscrição de filtro ou um arquivo de hosts.",
"custom_filter_rules": "Regras de filtragem personalizadas",
"custom_filter_rules_hint": "Insira uma regra por linha. Pode usar regras de bloqueio de anúncios ou a sintaxe de arquivos de hosts.",
"examples_title": "Exemplos",
"example_meaning_filter_block": "bloqueia o acesso ao domínio exemplo.org e a todos os seus subdomínios",
"example_meaning_filter_whitelist": "desbloqueia o acesso ao domínio exemplo.org e a todos os seus subdomínios",
"example_meaning_host_block": "O AdGuard Home irá retornar o endereço 127.0.0.1 para o domínio exemplo.org (excepto os seus subdomínios).",
"example_comment": "! Aqui vai um comentário",
"example_comment_meaning": "apenas um comentário",
"example_comment_hash": "# Também um comentário",
"example_regex_meaning": "bloquear o acesso aos domínios que correspondam à expressão regular especificada",
"example_upstream_regular": "dNS regular (através do UDP)",
"example_upstream_dot": "<0>DNS-sobre-TLS</0> criptografado",
"example_upstream_doh": "<0>DNS-sobre-HTTPS</0> criptografado",
"example_upstream_sdns": "pode usar <0>DNS Stamps</0>para o <1>DNSCrypt</1>ou usar os resolvedores <2>DNS-sobre-HTTPS</2>",
"example_upstream_tcp": "dNS regular (através do TCP)",
"all_filters_up_to_date_toast": "Os filtros já estão actualizados",
"updated_upstream_dns_toast": "A actualizar os servidores DNS upstream",
"dns_test_ok_toast": "Os servidores DNS especificados estão a funcionar correctamente",
"dns_test_not_ok_toast": "O servidor \"{{key}}\": não pôde ser utilizado. Por favor, verifique se o escreveu correctamente",
"unblock_btn": "Desbloquear",
"block_btn": "Bloquear",
"time_table_header": "Data",
"domain_name_table_header": "Nome do domínio",
"type_table_header": "Tipo",
"response_table_header": "Resposta",
"client_table_header": "Cliente",
"empty_response_status": "Vazio",
"show_all_filter_type": "Mostrar todos",
"show_filtered_type": "Mostrar filtrados",
"no_logs_found": "Nenhum registo encontrado",
"refresh_btn": "Actualizar",
"previous_btn": "Anterior",
"next_btn": "Seguinte",
"loading_table_status": "A carregar...",
"page_table_footer_text": "Página",
"of_table_footer_text": "de",
"rows_table_footer_text": "linhas",
"updated_custom_filtering_toast": "Regras de filtragem personalizadas actualizadas",
"rule_removed_from_custom_filtering_toast": "Regra removida das regras de filtragem personalizadas",
"rule_added_to_custom_filtering_toast": "Regra adicionada às regras de filtragem personalizadas",
"query_log_response_status": "Status: {{value}}",
"query_log_filtered": "Filtrado por {{filter}}",
"query_log_confirm_clear": "Tem a certeza de que deseja limpar todo o registo de consulta?",
"query_log_cleared": "O registo de consulta foi limpo com sucesso",
"query_log_clear": "Limpar registos de consulta",
"query_log_retention": "Retenção de registos de consulta",
"query_log_enable": "Activar registo",
"query_log_configuration": "Definições do registo",
"query_log_disabled": "O registo de consulta está desactivado e pode ser configurado em <0>definições</0>",
"query_log_strict_search": "Usar aspas duplas para uma pesquisa rigorosa",
"query_log_retention_confirm": "Tem a certeza de que deseja alterar a retenção do registo de consulta? Se diminuir o valor do intervalo, alguns dados serão perdidos",
"source_label": "Fonte",
"found_in_known_domain_db": "Encontrado no banco de dados de domínios conhecido.",
"category_label": "Categoria",
"rule_label": "Regra",
"filter_label": "Filtro",
"unknown_filter": "Filtro desconhecido {{filterId}}",
"install_welcome_title": "Bem-vindo ao AdGuard Home!",
"install_welcome_desc": "O AdGuard Home é um servidor de DNS para bloqueio de anúncios e monitorização em toda a rede. A sua finalidade é permitir que controle toda a sua rede e os seus dispositivos sem precisar de ter um programa instalado.",
"install_settings_title": "Interface web de administrador",
"install_settings_listen": "Interface de escuta",
"install_settings_port": "Porta",
"install_settings_interface_link": "A interface web de administrador do AdGuard estará disponível nos seguintes endereços:",
"form_error_port": "Insira uma porta válida",
"install_settings_dns": "Servidor DNS",
"install_settings_dns_desc": "Precisa de configurar o seu dispositivo ou router para usar o servidor DNS nos seguintes endereços:",
"install_settings_all_interfaces": "Todas as interfaces",
"install_auth_title": "Autenticação",
"install_auth_desc": "É altamente recomendável configurar a autenticação por palavra-passe para a sua interface web de administrador do AdGuard Home. Mesmo que seja acessível apenas na sua rede local, ainda assim é importante protegê-lo contra o acesso irrestrito.",
"install_auth_username": "Nome do utilizador",
"install_auth_password": "Palavra-passe",
"install_auth_confirm": "Confirmar palavra-passe",
"install_auth_username_enter": "Insira o nome de utilizador",
"install_auth_password_enter": "Insira palavra-passe",
"install_step": "Passo",
"install_devices_title": "Configure os seus dispositivos",
"install_devices_desc": "Para que o AdGuard Home comece a funcionar, precisa de configurar os seus dispositivos para o poder usar.",
"install_submit_title": "Parabéns!",
"install_submit_desc": "O procedimento de configuração está concluído e está pronto para começar a usar o AdGuard Home.",
"install_devices_router": "Router",
"install_devices_router_desc": "Esta configuração cobrirá automaticamente todos os dispositivos ligados ao seu router doméstico e não irá precisar de configurar cada um deles manualmente.",
"install_devices_address": "O servidor de DNS do AdGuard Home está a capturar os seguintes endereços",
"install_devices_router_list_1": "Abra as configurações do seu router. No navegador insira o IP do router, o padrão é (http://192.168.0.1/ ou http://192.168.1.1/), e o login e a palavra-passe é admin/admin; Se não se lembra da palavra-passe, pode redefinir a palavra-passe rapidamente pressionando um botão no próprio router. Alguns routers têm um aplicação específica que já deve estar instalada no seu computador/telefone.",
"install_devices_router_list_2": "Encontre as configurações de DNS. Procure as letras DNS ao lado de um campo que permite dois ou três conjuntos de números, cada um dividido em quatro grupos de um a três números.",
"install_devices_router_list_3": "Insira aqui seu servidor do AdGuard Home.",
"install_devices_windows_list_1": "Abra o Painel de Controlo através do Menu Iniciar ou pela Pesquisa do Windows.",
"install_devices_windows_list_2": "Entre na categoria Rede e Internet e depois clique em Central de Rede e Partilha.",
"install_devices_windows_list_3": "No lado esquerdo da janela clique em Alterar as definições do adaptador.",
"install_devices_windows_list_4": "Seleccione sua actual ligação, clique nela com o botão direito do rato e depois clique em Propriedades.",
"install_devices_windows_list_5": "Procure na lista por Internet Protocol Version 4 (TCP/IP), seleccione e clique novamente em Propriedades.",
"install_devices_windows_list_6": "Marque Usar os seguintes endereços de servidor DNS e insira os endereços do servidores do AdGuard Home.",
"install_devices_macos_list_1": "Clique na ícone da Apple e depois em Preferências do Sistema.",
"install_devices_macos_list_2": "Clique em Rede.",
"install_devices_macos_list_3": "Seleccione a primeira ligação da lista e clique em Avançado.",
"install_devices_macos_list_4": "Seleccione a guia DNS e insira os endereços dos servidores do AdGuard Home.",
"install_devices_android_list_1": "No painel inicial do menu Android, toque em Definições.",
"install_devices_android_list_2": "Toque em Wi-Fi no menu. O painel com todas as redes será exibida (não é possível configurar DNS personalizado para uma conexão de dados móveis).",
"install_devices_android_list_3": "Pressione prolongadamente a rede à qual está ligado e toque em Modificar Rede.",
"install_devices_android_list_4": "Toque em Wi-Fi no menu. O painel com todas as redes será exibida (não é possível configurar DNS personalizado para uma conexão de dados móveis).",
"install_devices_android_list_5": "Altere o conjunto dos valores DNS 1 e DNS 2 para os endereços de servidores do AdGuard Home.",
"install_devices_ios_list_1": "No painel inicial, toque em Definições.",
"install_devices_ios_list_2": "Seleccione Wi-Fi no menu esquerdo (não é possível configurar o DNS em conexões de dados móveis).",
"install_devices_ios_list_3": "Toque no nome da rede actualmente activa.",
"install_devices_ios_list_4": "No campo DNS, digite os endereços dos servidores do AdGuard Home.",
"get_started": "Vamos Começar",
"next": "Seguinte",
"open_dashboard": "Abrir Painel",
"install_saved": "Guardado com sucesso",
"encryption_title": "Encriptação",
"encryption_desc": "Suporta a criptografia (HTTPS/TLS) para DNS e interface de administração web",
"encryption_config_saved": "Configuração de criptografia guardada",
"encryption_server": "Nome do servidor",
"encryption_server_enter": "Insira o seu nome de domínio",
"encryption_server_desc": "Para usar o protocolo HTTPS, precisa de inserir o nome do servidor que corresponde ao seu certificado SSL.",
"encryption_redirect": "Redireccionar automaticamente para HTTPS",
"encryption_redirect_desc": "Se marcado, o AdGuard Home irá redireccionar automaticamente os endereços HTTP para HTTPS.",
"encryption_https": "Porta HTTPS",
"encryption_https_desc": "Se a porta HTTPS estiver configurada, a interface administrativa do AdGuard Home será acessível via HTTPS e também fornecerá o DNS-sobre-HTTPS no local '/dns-query'.",
"encryption_dot": "Porta DNS-sobre-TLS",
"encryption_dot_desc": "Se essa porta estiver configurada, o AdGuard Home irá executar o servidor DNS-sobre- TSL nesta porta.",
"encryption_certificates": "Certificados",
"encryption_certificates_desc": "Para usar criptografia, precisa de fornecer uma cadeia de certificados SSL válida para o seu domínio. Pode obter um certificado gratuito em <0> {{link}}</0> ou pode comprá-lo numa das autoridades de certificação confiáveis.",
"encryption_certificates_input": "Copie/cole aqui o seu certificado codificado em PEM.",
"encryption_status": "Estado",
"encryption_expire": "Expira",
"encryption_key": "Chave privada",
"encryption_key_input": "Copie/cole aqui a chave privada codificada em PEM para o seu certificado.",
"encryption_enable": "Activar criptografia (HTTPS, DNS-sobre-HTTPS e DNS-sobre-TLS)",
"encryption_enable_desc": "Se a criptografia estiver activada, a interface administrativa do AdGuard Home funcionará em HTTPS, o servidor DNS irá capturar as solicitações por meio do DNS-sobre-HTTPS e DNS-sobre-TLS.",
"encryption_chain_valid": "Cadeia de certificado válida",
"encryption_chain_invalid": "A cadeia de certificado é inválida",
"encryption_key_valid": "Esta é uma chave privada {{type}} válida",
"encryption_key_invalid": "Esta é uma chave privada {{type}} inválida",
"encryption_subject": "Assunto",
"encryption_issuer": "Emissor",
"encryption_hostnames": "Nomes dos servidores",
"encryption_reset": "Tem a certeza de que deseja redefinir a configuração de criptografia?",
"topline_expiring_certificate": "O seu certificado SSL está prestes a expirar. Actualize as suas <0>definições de criptografia</0>.",
"topline_expired_certificate": "O seu certificado SSL está expirado. Actualize as suas <0>definições de criptografia</0>.",
"form_error_port_range": "Digite um porta entre 80 e 65535",
"form_error_port_unsafe": "Esta porta não é segura",
"form_error_equal": "Não deve ser igual",
"form_error_password": "As palavras-passe não coincidem",
"reset_settings": "Redefinir configurações",
"update_announcement": "AdGuard Home {{version}} está disponível!<0>Clique aqui</0> para mais informações.",
"setup_guide": "Guia de instalação",
"dns_addresses": "Endereços DNS",
"dns_start": "O servidor DNS está a iniciar",
"dns_status_error": "Erro ao obter o estado do servidor DNS",
"down": "Caiu",
"fix": "Corrigido",
"dns_providers": "Aqui está uma <0>lista de provedores de DNS conhecidos</0> para escolher.",
"update_now": "Actualizar agora",
"update_failed": "A atualização automática falhou. Por favor, <a href='https://github.com/AdguardTeam/AdGuardHome/wiki/Getting-Started#update'>siga estes passos</a> para actualizar manualmente.",
"processing_update": "Por favor espere, o AdGuard Home está a actualizar-se",
"clients_title": "Clientes",
"clients_desc": "Configure os dispositivos ligados ao AdGuard",
"settings_global": "Global",
"settings_custom": "Personalizar",
"table_client": "Cliente",
"table_name": "Nome",
"save_btn": "Guardar",
"client_add": "Adicionar cliente",
"client_new": "Novo cliente",
"client_edit": "Editar cliente",
"client_identifier": "Identificador",
"ip_address": "Endereço de IP",
"client_identifier_desc": "Os clientes podem ser identificados pelo endereço de IP, CIDR, ou pelo endereço MAC. Observe que o uso do endereço MAC como identificador só é possível se o AdGuard Home também for um <0>servidor DHCP</0>",
"form_enter_ip": "Insira IP",
"form_enter_mac": "Insira o endereço MAC",
"form_enter_id": "Inserir identificador",
"form_add_id": "Adicionar identificador",
"form_client_name": "Insira o nome do cliente",
"client_global_settings": "Usar configurações globais",
"client_deleted": "Cliente \"{{key}}\" excluído com sucesso",
"client_added": "Cliente \"{{key}}\" adicionado com sucesso",
"client_updated": "Cliente \"{{key}}\" actualizado com sucesso",
"clients_not_found": "Nenhum cliente foi encontrado",
"client_confirm_delete": "Tem a certeza de que deseja excluir o cliente \"{{key}}\"?",
"filter_confirm_delete": "Tem a certeza de que deseja excluir o filtro?",
"auto_clients_title": "Clientes (tempo de execução)",
"auto_clients_desc": "Dados dos clientes que usam o AdGuard Home, que não são armazenados na configuração",
"access_title": "Configurações de acesso",
"access_desc": "Aqui pode configurar as regras de acesso para o servidores de DNS do AdGuard Home.",
"access_allowed_title": "Clientes permitidos",
"access_allowed_desc": "Uma lista de endereços IP ou CIDR. Ao configurar, o AdGuard Home irá permitir solicitações apenas desses endereços de IP.",
"access_disallowed_title": "Clientes não permitidos",
"access_disallowed_desc": "Uma lista de endereços IP ou CIDR. Ao configurar, o AdGuard Home irá descartar as solicitações desses endereços de IP.",
"access_blocked_title": "Domínios bloqueados",
"access_blocked_desc": "Não confunda isso com os filtros. O AdGuard Home irá descartar as consultas DNS com esses domínios.",
"access_settings_saved": "Configurações de acesso foram guardadas com sucesso",
"updates_checked": "Actualizações verificadas com sucesso",
"updates_version_equal": "O AdGuard Home está actualizado",
"check_updates_now": "Verificar actualizações",
"dns_privacy": "Privacidade de DNS",
"setup_dns_privacy_1": "<0>DNS-sobre-TLS:</0> Use <1>{{address}}</1> string.",
"setup_dns_privacy_2": "<0>DNS-sobre-HTTPS:</0> Use <1>{{address}}</1> string.",
"setup_dns_privacy_3": "<0>Por favor, note que os protocolos de DNS criptografados são suportados apenas no Android 9. Então, irá precisar de instalar um software adicional noutros sistemas operacionais.</0><0>Aqui está a lista de software que pode usar.</0>",
"setup_dns_privacy_android_1": "O Android 9 suporta o DNS-sobre-TLS de forma nativa. Para o configurar, vá a Definições → Rede e internet → Avançado → DNS privado e digite o seu nome de domínio.",
"setup_dns_privacy_android_2": "O <0>AdGuard para Android</0> suporta <1>DNS-sobre-HTTPS</1> e <1>DNS-sobre-TLS</1>.",
"setup_dns_privacy_android_3": "<0>Intra</0> adiciona o suporte <1>DNS-sobre-HTTPS</1> para o Android.",
"setup_dns_privacy_ios_1": "<0>DNSCloak</0> suporta <1>DNS-sobre-HTTPS</1>, mas para o configurar para usar o seu próprio servidor, precisará de gerar um <2>DNS Stamp</2>.",
"setup_dns_privacy_ios_2": "O <0>AdGuard para iOS</0> suporta a configuração do <1>DNS-sobre-HTTPS</1> e <1>DNS-sobre-TLS</1>.",
"setup_dns_privacy_other_title": "Outras implementações",
"setup_dns_privacy_other_1": "O próprio AdGuard Home pode ser usado como um cliente DNS seguro em qualquer plataforma.",
"setup_dns_privacy_other_2": "<0>dnsproxy</0> suporta todos os protocolos de DNS seguros conhecidos.",
"setup_dns_privacy_other_3": "<0>dnscrypt-proxy</0> suporta <1>DNS-sobre-HTTPS</1>.",
"setup_dns_privacy_other_4": "<0>Mozilla Firefox</0> suporta <1>DNS-sobre-HTTPS</1>.",
"setup_dns_privacy_other_5": "Encontrará mais implementações <0>aqui</0> e <1>aqui</1>.",
"setup_dns_notice": "Para usar o <1>DNS-sobre-HTTPS</1> ou <1>DNS-sobre-TLS</1>, precisa de <0>configurar a criptografia</0> nas configurações do AdGuard Home.",
"rewrite_added": "Reescrita de DNS para \"{{key}}\" adicionada com sucesso",
"rewrite_deleted": "Reescrita de DNS para \"{{key}}\" excluída com sucesso",
"rewrite_add": "Adicionar reescrita de DNS",
"rewrite_not_found": "Nenhuma reescrita de DNS foi encontrada",
"rewrite_confirm_delete": "Tem a certeza de que deseja excluir a reescrita de DNS para \"{{key}}\"?",
"rewrite_desc": "Permite configurar uma resposta personalizada do DNS para um nome de domínio específico.",
"rewrite_applied": "Regra de reescrita aplicada",
"dns_rewrites": "Reescritas de DNS",
"form_domain": "Inserir domínio",
"form_answer": "Insira o endereço de IP ou nome de domínio",
"form_error_domain_format": "Formato de domínio inválido",
"form_error_answer_format": "Formato de resposta inválido",
"configure": "Configurar",
"main_settings": "Definições principais",
"block_services": "Bloquear serviços específicos",
"blocked_services": "Serviços bloqueados",
"blocked_services_desc": "Permite o bloqueio rápido de sites e serviços populares.",
"blocked_services_saved": "Serviços bloqueados guardados com sucesso",
"blocked_services_global": "Usar serviços bloqueados globais",
"blocked_service": "Serviço bloqueado",
"block_all": "Bloquear todos",
"unblock_all": "Desbloquear todos",
"encryption_certificate_path": "Caminho do certificado",
"encryption_private_key_path": "Caminho da chave privada",
"encryption_certificates_source_path": "Definir um caminho do arquivo de certificados",
"encryption_certificates_source_content": "Colar o conteúdo dos certificados",
"encryption_key_source_path": "Definir um arquivo de chave privada",
"encryption_key_source_content": "Colar o conteúdo da chave privada",
"stats_params": "Configuração de estatísticas",
"config_successfully_saved": "Configuração guardada com sucesso",
"interval_24_hour": "24 horas",
"interval_days": "{{count}} dias",
"interval_days_plural": "{{count}} dias",
"domain": "Domínio",
"answer": "Resposta",
"filter_added_successfully": "O filtro foi adicionado com sucesso",
"statistics_configuration": "Configuração das estatísticas",
"statistics_retention": "Retenção de estatísticas",
"statistics_retention_desc": "Se diminuir o valor do intervalo, alguns dados serão perdidos",
"statistics_clear": " Limpar estatísticas",
"statistics_clear_confirm": "Tem a certeza de que deseja limpar as estatísticas?",
"statistics_retention_confirm": "Tem a certeza que quer alterar a retenção de estatísticas? Se diminuir o valor do intervalo, alguns dados serão perdidos",
"statistics_cleared": "As estatísticas foram apagadas com sucesso",
"interval_hours": "{{count}} hora",
"interval_hours_plural": "{{count}} horas",
"filters_configuration": "Configuração dos filtros",
"filters_enable": "Activar filtros",
"filters_interval": "Intervalo de actualização de filtros",
"disabled": "Desactivado",
"username_label": "Nome do utilizador",
"username_placeholder": "Insira o nome de utilizador",
"password_label": "Palavra-passe",
"password_placeholder": "Insira palavra-passe",
"sign_in": "Entrar",
"sign_out": "Sair",
"forgot_password": "Não se lembra da palavra-passe?",
"forgot_password_desc": "Siga <0>estes passos</0> para criar uma nova palavra-passe para a sua conta de utilizador.",
"location": "Localização",
"orgname": "Nome da organização",
"netname": "Nome da rede",
"descr": "Descrição",
"whois": "Whois",
"filtering_rules_learn_more": "<0>Saiba mais</0>sobre como criar as suas próprias listas negras de servidores.",
"blocked_by_response": "Bloqueado por CNAME ou IP em resposta"
}

View File

@@ -1,10 +1,9 @@
{
"client_settings": "Настройки клиентов",
"example_upstream_reserved": "вы можете указать DNS-сервер <0>для конкретного домена(ов)</0>",
"upstream_parallel": "Использовать одновременные запроссы ко всем серверам для ускорения обработки запроса",
"upstream_parallel": "Использовать одновременные запросы ко всем серверам для ускорения обработки запроса",
"bootstrap_dns": "Bootstrap DNS-серверы",
"bootstrap_dns_desc": "Bootstrap DNS-серверы используются для поиска IP-адресов DoH/DoT серверов, которые вы указали.",
"url_added_successfully": "URL успешно добавлен",
"check_dhcp_servers": "Проверить DHCP-серверы",
"save_config": "Сохранить конфигурацию",
"enabled_dhcp": "DHCP-сервер включен",
@@ -18,11 +17,14 @@
"dhcp_leases": "Аренда DHCP",
"dhcp_static_leases": "Статические аренды DHCP",
"dhcp_leases_not_found": "Аренда DHCP не обнаружена",
"dhcp_config_saved": "Сохраненная конфигурация DHCP-сервера",
"dhcp_config_saved": "Конфигурация DHCP-сервера успешно сохранена",
"form_error_required": "Обязательное поле",
"form_error_ip_format": "Неверный формат IPv4",
"form_error_ip4_format": "Неверный формат IPv4",
"form_error_ip6_format": "Неверный формат IPv6",
"form_error_ip_format": "Неверный формат IP-адреса",
"form_error_mac_format": "Некорректный формат MAC",
"form_error_positive": "Должно быть больше 0",
"form_error_negative": "Должно быть не меньше 0",
"dhcp_form_gateway_input": "IP-адрес шлюза",
"dhcp_form_subnet_input": "Маска подсети",
"dhcp_form_range_title": "Диапазон IP-адресов",
@@ -38,12 +40,13 @@
"dhcp_warning": "Если вы все равно хотите включить DHCP-сервер, убедитесь, что в сети больше нет активных DHCP-серверов. Иначе это может сломать доступ в сеть для подключенных устройств!",
"dhcp_error": "Мы не смогли определить присутствие других DHCP-серверов в сети.",
"dhcp_static_ip_error": "Для того, чтобы использовать DHCP-сервер, должен быть установлен статический IP-адрес. Мы не смогли определить, использует ли этот сетевой интерфейс статический IP-адрес. Пожалуйста, установите его вручную.",
"dhcp_dynamic_ip_found": "Ваша система использует динамический IP-адрес для интерфейса <0>{{interfaceName}}</0>. Чтобы использовать DHCP-сервер необходимо установить статический IP-адрес. Ваш текущий IP-адрес - <0>{{ipAddress}}</0>. Мы автоматически установим его как статический ессли вы нажмете кнопку Включить DHCP.",
"dhcp_dynamic_ip_found": "Ваша система использует динамический IP-адрес для интерфейса <0>{{interfaceName}}</0>. Чтобы использовать DHCP-сервер необходимо установить статический IP-адрес. Ваш текущий IP-адрес <0>{{ipAddress}}</0>. Мы автоматически установим его как статический, если вы нажмете кнопку Включить DHCP.",
"dhcp_lease_added": "Статическая аренда \"{{key}}\" успешно добавлена",
"dhcp_lease_deleted": "Статическая аренда \"{{key}}\" успешно удалена",
"dhcp_new_static_lease": "Новая статическая аренда",
"dhcp_static_leases_not_found": "Не найдено статических аренд DHCP",
"dhcp_add_static_lease": "Добавить статическую аренду",
"dhcp_reset": "Вы уверены, что хотите сбросить настройки DHCP?",
"delete_confirm": "Are you sure you want to delete \"{{key}}\"?",
"form_enter_hostname": "Введите имя хоста",
"error_details": "Детализация ошибки",
@@ -67,7 +70,7 @@
"disabled_protection": "Защита выкл.",
"refresh_statics": "Обновить статистику",
"dns_query": "DNS-запросы",
"blocked_by": "Заблокировано фильтрами",
"blocked_by": "<0>Заблокировано фильтрами</0>",
"stats_malware_phishing": "Заблокированные вредоносные и фишинговые сайты",
"stats_adult": "Заблокированные \"взрослые\" сайты",
"stats_query_domain": "Часто запрашиваемые домены",
@@ -93,15 +96,14 @@
"use_adguard_parental": "Используйте модуль Родительского контроля AdGuard ",
"use_adguard_parental_hint": "AdGuard Home проверит, содержит ли домен материалы 18+. Он использует тот же API для обеспечения конфиденциальности, что и веб-служба безопасности браузера.",
"enforce_safe_search": "Усилить безопасный поиск",
"enforce_save_search_hint": "AdGuard Home может обеспечить безопасный поиск в следующих системах: Google, Youtube, Bing и Yandex.",
"enforce_save_search_hint": "AdGuard Home может обеспечить безопасный поиск в следующих поисковых системах: Google, Youtube, Bing, DuckDuckGo, Yandex и Pixabay.",
"no_servers_specified": "Нет указанных серверов",
"no_settings": "Нет настроек",
"general_settings": "Основные настройки",
"dns_settings": "Настройки DNS",
"encryption_settings": "Настройки шифрования",
"dhcp_settings": "Настройки DHCP",
"upstream_dns": "Upstream DNS-серверы",
"upstream_dns_hint": "Если вы оставите это поле пустым, то AdGuard Home использует <a href='https://1.1.1.1/' target='_blank'>Cloudflare DNS</a> в качестве upstream. Используйте tls:// для DNS через серверы TLS.",
"upstream_dns_hint": "Если вы оставите это поле пустым, то AdGuard Home использует <a href='https://www.quad9.net/' target='_blank'>Quad9</a> в качестве DNS сервера.",
"test_upstream_btn": "Тест upstream серверов",
"apply_btn": "Применить",
"disabled_filtering_toast": "Фильтрация выкл.",
@@ -142,7 +144,7 @@
"example_regex_meaning": "блокирует доступ к доменам, соответствующим <0>заданному регулярному выражению</0>",
"example_upstream_regular": "обычный DNS (поверх UDP)",
"example_upstream_dot": "зашифрованный <a href='https://en.wikipedia.org/wiki/DNS_over_TLS' target='_blank'>DNS-поверх-TLS</a>",
"example_upstream_doh": "зашифрованный <a href='https://en.wikipedia.org/wiki/DNS_over_HTTPS' target='_blank'>DNS-поверх-HTTPS</a>",
"example_upstream_doh": "зашифрованный <a href='https://en.wikipedia.org/wiki/DNS_over_HTTPS' target='_blank'>DNS-over-HTTPS</a>",
"example_upstream_sdns": "вы можете использовать <a href='https://dnscrypt.info/stamps/' target='_blank'>DNS Stamps</a> для <a href='https://dnscrypt.info/' target='_blank'>DNSCrypt</a> или <a href='https://en.wikipedia.org/wiki/DNS_over_HTTPS' target='_blank'>DNS-over-HTTPS</a> резолверов",
"example_upstream_tcp": "обычный DNS (поверх TCP)",
"all_filters_up_to_date_toast": "Все фильтры обновлены",
@@ -160,11 +162,7 @@
"show_all_filter_type": "Показать все",
"show_filtered_type": "Показать отфильтрованные",
"no_logs_found": "Логи не найдены",
"disabled_log_btn": "Журнал фильтрации выкл.",
"download_log_file_btn": "Загрузить отчёт",
"refresh_btn": "Обновить",
"enabled_log_btn": "Журнал фильтрации вкл.",
"last_dns_queries": "Последние 5000 DNS-запросов",
"previous_btn": "Назад",
"next_btn": "Вперёд",
"loading_table_status": "Загрузка...",
@@ -174,8 +172,33 @@
"updated_custom_filtering_toast": "Внесены изменения в пользовательские правила",
"rule_removed_from_custom_filtering_toast": "Правило удалено из авторского списка правил фильтрации",
"rule_added_to_custom_filtering_toast": "Пользовательское правило добавлено",
"query_log_disabled_toast": "Журнал запросов выкл.",
"query_log_enabled_toast": "Журнал запросов вкл.",
"query_log_response_status": "Статус: {{value}}",
"query_log_filtered": "Отфильтровано с помощью {{filter}}",
"query_log_confirm_clear": "Вы уверены, что хотите очистить весь журнал запросов?",
"query_log_cleared": "Журнал запросов успешно очищен",
"query_log_clear": "Очистить журнал запросов",
"query_log_retention": "Сохранение журнала запросов",
"query_log_enable": "Включить журнал",
"query_log_configuration": "Настройка журнала",
"query_log_disabled": "Журнал запросов выключен, его можно включить в <0>настройках</0>",
"query_log_strict_search": "Используйте двойные кавычки для строгого поиска",
"query_log_retention_confirm": "Вы уверены, что хотите изменить срок хранения запросов? При сокращении интервала данные могут быть утеряны",
"dns_config": "Настройки DNS-сервера",
"blocking_mode": "Режим блокировки",
"nxdomain": "NXDOMAIN",
"null_ip": "Нулевой IP",
"custom_ip": "Свой IP",
"blocking_ipv4": "Блокировка IPv4",
"blocking_ipv6": "Блокировка IPv6",
"form_enter_rate_limit": "Введите rate limit",
"rate_limit": "Rate limit",
"edns_enable": "Включить отправку EDNS Client Subnet",
"edns_cs_desc": "Если включить эту опцию, AdGuard Home будет отправлять подсети клиентов на DNS-сервера.",
"rate_limit_desc": "Ограничение на количество запросов в секунду для каждого клиента (0 — неограниченно)",
"blocking_ipv4_desc": "IP-адрес, возвращаемый при блокировке A-запроса",
"blocking_ipv6_desc": "IP-адрес, возвращаемый при блокировке AAAA-запроса",
"blocking_mode_desc": "<0>«NXDOMAIN» — посылать в ответ код NXDOMAIN;</0><0>«Нулевой IP» — посылать в ответ нулевой IP-адрес (0.0.0.0 для A-запроса, :: для АААА-запроса);</0><0>«Свой IP» — посылать в ответ указанный IP-адрес.</0>",
"upstream_dns_client_desc": "Если оставить поле пустым, AdGuard Home будет обращаться к серверам, указанным в <0>настройках DNS</0>.",
"source_label": "Источник",
"found_in_known_domain_db": "Найден в базе известных доменов.",
"category_label": "Категория",
@@ -183,7 +206,7 @@
"filter_label": "Фильтр",
"unknown_filter": "Неизвестный фильтр {{filterId}}",
"install_welcome_title": "Добро пожаловать в AdGuard Home!",
"install_welcome_desc": "AdGuard Home - это DNS-сервер, блокирующий рекламу и трекинг. Его цель - дать вам возможность контролировать всю вашу сеть и все подключенные устройства. Он не требует установки клиентских программ.",
"install_welcome_desc": "AdGuard Home это DNS-сервер, блокирующий рекламу и трекинг. Его цель дать вам возможность контролировать всю вашу сеть и все подключенные устройства. Он не требует установки клиентских программ.",
"install_settings_title": "Веб-интерфейс администрирования",
"install_settings_listen": "Сетевой интерфейс",
"install_settings_port": "Порт",
@@ -193,7 +216,7 @@
"install_settings_dns_desc": "Вам будет нужно настроить свои устройства или роутер на использование DNS-сервера на одном из следующих адресов:",
"install_settings_all_interfaces": "Все интерфейсы",
"install_auth_title": "Авторизация",
"install_auth_desc": "Рекомендуется настроить авторизацию по паролю для вашего веб-интерфейса администрирования AdGuard Home. Важно ограничить доступ к нему даже если он доступен только в вашей локальной сети.",
"install_auth_desc": "Настоятельно рекомендуется настроить аутентификацию паролем для веб-интерфейса AdGuard Home. Даже если он доступен только в вашей локальной сети, важно защитить его от неограниченного доступа.",
"install_auth_username": "Имя пользователя",
"install_auth_password": "Пароль",
"install_auth_confirm": "Подтвердить пароль",
@@ -211,7 +234,7 @@
"install_devices_router_list_2": "Найдите настройки DHCP или DNS. Найдите буквы \"DNS\" рядом с текстовым полем, в которое можно ввести два или три ряда цифр, разделенных на 4 группы от одной до трёх цифр.",
"install_devices_router_list_3": "Введите туда адрес вашего AdGuard Home.",
"install_devices_windows_list_1": "Откройте Панель управления через меню \"Пуск\" или через поиск Windows.",
"install_devices_windows_list_2": "Откройте Панель управления через меню \"Пуск\" или через поиск Windows.",
"install_devices_windows_list_2": "Перейдите в \"Сеть и интернет\", а затем в \"Центр управления сетями и общим доступом\"",
"install_devices_windows_list_3": "В левой стороне экрана найдите \"Изменение параметров адаптера\" и кликните по нему.",
"install_devices_windows_list_4": "Выделите ваше активное подключение, затем кликните по нему правой клавишей мыши и выберите \"Свойства\".",
"install_devices_windows_list_5": "Найдите в списке пункт \"IP версии 4 (TCP/IP)\", выделите его и затем снова нажмите \"Свойства\".",
@@ -265,13 +288,15 @@
"topline_expiring_certificate": "Ваш SSL-сертификат скоро истекает. Обновите <0>Настройки шифрования</0>.",
"topline_expired_certificate": "Ваш SSL-сертификат истек. Обновите <0>Настройки шифрования</0>.",
"form_error_port_range": "Введите значение порта из интервала 80-65535",
"form_error_port_unsafe": "Это - небезопасный порт",
"form_error_port_unsafe": "Это небезопасный порт",
"form_error_equal": "Не должны быть равны",
"form_error_password": "Пароли не совпадают",
"reset_settings": "Сбросить настройки",
"update_announcement": "AdGuard Home {{version}} уже доступна! <0>Нажмите сюда</0>, чтобы узнать больше.",
"setup_guide": "Инструкция по настройке",
"dns_addresses": "Адреса DNS",
"dns_start": "DNS-сервер запускается",
"dns_status_error": "Ошибка при получении состояния DNS-сервера",
"down": "Вниз",
"fix": "Исправить",
"dns_providers": "<0>Список известных DNS-провайдеров</0> на выбор.",
@@ -290,15 +315,16 @@
"client_edit": "Редактировать клиента",
"client_identifier": "Идентификатор",
"ip_address": "IP-адрес",
"client_identifier_desc": "Клиенты могут быть идентифицированы по IP-адресу или MAC-адресу. Обратите внимание, что использование MAC как идентификатора, возможно только если AdGuard Home также является и <0>DHCP-сервером</0>",
"client_identifier_desc": "Клиенты могут быть идентифицированы по IP-адресу, CIDR или MAC-адресу. Обратите внимание, что использование MAC как идентификатора возможно, только если AdGuard Home также является и <0>DHCP-сервером</0>",
"form_enter_ip": "Введите IP",
"form_enter_mac": "Введите MAC",
"form_enter_id": "Введите идентификатор",
"form_add_id": "Добавить идентификатор",
"form_client_name": "Введите имя клиента",
"client_global_settings": "Использовать глобальные настройки",
"client_deleted": "Клиент \"{{key}}\" успешно удален",
"client_added": "Клиент \"{{key}}\" успешно добавлен",
"client_updated": "Клиент \"{{key}}\" успешно обновлен",
"table_statistics": "Количество запросов (последние 24 часа)",
"clients_not_found": "Клиентов не найдено",
"client_confirm_delete": "Вы уверены, что хотите удалить клиента \"{{key}}\"?",
"filter_confirm_delete": "Вы уверены, что хотите удалить фильтр?",
@@ -309,7 +335,7 @@
"access_allowed_title": "Разрешенные клиенты",
"access_allowed_desc": "Список CIDR- или IP-адресов. Если он настроен, AdGuard Home будет принимать запросы только с этих IP-адресов.",
"access_disallowed_title": "Запрещенные клиенты",
"access_disallowed_desc": "Список CIDR- или IP-адресов. Если он настроек, AdGuard Home будет игнорировать запросы с этих IP-адресов.",
"access_disallowed_desc": "Список CIDR- или IP-адресов. Если он настроен, AdGuard Home будет игнорировать запросы с этих IP-адресов.",
"access_blocked_title": "Заблокированные домены",
"access_blocked_desc": "Не путайте это с фильтрами. AdGuard Home будет игнорировать DNS-запросы с этими доменами.",
"access_settings_saved": "Настройки доступа успешно сохранены",
@@ -353,5 +379,56 @@
"blocked_services_global": "Использовать глобальные заблокированные сервисы",
"blocked_service": "Заблокированный сервис",
"block_all": "Заблокировать все",
"unblock_all": "Разблокировать все"
"unblock_all": "Разблокировать все",
"encryption_certificate_path": "Путь к сертификату",
"encryption_private_key_path": "Путь к закрытому ключу",
"encryption_certificates_source_path": "Указать путь к файлу сертификатов",
"encryption_certificates_source_content": "Вставить содержимое сертификатов",
"encryption_key_source_path": "Указать файл закрытого ключа",
"encryption_key_source_content": "Вставить содержимое закрытого ключа",
"stats_params": "Конфигурация статистики",
"config_successfully_saved": "Конфигурация успешно сохранена",
"interval_24_hour": "24 часа",
"domain": "Домен",
"answer": "Ответ",
"filter_added_successfully": "Фильтр успешно добавлен",
"statistics_configuration": "Конфигурация статистики",
"statistics_retention": "Сохранение статистики",
"statistics_retention_desc": "Если вы уменьшите значение интервала, некоторые данные могут быть утеряны",
"statistics_clear": " Очистить статистику",
"statistics_clear_confirm": "Вы уверены, что хотите очистить статистику?",
"statistics_retention_confirm": "Вы уверены, что хотите изменить срок хранения статистики? При сокращении интервала данные могут быть утеряны",
"statistics_cleared": "Статистика успешно очищена",
"filters_configuration": "Настройка фильтров",
"filters_enable": "Включить фильтры",
"filters_interval": "Интервал обновления фильтров",
"disabled": "Выключено",
"username_label": "Имя пользователя",
"username_placeholder": "Введите имя пользователя",
"password_label": "Пароль",
"password_placeholder": "Введите пароль",
"sign_in": "Войти",
"sign_out": "Выйти",
"forgot_password": "Забыли пароль?",
"forgot_password_desc": "Пожалуйста, выполните <0>эти действия</0> для создания нового пароля к вашему аккаунту.",
"location": "Местоположение",
"orgname": "Название организации",
"netname": "Название сети",
"descr": "Описание",
"whois": "Whois",
"interval_hours_0": "{{count}} час",
"interval_hours_1": "{{count}} часа",
"interval_hours_2": "{{count}} часов",
"interval_days_0": "{{count}} день",
"interval_days_1": "{{count}} дня",
"interval_days_2": "{{count}} дней",
"for_last_days_0": "за последний {{count}} день",
"for_last_days_1": "за последние {{count}} дня",
"for_last_days_2": "за последние {{count}} дней",
"number_of_dns_query_days_0": "Количество DNS-запросов за {{count}} день",
"number_of_dns_query_days_1": "Количество DNS-запросов за {{count}} дня",
"number_of_dns_query_days_2": "Количество DNS-запросов за {{count}} дней",
"filtering_rules_learn_more": "<0>Узнайте больше</0> о создании собственных списков блокировки хостов.",
"blocked_by_response": "Заблокировано по CNAME или IP в ответе",
"try_again": "Попробовать еще раз"
}

View File

@@ -0,0 +1,413 @@
{
"client_settings": "Nastavenie klienta",
"example_upstream_reserved": "môžete zadať DNS upstream <0>pre konkrétnu doménu (domény)</0>",
"upstream_parallel": "Používajte paralelné dotazy na zrýchlenie riešenia súčasným dopytovaním všetkých serverov",
"bootstrap_dns": "Bootstrap DNS servery",
"bootstrap_dns_desc": "Bootstrap DNS servery sa používajú na rozlíšenie IP adries DoH/DoT rezolverov, ktoré zadáte ako upstreams.",
"check_dhcp_servers": "Skontrolovať DHCP servery",
"save_config": "Uložiť konfiguráciu",
"enabled_dhcp": "DHCP server zapnutý",
"disabled_dhcp": "DHCP server vypnutý",
"dhcp_title": "DHCP server (experimentálne!)",
"dhcp_description": "Ak Váš smerovač neposkytuje možnosť nastaviť DHCP, môžete použiť vlastný zabudovaný DHCP server AdGuard.",
"dhcp_enable": "Zapnúť DHCP server",
"dhcp_disable": "Vypnúť DHCP server",
"dhcp_not_found": "Je bezpečné zapnúť vstavaný DHCP server - v sieti sme nenašli žiadne aktívne DHCP servery. Odporúčame Vám však, aby ste ho znova manuálne skontrolovali, pretože náš automatický test momentálne neposkytuje 100% záruku.",
"dhcp_found": "V sieti bol nájdený aktívny DHCP server. Nie je bezpečné povoliť vstavaný DHCP server.",
"dhcp_leases": "DHCP prenájom",
"dhcp_static_leases": "DHCP statické prenájmy",
"dhcp_leases_not_found": "Neboli nájdené žiadne DHCP prenájmy",
"dhcp_config_saved": "Konfigurácia DHCP servera uložená",
"form_error_required": "Povinná položka",
"form_error_ip4_format": "Nesprávny formát IPv4",
"form_error_ip6_format": "Nesprávny formát IPv6",
"form_error_ip_format": "Nesprávny formát IPv4",
"form_error_mac_format": "Nesprávny MAC formát",
"form_error_positive": "Musí byť väčšie ako 0",
"dhcp_form_gateway_input": "IP brána",
"dhcp_form_subnet_input": "Maska podsiete",
"dhcp_form_range_title": "Rozsah IP adries",
"dhcp_form_range_start": "Začiatok rozsahu",
"dhcp_form_range_end": "Koniec rozsahu",
"dhcp_form_lease_title": "Doba prenájmu DHCP (v sekundách)",
"dhcp_form_lease_input": "Trvanie prenájmu",
"dhcp_interface_select": "Zvoľte DHCP rozhranie",
"dhcp_hardware_address": "Hardware adresa",
"dhcp_ip_addresses": "IP adresy",
"dhcp_table_hostname": "Názov hostiteľa",
"dhcp_table_expires": "Vyprší",
"dhcp_warning": "Ak chcete server DHCP napriek tomu povoliť, uistite sa, že v sieti nie je žiadny iný aktívny DHCP server. V opačnom prípade sa môže prerušiť internet pre už pripojené zariadenia!",
"dhcp_error": "Nebolo možné určiť, či je v sieti iný DHCP server.",
"dhcp_static_ip_error": "Aby bolo možné používať DHCP server, musí byť nastavená statická IP adresa. Nepodarilo sa určiť, či je toto sieťové rozhranie nakonfigurované pomocou statickej adresy IP. Nastavte statickú adresu IP manuálne.",
"dhcp_dynamic_ip_found": "Váš systém používa dynamickú konfiguráciu IP adresy pre rozhranie <0{{interfaceName}}</0>. Aby bolo možné používať DHCP server, musí byť nastavená statická IP adresa. Vaša aktuálna adresa IP je <0>{{ipAddress}}</0>. Automaticky nastavíme túto IP adresu ako statickú, ak stlačíte tlačidlo Povoliť DHCP.",
"dhcp_lease_added": "Statický \"{{key}}\" prenájmu bol úspešne pridaný",
"dhcp_lease_deleted": "Statický \"{{key}}\" prenájmu bol úspešne vymazaný",
"dhcp_new_static_lease": "Nový 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": "Naozaj chcete obnoviť konfiguráciu DHCP?",
"delete_confirm": "Naozaj chcete vymazať \"{{key}}\"?",
"form_enter_hostname": "Zadajte názov hostiteľa",
"error_details": "Podrobnosti chyby",
"back": "Naspäť",
"dashboard": "Riadiaci panel",
"settings": "Nastavenia",
"filters": "Filtre",
"query_log": "Denník dopytov",
"faq": "FAQ",
"version": "Verzia",
"address": "adresa",
"on": "ZAP.",
"off": "VYP.",
"copyright": "Copyright",
"homepage": "Domovská stránka",
"report_an_issue": "Nahlásiť problém",
"privacy_policy": "Pravidlá ochrany súkromia",
"enable_protection": "Zapnúť ochranu",
"enabled_protection": "Ochrana zapnutá",
"disable_protection": "Vypnúť ochranu",
"disabled_protection": "Ochrana vypnutá",
"refresh_statics": "Obnoviť štatistiku",
"dns_query": "DNS dopyty",
"blocked_by": "<0>Blokované filtrami<0>",
"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_days": "za posledný {{count}} deň",
"for_last_days_plural": "za posledných {{count}} dní",
"no_domains_found": "Žiadna doména nebola nájdená",
"requests_count": "Počet dopytov",
"top_blocked_domains": "Najčastejšie zablokované domény",
"top_clients": "Najčastejší klienti",
"no_clients_found": "Neboli nájdení žiadni klienti",
"general_statistics": "Všeobecná štatistika",
"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_blocked_24_hours": "Počet DNS dopytov zablokovaných filtrami reklamy a zoznamami adries",
"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",
"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 href='#filters'>Filtre</a>.",
"use_adguard_browsing_sec": "Použiť AdGuard službu Bezpečného prehliadania",
"use_adguard_browsing_sec_hint": "AdGuard Home skontroluje, či je doména na čiernej listine službou Bezpečného prehliadania. Použije API vyhľadávania priateľské k ochrane súkromia na vykonanie kontroly: na server je poslaná iba krátka predpona názvu domény SHA256 hash.",
"use_adguard_parental": "Použiť AdGuard službu Rodičovská kontrola",
"use_adguard_parental_hint": "AdGuard Home skontroluje, či doména obsahuje materiály pre dospelých. Používa rovnaké API priateľské k ochrane osobných údajov ako služba Bezpečného prehliadania.",
"enforce_safe_search": "Vynútiť bezpečné vyhľadávanie",
"enforce_save_search_hint": "AdGuard Home môže vynútiť bezpečné vyhľadávanie v nasledujúcich vyhľadávačoch: Google, Youtube, Bing, DuckDuckGo and Yandex.",
"no_servers_specified": "Neboli špecifikované žiadne servery",
"general_settings": "Všeobecné nastavenia",
"dns_settings": "Nastavenia DNS",
"encryption_settings": "Nastavenia šifrovania",
"dhcp_settings": "Nastavenia DHCP",
"upstream_dns": "Upstream DNS servery",
"upstream_dns_hint": "Ak toto pole ponecháte prázdne, AdGuard Home použije <a href='https://www.quad9.net/' target='_blank'>Quad9</a> ako upstream.",
"test_upstream_btn": "Test upstreamov",
"upstreams": "Upstreams",
"apply_btn": "Použiť",
"disabled_filtering_toast": "Vypnutá filtrácia",
"enabled_filtering_toast": "Zapnutá filtrácia",
"disabled_safe_browsing_toast": "Vypnuté Bezpečné prehliadanie",
"enabled_safe_browsing_toast": "Zapnuté Bezpečné prehliadanie",
"disabled_parental_toast": "Vypnutá Rodičovská kontrola",
"enabled_parental_toast": "Zapnutá Rodičovská kontrola",
"disabled_safe_search_toast": "Vypnuté bezpečné vyhľadávanie",
"enabled_save_search_toast": "Zapnuté bezpečné vyhľadávanie",
"enabled_table_header": "Zapnuté",
"name_table_header": "Názov",
"filter_url_table_header": "URL filtra",
"rules_count_table_header": "Počet pravidiel",
"last_time_updated_table_header": "Posledná aktualizácia",
"actions_table_header": "Akcie",
"edit_table_action": "Úprava",
"delete_table_action": "Vymazať",
"filters_and_hosts": "Filtre a zoznamy blokovaných adries",
"filters_and_hosts_hint": "AdGuard Home pozná základné pravidlá adblock a syntax hosts súborov.",
"no_filters_added": "Neboli pridané žiadne filtre",
"add_filter_btn": "Pridať filter",
"cancel_btn": "Zrušiť",
"enter_name_hint": "Zadajte názov",
"enter_url_hint": "Vložte URL adresu",
"check_updates_btn": "Skontrolovať aktualizácie",
"new_filter_btn": "Odber nového filtra",
"enter_valid_filter_url": "Vložte platnú URL adresu na odber filtra alebo zoznamov adries.",
"custom_filter_rules": "Vlastné filtračné pravidlá",
"custom_filter_rules_hint": "Vložte na každý riadok jedno pravidlo. Môžete použiť buď adblock pravidlá alebo syntax host súborov.",
"examples_title": "Príklady",
"example_meaning_filter_block": "zablokovať prístup k doméne example.org a všetkým jej subdoménam",
"example_meaning_filter_whitelist": "odblokovať prístup k doméne example.org a všetkým jej subdoménam",
"example_meaning_host_block": "AdGuard Home teraz vráti adresu 127.0.0.1 pre doménu example.org (ale nie pre jej subdomény).",
"example_comment": "! Sem sa pridáva komentár",
"example_comment_meaning": "len komentár",
"example_comment_hash": "# Tiež komentár",
"example_regex_meaning": "zablokovať prístup k doménam, ktoré zodpovedajú zadanému regulárnemu výrazu",
"example_upstream_regular": "radová DNS (cez UDP)",
"example_upstream_dot": "šifrované <0>DNS-over-TLS</0>",
"example_upstream_doh": "šifrované <0>DNS-over-HTTPS</0>",
"example_upstream_sdns": "môžete použiť <0>DNS pečiatky</0> pre <1>DNSCrypt</1> alebo <2>DNS-over-HTTPS</2>",
"example_upstream_tcp": "radová DNS (cez TCP)",
"all_filters_up_to_date_toast": "Všetky filtre sú už aktuálne",
"updated_upstream_dns_toast": "Aktualizované upstream DNS servery",
"dns_test_ok_toast": "Špecifikované DNS servery pracujú korektne",
"dns_test_not_ok_toast": "Server \"{{key}}\": nemohol byť použitý, skontrolujte, či ste ho správne napísali",
"unblock_btn": "Odblokovať",
"block_btn": "Zablokovať",
"time_table_header": "Čas",
"domain_name_table_header": "Názov domény",
"type_table_header": "Typ",
"response_table_header": "Odozva",
"client_table_header": "Klient",
"empty_response_status": "Vyčistiť",
"show_all_filter_type": "Zobraziť všetko",
"show_filtered_type": "Zobraziť filtrované",
"no_logs_found": "Neboli nájdené žiadne denníky",
"refresh_btn": "Obnoviť",
"previous_btn": "Predošlé",
"next_btn": "Ďalšie",
"loading_table_status": "Načítavam...",
"page_table_footer_text": "Stránka",
"of_table_footer_text": "z",
"rows_table_footer_text": "riadky",
"updated_custom_filtering_toast": "Aktualizované vlastné filtračné pravidlá",
"rule_removed_from_custom_filtering_toast": "Pravidlo odstránené z vlastných filtračných pravidiel",
"rule_added_to_custom_filtering_toast": "Pravidlo pridané do vlastných filtračných pravidiel",
"query_log_response_status": "Stav: {{value}}",
"query_log_filtered": "Vyfiltrované pomocou {{filter}}",
"query_log_confirm_clear": "Naozaj chcete vymazať celý denník dopytov?",
"query_log_cleared": "Denník dopytov bol úspešne vymazaný",
"query_log_clear": "Vymazať denníky dopytov",
"query_log_retention": "Obdobie záznamu denníka dopytov",
"query_log_enable": "Zapnúť denník",
"query_log_configuration": "Konfigurácia denníka",
"query_log_disabled": "Protokol dopytov je vypnutý a možno ho nakonfigurovať v <0>nastaveniach</0>",
"query_log_strict_search": "Na prísne vyhľadávanie použite dvojité úvodzovky",
"query_log_retention_confirm": "Naozaj chcete zmeniť uchovávanie denníku dopytov? Ak znížite hodnotu intervalu, niektoré údaje sa stratia",
"source_label": "Zdroj",
"found_in_known_domain_db": "Nájdené v databáze známych domén.",
"category_label": "Kategória",
"rule_label": "Pravidlo",
"filter_label": "Filter",
"unknown_filter": "Neznámy filter {{filterId}}",
"install_welcome_title": "Vitajte na stránkach AdGuard Home!",
"install_welcome_desc": "Doména AdGuard Home je celosieťový DNS server pre blokovanie reklám a sledovačov. Jeho cieľom je, aby ste ovládali celú Vašu sieť a všetky Vaše zariadenia, pričom sa nevyžaduje použitie akéhokoľvek programu na strane klienta.",
"install_settings_title": "Administrátorské webové rozhranie",
"install_settings_listen": "Sieťové rozhranie",
"install_settings_port": "Port",
"install_settings_interface_link": "Vaše administrátorské webové rozhranie AdGuard Home bude k dispozícii na týchto adresách:",
"form_error_port": "Zadajte platné číslo portu",
"install_settings_dns": "DNS server",
"install_settings_dns_desc": "Budete musieť konfigurovať Vaše zariadenia alebo smerovač, aby používali DNS server na nasledujúcich adresách:",
"install_settings_all_interfaces": "Všetky rozhrania",
"install_auth_title": "Overenie identity",
"install_auth_desc": "Odporúčame Vám nakonfigurovať na administrátorskom webovom rozhraní AdGuard Home overenie Vašej identity heslom. Aj keď je prístupné iba vo Vašej lokálnej sieti, je stále dôležité chrániť ho pred neobmedzeným prístupom.",
"install_auth_username": "Meno používateľa",
"install_auth_password": "Heslo",
"install_auth_confirm": "Potvrdenie hesla",
"install_auth_username_enter": "Zadajte meno používateľa",
"install_auth_password_enter": "Zadajte heslo",
"install_step": "Krok",
"install_devices_title": "Konfigurujte Vaše zariadenia",
"install_devices_desc": "Ak chcete začať používať službu AdGuard Home, musíte najskôr nakonfigurovať Vaše zariadenia.",
"install_submit_title": "Gratulujeme!",
"install_submit_desc": "Proces nastavenia je dokončený a ste pripravený začať používať službu AdGuard Home.",
"install_devices_router": "Smerovač",
"install_devices_router_desc": "Toto nastavenie automaticky pokryje všetky zariadenia pripojené k Vášmu domácemu smerovaču a nebudete ich musieť konfigurovať manuálne.",
"install_devices_address": "DNS server AdGuard Home používa nasledujúce adresy",
"install_devices_router_list_1": "Otvorte predvoľby Vášho smerovača. Zvyčajne ho môžete získať z prehliadača prostredníctvom adresy URL (napríklad http://192.168.0.1/ alebo http://192.168.1.1/). Možno bude potrebné zadať heslo. Ak si to nepamätáte, heslo môžete často obnoviť stlačením tlačidla na samotnom smerovači. Niektoré smerovače vyžadujú konkrétnu aplikáciu, ktorá by v takom prípade mala byť už nainštalovaná na Vašom počítači alebo telefóne.",
"install_devices_router_list_2": "Nájdite nastavenia DHCP/DNS. Hľadajte skratku DNS vedľa poľa, ktoré umožňuje vložiť dve alebo tri sady čísel, každé rozdelené do štyroch skupín s jedným až tromi číslicami.",
"install_devices_router_list_3": "Zadajte tam adresy Vášho AdGuard Home servera.",
"install_devices_windows_list_1": "Otvorte panel Nastavenia cez menu Štart alebo vyhľadávanie Windows.",
"install_devices_windows_list_2": "Choďte do kategórie Sieť a internet",
"install_devices_windows_list_3": "Vyhľadajte položku Zmeniť možnosti adaptéra a kliknite na ňu",
"install_devices_windows_list_4": "Zvoľte aktívne pripojený adaptér a pravým klikom otvorte Vlastnosti",
"install_devices_windows_list_5": "Vyhľadajte položku Protokol TCP/IPv4, zvoľte ju a dvojklikom otvorte jej vlastnosti.",
"install_devices_windows_list_6": "Zvoľte Použiť tieto adresy serverov DNS a vložte adresy Vašich AdGuard Home serverov.",
"install_devices_macos_list_1": "Kliknite na ikonu Apple a prejdite na položku Systémové predvoľby.",
"install_devices_macos_list_2": "Kliknite na Sieť.",
"install_devices_macos_list_3": "Zvoľte prvé pripojenie vo Vašom zozname a kliknite na Pokročilé.",
"install_devices_macos_list_4": "Vyberte kartu DNS a zadajte adresy serverov AdGuard Home.",
"install_devices_android_list_1": "Na domovskej obrazovke ponuky Android klepnite na Nastavenia.",
"install_devices_android_list_2": "V ponuke klepnite na položku Wi-Fi. Zobrazí sa obrazovka so zoznamom všetkých dostupných sietí (nie je možné nastaviť vlastný DNS pre mobilné pripojenie).",
"install_devices_android_list_3": "Dlho stlačte sieť, ku ktorej ste pripojení, a klepnite na Modifikovať sieť.",
"install_devices_android_list_4": "Na niektorých zariadeniach možno budete musieť skontrolovať pole Pokročilé a zobraziť ďalšie nastavenia. Ak chcete upraviť nastavenia DNS systému Android, budete musieť prepnúť nastavenia IP z DHCP na Statické.",
"install_devices_android_list_5": "Zmeňte nastavené hodnoty DNS 1 a DNS 2 na adresy serverov AdGuard Home.",
"install_devices_ios_list_1": "Na domácej obrazovke ťuknite na položku Nastavenia.",
"install_devices_ios_list_2": "V ľavej ponuke vyberte Wi-Fi (nie je možné nakonfigurovať DNS pre mobilné siete).",
"install_devices_ios_list_3": "Klepnite na názov aktuálne aktívnej siete",
"install_devices_ios_list_4": "Do poľa DNS zadajte adresy serverov AdGuard Home.",
"get_started": "Začíname",
"next": "Ďalej",
"open_dashboard": "Otvoriť riadiaci panel",
"install_saved": "Úspešne uložené",
"encryption_title": "Šifrovanie",
"encryption_desc": "Podpora šifrovania (HTTPS/TLS) pre webové rozhranie DNS aj administrátora",
"encryption_config_saved": "Konfigurácia šifrovania uložená",
"encryption_server": "Názov servera",
"encryption_server_enter": "Zadajte meno Vašej domény",
"encryption_server_desc": "Ak chcete používať HTTPS, musíte zadať názov servera, ktorý zodpovedá Vášmu SSL certifikátu.",
"encryption_redirect": "Automaticky presmerovať na HTTPS",
"encryption_redirect_desc": "Ak je táto možnosť začiarknutá, služba AdGuard Home Vás automaticky presmeruje z adresy HTTP na adresy HTTPS.",
"encryption_https": "HTTPS port",
"encryption_https_desc": "Ak je nakonfigurovaný HTTPS port, AdGuard Home administrátorské rozhranie bude prístupné cez HTTPS a bude tiež poskytovať DNS-cez-HTTPS na '/dns-query'.",
"encryption_dot": "Port DNS-cez-TLS",
"encryption_dot_desc": "Ak je tento port nakonfigurovaný, AdGuard Home bude na tomto porte spúšťať DNS-cez-TLS server.",
"encryption_certificates": "Certifikáty",
"encryption_certificates_desc": "Ak chcete používať šifrovanie, musíte pre svoju doménu poskytnúť platný reťazec certifikátov SSL. Certifikát môžete získať bezplatne na adrese <0>{{link}}</0> alebo si ho môžete kúpiť od jedného z dôveryhodných certifikačných orgánov.",
"encryption_certificates_input": "Skopírujte alebo prilepte sem certifikáty vo formáte PEM.",
"encryption_status": "Stav",
"encryption_expire": "Vyprší",
"encryption_key": "Súkromný kľúč",
"encryption_key_input": "Skopírujte a prilepte sem svoj súkromný kľúč vo formáte PEM pre Váš certifikát.",
"encryption_enable": "Zapnite šifrovanie (HTTPS, DNS-cez-HTTPS a DNS-cez-TLS)",
"encryption_enable_desc": "Ak je šifrovanie zapnuté, AdGuard Home administrátorské rozhranie bude pracovať cez HTTPS a DNS server bude počúvať požiadavky cez DNS-cez-HTTPS a DNS-cez-TLS.",
"encryption_chain_valid": "Certifikačný reťazec je platný",
"encryption_chain_invalid": "Certifikačný reťazec je neplatný",
"encryption_key_valid": "Toto je platný {{type}} súkromný kľúč",
"encryption_key_invalid": "Toto je neplatný {{type}} súkromný kľúč",
"encryption_subject": "Predmet",
"encryption_issuer": "Vydavateľ",
"encryption_hostnames": "Názvy hostiteľov",
"encryption_reset": "Naozaj chcete obnoviť nastavenia šifrovania?",
"topline_expiring_certificate": "Váš SSL certifikát čoskoro vyprší. Aktualizujte <0>Nastavenia šifrovania</0>.",
"topline_expired_certificate": "Váš SSL certifikát vypršal. Aktualizujte <0>Nastavenia šifrovania</0>.",
"form_error_port_range": "Zadajte číslo portu v rozsahu 80-65535",
"form_error_port_unsafe": "Toto nie je bezpečný port",
"form_error_equal": "Nemala by byť rovnaká",
"form_error_password": "Heslo sa nezhoduje",
"reset_settings": "Obnoviť nastavenia",
"update_announcement": "AdGuard Home {{version}} je teraz k dispozícii! <0>Viac informácií nájdete tu</0>.",
"setup_guide": "Sprievodca nastavením",
"dns_addresses": "DNS adresy",
"dns_start": "Spúšťa sa DNS server",
"dns_status_error": "Chyba pri zisťovaní stavu DNS servera",
"down": "Nadol",
"fix": "Opraviť",
"dns_providers": "Tu je <0>zoznam známych poskytovateľov DNS</0>, z ktorého si vyberiete.",
"update_now": "Aktualizovať teraz",
"update_failed": "Automatická aktualizácia zlyhala. Prosím <a href='https://github.com/AdguardTeam/AdGuardHome/wiki/Getting-Started#update'>sledujte postup</a> pre manuálnu aktualizáciu.",
"processing_update": "Čakajte prosím, AdGuard Home sa aktualizuje",
"clients_title": "Klienti",
"clients_desc": "Konfigurácia zariadení pripojených k AdGuard Home",
"settings_global": "Globálne",
"settings_custom": "Vlastné",
"table_client": "Klient",
"table_name": "Názov",
"save_btn": "Uložiť",
"client_add": "Pridať klienta",
"client_new": "Nový klient",
"client_edit": "Upraviť klienta",
"client_identifier": "Identifikátor",
"ip_address": "IP adresa",
"client_identifier_desc": "Klienti môžu byť identifikovaní podľa IP adresy alebo MAC adresy. Upozorňujeme, že používanie MAC ako identifikátora je možné len vtedy, ak je AdGuard Home tiež <0>DHCP server</0>",
"form_enter_ip": "Zadajte IP",
"form_enter_mac": "Zadajte MAC",
"form_enter_id": "Zadajte identifikátor",
"form_add_id": "Pridajte identifikátor",
"form_client_name": "Zadajte názov klienta",
"client_global_settings": "Použiť globálne nastavenia",
"client_deleted": "\"{{key}}\" klienta bol úspešne vymazaný",
"client_added": "\"{{key}}\" klienta bol úspešne pridaný",
"client_updated": "\"{{key}}\" klienta bol úspešne aktualizovaný",
"clients_not_found": "Nebol nájdený žiaden klient",
"client_confirm_delete": "Naozaj chcete vymazať \"{{key}}\" klienta?",
"filter_confirm_delete": "Naozaj chcete vymazať tento filter?",
"auto_clients_title": "Klienti (runtime)",
"auto_clients_desc": "Údaje o klientoch, ktorí používajú AdGuard Home, ale nie sú uložení v konfigurácii",
"access_title": "Nastavenia prístupu",
"access_desc": "Tu môžete konfigurovať pravidlá prístupu pre server DNS AdGuard Home.",
"access_allowed_title": "Povolení klienti",
"access_allowed_desc": "Zoznam CIDR alebo IP adries. Ak je nakonfigurovaný, AdGuard Home akceptuje len dopyty z týchto IP adries",
"access_disallowed_title": "Nepovolení klienti",
"access_disallowed_desc": "Zoznam CIDR alebo IP adries. Ak je nakonfigurovaný, AdGuard Home bude ignorovať dopyty z týchto IP adries",
"access_blocked_title": "Blokované domény",
"access_blocked_desc": "Nezamieňajte si to s filtrami. Domovská stránka služby AdGuard bude ignorovať dopyt DNS na tieto domény v rámci spracovania dopytu.",
"access_settings_saved": "Nastavenia prístupu úspešne uložené",
"updates_checked": "Aktualizácie úspešne skontrolované",
"updates_version_equal": "AdGuard Home je aktuálny",
"check_updates_now": "Skontrolovať aktualizácie teraz",
"dns_privacy": "DNS súkromie",
"setup_dns_privacy_1": "<0>DNS-over-TLS:</0> Použiť <1>{{address}}</1> reťazec.",
"setup_dns_privacy_2": "<0>DNS-over-HTTPS:</0> Použiť <1>{{address}}</1> reťazec.",
"setup_dns_privacy_3": "<0>Upozorňujeme, že šifrované protokoly DNS sú podporované iba v systéme Android 9. Preto je potrebné nainštalovať ďalší softvér pre iné operačné systémy.</0><0>Tu je zoznam softvéru, ktorý môžete používať.</0>",
"setup_dns_privacy_android_1": "Android 9 podporuje DNS-over-TLS natívne. Ak ho chcete konfigurovať, prejdite na Nastavenia → Sieť a internet → Pokročilé → Súkromné DNS a zadajte tam názov Vašej domény.",
"setup_dns_privacy_android_2": "<0>AdGuard pre Android</0> podporuje <1>DNS-over-HTTPS</1> a <1>DNS-over-TLS</1>.",
"setup_dns_privacy_android_3": "<0>Intra</0> pridáva <1>DNS-over-HTTPS</1> podporu pre Android.",
"setup_dns_privacy_ios_1": "<0>DNSCloak</0> podporuje funkciu <1>DNS-over-HTTPS</1>, ale aby ste ju mohli nakonfigurovať na používanie vlastného servera, musíte kvôli tomu vygenerovať značku <2>DNS Stamp</2>.",
"setup_dns_privacy_ios_2": "<0>AdGuard pre iOS</0> podporuje <1>DNS-over-HTTPS</1> a <1>DNS-over-TLS</1> nastavenie.",
"setup_dns_privacy_other_title": "Ostatné implementácie",
"setup_dns_privacy_other_1": "Samotný AdGuard Home môže byť bezpečným DNS klientom na ľubovoľnej platforme.",
"setup_dns_privacy_other_2": "<0>dnsproxy</0> podporuje všetky známe bezpečné DNS protokoly.",
"setup_dns_privacy_other_3": "<0>dnscrypt-proxy</0> podporuje <1>DNS-over-HTTPS</1>.",
"setup_dns_privacy_other_4": "<0>Mozilla Firefox</0> podporuje <1>DNS-over-HTTPS</1>.",
"setup_dns_privacy_other_5": "Viac implementácií nájdete <0>tu</0> a <1>tu</1>.",
"setup_dns_notice": "Pre použitie <1>DNS-over-HTTPS</1> alebo <1>DNS-over-TLS</1>, potrebujete v nastaveniach AdGuard Home <0>nakonfigurovať šifrovanie</0>.",
"rewrite_added": "DNS prepísanie pre \"{{key}}\" bolo úspešne pridané",
"rewrite_deleted": "DNS prepísanie pre \"{{key}}\" bolo úspešne vymazané",
"rewrite_add": "Pridať DNS prepísanie",
"rewrite_not_found": "Neboli nájdené žiadne DNS prepísania",
"rewrite_confirm_delete": "Naozaj chcete odstrániť prepísanie DNS pre \"{{key}}\"?",
"rewrite_desc": "Umožňuje ľahko nakonfigurovať vlastnú odpoveď DNS pre konkrétny názov domény.",
"rewrite_applied": "Použilo sa pravidlo prepisovania",
"dns_rewrites": "DNS prepisovanie",
"form_domain": "Vložte meno domény",
"form_answer": "Zadajte IP adresu alebo názov domény",
"form_error_domain_format": "Neplatný formát domény",
"form_error_answer_format": "Neplatný formát odpovede",
"configure": "Konfigurovať",
"main_settings": "Hlavné nastavenia",
"block_services": "Blokovať vybrané služby",
"blocked_services": "Blokované služby",
"blocked_services_desc": "Umožňuje rýchlo blokovať populárne stránky a služby.",
"blocked_services_saved": "Blokované služby boli úspešne uložené",
"blocked_services_global": "Použite globálne blokované služby",
"blocked_service": "Blokované služby",
"block_all": "Blokovať všetko",
"unblock_all": "Odblokovať všetko",
"encryption_certificate_path": "Cesta k certifikátu",
"encryption_private_key_path": "Cesta k súkromného kľúču",
"encryption_certificates_source_path": "Nastavte cestu k súboru s certifikátom",
"encryption_certificates_source_content": "Vložiť obsah certifikátu",
"encryption_key_source_path": "Nastaviť súbor s privátnym kľúčom",
"encryption_key_source_content": "Vložte obsah privátneho kľúča",
"stats_params": "Konfigurácia štatistiky",
"config_successfully_saved": "Konfigurácia bola úspešne uložená",
"interval_24_hour": "24 hodín",
"interval_days": "{{count}} deň",
"interval_days_plural": "{{count}} dní",
"domain": "Doména",
"answer": "Odpoveď",
"filter_added_successfully": "Filter bol úspešne pridaný",
"statistics_configuration": "Konfigurácia štatistiky",
"statistics_retention": "Štatistika za obdobie",
"statistics_retention_desc": "Ak znížite hodnotu intervalu, niektoré údaje sa stratia",
"statistics_clear": " Vynulovať štatistiku",
"statistics_clear_confirm": "Naozaj chcete vynulovať štatistiku?",
"statistics_retention_confirm": "Naozaj chcete zmeniť uchovávanie štatistík? Ak znížite hodnotu intervalu, niektoré údaje sa stratia",
"statistics_cleared": "Štatistika bola úspešne vynulovaná",
"interval_hours": "{{count}} hodina",
"interval_hours_plural": "{{count}} hodín",
"filters_configuration": "Konfigurácia filtrov",
"filters_enable": "Zapnúť filtre",
"filters_interval": "Interval aktualizácie filtrov",
"disabled": "Vypnuté",
"username_label": "Meno používateľa",
"username_placeholder": "Zadajte meno používateľa",
"password_label": "Heslo",
"password_placeholder": "Zadajte heslo",
"sign_in": "Prihlásiť sa",
"sign_out": "Odhlásiť sa",
"forgot_password": "Zabudnuté heslo?",
"forgot_password_desc": "Postupujte podľa <0>týchto krokov</0> a vytvorte nové heslo pre svoj používateľský účet.",
"location": "Poloha",
"orgname": "Meno organizácie",
"netname": "Meno siete",
"descr": "Popis",
"whois": "Whois",
"filtering_rules_learn_more": "<0>Viac informácií</0> o vytváraní vlastných zoznamov hostiteľov.",
"blocked_by_response": "Blokované pomocou CNAME alebo IP v odpovedi"
}

View File

@@ -0,0 +1,413 @@
{
"client_settings": "Nastavitve odjemalca",
"example_upstream_reserved": "lahko določite nazgornji DNS <0>za določene domene</0>",
"upstream_parallel": "Uporabite vzporedne poizvedbe za pospešitev razreševanja tako, da hkrati poizvedujete vse zagonske strežnike",
"bootstrap_dns": "Zagonski DNS strežniki",
"bootstrap_dns_desc": "Zagonski DNS strežniki se uporabljajo za razreševanje IP naslovov DoH/DoT reševalcev, ki jih določite kot navzgornje.",
"check_dhcp_servers": "Preveri strežnike DHCP",
"save_config": "Shrani konfiguracijo",
"enabled_dhcp": "Strežnik DHCP je omogočen",
"disabled_dhcp": "Strežnik DHCP je onemogočen",
"dhcp_title": "Strežnik DHCP (poskusno!)",
"dhcp_description": "Če vaš usmerjevalnik ne nudi nastavitev DHCP, lahko uporabite AdGuardov vgrajen DHCP strežnik.",
"dhcp_enable": "Omogoči strežnik DHCP",
"dhcp_disable": "Onemogoči strežnik DHCP",
"dhcp_not_found": "Vgrajeni DHCP strežnik lahko varno vklopite - v omrežju nismo našli nobenih aktivnih strežnikov DHCP. Priporočamo, da ga znova ročno preverite, saj samodejni preizkus trenutno ne zagotavlja 100% garancije.",
"dhcp_found": "V omrežju je bil najden aktivni DHCP strežnik. Vgrajenega AdGuardovega DHCP strežnika ni varno vključiti.",
"dhcp_leases": "Najemi DHCP",
"dhcp_static_leases": "DHCP statični najemi",
"dhcp_leases_not_found": "Ni najdenih najemov DHCP",
"dhcp_config_saved": "Shranjena konfiguracija DHCP strežnika",
"form_error_required": "Zahtevano polje",
"form_error_ip4_format": "Neveljaven format IPv4",
"form_error_ip6_format": "Neveljaven format IPv6",
"form_error_ip_format": "Neveljaven format IP",
"form_error_mac_format": "Neveljaven MAC format",
"form_error_positive": "Mora biti večja od 0",
"dhcp_form_gateway_input": "IP prehoda",
"dhcp_form_subnet_input": "Maska podomrežja",
"dhcp_form_range_title": "Razpon naslovov IP",
"dhcp_form_range_start": "Začetek razpona",
"dhcp_form_range_end": "Konec razpona",
"dhcp_form_lease_title": "Čas najema DHCP (v sekundah)",
"dhcp_form_lease_input": "Trajanje najema",
"dhcp_interface_select": "Izberite DHCP vmesnik",
"dhcp_hardware_address": "Naslov strojne opreme",
"dhcp_ip_addresses": "IP naslovi",
"dhcp_table_hostname": "Ime gostitelja",
"dhcp_table_expires": "Poteče",
"dhcp_warning": "Če želite omogočiti DHCP strežnik, prepričajte se, da v vašem omrežju ni drugega aktivnega strežnika DHCP. V nasprotnem primeru lahko ta prekine internet za povezane naprave!",
"dhcp_error": "Ni mogoče ugotoviti, ali je v omrežju še en strežnik DHCP.",
"dhcp_static_ip_error": "Za uporabo strežnika DHCP, morate nastaviti statični naslov IP. Ni bilo mogoče ugotoviti, ali je ta omrežni vmesnik konfiguriran s statičnim naslovom IP. Ročno nastavite statični naslov IP.",
"dhcp_dynamic_ip_found": "Vaš sistem uporablja dinamično konfiguracijo IP-naslova za vmesnik <0>{{interfaceName}}</0>. Za uporabo DHCP strežnika mora biti nastavljen statični naslov IP. Vaš trenutni naslov IP je <0>{{ipAddress}}</0>. Ta IP naslov bomo samodejno nastavili kot statični, če pritisnete na gumb 'Omogoči DHCP'.",
"dhcp_lease_added": "Statičen najem \"{{key}}\" je uspešno dodan",
"dhcp_lease_deleted": "Statičen najem \"{{key}}\" je uspešno izbrisan",
"dhcp_new_static_lease": "Nov statični najem",
"dhcp_static_leases_not_found": "Ni najdenih statičnih najemov DHCP",
"dhcp_add_static_lease": "Dodaj statičen najem",
"dhcp_reset": "Ali ste prepričani, da želite ponastaviti konfiguracijo DHCP?",
"delete_confirm": "Ali ste prepričani, da želite izbrisati \"{{key}}\"?",
"form_enter_hostname": "Vnesite ime gostitelja",
"error_details": "Podrobnosti o napaki",
"back": "Nazaj",
"dashboard": "Nadzorna plošča",
"settings": "Nastavitve",
"filters": "Filtri",
"query_log": "Dnevnik poizvedb",
"faq": "Pogosta vprašanja in odgovori (FAQ)",
"version": "različica",
"address": "naslov",
"on": "VKL",
"off": "IZK",
"copyright": "Avtorske pravice",
"homepage": "Domača stran",
"report_an_issue": "Prijavi težavo",
"privacy_policy": "Politika zasebnosti",
"enable_protection": "Omogoči zaščito",
"enabled_protection": "Zaščita je omogočena",
"disable_protection": "Onemogoči zaščito",
"disabled_protection": "Zaščita je onemogočena",
"refresh_statics": "Osveži statistiko",
"dns_query": "Poizvedbe DNS",
"blocked_by": "Onemogočeno s filtri",
"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_days": "zadnjega {{count}} dne",
"for_last_days_plural": "zadnjih {{count}} dni",
"no_domains_found": "Ni najdenih domen",
"requests_count": "Štavilo zahtev",
"top_blocked_domains": "Najbolj zavirane domene",
"top_clients": "Najpogostejši odjemalci",
"no_clients_found": "Ni najdenih odjemalcev",
"general_statistics": "Splošna statistika",
"number_of_dns_query_days": "Število poizvedb DNS, obdelanih zadnji {{count}} dan",
"number_of_dns_query_days_plural": "Število poizvedb DNS, obdelanih zadnjih {{count}} dni",
"number_of_dns_query_24_hours": "Število opravljenih DNS poizvedb v zadnjih 24 urah",
"number_of_dns_query_blocked_24_hours": "Število onemogočenih zahtev DNS s filtri oglasov, in seznami zaviranja gostiteljev",
"number_of_dns_query_blocked_24_hours_by_sec": "Število onemogočenih zahtev DNS z AdGuardovim modulom varnosti 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, ki jim je bilo vsiljeno varno iskanje",
"average_processing_time": "Povprečni čas obdelave",
"average_processing_time_hint": "Povprečni čas v milisekundah pri obdelavi zahteve DNS",
"block_domain_use_filters_and_hosts": "Onemogoči domene s filtri in gostiteljskimi datotekami",
"filters_block_toggle_hint": "Pravila zaviranja lahko nastavite v nastavitvah <a href='#filters'>Filtri</a>.",
"use_adguard_browsing_sec": "Uporabi AdGuardovo spletno storitev 'Varnost brskanja'",
"use_adguard_browsing_sec_hint": "AdGuard Home bo preveril s spletno storitivijo 'Varnost brskanja', ali je domena na seznamu nedovoljenih. Za preverjanje bo uporabila za zasebnost prijazno API povezavo: strežniku se pošlje le kratka predpona imena domene SHA256 hash.",
"use_adguard_parental": "Uporabi AdGuardovo spletno storitev 'Starševski nadzor'",
"use_adguard_parental_hint": "AdGuard Home bo preveril, če domena vsebuje vsebine za odrasle. Uporablja enako, za zasebnost prijazen API, kot spletno storitev za varnost brskanja.",
"enforce_safe_search": "Vsili varno iskanje",
"enforce_save_search_hint": "AdGuard Home lahko uveljavi varno iskanje v naslednjih iskalnikih: Google, Youtube, Bing, DuckDuckGo, Yandex, Pixabay.",
"no_servers_specified": "Ni določenih strežnikov",
"general_settings": "Splošne nastavitve",
"dns_settings": "Nastavitve DNS",
"encryption_settings": "Nastavitve šifriranja",
"dhcp_settings": "Nastavitve DHCP",
"upstream_dns": "Zagonski DNS strežniki",
"upstream_dns_hint": "Če pustite to polje prazno, bo AdGuard Home uporabil <a href='https://www.quad9.net/' target='_blank'>Quad9</a> kot tok navzgor.",
"test_upstream_btn": "Preizkusi upstreame",
"upstreams": "Tokovi navzgor",
"apply_btn": "Uporabi",
"disabled_filtering_toast": "Onemogočeno filtriranje",
"enabled_filtering_toast": "Omogočeno filtriranje",
"disabled_safe_browsing_toast": "Onemogočeno varno brskanje",
"enabled_safe_browsing_toast": "Omogočeno varno brskanje",
"disabled_parental_toast": "Onemogočen starševski nadzor",
"enabled_parental_toast": "Omogočen starševski nadzor",
"disabled_safe_search_toast": "Onemogočeno varno iskanje",
"enabled_save_search_toast": "Omogočeno varno iskanje",
"enabled_table_header": "Omogočeno",
"name_table_header": "Ime",
"filter_url_table_header": "Filter URL",
"rules_count_table_header": "Število pravil",
"last_time_updated_table_header": "Zadnjič posodobljeno",
"actions_table_header": "Akcij",
"edit_table_action": "Uredi",
"delete_table_action": "Izbriši",
"filters_and_hosts": "Filtri in seznami zaviranja gostiteljev",
"filters_and_hosts_hint": "AdGuard Home razume osnovna pravila zaviranja oglasov in sintakso datotek gostiteljev.",
"no_filters_added": "Ni dodanih filtrov",
"add_filter_btn": "Dodaj filter",
"cancel_btn": "Prekliči",
"enter_name_hint": "Vnesite ime",
"enter_url_hint": "Vnesite URL",
"check_updates_btn": "Preveri posodobitve",
"new_filter_btn": "Nova naročnina filtra",
"enter_valid_filter_url": "Vnesite veljaven URL za naročnino filtra ali datoteko gostiteljev.",
"custom_filter_rules": "Pravila filtriranja po meri",
"custom_filter_rules_hint": "V vrstico vnesite eno pravilo. Uporabite lahko pravila zaviranja oglasov ali sintakso gostiteljskih datotek.",
"examples_title": "Primeri",
"example_meaning_filter_block": "onemogoči dostop do domene example.org in vseh njenih poddomen",
"example_meaning_filter_whitelist": "omogoči dostop do domene example.org in vseh njenih poddomen",
"example_meaning_host_block": "AdGuard Home bo zdaj vrnil naslov 127.0.0.1 za domeno example.org (ne pa tudi njunih poddomen).",
"example_comment": "! Tukaj je komentar",
"example_comment_meaning": "samo komentar",
"example_comment_hash": "# Tudi komentar",
"example_regex_meaning": "onemogoči dostop do domen, ki se ujemajo z <0>določenim regularnemim izrazom</0>",
"example_upstream_regular": "redni DNS (nad UDP)",
"example_upstream_dot": "šifriran <0>DNS-prek-TLS</0>",
"example_upstream_doh": "šifriran <0>DNS-prek-HTTPS</0>",
"example_upstream_sdns": "lahko uporabite <0>DNS Žige</0> za reševalce <1>DNSCrypt</1> ali <2>DNS-prek-HTTPS</2>",
"example_upstream_tcp": "redni DNS (nad TCP)",
"all_filters_up_to_date_toast": "Vsi filtri so že posodobljeni",
"updated_upstream_dns_toast": "Posodobljeni Zagonske strežnike DNS",
"dns_test_ok_toast": "Navedeni strežniki DNS delujejo pravilno",
"dns_test_not_ok_toast": "Ni mogoče uporabiti: strežnika \"{{key}}\". Preverite, ali ste ga pravilno napisali",
"unblock_btn": "Omogoči",
"block_btn": "Onemogoči",
"time_table_header": "Čas",
"domain_name_table_header": "Ime domene",
"type_table_header": "Vrsta",
"response_table_header": "Odgovor",
"client_table_header": "Odjemalec",
"empty_response_status": "Prazno",
"show_all_filter_type": "Prikaži vse",
"show_filtered_type": "Prikaži filtrirane",
"no_logs_found": "Ni najdenih dnevnikov",
"refresh_btn": "Osveži",
"previous_btn": "Prejšnja",
"next_btn": "Naslednja",
"loading_table_status": "Nalaganje...",
"page_table_footer_text": "Stran",
"of_table_footer_text": "od",
"rows_table_footer_text": "vrstic",
"updated_custom_filtering_toast": "Posodobljena pravila filtriranja po meri",
"rule_removed_from_custom_filtering_toast": "Pravilo je odstranjeno iz pravil filtriranja po meri",
"rule_added_to_custom_filtering_toast": "Pravilo je dodano pravilom filtriranja po meri",
"query_log_response_status": "Stanje: {{value}}",
"query_log_filtered": "Filtriran z {{filter}}",
"query_log_confirm_clear": "Ali ste prepričani, da želite počistiti celoten dnevnik poizvedb?",
"query_log_cleared": "Dnevnik poizvedb je uspešno izbrisan",
"query_log_clear": "Počisti dnevnike poizvedb",
"query_log_retention": "Zadrževanje dnevnikov poizvedb",
"query_log_enable": "Omogoči dnevni",
"query_log_configuration": "Konfiguracija dnevnikov",
"query_log_disabled": "Dnevnik poizvedb je onemogočen in ga je mogoče konfigurirati v <0>nastavitvah</0>",
"query_log_strict_search": "Za strogo iskanje uporabite dvojne narekovaje",
"query_log_retention_confirm": "Ali ste prepričani, da želite spremeniti zadrževanje dnevnika poizvedb? Če zmanjšate vrednost intervala, bodo nekateri podatki izgubljeni",
"source_label": "Vir",
"found_in_known_domain_db": "Najdeno v zbirki podatkov znanih domen.",
"category_label": "Kategorija",
"rule_label": "Pravilo",
"filter_label": "Filter",
"unknown_filter": "Neznan filter {{filterId}}",
"install_welcome_title": "Dobrodošli v AdGuard Home!",
"install_welcome_desc": "AdGuard Home je omrežni strežnik DNS, ki zavira oglase in sledilce v celotnem omrežju. Njegov namen je omogočanje nadzora nad celotnim omrežjem in vsemi vašimi napravami in ne zahteva uporabo odjemalskega programa.",
"install_settings_title": "Skrbniški spletni vmesnik",
"install_settings_listen": "Poslušaj vmesnik",
"install_settings_port": "Vrata",
"install_settings_interface_link": "Vaš AdGuard Home Skrbniški spletni vmesnik bo na voljo na naslednjih naslovih:",
"form_error_port": "Vnesite veljavno vrednost vrat",
"install_settings_dns": "DNS strežnik",
"install_settings_dns_desc": "Vaše naprave ali usmerjevalnik boste morali konfigurirati za uporabo strežnika DNS na naslednjih naslovih:",
"install_settings_all_interfaces": "Vsi vmesniki",
"install_auth_title": "Preverjanje pristnosti",
"install_auth_desc": "Zelo priporočljivo je, da konfigurirate overovitev pristnosti gesla za vaš skrbniški spletni vmesnik AdGuard Home. Tudi če je dostopen v vašem lokalnem omrežju, je še vedno pomembno, da ga zaščitite pred neomejenim dostopom.",
"install_auth_username": "Uporabniško ime",
"install_auth_password": "Geslo",
"install_auth_confirm": "Potrdite geslo",
"install_auth_username_enter": "Vnesite uporabniško ime",
"install_auth_password_enter": "Vnesite geslo",
"install_step": "Korak",
"install_devices_title": "Konfigurirajte svoje naprave",
"install_devices_desc": "Če želite, da AdGuard Home začne delovati, morate konfigurirati vaše naprave, da jih bo uporabljal.",
"install_submit_title": "Čestitamo!",
"install_submit_desc": "Postopek namestitve je končan in pripravljeni ste začeti uporabljati AdGuard Home.",
"install_devices_router": "Usmerjevalnik",
"install_devices_router_desc": "Ta namestitev bo samodejno pokrila vse naprave, povezane z domačim usmerjevalnikom, zato vam jih ni treba ročno konfigurirati.",
"install_devices_address": "AdGuard Home strežnik DNS posluša naslednje naslove",
"install_devices_router_list_1": "Odprite nastavitve usmerjevalnika. Ponavadi lahko do nje dostopate iz brskalnika prek URL-ja (npr. http://192.168.0.1/ ali http://192.168.1.1/). Morda boste morali vnesti geslo. Če se ne spomnite gesla, lahko pogosto ponastavite geslo s pritiskom na gumb na samem usmerjevalniku. Nekateri usmerjevalniki zahtevajo posebno aplikacijo, ki bi morala biti v tem primeru že nameščena na vašem računalniku/telefonu.",
"install_devices_router_list_2": "Poiščite nastavitve DHCP/DNS. Poiščite črke DNS poleg polja, ki dovoljuje dva ali tri naborov številk, pri čemer je vsaka razdeljena na štiri skupine z enim do tremi števili.",
"install_devices_router_list_3": "Tam vnesite svoje naslove strežnikov AdGuard Home.",
"install_devices_windows_list_1": "Odprite 'Nadzorno ploščo' prek menija 'Začetek' ali 'Iskanja v sistemu Windows'.",
"install_devices_windows_list_2": "Pojdite v 'Omrežje' in 'Kategorija interneta' in nato v 'Omrežje' in 'Središče za skupno rabo'.",
"install_devices_windows_list_3": "Na levi strani zaslona poiščite 'Spremeni nastavitve kartice' in kliknite nanjo.",
"install_devices_windows_list_4": "Izberite aktivno povezavo, kliknite na njo z desno miškino tipko in izberite 'Lastnosti'.",
"install_devices_windows_list_5": "Na seznamu poiščite različico 4 (TCP/IP) internetnega protokola, jo izberite in znova kliknite na 'Lastnosti'.",
"install_devices_windows_list_6": "Izberite 'Uporabi naslednje naslove DNS strežnikov' in vnesite vaše naslove strežnika AdGuard Home.",
"install_devices_macos_list_1": "Kliknite ikono Apple in pojdite na 'Nastavitve sistema'.",
"install_devices_macos_list_2": "Kliknite na 'Omrežje'",
"install_devices_macos_list_3": "Izberite prvo povezavo na seznamu in kliknite na 'Napredno'.",
"install_devices_macos_list_4": "Izberite zavihek DNS in vnesite vaše naslove AdGuard Home strežnika.",
"install_devices_android_list_1": "Na začetnem zaslonu menija Android tapnite 'Nastavitve'.",
"install_devices_android_list_2": "V meniju tapnite na 'Wi-Fi'. Prikazal se bo seznam vseh razpoložljivih omrežij (nemogoče je nastaviti DNS po meri za mobilno povezavo).",
"install_devices_android_list_3": "Dolgo pritisnite na omrežje, s katerim ste povezani, in tapnite 'Spremeni omrežje'.",
"install_devices_android_list_4": "Na nekaterih napravah boste morda morali potrditi polje 'Napredno', za prikaz dodatnih nastavitev. Če želite prilagoditi nastavitve DNS za Android, morate nastavitve IP preklopiti z DHCP na Statični.",
"install_devices_android_list_5": "Spremeni nastavitev vrednosti DNS 1 in DNS 2 na naslove strežnikov AdGuard Home.",
"install_devices_ios_list_1": "Na začetnem zaslonu izberite Nastavitve.",
"install_devices_ios_list_2": "V levem meniju izberite Wi-Fi (nemogoče je konfigurirati DNS za mobilna omrežja).",
"install_devices_ios_list_3": "Dotaknite se imena trenutno aktivnega omrežja.",
"install_devices_ios_list_4": "V polje DNS vnesite vaše naslove AdGuard Home strežnika.",
"get_started": "Začnimo",
"next": "Naprej",
"open_dashboard": "Odpri nadzorno ploščo",
"install_saved": "Shranjeno uspešno",
"encryption_title": "Šifriranje",
"encryption_desc": "Podpora za šifriranje (HTTPS/TLS) za DNS in skrbniški spletni vmesnik",
"encryption_config_saved": "Konfiguracija šifriranja je shranjena",
"encryption_server": "Ime strežnika",
"encryption_server_enter": "Vnesite ime vaše domene",
"encryption_server_desc": "Za uporabo HTTPS morate vnesti ime strežnika, ki se ujema z vašim digitalnim certifikatom SSL.\n",
"encryption_redirect": "Samodejno preusmeri na HTTPS",
"encryption_redirect_desc": "Če je označeno, vas bo AdGuard Home samodejno preusmeril iz naslovov HTTP na naslove HTTPS.",
"encryption_https": "Vrata HTTPS",
"encryption_https_desc": "Če so vrata HTTPS konfigurirana, bo skrbniški vmesnik AdGuard Home dostopen prek protokola HTTPS, prav tako pa bo zagotovil DNS-prek-HTTPS na mestu '/dns-query'.",
"encryption_dot": "Vrata DNS-prek-TLS",
"encryption_dot_desc": "Če so ta vrata konfigurirana, bo AdGuard Home na teh vratih zagnal DNS-prek-TLS strežnika.",
"encryption_certificates": "Digitalna potrdila",
"encryption_certificates_desc": "Za uporabo šifriranja morate za svojo domeno zagotoviti veljavno verigo potrdil SSL. Brezplačno digitalno potrdilo lahko dobite na <0>{{link}}</0> ali pa ga kupite pri enem od zaupanja vrednih overiteljev.\n\n",
"encryption_certificates_input": "Tukaj kopirajte/prilepite PEM šifrirana digitalna potrdila.",
"encryption_status": "Stanje",
"encryption_expire": "Poteče",
"encryption_key": "Zasebni ključ",
"encryption_key_input": "Tukaj kopirajte/prilepite PEM-kodiran zasebni ključ za vaše digitalno potrdilo.",
"encryption_enable": "Omogoči šifriranje (HTTPS, DNS-prek-HTTPS in DNS-prek-TLS)",
"encryption_enable_desc": "Če je omogočeno šifriranje, bo skrbniški vmesnik AdGuard Home deloval prek HTTPS, strežnik DNS pa bo poslušal zahteve prek DNS-prek-HTTPS in DNS-prek-TLS.",
"encryption_chain_valid": "Veriga digitalih potrdil je veljavna",
"encryption_chain_invalid": "Veriga digitalih potrdil ni veljavna",
"encryption_key_valid": "To je veljaven zasebni ključ {{type}}",
"encryption_key_invalid": "To je neveljaven zasebni ključ {{type}}",
"encryption_subject": "Predmet",
"encryption_issuer": "Izdajatelj",
"encryption_hostnames": "Imena gostiteljev",
"encryption_reset": "Ali ste prepričani, da želite ponastaviti nastavitve šifriranja?",
"topline_expiring_certificate": "Vaš e digitalno potrdilo SSL bo kmalu poteklol. Posodobite <0>Nastavitve šifriranja</0>.",
"topline_expired_certificate": "Vaše digitalno potrdilo SSL je poteklo. Posodobi <0>Nastavitve šifriranja</0>.",
"form_error_port_range": "Vnesite vrednost vrat v razponu med 80-65535",
"form_error_port_unsafe": "To so nevarna vrata",
"form_error_equal": "Ne bi smelo biti enako",
"form_error_password": "Geslo se ne ujema",
"reset_settings": "Ponastavi nastavitve",
"update_announcement": "Zdaj je na voljo AdGuard Home {{version}}! <0>Klinite tukaj</0> za več informacij.",
"setup_guide": "Navodila za nastavitev",
"dns_addresses": "DNS naslovi",
"dns_start": "Zaganja se strežnik DNS",
"dns_status_error": "Napaka pri pridobivanju stanja strežnika DNS",
"down": "Navzdol",
"fix": "Popravi",
"dns_providers": "Tukaj je <0>seznam znanih ponudnikov DNS</0>, med katerimi lahko izbirate.",
"update_now": "Posodobi zdaj",
"update_failed": "Samodejna posodobitev ni uspela. Prosimo <a href='https://github.com/AdguardTeam/AdGuardHome/wiki/Getting-Started#update'>sledite korakom</a> ra zočno posodobitev.",
"processing_update": "Prosimo, počakajte. AdGuard Home se posodablja!",
"clients_title": "Odjemalci",
"clients_desc": "Konfigurirajte naprave, ki so povezane z AdGuard Home",
"settings_global": "Splošno",
"settings_custom": "Po meri",
"table_client": "Odjemalec",
"table_name": "Ime",
"save_btn": "Shrani",
"client_add": "Dodaj odjemalca",
"client_new": "Nov odjemalec",
"client_edit": "Uredi odjemalca",
"client_identifier": "Identifikator",
"ip_address": "IP naslov",
"client_identifier_desc": "Odjemalce je mogoče identificirati po naslovu IP, CIDR, MAC. Upoštevajte, da je uporaba MAC kot identifikatorja mogoča le, če je AdGuard Home tudi <0>DHCP strežnik</0>",
"form_enter_ip": "Vnesite IP",
"form_enter_mac": "Vnesite MAC",
"form_enter_id": "Vnesi identifikatorja",
"form_add_id": "Dodaj identifikatorja",
"form_client_name": "Vnesite ime odjemalca",
"client_global_settings": "Uporabi splošne nastavitve",
"client_deleted": "Odjemalec \"{{key}}\" je bil uspešno izbrisan",
"client_added": "Odjemalec \"{{key}}\" je bil uspešno dodan",
"client_updated": "Odjemalec \"{{key}}\" je bil uspešno posodobljen",
"clients_not_found": "Odjemalcev ni bilo mogoče najti",
"client_confirm_delete": "Ali ste prepričani, da želite izbrisati odjemalca \"{{key}}\"?",
"filter_confirm_delete": "Ali ste prepričani, da želite izbrisati filter?",
"auto_clients_title": "Odjemalci (čas izvajanja)",
"auto_clients_desc": "Podatki o odjemalcih, ki uporabljajo AdGuard Home, vendar niso shranjeni v konfiguraciji",
"access_title": "Nastavitve dostopa",
"access_desc": "Tukaj lahko nastavite pravila dostopa strežnika DNS AdGuard Home.",
"access_allowed_title": "Dovoljeni odjemalci",
"access_allowed_desc": "Seznam naslovov CIDR ali IP. Če je konfiguriran, bo AdGuard Home sprejel zahteve samo od teh teh IP naslovov.",
"access_disallowed_title": "Zavrnjeni odjemalci",
"access_disallowed_desc": "Seznam naslovov CIDR ali IP. Če je konfiguriran, bo AdGuard Home spustil zahteve iz teh IP naslovov.",
"access_blocked_title": "Zavirane domene",
"access_blocked_desc": "Tega ne zamenjujte s filtri. AdGuard Home bo v spustil poizvedbe DNS s temi domenamiv vprašanju poizvedbe.",
"access_settings_saved": "Nastavitve dostopa so uspešno shranjene",
"updates_checked": "Posodobitve so uspešno preverjene",
"updates_version_equal": "AdGuard Home je posodobljen",
"check_updates_now": "Preveri obstoj posodobitev zdaj",
"dns_privacy": "Zasebnost DNS",
"setup_dns_privacy_1": "<0>DNS-prek-TLS:</0> Uporabite niz <1>{{address}}</1>.",
"setup_dns_privacy_2": "<0>DNS-prek-HTTPS:</0> Uporabite niz <1>{{address}}</1>.",
"setup_dns_privacy_3": "<0>Upoštevajte, da so šifrirani protokoli DNS podprti samo v sistemu Android 9. Zato morate namestiti dodatni program za druge operacijske sisteme.</0><0>Tu je seznam programov, ki jih lahko uporabite..</0>",
"setup_dns_privacy_android_1": "Android 9 izvirno podpira DNS-prek-TLS. Če ga želite konfigurirati, pojdite v Nastavitve → Omrežje in internet → Napredno → Zasebni DNS, in tam vnesite svoje ime domene.",
"setup_dns_privacy_android_2": "<0>AdGuard za Android</0> podpira <1>DNS-prek-HTTPS</1> in <1>DNS-prek-TLS</1>.",
"setup_dns_privacy_android_3": "<0>Intra</0> doda podporo <1>DNS-prek-HTTPS</1> za Android.",
"setup_dns_privacy_ios_1": "<0>DNSCloak</0> podpira <1>DNS-prek-HTTPS</1> vendar za njegovo konfiguracijo, da bo uporabljal svoj strežnik, morate zanj ustvariti <2>DNS Stamp</2>.",
"setup_dns_privacy_ios_2": "<0>AdGuard za iOS</0> podpira nastavitev <1>DNS-prek-HTTPS</1> in <1>DNS-prek-TLS</1>.",
"setup_dns_privacy_other_title": "Druge izvedbe",
"setup_dns_privacy_other_1": "Sam AdGuard Home je lahko varen odjemalec DNS na kateri koli platformi.",
"setup_dns_privacy_other_2": "<0>dnsproxy</0> podpira vse znane varne protokole DNS.",
"setup_dns_privacy_other_3": "<0>dnscrypt-proxy</0> podpira <1>DNS-prek-HTTPS</1>.",
"setup_dns_privacy_other_4": "<0>Mozilla Firefox</0> podpira <1>DNS-prek-HTTPS</1>.",
"setup_dns_privacy_other_5": "Več izvedb boste najdli <0>tukaj</0> in <1>tukaj</1>.",
"setup_dns_notice": "Za uporabo <1>DNS-prek-HTTPS</1> ali <1>DNS-prek-TLS</1>, morate <0>konfigurirati šifriranje</0> v nastavitvah AdGuard Home.",
"rewrite_added": "Uspešno je dodano DNS prepisovanje za \"{{key}}\"",
"rewrite_deleted": "Uspešno je izbrisano DNS prepisovanje za \"{{key}}\"",
"rewrite_add": "Dodaj prepisovanje DNS",
"rewrite_not_found": "Ni bilo najdenih prepisovanj DNS",
"rewrite_confirm_delete": "Ali ste prepričani, da želite izbrisati prepisovanje DNS za \"{{key}}\"?",
"rewrite_desc": "Omogoča enostavno konfiguriranje odgovora DNS po meri za določeno ime domene.",
"rewrite_applied": "Uporabljeno Pravilo za prepisovanje",
"dns_rewrites": "Prepisovanja NDS",
"form_domain": "Vnesi domeno",
"form_answer": "Vnesite IP naslov ali ime domene",
"form_error_domain_format": "Neveljavna oblika domene",
"form_error_answer_format": "Neveljavna oblika odgovora",
"configure": "Konfiguriraj",
"main_settings": "Glavne nastavitve",
"block_services": "Onemogoči določene storitve",
"blocked_services": "Onemogočene storitve",
"blocked_services_desc": "Omogoča hitro onemogočanje priljubljenih spletnih strani in storitev.",
"blocked_services_saved": "Onemogočene storitve so uspešno shranjene",
"blocked_services_global": "Uporabi splošne onemogočene storitve",
"blocked_service": "Onemogočena storitev",
"block_all": "Onemogoči vse",
"unblock_all": "Omogoči vse",
"encryption_certificate_path": "Pot digitalnega potrdila",
"encryption_private_key_path": "Pot zasebnega ključa",
"encryption_certificates_source_path": "Nastavi pot datoteke digitalnega potrdila",
"encryption_certificates_source_content": "Prilepi vsebino digitalnega potrdila",
"encryption_key_source_path": "Nastavi datoteko zasebnega ključa",
"encryption_key_source_content": "Prilepi vsebino zasebnega ključa",
"stats_params": "Konfiguracija statistike",
"config_successfully_saved": "Konfiguracija je uspešno shranjena",
"interval_24_hour": "24 ur",
"interval_days": "{{count}} dan",
"interval_days_plural": "{{count}} dni",
"domain": "Domena",
"answer": "Odgovor",
"filter_added_successfully": "Filter je bil uspešno dodan",
"statistics_configuration": "Konfiguracija statistike",
"statistics_retention": "Statistika zadrževanja",
"statistics_retention_desc": "Če zmanjšate vrednost intervala, bodo nekateri podatki izgubljeni",
"statistics_clear": " Počisti statistiko",
"statistics_clear_confirm": "Ali ste prepričani, da želite počistiti statistiko?",
"statistics_retention_confirm": "Ali ste prepričani, da želite spremeniti zadrževanje statistike? Če zmanjšate vrednost intervala, bodo nekateri podatki izgubljeni",
"statistics_cleared": "Statistika je bila uspešno počiščena",
"interval_hours": "{{count}} uro",
"interval_hours_plural": "{{count}} ur",
"filters_configuration": "Konfiguracija filtrov",
"filters_enable": "Omogoči filtre",
"filters_interval": "Interval posodabljanja filtrov",
"disabled": "Onemogočeno",
"username_label": "Uporabniško ime",
"username_placeholder": "Vnesite uporabniško ime",
"password_label": "Geslo",
"password_placeholder": "Vnesite geslo",
"sign_in": "Prijava",
"sign_out": "Odjava",
"forgot_password": "Izgubljeno geslo?",
"forgot_password_desc": "Prosimo, sledite <0>tem korakom</0>, da ustvarite novogeslo za uporabniški računa.",
"location": "Lokacija",
"orgname": "Ime organizacije",
"netname": "Ime omrežja",
"descr": "Opis",
"whois": "Whois",
"filtering_rules_learn_more": "<0>Več o tem</0>, o ustvarjanju lastnih Seznamov nedovoljenih gostiteljev.",
"blocked_by_response": "Onemogočeno z CNAME ali IP v odgovoru"
}

View File

@@ -0,0 +1,431 @@
{
"client_settings": "Postavke klijenta",
"example_upstream_reserved": "možete odrediti DNS upstream <0>za određene domene</0>",
"upstream_parallel": "Koristite paralelne zahteve da ubrzate rešavanje istovremenim zahtevanjem svih servera",
"bootstrap_dns": "Bootstrap DNS serveri",
"bootstrap_dns_desc": "Bootstrap DNS serveri se koriste da reše IP adrese od DoH/DoT razrešivača koje ste odredili kao upstream.",
"check_dhcp_servers": "Proveri DHCP servere",
"save_config": "Sačuvaj konfiguraciju",
"enabled_dhcp": "DHCP server uključen",
"disabled_dhcp": "DHCP server isključen",
"dhcp_title": "DHCP server (eksperimentalno!)",
"dhcp_description": "Ako vaš ruter nema DHCP postavke, možete koristiti AdGuard' ugrađen DHCP server.",
"dhcp_enable": "Uključi DHCP server",
"dhcp_disable": "Isključi DHCP server",
"dhcp_not_found": "Bezbedno je da uključite ugrađeni DHCP server. Nismo pronašli nijedan aktivan DHCP server na mreži. međutim, ohrabrujemo vas da to ponovo proverite ručno, jer naš automatski test trenutno nije 100% pouzdan.",
"dhcp_found": "Pronađen je aktivan DHCP server na mreži. Nije bezbedno da uključite ugrađeni DHCP server.",
"dhcp_leases": "DHCP pozajmljivanja",
"dhcp_static_leases": "DHCP statička pozajmljivanja",
"dhcp_leases_not_found": "DHCP pozajmljivanja nisu pronađena",
"dhcp_config_saved": "Sačuvaj DHCP konfiguraciju servera",
"form_error_required": "Obavezno polje",
"form_error_ip4_format": "Nevažeći IPv4 format",
"form_error_ip6_format": "Nevažeći IPv6 format",
"form_error_ip_format": "Nevažeći IPv4 oblik",
"form_error_mac_format": "Nevažeći MAC format",
"form_error_positive": "Mora biti veće od 0",
"form_error_negative": "Mora biti 0 ili veće",
"dhcp_form_gateway_input": "IP mrežnog prolaza",
"dhcp_form_subnet_input": "Subnet mask",
"dhcp_form_range_title": "Opseg IP adresa",
"dhcp_form_range_start": "Početak opsega",
"dhcp_form_range_end": "Kraj opsega",
"dhcp_form_lease_title": "DHCP vreme pozajmljivanja (u sekundama)",
"dhcp_form_lease_input": "Trajanje iznajmljivanja",
"dhcp_interface_select": "Izaberite DHCP okruženje",
"dhcp_hardware_address": "Adresa hardvera",
"dhcp_ip_addresses": "IP adrese",
"dhcp_table_hostname": "Ime hosta",
"dhcp_table_expires": "Ističe",
"dhcp_warning": "Ako svakako želite da uključite DHCP server, uverite se da nema drugih aktivnih DHCP servera u vašoj mreži. U suprotnom, to može pokvariti Internet za povezane uređaje!",
"dhcp_error": "Ne možemo da odredimo da li ima drugih DHCP servera na mreži.",
"dhcp_static_ip_error": "Kako biste koristili DHCP server, morate podesiti statičku IP adresu. Nismo mogli da odredimo da li je ovo mrežno okruženje podešeno za korišćenje statičke IP adrese. Molimo vas da podesite statičku IP adresu ručno.",
"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_new_static_lease": "Novo statičko iznajmljivanje",
"dhcp_static_leases_not_found": "Nisu pronađena statička DHCP iznajmljivanja",
"dhcp_add_static_lease": "Dodaj statičko iznajmljivanje",
"dhcp_reset": "Jeste li sigurni da želite da resetujete DHCP konfiguraciju?",
"delete_confirm": "Jeste li sigurni da želite da izbrišete \"{{key}}\"?",
"form_enter_hostname": "Unesite ime hosta",
"error_details": "Detalji greške",
"back": "Nazad",
"dashboard": "Kontrolna tabla",
"settings": "Postavke",
"filters": "Filteri",
"query_log": "Dnevnik zahteva",
"faq": "ČPP",
"version": "Verzija",
"address": "adresa",
"on": "Uključeno",
"off": "Isključeno",
"copyright": "Autorska prava",
"homepage": "Početna stranica",
"report_an_issue": "Prijavi poteškoću",
"privacy_policy": "Politika privatnosti",
"enable_protection": "Uključi zaštitu",
"enabled_protection": "Uključena zaštita",
"disable_protection": "Isključi zaštitu",
"disabled_protection": "Isključena zaštita",
"refresh_statics": "Osveži statistike",
"dns_query": "DNS zahtevi",
"blocked_by": "<0>blokirano od filtera</0>",
"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_days": "u poslednjih {{count}} dana",
"for_last_days_plural": "u poslednjih {{count}} dana",
"no_domains_found": "Domeni nisu pronađeni",
"requests_count": "Broj zahteva",
"top_blocked_domains": "Najčešće blokirani domeni",
"top_clients": "Najčešći klijenti",
"no_clients_found": "Nema pronađenih klijenata",
"general_statistics": "Opšte statistike",
"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_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",
"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 href='#filters'>Filters</a> postavkama.",
"use_adguard_browsing_sec": "Koristi AdGuard-ovu uslugu bezbednog pregledanja",
"use_adguard_browsing_sec_hint": "AdGuard Home će proveriti da li je domen blokiran od strane usluge za bezbednosno pregledanje. Koristiće prijateljski API privatni pregled da izvrši proveru. Samo će se kratak prefiks domena SHA256 hash poslati na server.",
"use_adguard_parental": "Koristi AdGuard-ovu uslugu roditeljske kontrole",
"use_adguard_parental_hint": "AdGuard Home će proveriti da li domen sadrži sadržaj za odrasle. Koristi se isti privatni prijateljski API kao i kod usluge bezbednog pregledanja.",
"enforce_safe_search": "Nametni sigurno pretraživanje",
"enforce_save_search_hint": "AdGuard Home može nametnuti sigurno pretraživanje u sledećim pretraživačima: Google, Youtube, Bing, DuckDuckGo i Yandex.",
"no_servers_specified": "Serveri nisu određeni",
"general_settings": "Opšte postavke",
"dns_settings": "DNS postavke",
"encryption_settings": "Postavke šifrovanja",
"dhcp_settings": "DHCP postavke",
"upstream_dns": "Upstream DNS serveri",
"upstream_dns_hint": "Ako ovo polje ostavite prazno, AdGuard Home će koristiti <a href='https://www.quad9.net/' target='_blank'>Quad9</a> kao upstream.",
"test_upstream_btn": "Testiraj upstreams",
"upstreams": "Upstreams",
"apply_btn": "Primeni",
"disabled_filtering_toast": "Isključeno filtriranje",
"enabled_filtering_toast": "Uključeno filtriranje",
"disabled_safe_browsing_toast": "Isključeno sigurno pregledanje",
"enabled_safe_browsing_toast": "Uključeno sigurno pretraživanje",
"disabled_parental_toast": "Isključena roditeljska kontrola",
"enabled_parental_toast": "Uključena roditeljska kontrola",
"disabled_safe_search_toast": "Isključena sigurna pretraga",
"enabled_save_search_toast": "Uključeno sigurno pretraživanje",
"enabled_table_header": "Uključeno",
"name_table_header": "Ime",
"filter_url_table_header": "URL do filtera",
"rules_count_table_header": "Broj pravila",
"last_time_updated_table_header": "Poslednji put ažurirano",
"actions_table_header": "Radnje",
"edit_table_action": "Izmeni",
"delete_table_action": "Izbriši",
"filters_and_hosts": "Blok lista filtera i hostova",
"filters_and_hosts_hint": "AdGuard Home razume osnovna pravila blokiranja reklama i sintaksu hosts datoteke.",
"no_filters_added": "Filteri nisu dodati",
"add_filter_btn": "Dodaj filter",
"cancel_btn": "Otkaži",
"enter_name_hint": "Unesite ime",
"enter_url_hint": "Unesite URL",
"check_updates_btn": "Proveri ažuriranja",
"new_filter_btn": "Nova pretplata na filter",
"enter_valid_filter_url": "Unesite važeći URL do pretplate na filter ili važeću hosts datoteku.",
"custom_filter_rules": "Prilagođena pravila filtriranja",
"custom_filter_rules_hint": "Unesite jedno pravilo po redu. Možete koristiti pravila blokatora reklama ili sintaksu hosts datoteke.",
"examples_title": "Primeri",
"example_meaning_filter_block": "blokirajte pristup ka domenu primer.org i svim njegovim poddomenima",
"example_meaning_filter_whitelist": "dozvolite pristup ka domenu primer.org i svim njegovim poddomenima",
"example_meaning_host_block": "AdGuard Home će sada vratiti adresu 127.0.0.1 za domen primer.org (ali ne i za njegove poddomene).",
"example_comment": "! Ovde ide komentar",
"example_comment_meaning": "samo komentar",
"example_comment_hash": "# Takođe komentar",
"example_regex_meaning": "blokiranje pristupa domenima koji odgovaraju određenom uobičajenom izrazu",
"example_upstream_regular": "uobičajeno DNS (preko UDP)",
"example_upstream_dot": "šifrovano <0>DNS-over-TLS</0>",
"example_upstream_doh": "šifrovano <0>DNS-over-HTTPS</0>",
"example_upstream_sdns": "možete koristiti <0>DNS brojeve</0> za <1>DNSCrypt</1> ili <2>DNS-over-HTTPS</2>",
"example_upstream_tcp": "uobičajeni DNS (preko TCP)",
"all_filters_up_to_date_toast": "Svi filteri su već ažurirani",
"updated_upstream_dns_toast": "Ažurirani upstream DNS serveri",
"dns_test_ok_toast": "Dati DNS serveri rade ispravno",
"dns_test_not_ok_toast": "Server \"{{key}}\": se ne može koristiti. Proverite da li ste ga ispravno uneli",
"unblock_btn": "Odblokiraj",
"block_btn": "Blokiraj",
"time_table_header": "Vreme",
"domain_name_table_header": "Ime domena",
"type_table_header": "Vrsta",
"response_table_header": "Odgovor",
"client_table_header": "Klijent",
"empty_response_status": "Prazno",
"show_all_filter_type": "Pokaži sve",
"show_filtered_type": "Pokaži filtrirano",
"no_logs_found": "Dnevnici nisu pronađeni",
"refresh_btn": "Osveži",
"previous_btn": "Prethodno",
"next_btn": "Sledeće",
"loading_table_status": "Učitavanje...",
"page_table_footer_text": "Stranica",
"of_table_footer_text": "od",
"rows_table_footer_text": "redovi",
"updated_custom_filtering_toast": "Ažurirana prilagođena pravila filtriranja",
"rule_removed_from_custom_filtering_toast": "Pravilo uklonjeno iz prilagođenih pravila filtriranja",
"rule_added_to_custom_filtering_toast": "Pravilo dodato u prilagođena pravila filtriranja",
"query_log_response_status": "Stanje: {{value}}",
"query_log_filtered": "Filtrirano od {{filter}}",
"query_log_confirm_clear": "Jeste li sigurni da želite da očistite ceo dnevnik unosa?",
"query_log_cleared": "Dnevnik unosa je uspešno očišćen",
"query_log_clear": "Očisti dnevnike unosa",
"query_log_retention": "Zadržavanje dnevnika unosa",
"query_log_enable": "Uključi dnevnik",
"query_log_configuration": "Konfiguracija dnevnika",
"query_log_disabled": "Dnevnik unosa je isključen ali se može konfigurisati u <0>postavkama</0>",
"query_log_strict_search": "Koristi duple navodnike za striktnu pretragu",
"query_log_retention_confirm": "Jeste li sigurni da želite da promenite zadržavanje dnevnika unosa? Ako smanjite vrednost intervala, neki podaci će biti izgubljeni",
"dns_config": "Konfiguracija DNS servera",
"blocking_mode": "Način blokiranja",
"nxdomain": "NXDOMAIN",
"null_ip": "Null IP",
"custom_ip": "Prilagođeni IP",
"blocking_ipv4": "Blokiranje IPv4",
"blocking_ipv6": "Blokiranje IPv6",
"form_enter_rate_limit": "Unesite ograničenje brzine",
"rate_limit": "Ograničenje brzine",
"edns_enable": "Uključi EDNS Client Subnet",
"edns_cs_desc": "Ako je uključeno, AdGuard Home će slati klijente na DNS servere.",
"rate_limit_desc": "Broj zahteva po sekundi koje pojedinačni klijent dozvoljava (0: neograničeno)",
"blocking_ipv4_desc": "IP adresa koja će biti vraćena za blokirane zahteve",
"blocking_ipv6_desc": "IP adresa koja će biti vraćena za blokirane AAAA zahteve",
"blocking_mode_desc": "<0>NXDOMAIN odgovara sa NXDOMAIN code;</0> <0>Null IP odgovara sa nulom IP adresom (0.0.0.0 za A; :: za AAAA);</0> <0>Prilagođeni IP - odgovara sa ručno podešenom IP adresom",
"upstream_dns_client_desc": "AKo ovo polje ostavite prazno, AdGuard Home će koristiti servere konfigurisane u <0>DNS postavkama</0>.",
"source_label": "Izvor",
"found_in_known_domain_db": "Pronađeno u poznatim bazama podataka domena.",
"category_label": "Kategorija",
"rule_label": "Pravilo",
"filter_label": "Filter",
"unknown_filter": "Nepoznat filter {{filterId}}",
"install_welcome_title": "Dobrodošli u AdGuard home!",
"install_welcome_desc": "AdGuard Home je mrežni DNS server, blokator reklama i praćenja. Dopušta vam da kontrolišete svoju čitavu mrežu i sve vaše uređaje i ne zahteva korišćenje nikakvog klijentskog programa.",
"install_settings_title": "Administratorsko web okruženje",
"install_settings_listen": "Okruženje slušanja",
"install_settings_port": "Port",
"install_settings_interface_link": "Vaše AdGuard Home administratorsko web okruženje će biti dostupno na sledećim adresama:",
"form_error_port": "Unesite važeću vrednost za port",
"install_settings_dns": "DNS server",
"install_settings_dns_desc": "Potrebno je da konfigurišete vaše uređaje ili ruter da koristi DNS server sa sledećim adresama:",
"install_settings_all_interfaces": "Sva okruženja",
"install_auth_title": "Autentifikacija",
"install_auth_desc": "Preporučujemo vam da konfigurišete autentifikaciju lozinkom za vaše AdGuard Home administratorsko okruženje. Čak iako mu je moguće pristupiti samo iz vaše lokalne mreže,, i dalje je važno da ga zaštitite od neograničenog pristupa.",
"install_auth_username": "Korisničko ime",
"install_auth_password": "Lozinka",
"install_auth_confirm": "Potvrdite lozinku",
"install_auth_username_enter": "Unesite korisničko ime",
"install_auth_password_enter": "Unesite lozinku",
"install_step": "Korak",
"install_devices_title": "Konfigurišite vaše uređaje",
"install_devices_desc": "Za početak korišćenja AdGuard Home, potrebno je da konfigurišete vaše uređaje da ga koriste.",
"install_submit_title": "Čestitamo!",
"install_submit_desc": "Postavljanje je završeno i sada ste spremni da započnete sa korišćenjem AdGuard Home.",
"install_devices_router": "Ruter",
"install_devices_router_desc": "Ovo postavljanje će automatski pokriti sve uređaje koji su povezani na vaš kućni ruter pa nećete morati da konfigurišete svaki uređaj posebno.",
"install_devices_address": "AdGuard Home DNS server sluša na sledećim adresama",
"install_devices_router_list_1": "Otvorite podešavanja vašeg rutera. Obično im možete pristupiti iz vašeg preglednika preko URL (kao http://192.168.0.1/ ili http://192.168.1.1/). Možda će vam biti zatraženo da unesete lozinku. Ako je ne znate ili je se ne sećate, najčešće je možete resetovati pritiskom na dugme na samom ruteru. Neki ruteri zahtevaju određenu aplikaciju, koja bi u tom slučaju već trebalo da bude instalirana na vašem računaru ili telefonu.",
"install_devices_router_list_2": "Pronađite DHCP ili DNS postavke. Potražite DNS slova pored polja koje dozvoljava dve ili tri skupine brojeva, a svaka može da sadrži četiri grupe od jedne do tri cifre.",
"install_devices_router_list_3": "Tamo unesite adrese AdGuard home servera.",
"install_devices_windows_list_1": "Otvorite kontrolnu tablu iz startnog menija ili kroz Windows pretragu.",
"install_devices_windows_list_2": "Otvorite kategoriju mreža i internet a onda otiđite u centar za mrežu i deljenje.",
"install_devices_windows_list_3": "Na levoj strani ekrana pronađite Promena postavke adaptera i kliknite tu.",
"install_devices_windows_list_4": "Izaberite vašu aktivnu vezu, desnim tasterom kliknite na nju i izaberite Svojstva.",
"install_devices_windows_list_5": "Na listi pronađite Internet Protokol verzija 4 (TCP/IP), izaberite ga pa kliknite ponovo na Svojstva.",
"install_devices_windows_list_6": "Izaberite Koristi sledeće adrese DNS servera pa unesite vaše adrese AdGuard Home servera.",
"install_devices_macos_list_1": "Kliknite na ikonicu jabuke pa otiđite na postavke sistema.",
"install_devices_macos_list_2": "Kliknite na mrežu.",
"install_devices_macos_list_3": "Izaberite prvu vezu sa liste pa kliknite na više opcija.",
"install_devices_macos_list_4": "Izaberite karticu DNS pa tu unesite adrese vašeg AdGuard Home servera.",
"install_devices_android_list_1": "Sa Android početnog ekrana, dodirnite Postavke.",
"install_devices_android_list_2": "Dodirnite Wi-Fi. Pojaviće se ekran sa svim dostupnim mrežama. Nije moguće da podesite prilagođeni DNS za mobilne veze).",
"install_devices_android_list_3": "Dugo pritisnite na mrežu na koju ste povezani, pa dodirnite Izmeni mrežu.",
"install_devices_android_list_4": "Na nekim uređajima će možda biti potrebno da označite kućicu za napredne opcije kako bi videli dalje postavke. Da biste prilagodili vaše Android DNS postavke, prebacite IP postavke sa DHCP na statičke.",
"install_devices_android_list_5": "Promenite DNS 1 i DNS 2 vrednosti na adrese vašeg AdGuard Home servera.",
"install_devices_ios_list_1": "Sa početnog ekrana, dodirnite postavke.",
"install_devices_ios_list_2": "U levom meniju izaberite Wi-Fi. Nije moguće da konfigurišete DNS za mobilne mreže).",
"install_devices_ios_list_3": "Dodirnite ime trenutno aktivne mreže.",
"install_devices_ios_list_4": "U DNS polje unesite adrese vašeg AdGuard Home servera.",
"get_started": "Počnimo",
"next": "Dalje",
"open_dashboard": "Otvori kontrolnu tablu",
"install_saved": "Uspešno sačuvano",
"encryption_title": "Šifrovanje",
"encryption_desc": "Šifrovanje (HTTPS/TLS) podrška za oba DNS i administratorsko okruženje",
"encryption_config_saved": "Konfiguracija šifrovanja je sačuvana",
"encryption_server": "Ime servera",
"encryption_server_enter": "Unesite vaše ime domena",
"encryption_server_desc": "Kako biste koristili HTTPS, potrebno je da unesete ime servera koje se podudara sa SSL sertifikatom.",
"encryption_redirect": "Automatski preusmeri na HTTPS",
"encryption_redirect_desc": "Ako je označeno, AdGuard Home će vas automatski preusmeravati sa HTTP na HTTPS adrese.",
"encryption_https": "HTTPS port",
"encryption_https_desc": "Ako je HTTPS port konfigurisan, AdGuard Home administratorskom okruženju će se moći pristupati preko HTTPS, a to će takođe omogućiti DNS-over-HTTPS na '/dns-query' lokaciji.",
"encryption_dot": "DNS-over-TLS port",
"encryption_dot_desc": "Ako je ovaj port konfigurisan, AdGuard Home će pokretati DNS-over-TLS server na ovom portu.",
"encryption_certificates": "Sertifikati",
"encryption_certificates_desc": "Da biste koristili šifrovanje, morate obezbediti važeći lanac SSL sertifikata za vaš domen. Besplatan sertifikat možete nabaviti na <0>{{link}}</0> ili ga možete kupiti od nekog od pouzdanih izdavalaca sertifikata.",
"encryption_certificates_input": "Kopirajte/nalepite vaše PEM-kodirane sertifikate ovde.",
"encryption_status": "Stanje",
"encryption_expire": "Ističe",
"encryption_key": "Privatni ključ",
"encryption_key_input": "Kopirajte/nalepite vaš PEM-kodirani privatni ključ za vaš sertifikat ovde.",
"encryption_enable": "Uključi šifrovanje (HTTPS, DNS-over-HTTPS, i DNS-over-TLS)",
"encryption_enable_desc": "Ako je šifrovanje uključeno, AdGuard Home administratorsko okruženje će raditi preko HTTPS, i DNS server će slušati zahteve preko DNS-over-HTTPS i DNS-over-TLS.",
"encryption_chain_valid": "Lanac sertifikata je važeći",
"encryption_chain_invalid": "Lanac sertifikata je nevažeći",
"encryption_key_valid": "Ovo je važeći {{type}} privatni ključ",
"encryption_key_invalid": "Ovo je nevažeći {{type}} privatni ključ",
"encryption_subject": "Predmet",
"encryption_issuer": "Izdavač",
"encryption_hostnames": "Imena hostova",
"encryption_reset": "Jeste li sigurni da želite dda resetujete postavke šifrovanja?",
"topline_expiring_certificate": "Vaš SSL sertifikat uskoro ističe. Ažurirajte <0>postavke šifrovanja</0>.",
"topline_expired_certificate": "Vaš SSL sertifikat je istekao. Ažurirajte <0>postavke šifrovanja</0>.",
"form_error_port_range": "Unesite vrednost porta u opsegu od 80-65535",
"form_error_port_unsafe": "Ovo nije siguran port",
"form_error_equal": "Ne bi trebalo da bude jednako",
"form_error_password": "Lozinke se ne podudaraju",
"reset_settings": "Vrati postavke na podrazumevano",
"update_announcement": "AdGuard Home {{version}} je sada dostupan! <0>Kliknite ovde</0> za više informacija.",
"setup_guide": "Uputstvo za podešavanje",
"dns_addresses": "DNS adrese",
"dns_start": "DNS server se pokreće",
"dns_status_error": "Greška prilikom pribavljanja stanja DNS servera",
"down": "Dole",
"fix": "Popravi",
"dns_providers": "Ovo je a <0>lista poznatih DNS dobavljača</0> sa koje možete da izaberete.",
"update_now": "Ažuriraj sada",
"update_failed": "Automatsko ažuriranje nije uspelo. Molimo vas <a href='https://github.com/AdguardTeam/AdGuardHome/wiki/Getting-Started#update'>pratite korake</a> za ručno ažuriranje.",
"processing_update": "Molimo sačekajte. AdGuard Home se ažurira",
"clients_title": "Klijenti",
"clients_desc": "Konfigurišite uređaje koji su povezani na AdGuard Home",
"settings_global": "Globalno",
"settings_custom": "Prilagođeno",
"table_client": "Klijent",
"table_name": "Ime",
"save_btn": "Sačuvaj",
"client_add": "Dodaj klijent",
"client_new": "Novi klijent",
"client_edit": "Izmeni klijent",
"client_identifier": "Identifikator",
"ip_address": "IP adresa",
"client_identifier_desc": "Klijenti mogu da budu prepoznati po IP adresi ili MAC adresi. Imajte na umu da je korišćenje MAC adrese kao identifikatora moguće samo ako je AdGuard Home takođe a <0>DHCP server</0>",
"form_enter_ip": "Unesite IP",
"form_enter_mac": "Unesite MAC",
"form_enter_id": "Unesite identifikator",
"form_add_id": "Dodaj identifikator",
"form_client_name": "Unesite ime klijenta",
"client_global_settings": "Koristi globalne postavke",
"client_deleted": "Klijent \"{{key}}\" uspešno izbrisan",
"client_added": "Klijent \"{{key}}\" uspešno dodat",
"client_updated": "Klijent \"{{key}}\" uspešno ažuriran",
"clients_not_found": "Nema pronađenih klijenata",
"client_confirm_delete": "Jeste li sigurni da želite da izbrišete klijenta \"{{key}}\"?",
"filter_confirm_delete": "Jeste li sigurni da želite da izbrišete filter?",
"auto_clients_title": "Klijenti (runtime)",
"auto_clients_desc": "Podaci o klijentima koji koriste AdGuard Home, ali nisu sačuvani u konfiguraciji",
"access_title": "Postavke pristupa",
"access_desc": "Ovde možete konfigurisati pravila pristupa za AdGuard home DNS server.",
"access_allowed_title": "Dozvoljeni klijenti",
"access_allowed_desc": "Spisak CIDR ili IP adresa. Ako je podešeno, AdGuard Home će prihvatiti zahteve samo od ovih IP adresa.",
"access_disallowed_title": "Zabranjeni klijenti",
"access_disallowed_desc": "Lista CIDR ili IP adresa.. Ako je podešeno, AdGuard Home će odbijati zahteve od ovih IP adresa.",
"access_blocked_title": "Blokirani domeni",
"access_blocked_desc": "Nemojte ovo mešati sa filterima. AdGuard Home će odbijati DNS unose ka ovim domenima.",
"access_settings_saved": "Postavke pristupa su uspešno sačuvane",
"updates_checked": "Ažuriranja su uspešno proverena",
"updates_version_equal": "AdGuard Home je ažuriran na najnoviju verziju",
"check_updates_now": "Proveri da li postoje ispravke",
"dns_privacy": "DNS privatnost",
"setup_dns_privacy_1": "<0>DNS-over-TLS:</0> koristi <1>{{address}}</1> string.",
"setup_dns_privacy_2": "<0>DNS-over-HTTPS:</0> koristi <1>{{address}}</1> string.",
"setup_dns_privacy_3": "<0>Imajte na umu da su protokoli šifrovanog DNS-a podržani samo od Androida 9. Biće potrebno da instalirate dodatni softver za druge operativne sisteme.</0><0>Ovde je spisak softvera koje možete koristiti.</0>",
"setup_dns_privacy_android_1": "Android 9 podržava DNS-over-TLS. Za konfiguraciju, idite u postavke → mreža i internet → Napredno → Privatni DNS i tamo unesite ime vašeg domena.",
"setup_dns_privacy_android_2": "<0>AdGuard for Android</0> podržava <1>DNS-over-HTTPS</1> i <1>DNS-over-TLS</1>.",
"setup_dns_privacy_android_3": "<0>Intra</0> dodaje <1>DNS-over-HTTPS</1> podršku za Android.",
"setup_dns_privacy_ios_1": "<0>DNSCloak</0> podržava <1>DNS-over-HTTPS</1>, ali da biste mogli da ga konfigurišete da koristi vaš lični server, biće potrebno da generišete a <2>DNS Stamp</2> za njega.",
"setup_dns_privacy_ios_2": "<0>AdGuard za iOS</0> podržava <1>DNS-over-HTTPS</1> i <1>DNS-over-TLS</1>.",
"setup_dns_privacy_other_title": "Druge implementacije",
"setup_dns_privacy_other_1": "AdGuard home može biti bezbedan DNS server na bilo kojoj platformi.",
"setup_dns_privacy_other_2": "<0>dnsproxy</0> podržava sve poznate bezbedne DNS protokole.",
"setup_dns_privacy_other_3": "<0>dnscrypt-proxy</0> podržava <1>DNS-over-HTTPS</1>.",
"setup_dns_privacy_other_4": "<0>Mozilla Firefox</0> podržava <1>DNS-over-HTTPS</1>.",
"setup_dns_privacy_other_5": "Više implementacija ćete pronaći <0>ovde</0> i <1>ovde</1>.",
"setup_dns_notice": "Kako biste koristili <1>DNS-over-HTTPS</1> ili <1>DNS-over-TLS</1>, potrebno je da <0>konfigurišete šifrovanje</0> u AdGuard Home postavkama.",
"rewrite_added": "DNS prepisivanje za \"{{key}}\" je uspešno dodato",
"rewrite_deleted": "DNS prepisivanje za \"{{key}}\" uspešno izbrisano",
"rewrite_add": "Dodaj DNS prepisivanje",
"rewrite_not_found": "DNS prepisivanja nisu pronađena",
"rewrite_confirm_delete": "Jeste li sigurni da želite da izbrišete DNS prepisivanje za \"{{key}}\"?",
"rewrite_desc": "Dozvoljava da jednostavno konfigurišete prilagođeni DNS odgovor za određeni domen.",
"rewrite_applied": "Primenjeno pravilo prepisivanja",
"dns_rewrites": "DNS prepisivanja",
"form_domain": "Unesite domen",
"form_answer": "Unesite IP adresu ili domen",
"form_error_domain_format": "Nevažeći format domena",
"form_error_answer_format": "Nevažeći format odgovora",
"configure": "Konfiguriši",
"main_settings": "Glavne postavke",
"block_services": "Blokiraj određene usluge",
"blocked_services": "Blokiraj usluge",
"blocked_services_desc": "Dozvoljava vam da brzo blokirate popularne sajtove i usluge.",
"blocked_services_saved": "Blokirane usluge su uspešno sačuvane",
"blocked_services_global": "Koristi globalne blokirane usluge",
"blocked_service": "Blokirana usluga",
"block_all": "Blokiraj sve",
"unblock_all": "Odblokiraj sve",
"encryption_certificate_path": "Putanja sertifikata",
"encryption_private_key_path": "Putanja privatnog ključa",
"encryption_certificates_source_path": "Postavi putanju do datoteke sertifikata",
"encryption_certificates_source_content": "Nalepite sadržaj sertifikata",
"encryption_key_source_path": "Podesi datoteku privatnog ključa",
"encryption_key_source_content": "Nalepi sadržaj privatnog ključa",
"stats_params": "Konfiguracija statistike",
"config_successfully_saved": "Konfiguracija je uspešno sačuvana",
"interval_24_hour": "24 časa",
"interval_days": "{{count}} dan",
"interval_days_plural": "{{count}} dana",
"domain": "Domen",
"answer": "Odgovor",
"filter_added_successfully": "Filter je uspešno dodat",
"statistics_configuration": "Konfiguracija statistike",
"statistics_retention": "Zadržavanje statistike",
"statistics_retention_desc": "Ako smanjite vrednost intervala, neki podaci će biti izgubljeni",
"statistics_clear": " Očisti statistiku",
"statistics_clear_confirm": "Jeste li sigurni da želite da očistite statistiku?",
"statistics_retention_confirm": "Jeste li sigurni da želite da promenite zadržavanje statistike? Ako smanjite vrednost intervala, neki podaci će biti izgubljeni",
"statistics_cleared": "Statistika je uspešno očišćena",
"interval_hours": "{{count}} čas",
"interval_hours_plural": "{{count}} časova",
"filters_configuration": "Konfiguracija filtera",
"filters_enable": "Uključi filtere",
"filters_interval": "Interval ažuriranja filtera",
"disabled": "Isključeno",
"username_label": "Korisničko ime",
"username_placeholder": "Unesite korisničko ime",
"password_label": "Lozinka",
"password_placeholder": "Unesite lozinku",
"sign_in": "Prijavi se",
"sign_out": "Odjavi se",
"forgot_password": "Zaboravili ste lozinku?",
"forgot_password_desc": "Ispratite <0>ove korake</0> za stvaranje nove lozinke za vaš korisnički nalog.",
"location": "Lokacija",
"orgname": "Ime organizacije",
"netname": "Ime mreže",
"descr": "Opis",
"whois": "Whois",
"filtering_rules_learn_more": "<0>Saznajte više</0> o stvaranju vaše lične blokliste hostova.",
"blocked_by_response": "Blokirano od CNAME ili IP u odgovoru",
"try_again": "Pokušaj ponovo"
}

View File

@@ -1,9 +1,9 @@
{
"client_settings": "Klientinställningar",
"example_upstream_reserved": "du kan specificera DNS-uppström <0>för en specifik domän</0>",
"upstream_parallel": "Använd parallella förfrågningar för att snabba upp dessa på uppströmsservrar.",
"bootstrap_dns": "Bootstrap-DNS-servrar",
"bootstrap_dns_desc": "Bootstrap-DNS-servrar används för att slå upp DoH/DoT-resolvrarnas IP-adresser som du specificerat som uppström.",
"url_added_successfully": "URL tillagd utan fel",
"check_dhcp_servers": "Letar efter DHCP-servrar",
"save_config": "Spara inställningar",
"enabled_dhcp": "DHCP-server aktiverad",
@@ -15,10 +15,10 @@
"dhcp_not_found": "Ingen aktiv DHCP-server hittades i nätverkat.",
"dhcp_found": "Några aktiva DHCP-servar upptäcktes. Det är inte säkert att aktivera inbyggda DHCP-servrar.",
"dhcp_leases": "DHCP-lease",
"dhcp_static_leases": "Statiska DHCP-leases",
"dhcp_leases_not_found": "Ingen DHCP-lease hittad",
"dhcp_config_saved": "Sparade inställningar för DHCP-servern",
"form_error_required": "Obligatoriskt fält",
"form_error_ip_format": "Ogiltigt IPv4-format",
"form_error_mac_format": "Ogiltigt MAC-format",
"form_error_positive": "Måste vara större än noll",
"dhcp_form_gateway_input": "Gateway-IP",
"dhcp_form_subnet_input": "Subnetmask",
@@ -36,16 +36,25 @@
"dhcp_error": "Vi kunde inte avgöra om det finns en till DHCP-server på nätverket.",
"dhcp_static_ip_error": "För att kunna använda en DHCP-server måste det finnas en statisk IP-adress. Vi kunde inte avgöra om nätverksgränssnittet är konfigurerat med en statisk IP-adress. Ställ in en statistik IP-adress manuellt.",
"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>. Vi kommer att göra denna IP-adress statisk automatiskt 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_new_static_lease": "Ny statisk lease",
"dhcp_static_leases_not_found": "Inga statiska DHCP-leases hittade",
"dhcp_add_static_lease": "Lägg till statisk lease",
"delete_confirm": "Är du säker på att du vill ta bort \"{{key}}\"?",
"form_enter_hostname": "Skriv in värdnamn",
"error_details": "Felinformation",
"back": "Tiilbaka",
"dashboard": "Kontrollpanel",
"settings": "Inställningar",
"filters": "Filter",
"query_log": "Förfrågningslogg",
"faq": "FAQ",
"version": "version",
"address": "adress",
"on": "PÅ",
"off": "AV",
"copyright": "Copyright",
"homepage": "Hemsida",
"report_an_issue": "Rapportera ett problem",
"privacy_policy": "Integritetspolicy",
@@ -55,11 +64,13 @@
"disabled_protection": "Kopplade bort skydd",
"refresh_statics": "Uppdatera statistik",
"dns_query": "DNS-förfrågningar",
"blocked_by": "Blockerat av filter",
"blocked_by": "<0>Blockerat av filter</0>",
"stats_malware_phishing": "Blockerad skadekod/phising",
"stats_adult": "Blockerade vuxensajter",
"stats_query_domain": "Mest eftersökta domäner",
"for_last_24_hours": "under de senaste 24 timamrna",
"for_last_days": "för den senaste {{count}} dagen",
"for_last_days_plural": "för de senaste {{count}} dagarna",
"no_domains_found": "Inga domäner hittade",
"requests_count": "Förfrågningsantal",
"top_blocked_domains": "Flest blockerade domäner",
@@ -81,12 +92,12 @@
"use_adguard_parental": "Använda AdGuards webbservice för färäldrakontroll",
"use_adguard_parental_hint": "AdGuard Home kommer att kontrollera domäner för innehåll av vuxenmaterial . Samma integritetsvänliga metod för API-lookup som tillämpas i webbservicens surfsäkerhet används.",
"enforce_safe_search": "Tillämpa Säker surf",
"enforce_save_search_hint": "AdGuard Home kan framtvinga säker surf i följande sökmoterer: Google, Youtube, Bing, och Yandex.",
"no_servers_specified": "Inga servrar angivna",
"no_settings": "Inga inställningar",
"general_settings": "Allmänna inställningar",
"dns_settings": "DNS-inställningar",
"encryption_settings": "Krypteringsinställningar",
"dhcp_settings": "DHCP-inställningar",
"upstream_dns": "Upstream DNS-servrar",
"upstream_dns_hint": "Om du låter fältet vara tomt kommer AdGuard Home att använda <a href='https://1.1.1.1/' target='_blank'>Cloudflare DNS</a> för uppström.",
"test_upstream_btn": "Testa uppströmmar",
"apply_btn": "Tillämpa",
"disabled_filtering_toast": "Filtrering bortkopplad",
@@ -103,6 +114,7 @@
"rules_count_table_header": "Regelantal",
"last_time_updated_table_header": "Uppdaterades senast",
"actions_table_header": "Åtgärder",
"edit_table_action": "Redigera",
"delete_table_action": "Ta bort",
"filters_and_hosts": "Filtrerings- och värdlistor för blockering",
"filters_and_hosts_hint": "AdGuard tillämpar grundläggande annonsblockeringsregler och värdfiltersyntaxer",
@@ -123,6 +135,7 @@
"example_comment": "! Här kommer en kommentar",
"example_comment_meaning": "Endast en kommentar",
"example_comment_hash": "# Också en kommentar",
"example_regex_meaning": "blockera åtkomst till domäner som matchar det angivna uttrycket",
"example_upstream_regular": "vanlig DNS (över UDP)",
"example_upstream_dot": "krypterat <a href='https://en.wikipedia.org/wiki/DNS_over_TLS' target='_blank'>DNS-over-TLS</a>",
"example_upstream_doh": "krypterat <a href='https://en.wikipedia.org/wiki/DNS_over_HTTPS' target='_blank'>DNS-over-HTTPS</a>",
@@ -143,11 +156,7 @@
"show_all_filter_type": "Visa alla",
"show_filtered_type": "Visa filtrerade",
"no_logs_found": "Inga logga funna",
"disabled_log_btn": "Koppla bort logg",
"download_log_file_btn": "Ladda ner loggfil",
"refresh_btn": "Läs in igen",
"enabled_log_btn": "Koppla in logg",
"last_dns_queries": "De senaste 5000 DNS-anropen",
"previous_btn": "Föregående",
"next_btn": "Nästa",
"loading_table_status": "Läser in...",
@@ -157,17 +166,28 @@
"updated_custom_filtering_toast": "Uppdaterade de egna filterreglerna",
"rule_removed_from_custom_filtering_toast": "Regel borttagen från de egna filterreglerna",
"rule_added_to_custom_filtering_toast": "Regel tillagd till de egna filterreglerna",
"query_log_disabled_toast": "Förfrågningsloggen bortkopplad",
"query_log_enabled_toast": "Förfrågningsloggen inkopplad",
"query_log_response_status": "Status: {{value}}",
"query_log_filtered": "Filtrerat av {{filter}}",
"query_log_confirm_clear": "Är du säker på att du vill rensa hela förfrågningsloggen?",
"query_log_cleared": "Förfrågningsloggen har rensats",
"query_log_clear": "Rensa förfrågningsloggar",
"query_log_retention": "Förfrågningsloggars retentionstid",
"query_log_enable": "Aktivera logg",
"query_log_configuration": "Logginställningar",
"query_log_disabled": "Förfrågningsloggen är avaktiverad och kan konfigureras i <0>inställningar</0>",
"query_log_strict_search": "Använd dubbla citattecken för strikt sökning",
"query_log_retention_confirm": "Är du säker på att du vill ändra förfrågningsloggars retentionstid? Om du minskar intervallet kommer viss data att gå förlorad",
"source_label": "Källa",
"found_in_known_domain_db": "Hittad i domändatabas.",
"category_label": "Kategori",
"rule_label": "Regel",
"filter_label": "Filter",
"unknown_filter": "Okänt filter {{filterId}}",
"install_welcome_title": "Välkommen till AdGuard Home!",
"install_welcome_desc": "AdGuard Home är en DNS-server för nätverkstäckande annons- och spårningsblockering. Dess syfte är att de dig kontroll över hela nätverket och alla dina enheter, utan behov av att använda klientbaserade program.",
"install_settings_title": "Administratörens webbgränssnitt",
"install_settings_listen": "Övervakningsgränssnitt",
"install_settings_port": "Port",
"install_settings_interface_link": "Din administratörssida för AdGuard Home finns på följande adresser:",
"form_error_port": "Skriv in ett giltigt portnummer",
"install_settings_dns": "DNS-server",
@@ -185,6 +205,7 @@
"install_devices_desc": "För att kunna använda AdGuard Home måste du sälla in dina enheter för att utnyttja den.",
"install_submit_title": "Grattis!",
"install_submit_desc": "Inställningsproceduren är klar och du kan börja använda AdGuard Home.",
"install_devices_router": "Router",
"install_devices_router_desc": "Den här anpassningen kommer att automatiskt täcka in alla de enheter som är anslutna till din hemmarouter och du behöver därför inte konfigurera var och en individuellt.",
"install_devices_address": "AdGuard Home DNS-server täcker följande adresser",
"install_devices_router_list_1": "Öppna routern Inställningar. Vanligtvis får man åtkomst via en URL (http://192.168.0.1 eller 192.168.1.1)- Du kommer att bli ombes att ange ett lösenord. Lösenordet kan stå angivet på routerns bak- eller undersida. Om lösenordet ändrats och du inte känner till det kan du återställa med Reset-knappen. En del routrar kräver en särskild applikation som skall finnas på antingen din dator eller i din mobil.",
@@ -228,6 +249,7 @@
"encryption_certificates": "Certifikat",
"encryption_certificates_desc": "För att använda kryptering måste du ange ett giltigt SSL-certifikat för din domän. Du kan skaffa ett certifikat gratis på <0>{{link}}</0> eller köpa ett från någon av de godkända certifikatutfärdare.",
"encryption_certificates_input": "Kopiera/klistra in dina PEM-kodade certifikat här.",
"encryption_status": "Status",
"encryption_expire": "Utgår",
"encryption_key": "Privat nyckel",
"encryption_key_input": "Kopiera/klistra in din PEM-kodade privata nyckel för ditt certifikat här.",
@@ -250,5 +272,68 @@
"reset_settings": "Återställ inställningar",
"update_announcement": "AdGuard Home {{version}} är nu tillgänglig! <0>Klicka här</0> för mer information.",
"setup_guide": "Inställningsguide",
"dns_addresses": "DNS-adresser"
"dns_addresses": "DNS-adresser",
"down": "Ner",
"fix": "Fixa",
"dns_providers": "Här är en <0>lista över kända DNS-leverantörer</0> att välja från.",
"update_now": "Uppdatera nu",
"update_failed": "Automatisk uppdatering misslyckad. Var god <a href='https://github.com/AdguardTeam/AdGuardHome/wiki/Getting-Started#update'>följ stegen</a> för att uppdatera manuellt.",
"processing_update": "Vänta, AdGuard Home uppdateras",
"clients_title": "Klienter",
"clients_desc": "Konfigurera enheter uppkopplade mot AdGuard Home",
"settings_global": "Global",
"settings_custom": "Anpassade",
"table_client": "Klient",
"table_name": "Namn",
"save_btn": "Spara",
"client_add": "Lägg till klient",
"client_new": "Ny klient",
"client_edit": "Redigera klient",
"client_identifier": "Identifikator",
"ip_address": "IP-adress",
"form_enter_ip": "Skriv in IP",
"form_enter_mac": "Skriv in MAC",
"form_client_name": "Skriv in klientnamn",
"client_global_settings": "Använda globala inställningar",
"client_deleted": "Klient \"{{key}}\" har raderats",
"client_added": "Klient \"{{key}}\" har lagts till",
"client_updated": "Klient \"{{key}}\" har uppdaterats",
"clients_not_found": "Inga klienter hittade",
"client_confirm_delete": "Är du säker på att du vill ta bort klient \"{{key}}\"?",
"filter_confirm_delete": "Är du säker på att du ska ta bort filtret?",
"auto_clients_title": "Klienter (körtid)",
"auto_clients_desc": "Data från klienter som använder AdGuard Home, men inte är sparade i konfigurationen",
"access_title": "Åtkomstinställningar",
"access_desc": "Här kan du konfigurera åtkomstregler för AdGuard Homes DNS-server.",
"access_allowed_title": "Tillåtna klienter",
"access_disallowed_title": "Otillåtna klienter",
"access_blocked_title": "Blockerade domäner",
"access_settings_saved": "Åtkomstinställningar sparade",
"updates_checked": "Sökning efter uppdateringar genomförd",
"updates_version_equal": "AdGuard Home är uppdaterat",
"check_updates_now": "Sök efter uppdateringar nu",
"interval_24_hour": "24 timmar",
"domain": "Domän",
"answer": "Svar",
"statistics_clear": " Rensa statistik",
"interval_hours": "{{count}} timme",
"interval_hours_plural": "{{count}} timmar",
"filters_configuration": "Filterinställningar",
"filters_enable": "Aktivera filter",
"filters_interval": "Filterppdateringsintervall",
"disabled": "Avaktiverad",
"username_label": "Användarnamn",
"username_placeholder": "Skriv in användarnamn",
"password_label": "Lösenord",
"password_placeholder": "Skriv in lösenord",
"sign_in": "Logga in",
"sign_out": "Logga ut",
"forgot_password": "Glömt lösenord?",
"forgot_password_desc": "Följ <0>dessa steg</0> för att skapa ett nytt lösenord till ditt konto.",
"location": "Plats",
"orgname": "Organisationsnamn",
"netname": "Nätverksnamn",
"descr": "Beskrivning",
"whois": "Whois",
"filtering_rules_learn_more": "<0>Mer info</0> om att skapa dina egna blockeringslistor för värdar."
}

View File

@@ -0,0 +1,366 @@
{
"client_settings": "İstemci ayarları",
"example_upstream_reserved": "<0>Belirli alan adları için</0> DNS üst sunucusu tanımlayabilirsiniz.",
"upstream_parallel": "Tüm üst sunucuları eş zamanlı sorgulayarak çözümü hızlandırmak için paralel sorguları kullan",
"bootstrap_dns": "DNS Önyükleme sunucuları",
"bootstrap_dns_desc": "DNS Önyükleme sunucuları, seçtiğiniz üst sunucuların DoH/DoT çözücülerine ait ip adreslerinin çözülmesi için kullanılır.",
"check_dhcp_servers": "DHCP sunucularını yokla",
"save_config": "Ayarları kaydet",
"enabled_dhcp": "DHCP sunucusu etkinleştirildi",
"disabled_dhcp": "DHCP sunucusu devre dışı bırakıldı",
"dhcp_title": "DHCP sunucusu (deneysel!)",
"dhcp_description": "Eğer router'ınız DHCP ayarlarını sunmuyorsa AdGuard'ın dahili DHCP sunucusunu kullanabilirsiniz.",
"dhcp_enable": "DHCP sunucusunu etkinleştir",
"dhcp_disable": "DHCP sunucusunu devre dışı bırak",
"dhcp_not_found": "Ağ üzerinde aktif bir DHCP sunucusu bulunamadı. Dahili DHCP sunucusunu etkinleştirebilirsiniz.",
"dhcp_found": "Ağ üzerinde bazı aktif DHCP sunucuları bulundu. Yerleşik DHCP sunucusunu aktif etmek sağlıklı olmayacaktır.",
"dhcp_leases": "DHCP kiralamaları",
"dhcp_static_leases": "Sabit DHCP kiralamaları",
"dhcp_leases_not_found": "DHCP kiralaması bulunamadı",
"form_error_required": "Gerekli alan",
"form_error_mac_format": "Geçersiz MAC biçimi",
"form_error_positive": "0'dan büyük olmalı",
"dhcp_form_gateway_input": "Ağ Geçidi IP'si",
"dhcp_form_subnet_input": "Alt Ağ Maskesi",
"dhcp_form_range_title": "IP adres aralığı",
"dhcp_form_range_start": "Aralık başlangıcı",
"dhcp_form_range_end": "Aralık sonu",
"dhcp_form_lease_title": "DHCP kira süresi (saniye olarak)",
"dhcp_form_lease_input": "Kira süresi",
"dhcp_interface_select": "DHCP arayüzünü seç",
"dhcp_hardware_address": "Donanım adresi",
"dhcp_ip_addresses": "IP adresleri",
"dhcp_table_hostname": "Bilgisayar Adı",
"dhcp_table_expires": "Geçerlilik Tarihi",
"dhcp_warning": "Dahili DHCP sunucusunu etkinleştirmek istiyorsanız başka aktif DHCP sunucusu olmadığından emin olun. Aksi takdirde cihazlar internete bağlanamayabilir.",
"dhcp_error": "Ağda başka bir DHCP sunucusu olup olmadığını belirleyemedik.",
"dhcp_static_ip_error": "DHCP sunucusunu kullanmak için statik bir IP adresi ayarlanmalıdır. Bu ağ arayüzünün statik IP adresi kullanılarak yapılandırılıp yapılandırılmadığını belirleyemedik. Lütfen statik bir IP adresini elle ayarlayın.",
"dhcp_dynamic_ip_found": "Sisteminiz <0>{{interfaceName}}</0> arayüzü için dinamik IP adresi yapılandırması kullanıyor. DHCP sunucusunu kullanmak için statik bir IP adresi ayarlanmalıdır. Geçerli IP adresiniz <0>{{ipAddress}}</0>. DHCP'yi etkinleştir düğmesine basarsanız bu IP adresini statik IP adresiniz olarak ayarlayacağız.",
"dhcp_lease_added": "Sabit kiralama \"{{key}}\" başarıyla eklendi",
"dhcp_lease_deleted": "Sabit kiralama \"{{key}}\" başarıyla silindi",
"dhcp_new_static_lease": "Yeni sabit kiralama",
"dhcp_static_leases_not_found": "Sabit DHCP kiralaması bulunamadı",
"dhcp_add_static_lease": "Sabit kiralama ekle",
"delete_confirm": "\"{{key}}\" silmek istediğinizden emin misiniz?",
"form_enter_hostname": "Cihaz ismi girin",
"error_details": "Hata detayları",
"back": "Geri",
"dashboard": "Pano",
"settings": "Ayarlar",
"filters": "Filtreler",
"query_log": "Sorgu Günlüğü",
"faq": "SSS",
"version": "Sürüm",
"address": "adres",
"on": "AÇIK",
"off": "KAPALI",
"copyright": "Tüm hakları saklıdır",
"homepage": "Anasayfa",
"report_an_issue": "Bir sorun bildir",
"privacy_policy": "Gizlilik sözleşmesi",
"enable_protection": "Korumayı etkinleştir",
"enabled_protection": "Koruma etkileştirildi",
"disable_protection": "Korumayı durdur",
"disabled_protection": "Koruma durduruldu",
"refresh_statics": "İstatistikleri yenile",
"dns_query": "DNS Sorguları",
"blocked_by": "Filtreler tarafından engellendi",
"stats_malware_phishing": "Zararlı yazılım/kimlik hırsızlığı engellendi",
"stats_adult": "Yetişkin içerikli site engellendi",
"stats_query_domain": "En fazla sorgulanan alan adları",
"for_last_24_hours": "son 24 saat içindekiler",
"for_last_days": "son {{value}} gün için",
"for_last_days_plural": "son {{count}} gün boyunca",
"no_domains_found": "Alan adı bulunamadı",
"requests_count": "İstek sayısı",
"top_blocked_domains": "En fazla engellenen alan adları",
"top_clients": "En aktif istemciler",
"no_clients_found": "İstemci bulunamadı",
"general_statistics": "Genel istatistikler",
"number_of_dns_query_days": "Son {{value}} 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_blocked_24_hours": "Reklam engelleme filtreleri ve hosts listeleri tarafından engellenmiş DNS isteklerinin sayısı",
"number_of_dns_query_blocked_24_hours_by_sec": "AdGuard gezinti koruması modülü tarafından engellenmiş DNS isteklerinin sayısı",
"number_of_dns_query_blocked_24_hours_adult": "Engellenmiş yetişkin içerikli web sitelerinin sayısı",
"enforced_save_search": "Etkin güvenli arama",
"number_of_dns_query_to_safe_search": "Güvenli Arama etkinleştirildiğinde arama motorlarına gönderilen DNS isteklerinin sayısı",
"average_processing_time": "Ortalama işlem süresi",
"average_processing_time_hint": "Bir DNS isteğinin mili saniye cinsinden ortalama işlem süresi",
"block_domain_use_filters_and_hosts": "Filtreleri ve hosts listelerini kullanarak alan adlarını engelle",
"filters_block_toggle_hint": "<a href='#filters'>Filtreler</a> sayfasından engelleme kurallarını ayarlayabilirsiniz.",
"use_adguard_browsing_sec": "AdGuard gezinti koruması web hizmetini kullan",
"use_adguard_browsing_sec_hint": "AdGuard Home, alan adının gezinti koruması web hizmetinde kara listede olup olmadığını kontrol edecek. Kontrol işlemi gizlilik dostu API kullanılarak yapılacak: yalnızca alan adının kısa bir ön eki SHA256 ile şifrelenip sunucuya gönderilecek.",
"use_adguard_parental": "AdGuard ebeveyn kontrolü web hizmetini kullan",
"use_adguard_parental_hint": "AdGuard Home, alan adının yetişkin içerik bulundurup bulundurmadığını kontrol edecek. Gezinti güvenliği web hizmeti ile kullandığımız aynı gizlilik dostu API'yi kullanıyoruz.",
"enforce_safe_search": "Güvenli aramayı zorunlu kıl",
"no_servers_specified": "Sunucu adresi girilmedi",
"general_settings": "Genel ayarlar",
"dns_settings": "DNS ayarları",
"encryption_settings": "Şifreleme ayarları",
"dhcp_settings": "DHCP ayarları",
"upstream_dns": "Üst DNS sunucusu",
"test_upstream_btn": "Üst sunucuyu test et",
"apply_btn": "Uygula",
"disabled_filtering_toast": "Filtreleme devre dışı",
"enabled_filtering_toast": "Filtreleme çalışıyor",
"disabled_safe_browsing_toast": "Güvenli gezinti devre dışı",
"enabled_safe_browsing_toast": "Güvenli gezinti çalışıyor",
"disabled_parental_toast": "Ebeveyn kontrolü devre dışı",
"enabled_parental_toast": "Ebeveyn kontrolü çalışıyor",
"disabled_safe_search_toast": "Güvenli arama devre dışı",
"enabled_save_search_toast": "Güvenli arama çalışıyor",
"enabled_table_header": "Etkin",
"name_table_header": "İsim",
"filter_url_table_header": "Filtre URL'si",
"rules_count_table_header": "Kural sayısı",
"last_time_updated_table_header": "Son güncelleme",
"actions_table_header": "Eylemler",
"edit_table_action": "Düzenle",
"delete_table_action": "Sil",
"filters_and_hosts": "Filtreler ve kullanıcının engelleme listeleri",
"filters_and_hosts_hint": "AdGuard Home temel reklam engelleme kurallarını ve hosts dosyalarının söz dizim kurallarını anlamaktadır.",
"no_filters_added": "Eklenmiş filtre yok",
"add_filter_btn": "Filtre ekle",
"cancel_btn": "İptal",
"enter_name_hint": "İsim girin",
"enter_url_hint": "URL'yi girin",
"check_updates_btn": "Güncellemeleri denetle",
"new_filter_btn": "Yeni Filtre Aboneliği",
"enter_valid_filter_url": "Filtre aboneliği veya bir hosts dosyası için geçerli bir URL girin.",
"custom_filter_rules": "İsteğe bağlı filtreleme kuralları",
"custom_filter_rules_hint": "Her satıra bir kural girin. Reklama engelleme kuralı veya hosts dosyası söz dizimi kullanabilirsiniz.",
"examples_title": "Örnekler",
"example_meaning_filter_block": "example.org alan adına ve tüm alt alan adlarına olan erişimi engeller",
"example_meaning_filter_whitelist": "example.org alan adına ve tüm alt alan adlarına olan erişim engelini kaldırır",
"example_meaning_host_block": "AdGuard Home bu example.org adresi için 127.0.0.1 adresine yönlendirme yapacaktır (alt alan adları için geçerli değildir)",
"example_comment": "! Buraya bir yorum ekledim",
"example_comment_meaning": "yorum eklemek",
"example_comment_hash": "# Bir yorum daha ekledim",
"example_upstream_regular": "normal DNS (UDP üzerinden)",
"example_upstream_dot": "<0>DNS-over-TLS</0> şifrelemesi",
"example_upstream_doh": "<0>DNS-over-HTTPS</0> şifrelemesi",
"example_upstream_sdns": "<1>DNSCrypt</1> veya <2>DNS-over-HTTPS</2> çözücüleri için <0>DNS Damgaları</0> kullanabilirsiniz.",
"example_upstream_tcp": "normal DNS (TCP üzerinden)",
"all_filters_up_to_date_toast": "Tüm filtreler güncel durumda",
"updated_upstream_dns_toast": "Üst DNS sunucuları güncellendi",
"dns_test_ok_toast": "Belirtilmiş DNS sunucuları düzgün çalışıyor",
"dns_test_not_ok_toast": "Sunucu \"{{key}}\": kullanılamıyor, lütfen doğru yazdığınızdan emin olun",
"unblock_btn": "Engeli kaldır",
"block_btn": "Engelle",
"time_table_header": "Saat",
"domain_name_table_header": "Alan adı",
"type_table_header": "Tür",
"response_table_header": "Yanıt",
"client_table_header": "İstemci",
"empty_response_status": "Boş",
"show_all_filter_type": "Tümünü göster",
"show_filtered_type": "Filtrelenmişleri göster",
"no_logs_found": "Günlük kaydı bulunamadı",
"refresh_btn": "Yenile",
"previous_btn": "Önceki",
"next_btn": "Sonraki",
"loading_table_status": "Yükleniyor...",
"page_table_footer_text": "Sayfa",
"of_table_footer_text": "/",
"rows_table_footer_text": "satır",
"updated_custom_filtering_toast": "İsteğe bağlı filtreleme kuralları güncellendi",
"rule_removed_from_custom_filtering_toast": "Kural isteğe bağlı filtreleme kurallarından kaldırıldı",
"rule_added_to_custom_filtering_toast": "Kural isteğe bağlı filtreleme kurallarına eklendi",
"query_log_response_status": "Durum: {{value}}",
"query_log_filtered": "{{filter}} tarafından filtrelendi",
"source_label": "Kaynak",
"found_in_known_domain_db": "Bilinen alan adları veri tabanı içinde bulundu",
"category_label": "Kategori",
"rule_label": "Kural",
"filter_label": "Filtre",
"unknown_filter": "Bilinmeyen filtre {{filterId}}",
"install_welcome_title": "AdGuard Home'a hoşgeldiniz!",
"install_welcome_desc": "AdGuard Home, ağ genelinde reklam ve izleyicileri engelleyen bir DNS sunucusudur. Tüm ağınızı ve tüm cihazlarınızı kontrol etmenize yarayan bir araçtır, istemci tarafında bir program kullanmanıza gerek duymaz.",
"install_settings_title": "Yönetici Web Arayüzü",
"install_settings_listen": "Dinleme arayüzü",
"install_settings_port": "Port",
"install_settings_interface_link": "AdGuard Home yönetici web arayüzü sayfanız şu adresten erişilebilir olacaktır:",
"form_error_port": "Geçerli bir port değeri girin",
"install_settings_dns": "DNS sunucusu",
"install_settings_dns_desc": "Cihazlarınızı veya yönlendiricinizi şu adresteki DNS sunucusunu kullanması için ayarlamanız gerekecek:",
"install_settings_all_interfaces": "Tüm arayüzler",
"install_auth_title": "Kimlik Doğrulama",
"install_auth_username": "Kullanıcı adı",
"install_auth_password": "Şifre",
"install_auth_confirm": "Şifreyi onayla",
"install_auth_username_enter": "Kullanıcı adı girin",
"install_auth_password_enter": "Şifre girin",
"install_step": "Adım",
"install_devices_title": "Cihazlarınızı ayarlayın",
"install_devices_desc": "AdGuard Home'un çalışması için cihazlarınızı onu kullanacak şekilde ayarlamalısınız.",
"install_submit_title": "Tebrikler!",
"install_submit_desc": "Kurulum işlemi tamamlandı ve artık AdGuard Home'u kullanmak için hazırsınız.",
"install_devices_router": "Yönlendirici",
"install_devices_router_desc": "Bu kurulum evdeki yönlendiricinize bağlı tüm cihazlarınızı otomatik olarak kapsar ve her birini elle ayarlamanız gerekmez.",
"install_devices_address": "AdGuard Home DNS sunucusu şu adresi dinleyecektir",
"install_devices_router_list_1": "Yönlendiricinizin ayarlarına girin. Genelde internet tarayıcınızdan bir URL vasıtasıyla erişebilirsiniz (http://192.168.0.1/ veya http://192.168.1.1/ gibi). Sizden şifre girmenizi isteyebilir. Hatırlamıyorsanız yönlendiricinizin arkasındaki 'reset' tuşuna basılı tutup fabrika ayarlarına sıfırlayabilirsiniz. Bazı yönlendiriciler belirli uygulamalarla çalışır, bu durumda bilgisayarınıza/telefonunuza kurulması gerekir.",
"install_devices_router_list_2": "DHCP/DNS ayarlarını bulun. DNS satırlarını arayın, genelde iki veya üç tanedir, üç rakam girilebilen dört ayrı grup içeren satırdır.",
"install_devices_router_list_3": "AdGuard Home sunucusunun adresini o kısma yazın.",
"install_devices_windows_list_1": "Başlat menüsünden veya Windows aramasıyla Denetim Masası'na girin.",
"install_devices_windows_list_2": "Ağ ve Internet kategorisine girin, sonra Ağ ve Paylaşım Merkezi'ne girin.",
"install_devices_windows_list_3": "Sol taraftaki Bağdaştırıcı ayarlarını değiştir ayarını bulun ve ona tıklayın.",
"install_devices_windows_list_4": "Aktif bağlantınızı seçin, sağ tıklayın ve Özellikler'e tıklayın.",
"install_devices_windows_list_5": "Listeden İnternet Protokolü Sürüm 4 (TCP/IP)'ye tıklayın ve Özellikler'e tıklayın.",
"install_devices_windows_list_6": "Aşağıdaki DNS sunucu adreslerini kullanın'ı seçin ve Tercih edilen DNS sunucusu alanına AdGuard Home sunucusunun adreslerini girin.",
"install_devices_macos_list_1": "Apple simgesine tıklayın ve Sistem Tercihleri'ne tıklayın.",
"install_devices_macos_list_2": "Ağ seçeneğine tıklayın.",
"install_devices_macos_list_3": "Listenizdeki ilk bağlantıyı seçin ve Gelişmiş'e tıklayın.",
"install_devices_macos_list_4": "DNS sekmesine tıklayın ve AdGuard Home sunucunuzun adreslerini girin.",
"install_devices_android_list_1": "Android cihazınızda Ayarlar simgesine dokunun.",
"install_devices_android_list_2": "Wi-Fi menüsüne dokunun. Mevcut tüm ağlar listelenecektir (mobil bağlantı için isteğe bağlı DNS sunucusu ayarlanamaz).",
"install_devices_android_list_3": "Bağlandığınız ağa basılı tutup \"Ağı Değiştir\"e dokunun.",
"install_devices_android_list_4": "Bazı cihazlarda diğer ayarları görmek için Gelişmiş kutucuğuna dokunmanız gerekebilir. Android cihazınızın DNS ayarlarını değiştirmek için IP ayarlarını DHCP yerine Statik olarak değiştirmeniz gerekebilir.",
"install_devices_android_list_5": "DNS 1 ve DNS 2 değerlerini AdGuard Home sunucusunun ip adresleri ile değiştirin.",
"install_devices_ios_list_1": "Ana ekrandaki Ayarlar simgesine dokunun.",
"install_devices_ios_list_2": "Sol menüdeki Wi-Fi bölümüne girin (mobil bağlantı için isteğe bağlı DNS sunucusu ayarlanamaz).",
"install_devices_ios_list_3": "Bağlı olduğunuz ağın ismine dokunun.",
"install_devices_ios_list_4": "DNS alanına AdGuard Home sunucunuzun adreslerini girin.",
"get_started": "Başlarken",
"next": "İleri",
"open_dashboard": "Panoyu Aç",
"install_saved": "Başarıyla kaydedildi",
"encryption_title": "Şifreleme",
"encryption_desc": "Hem DNS ve hem de yönetici web arayüzü için şifreleme (HTTPS/TLS) desteği",
"encryption_config_saved": "Şifreleme ayarı kaydedildi",
"encryption_server": "Sunucu adı",
"encryption_server_enter": "Alan adınızı girin",
"encryption_server_desc": "HTTPS kullanmak için SSL sertifikanızla eşleşen sunucu adını girmeniz gerekir",
"encryption_redirect": "Otomatik olarak HTTPS'e yönlendir",
"encryption_redirect_desc": "Etkinleştirirseniz AdGuard Home sizi HTTP yerine HTTPS adreslerine yönlendirir.",
"encryption_https": "HTTPS bağlantı noktası",
"encryption_https_desc": "Eğer HTTPS portu yapılandırılmışsa, AdGuard Home yönetici arayüzü HTTPS ile ulaşılabilir olacak, ayrıca '/dns-query' üzerinden DNS-over-HTTPS hizmeti de çalışacak.",
"encryption_dot": "DNS-over-TLS portu",
"encryption_dot_desc": "Eğer bu portu yapılandırırsanız AdGuard Home bu port üzerinden DNS-over-TLS sunucusu çalıştıracak.",
"encryption_certificates": "Sertifikalar",
"encryption_certificates_desc": "Şifrelemeyi kullanmak için alan adınız için geçerli bir SSL sertifika zinciri temin etmeniz gerekir. <0>{{link}}</0> adresinden ücretsiz temin edebilirsiniz veya güvenilir Sertifika Otoritelerinden satın alabilirsiniz.",
"encryption_certificates_input": "PEM formatındaki sertifikalarınızı buraya yapıştırın.",
"encryption_status": "Durum",
"encryption_expire": "Bitiş tarihi",
"encryption_key": "Özel anahtar",
"encryption_key_input": "Sertifikanızın PEM formatı özel anahtarını buraya yapıştırın.",
"encryption_enable": "Şifrelemeyi etkinleştir (HTTPS, DNS-over-HTTPS ve DNS-over-TLS)",
"encryption_enable_desc": "Şifrelemeyi etkinleştirirseniz AdGuard Home yönetici arayüzü HTTPS ile çalışacak, ayrıca DNS sunucusu DNS-over-HTTPS ve DNS-over-TLS üzerinden gelen istekleri dinleyecektir.",
"encryption_chain_valid": "Sertifika zinciri geçerli",
"encryption_chain_invalid": "Sertifika zinciri geçersiz",
"encryption_key_valid": "Bu geçerli bir {{type}} özel anahtar",
"encryption_key_invalid": "Bu geçersiz bir {{type}} özel anahtar",
"encryption_subject": "Konu",
"encryption_issuer": "Sertifikayı veren",
"encryption_hostnames": "Ana bilgisayar isimleri",
"encryption_reset": "Şifreleme ayarlarını sıfırlamak istediğinize emin misiniz?",
"topline_expiring_certificate": "SSL sertifikanızın süresi dolmak üzere. <0>Şifreleme ayarlarını</0> güncelleyin.",
"topline_expired_certificate": "SSL sertifikanızın süresi dolmuş. <0>Şifreleme ayarlarını</0> güncelleyin.",
"form_error_port_range": "80-65535 aralığında geçerli bir port değeri girin.",
"form_error_port_unsafe": "Bu güvenli olmayan bir port",
"form_error_equal": "Aynı olmamalı",
"form_error_password": "Şifreler uyuşmuyor",
"reset_settings": "Ayarları sıfırla",
"update_announcement": "AdGuard Home {{version}} şu an yüklenmeye hazır! Daha fazla bilgi için <0>buraya tıklayın.</0>",
"setup_guide": "Kurulum rehberi",
"dns_addresses": "DNS adresleri",
"down": "kapalı",
"fix": "Düzelt",
"dns_providers": "Aralarından seçim yapabileceğiniz bilinen <0>DNS sağlayıcıların listesi</0>.",
"update_now": "Şimdi güncelleyin",
"update_failed": "Otomatik güncelleme başarısız oldu. Lütfen elle güncellemek için <a href='https://github.com/AdguardTeam/AdGuardHome/wiki/Getting-Started#update'>talimatları uygulayın.</a>",
"processing_update": "Lütfen bekleyin. AdGuard Home güncelleniyor",
"clients_title": "İstemciler",
"clients_desc": "AdGuard Home'a bağlı cihazları yapılandırın",
"settings_global": "Genel",
"settings_custom": "Özel",
"table_client": "İstemci",
"table_name": "İsim",
"save_btn": "Kaydet",
"client_add": "İstemci ekle",
"client_new": "Yeni İstemci",
"client_edit": "İstemciyi düzenle",
"client_identifier": "Tanımlayıcı",
"ip_address": "IP adresi",
"form_enter_ip": "IP Girin",
"form_enter_mac": "MAC Girin",
"form_client_name": "İstemci ismi girin",
"client_global_settings": "Genel ayarları kullan",
"client_deleted": "\"{{key}}\" istemcisi başarıyla silindi",
"client_added": "\"{{key}}\" istemcisi başarıyla eklendi",
"client_updated": "\"{{key}}\" istemcisi başarıyla güncellendi",
"clients_not_found": "İstemci bulunamadı",
"client_confirm_delete": "\"{{key}}\" istemcisini silmek istediğinizden emin misiniz?",
"filter_confirm_delete": "Filtreyi silmek istediğinizden emin misiniz?",
"auto_clients_title": "İstemciler (çalışma zamanı)",
"auto_clients_desc": "AdGuard Home'u kullanan, ancak yapılandırmada saklanmayan istemcilerdeki veriler",
"access_title": "Erişim ayarları",
"access_desc": "Burada, AdGuard Home DNS sunucusu için erişim kurallarını yapılandırabilirsiniz.",
"access_allowed_title": "İzin verilen istemciler",
"access_allowed_desc": "CIDR veya IP adreslerinin listesi. Yapılandırılırsa, AdGuard Home yalnızca bu IP adreslerinden gelen istekleri kabul edecektir.",
"access_disallowed_title": "İzin verilmeyen istemciler",
"access_disallowed_desc": "CIDR veya IP adreslerinin listesi. Yapılandırılırsa, AdGuard Home yalnızca bu IP adreslerinden gelen istekleri cevapsız bırakacaktır.",
"access_blocked_title": "Engellenmiş alan adları",
"access_blocked_desc": "Bunu filtrelerle karıştırmayın. AdGuard Home, bu alan adları için gelen DNS sorgularını cevapsız bırakacaktır.",
"access_settings_saved": "Erişim ayarları başarıyla kaydedildi!",
"updates_checked": "Güncelleme kontrolü başarılı",
"updates_version_equal": "AdGuard Home yazılımı günceldir",
"check_updates_now": "Güncellemeleri şimdi denetle",
"dns_privacy": "DNS Gizliliği",
"setup_dns_privacy_1": "<0>DNS-over-TLS:</0> Kullanımı <1>{{address}}</1> string.",
"setup_dns_privacy_2": "<0>DNS-over-HTTPS:</0> Kullanımı <1>{{address}}</1> string.",
"setup_dns_privacy_3": "<0>Lütfen şifrelenmiş DNS protokollerinin yalnızca Android 9'da desteklendiğini unutmayın. Bu yüzden diğer işletim sistemleri için ek yazılım yüklemeniz gerekir..</0><0>İşte kullanabileceğiniz yazılımların bir listesi.</0>",
"setup_dns_privacy_android_1": "Android 9 aslen DNS-over-TLS desteklemektedir. Yapılandırmak için, Ayarlar → Ağ ve internet → Gelişmiş → Özel DNS seçeneğine gidin ve alan adınızı buraya girin.",
"setup_dns_privacy_android_2": "<0>AdGuard for Android</0>, <1>DNS-over-HTTPS</1> ve <1>DNS-over-TLS</1> desteklemektedir.",
"setup_dns_privacy_android_3": "<0>Intra</0> Android'e <1>DNS-over-HTTPS</1> desteğini ekler.",
"setup_dns_privacy_ios_1": "<0>DNSCloak</0>, <1>DNS-over-HTTPS</1> destekler, ancak kendi sunucunuzu kullanacak şekilde yapılandırmak için bir <2>DNS Damgası</2> oluşturmanız gerekir.",
"setup_dns_privacy_ios_2": "<0>AdGuard for iOS</0>, <1>DNS-over-HTTPS</1> ve <1>DNS-over-TLS</1> destekler.",
"setup_dns_privacy_other_title": "Diğer uygulamalar",
"setup_dns_privacy_other_1": "AdGuard Home'un kendisi herhangi bir platformda güvenli bir DNS istemcisi olabilir.",
"setup_dns_privacy_other_2": "<0>dnsproxy</0>, bilinen tüm güvenli DNS protokollerini destekler.",
"setup_dns_privacy_other_3": "<0>dnscrypt-proxy</0>, <1>DNS-over-HTTPS</1> destekler.",
"setup_dns_privacy_other_4": "<0>Mozilla Firefox</0>, <1>DNS-over-HTTPS</1> desteklemektedir.",
"setup_dns_privacy_other_5": "<0>Burada</0> ve <1>burada</1> daha fazla uygulama bulacaksınız.",
"setup_dns_notice": "<1>DNS-over-HTTPS</1> veya <1>DNS-over-TLS</1> kullanmak için, AdGuard Home ayarlarında <0>Şifreleme yapılandırmasını</0> yapmanız gerekir.",
"rewrite_added": "\"{{key}}\" için DNS yeniden yazımı başarıyla eklendi",
"rewrite_deleted": "\"{{key}}\" için DNS yeniden yazımı başarıyla silindi",
"rewrite_add": "DNS yeniden yazımı ekle",
"rewrite_not_found": "DNS yeniden yazımı bulunamadı",
"rewrite_confirm_delete": "\"{{key}}\" için DNS yeniden yazımını silmek istediğinize emin misiniz?",
"rewrite_desc": "Belirli bir alan adı için kolayca özel DNS yanıtı yapılandırmanıza olanak tanır.",
"rewrite_applied": "Uygulanan Yeniden Yazım kuralı",
"dns_rewrites": "DNS yeniden yazımları",
"form_domain": "Alan adı girin",
"form_answer": "IP adresini veya alan adı girin",
"form_error_domain_format": "Geçersiz alan adı formatı",
"form_error_answer_format": "Geçersiz cevap formatı",
"configure": "Yapılandır",
"main_settings": "Ana ayarlar",
"block_services": "Belirli hizmetleri engelle",
"blocked_services": "Engellenen hizmetler",
"blocked_services_desc": "Popüler siteleri ve hizmetleri hızlı bir şekilde engellemenizi sağlar.",
"blocked_services_saved": "Engellenen servisler başarıyla kaydedildi",
"blocked_services_global": "Genel engellenen hizmetleri kullanın",
"blocked_service": "Engellenen hizmet",
"block_all": "Hepsini engelle",
"unblock_all": "Tüm engellemeyi kaldır",
"encryption_certificate_path": "Sertifika yolu",
"encryption_private_key_path": "Özel anahtar yolu",
"encryption_certificates_source_path": "Sertifika dosyalarının yolunu belirleyin",
"encryption_certificates_source_content": "Sertifikaların içeriklerini yapıştırın",
"encryption_key_source_path": "Özel bir anahtar dosyası belirleyin",
"encryption_key_source_content": "Özel anahtar içeriklerini yapıştırın",
"stats_params": "İstatistik yapılandırması",
"config_successfully_saved": "Yapılandırma başarıyla kaydedildi",
"interval_24_hour": "24 saat",
"interval_days": "{{value}} gün",
"interval_days_plural": "{{count}} gün",
"domain": "Alan adı",
"answer": "Cevap",
"filter_added_successfully": "Filtre başarıyla eklendi",
"statistics_retention": "İstatistikleri depolama",
"statistics_retention_desc": "Zaman değerini azaltırsanız bazı veriler kaybolacaktır",
"statistics_clear": " İstatistikleri temizle",
"statistics_clear_confirm": "İstatistikleri temizlemeyi istediğinizden emin misiniz?",
"statistics_cleared": "İstatistikler başarıyla temizlendi"
}

View File

@@ -31,7 +31,6 @@
"disabled_protection": "Đã tắt bảo vệ",
"refresh_statics": "Làm mới thống kê",
"dns_query": "Truy vấn DNS",
"blocked_by": "Chặn bởi bộ lọc",
"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",
@@ -42,7 +41,6 @@
"top_clients": "Client dùng nhiều",
"no_clients_found": "Không có client nào",
"general_statistics": "Thống kê chung",
"number_of_dns_query_24_hours": "Số yêu cầu DNS đã xử lý trong 24 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ố website người lớn đã chặn",
@@ -57,12 +55,9 @@
"use_adguard_parental": "Sử dụng dịch vụ quản lý của phụ huynh AdGuard",
"use_adguard_parental_hint": "AdGuard Home sẽ kiểm tra nếu tên miền chứa từ khoá người lớn. Tính năng sử dụng API thân thiện với quyền riêng tư tương tự với dịch vụ bảo vệ duyệt web",
"enforce_safe_search": "Bắt buộc tìm kiếm an toàn",
"enforce_save_search_hint": "AdGuard Home có thể bắt buộc tìm kiếm an toàn với các dịch vụ tìm kiếm: Google, Youtube, Bing, Yandex.",
"no_servers_specified": "Không có máy chủ nào được liệt kê",
"no_settings": "Không có cài đặt nào",
"general_settings": "Cài đặt chung",
"upstream_dns": "Máy chủ DNS tìm kiếm",
"upstream_dns_hint": "Nếu bạn để trống mục này, AdGuard Home sẽ sử dụng <a href='https://1.1.1.1/' target='_blank'>Cloudflare DNS</a> để tìm kiếm. Sử dụng tiền tố tls:// cho các máy chủ DNS dựa trên TLS.",
"test_upstream_btn": "Kiểm tra",
"apply_btn": "Áp dụng",
"disabled_filtering_toast": "Đã tắt chặn quảng cáo",
@@ -119,11 +114,7 @@
"show_all_filter_type": "Hiện tất cả",
"show_filtered_type": "Chỉ hiện đã lọc",
"no_logs_found": "Không có lịch sử truy vấn",
"disabled_log_btn": "Tắt lịch sử truy vấn",
"download_log_file_btn": "Tải tập tin lịch sử truy vấn",
"refresh_btn": "Làm mới",
"enabled_log_btn": "Bật lịch sử truy vấn",
"last_dns_queries": "5000 truy vấn DNS gần nhất",
"previous_btn": "Trang trước",
"next_btn": "Trang sau",
"loading_table_status": "Đang tải...",
@@ -133,8 +124,6 @@
"updated_custom_filtering_toast": "Đã cập nhật quy tắc lọc tuỳ chỉnh",
"rule_removed_from_custom_filtering_toast": "Quy tắc đã được xoá khỏi quy tắc lọc tuỳ chỉnh",
"rule_added_to_custom_filtering_toast": "Quy tắc đã được thêm vào quy tắc lọc tuỳ chỉnh",
"query_log_disabled_toast": "Đã tắt lịch sử truy vấn",
"query_log_enabled_toast": "Đã bật lịch sử truy vấn",
"source_label": "Nguồn",
"found_in_known_domain_db": "Tìm thấy trong cơ sở dữ liệu tên miền",
"category_label": "Thể loại",

View File

@@ -4,7 +4,6 @@
"upstream_parallel": "通过同时查询所有上流服务器以使用并行查询加速解析",
"bootstrap_dns": "Bootstrap DNS 服务器",
"bootstrap_dns_desc": "Bootstrap DNS 服务器用于解析您指定为上游的 DoH / DoT 解析器的 IP 地址。",
"url_added_successfully": "网址添加成功",
"check_dhcp_servers": "检查 DHCP 服务器",
"save_config": "保存配置",
"enabled_dhcp": "DHCP 服务器已启用",
@@ -18,9 +17,7 @@
"dhcp_leases": "DHCP 租约",
"dhcp_static_leases": "DHCP 静态租约",
"dhcp_leases_not_found": "未检测到 DHCP 租约",
"dhcp_config_saved": "保存 DHCP 服务器配置",
"form_error_required": "必填字段",
"form_error_ip_format": "无效的 IPv4 格式",
"form_error_mac_format": "无效的 MAC 格式",
"form_error_positive": "必须大于 0",
"dhcp_form_gateway_input": "网关 IP",
@@ -67,7 +64,6 @@
"disabled_protection": "保护已禁用",
"refresh_statics": "刷新状态",
"dns_query": "DNS查询",
"blocked_by": "已被过滤器拦截",
"stats_malware_phishing": "被拦截的恶意/钓鱼网站",
"stats_adult": "被拦截的成人网站",
"stats_query_domain": "请求域名排行",
@@ -78,7 +74,6 @@
"top_clients": "客户端排行",
"no_clients_found": "未找到客户端",
"general_statistics": "概况统计",
"number_of_dns_query_24_hours": "过去 24 小时内处理的 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": "被拦截的成人网站总数",
@@ -93,15 +88,12 @@
"use_adguard_parental": "使用 AdGuard 【家长控制】服务",
"use_adguard_parental_hint": "AdGuard Home 将使用与浏览安全服务相同的隐私性强的 API 来检查域名指向的网站是否包含成人内容。",
"enforce_safe_search": "强制安全搜索",
"enforce_save_search_hint": "AdGuard Home 将对以下搜索引擎强制启用安全搜索Google、YouTube、Bing 和 Yandex。",
"no_servers_specified": "未找到指定的服务器",
"no_settings": "未找到设置",
"general_settings": "常规设置",
"dns_settings": "DNS 设置",
"encryption_settings": "加密设置",
"dhcp_settings": "DHCP 设置",
"upstream_dns": "上游 DNS 服务器",
"upstream_dns_hint": "如果此处留空AdGuard Home 将会使用 <a href='https://1.1.1.1/' target='_blank'>Cloudflare DNS</a> 作为上游 DNS。如果想要使用使用 DNS over TLS请以 tls:// 为开头。",
"test_upstream_btn": "测试上游 DNS",
"apply_btn": "应用",
"disabled_filtering_toast": "过滤器已禁用",
@@ -159,11 +151,7 @@
"show_all_filter_type": "显示所有",
"show_filtered_type": "显示被拦截的",
"no_logs_found": "未找到日志",
"disabled_log_btn": "禁用日志",
"download_log_file_btn": "下载日志文件",
"refresh_btn": "刷新",
"enabled_log_btn": "启用日志",
"last_dns_queries": "最近的 5000 个 DNS 请求",
"previous_btn": "上一页",
"next_btn": "下一页",
"loading_table_status": "加载中……",
@@ -173,8 +161,6 @@
"updated_custom_filtering_toast": "自定义过滤规则已更新",
"rule_removed_from_custom_filtering_toast": "规则已从自定义过滤规则列表中移除",
"rule_added_to_custom_filtering_toast": "规则已添加到自定义过滤规则列表中",
"query_log_disabled_toast": "查询日志已禁用",
"query_log_enabled_toast": "查询日志已启用",
"source_label": "源",
"found_in_known_domain_db": "成功在已知域名数据库中查询到",
"category_label": "类别",
@@ -192,7 +178,6 @@
"install_settings_dns_desc": "您将需要使用以下地址来设置您的设备或路由器的 DNS 服务器:",
"install_settings_all_interfaces": "所有接口",
"install_auth_title": "身份认证",
"install_auth_desc": "我们强烈建议您为 AdGuard Home 的网页管理界面配置密码。尽管该页面只能通过您的本地网络访问,但避免它被不加限制地访问仍十分重要。",
"install_auth_username": "用户名",
"install_auth_password": "密码",
"install_auth_confirm": "确认密码",
@@ -289,7 +274,6 @@
"client_edit": "编辑客户端",
"client_identifier": "标识符",
"ip_address": "IP 地址",
"client_identifier_desc": "客户端可通过 IP 地址或 MAC 地址识别。请注意,如 AdGuard Home 也是 <0>DHCP 服务器</0>,则仅能将 MAC 用作标识符",
"form_enter_ip": "输入 IP",
"form_enter_mac": "输入 MAC",
"form_client_name": "输入客户端名称",
@@ -297,7 +281,6 @@
"client_deleted": "客户端 \"{{key}}\" 删除成功",
"client_added": "客户端 \"{{key}}\" 添加成功",
"client_updated": "客户端 \"{{key}}\" 更新成功",
"table_statistics": "请求次数(最后 24 小时)",
"clients_not_found": "未找到客户端",
"client_confirm_delete": "您确定要删除客户端 \"{{key}}\"",
"filter_confirm_delete": "您确定是要删除过滤器?",

View File

@@ -4,7 +4,6 @@
"upstream_parallel": "透過同時地查詢所有上游的伺服器,使用並行的查詢以加速解析",
"bootstrap_dns": "自我啟動BootstrapDNS 伺服器",
"bootstrap_dns_desc": "自我啟動BootstrapDNS 伺服器被用於解析您明確指定作為上游的 DoH/DoT 解析器之 IP 位址。",
"url_added_successfully": "網址被成功地加入",
"check_dhcp_servers": "檢查動態主機設定協定DHCP伺服器",
"save_config": "儲存配置",
"enabled_dhcp": "動態主機設定協定DHCP伺服器被啟用",
@@ -18,9 +17,11 @@
"dhcp_leases": "動態主機設定協定DHCP租賃",
"dhcp_static_leases": "動態主機設定協定DHCP靜態租賃",
"dhcp_leases_not_found": "無已發現之動態主機設定協定DHCP租賃",
"dhcp_config_saved": "已儲存動態主機設定協定DHCP伺服器配置",
"dhcp_config_saved": "動態主機設定協定DHCP配置被成功地儲存",
"form_error_required": "必填的欄位",
"form_error_ip_format": "無效的 IPv4 格式",
"form_error_ip4_format": "無效的 IPv4 格式",
"form_error_ip6_format": "無效的 IPv6 格式",
"form_error_ip_format": "無效的 IP 格式",
"form_error_mac_format": "無效的媒體存取控制MAC格式",
"form_error_positive": "必須大於 0",
"dhcp_form_gateway_input": "閘道 IP",
@@ -44,6 +45,7 @@
"dhcp_new_static_lease": "新的靜態租賃",
"dhcp_static_leases_not_found": "無已發現之動態主機設定協定DHCP靜態租賃",
"dhcp_add_static_lease": "增加靜態租賃",
"dhcp_reset": "您確定您想要重置動態主機設定協定DHCP配置嗎",
"delete_confirm": "您確定您想要刪除 \"{{key}}\" 嗎?",
"form_enter_hostname": "輸入主機名稱",
"error_details": "錯誤細節",
@@ -67,17 +69,21 @@
"disabled_protection": "已禁用防護",
"refresh_statics": "重新整理統計資料",
"dns_query": "DNS 查詢",
"blocked_by": "被過濾器封鎖",
"blocked_by": "<0>被過濾器封鎖</0>",
"stats_malware_phishing": "已封鎖的惡意軟體/網路釣魚",
"stats_adult": "已封鎖的成人網站",
"stats_query_domain": "熱門已查詢的網域",
"for_last_24_hours": "在最近的 24 小時內",
"for_last_days": "在最近的 {{count}} 日內",
"for_last_days_plural": "在最近的 {{count}} 日內",
"no_domains_found": "無已發現之網域",
"requests_count": "請求總數",
"top_blocked_domains": "熱門已封鎖的網域",
"top_clients": "熱門用戶端",
"no_clients_found": "無已發現之用戶端",
"general_statistics": "一般的統計資料",
"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_blocked_24_hours": "被廣告封鎖過濾器和主機封鎖清單封鎖的 DNS 請求之數量",
"number_of_dns_query_blocked_24_hours_by_sec": "被 AdGuard 瀏覽安全模組封鎖的 DNS 請求之數量",
@@ -93,16 +99,16 @@
"use_adguard_parental": "使用 AdGuard 家長監控之網路服務",
"use_adguard_parental_hint": "AdGuard Home 將檢查網域是否包含成人資料。它使用如同瀏覽安全網路服務一樣之友好的隱私應用程式介面API。",
"enforce_safe_search": "強制執行安全搜尋",
"enforce_save_search_hint": "AdGuard Home 可在下列的搜尋引擎Google、YouTube、Bing、DuckDuckGoYandex 中強制執行安全搜尋。",
"enforce_save_search_hint": "AdGuard Home 可在下列的搜尋引擎Google、YouTube、Bing、DuckDuckGoYandex 和 Pixabay 中強制執行安全搜尋。",
"no_servers_specified": "無已明確指定的伺服器",
"no_settings": "無設定",
"general_settings": "一般的設定",
"dns_settings": "DNS 設定",
"encryption_settings": "加密設定",
"dhcp_settings": "動態主機設定協定DHCP設定",
"upstream_dns": "上游的 DNS 伺服器",
"upstream_dns_hint": "如果您將該欄位留空AdGuard Home 將使用 <a href='https://1.1.1.1/' target='_blank'>Cloudflare DNS</a> 作為上游。",
"upstream_dns_hint": "如果您將該欄位留空AdGuard Home 將使用 <a href='https://www.quad9.net/' target='_blank'>Quad9</a> 作為上游。",
"test_upstream_btn": "測試上行資料流",
"upstreams": "上游",
"apply_btn": "套用",
"disabled_filtering_toast": "已禁用過濾",
"enabled_filtering_toast": "已啟用過濾",
@@ -112,12 +118,12 @@
"enabled_parental_toast": "已啟用家長監控",
"disabled_safe_search_toast": "已禁用安全搜尋",
"enabled_save_search_toast": "已啟用安全搜尋",
"enabled_table_header": "已啟用",
"enabled_table_header": "已啟用",
"name_table_header": "名稱",
"filter_url_table_header": "過濾器網址",
"rules_count_table_header": "規則總數",
"last_time_updated_table_header": "最近的更新時間",
"actions_table_header": "動",
"actions_table_header": "動",
"edit_table_action": "編輯",
"delete_table_action": "刪除",
"filters_and_hosts": "過濾器和主機封鎖清單",
@@ -139,7 +145,7 @@
"example_comment": "! 看,一個註解",
"example_comment_meaning": "只是一個註解",
"example_comment_hash": "# 也是一個註解",
"example_regex_meaning": "封鎖至與<0>已明確指定的規則運算式</0>Regular Expression相符的網域之存取",
"example_regex_meaning": "封鎖至與已明確指定的規則運算式Regular Expression相符的網域之存取",
"example_upstream_regular": "一般的 DNS透過 UDP",
"example_upstream_dot": "加密的 <0>DNS-over-TLS</0>",
"example_upstream_doh": "加密的 <0>DNS-over-HTTPS</0>",
@@ -160,11 +166,7 @@
"show_all_filter_type": "顯示全部",
"show_filtered_type": "顯示已過濾的",
"no_logs_found": "無已發現之記錄",
"disabled_log_btn": "禁用記錄",
"download_log_file_btn": "下載記錄檔案",
"refresh_btn": "重新整理",
"enabled_log_btn": "啟用記錄",
"last_dns_queries": "最近的 5000 筆 DNS 查詢",
"previous_btn": "上一頁",
"next_btn": "下一頁",
"loading_table_status": "正在載入…",
@@ -174,8 +176,17 @@
"updated_custom_filtering_toast": "已更新自訂的過濾規則",
"rule_removed_from_custom_filtering_toast": "規則從自訂的過濾規則中被移除",
"rule_added_to_custom_filtering_toast": "規則被加至自訂的過濾規則中",
"query_log_disabled_toast": "查詢記錄被禁用",
"query_log_enabled_toast": "查詢記錄被啟用",
"query_log_response_status": "狀態:{{value}}",
"query_log_filtered": "被 {{filter}} 過濾",
"query_log_confirm_clear": "您確定您想要清除整個查詢記錄嗎?",
"query_log_cleared": "該查詢記錄已被成功地清除",
"query_log_clear": "清除查詢記錄",
"query_log_retention": "查詢記錄保留",
"query_log_enable": "啟用記錄",
"query_log_configuration": "記錄配置",
"query_log_disabled": "查詢記錄被禁用並可在<0>設定</0>中被配置",
"query_log_strict_search": "使用雙引號於嚴謹的搜尋",
"query_log_retention_confirm": "您確定您想要更改查詢記錄保留嗎?如果您減少該間隔值,某些資料將被丟失",
"source_label": "來源",
"found_in_known_domain_db": "在已知的域名資料庫中被發現。",
"category_label": "類別",
@@ -183,7 +194,7 @@
"filter_label": "過濾器",
"unknown_filter": "未知的過濾器 {{filterId}}",
"install_welcome_title": "歡迎至 AdGuard Home",
"install_welcome_desc": "AdGuard Home 是全網路範圍廣告和追蹤器封鎖的 DNS 伺服器。它的目的為讓您控制您整個網路和所有您的裝置,且不需要使用用戶端程式。",
"install_welcome_desc": "AdGuard Home 是全網路範圍廣告和追蹤器封鎖的 DNS 伺服器。它的目的為讓您控制您整個網路和所有您的裝置,且不需要使用用戶端程式。",
"install_settings_title": "管理員網路介面",
"install_settings_listen": "監聽介面",
"install_settings_port": "連接埠",
@@ -193,7 +204,7 @@
"install_settings_dns_desc": "您將需要配置您的裝置或路由器以使用於下列的位址上之 DNS 伺服器:",
"install_settings_all_interfaces": "所有的介面",
"install_auth_title": "驗證",
"install_auth_desc": "被非常建議配置屬於您的 AdGuard Home 管理員網路介面之密碼驗證。即使它僅在您的區域網路中為可存取的,讓它受保護免於不受限制的存取為仍然重要的。",
"install_auth_desc": "配置屬於您的 AdGuard Home 管理員網路介面之密碼驗證是被非常建議的。即使它僅在您的區域網路中為可存取的,保護免於不受限制的存取為仍然重要的。",
"install_auth_username": "使用者名稱",
"install_auth_password": "密碼",
"install_auth_confirm": "確認密碼",
@@ -232,7 +243,7 @@
"get_started": "開始吧",
"next": "下一頁",
"open_dashboard": "開啟儀表板",
"install_saved": "成功地儲存",
"install_saved": "成功地儲存",
"encryption_title": "加密",
"encryption_desc": "供 DNS 和管理員網路介面兩者之加密HTTPS/TLS支援",
"encryption_config_saved": "加密配置被儲存",
@@ -270,8 +281,10 @@
"form_error_password": "不相符的密碼",
"reset_settings": "重置設定",
"update_announcement": "AdGuard Home {{version}} 現為可用的!關於更多的資訊,<0>點擊這裡</0>。",
"setup_guide": "安裝指南",
"setup_guide": "設置指南",
"dns_addresses": "DNS 位址",
"dns_start": "DNS 伺服器正在啟動",
"dns_status_error": "取得 DNS 伺服器狀態之錯誤",
"down": "停止運作的",
"fix": "修復",
"dns_providers": "這裡是一個從中選擇之<0>已知的 DNS 供應商之清單</0>。",
@@ -290,15 +303,16 @@
"client_edit": "編輯用戶端",
"client_identifier": "識別碼",
"ip_address": "IP 位址",
"client_identifier_desc": "用戶端可被 IP 位址或媒體存取控制MAC位址識別。請注意僅若 AdGuard Home 也是<0>動態主機設定協定DHCP伺服器</0>,使用 MAC 作為識別碼是可能的",
"client_identifier_desc": "用戶端可被 IP 位址、無類別網域間路由CIDR或媒體存取控制MAC位址識別。請注意僅若 AdGuard Home 也是<0>動態主機設定協定DHCP伺服器</0>,使用 MAC 作為識別碼是可能的",
"form_enter_ip": "輸入 IP",
"form_enter_mac": "輸入媒體存取控制MAC",
"form_enter_id": "輸入識別碼",
"form_add_id": "增加識別碼",
"form_client_name": "輸入用戶端名稱",
"client_global_settings": "使用全域的設定",
"client_deleted": "用戶端 \"{{key}}\" 被成功地刪除",
"client_added": "用戶端 \"{{key}}\" 被成功地加入",
"client_updated": "用戶端 \"{{key}}\" 被成功地更新",
"table_statistics": "請求總數(最近的 24 小時)",
"clients_not_found": "無已發現之用戶端",
"client_confirm_delete": "您確定您想要刪除用戶端 \"{{key}}\" 嗎?",
"filter_confirm_delete": "您確定您想要刪除該過濾器嗎?",
@@ -353,5 +367,47 @@
"blocked_services_global": "使用全域已封鎖的服務",
"blocked_service": "已封鎖的服務",
"block_all": "封鎖全部",
"unblock_all": "解除封鎖全部"
"unblock_all": "解除封鎖全部",
"encryption_certificate_path": "憑證路徑",
"encryption_private_key_path": "私密金鑰路徑",
"encryption_certificates_source_path": "設定一個憑證檔案路徑",
"encryption_certificates_source_content": "貼上該憑證內容",
"encryption_key_source_path": "設定一個私密金鑰檔案",
"encryption_key_source_content": "貼上該私密金鑰內容",
"stats_params": "統計資料配置",
"config_successfully_saved": "配置被成功地儲存",
"interval_24_hour": "24 小時",
"interval_days": "{{count}} 日",
"interval_days_plural": "{{count}} 日",
"domain": "網域",
"answer": "回應",
"filter_added_successfully": "該過濾器已被成功地加入",
"statistics_configuration": "統計資料配置",
"statistics_retention": "統計資料保留",
"statistics_retention_desc": "如果您減少該間隔值,某些資料將被丟失",
"statistics_clear": " 清除統計資料",
"statistics_clear_confirm": "您確定您想要清除統計資料嗎?",
"statistics_retention_confirm": "您確定您想要更改統計資料保留嗎?如果您減少該間隔值,某些資料將被丟失",
"statistics_cleared": "統計資料被成功地清除",
"interval_hours": "{{count}} 小時",
"interval_hours_plural": "{{count}} 小時",
"filters_configuration": "過濾器配置",
"filters_enable": "啟用過濾器",
"filters_interval": "過濾器更新間隔",
"disabled": "已禁用",
"username_label": "使用者名稱",
"username_placeholder": "輸入使用者名稱",
"password_label": "密碼",
"password_placeholder": "輸入密碼",
"sign_in": "登入",
"sign_out": "登出",
"forgot_password": "忘了密碼嗎?",
"forgot_password_desc": "請遵循<0>這些步驟</0>以創建一組新的密碼供您的使用者帳戶。",
"location": "位置",
"orgname": "組織名稱",
"netname": "網路名稱",
"descr": "說明",
"whois": "Whois",
"filtering_rules_learn_more": "<0>了解更多</0>有關創建您自己的主機hosts封鎖清單。",
"blocked_by_response": "被正規名稱CNAME或 IP 封鎖作為回應"
}

View File

@@ -1,10 +1,8 @@
import { createAction } from 'redux-actions';
import Api from '../api/Api';
import apiClient from '../api/Api';
import { addErrorToast, addSuccessToast } from './index';
import { normalizeTextarea } from '../helpers/helpers';
const apiClient = new Api();
export const getAccessListRequest = createAction('GET_ACCESS_LIST_REQUEST');
export const getAccessListFailure = createAction('GET_ACCESS_LIST_FAILURE');
export const getAccessListSuccess = createAction('GET_ACCESS_LIST_SUCCESS');

View File

@@ -1,10 +1,7 @@
import { createAction } from 'redux-actions';
import { t } from 'i18next';
import Api from '../api/Api';
import apiClient from '../api/Api';
import { addErrorToast, addSuccessToast, getClients } from './index';
import { CLIENT_ID } from '../helpers/constants';
const apiClient = new Api();
export const toggleClientModal = createAction('TOGGLE_CLIENT_MODAL');
@@ -15,18 +12,7 @@ export const addClientSuccess = createAction('ADD_CLIENT_SUCCESS');
export const addClient = config => async (dispatch) => {
dispatch(addClientRequest());
try {
let data;
if (config.identifier === CLIENT_ID.MAC) {
const { ip, identifier, ...values } = config;
data = { ...values };
} else {
const { mac, identifier, ...values } = config;
data = { ...values };
}
await apiClient.addClient(data);
await apiClient.addClient(config);
dispatch(addClientSuccess());
dispatch(toggleClientModal());
dispatch(addSuccessToast(t('client_added', { key: config.name })));
@@ -61,16 +47,7 @@ export const updateClientSuccess = createAction('UPDATE_CLIENT_SUCCESS');
export const updateClient = (config, name) => async (dispatch) => {
dispatch(updateClientRequest());
try {
let data;
if (config.identifier === CLIENT_ID.MAC) {
const { ip, identifier, ...values } = config;
data = { name, data: { ...values } };
} else {
const { mac, identifier, ...values } = config;
data = { name, data: { ...values } };
}
const data = { name, data: { ...config } };
await apiClient.updateClient(data);
dispatch(updateClientSuccess());

View File

@@ -0,0 +1,35 @@
import { createAction } from 'redux-actions';
import apiClient from '../api/Api';
import { addErrorToast, addSuccessToast } from './index';
export const getDnsConfigRequest = createAction('GET_DNS_CONFIG_REQUEST');
export const getDnsConfigFailure = createAction('GET_DNS_CONFIG_FAILURE');
export const getDnsConfigSuccess = createAction('GET_DNS_CONFIG_SUCCESS');
export const getDnsConfig = () => async (dispatch) => {
dispatch(getDnsConfigRequest());
try {
const data = await apiClient.getDnsConfig();
dispatch(getDnsConfigSuccess(data));
} catch (error) {
dispatch(addErrorToast({ error }));
dispatch(getDnsConfigFailure());
}
};
export const setDnsConfigRequest = createAction('SET_DNS_CONFIG_REQUEST');
export const setDnsConfigFailure = createAction('SET_DNS_CONFIG_FAILURE');
export const setDnsConfigSuccess = createAction('SET_DNS_CONFIG_SUCCESS');
export const setDnsConfig = config => async (dispatch) => {
dispatch(setDnsConfigRequest());
try {
await apiClient.setDnsConfig(config);
dispatch(addSuccessToast('config_successfully_saved'));
dispatch(setDnsConfigSuccess(config));
} catch (error) {
dispatch(addErrorToast({ error }));
dispatch(setDnsConfigFailure());
}
};

View File

@@ -1,10 +1,8 @@
import { createAction } from 'redux-actions';
import Api from '../api/Api';
import apiClient from '../api/Api';
import { addErrorToast, addSuccessToast } from './index';
import { redirectToCurrentProtocol } from '../helpers/helpers';
const apiClient = new Api();
export const getTlsStatusRequest = createAction('GET_TLS_STATUS_REQUEST');
export const getTlsStatusFailure = createAction('GET_TLS_STATUS_FAILURE');
export const getTlsStatusSuccess = createAction('GET_TLS_STATUS_SUCCESS');

View File

@@ -0,0 +1,145 @@
import { createAction } from 'redux-actions';
import { showLoading, hideLoading } from 'react-redux-loading-bar';
import { normalizeFilteringStatus, normalizeRulesTextarea } from '../helpers/helpers';
import { addErrorToast, addSuccessToast } from './index';
import apiClient from '../api/Api';
export const toggleFilteringModal = createAction('FILTERING_MODAL_TOGGLE');
export const handleRulesChange = createAction('HANDLE_RULES_CHANGE');
export const getFilteringStatusRequest = createAction('GET_FILTERING_STATUS_REQUEST');
export const getFilteringStatusFailure = createAction('GET_FILTERING_STATUS_FAILURE');
export const getFilteringStatusSuccess = createAction('GET_FILTERING_STATUS_SUCCESS');
export const getFilteringStatus = () => async (dispatch) => {
dispatch(getFilteringStatusRequest());
try {
const status = await apiClient.getFilteringStatus();
dispatch(getFilteringStatusSuccess({ ...normalizeFilteringStatus(status) }));
} catch (error) {
dispatch(addErrorToast({ error }));
dispatch(getFilteringStatusFailure());
}
};
export const setRulesRequest = createAction('SET_RULES_REQUEST');
export const setRulesFailure = createAction('SET_RULES_FAILURE');
export const setRulesSuccess = createAction('SET_RULES_SUCCESS');
export const setRules = rules => async (dispatch) => {
dispatch(setRulesRequest());
try {
const normalizedRules = normalizeRulesTextarea(rules);
await apiClient.setRules(normalizedRules);
dispatch(addSuccessToast('updated_custom_filtering_toast'));
dispatch(setRulesSuccess());
} catch (error) {
dispatch(addErrorToast({ error }));
dispatch(setRulesFailure());
}
};
export const addFilterRequest = createAction('ADD_FILTER_REQUEST');
export const addFilterFailure = createAction('ADD_FILTER_FAILURE');
export const addFilterSuccess = createAction('ADD_FILTER_SUCCESS');
export const addFilter = (url, name) => async (dispatch) => {
dispatch(addFilterRequest());
try {
await apiClient.addFilter(url, name);
dispatch(addFilterSuccess(url));
dispatch(toggleFilteringModal());
dispatch(addSuccessToast('filter_added_successfully'));
dispatch(getFilteringStatus());
} catch (error) {
dispatch(addErrorToast({ error }));
dispatch(addFilterFailure());
}
};
export const removeFilterRequest = createAction('REMOVE_FILTER_REQUEST');
export const removeFilterFailure = createAction('REMOVE_FILTER_FAILURE');
export const removeFilterSuccess = createAction('REMOVE_FILTER_SUCCESS');
export const removeFilter = url => async (dispatch) => {
dispatch(removeFilterRequest());
try {
await apiClient.removeFilter(url);
dispatch(removeFilterSuccess(url));
dispatch(getFilteringStatus());
} catch (error) {
dispatch(addErrorToast({ error }));
dispatch(removeFilterFailure());
}
};
export const toggleFilterRequest = createAction('FILTER_TOGGLE_REQUEST');
export const toggleFilterFailure = createAction('FILTER_TOGGLE_FAILURE');
export const toggleFilterSuccess = createAction('FILTER_TOGGLE_SUCCESS');
export const toggleFilterStatus = (url, enabled) => async (dispatch) => {
dispatch(toggleFilterRequest());
try {
await apiClient.setFilterUrl({ url, enabled: !enabled });
dispatch(toggleFilterSuccess(url));
dispatch(getFilteringStatus());
} catch (error) {
dispatch(addErrorToast({ error }));
dispatch(toggleFilterFailure());
}
};
export const refreshFiltersRequest = createAction('FILTERING_REFRESH_REQUEST');
export const refreshFiltersFailure = createAction('FILTERING_REFRESH_FAILURE');
export const refreshFiltersSuccess = createAction('FILTERING_REFRESH_SUCCESS');
export const refreshFilters = () => async (dispatch) => {
dispatch(refreshFiltersRequest());
dispatch(showLoading());
try {
const refreshText = await apiClient.refreshFilters();
dispatch(refreshFiltersSuccess());
if (refreshText.includes('OK')) {
if (refreshText.includes('OK 0')) {
dispatch(addSuccessToast('all_filters_up_to_date_toast'));
} else {
dispatch(addSuccessToast(refreshText.replace(/OK /g, '')));
}
} else {
dispatch(addErrorToast({ error: refreshText }));
}
dispatch(getFilteringStatus());
dispatch(hideLoading());
} catch (error) {
dispatch(addErrorToast({ error }));
dispatch(refreshFiltersFailure());
dispatch(hideLoading());
}
};
export const setFiltersConfigRequest = createAction('SET_FILTERS_CONFIG_REQUEST');
export const setFiltersConfigFailure = createAction('SET_FILTERS_CONFIG_FAILURE');
export const setFiltersConfigSuccess = createAction('SET_FILTERS_CONFIG_SUCCESS');
export const setFiltersConfig = config => async (dispatch, getState) => {
dispatch(setFiltersConfigRequest());
try {
const { enabled } = config;
const prevEnabled = getState().filtering.enabled;
let successToastMessage = 'config_successfully_saved';
if (prevEnabled !== enabled) {
successToastMessage = enabled ? 'enabled_filtering_toast' : 'disabled_filtering_toast';
}
await apiClient.setFiltersConfig(config);
dispatch(addSuccessToast(successToastMessage));
dispatch(setFiltersConfigSuccess(config));
} catch (error) {
dispatch(addErrorToast({ error }));
dispatch(setFiltersConfigFailure());
}
};

View File

@@ -1,16 +1,11 @@
import { createAction } from 'redux-actions';
import round from 'lodash/round';
import { t } from 'i18next';
import { showLoading, hideLoading } from 'react-redux-loading-bar';
import axios from 'axios';
import versionCompare from '../helpers/versionCompare';
import { normalizeHistory, normalizeFilteringStatus, normalizeLogs, normalizeTextarea, sortClients } from '../helpers/helpers';
import { normalizeTextarea, sortClients, isVersionGreater } from '../helpers/helpers';
import { SETTINGS_NAMES, CHECK_TIMEOUT } from '../helpers/constants';
import { getTlsStatus } from './encryption';
import Api from '../api/Api';
const apiClient = new Api();
import apiClient from '../api/Api';
export const addErrorToast = createAction('ADD_ERROR_TOAST');
export const addSuccessToast = createAction('ADD_SUCCESS_TOAST');
@@ -24,16 +19,6 @@ export const toggleSetting = (settingKey, status) => async (dispatch) => {
let successMessage = '';
try {
switch (settingKey) {
case SETTINGS_NAMES.filtering:
if (status) {
successMessage = 'disabled_filtering_toast';
await apiClient.disableFiltering();
} else {
successMessage = 'enabled_filtering_toast';
await apiClient.enableFiltering();
}
dispatch(toggleSettingStatus({ settingKey }));
break;
case SETTINGS_NAMES.safebrowsing:
if (status) {
successMessage = 'disabled_safe_browsing_toast';
@@ -80,18 +65,15 @@ export const initSettingsSuccess = createAction('SETTINGS_INIT_SUCCESS');
export const initSettings = settingsList => async (dispatch) => {
dispatch(initSettingsRequest());
try {
const filteringStatus = await apiClient.getFilteringStatus();
const safebrowsingStatus = await apiClient.getSafebrowsingStatus();
const parentalStatus = await apiClient.getParentalStatus();
const safesearchStatus = await apiClient.getSafesearchStatus();
const {
filtering,
safebrowsing,
parental,
safesearch,
} = settingsList;
const newSettingsList = {
filtering: { ...filtering, enabled: filteringStatus.enabled },
safebrowsing: { ...safebrowsing, enabled: safebrowsingStatus.enabled },
parental: { ...parental, enabled: parentalStatus.enabled },
safesearch: { ...safesearch, enabled: safesearchStatus.enabled },
@@ -103,38 +85,15 @@ export const initSettings = settingsList => async (dispatch) => {
}
};
export const getFilteringRequest = createAction('GET_FILTERING_REQUEST');
export const getFilteringFailure = createAction('GET_FILTERING_FAILURE');
export const getFilteringSuccess = createAction('GET_FILTERING_SUCCESS');
export const getFiltering = () => async (dispatch) => {
dispatch(getFilteringRequest());
try {
const filteringStatus = await apiClient.getFilteringStatus();
dispatch(getFilteringSuccess(filteringStatus.enabled));
} catch (error) {
dispatch(addErrorToast({ error }));
dispatch(getFilteringFailure());
}
};
export const toggleProtectionRequest = createAction('TOGGLE_PROTECTION_REQUEST');
export const toggleProtectionFailure = createAction('TOGGLE_PROTECTION_FAILURE');
export const toggleProtectionSuccess = createAction('TOGGLE_PROTECTION_SUCCESS');
export const toggleProtection = status => async (dispatch) => {
dispatch(toggleProtectionRequest());
let successMessage = '';
try {
if (status) {
successMessage = 'disabled_protection';
await apiClient.disableGlobalProtection();
} else {
successMessage = 'enabled_protection';
await apiClient.enableGlobalProtection();
}
const successMessage = status ? 'disabled_protection' : 'enabled_protection';
await apiClient.setDnsConfig({ protection_enabled: !status });
dispatch(addSuccessToast(successMessage));
dispatch(toggleProtectionSuccess());
} catch (error) {
@@ -157,7 +116,7 @@ export const getVersion = (recheck = false) => async (dispatch, getState) => {
const { dnsVersion } = getState().dashboard;
const currentVersion = dnsVersion === 'undefined' ? 0 : dnsVersion;
if (data && versionCompare(currentVersion, data.new_version) === -1) {
if (data && isVersionGreater(currentVersion, data.new_version)) {
dispatch(addSuccessToast('updates_checked'));
} else {
dispatch(addSuccessToast('updates_version_equal'));
@@ -173,55 +132,65 @@ export const getUpdateRequest = createAction('GET_UPDATE_REQUEST');
export const getUpdateFailure = createAction('GET_UPDATE_FAILURE');
export const getUpdateSuccess = createAction('GET_UPDATE_SUCCESS');
const checkStatus = async (handleRequestSuccess, handleRequestError, attempts = 60) => {
let timeout;
if (attempts === 0) {
handleRequestError();
}
const rmTimeout = t => t && clearTimeout(t);
try {
const response = await axios.get('control/status');
rmTimeout(timeout);
if (response && response.status === 200) {
handleRequestSuccess(response);
if (response.data.running === false) {
timeout = setTimeout(
checkStatus,
CHECK_TIMEOUT,
handleRequestSuccess,
handleRequestError,
attempts - 1,
);
}
}
} catch (error) {
rmTimeout(timeout);
timeout = setTimeout(
checkStatus,
CHECK_TIMEOUT,
handleRequestSuccess,
handleRequestError,
attempts - 1,
);
}
};
export const getUpdate = () => async (dispatch, getState) => {
const { dnsVersion } = getState().dashboard;
dispatch(getUpdateRequest());
try {
await apiClient.getUpdate();
const checkUpdate = async (attempts) => {
let count = attempts || 1;
let timeout;
if (count > 60) {
dispatch(addNoticeToast({ error: 'update_failed' }));
dispatch(getUpdateFailure());
return false;
}
const rmTimeout = t => t && clearTimeout(t);
const setRecursiveTimeout = (time, ...args) => setTimeout(
checkUpdate,
time,
...args,
);
axios.get('control/status')
.then((response) => {
rmTimeout(timeout);
if (response && response.status === 200) {
const responseVersion = response.data && response.data.version;
if (dnsVersion !== responseVersion) {
dispatch(getUpdateSuccess());
window.location.reload(true);
}
}
timeout = setRecursiveTimeout(CHECK_TIMEOUT, count += 1);
})
.catch(() => {
rmTimeout(timeout);
timeout = setRecursiveTimeout(CHECK_TIMEOUT, count += 1);
});
return false;
};
checkUpdate();
} catch (error) {
const handleRequestError = () => {
dispatch(addNoticeToast({ error: 'update_failed' }));
dispatch(getUpdateFailure());
};
const handleRequestSuccess = (response) => {
const responseVersion = response.data && response.data.version;
if (dnsVersion !== responseVersion) {
dispatch(getUpdateSuccess());
window.location.reload(true);
}
};
try {
await apiClient.getUpdate();
checkStatus(handleRequestSuccess, handleRequestError);
} catch (error) {
handleRequestError();
}
};
@@ -246,301 +215,70 @@ export const getClients = () => async (dispatch) => {
}
};
export const getTopStatsRequest = createAction('GET_TOP_STATS_REQUEST');
export const getTopStatsFailure = createAction('GET_TOP_STATS_FAILURE');
export const getTopStatsSuccess = createAction('GET_TOP_STATS_SUCCESS');
export const getProfileRequest = createAction('GET_PROFILE_REQUEST');
export const getProfileFailure = createAction('GET_PROFILE_FAILURE');
export const getProfileSuccess = createAction('GET_PROFILE_SUCCESS');
export const getTopStats = () => async (dispatch, getState) => {
dispatch(getTopStatsRequest());
const timer = setInterval(async () => {
const state = getState();
if (state.dashboard.isCoreRunning) {
clearInterval(timer);
try {
const stats = await apiClient.getGlobalStatsTop();
dispatch(getTopStatsSuccess(stats));
} catch (error) {
dispatch(addErrorToast({ error }));
dispatch(getTopStatsFailure(error));
}
}
}, 100);
export const getProfile = () => async (dispatch) => {
dispatch(getProfileRequest());
try {
const profile = await apiClient.getProfile();
dispatch(getProfileSuccess(profile));
} catch (error) {
dispatch(addErrorToast({ error }));
dispatch(getProfileFailure());
}
};
export const dnsStatusRequest = createAction('DNS_STATUS_REQUEST');
export const dnsStatusFailure = createAction('DNS_STATUS_FAILURE');
export const dnsStatusSuccess = createAction('DNS_STATUS_SUCCESS');
export const setDnsRunningStatus = createAction('SET_DNS_RUNNING_STATUS');
export const getDnsStatus = () => async (dispatch) => {
dispatch(dnsStatusRequest());
const handleRequestError = () => {
dispatch(addErrorToast({ error: 'dns_status_error' }));
dispatch(dnsStatusFailure());
window.location.reload(true);
};
const handleRequestSuccess = (response) => {
const dnsStatus = response.data;
const { running } = dnsStatus;
const runningStatus = dnsStatus && running;
if (runningStatus === true) {
dispatch(dnsStatusSuccess(dnsStatus));
dispatch(getVersion());
dispatch(getTlsStatus());
dispatch(getProfile());
} else {
dispatch(setDnsRunningStatus(running));
}
};
try {
checkStatus(handleRequestSuccess, handleRequestError);
} catch (error) {
handleRequestError(error);
}
};
export const getDnsSettingsRequest = createAction('GET_DNS_SETTINGS_REQUEST');
export const getDnsSettingsFailure = createAction('GET_DNS_SETTINGS_FAILURE');
export const getDnsSettingsSuccess = createAction('GET_DNS_SETTINGS_SUCCESS');
export const getDnsSettings = () => async (dispatch) => {
dispatch(getDnsSettingsRequest());
try {
const dnsStatus = await apiClient.getGlobalStatus();
dispatch(dnsStatusSuccess(dnsStatus));
dispatch(getVersion());
dispatch(getTlsStatus());
dispatch(getDnsSettingsSuccess(dnsStatus));
} catch (error) {
dispatch(addErrorToast({ error }));
dispatch(initSettingsFailure());
dispatch(getDnsSettingsFailure());
}
};
export const enableDnsRequest = createAction('ENABLE_DNS_REQUEST');
export const enableDnsFailure = createAction('ENABLE_DNS_FAILURE');
export const enableDnsSuccess = createAction('ENABLE_DNS_SUCCESS');
export const enableDns = () => async (dispatch) => {
dispatch(enableDnsRequest());
try {
await apiClient.startGlobalFiltering();
dispatch(enableDnsSuccess());
} catch (error) {
dispatch(addErrorToast({ error }));
dispatch(enableDnsFailure());
}
};
export const disableDnsRequest = createAction('DISABLE_DNS_REQUEST');
export const disableDnsFailure = createAction('DISABLE_DNS_FAILURE');
export const disableDnsSuccess = createAction('DISABLE_DNS_SUCCESS');
export const disableDns = () => async (dispatch) => {
dispatch(disableDnsRequest());
try {
await apiClient.stopGlobalFiltering();
dispatch(disableDnsSuccess());
} catch (error) {
dispatch(disableDnsFailure(error));
dispatch(addErrorToast({ error }));
}
};
export const getStatsRequest = createAction('GET_STATS_REQUEST');
export const getStatsFailure = createAction('GET_STATS_FAILURE');
export const getStatsSuccess = createAction('GET_STATS_SUCCESS');
export const getStats = () => async (dispatch) => {
dispatch(getStatsRequest());
try {
const stats = await apiClient.getGlobalStats();
const processedStats = {
...stats,
avg_processing_time: round(stats.avg_processing_time, 2),
};
dispatch(getStatsSuccess(processedStats));
} catch (error) {
dispatch(addErrorToast({ error }));
dispatch(getStatsFailure());
}
};
export const getLogsRequest = createAction('GET_LOGS_REQUEST');
export const getLogsFailure = createAction('GET_LOGS_FAILURE');
export const getLogsSuccess = createAction('GET_LOGS_SUCCESS');
export const getLogs = () => async (dispatch, getState) => {
dispatch(getLogsRequest());
const timer = setInterval(async () => {
const state = getState();
if (state.dashboard.isCoreRunning) {
clearInterval(timer);
try {
const logs = normalizeLogs(await apiClient.getQueryLog());
dispatch(getLogsSuccess(logs));
} catch (error) {
dispatch(addErrorToast({ error }));
dispatch(getLogsFailure(error));
}
}
}, 100);
};
export const toggleLogStatusRequest = createAction('TOGGLE_LOGS_REQUEST');
export const toggleLogStatusFailure = createAction('TOGGLE_LOGS_FAILURE');
export const toggleLogStatusSuccess = createAction('TOGGLE_LOGS_SUCCESS');
export const toggleLogStatus = queryLogEnabled => async (dispatch) => {
dispatch(toggleLogStatusRequest());
let toggleMethod;
let successMessage;
if (queryLogEnabled) {
toggleMethod = apiClient.disableQueryLog.bind(apiClient);
successMessage = 'query_log_disabled_toast';
} else {
toggleMethod = apiClient.enableQueryLog.bind(apiClient);
successMessage = 'query_log_enabled_toast';
}
try {
await toggleMethod();
dispatch(addSuccessToast(successMessage));
dispatch(toggleLogStatusSuccess());
} catch (error) {
dispatch(addErrorToast({ error }));
dispatch(toggleLogStatusFailure());
}
};
export const setRulesRequest = createAction('SET_RULES_REQUEST');
export const setRulesFailure = createAction('SET_RULES_FAILURE');
export const setRulesSuccess = createAction('SET_RULES_SUCCESS');
export const setRules = rules => async (dispatch) => {
dispatch(setRulesRequest());
try {
const replacedLineEndings = rules
.replace(/^\n/g, '')
.replace(/\n\s*\n/g, '\n');
await apiClient.setRules(replacedLineEndings);
dispatch(addSuccessToast('updated_custom_filtering_toast'));
dispatch(setRulesSuccess());
} catch (error) {
dispatch(addErrorToast({ error }));
dispatch(setRulesFailure());
}
};
export const getFilteringStatusRequest = createAction('GET_FILTERING_STATUS_REQUEST');
export const getFilteringStatusFailure = createAction('GET_FILTERING_STATUS_FAILURE');
export const getFilteringStatusSuccess = createAction('GET_FILTERING_STATUS_SUCCESS');
export const getFilteringStatus = () => async (dispatch) => {
dispatch(getFilteringStatusRequest());
try {
const status = await apiClient.getFilteringStatus();
dispatch(getFilteringStatusSuccess({ status: normalizeFilteringStatus(status) }));
} catch (error) {
dispatch(addErrorToast({ error }));
dispatch(getFilteringStatusFailure());
}
};
export const toggleFilterRequest = createAction('FILTER_ENABLE_REQUEST');
export const toggleFilterFailure = createAction('FILTER_ENABLE_FAILURE');
export const toggleFilterSuccess = createAction('FILTER_ENABLE_SUCCESS');
export const toggleFilterStatus = url => async (dispatch, getState) => {
dispatch(toggleFilterRequest());
const state = getState();
const { filters } = state.filtering;
const filter = filters.filter(filter => filter.url === url)[0];
const { enabled } = filter;
let toggleStatusMethod;
if (enabled) {
toggleStatusMethod = apiClient.disableFilter.bind(apiClient);
} else {
toggleStatusMethod = apiClient.enableFilter.bind(apiClient);
}
try {
await toggleStatusMethod(url);
dispatch(toggleFilterSuccess(url));
dispatch(getFilteringStatus());
} catch (error) {
dispatch(addErrorToast({ error }));
dispatch(toggleFilterFailure());
}
};
export const refreshFiltersRequest = createAction('FILTERING_REFRESH_REQUEST');
export const refreshFiltersFailure = createAction('FILTERING_REFRESH_FAILURE');
export const refreshFiltersSuccess = createAction('FILTERING_REFRESH_SUCCESS');
export const refreshFilters = () => async (dispatch) => {
dispatch(refreshFiltersRequest());
dispatch(showLoading());
try {
const refreshText = await apiClient.refreshFilters();
dispatch(refreshFiltersSuccess());
if (refreshText.includes('OK')) {
if (refreshText.includes('OK 0')) {
dispatch(addSuccessToast('all_filters_up_to_date_toast'));
} else {
dispatch(addSuccessToast(refreshText.replace(/OK /g, '')));
}
} else {
dispatch(addErrorToast({ error: refreshText }));
}
dispatch(getFilteringStatus());
dispatch(hideLoading());
} catch (error) {
dispatch(addErrorToast({ error }));
dispatch(refreshFiltersFailure());
dispatch(hideLoading());
}
};
export const handleRulesChange = createAction('HANDLE_RULES_CHANGE');
export const getStatsHistoryRequest = createAction('GET_STATS_HISTORY_REQUEST');
export const getStatsHistoryFailure = createAction('GET_STATS_HISTORY_FAILURE');
export const getStatsHistorySuccess = createAction('GET_STATS_HISTORY_SUCCESS');
export const getStatsHistory = () => async (dispatch) => {
dispatch(getStatsHistoryRequest());
try {
const statsHistory = await apiClient.getGlobalStatsHistory();
const normalizedHistory = normalizeHistory(statsHistory);
dispatch(getStatsHistorySuccess(normalizedHistory));
} catch (error) {
dispatch(addErrorToast({ error }));
dispatch(getStatsHistoryFailure());
}
};
export const addFilterRequest = createAction('ADD_FILTER_REQUEST');
export const addFilterFailure = createAction('ADD_FILTER_FAILURE');
export const addFilterSuccess = createAction('ADD_FILTER_SUCCESS');
export const addFilter = (url, name) => async (dispatch) => {
dispatch(addFilterRequest());
try {
await apiClient.addFilter(url, name);
dispatch(addFilterSuccess(url));
dispatch(getFilteringStatus());
} catch (error) {
dispatch(addErrorToast({ error }));
dispatch(addFilterFailure());
}
};
export const removeFilterRequest = createAction('ADD_FILTER_REQUEST');
export const removeFilterFailure = createAction('ADD_FILTER_FAILURE');
export const removeFilterSuccess = createAction('ADD_FILTER_SUCCESS');
export const removeFilter = url => async (dispatch) => {
dispatch(removeFilterRequest());
try {
await apiClient.removeFilter(url);
dispatch(removeFilterSuccess(url));
dispatch(getFilteringStatus());
} catch (error) {
dispatch(addErrorToast({ error }));
dispatch(removeFilterFailure());
}
};
export const toggleFilteringModal = createAction('FILTERING_MODAL_TOGGLE');
export const downloadQueryLogRequest = createAction('DOWNLOAD_QUERY_LOG_REQUEST');
export const downloadQueryLogFailure = createAction('DOWNLOAD_QUERY_LOG_FAILURE');
export const downloadQueryLogSuccess = createAction('DOWNLOAD_QUERY_LOG_SUCCESS');
export const downloadQueryLog = () => async (dispatch) => {
let data;
dispatch(downloadQueryLogRequest());
try {
data = await apiClient.downloadQueryLog();
dispatch(downloadQueryLogSuccess());
} catch (error) {
dispatch(addErrorToast({ error }));
dispatch(downloadQueryLogFailure());
}
return data;
};
export const handleUpstreamChange = createAction('HANDLE_UPSTREAM_CHANGE');
export const setUpstreamRequest = createAction('SET_UPSTREAM_REQUEST');
export const setUpstreamFailure = createAction('SET_UPSTREAM_FAILURE');
@@ -559,7 +297,7 @@ export const setUpstream = config => async (dispatch) => {
await apiClient.setUpstream(values);
dispatch(addSuccessToast('updated_upstream_dns_toast'));
dispatch(setUpstreamSuccess());
dispatch(setUpstreamSuccess(config));
} catch (error) {
dispatch(addErrorToast({ error }));
dispatch(setUpstreamFailure());
@@ -720,6 +458,22 @@ export const toggleDhcp = values => async (dispatch) => {
}
};
export const resetDhcpRequest = createAction('RESET_DHCP_REQUEST');
export const resetDhcpSuccess = createAction('RESET_DHCP_SUCCESS');
export const resetDhcpFailure = createAction('RESET_DHCP_FAILURE');
export const resetDhcp = () => async (dispatch) => {
dispatch(resetDhcpRequest());
try {
const status = await apiClient.resetDhcp();
dispatch(resetDhcpSuccess(status));
dispatch(addSuccessToast('dhcp_config_saved'));
} catch (error) {
dispatch(addErrorToast({ error }));
dispatch(resetDhcpFailure());
}
};
export const toggleLeaseModal = createAction('TOGGLE_LEASE_MODAL');
export const addStaticLeaseRequest = createAction('ADD_STATIC_LEASE_REQUEST');

View File

@@ -1,9 +1,7 @@
import { createAction } from 'redux-actions';
import Api from '../api/Api';
import apiClient from '../api/Api';
import { addErrorToast, addSuccessToast } from './index';
const apiClient = new Api();
export const nextStep = createAction('NEXT_STEP');
export const prevStep = createAction('PREV_STEP');

View File

@@ -0,0 +1,20 @@
import { createAction } from 'redux-actions';
import { addErrorToast } from './index';
import apiClient from '../api/Api';
export const processLoginRequest = createAction('PROCESS_LOGIN_REQUEST');
export const processLoginFailure = createAction('PROCESS_LOGIN_FAILURE');
export const processLoginSuccess = createAction('PROCESS_LOGIN_SUCCESS');
export const processLogin = values => async (dispatch) => {
dispatch(processLoginRequest());
try {
await apiClient.login(values);
window.location.replace(window.location.origin);
dispatch(processLoginSuccess());
} catch (error) {
dispatch(addErrorToast({ error }));
dispatch(processLoginFailure());
}
};

View File

@@ -0,0 +1,148 @@
import { createAction } from 'redux-actions';
import apiClient from '../api/Api';
import { addErrorToast, addSuccessToast } from './index';
import { normalizeLogs, getParamsForClientsSearch, addClientInfo } from '../helpers/helpers';
import { TABLE_DEFAULT_PAGE_SIZE } from '../helpers/constants';
const getLogsWithParams = async (config) => {
const { older_than, filter, ...values } = config;
const rawLogs = await apiClient.getQueryLog({ ...filter, older_than });
const { data, oldest } = rawLogs;
const logs = normalizeLogs(data);
const clientsParams = getParamsForClientsSearch(logs, 'client');
const clients = await apiClient.findClients(clientsParams);
const logsWithClientInfo = addClientInfo(logs, clients, 'client');
return {
logs: logsWithClientInfo, oldest, older_than, filter, ...values,
};
};
export const getAdditionalLogsRequest = createAction('GET_ADDITIONAL_LOGS_REQUEST');
export const getAdditionalLogsFailure = createAction('GET_ADDITIONAL_LOGS_FAILURE');
export const getAdditionalLogsSuccess = createAction('GET_ADDITIONAL_LOGS_SUCCESS');
const checkFilteredLogs = async (data, filter, dispatch, total) => {
const { logs, oldest } = data;
const totalData = total || { logs };
const needToGetAdditionalLogs = (logs.length < TABLE_DEFAULT_PAGE_SIZE ||
totalData.logs.length < TABLE_DEFAULT_PAGE_SIZE) &&
oldest !== '';
if (needToGetAdditionalLogs) {
dispatch(getAdditionalLogsRequest());
try {
const additionalLogs = await getLogsWithParams({ older_than: oldest, filter });
if (additionalLogs.logs.length > 0) {
return await checkFilteredLogs(additionalLogs, filter, dispatch, {
logs: [...totalData.logs, ...additionalLogs.logs],
oldest: additionalLogs.oldest,
});
}
dispatch(getAdditionalLogsSuccess());
return totalData;
} catch (error) {
dispatch(addErrorToast({ error }));
dispatch(getAdditionalLogsFailure(error));
}
}
dispatch(getAdditionalLogsSuccess());
return totalData;
};
export const setLogsPagination = createAction('LOGS_PAGINATION');
export const setLogsPage = createAction('SET_LOG_PAGE');
export const getLogsRequest = createAction('GET_LOGS_REQUEST');
export const getLogsFailure = createAction('GET_LOGS_FAILURE');
export const getLogsSuccess = createAction('GET_LOGS_SUCCESS');
export const getLogs = config => async (dispatch, getState) => {
dispatch(getLogsRequest());
try {
const { isFiltered, filter, page } = getState().queryLogs;
const data = await getLogsWithParams({ ...config, filter });
if (isFiltered) {
const additionalData = await checkFilteredLogs(data, filter, dispatch);
const updatedData = additionalData.logs ? { ...data, ...additionalData } : data;
dispatch(getLogsSuccess(updatedData));
dispatch(setLogsPagination({ page, pageSize: TABLE_DEFAULT_PAGE_SIZE }));
} else {
dispatch(getLogsSuccess(data));
}
} catch (error) {
dispatch(addErrorToast({ error }));
dispatch(getLogsFailure(error));
}
};
export const setLogsFilterRequest = createAction('SET_LOGS_FILTER_REQUEST');
export const setLogsFilterFailure = createAction('SET_LOGS_FILTER_FAILURE');
export const setLogsFilterSuccess = createAction('SET_LOGS_FILTER_SUCCESS');
export const setLogsFilter = filter => async (dispatch) => {
dispatch(setLogsFilterRequest());
try {
const data = await getLogsWithParams({ older_than: '', filter });
const additionalData = await checkFilteredLogs(data, filter, dispatch);
const updatedData = additionalData.logs ? { ...data, ...additionalData } : data;
dispatch(setLogsFilterSuccess({ ...updatedData, filter }));
dispatch(setLogsPage(0));
} catch (error) {
dispatch(addErrorToast({ error }));
dispatch(setLogsFilterFailure(error));
}
};
export const clearLogsRequest = createAction('CLEAR_LOGS_REQUEST');
export const clearLogsFailure = createAction('CLEAR_LOGS_FAILURE');
export const clearLogsSuccess = createAction('CLEAR_LOGS_SUCCESS');
export const clearLogs = () => async (dispatch) => {
dispatch(clearLogsRequest());
try {
await apiClient.clearQueryLog();
dispatch(clearLogsSuccess());
dispatch(addSuccessToast('query_log_cleared'));
} catch (error) {
dispatch(addErrorToast({ error }));
dispatch(clearLogsFailure(error));
}
};
export const getLogsConfigRequest = createAction('GET_LOGS_CONFIG_REQUEST');
export const getLogsConfigFailure = createAction('GET_LOGS_CONFIG_FAILURE');
export const getLogsConfigSuccess = createAction('GET_LOGS_CONFIG_SUCCESS');
export const getLogsConfig = () => async (dispatch) => {
dispatch(getLogsConfigRequest());
try {
const data = await apiClient.getQueryLogInfo();
dispatch(getLogsConfigSuccess(data));
} catch (error) {
dispatch(addErrorToast({ error }));
dispatch(getLogsConfigFailure());
}
};
export const setLogsConfigRequest = createAction('SET_LOGS_CONFIG_REQUEST');
export const setLogsConfigFailure = createAction('SET_LOGS_CONFIG_FAILURE');
export const setLogsConfigSuccess = createAction('SET_LOGS_CONFIG_SUCCESS');
export const setLogsConfig = config => async (dispatch) => {
dispatch(setLogsConfigRequest());
try {
await apiClient.setQueryLogConfig(config);
dispatch(addSuccessToast('config_successfully_saved'));
dispatch(setLogsConfigSuccess(config));
} catch (error) {
dispatch(addErrorToast({ error }));
dispatch(setLogsConfigFailure());
}
};

View File

@@ -1,10 +1,8 @@
import { createAction } from 'redux-actions';
import { t } from 'i18next';
import Api from '../api/Api';
import apiClient from '../api/Api';
import { addErrorToast, addSuccessToast } from './index';
const apiClient = new Api();
export const toggleRewritesModal = createAction('TOGGLE_REWRITES_MODAL');
export const getRewritesListRequest = createAction('GET_REWRITES_LIST_REQUEST');

View File

@@ -1,9 +1,7 @@
import { createAction } from 'redux-actions';
import Api from '../api/Api';
import apiClient from '../api/Api';
import { addErrorToast, addSuccessToast } from './index';
const apiClient = new Api();
export const getBlockedServicesRequest = createAction('GET_BLOCKED_SERVICES_REQUEST');
export const getBlockedServicesFailure = createAction('GET_BLOCKED_SERVICES_FAILURE');
export const getBlockedServicesSuccess = createAction('GET_BLOCKED_SERVICES_SUCCESS');

View File

@@ -0,0 +1,80 @@
import { createAction } from 'redux-actions';
import apiClient from '../api/Api';
import { addErrorToast, addSuccessToast } from './index';
import { normalizeTopStats, secondsToMilliseconds, getParamsForClientsSearch, addClientInfo } from '../helpers/helpers';
export const getStatsConfigRequest = createAction('GET_STATS_CONFIG_REQUEST');
export const getStatsConfigFailure = createAction('GET_STATS_CONFIG_FAILURE');
export const getStatsConfigSuccess = createAction('GET_STATS_CONFIG_SUCCESS');
export const getStatsConfig = () => async (dispatch) => {
dispatch(getStatsConfigRequest());
try {
const data = await apiClient.getStatsInfo();
dispatch(getStatsConfigSuccess(data));
} catch (error) {
dispatch(addErrorToast({ error }));
dispatch(getStatsConfigFailure());
}
};
export const setStatsConfigRequest = createAction('SET_STATS_CONFIG_REQUEST');
export const setStatsConfigFailure = createAction('SET_STATS_CONFIG_FAILURE');
export const setStatsConfigSuccess = createAction('SET_STATS_CONFIG_SUCCESS');
export const setStatsConfig = config => async (dispatch) => {
dispatch(setStatsConfigRequest());
try {
await apiClient.setStatsConfig(config);
dispatch(addSuccessToast('config_successfully_saved'));
dispatch(setStatsConfigSuccess(config));
} catch (error) {
dispatch(addErrorToast({ error }));
dispatch(setStatsConfigFailure());
}
};
export const getStatsRequest = createAction('GET_STATS_REQUEST');
export const getStatsFailure = createAction('GET_STATS_FAILURE');
export const getStatsSuccess = createAction('GET_STATS_SUCCESS');
export const getStats = () => async (dispatch) => {
dispatch(getStatsRequest());
try {
const stats = await apiClient.getStats();
const normalizedTopClients = normalizeTopStats(stats.top_clients);
const clientsParams = getParamsForClientsSearch(normalizedTopClients, 'name');
const clients = await apiClient.findClients(clientsParams);
const topClientsWithInfo = addClientInfo(normalizedTopClients, clients, 'name');
const normalizedStats = {
...stats,
top_blocked_domains: normalizeTopStats(stats.top_blocked_domains),
top_clients: topClientsWithInfo,
top_queried_domains: normalizeTopStats(stats.top_queried_domains),
avg_processing_time: secondsToMilliseconds(stats.avg_processing_time),
};
dispatch(getStatsSuccess(normalizedStats));
} catch (error) {
dispatch(addErrorToast({ error }));
dispatch(getStatsFailure());
}
};
export const resetStatsRequest = createAction('RESET_STATS_REQUEST');
export const resetStatsFailure = createAction('RESET_STATS_FAILURE');
export const resetStatsSuccess = createAction('RESET_STATS_SUCCESS');
export const resetStats = () => async (dispatch) => {
dispatch(getStatsRequest());
try {
await apiClient.resetStats();
dispatch(addSuccessToast('statistics_cleared'));
dispatch(resetStatsSuccess());
} catch (error) {
dispatch(addErrorToast({ error }));
dispatch(resetStatsFailure());
}
};

View File

@@ -1,8 +1,8 @@
import axios from 'axios';
import subHours from 'date-fns/sub_hours';
import dateFormat from 'date-fns/format';
export default class Api {
import { getPathWithQueryString } from '../helpers/helpers';
class Api {
baseUrl = 'control';
async makeRequest(path, method = 'POST', config) {
@@ -24,89 +24,17 @@ export default class Api {
}
// Global methods
GLOBAL_RESTART = { path: 'restart', method: 'POST' };
GLOBAL_START = { path: 'start', method: 'POST' };
GLOBAL_STATS = { path: 'stats', method: 'GET' };
GLOBAL_STATS_HISTORY = { path: 'stats_history', method: 'GET' };
GLOBAL_STATUS = { path: 'status', method: 'GET' };
GLOBAL_STOP = { path: 'stop', method: 'POST' };
GLOBAL_STATS_TOP = { path: 'stats_top', method: 'GET' };
GLOBAL_QUERY_LOG = { path: 'querylog', method: 'GET' };
GLOBAL_QUERY_LOG_ENABLE = { path: 'querylog_enable', method: 'POST' };
GLOBAL_QUERY_LOG_DISABLE = { path: 'querylog_disable', method: 'POST' };
GLOBAL_SET_UPSTREAM_DNS = { path: 'set_upstreams_config', method: 'POST' };
GLOBAL_TEST_UPSTREAM_DNS = { path: 'test_upstream_dns', method: 'POST' };
GLOBAL_VERSION = { path: 'version.json', method: 'POST' };
GLOBAL_ENABLE_PROTECTION = { path: 'enable_protection', method: 'POST' };
GLOBAL_DISABLE_PROTECTION = { path: 'disable_protection', method: 'POST' };
GLOBAL_UPDATE = { path: 'update', method: 'POST' };
restartGlobalFiltering() {
const { path, method } = this.GLOBAL_RESTART;
return this.makeRequest(path, method);
}
startGlobalFiltering() {
const { path, method } = this.GLOBAL_START;
return this.makeRequest(path, method);
}
stopGlobalFiltering() {
const { path, method } = this.GLOBAL_STOP;
return this.makeRequest(path, method);
}
getGlobalStats() {
const { path, method } = this.GLOBAL_STATS;
return this.makeRequest(path, method);
}
getGlobalStatsHistory() {
const { path, method } = this.GLOBAL_STATS_HISTORY;
const format = 'YYYY-MM-DDTHH:mm:ssZ';
const dateNow = Date.now();
const config = {
params: {
start_time: dateFormat(subHours(dateNow, 24), format),
end_time: dateFormat(dateNow, format),
time_unit: 'hours',
},
};
return this.makeRequest(path, method, config);
}
getGlobalStatus() {
const { path, method } = this.GLOBAL_STATUS;
return this.makeRequest(path, method);
}
getGlobalStatsTop() {
const { path, method } = this.GLOBAL_STATS_TOP;
return this.makeRequest(path, method);
}
getQueryLog() {
const { path, method } = this.GLOBAL_QUERY_LOG;
return this.makeRequest(path, method);
}
downloadQueryLog() {
const { path, method } = this.GLOBAL_QUERY_LOG;
const queryString = '?download=1';
return this.makeRequest(path + queryString, method);
}
enableQueryLog() {
const { path, method } = this.GLOBAL_QUERY_LOG_ENABLE;
return this.makeRequest(path, method);
}
disableQueryLog() {
const { path, method } = this.GLOBAL_QUERY_LOG_DISABLE;
return this.makeRequest(path, method);
}
setUpstream(url) {
const { path, method } = this.GLOBAL_SET_UPSTREAM_DNS;
const config = {
@@ -134,16 +62,6 @@ export default class Api {
return this.makeRequest(path, method, config);
}
enableGlobalProtection() {
const { path, method } = this.GLOBAL_ENABLE_PROTECTION;
return this.makeRequest(path, method);
}
disableGlobalProtection() {
const { path, method } = this.GLOBAL_DISABLE_PROTECTION;
return this.makeRequest(path, method);
}
getUpdate() {
const { path, method } = this.GLOBAL_UPDATE;
return this.makeRequest(path, method);
@@ -151,31 +69,18 @@ export default class Api {
// Filtering
FILTERING_STATUS = { path: 'filtering/status', method: 'GET' };
FILTERING_ENABLE = { path: 'filtering/enable', method: 'POST' };
FILTERING_DISABLE = { path: 'filtering/disable', method: 'POST' };
FILTERING_ADD_FILTER = { path: 'filtering/add_url', method: 'POST' };
FILTERING_REMOVE_FILTER = { path: 'filtering/remove_url', method: 'POST' };
FILTERING_SET_RULES = { path: 'filtering/set_rules', method: 'POST' };
FILTERING_ENABLE_FILTER = { path: 'filtering/enable_url', method: 'POST' };
FILTERING_DISABLE_FILTER = { path: 'filtering/disable_url', method: 'POST' };
FILTERING_REFRESH = { path: 'filtering/refresh', method: 'POST' };
FILTERING_SET_URL = { path: 'filtering/set_url', method: 'POST' };
FILTERING_CONFIG = { path: 'filtering/config', method: 'POST' };
getFilteringStatus() {
const { path, method } = this.FILTERING_STATUS;
return this.makeRequest(path, method);
}
enableFiltering() {
const { path, method } = this.FILTERING_ENABLE;
return this.makeRequest(path, method);
}
disableFiltering() {
const { path, method } = this.FILTERING_DISABLE;
return this.makeRequest(path, method);
}
// TODO find out when to use force parameter
refreshFilters() {
const { path, method } = this.FILTERING_REFRESH;
return this.makeRequest(path, method);
@@ -211,26 +116,22 @@ export default class Api {
return this.makeRequest(path, method, parameters);
}
enableFilter(url) {
const { path, method } = this.FILTERING_ENABLE_FILTER;
const parameter = 'url';
const requestBody = `${parameter}=${url}`;
const config = {
data: requestBody,
header: { 'Content-Type': 'text/plain' },
setFiltersConfig(config) {
const { path, method } = this.FILTERING_CONFIG;
const parameters = {
data: config,
headers: { 'Content-Type': 'application/json' },
};
return this.makeRequest(path, method, config);
return this.makeRequest(path, method, parameters);
}
disableFilter(url) {
const { path, method } = this.FILTERING_DISABLE_FILTER;
const parameter = 'url';
const requestBody = `${parameter}=${url}`;
const config = {
data: requestBody,
header: { 'Content-Type': 'text/plain' },
setFilterUrl(config) {
const { path, method } = this.FILTERING_SET_URL;
const parameters = {
data: config,
headers: { 'Content-Type': 'application/json' },
};
return this.makeRequest(path, method, config);
return this.makeRequest(path, method, parameters);
}
// Parental
@@ -323,6 +224,7 @@ export default class Api {
DHCP_INTERFACES = { path: 'dhcp/interfaces', method: 'GET' };
DHCP_ADD_STATIC_LEASE = { path: 'dhcp/add_static_lease', method: 'POST' };
DHCP_REMOVE_STATIC_LEASE = { path: 'dhcp/remove_static_lease', method: 'POST' };
DHCP_RESET = { path: 'dhcp/reset', method: 'POST' };
getDhcpStatus() {
const { path, method } = this.DHCP_STATUS;
@@ -370,6 +272,11 @@ export default class Api {
return this.makeRequest(path, method, parameters);
}
resetDhcp() {
const { path, method } = this.DHCP_RESET;
return this.makeRequest(path, method);
}
// Installation
INSTALL_GET_ADDRESSES = { path: 'install/get_addresses', method: 'GET' };
INSTALL_CONFIGURE = { path: 'install/configure', method: 'POST' };
@@ -428,6 +335,7 @@ export default class Api {
// Per-client settings
GET_CLIENTS = { path: 'clients', method: 'GET' };
FIND_CLIENTS = { path: 'clients/find', method: 'GET' };
ADD_CLIENT = { path: 'clients/add', method: 'POST' };
DELETE_CLIENT = { path: 'clients/delete', method: 'POST' };
UPDATE_CLIENT = { path: 'clients/update', method: 'POST' };
@@ -464,6 +372,12 @@ export default class Api {
return this.makeRequest(path, method, parameters);
}
findClients(params) {
const { path, method } = this.FIND_CLIENTS;
const url = getPathWithQueryString(path, params);
return this.makeRequest(url, method);
}
// DNS access settings
ACCESS_LIST = { path: 'access/list', method: 'GET' };
ACCESS_SET = { path: 'access/set', method: 'POST' };
@@ -527,4 +441,106 @@ export default class Api {
};
return this.makeRequest(path, method, parameters);
}
// Settings for statistics
GET_STATS = { path: 'stats', method: 'GET' };
STATS_INFO = { path: 'stats_info', method: 'GET' };
STATS_CONFIG = { path: 'stats_config', method: 'POST' };
STATS_RESET = { path: 'stats_reset', method: 'POST' };
getStats() {
const { path, method } = this.GET_STATS;
return this.makeRequest(path, method);
}
getStatsInfo() {
const { path, method } = this.STATS_INFO;
return this.makeRequest(path, method);
}
setStatsConfig(data) {
const { path, method } = this.STATS_CONFIG;
const config = {
data,
headers: { 'Content-Type': 'application/json' },
};
return this.makeRequest(path, method, config);
}
resetStats() {
const { path, method } = this.STATS_RESET;
return this.makeRequest(path, method);
}
// Query log
GET_QUERY_LOG = { path: 'querylog', method: 'GET' };
QUERY_LOG_CONFIG = { path: 'querylog_config', method: 'POST' };
QUERY_LOG_INFO = { path: 'querylog_info', method: 'GET' };
QUERY_LOG_CLEAR = { path: 'querylog_clear', method: 'POST' };
getQueryLog(params) {
const { path, method } = this.GET_QUERY_LOG;
const url = getPathWithQueryString(path, params);
return this.makeRequest(url, method);
}
getQueryLogInfo() {
const { path, method } = this.QUERY_LOG_INFO;
return this.makeRequest(path, method);
}
setQueryLogConfig(data) {
const { path, method } = this.QUERY_LOG_CONFIG;
const config = {
data,
headers: { 'Content-Type': 'application/json' },
};
return this.makeRequest(path, method, config);
}
clearQueryLog() {
const { path, method } = this.QUERY_LOG_CLEAR;
return this.makeRequest(path, method);
}
// Login
LOGIN = { path: 'login', method: 'POST' };
login(data) {
const { path, method } = this.LOGIN;
const config = {
data,
headers: { 'Content-Type': 'application/json' },
};
return this.makeRequest(path, method, config);
}
// Profile
GET_PROFILE = { path: 'profile', method: 'GET' };
getProfile() {
const { path, method } = this.GET_PROFILE;
return this.makeRequest(path, method);
}
// DNS config
GET_DNS_CONFIG = { path: 'dns_info', method: 'GET' };
SET_DNS_CONFIG = { path: 'dns_config', method: 'POST' };
getDnsConfig() {
const { path, method } = this.GET_DNS_CONFIG;
return this.makeRequest(path, method);
}
setDnsConfig(data) {
const { path, method } = this.SET_DNS_CONFIG;
const config = {
data,
headers: { 'Content-Type': 'application/json' },
};
return this.makeRequest(path, method, config);
}
}
const apiClient = new Api();
export default apiClient;

View File

@@ -29,6 +29,7 @@ import UpdateOverlay from '../ui/UpdateOverlay';
import EncryptionTopline from '../ui/EncryptionTopline';
import Icons from '../ui/Icons';
import i18n from '../../i18n';
import Loading from '../ui/Loading';
class App extends Component {
componentDidMount() {
@@ -41,8 +42,8 @@ class App extends Component {
}
}
handleStatusChange = () => {
this.props.enableDns();
reloadPage = () => {
window.location.reload();
};
handleUpdate = () => {
@@ -64,7 +65,7 @@ class App extends Component {
};
render() {
const { dashboard, encryption } = this.props;
const { dashboard, encryption, getVersion } = this.props;
const updateAvailable = dashboard.isCoreRunning && dashboard.isUpdateAvailable;
return (
@@ -88,10 +89,14 @@ class App extends Component {
<LoadingBar className="loading-bar" updateTime={1000} />
<Route component={Header} />
<div className="container container--wrap">
{!dashboard.processing && !dashboard.isCoreRunning && (
{dashboard.processing && <Loading />}
{!dashboard.isCoreRunning && (
<div className="row row-cards">
<div className="col-lg-12">
<Status handleStatusChange={this.handleStatusChange} />
<Status reloadPage={this.reloadPage}
message="dns_start"
/>
<Loading />
</div>
</div>
)}
@@ -109,7 +114,12 @@ class App extends Component {
</Fragment>
)}
</div>
<Footer />
<Footer
dnsVersion={dashboard.dnsVersion}
dnsPort={dashboard.dnsPort}
processingVersion={dashboard.processingVersion}
getVersion={getVersion}
/>
<Toasts />
<Icons />
</Fragment>
@@ -127,6 +137,7 @@ App.propTypes = {
error: PropTypes.string,
changeLanguage: PropTypes.func,
encryption: PropTypes.object,
getVersion: PropTypes.func,
};
export default withNamespaces()(App);

View File

@@ -1,79 +1,77 @@
import React, { Component } from 'react';
import React from 'react';
import ReactTable from 'react-table';
import PropTypes from 'prop-types';
import map from 'lodash/map';
import { withNamespaces, Trans } from 'react-i18next';
import Card from '../ui/Card';
import Cell from '../ui/Cell';
import Popover from '../ui/Popover';
import DomainCell from './DomainCell';
import { getTrackerData } from '../../helpers/trackers/trackers';
import { getPercent } from '../../helpers/helpers';
import { STATUS_COLORS } from '../../helpers/constants';
class BlockedDomains extends Component {
columns = [{
Header: 'IP',
accessor: 'ip',
Cell: (row) => {
const { value } = row;
const trackerData = getTrackerData(value);
const CountCell = totalBlocked =>
function cell(row) {
const { value } = row;
const percent = getPercent(totalBlocked, value);
return (
<div className="logs__row">
<div className="logs__text" title={value}>
{value}
</div>
{trackerData && <Popover data={trackerData} />}
</div>
);
},
}, {
Header: <Trans>requests_count</Trans>,
accessor: 'domain',
maxWidth: 190,
Cell: ({ value }) => {
const {
blockedFiltering,
replacedSafebrowsing,
replacedParental,
} = this.props;
const blocked = blockedFiltering + replacedSafebrowsing + replacedParental;
const percent = getPercent(blocked, value);
return <Cell value={value} percent={percent} color={STATUS_COLORS.red} />;
};
return (
<Cell value={value} percent={percent} color={STATUS_COLORS.red} />
);
},
}];
const BlockedDomains = ({
t,
refreshButton,
topBlockedDomains,
subtitle,
blockedFiltering,
replacedSafebrowsing,
replacedParental,
}) => {
const totalBlocked = blockedFiltering + replacedSafebrowsing + replacedParental;
render() {
const { t } = this.props;
return (
<Card title={ t('top_blocked_domains') } subtitle={ t('for_last_24_hours') } bodyType="card-table" refresh={this.props.refreshButton}>
<ReactTable
data={map(this.props.topBlockedDomains, (value, prop) => (
{ ip: prop, domain: value }
))}
columns={this.columns}
showPagination={false}
noDataText={ t('no_domains_found') }
minRows={6}
className="-striped -highlight card-table-overflow stats__table"
/>
</Card>
);
}
}
return (
<Card
title={t('top_blocked_domains')}
subtitle={subtitle}
bodyType="card-table"
refresh={refreshButton}
>
<ReactTable
data={topBlockedDomains.map(({ name: domain, count }) => ({
domain,
count,
}))}
columns={[
{
Header: <Trans>domain</Trans>,
accessor: 'domain',
Cell: DomainCell,
},
{
Header: <Trans>requests_count</Trans>,
accessor: 'count',
maxWidth: 190,
Cell: CountCell(totalBlocked),
},
]}
showPagination={false}
noDataText={t('no_domains_found')}
minRows={6}
defaultPageSize={100}
className="-striped -highlight card-table-overflow stats__table"
/>
</Card>
);
};
BlockedDomains.propTypes = {
topBlockedDomains: PropTypes.object.isRequired,
topBlockedDomains: PropTypes.array.isRequired,
blockedFiltering: PropTypes.number.isRequired,
replacedSafebrowsing: PropTypes.number.isRequired,
replacedParental: PropTypes.number.isRequired,
refreshButton: PropTypes.node.isRequired,
t: PropTypes.func,
subtitle: PropTypes.string.isRequired,
t: PropTypes.func.isRequired,
};
export default withNamespaces()(BlockedDomains);

View File

@@ -1,87 +1,90 @@
import React, { Component } from 'react';
import React from 'react';
import ReactTable from 'react-table';
import PropTypes from 'prop-types';
import map from 'lodash/map';
import { Trans, withNamespaces } from 'react-i18next';
import Card from '../ui/Card';
import Cell from '../ui/Cell';
import { getPercent, getClientName } from '../../helpers/helpers';
import { getPercent } from '../../helpers/helpers';
import { STATUS_COLORS } from '../../helpers/constants';
import { formatClientCell } from '../../helpers/formatClientCell';
class Clients extends Component {
getPercentColor = (percent) => {
if (percent > 50) {
return STATUS_COLORS.green;
} else if (percent > 10) {
return STATUS_COLORS.yellow;
}
return STATUS_COLORS.red;
const getClientsPercentColor = (percent) => {
if (percent > 50) {
return STATUS_COLORS.green;
} else if (percent > 10) {
return STATUS_COLORS.yellow;
}
return STATUS_COLORS.red;
};
columns = [{
Header: 'IP',
accessor: 'ip',
Cell: ({ value }) => {
const clientName = getClientName(this.props.clients, value)
|| getClientName(this.props.autoClients, value);
let client;
const countCell = dnsQueries =>
function cell(row) {
const { value } = row;
const percent = getPercent(dnsQueries, value);
const percentColor = getClientsPercentColor(percent);
if (clientName) {
client = <span>{clientName} <small>({value})</small></span>;
} else {
client = value;
}
return <Cell value={value} percent={percent} color={percentColor} />;
};
return (
<div className="logs__row logs__row--overflow">
<span className="logs__text" title={value}>
{client}
</span>
</div>
);
},
sortMethod: (a, b) => parseInt(a.replace(/\./g, ''), 10) - parseInt(b.replace(/\./g, ''), 10),
}, {
Header: <Trans>requests_count</Trans>,
accessor: 'count',
Cell: ({ value }) => {
const percent = getPercent(this.props.dnsQueries, value);
const percentColor = this.getPercentColor(percent);
return (
<Cell value={value} percent={percent} color={percentColor} />
);
},
}];
render() {
const { t } = this.props;
const clientCell = t =>
function cell(row) {
return (
<Card title={ t('top_clients') } subtitle={ t('for_last_24_hours') } bodyType="card-table" refresh={this.props.refreshButton}>
<ReactTable
data={map(this.props.topClients, (value, prop) => (
{ ip: prop, count: value }
))}
columns={this.columns}
showPagination={false}
noDataText={ t('no_clients_found') }
minRows={6}
className="-striped -highlight card-table-overflow"
/>
</Card>
<div className="logs__row logs__row--overflow logs__row--column">
{formatClientCell(row, t)}
</div>
);
}
}
};
const Clients = ({
t, refreshButton, topClients, subtitle, dnsQueries,
}) => (
<Card
title={t('top_clients')}
subtitle={subtitle}
bodyType="card-table"
refresh={refreshButton}
>
<ReactTable
data={topClients.map(({ name: ip, count, info }) => ({
ip,
count,
info,
}))}
columns={[
{
Header: 'IP',
accessor: 'ip',
sortMethod: (a, b) =>
parseInt(a.replace(/\./g, ''), 10) - parseInt(b.replace(/\./g, ''), 10),
Cell: clientCell(t),
},
{
Header: <Trans>requests_count</Trans>,
accessor: 'count',
minWidth: 180,
maxWidth: 200,
Cell: countCell(dnsQueries),
},
]}
showPagination={false}
noDataText={t('no_clients_found')}
minRows={6}
defaultPageSize={100}
className="-striped -highlight card-table-overflow"
/>
</Card>
);
Clients.propTypes = {
topClients: PropTypes.object.isRequired,
topClients: PropTypes.array.isRequired,
dnsQueries: PropTypes.number.isRequired,
refreshButton: PropTypes.node.isRequired,
clients: PropTypes.array.isRequired,
autoClients: PropTypes.array.isRequired,
t: PropTypes.func,
subtitle: PropTypes.string.isRequired,
t: PropTypes.func.isRequired,
};
export default withNamespaces()(Clients);

View File

@@ -1,88 +1,116 @@
import React from 'react';
import PropTypes from 'prop-types';
import { Trans, withNamespaces } from 'react-i18next';
import round from 'lodash/round';
import Card from '../ui/Card';
import Tooltip from '../ui/Tooltip';
const tooltipType = 'tooltip-custom--narrow';
const Counters = props => (
<Card title={ props.t('general_statistics') } subtitle={ props.t('for_last_24_hours') } bodyType="card-table" refresh={props.refreshButton}>
<table className="table card-table">
<tbody>
<tr>
<td>
<Trans>dns_query</Trans>
<Tooltip text={ props.t('number_of_dns_query_24_hours') } type={tooltipType} />
</td>
<td className="text-right">
<span className="text-muted">
{props.dnsQueries}
</span>
</td>
</tr>
<tr>
<td>
<a href="#filters">
<Trans>blocked_by</Trans>
</a>
<Tooltip text={ props.t('number_of_dns_query_blocked_24_hours') } type={tooltipType} />
</td>
<td className="text-right">
<span className="text-muted">
{props.blockedFiltering}
</span>
</td>
</tr>
<tr>
<td>
<Trans>stats_malware_phishing</Trans>
<Tooltip text={ props.t('number_of_dns_query_blocked_24_hours_by_sec') } type={tooltipType} />
</td>
<td className="text-right">
<span className="text-muted">
{props.replacedSafebrowsing}
</span>
</td>
</tr>
<tr>
<td>
<Trans>stats_adult</Trans>
<Tooltip text={ props.t('number_of_dns_query_blocked_24_hours_adult') } type={tooltipType} />
</td>
<td className="text-right">
<span className="text-muted">
{props.replacedParental}
</span>
</td>
</tr>
<tr>
<td>
<Trans>enforced_save_search</Trans>
<Tooltip text={ props.t('number_of_dns_query_to_safe_search') } type={tooltipType} />
</td>
<td className="text-right">
<span className="text-muted">
{props.replacedSafesearch}
</span>
</td>
</tr>
<tr>
<td>
<Trans>average_processing_time</Trans>
<Tooltip text={ props.t('average_processing_time_hint') } type={tooltipType} />
</td>
<td className="text-right">
<span className="text-muted">
{props.avgProcessingTime}
</span>
</td>
</tr>
</tbody>
</table>
</Card>
);
const Counters = (props) => {
const {
t,
interval,
refreshButton,
subtitle,
dnsQueries,
blockedFiltering,
replacedSafebrowsing,
replacedParental,
replacedSafesearch,
avgProcessingTime,
} = props;
const tooltipTitle =
interval === 1
? t('number_of_dns_query_24_hours')
: t('number_of_dns_query_days', { count: interval });
return (
<Card
title={t('general_statistics')}
subtitle={subtitle}
bodyType="card-table"
refresh={refreshButton}
>
<table className="table card-table">
<tbody>
<tr>
<td>
<Trans>dns_query</Trans>
<Tooltip text={tooltipTitle} type={tooltipType} />
</td>
<td className="text-right">
<span className="text-muted">{dnsQueries}</span>
</td>
</tr>
<tr>
<td>
<Trans components={[<a href="#filters" key="0">link</a>]}>
blocked_by
</Trans>
<Tooltip
text={t('number_of_dns_query_blocked_24_hours')}
type={tooltipType}
/>
</td>
<td className="text-right">
<span className="text-muted">{blockedFiltering}</span>
</td>
</tr>
<tr>
<td>
<Trans>stats_malware_phishing</Trans>
<Tooltip
text={t('number_of_dns_query_blocked_24_hours_by_sec')}
type={tooltipType}
/>
</td>
<td className="text-right">
<span className="text-muted">{replacedSafebrowsing}</span>
</td>
</tr>
<tr>
<td>
<Trans>stats_adult</Trans>
<Tooltip
text={t('number_of_dns_query_blocked_24_hours_adult')}
type={tooltipType}
/>
</td>
<td className="text-right">
<span className="text-muted">{replacedParental}</span>
</td>
</tr>
<tr>
<td>
<Trans>enforced_save_search</Trans>
<Tooltip
text={t('number_of_dns_query_to_safe_search')}
type={tooltipType}
/>
</td>
<td className="text-right">
<span className="text-muted">{replacedSafesearch}</span>
</td>
</tr>
<tr>
<td>
<Trans>average_processing_time</Trans>
<Tooltip text={t('average_processing_time_hint')} type={tooltipType} />
</td>
<td className="text-right">
<span className="text-muted">
{avgProcessingTime ? `${round(avgProcessingTime)} ms` : 0}
</span>
</td>
</tr>
</tbody>
</table>
</Card>
);
};
Counters.propTypes = {
dnsQueries: PropTypes.number.isRequired,
@@ -92,6 +120,8 @@ Counters.propTypes = {
replacedSafesearch: PropTypes.number.isRequired,
avgProcessingTime: PropTypes.number.isRequired,
refreshButton: PropTypes.node.isRequired,
subtitle: PropTypes.string.isRequired,
interval: PropTypes.number.isRequired,
t: PropTypes.func.isRequired,
};

View File

@@ -1,10 +1,11 @@
.stats__table .popover__body {
left: 0;
left: -10px;
min-width: 270px;
transform: none;
}
.stats__table .popover__body:after {
left: 13px;
left: 23px;
}
.stats__table .rt-tr-group:first-child .popover__body,
@@ -20,3 +21,8 @@
border-top: 6px solid transparent;
border-bottom: 6px solid #585965;
}
.card-chart-bg {
left: -20px;
width: calc(100% + 20px);
}

View File

@@ -0,0 +1,24 @@
import React from 'react';
import PropTypes from 'prop-types';
import { getTrackerData } from '../../helpers/trackers/trackers';
import Popover from '../ui/Popover';
const DomainCell = ({ value }) => {
const trackerData = getTrackerData(value);
return (
<div className="logs__row">
<div className="logs__text logs__text--domain" title={value}>
{value}
</div>
{trackerData && <Popover data={trackerData} />}
</div>
);
};
DomainCell.propTypes = {
value: PropTypes.string.isRequired,
};
export default DomainCell;

View File

@@ -1,81 +1,75 @@
import React, { Component } from 'react';
import React from 'react';
import ReactTable from 'react-table';
import PropTypes from 'prop-types';
import map from 'lodash/map';
import { withNamespaces, Trans } from 'react-i18next';
import Card from '../ui/Card';
import Cell from '../ui/Cell';
import Popover from '../ui/Popover';
import DomainCell from './DomainCell';
import { getTrackerData } from '../../helpers/trackers/trackers';
import { getPercent } from '../../helpers/helpers';
import { STATUS_COLORS } from '../../helpers/constants';
import { getPercent } from '../../helpers/helpers';
class QueriedDomains extends Component {
getPercentColor = (percent) => {
if (percent > 10) {
return STATUS_COLORS.red;
} else if (percent > 5) {
return STATUS_COLORS.yellow;
}
return STATUS_COLORS.green;
const getQueriedPercentColor = (percent) => {
if (percent > 10) {
return STATUS_COLORS.red;
} else if (percent > 5) {
return STATUS_COLORS.yellow;
}
return STATUS_COLORS.green;
};
columns = [{
Header: 'IP',
accessor: 'ip',
Cell: (row) => {
const { value } = row;
const trackerData = getTrackerData(value);
const countCell = dnsQueries =>
function cell(row) {
const { value } = row;
const percent = getPercent(dnsQueries, value);
const percentColor = getQueriedPercentColor(percent);
return (
<div className="logs__row">
<div className="logs__text" title={value}>
{value}
</div>
{trackerData && <Popover data={trackerData} />}
</div>
);
},
}, {
Header: <Trans>requests_count</Trans>,
accessor: 'count',
maxWidth: 190,
Cell: ({ value }) => {
const percent = getPercent(this.props.dnsQueries, value);
const percentColor = this.getPercentColor(percent);
return <Cell value={value} percent={percent} color={percentColor} />;
};
return (
<Cell value={value} percent={percent} color={percentColor} />
);
},
}];
render() {
const { t } = this.props;
return (
<Card title={ t('stats_query_domain') } subtitle={ t('for_last_24_hours') } bodyType="card-table" refresh={this.props.refreshButton}>
<ReactTable
data={map(this.props.topQueriedDomains, (value, prop) => (
{ ip: prop, count: value }
))}
columns={this.columns}
showPagination={false}
noDataText={ t('no_domains_found') }
minRows={6}
className="-striped -highlight card-table-overflow stats__table"
/>
</Card>
);
}
}
const QueriedDomains = ({
t, refreshButton, topQueriedDomains, subtitle, dnsQueries,
}) => (
<Card
title={t('stats_query_domain')}
subtitle={subtitle}
bodyType="card-table"
refresh={refreshButton}
>
<ReactTable
data={topQueriedDomains.map(({ name: domain, count }) => ({
domain,
count,
}))}
columns={[
{
Header: <Trans>domain</Trans>,
accessor: 'domain',
Cell: DomainCell,
},
{
Header: <Trans>requests_count</Trans>,
accessor: 'count',
maxWidth: 190,
Cell: countCell(dnsQueries),
},
]}
showPagination={false}
noDataText={t('no_domains_found')}
minRows={6}
defaultPageSize={100}
className="-striped -highlight card-table-overflow stats__table"
/>
</Card>
);
QueriedDomains.propTypes = {
topQueriedDomains: PropTypes.object.isRequired,
topQueriedDomains: PropTypes.array.isRequired,
dnsQueries: PropTypes.number.isRequired,
refreshButton: PropTypes.node.isRequired,
t: PropTypes.func,
subtitle: PropTypes.string.isRequired,
t: PropTypes.func.isRequired,
};
export default withNamespaces()(QueriedDomains);

View File

@@ -1,111 +1,78 @@
import React, { Component } from 'react';
import React from 'react';
import PropTypes from 'prop-types';
import { Trans, withNamespaces } from 'react-i18next';
import { withNamespaces, Trans } from 'react-i18next';
import Card from '../ui/Card';
import Line from '../ui/Line';
import StatsCard from './StatsCard';
import { getPercent, normalizeHistory } from '../../helpers/helpers';
import { getPercent } from '../../helpers/helpers';
import { STATUS_COLORS } from '../../helpers/constants';
const getNormalizedHistory = (data, interval, id) => [
{ data: normalizeHistory(data, interval), id },
];
class Statistics extends Component {
render() {
const {
dnsQueries,
blockedFiltering,
replacedSafebrowsing,
replacedParental,
} = this.props;
const filteringData = [this.props.history[1]];
const queriesData = [this.props.history[2]];
const parentalData = [this.props.history[3]];
const safebrowsingData = [this.props.history[4]];
return (
<div className="row">
<div className="col-sm-6 col-lg-3">
<Card type="card--full" bodyType="card-wrap">
<div className="card-body-stats">
<div className="card-value card-value-stats text-blue">
{dnsQueries}
</div>
<div className="card-title-stats">
<Trans>dns_query</Trans>
</div>
</div>
<div className="card-chart-bg">
<Line data={queriesData} color={STATUS_COLORS.blue}/>
</div>
</Card>
</div>
<div className="col-sm-6 col-lg-3">
<Card type="card--full" bodyType="card-wrap">
<div className="card-body-stats">
<div className="card-value card-value-stats text-red">
{blockedFiltering}
</div>
<div className="card-value card-value-percent text-red">
{getPercent(dnsQueries, blockedFiltering)}
</div>
<div className="card-title-stats">
<a href="#filters">
<Trans>blocked_by</Trans>
</a>
</div>
</div>
<div className="card-chart-bg">
<Line data={filteringData} color={STATUS_COLORS.red}/>
</div>
</Card>
</div>
<div className="col-sm-6 col-lg-3">
<Card type="card--full" bodyType="card-wrap">
<div className="card-body-stats">
<div className="card-value card-value-stats text-green">
{replacedSafebrowsing}
</div>
<div className="card-value card-value-percent text-green">
{getPercent(dnsQueries, replacedSafebrowsing)}
</div>
<div className="card-title-stats">
<Trans>stats_malware_phishing</Trans>
</div>
</div>
<div className="card-chart-bg">
<Line data={safebrowsingData} color={STATUS_COLORS.green}/>
</div>
</Card>
</div>
<div className="col-sm-6 col-lg-3">
<Card type="card--full" bodyType="card-wrap">
<div className="card-body-stats">
<div className="card-value card-value-stats text-yellow">
{replacedParental}
</div>
<div className="card-value card-value-percent text-yellow">
{getPercent(dnsQueries, replacedParental)}
</div>
<div className="card-title-stats">
<Trans>stats_adult</Trans>
</div>
</div>
<div className="card-chart-bg">
<Line data={parentalData} color={STATUS_COLORS.yellow}/>
</div>
</Card>
</div>
</div>
);
}
}
const Statistics = ({
interval,
dnsQueries,
blockedFiltering,
replacedSafebrowsing,
replacedParental,
numDnsQueries,
numBlockedFiltering,
numReplacedSafebrowsing,
numReplacedParental,
}) => (
<div className="row">
<div className="col-sm-6 col-lg-3">
<StatsCard
total={numDnsQueries}
lineData={getNormalizedHistory(dnsQueries, interval, 'dnsQuery')}
title={<Trans>dns_query</Trans>}
color="blue"
/>
</div>
<div className="col-sm-6 col-lg-3">
<StatsCard
total={numBlockedFiltering}
lineData={getNormalizedHistory(blockedFiltering, interval, 'blockedFiltering')}
percent={getPercent(numDnsQueries, numBlockedFiltering)}
title={<Trans components={[<a href="#filters" key="0">link</a>]}>blocked_by</Trans>}
color="red"
/>
</div>
<div className="col-sm-6 col-lg-3">
<StatsCard
total={numReplacedSafebrowsing}
lineData={getNormalizedHistory(
replacedSafebrowsing,
interval,
'replacedSafebrowsing',
)}
percent={getPercent(numDnsQueries, numReplacedSafebrowsing)}
title={<Trans>stats_malware_phishing</Trans>}
color="green"
/>
</div>
<div className="col-sm-6 col-lg-3">
<StatsCard
total={numReplacedParental}
lineData={getNormalizedHistory(replacedParental, interval, 'replacedParental')}
percent={getPercent(numDnsQueries, numReplacedParental)}
title={<Trans>stats_adult</Trans>}
color="yellow"
/>
</div>
</div>
);
Statistics.propTypes = {
history: PropTypes.array.isRequired,
dnsQueries: PropTypes.number.isRequired,
blockedFiltering: PropTypes.number.isRequired,
replacedSafebrowsing: PropTypes.number.isRequired,
replacedParental: PropTypes.number.isRequired,
interval: PropTypes.number.isRequired,
dnsQueries: PropTypes.array.isRequired,
blockedFiltering: PropTypes.array.isRequired,
replacedSafebrowsing: PropTypes.array.isRequired,
replacedParental: PropTypes.array.isRequired,
numDnsQueries: PropTypes.number.isRequired,
numBlockedFiltering: PropTypes.number.isRequired,
numReplacedSafebrowsing: PropTypes.number.isRequired,
numReplacedParental: PropTypes.number.isRequired,
refreshButton: PropTypes.node.isRequired,
};

View File

@@ -0,0 +1,31 @@
import React from 'react';
import PropTypes from 'prop-types';
import { STATUS_COLORS } from '../../helpers/constants';
import Card from '../ui/Card';
import Line from '../ui/Line';
const StatsCard = ({
total, lineData, percent, title, color,
}) => (
<Card type="card--full" bodyType="card-wrap">
<div className="card-body-stats">
<div className={`card-value card-value-stats text-${color}`}>{total}</div>
<div className="card-title-stats">{title}</div>
</div>
{percent >= 0 && (<div className={`card-value card-value-percent text-${color}`}>{percent}</div>)}
<div className="card-chart-bg">
<Line data={lineData} color={STATUS_COLORS[color]} />
</div>
</Card>
);
StatsCard.propTypes = {
total: PropTypes.number.isRequired,
lineData: PropTypes.array.isRequired,
title: PropTypes.object.isRequired,
color: PropTypes.string.isRequired,
percent: PropTypes.number,
};
export default StatsCard;

View File

@@ -19,10 +19,8 @@ class Dashboard extends Component {
getAllStats = () => {
this.props.getStats();
this.props.getStatsHistory();
this.props.getTopStats();
this.props.getClients();
}
this.props.getStatsConfig();
};
getToggleFilteringButton = () => {
const { protectionEnabled, processingProtection } = this.props.dashboard;
@@ -39,16 +37,16 @@ class Dashboard extends Component {
<Trans>{buttonText}</Trans>
</button>
);
}
};
render() {
const { dashboard, t } = this.props;
const dashboardProcessing =
dashboard.processing ||
dashboard.processingStats ||
dashboard.processingStatsHistory ||
dashboard.processingClients ||
dashboard.processingTopStats;
const { dashboard, stats, t } = this.props;
const statsProcessing = stats.processingStats || stats.processingGetConfig;
const subtitle =
stats.interval === 1
? t('for_last_24_hours')
: t('for_last_days', { count: stats.interval });
const refreshFullButton = (
<button
@@ -59,6 +57,7 @@ class Dashboard extends Component {
<Trans>refresh_statics</Trans>
</button>
);
const refreshButton = (
<button
type="button"
@@ -73,87 +72,85 @@ class Dashboard extends Component {
return (
<Fragment>
<PageTitle title={ t('dashboard') }>
<PageTitle title={t('dashboard')}>
<div className="page-title__actions">
{this.getToggleFilteringButton()}
{refreshFullButton}
</div>
</PageTitle>
{dashboardProcessing && <Loading />}
{!dashboardProcessing &&
{statsProcessing && <Loading />}
{!statsProcessing && (
<div className="row row-cards">
{dashboard.statsHistory &&
<div className="col-lg-12">
<Statistics
history={dashboard.statsHistory}
refreshButton={refreshButton}
dnsQueries={dashboard.stats.dns_queries}
blockedFiltering={dashboard.stats.blocked_filtering}
replacedSafebrowsing={dashboard.stats.replaced_safebrowsing}
replacedParental={dashboard.stats.replaced_parental}
/>
</div>
}
<div className="col-lg-6">
{dashboard.stats &&
<Counters
refreshButton={refreshButton}
dnsQueries={dashboard.stats.dns_queries}
blockedFiltering={dashboard.stats.blocked_filtering}
replacedSafebrowsing={dashboard.stats.replaced_safebrowsing}
replacedParental={dashboard.stats.replaced_parental}
replacedSafesearch={dashboard.stats.replaced_safesearch}
avgProcessingTime={dashboard.stats.avg_processing_time}
/>
}
<div className="col-lg-12">
<Statistics
interval={stats.interval}
dnsQueries={stats.dnsQueries}
blockedFiltering={stats.blockedFiltering}
replacedSafebrowsing={stats.replacedSafebrowsing}
replacedParental={stats.replacedParental}
numDnsQueries={stats.numDnsQueries}
numBlockedFiltering={stats.numBlockedFiltering}
numReplacedSafebrowsing={stats.numReplacedSafebrowsing}
numReplacedParental={stats.numReplacedParental}
refreshButton={refreshButton}
/>
</div>
<div className="col-lg-6">
<Counters
subtitle={subtitle}
interval={stats.interval}
dnsQueries={stats.numDnsQueries}
blockedFiltering={stats.numBlockedFiltering}
replacedSafebrowsing={stats.numReplacedSafebrowsing}
replacedParental={stats.numReplacedParental}
replacedSafesearch={stats.numReplacedSafesearch}
avgProcessingTime={stats.avgProcessingTime}
refreshButton={refreshButton}
/>
</div>
<div className="col-lg-6">
<Clients
subtitle={subtitle}
dnsQueries={stats.numDnsQueries}
topClients={stats.topClients}
clients={dashboard.clients}
autoClients={dashboard.autoClients}
refreshButton={refreshButton}
/>
</div>
<div className="col-lg-6">
<QueriedDomains
subtitle={subtitle}
dnsQueries={stats.numDnsQueries}
topQueriedDomains={stats.topQueriedDomains}
refreshButton={refreshButton}
/>
</div>
<div className="col-lg-6">
<BlockedDomains
subtitle={subtitle}
topBlockedDomains={stats.topBlockedDomains}
blockedFiltering={stats.numBlockedFiltering}
replacedSafebrowsing={stats.numReplacedSafebrowsing}
replacedParental={stats.numReplacedParental}
refreshButton={refreshButton}
/>
</div>
{dashboard.topStats &&
<Fragment>
<div className="col-lg-6">
<Clients
dnsQueries={dashboard.stats.dns_queries}
refreshButton={refreshButton}
topClients={dashboard.topStats.top_clients}
clients={dashboard.clients}
autoClients={dashboard.autoClients}
/>
</div>
<div className="col-lg-6">
<QueriedDomains
dnsQueries={dashboard.stats.dns_queries}
refreshButton={refreshButton}
topQueriedDomains={dashboard.topStats.top_queried_domains}
/>
</div>
<div className="col-lg-6">
<BlockedDomains
refreshButton={refreshButton}
topBlockedDomains={dashboard.topStats.top_blocked_domains}
blockedFiltering={dashboard.stats.blocked_filtering}
replacedSafebrowsing={dashboard.stats.replaced_safebrowsing}
replacedParental={dashboard.stats.replaced_parental}
/>
</div>
</Fragment>
}
</div>
}
)}
</Fragment>
);
}
}
Dashboard.propTypes = {
getStats: PropTypes.func,
getStatsHistory: PropTypes.func,
getTopStats: PropTypes.func,
dashboard: PropTypes.object,
isCoreRunning: PropTypes.bool,
getFiltering: PropTypes.func,
toggleProtection: PropTypes.func,
getClients: PropTypes.func,
processingProtection: PropTypes.bool,
t: PropTypes.func,
dashboard: PropTypes.object.isRequired,
stats: PropTypes.object.isRequired,
getStats: PropTypes.func.isRequired,
getStatsConfig: PropTypes.func.isRequired,
toggleProtection: PropTypes.func.isRequired,
getClients: PropTypes.func.isRequired,
t: PropTypes.func.isRequired,
};
export default withNamespaces()(Dashboard);

View File

@@ -21,11 +21,7 @@ class Modal extends Component {
handleUrlChange = async (e) => {
const { value: url } = e.currentTarget;
if (this.isUrlValid(url)) {
this.setState(...this.state, { url, isUrlValid: true });
} else {
this.setState(...this.state, { url, isUrlValid: false });
}
this.setState(...this.state, { url, isUrlValid: this.isUrlValid(url) });
};
handleNameChange = (e) => {
@@ -33,27 +29,13 @@ class Modal extends Component {
this.setState({ ...this.state, name });
};
handleNext = () => {
this.props.addFilter(this.state.url, this.state.name);
setTimeout(() => {
if (this.props.isFilterAdded) {
this.closeModal();
}
}, 2000);
};
closeModal = () => {
this.props.toggleModal();
this.setState({ ...this.state, ...initialState });
}
};
render() {
const {
isOpen,
title,
inputDescription,
processingAddFilter,
} = this.props;
const { isOpen, processingAddFilter } = this.props;
const { isUrlValid, url, name } = this.state;
const inputUrlClass = classnames({
'form-control mb-2': true,
@@ -64,28 +46,7 @@ class Modal extends Component {
'form-control mb-2': true,
'is-valid': name.length > 0,
});
const renderBody = () => {
if (!this.props.isFilterAdded) {
return (
<React.Fragment>
<input type="text" className={inputNameClass} placeholder={this.props.t('enter_name_hint')} onChange={this.handleNameChange} />
<input type="text" className={inputUrlClass} placeholder={this.props.t('enter_url_hint')} onChange={this.handleUrlChange} />
{inputDescription &&
<div className="description">
{inputDescription}
</div>}
</React.Fragment>
);
}
return (
<div className="description">
<Trans>url_added_successfully</Trans>
</div>
);
};
const isValidForSubmit = !(url.length > 0 && isUrlValid && name.length > 0);
const isValidForSubmit = url.length > 0 && isUrlValid && name.length > 0;
return (
<ReactModal
@@ -96,35 +57,47 @@ class Modal extends Component {
>
<div className="modal-content">
<div className="modal-header">
<h4 className="modal-title">
{title}
</h4>
<button type="button" className="close" onClick={this.closeModal}>
<span className="sr-only">Close</span>
</button>
<h4 className="modal-title">
<Trans>new_filter_btn</Trans>
</h4>
<button type="button" className="close" onClick={this.closeModal}>
<span className="sr-only">Close</span>
</button>
</div>
<div className="modal-body">
{renderBody()}
</div>
{!this.props.isFilterAdded &&
<div className="modal-footer">
<button
type="button"
className="btn btn-secondary"
onClick={this.closeModal}
>
<Trans>cancel_btn</Trans>
</button>
<button
type="button"
className="btn btn-success"
onClick={this.handleNext}
disabled={isValidForSubmit || processingAddFilter}
>
<Trans>add_filter_btn</Trans>
</button>
<input
type="text"
className={inputNameClass}
placeholder={this.props.t('enter_name_hint')}
onChange={this.handleNameChange}
/>
<input
type="text"
className={inputUrlClass}
placeholder={this.props.t('enter_url_hint')}
onChange={this.handleUrlChange}
/>
<div className="description">
<Trans>enter_valid_filter_url</Trans>
</div>
}
</div>
<div className="modal-footer">
<button
type="button"
className="btn btn-secondary"
onClick={this.closeModal}
>
<Trans>cancel_btn</Trans>
</button>
<button
type="button"
className="btn btn-success"
onClick={() => this.props.addFilter(url, name)}
disabled={!isValidForSubmit || processingAddFilter}
>
<Trans>add_filter_btn</Trans>
</button>
</div>
</div>
</ReactModal>
);
@@ -134,12 +107,10 @@ class Modal extends Component {
Modal.propTypes = {
toggleModal: PropTypes.func.isRequired,
isOpen: PropTypes.bool.isRequired,
title: PropTypes.string.isRequired,
inputDescription: PropTypes.string,
addFilter: PropTypes.func.isRequired,
isFilterAdded: PropTypes.bool,
processingAddFilter: PropTypes.bool,
t: PropTypes.func,
isFilterAdded: PropTypes.bool.isRequired,
processingAddFilter: PropTypes.bool.isRequired,
t: PropTypes.func.isRequired,
};
export default withNamespaces()(Modal);

View File

@@ -15,13 +15,13 @@ class UserRules extends Component {
};
render() {
const { t } = this.props;
const { t, userRules } = this.props;
return (
<Card title={t('custom_filter_rules')} subtitle={t('custom_filter_rules_hint')}>
<form onSubmit={this.handleSubmit}>
<textarea
className="form-control form-control--textarea-large"
value={this.props.userRules}
value={userRules}
onChange={this.handleChange}
/>
<div className="card-actions">
@@ -39,50 +39,57 @@ class UserRules extends Component {
<Trans>examples_title</Trans>:
<ol className="leading-loose">
<li>
<code>||example.org^</code> {t('example_meaning_filter_block')}
<code>||example.org^</code> &nbsp;
<Trans>example_meaning_filter_block</Trans>
</li>
<li>
<code> @@||example.org^</code> {t('example_meaning_filter_whitelist')}
<code> @@||example.org^</code> &nbsp;
<Trans>example_meaning_filter_whitelist</Trans>
</li>
<li>
<code>127.0.0.1 example.org</code> {t('example_meaning_host_block')}
<code>127.0.0.1 example.org</code> &nbsp;
<Trans>example_meaning_host_block</Trans>
</li>
<li>
<code>{t('example_comment')}</code> {t('example_comment_meaning')}
<code><Trans>example_comment</Trans></code> &nbsp;
<Trans>example_comment_meaning</Trans>
</li>
<li>
<code>{t('example_comment_hash')}</code> &nbsp;
{t('example_comment_meaning')}
<code><Trans>example_comment_hash</Trans></code> &nbsp;
<Trans>example_comment_meaning</Trans>
</li>
<li>
<code>/REGEX/</code> &nbsp;
<Trans
components={[
<a
href="https://kb.adguard.com/general/dns-filtering-syntax"
target="_blank"
rel="noopener noreferrer"
key="0"
>
link
</a>,
]}
>
example_regex_meaning
</Trans>
<Trans>example_regex_meaning</Trans>
</li>
</ol>
</div>
<p className="mt-1">
<Trans
components={[
<a
href="https://github.com/AdguardTeam/AdGuardHome/wiki/Hosts-Blocklists"
target="_blank"
rel="noopener noreferrer"
key="0"
>
link
</a>,
]}
>
filtering_rules_learn_more
</Trans>
</p>
</Card>
);
}
}
UserRules.propTypes = {
userRules: PropTypes.string,
handleRulesChange: PropTypes.func,
handleRulesSubmit: PropTypes.func,
t: PropTypes.func,
userRules: PropTypes.string.isRequired,
handleRulesChange: PropTypes.func.isRequired,
handleRulesSubmit: PropTypes.func.isRequired,
t: PropTypes.func.isRequired,
};
export default withNamespaces()(UserRules);

View File

@@ -1,11 +1,13 @@
import React, { Component } from 'react';
import React, { Component, Fragment } from 'react';
import ReactTable from 'react-table';
import PropTypes from 'prop-types';
import { Trans, withNamespaces } from 'react-i18next';
import Modal from './Modal';
import PageTitle from '../ui/PageTitle';
import Card from '../ui/Card';
import CellWrap from '../ui/CellWrap';
import UserRules from './UserRules';
import Modal from './Modal';
class Filters extends Component {
componentDidMount() {
@@ -20,14 +22,19 @@ class Filters extends Component {
this.props.setRules(this.props.filtering.userRules);
};
renderCheckbox = (row) => {
const { url } = row.original;
const { filters } = this.props.filtering;
const filter = filters.filter(filter => filter.url === url)[0];
renderCheckbox = ({ original }) => {
const { processingConfigFilter } = this.props.filtering;
const { url, enabled } = original;
return (
<label className="checkbox">
<input type="checkbox" className="checkbox__input" onChange={() => this.props.toggleFilterStatus(filter.url)} checked={filter.enabled}/>
<span className="checkbox__label"/>
<input
type="checkbox"
className="checkbox__input"
onChange={() => this.props.toggleFilterStatus(url, enabled)}
checked={enabled}
disabled={processingConfigFilter}
/>
<span className="checkbox__label" />
</label>
);
};
@@ -37,92 +44,131 @@ class Filters extends Component {
if (window.confirm(this.props.t('filter_confirm_delete'))) {
this.props.removeFilter({ url });
}
}
};
columns = [{
Header: <Trans>enabled_table_header</Trans>,
accessor: 'enabled',
Cell: this.renderCheckbox,
width: 90,
className: 'text-center',
}, {
Header: <Trans>name_table_header</Trans>,
accessor: 'name',
Cell: ({ value }) => (<div className="logs__row logs__row--overflow"><span className="logs__text" title={value}>{value}</span></div>),
}, {
Header: <Trans>filter_url_table_header</Trans>,
accessor: 'url',
Cell: ({ value }) => (<div className="logs__row logs__row--overflow"><a href={value} target='_blank' rel='noopener noreferrer' className="link logs__text">{value}</a></div>),
}, {
Header: <Trans>rules_count_table_header</Trans>,
accessor: 'rulesCount',
className: 'text-center',
Cell: props => props.value.toLocaleString(),
}, {
Header: <Trans>last_time_updated_table_header</Trans>,
accessor: 'lastUpdated',
className: 'text-center',
}, {
Header: <Trans>actions_table_header</Trans>,
accessor: 'url',
Cell: ({ value }) => (
<button
type="button"
className="btn btn-icon btn-outline-secondary btn-sm"
onClick={() => this.handleDelete(value)}
title={this.props.t('delete_table_action')}
>
<svg className="icons">
<use xlinkHref="#delete" />
</svg>
</button>
),
className: 'text-center',
width: 80,
sortable: false,
},
columns = [
{
Header: <Trans>enabled_table_header</Trans>,
accessor: 'enabled',
Cell: this.renderCheckbox,
width: 90,
className: 'text-center',
},
{
Header: <Trans>name_table_header</Trans>,
accessor: 'name',
minWidth: 200,
Cell: CellWrap,
},
{
Header: <Trans>filter_url_table_header</Trans>,
accessor: 'url',
minWidth: 200,
Cell: ({ value }) => (
<div className="logs__row logs__row--overflow">
<a
href={value}
target="_blank"
rel="noopener noreferrer"
className="link logs__text"
>
{value}
</a>
</div>
),
},
{
Header: <Trans>rules_count_table_header</Trans>,
accessor: 'rulesCount',
className: 'text-center',
minWidth: 100,
Cell: props => props.value.toLocaleString(),
},
{
Header: <Trans>last_time_updated_table_header</Trans>,
accessor: 'lastUpdated',
className: 'text-center',
minWidth: 150,
Cell: CellWrap,
},
{
Header: <Trans>actions_table_header</Trans>,
accessor: 'url',
Cell: ({ value }) => (
<button
type="button"
className="btn btn-icon btn-outline-secondary btn-sm"
onClick={() => this.handleDelete(value)}
title={this.props.t('delete_table_action')}
>
<svg className="icons">
<use xlinkHref="#delete" />
</svg>
</button>
),
className: 'text-center',
width: 80,
sortable: false,
},
];
render() {
const { t } = this.props;
const { filters, userRules, processingRefreshFilters } = this.props.filtering;
const {
filtering, t, toggleFilteringModal, refreshFilters, addFilter,
} = this.props;
const {
filters,
userRules,
isModalOpen,
isFilterAdded,
processingRefreshFilters,
processingRemoveFilter,
processingAddFilter,
processingFilters,
} = filtering;
return (
<div>
<PageTitle title={ t('filters') } />
<Fragment>
<PageTitle title={t('filters')} />
<div className="content">
<div className="row">
<div className="col-md-12">
<Card
title={ t('filters_and_hosts') }
subtitle={ t('filters_and_hosts_hint') }
title={t('filters_and_hosts')}
subtitle={t('filters_and_hosts_hint')}
>
<ReactTable
data={filters}
columns={this.columns}
showPagination={true}
defaultPageSize={10}
loading={
processingFilters ||
processingAddFilter ||
processingRemoveFilter ||
processingRefreshFilters
}
minRows={4}
// Text
previousText={ t('previous_btn') }
nextText={ t('next_btn') }
loadingText={ t('loading_table_status') }
pageText={ t('page_table_footer_text') }
ofText={ t('of_table_footer_text') }
rowsText={ t('rows_table_footer_text') }
noDataText={ t('no_filters_added') }
previousText={t('previous_btn')}
nextText={t('next_btn')}
loadingText={t('loading_table_status')}
pageText={t('page_table_footer_text')}
ofText="/"
rowsText={t('rows_table_footer_text')}
noDataText={t('no_filters_added')}
/>
<div className="card-actions">
<button
className="btn btn-success btn-standard mr-2"
type="submit"
onClick={this.props.toggleFilteringModal}
onClick={toggleFilteringModal}
>
<Trans>add_filter_btn</Trans>
</button>
<button
className="btn btn-primary btn-standard"
type="submit"
onClick={this.props.refreshFilters}
onClick={refreshFilters}
disabled={processingRefreshFilters}
>
<Trans>check_updates_btn</Trans>
@@ -140,15 +186,13 @@ class Filters extends Component {
</div>
</div>
<Modal
isOpen={this.props.filtering.isFilteringModalOpen}
toggleModal={this.props.toggleFilteringModal}
addFilter={this.props.addFilter}
isFilterAdded={this.props.filtering.isFilterAdded}
processingAddFilter={this.props.filtering.processingAddFilter}
title={ t('new_filter_btn') }
inputDescription={ t('enter_valid_filter_url') }
isOpen={isModalOpen}
toggleModal={toggleFilteringModal}
addFilter={addFilter}
isFilterAdded={isFilterAdded}
processingAddFilter={processingAddFilter}
/>
</div>
</Fragment>
);
}
}
@@ -157,12 +201,15 @@ Filters.propTypes = {
setRules: PropTypes.func,
getFilteringStatus: PropTypes.func.isRequired,
filtering: PropTypes.shape({
userRules: PropTypes.string,
filters: PropTypes.array,
isFilteringModalOpen: PropTypes.bool.isRequired,
isFilterAdded: PropTypes.bool,
processingAddFilter: PropTypes.bool,
processingRefreshFilters: PropTypes.bool,
userRules: PropTypes.string.isRequired,
filters: PropTypes.array.isRequired,
isModalOpen: PropTypes.bool.isRequired,
isFilterAdded: PropTypes.bool.isRequired,
processingFilters: PropTypes.bool.isRequired,
processingAddFilter: PropTypes.bool.isRequired,
processingRefreshFilters: PropTypes.bool.isRequired,
processingConfigFilter: PropTypes.bool.isRequired,
processingRemoveFilter: PropTypes.bool.isRequired,
}),
removeFilter: PropTypes.func.isRequired,
toggleFilterStatus: PropTypes.func.isRequired,
@@ -170,8 +217,7 @@ Filters.propTypes = {
toggleFilteringModal: PropTypes.func.isRequired,
handleRulesChange: PropTypes.func.isRequired,
refreshFilters: PropTypes.func.isRequired,
t: PropTypes.func,
t: PropTypes.func.isRequired,
};
export default withNamespaces()(Filters);

View File

@@ -29,6 +29,7 @@
.nav-tabs .nav-link {
width: 100%;
border: 0;
padding: 20px 0;
}
.header {
@@ -68,42 +69,8 @@
overflow: hidden;
}
.nav-version {
padding: 7px 0;
font-size: 0.80rem;
text-align: right;
}
.nav-version__value {
max-width: 110px;
font-weight: 600;
text-overflow: ellipsis;
white-space: nowrap;
overflow: hidden;
}
@media screen and (min-width: 992px) {
.nav-version__value {
max-width: 100%;
overflow: visible;
}
}
.nav-version__link {
position: relative;
display: inline-block;
border-bottom: 1px dashed #495057;
cursor: pointer;
}
.nav-version__text {
display: flex;
align-items: center;
justify-content: flex-end;
}
.header-brand-img {
height: 32px;
height: 24px;
}
.nav-tabs .nav-item.show .nav-link {
@@ -112,6 +79,56 @@
border-bottom-color: #66b574;
}
.header__right {
display: flex;
align-items: center;
justify-content: flex-end;
min-width: 100px;
}
.header__logout {
display: inline-flex;
align-items: center;
justify-content: center;
width: 25px;
height: 25px;
min-width: 25px;
padding: 2px;
margin-left: 10px;
color: #9aa0ac;
}
.header__logout:hover,
.header__logout:focus {
color: #6e7687;
}
.header__logout-icon {
height: 100%;
}
.header__row {
display: flex;
align-items: center;
}
.header__container {
width: 100%;
max-width: 1200px;
padding-right: 0.75rem;
padding-left: 0.75rem;
margin-right: auto;
margin-left: auto;
}
.header__column:last-child {
margin-left: auto;
}
.nav-tabs {
margin: 0;
}
@media screen and (min-width: 992px) {
.header {
padding: 0;
@@ -139,13 +156,31 @@
box-shadow: none;
}
.nav-version {
padding: 0;
}
.nav-icon {
display: none;
}
.header-brand-img {
height: 32px;
}
.header__logout {
width: 35px;
height: 35px;
padding: 5px;
}
.header__row {
justify-content: space-between;
}
.header__column:last-child {
margin-left: 0;
}
.nav-tabs {
margin: 0 -0.75rem;
}
}
@media screen and (min-width: 1280px) {
@@ -153,10 +188,6 @@
font-size: 14px;
}
.nav-version {
font-size: 0.85rem;
}
.nav-icon {
display: block;
}

View File

@@ -26,7 +26,7 @@ class Menu extends Component {
render() {
const menuClass = classnames({
'col-lg-6 mobile-menu': true,
'header__column mobile-menu': true,
'mobile-menu--active': this.props.isMenuOpen,
});

View File

@@ -5,7 +5,6 @@ import classnames from 'classnames';
import { Trans, withNamespaces } from 'react-i18next';
import Menu from './Menu';
import Version from './Version';
import logo from '../ui/svg/logo.svg';
import './Header.css';
@@ -23,7 +22,7 @@ class Header extends Component {
};
render() {
const { dashboard, getVersion, location } = this.props;
const { dashboard, location } = this.props;
const { isMenuOpen } = this.state;
const badgeClass = classnames({
'badge dns-status': true,
@@ -33,21 +32,24 @@ class Header extends Component {
return (
<div className="header">
<div className="container">
<div className="row align-items-center">
<div className="header-toggler d-lg-none ml-2 ml-lg-0 collapsed" onClick={this.toggleMenuOpen}>
<div className="header__container">
<div className="header__row">
<div
className="header-toggler d-lg-none ml-lg-0 collapsed"
onClick={this.toggleMenuOpen}
>
<span className="header-toggler-icon"></span>
</div>
<div className="col col-lg-3">
<div className="header__column">
<div className="d-flex align-items-center">
<Link to="/" className="nav-link pl-0 pr-1">
<img src={logo} alt="" className="header-brand-img" />
</Link>
{!dashboard.proccessing && dashboard.isCoreRunning &&
{!dashboard.proccessing && dashboard.isCoreRunning && (
<span className={badgeClass}>
<Trans>{dashboard.protectionEnabled ? 'on' : 'off'}</Trans>
</span>
}
)}
</div>
</div>
<Menu
@@ -56,14 +58,15 @@ class Header extends Component {
toggleMenuOpen={this.toggleMenuOpen}
closeMenu={this.closeMenu}
/>
{!dashboard.processing &&
<div className="col col-sm-6 col-lg-3">
<Version
{ ...dashboard }
getVersion={getVersion}
/>
<div className="header__column">
<div className="header__right">
{!dashboard.processingProfile && dashboard.name &&
<a href="/control/logout" className="btn btn-sm btn-outline-secondary">
<Trans>sign_out</Trans>
</a>
}
</div>
}
</div>
</div>
</div>
</div>
@@ -75,6 +78,7 @@ Header.propTypes = {
dashboard: PropTypes.object.isRequired,
location: PropTypes.object.isRequired,
getVersion: PropTypes.func.isRequired,
t: PropTypes.func.isRequired,
};
export default withNamespaces()(Header);

View File

@@ -0,0 +1,116 @@
import React, { Fragment } from 'react';
import PropTypes from 'prop-types';
import { Field, reduxForm } from 'redux-form';
import { withNamespaces, Trans } from 'react-i18next';
import flow from 'lodash/flow';
import { renderField } from '../../../helpers/form';
import { RESPONSE_FILTER } from '../../../helpers/constants';
import Tooltip from '../../ui/Tooltip';
const renderFilterField = ({
input,
id,
className,
placeholder,
type,
disabled,
autoComplete,
tooltip,
meta: { touched, error },
}) => (
<Fragment>
<div className="logs__input-wrap">
<input
{...input}
id={id}
placeholder={placeholder}
type={type}
className={className}
disabled={disabled}
autoComplete={autoComplete}
/>
<span className="logs__notice">
<Tooltip text={tooltip} type='tooltip-custom--logs' />
</span>
{!disabled &&
touched &&
(error && <span className="form__message form__message--error">{error}</span>)}
</div>
</Fragment>
);
const Form = (props) => {
const {
t,
handleChange,
} = props;
return (
<form onSubmit={handleChange}>
<div className="row">
<div className="col-6 col-sm-3 my-2">
<Field
id="filter_domain"
name="filter_domain"
component={renderFilterField}
type="text"
className="form-control"
placeholder={t('domain_name_table_header')}
tooltip={t('query_log_strict_search')}
onChange={handleChange}
/>
</div>
<div className="col-6 col-sm-3 my-2">
<Field
id="filter_question_type"
name="filter_question_type"
component={renderField}
type="text"
className="form-control"
placeholder={t('type_table_header')}
onChange={handleChange}
/>
</div>
<div className="col-6 col-sm-3 my-2">
<Field
name="filter_response_status"
component="select"
className="form-control custom-select"
>
<option value={RESPONSE_FILTER.ALL}>
<Trans>show_all_filter_type</Trans>
</option>
<option value={RESPONSE_FILTER.FILTERED}>
<Trans>show_filtered_type</Trans>
</option>
</Field>
</div>
<div className="col-6 col-sm-3 my-2">
<Field
id="filter_client"
name="filter_client"
component={renderFilterField}
type="text"
className="form-control"
placeholder={t('client_table_header')}
tooltip={t('query_log_strict_search')}
onChange={handleChange}
/>
</div>
</div>
</form>
);
};
Form.propTypes = {
handleChange: PropTypes.func,
t: PropTypes.func.isRequired,
};
export default flow([
withNamespaces(),
reduxForm({
form: 'logsFilterForm',
}),
])(Form);

View File

@@ -0,0 +1,52 @@
import React, { Component } from 'react';
import PropTypes from 'prop-types';
import debounce from 'lodash/debounce';
import classnames from 'classnames';
import { DEBOUNCE_FILTER_TIMEOUT, RESPONSE_FILTER } from '../../../helpers/constants';
import { isValidQuestionType } from '../../../helpers/helpers';
import Form from './Form';
import Card from '../../ui/Card';
class Filters extends Component {
getFilters = ({
filter_domain, filter_question_type, filter_response_status, filter_client,
}) => ({
filter_domain: filter_domain || '',
filter_question_type: isValidQuestionType(filter_question_type) ? filter_question_type.toUpperCase() : '',
filter_response_status: filter_response_status === RESPONSE_FILTER.FILTERED ? filter_response_status : '',
filter_client: filter_client || '',
});
handleFormChange = debounce((values) => {
const filter = this.getFilters(values);
this.props.setLogsFilter(filter);
}, DEBOUNCE_FILTER_TIMEOUT);
render() {
const { filter, processingAdditionalLogs } = this.props;
const cardBodyClass = classnames({
'card-body': true,
'card-body--loading': processingAdditionalLogs,
});
return (
<Card bodyType={cardBodyClass}>
<Form
initialValues={filter}
onChange={this.handleFormChange}
/>
</Card>
);
}
}
Filters.propTypes = {
filter: PropTypes.object.isRequired,
setLogsFilter: PropTypes.func.isRequired,
processingGetLogs: PropTypes.bool.isRequired,
processingAdditionalLogs: PropTypes.bool.isRequired,
};
export default Filters;

View File

@@ -9,13 +9,13 @@
justify-content: center;
}
.logs__row--overflow {
overflow: hidden;
}
.logs__row--column {
flex-direction: column;
align-items: flex-start;
justify-content: center;
}
.logs__row--overflow {
overflow: hidden;
}
@@ -37,6 +37,24 @@
overflow: hidden;
}
.logs__text--full {
width: 100%;
}
.logs__text--domain {
max-width: 285px;
}
.logs__text--wrap,
.logs__text--whois {
line-height: 1.4;
white-space: normal;
}
.logs__text--whois {
line-height: 1.2;
}
.logs__row .tooltip-custom {
top: 0;
margin-left: 0;
@@ -98,8 +116,69 @@
border: 1px solid rgba(0, 40, 100, 0.12);
}
.logs__table .rt-thead.-filters select {
background: #fff url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHZpZXdCb3g9JzAgMCAxMCA1Jz48cGF0aCBmaWxsPScjOTk5JyBkPSdNMCAwTDEwIDBMNSA1TDAgMCcvPjwvc3ZnPg==") no-repeat right 0.75rem center;
background-size: 8px 10px;
}
.logs__table .rt-thead.-filters input:focus,
.logs__table .rt-thead.-filters select:focus {
border-color: #1991eb;
box-shadow: 0 0 0 2px rgba(70, 127, 207, 0.25);
}
.logs__text-wrap {
display: flex;
align-items: center;
max-width: 100%;
}
.logs__list-wrap {
display: flex;
max-width: 100%;
}
.logs__list-item {
text-overflow: ellipsis;
white-space: nowrap;
overflow: hidden;
}
.logs__input-wrap {
position: relative;
}
.logs__notice {
position: absolute;
z-index: 1;
top: 8px;
right: 10px;
margin-top: 3px;
font-size: 12px;
text-align: left;
color: #a5a5a5;
}
.logs__whois {
display: inline;
font-size: 12px;
}
.logs__whois::after {
content: "|";
padding: 0 5px;
opacity: 0.3;
}
.logs__whois:last-child::after {
content: "";
}
.logs__whois-icon.icons {
position: relative;
top: -2px;
width: 12px;
height: 12px;
margin-right: 1px;
opacity: 0.5;
}

View File

@@ -1,15 +1,20 @@
import React, { Component, Fragment } from 'react';
import PropTypes from 'prop-types';
import ReactTable from 'react-table';
import { saveAs } from 'file-saver/FileSaver';
import escapeRegExp from 'lodash/escapeRegExp';
import endsWith from 'lodash/endsWith';
import { Trans, withNamespaces } from 'react-i18next';
import { HashLink as Link } from 'react-router-hash-link';
import { formatTime, getClientName } from '../../helpers/helpers';
import { SERVICES } from '../../helpers/constants';
import {
formatTime,
formatDateTime,
} from '../../helpers/helpers';
import { SERVICES, FILTERED_STATUS, TABLE_DEFAULT_PAGE_SIZE } from '../../helpers/constants';
import { getTrackerData } from '../../helpers/trackers/trackers';
import { formatClientCell } from '../../helpers/formatClientCell';
import Filters from './Filters';
import PageTitle from '../ui/PageTitle';
import Card from '../ui/Card';
import Loading from '../ui/Loading';
@@ -17,32 +22,51 @@ import PopoverFiltered from '../ui/PopoverFilter';
import Popover from '../ui/Popover';
import './Logs.css';
const DOWNLOAD_LOG_FILENAME = 'dns-logs.txt';
const TABLE_FIRST_PAGE = 0;
const INITIAL_REQUEST_DATA = ['', TABLE_FIRST_PAGE, TABLE_DEFAULT_PAGE_SIZE];
const FILTERED_REASON = 'Filtered';
class Logs extends Component {
componentDidMount() {
this.getLogs();
this.props.setLogsPage(TABLE_FIRST_PAGE);
this.getLogs(...INITIAL_REQUEST_DATA);
this.props.getFilteringStatus();
this.props.getClients();
this.props.getLogsConfig();
}
componentDidUpdate(prevProps) {
// get logs when queryLog becomes enabled
if (this.props.dashboard.queryLogEnabled && !prevProps.dashboard.queryLogEnabled) {
this.props.getLogs();
getLogs = (older_than, page) => {
if (this.props.queryLogs.enabled) {
this.props.getLogs({
older_than, page, pageSize: TABLE_DEFAULT_PAGE_SIZE,
});
}
}
};
getLogs = () => {
// get logs on initialization if queryLogIsEnabled
if (this.props.dashboard.queryLogEnabled) {
this.props.getLogs();
}
}
refreshLogs = () => {
window.location.reload();
};
renderTooltip = (isFiltered, rule, filter, service) =>
isFiltered && <PopoverFiltered rule={rule} filter={filter} service={service} />;
renderResponseList = (response, status) => {
if (response.length > 0) {
const listItems = response.map((response, index) => (
<li key={index} title={response} className="logs__list-item">
{response}
</li>
));
return <ul className="list-unstyled">{listItems}</ul>;
}
return (
<div>
<Trans values={{ value: status }}>query_log_response_status</Trans>
</div>
);
};
toggleBlocking = (type, domain) => {
const { userRules } = this.props.filtering;
const { t } = this.props;
@@ -63,7 +87,7 @@ class Logs extends Component {
}
this.props.getFilteringStatus();
}
};
renderBlockingButton(isFiltered, domain) {
const buttonClass = isFiltered ? 'btn-outline-secondary' : 'btn-outline-danger';
@@ -84,194 +108,216 @@ class Logs extends Component {
);
}
renderLogs(logs) {
const { t, dashboard } = this.props;
const columns = [{
Header: t('time_table_header'),
accessor: 'time',
maxWidth: 110,
filterable: false,
Cell: ({ value }) => (<div className="logs__row"><span className="logs__text" title={value}>{formatTime(value)}</span></div>),
}, {
Header: t('domain_name_table_header'),
accessor: 'domain',
Cell: (row) => {
const response = row.value;
const trackerData = getTrackerData(response);
checkFiltered = reason => reason.indexOf(FILTERED_REASON) === 0;
return (
<div className="logs__row" title={response}>
<div className="logs__text">
{response}
</div>
{trackerData && <Popover data={trackerData}/>}
</div>
);
},
}, {
Header: t('type_table_header'),
accessor: 'type',
maxWidth: 60,
}, {
Header: t('response_table_header'),
accessor: 'response',
Cell: (row) => {
const responses = row.value;
const { reason } = row.original;
const isFiltered = row ? reason.indexOf('Filtered') === 0 : false;
const parsedFilteredReason = reason.replace('Filtered', 'Filtered by ');
const rule = row && row.original && row.original.rule;
const { filterId } = row.original;
const { filters } = this.props.filtering;
const isRewrite = reason && reason === 'Rewrite';
let filterName = '';
checkRewrite = reason => reason === FILTERED_STATUS.REWRITE;
if (reason === 'FilteredBlackList' || reason === 'NotFilteredWhiteList') {
if (filterId === 0) {
filterName = t('custom_filter_rules');
} else {
const filterItem = Object.keys(filters)
.filter(key => filters[key].id === filterId);
checkWhiteList = reason => reason === FILTERED_STATUS.NOT_FILTERED_WHITE_LIST;
if (typeof filterItem !== 'undefined' && typeof filters[filterItem] !== 'undefined') {
filterName = filters[filterItem].name;
}
getTimeCell = ({ value }) => (
<div className="logs__row">
<span className="logs__text" title={formatDateTime(value)}>
{formatTime(value)}
</span>
</div>
);
if (!filterName) {
filterName = t('unknown_filter', { filterId });
}
getDomainCell = (row) => {
const response = row.value;
const trackerData = getTrackerData(response);
return (
<div className="logs__row" title={response}>
<div className="logs__text">{response}</div>
{trackerData && <Popover data={trackerData} />}
</div>
);
};
normalizeResponse = response => (
response.map((response) => {
const { value, type, ttl } = response;
return `${type}: ${value} (ttl=${ttl})`;
})
);
getResponseCell = ({ value: responses, original }) => {
const {
reason, filterId, rule, status, originalAnswer,
} = original;
const { t, filtering } = this.props;
const { filters } = filtering;
const isFiltered = this.checkFiltered(reason);
const filterKey = reason.replace(FILTERED_REASON, '');
const parsedFilteredReason = t('query_log_filtered', { filter: filterKey });
const isRewrite = this.checkRewrite(reason);
const isWhiteList = this.checkWhiteList(reason);
const isBlockedService = reason === FILTERED_STATUS.FILTERED_BLOCKED_SERVICE;
const currentService = SERVICES.find(service => service.id === original.serviceName);
const serviceName = currentService && currentService.name;
const normalizedAnswer = originalAnswer && this.normalizeResponse(originalAnswer);
let filterName = '';
if (filterId === 0) {
filterName = t('custom_filter_rules');
} else {
const filterItem = Object.keys(filters).filter(key => filters[key].id === filterId)[0];
if (typeof filterItem !== 'undefined' && typeof filters[filterItem] !== 'undefined') {
filterName = filters[filterItem].name;
}
if (!filterName) {
filterName = t('unknown_filter', { filterId });
}
}
return (
<div className="logs__row logs__row--column">
<div className="logs__text-wrap">
{originalAnswer && (
<span className="logs__text">
<Trans>blocked_by_response</Trans>
</span>
)}
{!originalAnswer && (isFiltered || isBlockedService) && (
<span className="logs__text" title={parsedFilteredReason}>
{parsedFilteredReason}
</span>
)}
{isBlockedService
? this.renderTooltip(isFiltered, '', '', serviceName)
: this.renderTooltip(isFiltered, rule, filterName)}
{isRewrite && (
<strong>
<Trans>rewrite_applied</Trans>
</strong>
)}
</div>
<div className="logs__list-wrap">
{originalAnswer
? this.renderResponseList(normalizedAnswer, status)
: this.renderResponseList(responses, status)
}
}
{isWhiteList && this.renderTooltip(isWhiteList, rule, filterName)}
</div>
</div>
);
};
if (reason === 'FilteredBlockedService') {
const getService = SERVICES
.find(service => service.id === row.original.serviceName);
const serviceName = getService && getService.name;
getClientCell = (row) => {
const { original } = row;
const { t } = this.props;
const { reason, domain } = original;
const isFiltered = this.checkFiltered(reason);
const isRewrite = this.checkRewrite(reason);
return (
<div className="logs__row">
<span className="logs__text" title={parsedFilteredReason}>
{parsedFilteredReason}
</span>
{this.renderTooltip(isFiltered, '', '', serviceName)}
</div>
);
}
if (isFiltered) {
return (
<div className="logs__row">
<span className="logs__text" title={parsedFilteredReason}>
{parsedFilteredReason}
</span>
{this.renderTooltip(isFiltered, rule, filterName)}
</div>
);
}
if (responses.length > 0) {
const liNodes = responses.map((response, index) =>
(<li key={index} title={response}>{response}</li>));
const isRenderTooltip = reason === 'NotFilteredWhiteList';
return (
<div className={`logs__row ${isRewrite && 'logs__row--column'}`}>
{isRewrite && <strong><Trans>rewrite_applied</Trans></strong>}
<ul className="list-unstyled">{liNodes}</ul>
{this.renderTooltip(isRenderTooltip, rule, filterName)}
</div>
);
}
return (
<div className={`logs__row ${isRewrite && 'logs__row--column'}`}>
{isRewrite && <strong><Trans>rewrite_applied</Trans></strong>}
<span><Trans>empty_response_status</Trans></span>
{this.renderTooltip(isFiltered, rule, filterName)}
return (
<Fragment>
<div className="logs__row logs__row--overflow logs__row--column">
{formatClientCell(row, t)}
</div>
{isRewrite ? (
<div className="logs__action">
<Link to="/dns#rewrites" className="btn btn-sm btn-outline-primary">
<Trans>configure</Trans>
</Link>
</div>
);
},
filterMethod: (filter, row) => {
if (filter.value === 'filtered') {
// eslint-disable-next-line no-underscore-dangle
return row._original.reason.indexOf('Filtered') === 0 || row._original.reason === 'NotFilteredWhiteList';
}
return true;
},
Filter: ({ filter, onChange }) =>
<select
onChange={event => onChange(event.target.value)}
className="form-control"
value={filter ? filter.value : 'all'}
>
<option value="all">{ t('show_all_filter_type') }</option>
<option value="filtered">{ t('show_filtered_type') }</option>
</select>,
}, {
Header: t('client_table_header'),
accessor: 'client',
maxWidth: 250,
Cell: (row) => {
const { reason } = row.original;
const isFiltered = row ? reason.indexOf('Filtered') === 0 : false;
const isRewrite = reason && reason === 'Rewrite';
const clientName = getClientName(dashboard.clients, row.value)
|| getClientName(dashboard.autoClients, row.value);
let client;
) : (
this.renderBlockingButton(isFiltered, domain)
)}
</Fragment>
);
};
if (clientName) {
client = <span>{clientName} <small>({row.value})</small></span>;
} else {
client = row.value;
}
fetchData = (state) => {
const { pages } = state;
const { oldest, page } = this.props.queryLogs;
const isLastPage = pages && (page + 1 === pages);
if (isRewrite) {
return (
<Fragment>
<div className="logs__row">
{client}
</div>
<div className="logs__action">
<Link to="/dns#rewrites" className="btn btn-sm btn-outline-primary">
<Trans>configure</Trans>
</Link>
</div>
</Fragment>
);
}
if (isLastPage) {
this.getLogs(oldest, page);
}
};
return (
<Fragment>
<div className="logs__row">
{client}
</div>
{this.renderBlockingButton(isFiltered, row.original.domain)}
</Fragment>
);
changePage = (page) => {
this.props.setLogsPage(page);
this.props.setLogsPagination({ page, pageSize: TABLE_DEFAULT_PAGE_SIZE });
};
renderLogs() {
const { queryLogs, t } = this.props;
const {
processingGetLogs, processingGetConfig, logs, pages, page,
} = queryLogs;
const isLoading = processingGetLogs || processingGetConfig;
const columns = [
{
Header: t('time_table_header'),
accessor: 'time',
maxWidth: 100,
Cell: this.getTimeCell,
},
{
Header: t('domain_name_table_header'),
accessor: 'domain',
minWidth: 180,
Cell: this.getDomainCell,
},
{
Header: t('type_table_header'),
accessor: 'type',
maxWidth: 60,
},
{
Header: t('response_table_header'),
accessor: 'response',
minWidth: 250,
Cell: this.getResponseCell,
},
{
Header: t('client_table_header'),
accessor: 'client',
maxWidth: 240,
minWidth: 240,
Cell: this.getClientCell,
},
},
];
if (logs) {
return (<ReactTable
className='logs__table'
filterable
data={logs}
return (
<ReactTable
manual
minRows={5}
page={page}
pages={pages}
columns={columns}
filterable={false}
sortable={false}
data={logs || []}
loading={isLoading}
showPagination={true}
defaultPageSize={50}
minRows={7}
// Text
previousText={ t('previous_btn') }
nextText={ t('next_btn') }
loadingText={ t('loading_table_status') }
pageText={ t('page_table_footer_text') }
ofText={ t('of_table_footer_text') }
rowsText={ t('rows_table_footer_text') }
noDataText={ t('no_logs_found') }
showPaginationTop={true}
showPageJump={false}
showPageSizeOptions={false}
onFetchData={this.fetchData}
onPageChange={this.changePage}
className="logs__table"
defaultPageSize={TABLE_DEFAULT_PAGE_SIZE}
previousText={t('previous_btn')}
nextText={t('next_btn')}
loadingText={t('loading_table_status')}
rowsText={t('rows_table_footer_text')}
noDataText={t('no_logs_found')}
pageText={''}
ofText={''}
renderTotalPagesCount={() => false}
defaultFilterMethod={(filter, row) => {
const id = filter.pivotId || filter.id;
return row[id] !== undefined ?
String(row[id]).indexOf(filter.value) !== -1 : true;
return row[id] !== undefined
? String(row[id]).indexOf(filter.value) !== -1
: true;
}}
defaultSorted={[
{
@@ -280,20 +326,21 @@ class Logs extends Component {
},
]}
getTrProps={(_state, rowInfo) => {
// highlight filtered requests
if (!rowInfo) {
return {};
}
if (rowInfo.original.reason.indexOf('Filtered') === 0) {
const { reason } = rowInfo.original;
if (this.checkFiltered(reason)) {
return {
className: 'red',
};
} else if (rowInfo.original.reason === 'NotFilteredWhiteList') {
} else if (this.checkWhiteList(reason)) {
return {
className: 'green',
};
} else if (rowInfo.original.reason === 'Rewrite') {
} else if (this.checkRewrite(reason)) {
return {
className: 'blue',
};
@@ -303,97 +350,79 @@ class Logs extends Component {
className: '',
};
}}
/>);
}
return undefined;
}
handleDownloadButton = async (e) => {
e.preventDefault();
const data = await this.props.downloadQueryLog();
const jsonStr = JSON.stringify(data);
const dataBlob = new Blob([jsonStr], { type: 'text/plain;charset=utf-8' });
saveAs(dataBlob, DOWNLOAD_LOG_FILENAME);
};
renderButtons(queryLogEnabled, logStatusProcessing) {
if (queryLogEnabled) {
return (
<Fragment>
<button
className="btn btn-gray btn-sm mr-2"
type="submit"
onClick={() => this.props.toggleLogStatus(queryLogEnabled)}
disabled={logStatusProcessing}
><Trans>disabled_log_btn</Trans></button>
<button
className="btn btn-primary btn-sm mr-2"
type="submit"
onClick={this.handleDownloadButton}
><Trans>download_log_file_btn</Trans></button>
<button
className="btn btn-outline-primary btn-sm"
type="submit"
onClick={this.getLogs}
><Trans>refresh_btn</Trans></button>
</Fragment>
);
}
return (
<button
className="btn btn-success btn-sm mr-2"
type="submit"
onClick={() => this.props.toggleLogStatus(queryLogEnabled)}
disabled={logStatusProcessing}
><Trans>enabled_log_btn</Trans></button>
/>
);
}
render() {
const { queryLogs, dashboard, t } = this.props;
const { queryLogEnabled } = dashboard;
const { queryLogs, t } = this.props;
const {
enabled, processingGetConfig, processingAdditionalLogs, processingGetLogs,
} = queryLogs;
const refreshButton = enabled ? (
<button
type="button"
className="btn btn-icon btn-outline-primary btn-sm ml-3"
onClick={this.refreshLogs}
>
<svg className="icons">
<use xlinkHref="#refresh" />
</svg>
</button>
) : (
''
);
return (
<Fragment>
<PageTitle title={ t('query_log') } subtitle={ t('last_dns_queries') }>
<div className="page-title__actions">
{this.renderButtons(queryLogEnabled, dashboard.logStatusProcessing)}
</div>
</PageTitle>
<Card>
{
queryLogEnabled
&& queryLogs.getLogsProcessing
&& dashboard.processingClients
&& <Loading />
}
{
queryLogEnabled
&& !queryLogs.getLogsProcessing
&& !dashboard.processingClients
&& this.renderLogs(queryLogs.logs)
}
</Card>
<PageTitle title={t('query_log')}>{refreshButton}</PageTitle>
{enabled && processingGetConfig && <Loading />}
{enabled && !processingGetConfig && (
<Fragment>
<Filters
filter={queryLogs.filter}
processingGetLogs={processingGetLogs}
processingAdditionalLogs={processingAdditionalLogs}
setLogsFilter={this.props.setLogsFilter}
/>
<Card>{this.renderLogs()}</Card>
</Fragment>
)}
{!enabled && !processingGetConfig && (
<Card>
<div className="lead text-center py-6">
<Trans
components={[
<Link to="/settings#logs-config" key="0">
link
</Link>,
]}
>
query_log_disabled
</Trans>
</div>
</Card>
)}
</Fragment>
);
}
}
Logs.propTypes = {
getLogs: PropTypes.func,
queryLogs: PropTypes.object,
dashboard: PropTypes.object,
toggleLogStatus: PropTypes.func,
downloadQueryLog: PropTypes.func,
getFilteringStatus: PropTypes.func,
filtering: PropTypes.object,
userRules: PropTypes.string,
setRules: PropTypes.func,
addSuccessToast: PropTypes.func,
processingRules: PropTypes.bool,
logStatusProcessing: PropTypes.bool,
t: PropTypes.func,
getLogs: PropTypes.func.isRequired,
queryLogs: PropTypes.object.isRequired,
dashboard: PropTypes.object.isRequired,
getFilteringStatus: PropTypes.func.isRequired,
filtering: PropTypes.object.isRequired,
setRules: PropTypes.func.isRequired,
addSuccessToast: PropTypes.func.isRequired,
getClients: PropTypes.func.isRequired,
getLogsConfig: PropTypes.func.isRequired,
setLogsPagination: PropTypes.func.isRequired,
setLogsFilter: PropTypes.func.isRequired,
setLogsPage: PropTypes.func.isRequired,
t: PropTypes.func.isRequired,
};
export default withNamespaces()(Logs);

View File

@@ -3,67 +3,55 @@ import PropTypes from 'prop-types';
import { withNamespaces } from 'react-i18next';
import ReactTable from 'react-table';
import { CLIENT_ID } from '../../../helpers/constants';
import Card from '../../ui/Card';
import WrapCell from './WrapCell';
import whoisCell from './whoisCell';
const COLUMN_MIN_WIDTH = 200;
class AutoClients extends Component {
getClient = (name, clients) => {
const client = clients.find(item => name === item.name);
if (client) {
const identifier = client.mac ? CLIENT_ID.MAC : CLIENT_ID.IP;
return {
identifier,
use_global_settings: true,
...client,
};
}
return {
identifier: 'ip',
use_global_settings: true,
};
};
getStats = (ip, stats) => {
if (stats && stats.top_clients) {
return stats.top_clients[ip];
if (stats) {
const statsForCurrentIP = stats.find(item => item.name === ip);
return statsForCurrentIP && statsForCurrentIP.count;
}
return '';
};
cellWrap = ({ value }) => (
<div className="logs__row logs__row--overflow">
<span className="logs__text" title={value}>
{value}
</span>
</div>
);
columns = [
{
Header: this.props.t('table_client'),
accessor: 'ip',
Cell: this.cellWrap,
minWidth: COLUMN_MIN_WIDTH,
Cell: WrapCell,
},
{
Header: this.props.t('table_name'),
accessor: 'name',
Cell: this.cellWrap,
minWidth: COLUMN_MIN_WIDTH,
Cell: WrapCell,
},
{
Header: this.props.t('source_label'),
accessor: 'source',
Cell: this.cellWrap,
minWidth: COLUMN_MIN_WIDTH,
Cell: WrapCell,
},
{
Header: this.props.t('table_statistics'),
Header: this.props.t('whois'),
accessor: 'whois_info',
minWidth: COLUMN_MIN_WIDTH,
Cell: whoisCell(this.props.t),
},
{
Header: this.props.t('requests_count'),
accessor: 'statistics',
minWidth: COLUMN_MIN_WIDTH,
Cell: (row) => {
const clientIP = row.original.ip;
const clientStats = clientIP && this.getStats(clientIP, this.props.topStats);
const clientStats = clientIP && this.getStats(clientIP, this.props.topClients);
if (clientStats) {
return (
@@ -100,7 +88,7 @@ class AutoClients extends Component {
nextText={t('next_btn')}
loadingText={t('loading_table_status')}
pageText={t('page_table_footer_text')}
ofText={t('of_table_footer_text')}
ofText="/"
rowsText={t('rows_table_footer_text')}
noDataText={t('clients_not_found')}
/>
@@ -112,7 +100,7 @@ class AutoClients extends Component {
AutoClients.propTypes = {
t: PropTypes.func.isRequired,
autoClients: PropTypes.array.isRequired,
topStats: PropTypes.object.isRequired,
topClients: PropTypes.array.isRequired,
};
export default withNamespaces()(AutoClients);

View File

@@ -3,9 +3,13 @@ import PropTypes from 'prop-types';
import { Trans, withNamespaces } from 'react-i18next';
import ReactTable from 'react-table';
import { MODAL_TYPE, CLIENT_ID } from '../../../helpers/constants';
import { MODAL_TYPE } from '../../../helpers/constants';
import { normalizeTextarea } from '../../../helpers/helpers';
import Card from '../../ui/Card';
import Modal from './Modal';
import WrapCell from './WrapCell';
import whoisCell from './whoisCell';
class ClientsTable extends Component {
handleFormAdd = (values) => {
@@ -17,13 +21,20 @@ class ClientsTable extends Component {
};
handleSubmit = (values) => {
let config = values;
const config = values;
if (values && values.blocked_services) {
const blocked_services = Object
.keys(values.blocked_services)
.filter(service => values.blocked_services[service]);
config = { ...values, blocked_services };
if (values) {
if (values.blocked_services) {
config.blocked_services = Object
.keys(values.blocked_services)
.filter(service => values.blocked_services[service]);
}
if (values.upstreams && typeof values.upstreams === 'string') {
config.upstreams = normalizeTextarea(values.upstreams);
} else {
config.upstreams = [];
}
}
if (this.props.modalType === MODAL_TYPE.EDIT) {
@@ -33,38 +44,28 @@ class ClientsTable extends Component {
}
};
cellWrap = ({ value }) => (
<div className="logs__row logs__row--overflow">
<span className="logs__text" title={value}>
{value}
</span>
</div>
);
getClient = (name, clients) => {
const client = clients.find(item => name === item.name);
if (client) {
const identifier = client.mac ? CLIENT_ID.MAC : CLIENT_ID.IP;
const { upstreams, whois_info, ...values } = client;
return {
identifier,
use_global_settings: true,
use_global_blocked_services: true,
...client,
upstreams: (upstreams && upstreams.join('\n')) || '',
...values,
};
}
return {
identifier: CLIENT_ID.IP,
ids: [''],
use_global_settings: true,
use_global_blocked_services: true,
};
};
getStats = (ip, stats) => {
if (stats && stats.top_clients) {
return stats.top_clients[ip];
getStats = (name, stats) => {
if (stats) {
const currentStats = stats.find(item => item.info && item.info.name === name);
return currentStats && currentStats.count;
}
return '';
@@ -80,37 +81,34 @@ class ClientsTable extends Component {
columns = [
{
Header: this.props.t('table_client'),
accessor: 'ip',
accessor: 'ids',
minWidth: 150,
Cell: (row) => {
if (row.original && row.original.mac) {
return (
<div className="logs__row logs__row--overflow">
<span className="logs__text" title={row.original.mac}>
{row.original.mac} <em>(MAC)</em>
</span>
</div>
);
} else if (row.value) {
return (
<div className="logs__row logs__row--overflow">
<span className="logs__text" title={row.value}>
{row.value} <em>(IP)</em>
</span>
</div>
);
}
const { value } = row;
return '';
return (
<div className="logs__row logs__row--overflow">
<span className="logs__text">
{value.map(address => (
<div key={address} title={address}>
{address}
</div>
))}
</span>
</div>
);
},
},
{
Header: this.props.t('table_name'),
accessor: 'name',
Cell: this.cellWrap,
minWidth: 120,
Cell: WrapCell,
},
{
Header: this.props.t('settings'),
accessor: 'use_global_settings',
minWidth: 120,
Cell: ({ value }) => {
const title = value ? (
<Trans>settings_global</Trans>
@@ -120,9 +118,7 @@ class ClientsTable extends Component {
return (
<div className="logs__row logs__row--overflow">
<div className="logs__text" title={title}>
{title}
</div>
<div className="logs__text">{title}</div>
</div>
);
},
@@ -130,6 +126,7 @@ class ClientsTable extends Component {
{
Header: this.props.t('blocked_services'),
accessor: 'blocked_services',
minWidth: 180,
Cell: (row) => {
const { value, original } = row;
@@ -139,21 +136,52 @@ class ClientsTable extends Component {
return (
<div className="logs__row logs__row--icons">
{value && value.length > 0 ? value.map(service => (
<svg className="service__icon service__icon--table" title={service} key={service}>
<use xlinkHref={`#service_${service}`} />
</svg>
)) : ''}
{value && value.length > 0
? value.map(service => (
<svg
className="service__icon service__icon--table"
title={service}
key={service}
>
<use xlinkHref={`#service_${service}`} />
</svg>
))
: ''}
</div>
);
},
},
{
Header: this.props.t('table_statistics'),
Header: this.props.t('upstreams'),
accessor: 'upstreams',
minWidth: 120,
Cell: ({ value }) => {
const title = value && value.length > 0 ? (
<Trans>settings_custom</Trans>
) : (
<Trans>settings_global</Trans>
);
return (
<div className="logs__row logs__row--overflow">
<div className="logs__text">{title}</div>
</div>
);
},
},
{
Header: this.props.t('whois'),
accessor: 'whois_info',
minWidth: 200,
Cell: whoisCell(this.props.t),
},
{
Header: this.props.t('requests_count'),
accessor: 'statistics',
minWidth: 120,
Cell: (row) => {
const clientIP = row.original.ip;
const clientStats = clientIP && this.getStats(clientIP, this.props.topStats);
const { name } = row.original;
const clientStats = this.getStats(name, this.props.topClients);
if (clientStats) {
return (
@@ -171,7 +199,7 @@ class ClientsTable extends Component {
{
Header: this.props.t('actions_table_header'),
accessor: 'actions',
maxWidth: 150,
maxWidth: 100,
Cell: (row) => {
const clientName = row.original.name;
const {
@@ -245,7 +273,7 @@ class ClientsTable extends Component {
nextText={t('next_btn')}
loadingText={t('loading_table_status')}
pageText={t('page_table_footer_text')}
ofText={t('of_table_footer_text')}
ofText="/"
rowsText={t('rows_table_footer_text')}
noDataText={t('clients_not_found')}
/>
@@ -276,7 +304,7 @@ class ClientsTable extends Component {
ClientsTable.propTypes = {
t: PropTypes.func.isRequired,
clients: PropTypes.array.isRequired,
topStats: PropTypes.object.isRequired,
topClients: PropTypes.array.isRequired,
toggleClientModal: PropTypes.func.isRequired,
deleteClient: PropTypes.func.isRequired,
addClient: PropTypes.func.isRequired,

View File

@@ -1,14 +1,21 @@
import React from 'react';
import { connect } from 'react-redux';
import PropTypes from 'prop-types';
import { Field, reduxForm, formValueSelector } from 'redux-form';
import { Field, FieldArray, reduxForm, formValueSelector } from 'redux-form';
import { Trans, withNamespaces } from 'react-i18next';
import flow from 'lodash/flow';
import i18n from '../../../i18n';
import Tabs from '../../ui/Tabs';
import Examples from '../Dns/Upstream/Examples';
import { toggleAllServices } from '../../../helpers/helpers';
import { renderField, renderRadioField, renderSelectField, renderServiceField, ipv4, mac, required } from '../../../helpers/form';
import { CLIENT_ID, SERVICES } from '../../../helpers/constants';
import {
renderField,
renderGroupField,
renderSelectField,
renderServiceField,
} from '../../../helpers/form';
import { SERVICES } from '../../../helpers/constants';
import './Service.css';
const settingsCheckboxes = [
@@ -34,6 +41,67 @@ const settingsCheckboxes = [
},
];
const validate = (values) => {
const errors = {};
const { name, ids } = values;
if (!name || !name.length) {
errors.name = i18n.t('form_error_required');
}
if (ids && ids.length) {
const idArrayErrors = [];
ids.forEach((id, idx) => {
if (!id || !id.length) {
idArrayErrors[idx] = i18n.t('form_error_required');
}
});
if (idArrayErrors.length) {
errors.ids = idArrayErrors;
}
}
return errors;
};
const renderFields = (placeholder, buttonTitle) =>
function cell(row) {
const {
fields,
meta: { error },
} = row;
return (
<div className="form__group">
{fields.map((ip, index) => (
<div key={index} className="mb-1">
<Field
name={ip}
component={renderGroupField}
type="text"
className="form-control"
placeholder={placeholder}
isActionAvailable={index !== 0}
removeField={() => fields.remove(index)}
/>
</div>
))}
<button
type="button"
className="btn btn-link btn-block btn-sm"
onClick={() => fields.push()}
title={buttonTitle}
>
<svg className="icon icon--close">
<use xlinkHref="#plus" />
</svg>
</button>
{error && <div className="error">{error}</div>}
</div>
);
};
let Form = (props) => {
const {
t,
@@ -42,92 +110,53 @@ let Form = (props) => {
change,
pristine,
submitting,
clientIdentifier,
useGlobalSettings,
useGlobalServices,
toggleClientModal,
processingAdding,
processingUpdating,
invalid,
} = props;
return (
<form onSubmit={handleSubmit}>
<div className="modal-body">
<div className="form__group">
<div className="form__inline mb-2">
<strong className="mr-3">
<Trans>client_identifier</Trans>
</strong>
<div className="custom-controls-stacked">
<Field
name="identifier"
component={renderRadioField}
type="radio"
className="form-control mr-2"
value="ip"
placeholder={t('ip_address')}
/>
<Field
name="identifier"
component={renderRadioField}
type="radio"
className="form-control mr-2"
value="mac"
placeholder="MAC"
/>
<div className="form__group mb-0">
<div className="form__group">
<Field
id="name"
name="name"
component={renderField}
type="text"
className="form-control"
placeholder={t('form_client_name')}
/>
</div>
<div className="form__group">
<div className="form__label">
<strong className="mr-3">
<Trans>client_identifier</Trans>
</strong>
</div>
<div className="form__desc mt-0">
<Trans
components={[
<a href="#dhcp" key="0">
link
</a>,
]}
>
client_identifier_desc
</Trans>
</div>
</div>
<div className="row">
<div className="col col-sm-6">
{clientIdentifier === CLIENT_ID.IP && (
<div className="form__group">
<Field
id="ip"
name="ip"
component={renderField}
type="text"
className="form-control"
placeholder={t('form_enter_ip')}
validate={[ipv4, required]}
/>
</div>
)}
{clientIdentifier === CLIENT_ID.MAC && (
<div className="form__group">
<Field
id="mac"
name="mac"
component={renderField}
type="text"
className="form-control"
placeholder={t('form_enter_mac')}
validate={[mac, required]}
/>
</div>
)}
</div>
<div className="col col-sm-6">
<Field
id="name"
name="name"
component={renderField}
type="text"
className="form-control"
placeholder={t('form_client_name')}
validate={[required]}
/>
</div>
</div>
<div className="form__desc">
<Trans
components={[
<a href="#dhcp" key="0">
link
</a>,
]}
>
client_identifier_desc
</Trans>
<div className="form__group">
<FieldArray
name="ids"
component={renderFields(t('form_enter_id'), t('form_add_id'))}
/>
</div>
</div>
@@ -140,7 +169,11 @@ let Form = (props) => {
type="checkbox"
component={renderSelectField}
placeholder={t(setting.placeholder)}
disabled={setting.name !== 'use_global_settings' ? useGlobalSettings : false}
disabled={
setting.name !== 'use_global_settings'
? useGlobalSettings
: false
}
/>
</div>
))}
@@ -191,6 +224,22 @@ let Form = (props) => {
</div>
</div>
</div>
<div label="upstream" title={props.t('upstream_dns')}>
<div className="form__desc mb-3">
<Trans components={[<a href="#dns" key="0">link</a>]}>
upstream_dns_client_desc
</Trans>
</div>
<Field
id="upstreams"
name="upstreams"
component="textarea"
type="text"
className="form-control form-control--textarea mb-5"
placeholder={t('upstream_dns')}
/>
<Examples />
</div>
</Tabs>
</div>
@@ -210,7 +259,13 @@ let Form = (props) => {
<button
type="submit"
className="btn btn-success btn-standard"
disabled={submitting || pristine || processingAdding || processingUpdating}
disabled={
submitting ||
invalid ||
pristine ||
processingAdding ||
processingUpdating
}
>
<Trans>save_btn</Trans>
</button>
@@ -227,22 +282,20 @@ Form.propTypes = {
change: PropTypes.func.isRequired,
submitting: PropTypes.bool.isRequired,
toggleClientModal: PropTypes.func.isRequired,
clientIdentifier: PropTypes.string,
useGlobalSettings: PropTypes.bool,
useGlobalServices: PropTypes.bool,
t: PropTypes.func.isRequired,
processingAdding: PropTypes.bool.isRequired,
processingUpdating: PropTypes.bool.isRequired,
invalid: PropTypes.bool.isRequired,
};
const selector = formValueSelector('clientForm');
Form = connect((state) => {
const clientIdentifier = selector(state, 'identifier');
const useGlobalSettings = selector(state, 'use_global_settings');
const useGlobalServices = selector(state, 'use_global_blocked_services');
return {
clientIdentifier,
useGlobalSettings,
useGlobalServices,
};
@@ -253,5 +306,6 @@ export default flow([
reduxForm({
form: 'clientForm',
enableReinitialize: true,
validate,
}),
])(Form);

View File

@@ -0,0 +1,16 @@
import React from 'react';
import PropTypes from 'prop-types';
const WrapCell = ({ value }) => (
<div className="logs__row logs__row--overflow">
<span className="logs__text" title={value}>
{value || ''}
</span>
</div>
);
WrapCell.propTypes = {
value: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),
};
export default WrapCell;

View File

@@ -10,13 +10,14 @@ import Loading from '../../ui/Loading';
class Clients extends Component {
componentDidMount() {
this.props.getClients();
this.props.getTopStats();
this.props.getStats();
}
render() {
const {
t,
dashboard,
stats,
clients,
addClient,
updateClient,
@@ -27,12 +28,12 @@ class Clients extends Component {
return (
<Fragment>
<PageTitle title={t('client_settings')} />
{(dashboard.processingTopStats || dashboard.processingClients) && <Loading />}
{!dashboard.processingTopStats && !dashboard.processingClients && (
{(stats.processingStats || dashboard.processingClients) && <Loading />}
{!stats.processingStats && !dashboard.processingClients && (
<Fragment>
<ClientsTable
clients={dashboard.clients}
topStats={dashboard.topStats}
topClients={stats.topClients}
isModalOpen={clients.isModalOpen}
modalClientName={clients.modalClientName}
modalType={clients.modalType}
@@ -46,7 +47,7 @@ class Clients extends Component {
/>
<AutoClients
autoClients={dashboard.autoClients}
topStats={dashboard.topStats}
topClients={stats.topClients}
/>
</Fragment>
)}
@@ -58,14 +59,14 @@ class Clients extends Component {
Clients.propTypes = {
t: PropTypes.func.isRequired,
dashboard: PropTypes.object.isRequired,
stats: PropTypes.object.isRequired,
clients: PropTypes.object.isRequired,
toggleClientModal: PropTypes.func.isRequired,
deleteClient: PropTypes.func.isRequired,
addClient: PropTypes.func.isRequired,
updateClient: PropTypes.func.isRequired,
getClients: PropTypes.func.isRequired,
getTopStats: PropTypes.func.isRequired,
topStats: PropTypes.object,
getStats: PropTypes.func.isRequired,
};
export default withNamespaces()(Clients);

View File

@@ -0,0 +1,43 @@
import React, { Fragment } from 'react';
import { normalizeWhois } from '../../../helpers/helpers';
import { WHOIS_ICONS } from '../../../helpers/constants';
const getFormattedWhois = (value, t) => {
const whoisInfo = normalizeWhois(value);
const whoisKeys = Object.keys(whoisInfo);
if (whoisKeys.length > 0) {
return whoisKeys.map((key) => {
const icon = WHOIS_ICONS[key];
return (
<div key={key} title={t(key)}>
{icon && (
<Fragment>
<svg className="logs__whois-icon text-muted-dark icons">
<use xlinkHref={`#${icon}`} />
</svg>
&nbsp;
</Fragment>
)}
{whoisInfo[key]}
</div>
);
});
}
return '';
};
const whoisCell = t =>
function cell(row) {
const { value } = row;
return (
<div className="logs__row logs__row--overflow">
<span className="logs__text logs__text--wrap">{getFormattedWhois(value, t)}</span>
</div>
);
};
export default whoisCell;

View File

@@ -50,6 +50,23 @@ const renderInterfaceValues = (interfaceValues => (
</ul>
));
const clearFields = (change, resetDhcp, t) => {
const fields = {
interface_name: '',
gateway_ip: '',
subnet_mask: '',
range_start: '',
range_end: '',
lease_duration: 86400,
};
// eslint-disable-next-line no-alert
if (window.confirm(t('dhcp_reset'))) {
Object.keys(fields).forEach(field => change(field, fields[field]));
resetDhcp();
}
};
let Form = (props) => {
const {
t,
@@ -61,6 +78,8 @@ let Form = (props) => {
interfaceValue,
processingConfig,
processingInterfaces,
resetDhcp,
change,
} = props;
return (
@@ -160,31 +179,42 @@ let Form = (props) => {
</div>
</div>
<button
type="submit"
className="btn btn-success btn-standard"
disabled={submitting || invalid || processingConfig}
>
{t('save_config')}
</button>
<div className="btn-list">
<button
type="submit"
className="btn btn-success btn-standard"
disabled={submitting || invalid || processingConfig}
>
{t('save_config')}
</button>
<button
type="button"
className="btn btn-secondary btn-standart"
disabled={submitting || processingConfig}
onClick={() => clearFields(change, resetDhcp, t)}
>
<Trans>reset_settings</Trans>
</button>
</div>
</form>
);
};
Form.propTypes = {
handleSubmit: PropTypes.func,
submitting: PropTypes.bool,
invalid: PropTypes.bool,
interfaces: PropTypes.object,
handleSubmit: PropTypes.func.isRequired,
submitting: PropTypes.bool.isRequired,
invalid: PropTypes.bool.isRequired,
interfaces: PropTypes.object.isRequired,
interfaceValue: PropTypes.string,
initialValues: PropTypes.object,
processingConfig: PropTypes.bool,
processingInterfaces: PropTypes.bool,
enabled: PropTypes.bool,
t: PropTypes.func,
initialValues: PropTypes.object.isRequired,
processingConfig: PropTypes.bool.isRequired,
processingInterfaces: PropTypes.bool.isRequired,
enabled: PropTypes.bool.isRequired,
t: PropTypes.func.isRequired,
resetDhcp: PropTypes.func.isRequired,
change: PropTypes.func.isRequired,
};
const selector = formValueSelector('dhcpForm');
Form = connect((state) => {

View File

@@ -2,6 +2,7 @@ import React, { Component } from 'react';
import PropTypes from 'prop-types';
import ReactTable from 'react-table';
import { Trans, withNamespaces } from 'react-i18next';
import { SMALL_TABLE_DEFAULT_PAGE_SIZE } from '../../../helpers/constants';
class Leases extends Component {
cellWrap = ({ value }) => (
@@ -36,7 +37,9 @@ class Leases extends Component {
Cell: this.cellWrap,
},
]}
showPagination={false}
pageSize={SMALL_TABLE_DEFAULT_PAGE_SIZE}
showPageSizeOptions={false}
showPagination={leases.length > SMALL_TABLE_DEFAULT_PAGE_SIZE}
noDataText={t('dhcp_leases_not_found')}
minRows={6}
className="-striped -highlight card-table-overflow"

View File

@@ -2,6 +2,7 @@ import React, { Component, Fragment } from 'react';
import PropTypes from 'prop-types';
import ReactTable from 'react-table';
import { Trans, withNamespaces } from 'react-i18next';
import { SMALL_TABLE_DEFAULT_PAGE_SIZE } from '../../../../helpers/constants';
import Modal from './Modal';
@@ -16,7 +17,7 @@ class StaticLeases extends Component {
handleSubmit = (data) => {
this.props.addStaticLease(data);
}
};
handleDelete = (ip, mac, hostname = '') => {
const name = hostname || ip;
@@ -24,7 +25,7 @@ class StaticLeases extends Component {
if (window.confirm(this.props.t('delete_confirm', { key: name }))) {
this.props.removeStaticLease({ ip, mac, hostname });
}
}
};
render() {
const {
@@ -74,7 +75,7 @@ class StaticLeases extends Component {
}
>
<svg className="icons">
<use xlinkHref="#delete" />
<use xlinkHref="#delete"/>
</svg>
</button>
</div>
@@ -82,7 +83,9 @@ class StaticLeases extends Component {
},
},
]}
showPagination={false}
pageSize={SMALL_TABLE_DEFAULT_PAGE_SIZE}
showPageSizeOptions={false}
showPagination={staticLeases.length > SMALL_TABLE_DEFAULT_PAGE_SIZE}
noDataText={t('dhcp_static_leases_not_found')}
className="-striped -highlight card-table-overflow"
minRows={6}

View File

@@ -154,7 +154,15 @@ class Dhcp extends Component {
};
render() {
const { t, dhcp } = this.props;
const {
t,
dhcp,
resetDhcp,
findActiveDhcp,
addStaticLease,
removeStaticLease,
toggleLeaseModal,
} = this.props;
const statusButtonClass = classnames({
'btn btn-primary btn-standard': true,
'btn btn-primary btn-standard btn-loading': dhcp.processingStatus,
@@ -184,6 +192,7 @@ class Dhcp extends Component {
processingConfig={dhcp.processingConfig}
processingInterfaces={dhcp.processingInterfaces}
enabled={enabled}
resetDhcp={resetDhcp}
/>
<hr />
<div className="card-actions mb-3">
@@ -191,9 +200,7 @@ class Dhcp extends Component {
<button
type="button"
className={statusButtonClass}
onClick={() =>
this.props.findActiveDhcp(interface_name)
}
onClick={() => findActiveDhcp(interface_name)}
disabled={
enabled || !interface_name || dhcp.processingConfig
}
@@ -232,9 +239,9 @@ class Dhcp extends Component {
<StaticLeases
staticLeases={dhcp.staticLeases}
isModalOpen={dhcp.isModalOpen}
addStaticLease={this.props.addStaticLease}
removeStaticLease={this.props.removeStaticLease}
toggleLeaseModal={this.props.toggleLeaseModal}
addStaticLease={addStaticLease}
removeStaticLease={removeStaticLease}
toggleLeaseModal={toggleLeaseModal}
processingAdding={dhcp.processingAdding}
processingDeleting={dhcp.processingDeleting}
/>
@@ -243,7 +250,7 @@ class Dhcp extends Component {
<button
type="button"
className="btn btn-success btn-standard mt-3"
onClick={() => this.props.toggleLeaseModal()}
onClick={() => toggleLeaseModal()}
>
<Trans>dhcp_add_static_lease</Trans>
</button>
@@ -260,16 +267,17 @@ class Dhcp extends Component {
}
Dhcp.propTypes = {
dhcp: PropTypes.object,
toggleDhcp: PropTypes.func,
getDhcpStatus: PropTypes.func,
setDhcpConfig: PropTypes.func,
findActiveDhcp: PropTypes.func,
addStaticLease: PropTypes.func,
removeStaticLease: PropTypes.func,
toggleLeaseModal: PropTypes.func,
getDhcpInterfaces: PropTypes.func,
t: PropTypes.func,
dhcp: PropTypes.object.isRequired,
toggleDhcp: PropTypes.func.isRequired,
getDhcpStatus: PropTypes.func.isRequired,
setDhcpConfig: PropTypes.func.isRequired,
findActiveDhcp: PropTypes.func.isRequired,
addStaticLease: PropTypes.func.isRequired,
removeStaticLease: PropTypes.func.isRequired,
toggleLeaseModal: PropTypes.func.isRequired,
getDhcpInterfaces: PropTypes.func.isRequired,
t: PropTypes.func.isRequired,
resetDhcp: PropTypes.func.isRequired,
};
export default withNamespaces()(Dhcp);

View File

@@ -5,7 +5,9 @@ import { Trans, withNamespaces } from 'react-i18next';
import flow from 'lodash/flow';
const Form = (props) => {
const { handleSubmit, submitting, invalid } = props;
const {
handleSubmit, submitting, invalid, processingSet,
} = props;
return (
<form onSubmit={handleSubmit}>
@@ -22,6 +24,7 @@ const Form = (props) => {
component="textarea"
type="text"
className="form-control form-control--textarea"
disabled={processingSet}
/>
</div>
<div className="form__group mb-5">
@@ -37,6 +40,7 @@ const Form = (props) => {
component="textarea"
type="text"
className="form-control form-control--textarea"
disabled={processingSet}
/>
</div>
<div className="form__group mb-5">
@@ -52,6 +56,7 @@ const Form = (props) => {
component="textarea"
type="text"
className="form-control form-control--textarea"
disabled={processingSet}
/>
</div>
<div className="card-actions">
@@ -59,7 +64,7 @@ const Form = (props) => {
<button
type="submit"
className="btn btn-success btn-standard"
disabled={submitting || invalid}
disabled={submitting || invalid || processingSet}
>
<Trans>save_config</Trans>
</button>
@@ -70,11 +75,12 @@ const Form = (props) => {
};
Form.propTypes = {
handleSubmit: PropTypes.func,
submitting: PropTypes.bool,
invalid: PropTypes.bool,
initialValues: PropTypes.object,
t: PropTypes.func,
handleSubmit: PropTypes.func.isRequired,
submitting: PropTypes.bool.isRequired,
invalid: PropTypes.bool.isRequired,
initialValues: PropTypes.object.isRequired,
processingSet: PropTypes.bool.isRequired,
t: PropTypes.func.isRequired,
};
export default flow([withNamespaces(), reduxForm({ form: 'accessForm' })])(Form);

View File

@@ -13,11 +13,7 @@ class Access extends Component {
render() {
const { t, access } = this.props;
const {
processing,
processingSet,
...values
} = access;
const { processing, processingSet, ...values } = access;
return (
<Card
@@ -28,6 +24,7 @@ class Access extends Component {
<Form
initialValues={values}
onSubmit={this.handleFormSubmit}
processingSet={processingSet}
/>
</Card>
);

View File

@@ -0,0 +1,153 @@
import React, { Fragment } from 'react';
import PropTypes from 'prop-types';
import { connect } from 'react-redux';
import { Field, reduxForm, formValueSelector } from 'redux-form';
import { Trans, withNamespaces } from 'react-i18next';
import flow from 'lodash/flow';
import {
renderField,
renderRadioField,
renderSelectField,
required,
ipv4,
ipv6,
biggerOrEqualZero,
toNumber,
} from '../../../../helpers/form';
import { BLOCKING_MODES } from '../../../../helpers/constants';
const getFields = (processing, t) => Object.values(BLOCKING_MODES).map(mode => (
<Field
key={mode}
name="blocking_mode"
type="radio"
component={renderRadioField}
value={mode}
placeholder={t(mode)}
disabled={processing}
/>
));
let Form = ({
handleSubmit, submitting, invalid, processing, blockingMode, t,
}) => (
<form onSubmit={handleSubmit}>
<div className="row">
<div className="col-12 col-sm-6">
<div className="form__group form__group--settings">
<label htmlFor="ratelimit" className="form__label form__label--with-desc">
<Trans>rate_limit</Trans>
</label>
<div className="form__desc form__desc--top">
<Trans>rate_limit_desc</Trans>
</div>
<Field
name="ratelimit"
type="number"
component={renderField}
className="form-control"
placeholder={t('form_enter_rate_limit')}
normalize={toNumber}
validate={[required, biggerOrEqualZero]}
/>
</div>
</div>
<div className="col-12">
<div className="form__group form__group--settings">
<Field
name="edns_cs_enabled"
type="checkbox"
component={renderSelectField}
placeholder={t('edns_enable')}
disabled={processing}
subtitle={t('edns_cs_desc')}
/>
</div>
</div>
<div className="col-12">
<div className="form__group form__group--settings mb-4">
<label className="form__label form__label--with-desc">
<Trans>blocking_mode</Trans>
</label>
<div className="form__desc form__desc--top">
<Trans components={[<div key="0">text</div>]}>blocking_mode_desc</Trans>
</div>
<div className="custom-controls-stacked">
{getFields(processing, t)}
</div>
</div>
</div>
{blockingMode === BLOCKING_MODES.custom_ip && (
<Fragment>
<div className="col-12 col-sm-6">
<div className="form__group form__group--settings">
<label htmlFor="blocking_ipv4" className="form__label form__label--with-desc">
<Trans>blocking_ipv4</Trans>
</label>
<div className="form__desc form__desc--top">
<Trans>blocking_ipv4_desc</Trans>
</div>
<Field
name="blocking_ipv4"
component={renderField}
className="form-control"
placeholder={t('form_enter_ip')}
validate={[ipv4, required]}
/>
</div>
</div>
<div className="col-12 col-sm-6">
<div className="form__group form__group--settings">
<label htmlFor="ip_address" className="form__label form__label--with-desc">
<Trans>blocking_ipv6</Trans>
</label>
<div className="form__desc form__desc--top">
<Trans>blocking_ipv6_desc</Trans>
</div>
<Field
name="blocking_ipv6"
component={renderField}
className="form-control"
placeholder={t('form_enter_ip')}
validate={[ipv6, required]}
/>
</div>
</div>
</Fragment>
)}
</div>
<button
type="submit"
className="btn btn-success btn-standard btn-large"
disabled={submitting || invalid || processing}
>
<Trans>save_btn</Trans>
</button>
</form>
);
Form.propTypes = {
blockingMode: PropTypes.string.isRequired,
handleSubmit: PropTypes.func.isRequired,
submitting: PropTypes.bool.isRequired,
invalid: PropTypes.bool.isRequired,
processing: PropTypes.bool.isRequired,
t: PropTypes.func.isRequired,
};
const selector = formValueSelector('blockingModeForm');
Form = connect((state) => {
const blockingMode = selector(state, 'blocking_mode');
return {
blockingMode,
};
})(Form);
export default flow([
withNamespaces(),
reduxForm({
form: 'blockingModeForm',
}),
])(Form);

View File

@@ -0,0 +1,51 @@
import React from 'react';
import PropTypes from 'prop-types';
import { withNamespaces } from 'react-i18next';
import Card from '../../../ui/Card';
import Form from './Form';
const Config = ({ t, dnsConfig, setDnsConfig }) => {
const handleFormSubmit = (values) => {
setDnsConfig(values);
};
const {
blocking_mode,
ratelimit,
blocking_ipv4,
blocking_ipv6,
edns_cs_enabled,
processingSetConfig,
} = dnsConfig;
return (
<Card
title={t('dns_config')}
bodyType="card-body box-body--settings"
id="dns-config"
>
<div className="form">
<Form
initialValues={{
ratelimit,
blocking_mode,
blocking_ipv4,
blocking_ipv6,
edns_cs_enabled,
}}
onSubmit={handleFormSubmit}
processing={processingSetConfig}
/>
</div>
</Card>
);
};
Config.propTypes = {
dnsConfig: PropTypes.object.isRequired,
setDnsConfig: PropTypes.func.isRequired,
t: PropTypes.func.isRequired,
};
export default withNamespaces()(Config);

View File

@@ -24,7 +24,7 @@ const Modal = (props) => {
<div className="modal-content">
<div className="modal-header">
<h4 className="modal-title">
<Trans>Add DNS rewrite</Trans>
<Trans>rewrite_add</Trans>
</h4>
<button type="button" className="close" onClick={() => toggleRewritesModal()}>
<span className="sr-only">Close</span>

View File

@@ -14,12 +14,12 @@ class Table extends Component {
columns = [
{
Header: 'Domain',
Header: this.props.t('domain'),
accessor: 'domain',
Cell: this.cellWrap,
},
{
Header: 'Answer',
Header: this.props.t('answer'),
accessor: 'answer',
Cell: this.cellWrap,
},
@@ -67,7 +67,7 @@ class Table extends Component {
nextText={t('next_btn')}
loadingText={t('loading_table_status')}
pageText={t('page_table_footer_text')}
ofText={t('of_table_footer_text')}
ofText="/"
rowsText={t('rows_table_footer_text')}
noDataText={t('rewrite_not_found')}
/>

View File

@@ -23,10 +23,10 @@ const Examples = props => (
<Trans>examples_title</Trans>:
<ol className="leading-loose">
<li>
<code>1.1.1.1</code> - {props.t('example_upstream_regular')}
<code>9.9.9.9</code> - {props.t('example_upstream_regular')}
</li>
<li>
<code>tls://1dot1dot1dot1.cloudflare-dns.com</code> &nbsp;
<code>tls://dns.quad9.net</code> &nbsp;
<span>
<Trans
components={[
@@ -45,7 +45,7 @@ const Examples = props => (
</span>
</li>
<li>
<code>https://cloudflare-dns.com/dns-query</code> &nbsp;
<code>https://dns.quad9.net/dns-query</code> &nbsp;
<span>
<Trans
components={[
@@ -64,7 +64,7 @@ const Examples = props => (
</span>
</li>
<li>
<code>tcp://1.1.1.1</code> <Trans>example_upstream_tcp</Trans>
<code>tcp://9.9.9.9</code> <Trans>example_upstream_tcp</Trans>
</li>
<li>
<code>sdns://...</code> &nbsp;
@@ -102,7 +102,7 @@ const Examples = props => (
</span>
</li>
<li>
<code>[/example.local/]1.1.1.1</code> &nbsp;
<code>[/example.local/]9.9.9.9</code> &nbsp;
<span>
<Trans
components={[

View File

@@ -43,6 +43,7 @@ let Form = (props) => {
type="text"
className="form-control form-control--textarea"
placeholder={t('upstream_dns')}
disabled={processingSetUpstream || processingTestUpstream}
/>
</div>
</div>
@@ -53,6 +54,7 @@ let Form = (props) => {
type="checkbox"
component={renderSelectField}
placeholder={t('upstream_parallel')}
disabled={processingSetUpstream}
/>
</div>
</div>
@@ -62,7 +64,10 @@ let Form = (props) => {
</div>
<div className="col-12">
<div className="form__group">
<label className="form__label form__label--with-desc" htmlFor="bootstrap_dns">
<label
className="form__label form__label--with-desc"
htmlFor="bootstrap_dns"
>
<Trans>bootstrap_dns</Trans>
</label>
<div className="form__desc form__desc--top">
@@ -73,8 +78,9 @@ let Form = (props) => {
name="bootstrap_dns"
component="textarea"
type="text"
className="form-control"
className="form-control form-control--textarea form-control--textarea-small"
placeholder={t('bootstrap_dns')}
disabled={processingSetUpstream}
/>
</div>
</div>

View File

@@ -5,13 +5,16 @@ import { withNamespaces } from 'react-i18next';
import Upstream from './Upstream';
import Access from './Access';
import Rewrites from './Rewrites';
import Config from './Config';
import PageTitle from '../../ui/PageTitle';
import Loading from '../../ui/Loading';
class Dns extends Component {
componentDidMount() {
this.props.getDnsSettings();
this.props.getAccessList();
this.props.getRewritesList();
this.props.getDnsConfig();
}
render() {
@@ -28,14 +31,29 @@ class Dns extends Component {
addRewrite,
deleteRewrite,
toggleRewritesModal,
dnsConfig,
setDnsConfig,
} = this.props;
const isDataLoading = dashboard.processingDnsSettings
|| access.processing
|| rewrites.processing
|| dnsConfig.processingGetConfig;
const isDataReady = !dashboard.processingDnsSettings
&& !access.processing
&& !rewrites.processing
&& !dnsConfig.processingGetConfig;
return (
<Fragment>
<PageTitle title={t('dns_settings')} />
{(dashboard.processing || access.processing) && <Loading />}
{!dashboard.processing && !access.processing && (
{isDataLoading && <Loading />}
{isDataReady && (
<Fragment>
<Config
dnsConfig={dnsConfig}
setDnsConfig={setDnsConfig}
/>
<Upstream
upstreamDns={dashboard.upstreamDns}
bootstrapDns={dashboard.bootstrapDns}
@@ -73,6 +91,10 @@ Dns.propTypes = {
addRewrite: PropTypes.func.isRequired,
deleteRewrite: PropTypes.func.isRequired,
toggleRewritesModal: PropTypes.func.isRequired,
getDnsSettings: PropTypes.func.isRequired,
dnsConfig: PropTypes.object.isRequired,
setDnsConfig: PropTypes.func.isRequired,
getDnsConfig: PropTypes.func.isRequired,
t: PropTypes.func.isRequired,
};

View File

@@ -0,0 +1,71 @@
import React, { Fragment } from 'react';
import PropTypes from 'prop-types';
import { withNamespaces, Trans } from 'react-i18next';
import format from 'date-fns/format';
import { EMPTY_DATE } from '../../../helpers/constants';
const CertificateStatus = ({
validChain,
validCert,
subject,
issuer,
notAfter,
dnsNames,
}) => (
<Fragment>
<div className="form__label form__label--bold">
<Trans>encryption_status</Trans>:
</div>
<ul className="encryption__list">
<li
className={validChain ? 'text-success' : 'text-danger'}
>
{validChain ? (
<Trans>encryption_chain_valid</Trans>
) : (
<Trans>encryption_chain_invalid</Trans>
)}
</li>
{validCert && (
<Fragment>
{subject && (
<li>
<Trans>encryption_subject</Trans>:&nbsp;
{subject}
</li>
)}
{issuer && (
<li>
<Trans>encryption_issuer</Trans>:&nbsp;
{issuer}
</li>
)}
{notAfter && notAfter !== EMPTY_DATE && (
<li>
<Trans>encryption_expire</Trans>:&nbsp;
{format(notAfter, 'YYYY-MM-DD HH:mm:ss')}
</li>
)}
{dnsNames && (
<li>
<Trans>encryption_hostnames</Trans>:&nbsp;
{dnsNames}
</li>
)}
</Fragment>
)}
</ul>
</Fragment>
);
CertificateStatus.propTypes = {
validChain: PropTypes.bool.isRequired,
validCert: PropTypes.bool.isRequired,
subject: PropTypes.string,
issuer: PropTypes.string,
notAfter: PropTypes.string,
dnsNames: PropTypes.string,
};
export default withNamespaces()(CertificateStatus);

View File

@@ -1,14 +1,22 @@
import React, { Fragment } from 'react';
import React from 'react';
import { connect } from 'react-redux';
import PropTypes from 'prop-types';
import { Field, reduxForm, formValueSelector } from 'redux-form';
import { Trans, withNamespaces } from 'react-i18next';
import flow from 'lodash/flow';
import format from 'date-fns/format';
import { renderField, renderSelectField, toNumber, port, portTLS, isSafePort } from '../../../helpers/form';
import { EMPTY_DATE } from '../../../helpers/constants';
import {
renderField,
renderSelectField,
renderRadioField,
toNumber,
port,
portTLS,
isSafePort,
} from '../../../helpers/form';
import i18n from '../../../i18n';
import KeyStatus from './KeyStatus';
import CertificateStatus from './CertificateStatus';
const validate = (values) => {
const errors = {};
@@ -27,6 +35,8 @@ const clearFields = (change, setTlsConfig, t) => {
const fields = {
private_key: '',
certificate_chain: '',
private_key_path: '',
certificate_path: '',
port_https: 443,
port_dns_over_tls: 853,
server_name: '',
@@ -48,6 +58,8 @@ let Form = (props) => {
isEnabled,
certificateChain,
privateKey,
certificatePath,
privateKeyPath,
change,
invalid,
submitting,
@@ -64,6 +76,8 @@ let Form = (props) => {
subject,
warning_validation,
setTlsConfig,
certificateSource,
privateKeySource,
} = props;
const isSavingDisabled =
@@ -71,10 +85,9 @@ let Form = (props) => {
submitting ||
processingConfig ||
processingValidate ||
(isEnabled && (!privateKey || !certificateChain)) ||
(privateKey && !valid_key) ||
(certificateChain && !valid_cert) ||
(privateKey && certificateChain && !valid_pair);
!valid_key ||
!valid_cert ||
!valid_pair;
return (
<form onSubmit={handleSubmit}>
@@ -182,7 +195,7 @@ let Form = (props) => {
<div className="col-12">
<div className="form__group form__group--settings">
<label
className="form__label form__label--bold"
className="form__label form__label--with-desc form__label--bold"
htmlFor="certificate_chain"
>
<Trans>encryption_certificates</Trans>
@@ -199,105 +212,128 @@ let Form = (props) => {
encryption_certificates_desc
</Trans>
</div>
<Field
id="certificate_chain"
name="certificate_chain"
component="textarea"
type="text"
className="form-control form-control--textarea"
placeholder={t('encryption_certificates_input')}
onChange={handleChange}
disabled={!isEnabled}
/>
<div className="form__status">
{certificateChain && (
<Fragment>
<div className="form__label form__label--bold">
<Trans>encryption_status</Trans>:
</div>
<ul className="encryption__list">
<li
className={valid_chain ? 'text-success' : 'text-danger'}
>
{valid_chain ? (
<Trans>encryption_chain_valid</Trans>
) : (
<Trans>encryption_chain_invalid</Trans>
)}
</li>
{valid_cert && (
<Fragment>
{subject && (
<li>
<Trans>encryption_subject</Trans>:&nbsp;
{subject}
</li>
)}
{issuer && (
<li>
<Trans>encryption_issuer</Trans>:&nbsp;
{issuer}
</li>
)}
{not_after && not_after !== EMPTY_DATE && (
<li>
<Trans>encryption_expire</Trans>:&nbsp;
{format(not_after, 'YYYY-MM-DD HH:mm:ss')}
</li>
)}
{dns_names && (
<li>
<Trans>encryption_hostnames</Trans>:&nbsp;
{dns_names}
</li>
)}
</Fragment>
)}
</ul>
</Fragment>
)}
<div className="form__inline mb-2">
<div className="custom-controls-stacked">
<Field
name="certificate_source"
component={renderRadioField}
type="radio"
className="form-control mr-2"
value="path"
placeholder={t('encryption_certificates_source_path')}
disabled={!isEnabled}
/>
<Field
name="certificate_source"
component={renderRadioField}
type="radio"
className="form-control mr-2"
value="content"
placeholder={t('encryption_certificates_source_content')}
disabled={!isEnabled}
/>
</div>
</div>
{certificateSource === 'content' && (
<Field
id="certificate_chain"
name="certificate_chain"
component="textarea"
type="text"
className="form-control form-control--textarea"
placeholder={t('encryption_certificates_input')}
onChange={handleChange}
disabled={!isEnabled}
/>
)}
{certificateSource === 'path' && (
<Field
id="certificate_path"
name="certificate_path"
component={renderField}
type="text"
className="form-control"
placeholder={t('encryption_certificate_path')}
onChange={handleChange}
disabled={!isEnabled}
/>
)}
</div>
<div className="form__status">
{(certificateChain || certificatePath) && (
<CertificateStatus
validChain={valid_chain}
validCert={valid_cert}
subject={subject}
issuer={issuer}
notAfter={not_after}
dnsNames={dns_names}
/>
)}
</div>
</div>
</div>
<div className="row">
<div className="col-12">
<div className="form__group form__group--settings">
<div className="form__group form__group--settings mt-3">
<label className="form__label form__label--bold" htmlFor="private_key">
<Trans>encryption_key</Trans>
</label>
<Field
id="private_key"
name="private_key"
component="textarea"
type="text"
className="form-control form-control--textarea"
placeholder={t('encryption_key_input')}
onChange={handleChange}
disabled={!isEnabled}
/>
<div className="form__status">
{privateKey && (
<Fragment>
<div className="form__label form__label--bold">
<Trans>encryption_status</Trans>:
</div>
<ul className="encryption__list">
<li className={valid_key ? 'text-success' : 'text-danger'}>
{valid_key ? (
<Trans values={{ type: key_type }}>
encryption_key_valid
</Trans>
) : (
<Trans values={{ type: key_type }}>
encryption_key_invalid
</Trans>
)}
</li>
</ul>
</Fragment>
)}
<div className="form__inline mb-2">
<div className="custom-controls-stacked">
<Field
name="key_source"
component={renderRadioField}
type="radio"
className="form-control mr-2"
value="path"
placeholder={t('encryption_key_source_path')}
disabled={!isEnabled}
/>
<Field
name="key_source"
component={renderRadioField}
type="radio"
className="form-control mr-2"
value="content"
placeholder={t('encryption_key_source_content')}
disabled={!isEnabled}
/>
</div>
</div>
{privateKeySource === 'content' && (
<Field
id="private_key"
name="private_key"
component="textarea"
type="text"
className="form-control form-control--textarea"
placeholder={t('encryption_key_input')}
onChange={handleChange}
disabled={!isEnabled}
/>
)}
{privateKeySource === 'path' && (
<Field
id="private_key_path"
name="private_key_path"
component={renderField}
type="text"
className="form-control"
placeholder={t('encryption_private_key_path')}
onChange={handleChange}
disabled={!isEnabled}
/>
)}
</div>
<div className="form__status">
{(privateKey || privateKeyPath) && (
<KeyStatus validKey={valid_key} keyType={key_type} />
)}
</div>
</div>
{warning_validation && (
@@ -334,6 +370,8 @@ Form.propTypes = {
isEnabled: PropTypes.bool.isRequired,
certificateChain: PropTypes.string.isRequired,
privateKey: PropTypes.string.isRequired,
certificatePath: PropTypes.string.isRequired,
privateKeyPath: PropTypes.string.isRequired,
change: PropTypes.func.isRequired,
submitting: PropTypes.bool.isRequired,
invalid: PropTypes.bool.isRequired,
@@ -353,6 +391,8 @@ Form.propTypes = {
subject: PropTypes.string,
t: PropTypes.func.isRequired,
setTlsConfig: PropTypes.func.isRequired,
certificateSource: PropTypes.string,
privateKeySource: PropTypes.string,
};
const selector = formValueSelector('encryptionForm');
@@ -361,10 +401,18 @@ Form = connect((state) => {
const isEnabled = selector(state, 'enabled');
const certificateChain = selector(state, 'certificate_chain');
const privateKey = selector(state, 'private_key');
const certificatePath = selector(state, 'certificate_path');
const privateKeyPath = selector(state, 'private_key_path');
const certificateSource = selector(state, 'certificate_source');
const privateKeySource = selector(state, 'key_source');
return {
isEnabled,
certificateChain,
privateKey,
certificatePath,
privateKeyPath,
certificateSource,
privateKeySource,
};
})(Form);

View File

@@ -0,0 +1,31 @@
import React, { Fragment } from 'react';
import PropTypes from 'prop-types';
import { withNamespaces, Trans } from 'react-i18next';
const KeyStatus = ({ validKey, keyType }) => (
<Fragment>
<div className="form__label form__label--bold">
<Trans>encryption_status</Trans>:
</div>
<ul className="encryption__list">
<li className={validKey ? 'text-success' : 'text-danger'}>
{validKey ? (
<Trans values={{ type: keyType }}>
encryption_key_valid
</Trans>
) : (
<Trans values={{ type: keyType }}>
encryption_key_invalid
</Trans>
)}
</li>
</ul>
</Fragment>
);
KeyStatus.propTypes = {
validKey: PropTypes.bool.isRequired,
keyType: PropTypes.string.isRequired,
};
export default withNamespaces()(KeyStatus);

View File

@@ -3,7 +3,7 @@ import PropTypes from 'prop-types';
import { withNamespaces } from 'react-i18next';
import debounce from 'lodash/debounce';
import { DEBOUNCE_TIMEOUT } from '../../../helpers/constants';
import { DEBOUNCE_TIMEOUT, ENCRYPTION_SOURCE } from '../../../helpers/constants';
import Form from './Form';
import Card from '../../ui/Card';
import PageTitle from '../../ui/PageTitle';
@@ -19,13 +19,45 @@ class Encryption extends Component {
}
handleFormSubmit = (values) => {
this.props.setTlsConfig(values);
const submitValues = this.getSubmitValues(values);
this.props.setTlsConfig(submitValues);
};
handleFormChange = debounce((values) => {
this.props.validateTlsConfig(values);
const submitValues = this.getSubmitValues(values);
this.props.validateTlsConfig(submitValues);
}, DEBOUNCE_TIMEOUT);
getInitialValues = (data) => {
const { certificate_chain, private_key } = data;
const certificate_source = certificate_chain ? 'content' : 'path';
const key_source = private_key ? 'content' : 'path';
return {
...data,
certificate_source,
key_source,
};
};
getSubmitValues = (values) => {
const { certificate_source, key_source, ...config } = values;
if (certificate_source === ENCRYPTION_SOURCE.PATH) {
config.certificate_chain = '';
} else {
config.certificate_path = '';
}
if (values.key_source === ENCRYPTION_SOURCE.PATH) {
config.private_key = '';
} else {
config.private_key_path = '';
}
return config;
};
render() {
const { encryption, t } = this.props;
const {
@@ -36,8 +68,22 @@ class Encryption extends Component {
port_dns_over_tls,
certificate_chain,
private_key,
certificate_path,
private_key_path,
} = encryption;
const initialValues = this.getInitialValues({
enabled,
server_name,
force_https,
port_https,
port_dns_over_tls,
certificate_chain,
private_key,
certificate_path,
private_key_path,
});
return (
<div className="encryption">
<PageTitle title={t('encryption_settings')} />
@@ -49,15 +95,7 @@ class Encryption extends Component {
bodyType="card-body box-body--settings"
>
<Form
initialValues={{
enabled,
server_name,
force_https,
port_https,
port_dns_over_tls,
certificate_chain,
private_key,
}}
initialValues={initialValues}
onSubmit={this.handleFormSubmit}
onChange={this.handleFormChange}
setTlsConfig={this.props.setTlsConfig}

View File

@@ -0,0 +1,88 @@
import React from 'react';
import PropTypes from 'prop-types';
import { Field, reduxForm } from 'redux-form';
import { Trans, withNamespaces } from 'react-i18next';
import flow from 'lodash/flow';
import { renderSelectField, toNumber } from '../../../helpers/form';
import { FILTERS_INTERVALS_HOURS } from '../../../helpers/constants';
const getTitleForInterval = (interval, t) => {
if (interval === 0) {
return t('disabled');
} else if (interval === 72 || interval === 168) {
return t('interval_days', { count: interval / 24 });
}
return t('interval_hours', { count: interval });
};
const getIntervalSelect = (processing, t, handleChange, toNumber) => (
<Field
name="interval"
className="custom-select"
component="select"
onChange={handleChange}
normalize={toNumber}
disabled={processing}
>
{FILTERS_INTERVALS_HOURS.map(interval => (
<option value={interval} key={interval}>
{getTitleForInterval(interval, t)}
</option>
))}
</Field>
);
const Form = (props) => {
const {
handleSubmit, handleChange, processing, t,
} = props;
return (
<form onSubmit={handleSubmit}>
<div className="row">
<div className="col-12">
<div className="form__group form__group--settings">
<Field
name="enabled"
type="checkbox"
modifier="checkbox--settings"
component={renderSelectField}
placeholder={t('block_domain_use_filters_and_hosts')}
subtitle={t('filters_block_toggle_hint')}
onChange={handleChange}
disabled={processing}
/>
</div>
</div>
<div className="col-12 col-md-5">
<div className="form__group form__group--inner mb-5">
<label className="form__label">
<Trans>filters_interval</Trans>
</label>
{getIntervalSelect(processing, t, handleChange, toNumber)}
</div>
</div>
</div>
</form>
);
};
Form.propTypes = {
handleSubmit: PropTypes.func.isRequired,
handleChange: PropTypes.func,
change: PropTypes.func.isRequired,
submitting: PropTypes.bool.isRequired,
invalid: PropTypes.bool.isRequired,
processing: PropTypes.bool.isRequired,
t: PropTypes.func.isRequired,
};
export default flow([
withNamespaces(),
reduxForm({
form: 'filterConfigForm',
}),
])(Form);

View File

@@ -0,0 +1,36 @@
import React, { Component } from 'react';
import PropTypes from 'prop-types';
import { withNamespaces } from 'react-i18next';
import debounce from 'lodash/debounce';
import { DEBOUNCE_TIMEOUT } from '../../../helpers/constants';
import Form from './Form';
class FiltersConfig extends Component {
handleFormChange = debounce((values) => {
this.props.setFiltersConfig(values);
}, DEBOUNCE_TIMEOUT);
render() {
const { interval, enabled, processing } = this.props;
return (
<Form
initialValues={{ interval, enabled }}
onSubmit={this.handleFormChange}
onChange={this.handleFormChange}
processing={processing}
/>
);
}
}
FiltersConfig.propTypes = {
interval: PropTypes.number.isRequired,
enabled: PropTypes.bool.isRequired,
processing: PropTypes.bool.isRequired,
setFiltersConfig: PropTypes.func.isRequired,
t: PropTypes.func.isRequired,
};
export default withNamespaces()(FiltersConfig);

View File

@@ -0,0 +1,89 @@
import React from 'react';
import PropTypes from 'prop-types';
import { Field, reduxForm } from 'redux-form';
import { Trans, withNamespaces } from 'react-i18next';
import flow from 'lodash/flow';
import { renderSelectField, renderRadioField, toNumber } from '../../../helpers/form';
import { QUERY_LOG_INTERVALS_DAYS } from '../../../helpers/constants';
const getIntervalFields = (processing, t, toNumber) =>
QUERY_LOG_INTERVALS_DAYS.map((interval) => {
const title =
interval === 1 ? t('interval_24_hour') : t('interval_days', { count: interval });
return (
<Field
key={interval}
name="interval"
type="radio"
component={renderRadioField}
value={interval}
placeholder={title}
normalize={toNumber}
disabled={processing}
/>
);
});
const Form = (props) => {
const {
handleSubmit, submitting, invalid, processing, processingClear, handleClear, t,
} = props;
return (
<form onSubmit={handleSubmit}>
<div className="form__group form__group--settings">
<Field
name="enabled"
type="checkbox"
component={renderSelectField}
placeholder={t('query_log_enable')}
disabled={processing}
/>
</div>
<label className="form__label">
<Trans>query_log_retention</Trans>
</label>
<div className="form__group form__group--settings">
<div className="custom-controls-stacked">
{getIntervalFields(processing, t, toNumber)}
</div>
</div>
<div className="mt-5">
<button
type="submit"
className="btn btn-success btn-standard btn-large"
disabled={submitting || invalid || processing}
>
<Trans>save_btn</Trans>
</button>
<button
type="button"
className="btn btn-outline-secondary btn-standard ml-5"
onClick={() => handleClear()}
disabled={processingClear}
>
<Trans>query_log_clear</Trans>
</button>
</div>
</form>
);
};
Form.propTypes = {
handleSubmit: PropTypes.func.isRequired,
handleClear: PropTypes.func.isRequired,
submitting: PropTypes.bool.isRequired,
invalid: PropTypes.bool.isRequired,
processing: PropTypes.bool.isRequired,
processingClear: PropTypes.bool.isRequired,
t: PropTypes.func.isRequired,
};
export default flow([
withNamespaces(),
reduxForm({
form: 'logConfigForm',
}),
])(Form);

View File

@@ -0,0 +1,69 @@
import React, { Component } from 'react';
import PropTypes from 'prop-types';
import { withNamespaces } from 'react-i18next';
import Card from '../../ui/Card';
import Form from './Form';
class LogsConfig extends Component {
handleFormSubmit = (values) => {
const { t, interval: prevInterval } = this.props;
const { interval } = values;
if (interval !== prevInterval) {
// eslint-disable-next-line no-alert
if (window.confirm(t('query_log_retention_confirm'))) {
this.props.setLogsConfig(values);
}
} else {
this.props.setLogsConfig(values);
}
};
handleClear = () => {
const { t, clearLogs } = this.props;
// eslint-disable-next-line no-alert
if (window.confirm(t('query_log_confirm_clear'))) {
clearLogs();
}
};
render() {
const {
t, enabled, interval, processing, processingClear,
} = this.props;
return (
<Card
title={t('query_log_configuration')}
bodyType="card-body box-body--settings"
id="logs-config"
>
<div className="form">
<Form
initialValues={{
enabled,
interval,
}}
onSubmit={this.handleFormSubmit}
processing={processing}
processingClear={processingClear}
handleClear={this.handleClear}
/>
</div>
</Card>
);
}
}
LogsConfig.propTypes = {
interval: PropTypes.number.isRequired,
enabled: PropTypes.bool.isRequired,
processing: PropTypes.bool.isRequired,
processingClear: PropTypes.bool.isRequired,
setLogsConfig: PropTypes.func.isRequired,
clearLogs: PropTypes.func.isRequired,
t: PropTypes.func.isRequired,
};
export default withNamespaces()(LogsConfig);

View File

@@ -44,7 +44,7 @@ class Services extends Component {
return (
<Card
title={t('blocked_services')}
subtitle={t('Allows to quickly block popular sites.')}
subtitle={t('blocked_services_desc')}
bodyType="card-body box-body--settings"
>
<div className="form">

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